From d387eec38a23416bf7c93b0e09983f6bbbd848d8 Mon Sep 17 00:00:00 2001 From: rollman054 Date: Fri, 17 Aug 2018 19:28:25 +0900 Subject: [PATCH] add files which are useful as references --- .../50c2fa8fed532918/50c2fa8fed532918.xci | 917 + .../design_1_processing_system7_0_0.dcp | Bin 0 -> 216957 bytes ...ign_1_processing_system7_0_0_sim_netlist.v | 5171 ++ .../design_1_processing_system7_0_0_stub.v | 164 + .../ip/2018.2/50c2fa8fed532918/stats.txt | 4 + LED_Blink/LED_Blink.cache/wt/webtalk_pa.xml | 122 + .../LED_Blink.runs/.jobs/vrs_config_1.xml | 8 + .../LED_Blink.runs/.jobs/vrs_config_10.xml | 8 + .../LED_Blink.runs/.jobs/vrs_config_11.xml | 15 + .../LED_Blink.runs/.jobs/vrs_config_12.xml | 8 + .../LED_Blink.runs/.jobs/vrs_config_13.xml | 12 + .../LED_Blink.runs/.jobs/vrs_config_2.xml | 8 + .../LED_Blink.runs/.jobs/vrs_config_3.xml | 5 + .../LED_Blink.runs/.jobs/vrs_config_4.xml | 8 + .../LED_Blink.runs/.jobs/vrs_config_5.xml | 8 + .../LED_Blink.runs/.jobs/vrs_config_6.xml | 8 + .../LED_Blink.runs/.jobs/vrs_config_7.xml | 8 + .../LED_Blink.runs/.jobs/vrs_config_8.xml | 8 + .../LED_Blink.runs/.jobs/vrs_config_9.xml | 8 + .../design_1_led_0_0.dcp | Bin 0 -> 13314 bytes .../design_1_led_0_0.tcl | 168 + .../design_1_led_0_0.vds | 268 + .../design_1_led_0_0_sim_netlist.v | 503 + .../design_1_led_0_0_stub.v | 21 + .../design_1_led_0_0_utilization_synth.pb | Bin 0 -> 224 bytes .../design_1_led_0_0_utilization_synth.rpt | 173 + .../design_1_led_0_0_synth_1/gen_run.xml | 44 + .../design_1_led_0_0_synth_1/htr.txt | 9 + .../design_1_led_0_0_synth_1/vivado.jou | 12 + .../design_1_led_0_0_synth_1/vivado.pb | Bin 0 -> 27728 bytes ...sign_1_processing_system7_0_0_propImpl.xdc | 177 + .../design_1_processing_system7_0_0.dcp | Bin 0 -> 217020 bytes .../design_1_processing_system7_0_0.tcl | 171 + .../design_1_processing_system7_0_0.vds | 435 + ...rocessing_system7_0_0_utilization_synth.pb | Bin 0 -> 224 bytes ...ocessing_system7_0_0_utilization_synth.rpt | 171 + .../dont_touch.xdc | 16 + .../gen_run.xml | 44 + .../htr.txt | 9 + .../vivado.jou | 12 + .../vivado.pb | Bin 0 -> 57759 bytes .../impl_1/design_1_wrapper.tcl | 187 + .../impl_1/design_1_wrapper.vdi | 660 + .../design_1_wrapper_bus_skew_routed.pb | Bin 0 -> 30 bytes .../design_1_wrapper_bus_skew_routed.rpt | 15 + ...ign_1_wrapper_clock_utilization_routed.rpt | 154 + .../design_1_wrapper_control_sets_placed.rpt | 67 + .../impl_1/design_1_wrapper_drc_opted.pb | Bin 0 -> 37 bytes .../impl_1/design_1_wrapper_drc_opted.rpt | 35 + .../impl_1/design_1_wrapper_drc_routed.pb | Bin 0 -> 37 bytes .../impl_1/design_1_wrapper_drc_routed.rpt | 35 + .../impl_1/design_1_wrapper_io_placed.rpt | 267 + ...design_1_wrapper_methodology_drc_routed.pb | Bin 0 -> 52 bytes ...esign_1_wrapper_methodology_drc_routed.rpt | 40 + .../impl_1/design_1_wrapper_opt.dcp | Bin 0 -> 470949 bytes .../impl_1/design_1_wrapper_placed.dcp | Bin 0 -> 504415 bytes .../impl_1/design_1_wrapper_power_routed.rpt | 159 + .../design_1_wrapper_power_summary_routed.pb | Bin 0 -> 711 bytes .../impl_1/design_1_wrapper_route_status.pb | Bin 0 -> 44 bytes .../impl_1/design_1_wrapper_route_status.rpt | 11 + .../impl_1/design_1_wrapper_routed.dcp | Bin 0 -> 541746 bytes .../design_1_wrapper_timing_summary_routed.pb | Bin 0 -> 106 bytes ...design_1_wrapper_timing_summary_routed.rpt | 1291 + .../design_1_wrapper_utilization_placed.pb | Bin 0 -> 224 bytes .../design_1_wrapper_utilization_placed.rpt | 207 + LED_Blink/LED_Blink.runs/impl_1/gen_run.xml | 168 + LED_Blink/LED_Blink.runs/impl_1/htr.txt | 9 + .../LED_Blink.runs/impl_1/init_design.pb | Bin 0 -> 28440 bytes LED_Blink/LED_Blink.runs/impl_1/opt_design.pb | Bin 0 -> 8624 bytes .../LED_Blink.runs/impl_1/place_design.pb | Bin 0 -> 15447 bytes .../LED_Blink.runs/impl_1/route_design.pb | Bin 0 -> 14649 bytes .../impl_1/usage_statistics_webtalk.xml | 1081 + LED_Blink/LED_Blink.runs/impl_1/vivado.jou | 12 + LED_Blink/LED_Blink.runs/impl_1/vivado.pb | Bin 0 -> 149 bytes .../LED_Blink.runs/impl_1/write_bitstream.pb | Bin 0 -> 3039 bytes .../.Xil/design_1_wrapper_propImpl.xdc | 100 + .../synth_1/design_1_wrapper.dcp | Bin 0 -> 21171 bytes .../synth_1/design_1_wrapper.tcl | 84 + .../synth_1/design_1_wrapper.vds | 519 + .../design_1_wrapper_utilization_synth.pb | Bin 0 -> 224 bytes .../design_1_wrapper_utilization_synth.rpt | 171 + .../LED_Blink.runs/synth_1/dont_touch.xdc | 29 + LED_Blink/LED_Blink.runs/synth_1/gen_run.xml | 100 + LED_Blink/LED_Blink.runs/synth_1/htr.txt | 9 + LED_Blink/LED_Blink.runs/synth_1/vivado.jou | 12 + LED_Blink/LED_Blink.runs/synth_1/vivado.pb | Bin 0 -> 48028 bytes .../com.xilinx.sdk.hw.ui/dialog_settings.xml | 4 + .../org.eclipse.cdt.make.core/specs.c | 1 + .../org.eclipse.cdt.ui/dialog_settings.xml | 7 + .../org.eclipse.debug.ui/dialog_settings.xml | 11 + .../launchConfigurationHistory.xml | 27 + .../dialog_settings.xml | 5 + .../dialog_settings.xml | 15 + .../org.eclipse.ui.workbench/workingsets.xml | 4 + .../ZC702_hw_platform/ps7_init.c | 13206 ++++++ .../ZC702_hw_platform/ps7_init.h | 137 + .../ZC702_hw_platform/ps7_init.tcl | 882 + .../ZC702_hw_platform/ps7_init_gpl.c | 13197 ++++++ .../ZC702_hw_platform/ps7_init_gpl.h | 137 + .../design_1_wrapper_hw_platform_0/ps7_init.c | 10638 +++++ .../design_1_wrapper_hw_platform_0/ps7_init.h | 137 + .../ps7_init.tcl | 781 + .../ps7_init_gpl.c | 10629 +++++ .../ps7_init_gpl.h | 137 + LED_Blink/LED_Blink.sdk/hello/Debug/hello.elf | Bin 0 -> 206856 bytes .../LED_Blink.sdk/hello/src/helloworld.c | 61 + LED_Blink/LED_Blink.sdk/hello/src/platform.c | 111 + LED_Blink/LED_Blink.sdk/hello/src/platform.h | 41 + .../LED_Blink.sdk/hello/src/platform_config.h | 6 + .../include/_profile_timer_hw.h | 312 + .../ps7_cortexa9_0/include/bspconfig.h | 45 + .../ps7_cortexa9_0/include/mblaze_nt_types.h | 54 + .../ps7_cortexa9_0/include/profile.h | 131 + .../hello_bsp/ps7_cortexa9_0/include/sleep.h | 119 + .../hello_bsp/ps7_cortexa9_0/include/smc.h | 114 + .../ps7_cortexa9_0/include/vectors.h | 88 + .../hello_bsp/ps7_cortexa9_0/include/xadcps.h | 591 + .../ps7_cortexa9_0/include/xadcps_hw.h | 502 + .../ps7_cortexa9_0/include/xbasic_types.h | 119 + .../hello_bsp/ps7_cortexa9_0/include/xcanps.h | 577 + .../ps7_cortexa9_0/include/xcanps_hw.h | 369 + .../ps7_cortexa9_0/include/xcoresightpsdcc.h | 74 + .../ps7_cortexa9_0/include/xcpu_cortexa9.h | 48 + .../hello_bsp/ps7_cortexa9_0/include/xddrps.h | 66 + .../hello_bsp/ps7_cortexa9_0/include/xdebug.h | 32 + .../ps7_cortexa9_0/include/xdevcfg.h | 403 + .../ps7_cortexa9_0/include/xdevcfg_hw.h | 395 + .../hello_bsp/ps7_cortexa9_0/include/xdmaps.h | 352 + .../ps7_cortexa9_0/include/xdmaps_hw.h | 293 + .../ps7_cortexa9_0/include/xemacps.h | 809 + .../ps7_cortexa9_0/include/xemacps_bd.h | 804 + .../ps7_cortexa9_0/include/xemacps_bdring.h | 241 + .../ps7_cortexa9_0/include/xemacps_hw.h | 656 + .../hello_bsp/ps7_cortexa9_0/include/xenv.h | 187 + .../ps7_cortexa9_0/include/xenv_standalone.h | 368 + .../ps7_cortexa9_0/include/xgpiops.h | 277 + .../ps7_cortexa9_0/include/xgpiops_hw.h | 164 + .../hello_bsp/ps7_cortexa9_0/include/xiicps.h | 425 + .../ps7_cortexa9_0/include/xiicps_hw.h | 383 + .../ps7_cortexa9_0/include/xil_assert.h | 195 + .../ps7_cortexa9_0/include/xil_cache.h | 121 + .../ps7_cortexa9_0/include/xil_cache_l.h | 100 + .../include/xil_cache_vxworks.h | 93 + .../ps7_cortexa9_0/include/xil_errata.h | 123 + .../ps7_cortexa9_0/include/xil_exception.h | 260 + .../ps7_cortexa9_0/include/xil_hal.h | 61 + .../hello_bsp/ps7_cortexa9_0/include/xil_io.h | 345 + .../ps7_cortexa9_0/include/xil_macroback.h | 1052 + .../ps7_cortexa9_0/include/xil_mem.h | 59 + .../include/xil_misc_psreset_api.h | 277 + .../ps7_cortexa9_0/include/xil_mmu.h | 108 + .../ps7_cortexa9_0/include/xil_printf.h | 48 + .../ps7_cortexa9_0/include/xil_sleeptimer.h | 116 + .../ps7_cortexa9_0/include/xil_testcache.h | 71 + .../ps7_cortexa9_0/include/xil_testio.h | 94 + .../ps7_cortexa9_0/include/xil_testmem.h | 158 + .../ps7_cortexa9_0/include/xil_types.h | 209 + .../hello_bsp/ps7_cortexa9_0/include/xl2cc.h | 172 + .../ps7_cortexa9_0/include/xl2cc_counter.h | 113 + .../ps7_cortexa9_0/include/xparameters.h | 499 + .../ps7_cortexa9_0/include/xparameters_ps.h | 338 + .../ps7_cortexa9_0/include/xplatform_info.h | 109 + .../ps7_cortexa9_0/include/xpm_counter.h | 575 + .../ps7_cortexa9_0/include/xpseudo_asm.h | 77 + .../ps7_cortexa9_0/include/xpseudo_asm_gcc.h | 256 + .../ps7_cortexa9_0/include/xqspips.h | 799 + .../ps7_cortexa9_0/include/xqspips_hw.h | 423 + .../ps7_cortexa9_0/include/xreg_cortexa9.h | 591 + .../ps7_cortexa9_0/include/xscugic.h | 372 + .../ps7_cortexa9_0/include/xscugic_hw.h | 650 + .../ps7_cortexa9_0/include/xscutimer.h | 368 + .../ps7_cortexa9_0/include/xscutimer_hw.h | 287 + .../ps7_cortexa9_0/include/xscuwdt.h | 383 + .../ps7_cortexa9_0/include/xscuwdt_hw.h | 182 + .../hello_bsp/ps7_cortexa9_0/include/xsdps.h | 280 + .../ps7_cortexa9_0/include/xsdps_hw.h | 1301 + .../ps7_cortexa9_0/include/xstatus.h | 535 + .../ps7_cortexa9_0/include/xtime_l.h | 105 + .../hello_bsp/ps7_cortexa9_0/include/xttcps.h | 467 + .../ps7_cortexa9_0/include/xttcps_hw.h | 233 + .../ps7_cortexa9_0/include/xuartps.h | 520 + .../ps7_cortexa9_0/include/xuartps_hw.h | 451 + .../hello_bsp/ps7_cortexa9_0/include/xusbps.h | 1098 + .../ps7_cortexa9_0/include/xusbps_endpoint.h | 515 + .../ps7_cortexa9_0/include/xusbps_hw.h | 526 + .../libsrc/canps_v3_2/src/xcanps.c | 1205 + .../libsrc/canps_v3_2/src/xcanps.h | 577 + .../libsrc/canps_v3_2/src/xcanps_g.c | 55 + .../libsrc/canps_v3_2/src/xcanps_hw.c | 93 + .../libsrc/canps_v3_2/src/xcanps_hw.h | 369 + .../libsrc/canps_v3_2/src/xcanps_intr.c | 421 + .../libsrc/canps_v3_2/src/xcanps_selftest.c | 234 + .../libsrc/canps_v3_2/src/xcanps_sinit.c | 103 + .../src/xcoresightpsdcc.c | 188 + .../src/xcoresightpsdcc.h | 74 + .../cpu_cortexa9_v2_6/src/xcpu_cortexa9.h | 48 + .../libsrc/ddrps_v1_0/src/xddrps.h | 66 + .../libsrc/devcfg_v3_5/src/xdevcfg.c | 945 + .../libsrc/devcfg_v3_5/src/xdevcfg.h | 403 + .../libsrc/devcfg_v3_5/src/xdevcfg_g.c | 55 + .../libsrc/devcfg_v3_5/src/xdevcfg_hw.c | 113 + .../libsrc/devcfg_v3_5/src/xdevcfg_hw.h | 395 + .../libsrc/devcfg_v3_5/src/xdevcfg_intr.c | 310 + .../libsrc/devcfg_v3_5/src/xdevcfg_selftest.c | 114 + .../libsrc/devcfg_v3_5/src/xdevcfg_sinit.c | 94 + .../libsrc/dmaps_v2_3/src/xdmaps.c | 1982 + .../libsrc/dmaps_v2_3/src/xdmaps.h | 352 + .../libsrc/dmaps_v2_3/src/xdmaps_g.c | 59 + .../libsrc/dmaps_v2_3/src/xdmaps_hw.c | 116 + .../libsrc/dmaps_v2_3/src/xdmaps_hw.h | 293 + .../libsrc/dmaps_v2_3/src/xdmaps_selftest.c | 110 + .../libsrc/dmaps_v2_3/src/xdmaps_sinit.c | 104 + .../libsrc/emacps_v3_7/src/xemacps.c | 492 + .../libsrc/emacps_v3_7/src/xemacps.h | 809 + .../libsrc/emacps_v3_7/src/xemacps_bd.h | 804 + .../libsrc/emacps_v3_7/src/xemacps_bdring.c | 1102 + .../libsrc/emacps_v3_7/src/xemacps_bdring.h | 241 + .../libsrc/emacps_v3_7/src/xemacps_control.c | 1174 + .../libsrc/emacps_v3_7/src/xemacps_g.c | 56 + .../libsrc/emacps_v3_7/src/xemacps_hw.c | 123 + .../libsrc/emacps_v3_7/src/xemacps_hw.h | 656 + .../libsrc/emacps_v3_7/src/xemacps_intr.c | 268 + .../libsrc/emacps_v3_7/src/xemacps_sinit.c | 97 + .../libsrc/gpiops_v3_3/src/xgpiops.c | 628 + .../libsrc/gpiops_v3_3/src/xgpiops.h | 277 + .../libsrc/gpiops_v3_3/src/xgpiops_g.c | 55 + .../libsrc/gpiops_v3_3/src/xgpiops_hw.c | 169 + .../libsrc/gpiops_v3_3/src/xgpiops_hw.h | 164 + .../libsrc/gpiops_v3_3/src/xgpiops_intr.c | 731 + .../libsrc/gpiops_v3_3/src/xgpiops_selftest.c | 133 + .../libsrc/gpiops_v3_3/src/xgpiops_sinit.c | 101 + .../libsrc/iicps_v3_7/src/xiicps.c | 333 + .../libsrc/iicps_v3_7/src/xiicps.h | 425 + .../libsrc/iicps_v3_7/src/xiicps_g.c | 56 + .../libsrc/iicps_v3_7/src/xiicps_hw.c | 111 + .../libsrc/iicps_v3_7/src/xiicps_hw.h | 383 + .../libsrc/iicps_v3_7/src/xiicps_intr.c | 101 + .../libsrc/iicps_v3_7/src/xiicps_master.c | 999 + .../libsrc/iicps_v3_7/src/xiicps_options.c | 497 + .../libsrc/iicps_v3_7/src/xiicps_selftest.c | 132 + .../libsrc/iicps_v3_7/src/xiicps_sinit.c | 102 + .../libsrc/iicps_v3_7/src/xiicps_slave.c | 595 + .../libsrc/qspips_v3_4/src/xqspips.c | 1571 + .../libsrc/qspips_v3_4/src/xqspips.h | 799 + .../libsrc/qspips_v3_4/src/xqspips_g.c | 57 + .../libsrc/qspips_v3_4/src/xqspips_hw.c | 224 + .../libsrc/qspips_v3_4/src/xqspips_hw.h | 423 + .../libsrc/qspips_v3_4/src/xqspips_options.c | 430 + .../libsrc/qspips_v3_4/src/xqspips_selftest.c | 139 + .../libsrc/qspips_v3_4/src/xqspips_sinit.c | 100 + .../libsrc/scugic_v3_9/src/xscugic.c | 1020 + .../libsrc/scugic_v3_9/src/xscugic.h | 372 + .../libsrc/scugic_v3_9/src/xscugic_g.c | 57 + .../libsrc/scugic_v3_9/src/xscugic_hw.c | 649 + .../libsrc/scugic_v3_9/src/xscugic_hw.h | 650 + .../libsrc/scugic_v3_9/src/xscugic_intr.c | 173 + .../libsrc/scugic_v3_9/src/xscugic_selftest.c | 115 + .../libsrc/scugic_v3_9/src/xscugic_sinit.c | 103 + .../libsrc/scutimer_v2_1/src/xscutimer.c | 286 + .../libsrc/scutimer_v2_1/src/xscutimer.h | 368 + .../libsrc/scutimer_v2_1/src/xscutimer_g.c | 55 + .../libsrc/scutimer_v2_1/src/xscutimer_hw.h | 287 + .../scutimer_v2_1/src/xscutimer_selftest.c | 139 + .../scutimer_v2_1/src/xscutimer_sinit.c | 96 + .../libsrc/scuwdt_v2_1/src/xscuwdt.c | 217 + .../libsrc/scuwdt_v2_1/src/xscuwdt.h | 383 + .../libsrc/scuwdt_v2_1/src/xscuwdt_g.c | 55 + .../libsrc/scuwdt_v2_1/src/xscuwdt_hw.h | 182 + .../libsrc/scuwdt_v2_1/src/xscuwdt_selftest.c | 131 + .../libsrc/scuwdt_v2_1/src/xscuwdt_sinit.c | 96 + .../libsrc/sdps_v3_5/src/xsdps.c | 1763 + .../libsrc/sdps_v3_5/src/xsdps.h | 280 + .../libsrc/sdps_v3_5/src/xsdps_g.c | 62 + .../libsrc/sdps_v3_5/src/xsdps_hw.h | 1301 + .../libsrc/sdps_v3_5/src/xsdps_options.c | 1760 + .../libsrc/sdps_v3_5/src/xsdps_sinit.c | 99 + .../libsrc/standalone_v6_7/src/_exit.c | 44 + .../libsrc/standalone_v6_7/src/_open.c | 54 + .../libsrc/standalone_v6_7/src/_sbrk.c | 65 + .../libsrc/standalone_v6_7/src/abort.c | 42 + .../libsrc/standalone_v6_7/src/bspconfig.h | 45 + .../libsrc/standalone_v6_7/src/changelog.txt | 549 + .../libsrc/standalone_v6_7/src/close.c | 49 + .../libsrc/standalone_v6_7/src/errno.c | 51 + .../libsrc/standalone_v6_7/src/fcntl.c | 46 + .../libsrc/standalone_v6_7/src/fstat.c | 50 + .../libsrc/standalone_v6_7/src/getpid.c | 51 + .../libsrc/standalone_v6_7/src/inbyte.c | 14 + .../libsrc/standalone_v6_7/src/isatty.c | 56 + .../libsrc/standalone_v6_7/src/kill.c | 60 + .../libsrc/standalone_v6_7/src/lseek.c | 61 + .../libsrc/standalone_v6_7/src/open.c | 53 + .../libsrc/standalone_v6_7/src/outbyte.c | 15 + .../libsrc/standalone_v6_7/src/print.c | 36 + .../src/profile/_profile_clean.c | 47 + .../src/profile/_profile_init.c | 90 + .../src/profile/_profile_timer_hw.c | 387 + .../src/profile/_profile_timer_hw.h | 312 + .../src/profile/mblaze_nt_types.h | 54 + .../standalone_v6_7/src/profile/profile.h | 131 + .../standalone_v6_7/src/profile/profile_cg.c | 171 + .../src/profile/profile_config.h | 48 + .../src/profile/profile_hist.c | 71 + .../libsrc/standalone_v6_7/src/putnum.c | 59 + .../libsrc/standalone_v6_7/src/read.c | 104 + .../libsrc/standalone_v6_7/src/sbrk.c | 61 + .../libsrc/standalone_v6_7/src/sleep.c | 92 + .../libsrc/standalone_v6_7/src/sleep.h | 119 + .../libsrc/standalone_v6_7/src/smc.h | 114 + .../libsrc/standalone_v6_7/src/unlink.c | 50 + .../libsrc/standalone_v6_7/src/usleep.c | 107 + .../libsrc/standalone_v6_7/src/vectors.c | 231 + .../libsrc/standalone_v6_7/src/vectors.h | 88 + .../libsrc/standalone_v6_7/src/write.c | 121 + .../libsrc/standalone_v6_7/src/xbasic_types.h | 119 + .../libsrc/standalone_v6_7/src/xdebug.h | 32 + .../libsrc/standalone_v6_7/src/xenv.h | 187 + .../standalone_v6_7/src/xenv_standalone.h | 368 + .../libsrc/standalone_v6_7/src/xil_assert.c | 147 + .../libsrc/standalone_v6_7/src/xil_assert.h | 195 + .../libsrc/standalone_v6_7/src/xil_cache.c | 1641 + .../libsrc/standalone_v6_7/src/xil_cache.h | 121 + .../libsrc/standalone_v6_7/src/xil_cache_l.h | 100 + .../standalone_v6_7/src/xil_cache_vxworks.h | 93 + .../libsrc/standalone_v6_7/src/xil_errata.h | 123 + .../standalone_v6_7/src/xil_exception.c | 363 + .../standalone_v6_7/src/xil_exception.h | 260 + .../libsrc/standalone_v6_7/src/xil_hal.h | 61 + .../libsrc/standalone_v6_7/src/xil_io.c | 102 + .../libsrc/standalone_v6_7/src/xil_io.h | 345 + .../standalone_v6_7/src/xil_macroback.h | 1052 + .../libsrc/standalone_v6_7/src/xil_mem.c | 83 + .../libsrc/standalone_v6_7/src/xil_mem.h | 59 + .../src/xil_misc_psreset_api.c | 524 + .../src/xil_misc_psreset_api.h | 277 + .../libsrc/standalone_v6_7/src/xil_mmu.c | 190 + .../libsrc/standalone_v6_7/src/xil_mmu.h | 108 + .../libsrc/standalone_v6_7/src/xil_printf.c | 443 + .../libsrc/standalone_v6_7/src/xil_printf.h | 48 + .../standalone_v6_7/src/xil_sleepcommon.c | 106 + .../standalone_v6_7/src/xil_sleeptimer.c | 162 + .../standalone_v6_7/src/xil_sleeptimer.h | 116 + .../standalone_v6_7/src/xil_testcache.c | 371 + .../standalone_v6_7/src/xil_testcache.h | 71 + .../libsrc/standalone_v6_7/src/xil_testio.c | 299 + .../libsrc/standalone_v6_7/src/xil_testio.h | 94 + .../libsrc/standalone_v6_7/src/xil_testmem.c | 868 + .../libsrc/standalone_v6_7/src/xil_testmem.h | 158 + .../libsrc/standalone_v6_7/src/xil_types.h | 209 + .../libsrc/standalone_v6_7/src/xl2cc.h | 172 + .../standalone_v6_7/src/xl2cc_counter.c | 169 + .../standalone_v6_7/src/xl2cc_counter.h | 113 + .../standalone_v6_7/src/xparameters_ps.h | 338 + .../standalone_v6_7/src/xplatform_info.c | 161 + .../standalone_v6_7/src/xplatform_info.h | 109 + .../libsrc/standalone_v6_7/src/xpm_counter.c | 297 + .../libsrc/standalone_v6_7/src/xpm_counter.h | 575 + .../libsrc/standalone_v6_7/src/xpseudo_asm.h | 77 + .../standalone_v6_7/src/xpseudo_asm_gcc.h | 256 + .../standalone_v6_7/src/xreg_cortexa9.h | 591 + .../libsrc/standalone_v6_7/src/xstatus.h | 535 + .../libsrc/standalone_v6_7/src/xtime_l.c | 122 + .../libsrc/standalone_v6_7/src/xtime_l.h | 105 + .../libsrc/ttcps_v3_6/src/xttcps.c | 448 + .../libsrc/ttcps_v3_6/src/xttcps.h | 467 + .../libsrc/ttcps_v3_6/src/xttcps_g.c | 66 + .../libsrc/ttcps_v3_6/src/xttcps_hw.h | 233 + .../libsrc/ttcps_v3_6/src/xttcps_options.c | 243 + .../libsrc/ttcps_v3_6/src/xttcps_selftest.c | 109 + .../libsrc/ttcps_v3_6/src/xttcps_sinit.c | 98 + .../libsrc/uartps_v3_6/src/xuartps.c | 645 + .../libsrc/uartps_v3_6/src/xuartps.h | 520 + .../libsrc/uartps_v3_6/src/xuartps_g.c | 57 + .../libsrc/uartps_v3_6/src/xuartps_hw.c | 180 + .../libsrc/uartps_v3_6/src/xuartps_hw.h | 451 + .../libsrc/uartps_v3_6/src/xuartps_intr.c | 450 + .../libsrc/uartps_v3_6/src/xuartps_options.c | 764 + .../libsrc/uartps_v3_6/src/xuartps_selftest.c | 166 + .../libsrc/uartps_v3_6/src/xuartps_sinit.c | 99 + .../libsrc/usbps_v2_4/src/xusbps.c | 364 + .../libsrc/usbps_v2_4/src/xusbps.h | 1098 + .../libsrc/usbps_v2_4/src/xusbps_endpoint.c | 1454 + .../libsrc/usbps_v2_4/src/xusbps_endpoint.h | 515 + .../libsrc/usbps_v2_4/src/xusbps_g.c | 55 + .../libsrc/usbps_v2_4/src/xusbps_hw.c | 122 + .../libsrc/usbps_v2_4/src/xusbps_hw.h | 526 + .../libsrc/usbps_v2_4/src/xusbps_intr.c | 472 + .../libsrc/usbps_v2_4/src/xusbps_sinit.c | 99 + .../libsrc/xadcps_v2_2/src/xadcps.c | 1831 + .../libsrc/xadcps_v2_2/src/xadcps.h | 591 + .../libsrc/xadcps_v2_2/src/xadcps_g.c | 55 + .../libsrc/xadcps_v2_2/src/xadcps_hw.h | 502 + .../libsrc/xadcps_v2_2/src/xadcps_intr.c | 250 + .../libsrc/xadcps_v2_2/src/xadcps_selftest.c | 141 + .../libsrc/xadcps_v2_2/src/xadcps_sinit.c | 103 + .../LED_Blink.sdk/webtalk/sdk_webtalk.tcl | 71 + .../webtalk/usage_statistics_ext_sdk.xml | 89 + LED_Blink/LED_Blink.sdk/webtalk/webtalk.jou | 12 + .../sources_1/bd/design_1/design_1.bd | 491 + .../sources_1/bd/design_1/design_1.bxml | 61 + .../sources_1/bd/design_1/design_1_ooc.xdc | 12 + .../bd/design_1/hdl/design_1_wrapper.v | 104 + .../bd/design_1/hw_handoff/design_1_bd.tcl | 562 + .../ip/design_1_led_0_0/design_1_led_0_0.dcp | Bin 0 -> 13314 bytes .../ip/design_1_led_0_0/design_1_led_0_0.xci | 48 + .../ip/design_1_led_0_0/design_1_led_0_0.xml | 261 + .../design_1_led_0_0_sim_netlist.v | 504 + .../design_1_led_0_0/design_1_led_0_0_stub.v | 21 + .../design_1_led_0_0/sim/design_1_led_0_0.v | 71 + .../design_1_led_0_0/synth/design_1_led_0_0.v | 72 + .../design_1_processing_system7_0_0.dcp | Bin 0 -> 217020 bytes .../design_1_processing_system7_0_0.xci | 1808 + .../design_1_processing_system7_0_0.xdc | 456 + .../design_1_processing_system7_0_0.xml | 39167 ++++++++++++++++ ...ign_1_processing_system7_0_0_sim_netlist.v | 5171 ++ .../design_1_processing_system7_0_0_stub.v | 164 + ...ocessing_system7_v5_5_processing_system7.v | 3935 ++ .../ps7_init.c | 10638 +++++ .../ps7_init.h | 137 + .../ps7_init.tcl | 781 + .../ps7_init_gpl.c | 10629 +++++ .../ps7_init_gpl.h | 137 + .../ps7_parameters.xml | 643 + .../sim/design_1_processing_system7_0_0.v | 704 + .../synth/design_1_processing_system7_0_0.v | 1173 + .../hdl/processing_system7_vip_v1_0_5_apis.v | 842 + .../processing_system7_vip_v1_0_5_axi_acp.v | 94 + .../processing_system7_vip_v1_0_5_axi_gp.v | 311 + .../processing_system7_vip_v1_0_5_axi_hp.v | 350 + ...ocessing_system7_vip_v1_0_5_local_params.v | 244 + .../processing_system7_vip_v1_0_5_reg_init.v | 2924 ++ ...processing_system7_vip_v1_0_5_reg_params.v | 10519 +++++ ...ocessing_system7_vip_v1_0_5_unused_ports.v | 433 + .../hdl/verilog/processing_system7_v5_5_atc.v | 409 + .../verilog/processing_system7_v5_5_aw_atc.v | 298 + .../verilog/processing_system7_v5_5_b_atc.v | 413 + .../processing_system7_v5_5_trace_buffer.v | 310 + .../verilog/processing_system7_v5_5_w_atc.v | 244 + .../ec67/hdl/axi_infrastructure_v1_1_vl_rfs.v | 670 + .../sources_1/bd/design_1/sim/design_1.v | 141 + .../sources_1/bd/design_1/synth/design_1.v | 141 + .../sources_1/bd/design_1/ui/bd_1f5defd0.ui | 19 + .../sources_1/bd/mref/led/component.xml | 130 + .../sources_1/bd/mref/led/xgui/led_v1_0.tcl | 10 + LED_Blink/LED_Blink.srcs/sources_1/new/led.v | 41 + LED_Blink/LED_Blink.xpr | 278 + zynqberrydemo1/_readme.txt | 73 + zynqberrydemo1/block_design/zsys_bd.tcl | 1126 + .../board_files/TE0726/1.0/board.xml | 69 + .../board_files/TE0726/1.0/part0_pins.xml | 11 + .../board_files/TE0726/1.0/preset.xml | 116 + .../board_files/TE0726/2.1/board.xml | 70 + .../board_files/TE0726/2.1/part0_pins.xml | 11 + .../board_files/TE0726/2.1/preset.xml | 256 + .../board_files/TE0726/3.1/board.xml | 70 + .../board_files/TE0726/3.1/part0_pins.xml | 11 + .../board_files/TE0726/3.1/preset.xml | 283 + .../board_files/TE0726_7S/3.1/board.xml | 70 + .../board_files/TE0726_7S/3.1/part0_pins.xml | 11 + .../board_files/TE0726_7S/3.1/preset.xml | 283 + zynqberrydemo1/console/readme.txt | 4 + .../constraints/_i_bitgen_common.xdc | 7 + zynqberrydemo1/constraints/_i_common.xdc | 5 + zynqberrydemo1/constraints/_i_csi.xdc | 18 + zynqberrydemo1/constraints/_i_hdmi.xdc | 7 + zynqberrydemo1/constraints/_i_te0726.xdc | 90 + zynqberrydemo1/constraints/_i_timing.xdc | 10 + zynqberrydemo1/constraints/vivado_target.xdc | 0 .../ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl | 86 + .../Video_IO_2_HDMI_TMDS_1.0/component.xml | 545 + .../hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd | 229 + .../hdl/clock_system.vhd | 282 + .../hdl/convert_30to15_fifo.vhd | 194 + .../Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd | 51 + .../hdl/dvi_encoder.vhd | 75 + .../Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd | 79 + .../hdl/serdes_ddr.vhd | 128 + .../hdl/tmds_encoder.vhd | 180 + .../src/serdes_ddr.vhd | 128 + .../xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl | 119 + .../ip_lib/axi_i2s_adi_1.2/bd/bd.tcl | 86 + .../ip_lib/axi_i2s_adi_1.2/component.xml | 1973 + .../axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl | 5 + .../axi_i2s_adi_v1_0/src/axi_i2s_adi.c | 6 + .../axi_i2s_adi_v1_0/src/axi_i2s_adi.h | 87 + .../src/axi_i2s_adi_selftest.c | 60 + .../bfm_design/axi_i2s_adi_v1_2_tb.v | 184 + .../example_designs/bfm_design/design.tcl | 91 + .../axi_i2s_adi_v1_2_hw_test.tcl | 45 + .../debug_hw_design/design.tcl | 175 + .../hdl/adi_common/axi_ctrlif.vhd | 151 + .../adi_common/axi_streaming_dma_rx_fifo.vhd | 80 + .../adi_common/axi_streaming_dma_tx_fifo.vhd | 74 + .../hdl/adi_common/dma_fifo.vhd | 69 + .../hdl/adi_common/pl330_dma_fifo.vhd | 140 + .../axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd | 361 + .../axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd | 469 + .../axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd | 108 + .../ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd | 133 + .../axi_i2s_adi_1.2/hdl/i2s_controller.vhd | 282 + .../ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd | 180 + .../ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd | 134 + .../axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl | 105 + zynqberrydemo1/ip_lib/axi_reg32_1.0/bd/bd.tcl | 86 + .../ip_lib/axi_reg32_1.0/component.xml | 2288 + .../drivers/axi_reg32_v1_0/data/axi_reg32.tcl | 5 + .../drivers/axi_reg32_v1_0/src/axi_reg32.c | 6 + .../drivers/axi_reg32_v1_0/src/axi_reg32.h | 107 + .../axi_reg32_v1_0/src/axi_reg32_selftest.c | 60 + .../bfm_design/axi_reg32_v1_0_tb.v | 184 + .../example_designs/bfm_design/design.tcl | 91 + .../axi_reg32_v1_0_hw_test.tcl | 45 + .../debug_hw_design/design.tcl | 175 + .../axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd | 263 + .../hdl/axi_reg32_v1_0_S_AXI.vhd | 766 + .../axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl | 853 + .../ip_lib/axis_audio_pwm_1.0/bd/bd.tcl | 86 + .../ip_lib/axis_audio_pwm_1.0/component.xml | 369 + .../hdl/axis_audio_pwm_v1_0.vhd | 86 + .../hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd | 177 + .../xgui/axis_audio_pwm_v1_0.tcl | 40 + .../ip_lib/axis_fb_conv_1.0/bd/bd.tcl | 86 + .../ip_lib/axis_fb_conv_1.0/component.xml | 515 + .../src/axis_fb_conv_v1_0.vhd | 78 + .../xgui/axis_fb_conv_v1_0.tcl | 25 + .../ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl | 86 + .../axis_raw_demosaic_1.0/component.xml | 586 + .../hdl/axis_raw_demosaic_v1_0.vhd | 252 + .../hdl/dualport_ram.vhd | 39 + .../axis_raw_demosaic_1.0/hdl/gamma_rom.vhd | 98 + .../xgui/axis_raw_demosaic_v1_0.tcl | 70 + .../ip_lib/axis_raw_unpack_1.0/bd/bd.tcl | 86 + .../ip_lib/axis_raw_unpack_1.0/component.xml | 524 + .../hdl/axis_raw_unpack_v1_0.vhd | 288 + .../axis_raw_unpack_1.0/hdl/srl_fifo.vhd | 113 + .../axis_raw_unpack_1.0/src/srl_fifo.vhd | 111 + .../xgui/axis_raw_unpack_v1_0.tcl | 40 + .../ip_lib/axis_to_i2s_1.0/component.xml | 324 + .../axis_to_i2s_1.0/hdl/axis_to_i2s.vhd | 66 + .../axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl | 10 + .../axis_video_dwidth_converter_1.0/bd/bd.tcl | 86 + .../component.xml | 535 + .../hdl/axis_video_dwidth_converter_v1_0.vhd | 146 + .../xgui/axis_video_dwidth_converter_v1_0.tcl | 55 + .../ip_lib/axis_video_resize_1.0/bd/bd.tcl | 86 + .../axis_video_resize_1.0/component.xml | 521 + .../hdl/axis_video_resize_v1_0.vhd | 115 + .../xgui/axis_video_resize_v1_0.tcl | 55 + .../ip_lib/csi2_d_phy_rx_1.0/component.xml | 1035 + .../csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd | 293 + .../csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc | 4 + .../ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd | 97 + .../hdl/phy_clock_system.vhd | 316 + .../xgui/csi2_d_phy_rx_v1_0.tcl | 198 + .../ip_lib/csi_to_axis_1.0/bd/bd.tcl | 86 + .../ip_lib/csi_to_axis_1.0/component.xml | 1180 + .../csi_to_axis_1.0/hdl/csi2_parser.vhd | 147 + .../csi_to_axis_1.0/hdl/csi_to_axis.xdc | 1 + .../csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd | 272 + .../ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd | 123 + .../ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd | 118 + .../csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl | 56 + .../ip_lib/i2s_to_pwm_1.0/component.xml | 228 + .../ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd | 133 + .../i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl | 40 + .../u-boot/configs/platform-auto.h | 175 + .../recipes-apps/gpio-demo/files/gpio-demo.c | 359 + .../recipes-apps/peekpoke/files/peek.c | 81 + .../recipes-apps/peekpoke/files/poke.c | 81 + .../recipes-apps/rpicam/files/rpicam.c | 191 + .../recipes-apps/rpicam/files/sensor_config.h | 705 + .../recipes-apps/startup/files/startup.c | 39 + .../recipes-bsp/u-boot/files/platform-top.h | 5 + .../te-audio-codec/files/te-audio-codec.c | 99 + .../reports/zynqberrydemo1_io_report.txt | 267 + .../reports/zynqberrydemo1_io_report.xdc | 535 + .../zynqberrydemo1_ip_status_report.txt | 152 + .../reports/zynqberrydemo1_io_report.txt | 267 + .../reports/zynqberrydemo1_io_report.xdc | 589 + .../zynqberrydemo1_ip_status_report.txt | 152 + .../prebuilt/os/petalinux/default/u-boot.elf | Bin 0 -> 2791052 bytes .../prebuilt/software/te0726_7s/zynq_fsbl.elf | Bin 0 -> 205872 bytes .../prebuilt/software/te0726_m/zynq_fsbl.elf | Bin 0 -> 205840 bytes zynqberrydemo1/scripts/reinitialise_all.tcl | 123 + zynqberrydemo1/scripts/script_designs.tcl | 402 + zynqberrydemo1/scripts/script_environment.tcl | 46 + zynqberrydemo1/scripts/script_external.tcl | 786 + zynqberrydemo1/scripts/script_hsi.tcl | 270 + zynqberrydemo1/scripts/script_main.tcl | 184 + zynqberrydemo1/scripts/script_sdsoc.tcl | 367 + zynqberrydemo1/scripts/script_settings.tcl | 874 + zynqberrydemo1/scripts/script_te_utils.tcl | 766 + zynqberrydemo1/scripts/script_usrcommands.tcl | 991 + zynqberrydemo1/scripts/script_vivado.tcl | 1556 + zynqberrydemo1/settings/project_settings.tcl | 2 + .../sw_apps/zynq_fsbl/data/zynq_fsbl.tcl | 97 + .../sw_lib/sw_apps/zynq_fsbl/src/fsbl.h | 546 + .../sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h | 82 + .../sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c | 206 + .../sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h | 81 + .../sw_apps/zynq_fsbl/src/image_mover.c | 1335 + .../sw_apps/zynq_fsbl/src/image_mover.h | 161 + .../sw_lib/sw_apps/zynq_fsbl/src/main.c | 1532 + .../sw_lib/sw_apps/zynq_fsbl/src/md5.c | 484 + .../sw_lib/sw_apps/zynq_fsbl/src/md5.h | 120 + .../sw_lib/sw_apps/zynq_fsbl/src/nand.c | 295 + .../sw_lib/sw_apps/zynq_fsbl/src/nand.h | 91 + .../sw_lib/sw_apps/zynq_fsbl/src/nor.c | 144 + .../sw_lib/sw_apps/zynq_fsbl/src/nor.h | 87 + .../sw_lib/sw_apps/zynq_fsbl/src/pcap.c | 816 + .../sw_lib/sw_apps/zynq_fsbl/src/pcap.h | 108 + .../sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c | 12946 +++++ .../sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h | 140 + .../sw_lib/sw_apps/zynq_fsbl/src/qspi.c | 764 + .../sw_lib/sw_apps/zynq_fsbl/src/qspi.h | 128 + .../sw_lib/sw_apps/zynq_fsbl/src/rsa.c | 361 + .../sw_lib/sw_apps/zynq_fsbl/src/rsa.h | 80 + .../sw_lib/sw_apps/zynq_fsbl/src/sd.c | 191 + .../sw_lib/sw_apps/zynq_fsbl/src/sd.h | 79 + .../sw_lib/sw_apps/zynq_fsbl/src/vdma.c | 167 + .../sw_lib/sw_apps/zynq_fsbl/src/vdma.h | 14 + zynqberrydemo3/_readme.txt | 73 + zynqberrydemo3/block_design/zsys_bd.tcl | 1126 + .../board_files/TE0726/1.0/board.xml | 69 + .../board_files/TE0726/1.0/part0_pins.xml | 11 + .../board_files/TE0726/1.0/preset.xml | 116 + .../board_files/TE0726/2.1/board.xml | 70 + .../board_files/TE0726/2.1/part0_pins.xml | 11 + .../board_files/TE0726/2.1/preset.xml | 256 + .../board_files/TE0726/3.1/board.xml | 70 + .../board_files/TE0726/3.1/part0_pins.xml | 11 + .../board_files/TE0726/3.1/preset.xml | 283 + .../board_files/TE0726_7S/3.1/board.xml | 70 + .../board_files/TE0726_7S/3.1/part0_pins.xml | 11 + .../board_files/TE0726_7S/3.1/preset.xml | 283 + zynqberrydemo3/console/readme.txt | 4 + .../constraints/_i_bitgen_common.xdc | 7 + zynqberrydemo3/constraints/_i_common.xdc | 5 + zynqberrydemo3/constraints/_i_csi.xdc | 18 + zynqberrydemo3/constraints/_i_hdmi.xdc | 8 + zynqberrydemo3/constraints/_i_te0726.xdc | 90 + zynqberrydemo3/constraints/_i_timing.xdc | 13 + zynqberrydemo3/constraints/vivado_target.xdc | 0 .../ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl | 86 + .../Video_IO_2_HDMI_TMDS_1.0/component.xml | 545 + .../hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd | 229 + .../hdl/clock_system.vhd | 282 + .../hdl/convert_30to15_fifo.vhd | 194 + .../Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd | 51 + .../hdl/dvi_encoder.vhd | 75 + .../Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd | 79 + .../hdl/serdes_ddr.vhd | 128 + .../hdl/tmds_encoder.vhd | 180 + .../src/serdes_ddr.vhd | 128 + .../xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl | 119 + .../ip_lib/axi_i2s_adi_1.2/bd/bd.tcl | 86 + .../ip_lib/axi_i2s_adi_1.2/component.xml | 1973 + .../axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl | 5 + .../axi_i2s_adi_v1_0/src/axi_i2s_adi.c | 6 + .../axi_i2s_adi_v1_0/src/axi_i2s_adi.h | 87 + .../src/axi_i2s_adi_selftest.c | 60 + .../bfm_design/axi_i2s_adi_v1_2_tb.v | 184 + .../example_designs/bfm_design/design.tcl | 91 + .../axi_i2s_adi_v1_2_hw_test.tcl | 45 + .../debug_hw_design/design.tcl | 175 + .../hdl/adi_common/axi_ctrlif.vhd | 151 + .../adi_common/axi_streaming_dma_rx_fifo.vhd | 80 + .../adi_common/axi_streaming_dma_tx_fifo.vhd | 74 + .../hdl/adi_common/dma_fifo.vhd | 69 + .../hdl/adi_common/pl330_dma_fifo.vhd | 140 + .../axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd | 361 + .../axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd | 469 + .../axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd | 108 + .../ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd | 133 + .../axi_i2s_adi_1.2/hdl/i2s_controller.vhd | 282 + .../ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd | 180 + .../ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd | 134 + .../axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl | 105 + zynqberrydemo3/ip_lib/axi_reg32_1.0/bd/bd.tcl | 86 + .../ip_lib/axi_reg32_1.0/component.xml | 2288 + .../drivers/axi_reg32_v1_0/data/axi_reg32.tcl | 5 + .../drivers/axi_reg32_v1_0/src/axi_reg32.c | 6 + .../drivers/axi_reg32_v1_0/src/axi_reg32.h | 107 + .../axi_reg32_v1_0/src/axi_reg32_selftest.c | 60 + .../bfm_design/axi_reg32_v1_0_tb.v | 184 + .../example_designs/bfm_design/design.tcl | 91 + .../axi_reg32_v1_0_hw_test.tcl | 45 + .../debug_hw_design/design.tcl | 175 + .../axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd | 263 + .../hdl/axi_reg32_v1_0_S_AXI.vhd | 766 + .../axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl | 853 + .../ip_lib/axis_audio_pwm_1.0/bd/bd.tcl | 86 + .../ip_lib/axis_audio_pwm_1.0/component.xml | 369 + .../hdl/axis_audio_pwm_v1_0.vhd | 86 + .../hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd | 177 + .../xgui/axis_audio_pwm_v1_0.tcl | 40 + .../ip_lib/axis_fb_conv_1.0/bd/bd.tcl | 86 + .../ip_lib/axis_fb_conv_1.0/component.xml | 515 + .../src/axis_fb_conv_v1_0.vhd | 78 + .../xgui/axis_fb_conv_v1_0.tcl | 25 + .../ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl | 86 + .../axis_raw_demosaic_1.0/component.xml | 586 + .../hdl/axis_raw_demosaic_v1_0.vhd | 252 + .../hdl/dualport_ram.vhd | 39 + .../axis_raw_demosaic_1.0/hdl/gamma_rom.vhd | 98 + .../xgui/axis_raw_demosaic_v1_0.tcl | 70 + .../ip_lib/axis_raw_unpack_1.0/bd/bd.tcl | 86 + .../ip_lib/axis_raw_unpack_1.0/component.xml | 524 + .../hdl/axis_raw_unpack_v1_0.vhd | 288 + .../axis_raw_unpack_1.0/hdl/srl_fifo.vhd | 113 + .../axis_raw_unpack_1.0/src/srl_fifo.vhd | 111 + .../xgui/axis_raw_unpack_v1_0.tcl | 40 + .../ip_lib/axis_to_i2s_1.0/component.xml | 324 + .../axis_to_i2s_1.0/hdl/axis_to_i2s.vhd | 66 + .../axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl | 10 + .../axis_video_dwidth_converter_1.0/bd/bd.tcl | 86 + .../component.xml | 535 + .../hdl/axis_video_dwidth_converter_v1_0.vhd | 146 + .../xgui/axis_video_dwidth_converter_v1_0.tcl | 55 + .../ip_lib/axis_video_resize_1.0/bd/bd.tcl | 86 + .../axis_video_resize_1.0/component.xml | 521 + .../hdl/axis_video_resize_v1_0.vhd | 115 + .../xgui/axis_video_resize_v1_0.tcl | 55 + .../ip_lib/csi2_d_phy_rx_1.0/component.xml | 1035 + .../csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd | 293 + .../csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc | 4 + .../ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd | 97 + .../hdl/phy_clock_system.vhd | 316 + .../xgui/csi2_d_phy_rx_v1_0.tcl | 198 + .../ip_lib/csi_to_axis_1.0/bd/bd.tcl | 86 + .../ip_lib/csi_to_axis_1.0/component.xml | 1180 + .../csi_to_axis_1.0/hdl/csi2_parser.vhd | 147 + .../csi_to_axis_1.0/hdl/csi_to_axis.xdc | 1 + .../csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd | 272 + .../ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd | 123 + .../ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd | 118 + .../csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl | 56 + .../ip_lib/i2s_to_pwm_1.0/component.xml | 228 + .../ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd | 133 + .../i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl | 40 + .../u-boot/configs/platform-auto.h | 175 + .../recipes-apps/fbgrab/files/fbgrab.c | 428 + .../recipes-apps/gpio-demo/files/gpio-demo.c | 359 + .../recipes-apps/peekpoke/files/peek.c | 81 + .../recipes-apps/peekpoke/files/poke.c | 81 + .../recipes-apps/rpicam/files/rpicam.c | 191 + .../recipes-apps/rpicam/files/sensor_config.h | 705 + .../recipes-apps/startup/files/startup.c | 39 + .../recipes-bsp/u-boot/files/platform-top.h | 4 + .../te-audio-codec/files/te-audio-codec.c | 99 + .../reports/zynqberrydemo3_io_report.txt | 267 + .../reports/zynqberrydemo3_io_report.xdc | 535 + .../zynqberrydemo3_ip_status_report.txt | 152 + .../reports/zynqberrydemo3_io_report.txt | 267 + .../reports/zynqberrydemo3_io_report.xdc | 589 + .../zynqberrydemo3_ip_status_report.txt | 152 + .../prebuilt/os/petalinux/default/u-boot.elf | Bin 0 -> 2799404 bytes .../prebuilt/software/te0726_7s/zynq_fsbl.elf | Bin 0 -> 205872 bytes .../prebuilt/software/te0726_m/zynq_fsbl.elf | Bin 0 -> 205840 bytes zynqberrydemo3/scripts/reinitialise_all.tcl | 123 + zynqberrydemo3/scripts/script_designs.tcl | 402 + zynqberrydemo3/scripts/script_environment.tcl | 46 + zynqberrydemo3/scripts/script_external.tcl | 786 + zynqberrydemo3/scripts/script_hsi.tcl | 270 + zynqberrydemo3/scripts/script_main.tcl | 184 + zynqberrydemo3/scripts/script_sdsoc.tcl | 367 + zynqberrydemo3/scripts/script_settings.tcl | 874 + zynqberrydemo3/scripts/script_te_utils.tcl | 766 + zynqberrydemo3/scripts/script_usrcommands.tcl | 991 + zynqberrydemo3/scripts/script_vivado.tcl | 1556 + zynqberrydemo3/settings/project_settings.tcl | 2 + .../sw_apps/zynq_fsbl/data/zynq_fsbl.tcl | 97 + .../sw_lib/sw_apps/zynq_fsbl/src/fsbl.h | 546 + .../sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h | 82 + .../sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c | 206 + .../sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h | 81 + .../sw_apps/zynq_fsbl/src/image_mover.c | 1335 + .../sw_apps/zynq_fsbl/src/image_mover.h | 161 + .../sw_lib/sw_apps/zynq_fsbl/src/main.c | 1532 + .../sw_lib/sw_apps/zynq_fsbl/src/md5.c | 484 + .../sw_lib/sw_apps/zynq_fsbl/src/md5.h | 120 + .../sw_lib/sw_apps/zynq_fsbl/src/nand.c | 295 + .../sw_lib/sw_apps/zynq_fsbl/src/nand.h | 91 + .../sw_lib/sw_apps/zynq_fsbl/src/nor.c | 144 + .../sw_lib/sw_apps/zynq_fsbl/src/nor.h | 87 + .../sw_lib/sw_apps/zynq_fsbl/src/pcap.c | 816 + .../sw_lib/sw_apps/zynq_fsbl/src/pcap.h | 108 + .../sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c | 12946 +++++ .../sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h | 140 + .../sw_lib/sw_apps/zynq_fsbl/src/qspi.c | 764 + .../sw_lib/sw_apps/zynq_fsbl/src/qspi.h | 128 + .../sw_lib/sw_apps/zynq_fsbl/src/rsa.c | 361 + .../sw_lib/sw_apps/zynq_fsbl/src/rsa.h | 80 + .../sw_lib/sw_apps/zynq_fsbl/src/sd.c | 191 + .../sw_lib/sw_apps/zynq_fsbl/src/sd.h | 79 + .../sw_lib/sw_apps/zynq_fsbl/src/vdma.c | 167 + .../sw_lib/sw_apps/zynq_fsbl/src/vdma.h | 14 + 797 files changed, 363075 insertions(+) create mode 100644 LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/50c2fa8fed532918.xci create mode 100644 LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0.dcp create mode 100644 LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0_sim_netlist.v create mode 100644 LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0_stub.v create mode 100644 LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/stats.txt create mode 100644 LED_Blink/LED_Blink.cache/wt/webtalk_pa.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_1.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_10.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_11.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_12.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_13.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_2.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_3.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_4.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_5.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_6.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_7.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_8.xml create mode 100644 LED_Blink/LED_Blink.runs/.jobs/vrs_config_9.xml create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.dcp create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.tcl create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.vds create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_sim_netlist.v create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_stub.v create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_utilization_synth.pb create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_utilization_synth.rpt create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/gen_run.xml create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/htr.txt create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/vivado.jou create mode 100644 LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/vivado.pb create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/.Xil/design_1_processing_system7_0_0_propImpl.xdc create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/design_1_processing_system7_0_0.dcp create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/design_1_processing_system7_0_0.tcl create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/design_1_processing_system7_0_0.vds create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/design_1_processing_system7_0_0_utilization_synth.pb create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/design_1_processing_system7_0_0_utilization_synth.rpt create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/dont_touch.xdc create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/gen_run.xml create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/htr.txt create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/vivado.jou create mode 100644 LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/vivado.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.tcl create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.vdi create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_bus_skew_routed.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_bus_skew_routed.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_clock_utilization_routed.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_control_sets_placed.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_opted.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_opted.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_routed.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_routed.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_io_placed.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_methodology_drc_routed.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_methodology_drc_routed.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_opt.dcp create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_placed.dcp create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_power_routed.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_power_summary_routed.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_route_status.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_route_status.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_routed.dcp create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_timing_summary_routed.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_timing_summary_routed.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_utilization_placed.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_utilization_placed.rpt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/gen_run.xml create mode 100644 LED_Blink/LED_Blink.runs/impl_1/htr.txt create mode 100644 LED_Blink/LED_Blink.runs/impl_1/init_design.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/opt_design.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/place_design.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/route_design.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/usage_statistics_webtalk.xml create mode 100644 LED_Blink/LED_Blink.runs/impl_1/vivado.jou create mode 100644 LED_Blink/LED_Blink.runs/impl_1/vivado.pb create mode 100644 LED_Blink/LED_Blink.runs/impl_1/write_bitstream.pb create mode 100644 LED_Blink/LED_Blink.runs/synth_1/.Xil/design_1_wrapper_propImpl.xdc create mode 100644 LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.dcp create mode 100644 LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.tcl create mode 100644 LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.vds create mode 100644 LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper_utilization_synth.pb create mode 100644 LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper_utilization_synth.rpt create mode 100644 LED_Blink/LED_Blink.runs/synth_1/dont_touch.xdc create mode 100644 LED_Blink/LED_Blink.runs/synth_1/gen_run.xml create mode 100644 LED_Blink/LED_Blink.runs/synth_1/htr.txt create mode 100644 LED_Blink/LED_Blink.runs/synth_1/vivado.jou create mode 100644 LED_Blink/LED_Blink.runs/synth_1/vivado.pb create mode 100644 LED_Blink/LED_Blink.sdk/.metadata/.plugins/com.xilinx.sdk.hw.ui/dialog_settings.xml create mode 100644 LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c create mode 100644 LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml create mode 100644 LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml create mode 100644 LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml create mode 100644 LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml create mode 100644 LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml create mode 100644 LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml create mode 100644 LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.c create mode 100644 LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.h create mode 100644 LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.tcl create mode 100644 LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init_gpl.c create mode 100644 LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init_gpl.h create mode 100644 LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.c create mode 100644 LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.h create mode 100644 LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.tcl create mode 100644 LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.c create mode 100644 LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.h create mode 100644 LED_Blink/LED_Blink.sdk/hello/Debug/hello.elf create mode 100644 LED_Blink/LED_Blink.sdk/hello/src/helloworld.c create mode 100644 LED_Blink/LED_Blink.sdk/hello/src/platform.c create mode 100644 LED_Blink/LED_Blink.sdk/hello/src/platform.h create mode 100644 LED_Blink/LED_Blink.sdk/hello/src/platform_config.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/_profile_timer_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/bspconfig.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/mblaze_nt_types.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/profile.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/sleep.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/smc.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/vectors.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xadcps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xadcps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xbasic_types.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcanps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcanps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcoresightpsdcc.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcpu_cortexa9.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xddrps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdebug.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdevcfg.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdevcfg_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdmaps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdmaps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_bd.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_bdring.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xenv.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xenv_standalone.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xgpiops.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xgpiops_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xiicps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xiicps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_assert.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache_l.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache_vxworks.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_errata.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_exception.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_hal.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_io.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_macroback.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_mem.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_misc_psreset_api.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_mmu.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_printf.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_sleeptimer.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testcache.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testio.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testmem.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_types.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xl2cc.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xl2cc_counter.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xparameters.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xparameters_ps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xplatform_info.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpm_counter.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpseudo_asm.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xqspips.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xqspips_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscugic.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscugic_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscutimer.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscutimer_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscuwdt.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscuwdt_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xsdps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xsdps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xstatus.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xtime_l.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xttcps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xttcps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xuartps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xuartps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps_endpoint.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_intr.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src/xcoresightpsdcc.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src/xcoresightpsdcc.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v2_6/src/xcpu_cortexa9.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ddrps_v1_0/src/xddrps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_intr.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bd.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bdring.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bdring.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_control.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_intr.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_intr.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_intr.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_master.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_options.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_slave.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_options.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_intr.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_options.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_exit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_open.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_sbrk.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/abort.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/bspconfig.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/changelog.txt create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/close.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/errno.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/fcntl.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/fstat.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/getpid.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/inbyte.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/isatty.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/kill.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/lseek.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/open.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/outbyte.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/print.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_clean.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_init.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_timer_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_timer_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/mblaze_nt_types.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_cg.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_config.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_hist.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/putnum.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/read.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sbrk.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sleep.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sleep.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/smc.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/unlink.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/usleep.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/vectors.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/vectors.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/write.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xbasic_types.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xdebug.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xenv.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xenv_standalone.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_assert.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_assert.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache_l.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache_vxworks.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_errata.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_exception.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_exception.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_hal.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_io.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_io.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_macroback.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mem.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mem.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_misc_psreset_api.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_misc_psreset_api.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mmu.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mmu.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_printf.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_printf.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleepcommon.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleeptimer.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleeptimer.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testcache.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testcache.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testio.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testio.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testmem.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testmem.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_types.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc_counter.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc_counter.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xparameters_ps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xplatform_info.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xplatform_info.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpm_counter.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpm_counter.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpseudo_asm.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpseudo_asm_gcc.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xreg_cortexa9.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xstatus.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xtime_l.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xtime_l.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_options.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_intr.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_options.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_endpoint.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_endpoint.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_hw.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_intr.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_g.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_hw.h create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_intr.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_selftest.c create mode 100644 LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_sinit.c create mode 100644 LED_Blink/LED_Blink.sdk/webtalk/sdk_webtalk.tcl create mode 100644 LED_Blink/LED_Blink.sdk/webtalk/usage_statistics_ext_sdk.xml create mode 100644 LED_Blink/LED_Blink.sdk/webtalk/webtalk.jou create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bd create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bxml create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1_ooc.xdc create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hw_handoff/design_1_bd.tcl create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.dcp create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xci create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xml create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_sim_netlist.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/sim/design_1_led_0_0.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/synth/design_1_led_0_0.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.dcp create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xci create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xdc create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xml create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_sim_netlist.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_stub.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/hdl/verilog/processing_system7_v5_5_processing_system7.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.c create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.h create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.tcl create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.c create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.h create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_parameters.xml create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/sim/design_1_processing_system7_0_0.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/synth/design_1_processing_system7_0_0.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_apis.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_acp.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_gp.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_hp.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_local_params.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_init.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_params.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_unused_ports.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_atc.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_aw_atc.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_b_atc.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_trace_buffer.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_w_atc.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/ec67/hdl/axi_infrastructure_v1_1_vl_rfs.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/sim/design_1.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/synth/design_1.v create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ui/bd_1f5defd0.ui create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/mref/led/component.xml create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/bd/mref/led/xgui/led_v1_0.tcl create mode 100644 LED_Blink/LED_Blink.srcs/sources_1/new/led.v create mode 100644 LED_Blink/LED_Blink.xpr create mode 100644 zynqberrydemo1/_readme.txt create mode 100644 zynqberrydemo1/block_design/zsys_bd.tcl create mode 100644 zynqberrydemo1/board_files/TE0726/1.0/board.xml create mode 100644 zynqberrydemo1/board_files/TE0726/1.0/part0_pins.xml create mode 100644 zynqberrydemo1/board_files/TE0726/1.0/preset.xml create mode 100644 zynqberrydemo1/board_files/TE0726/2.1/board.xml create mode 100644 zynqberrydemo1/board_files/TE0726/2.1/part0_pins.xml create mode 100644 zynqberrydemo1/board_files/TE0726/2.1/preset.xml create mode 100644 zynqberrydemo1/board_files/TE0726/3.1/board.xml create mode 100644 zynqberrydemo1/board_files/TE0726/3.1/part0_pins.xml create mode 100644 zynqberrydemo1/board_files/TE0726/3.1/preset.xml create mode 100644 zynqberrydemo1/board_files/TE0726_7S/3.1/board.xml create mode 100644 zynqberrydemo1/board_files/TE0726_7S/3.1/part0_pins.xml create mode 100644 zynqberrydemo1/board_files/TE0726_7S/3.1/preset.xml create mode 100644 zynqberrydemo1/console/readme.txt create mode 100644 zynqberrydemo1/constraints/_i_bitgen_common.xdc create mode 100644 zynqberrydemo1/constraints/_i_common.xdc create mode 100644 zynqberrydemo1/constraints/_i_csi.xdc create mode 100644 zynqberrydemo1/constraints/_i_hdmi.xdc create mode 100644 zynqberrydemo1/constraints/_i_te0726.xdc create mode 100644 zynqberrydemo1/constraints/_i_timing.xdc create mode 100644 zynqberrydemo1/constraints/vivado_target.xdc create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/clock_system.vhd create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/convert_30to15_fifo.vhd create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dvi_encoder.vhd create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes_ddr.vhd create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/tmds_encoder.vhd create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/src/serdes_ddr.vhd create mode 100644 zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/component.xml create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/design.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/design.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_ctrlif.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_rx_fifo.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_tx_fifo.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/dma_fifo.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/pl330_dma_fifo.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_controller.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/data/axi_reg32.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.c create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.h create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/bfm_design/axi_reg32_v1_0_tb.v create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/bfm_design/design.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/design.tcl create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0_S_AXI.vhd create mode 100644 zynqberrydemo1/ip_lib/axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/xgui/axis_audio_pwm_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_fb_conv_1.0/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_fb_conv_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/axis_fb_conv_1.0/src/axis_fb_conv_v1_0.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_fb_conv_1.0/xgui/axis_fb_conv_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/axis_raw_demosaic_v1_0.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/dualport_ram.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/gamma_rom.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/xgui/axis_raw_demosaic_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/hdl/axis_raw_unpack_v1_0.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/hdl/srl_fifo.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/src/srl_fifo.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/xgui/axis_raw_unpack_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_to_i2s_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/axis_to_i2s_1.0/hdl/axis_to_i2s.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/hdl/axis_video_dwidth_converter_v1_0.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/xgui/axis_video_dwidth_converter_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_video_resize_1.0/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/axis_video_resize_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/axis_video_resize_1.0/hdl/axis_video_resize_v1_0.vhd create mode 100644 zynqberrydemo1/ip_lib/axis_video_resize_1.0/xgui/axis_video_resize_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd create mode 100644 zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc create mode 100644 zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd create mode 100644 zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/phy_clock_system.vhd create mode 100644 zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/xgui/csi2_d_phy_rx_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/csi_to_axis_1.0/bd/bd.tcl create mode 100644 zynqberrydemo1/ip_lib/csi_to_axis_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi2_parser.vhd create mode 100644 zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis.xdc create mode 100644 zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd create mode 100644 zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd create mode 100644 zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd create mode 100644 zynqberrydemo1/ip_lib/csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl create mode 100644 zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/component.xml create mode 100644 zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd create mode 100644 zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl create mode 100644 zynqberrydemo1/os/petalinux/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h create mode 100644 zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/gpio-demo/files/gpio-demo.c create mode 100644 zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/peek.c create mode 100644 zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/poke.c create mode 100644 zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/rpicam.c create mode 100644 zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/sensor_config.h create mode 100644 zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/startup/files/startup.c create mode 100644 zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h create mode 100644 zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-modules/te-audio-codec/files/te-audio-codec.c create mode 100644 zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_io_report.txt create mode 100644 zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_io_report.xdc create mode 100644 zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_ip_status_report.txt create mode 100644 zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_io_report.txt create mode 100644 zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_io_report.xdc create mode 100644 zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_ip_status_report.txt create mode 100644 zynqberrydemo1/prebuilt/os/petalinux/default/u-boot.elf create mode 100644 zynqberrydemo1/prebuilt/software/te0726_7s/zynq_fsbl.elf create mode 100644 zynqberrydemo1/prebuilt/software/te0726_m/zynq_fsbl.elf create mode 100644 zynqberrydemo1/scripts/reinitialise_all.tcl create mode 100644 zynqberrydemo1/scripts/script_designs.tcl create mode 100644 zynqberrydemo1/scripts/script_environment.tcl create mode 100644 zynqberrydemo1/scripts/script_external.tcl create mode 100644 zynqberrydemo1/scripts/script_hsi.tcl create mode 100644 zynqberrydemo1/scripts/script_main.tcl create mode 100644 zynqberrydemo1/scripts/script_sdsoc.tcl create mode 100644 zynqberrydemo1/scripts/script_settings.tcl create mode 100644 zynqberrydemo1/scripts/script_te_utils.tcl create mode 100644 zynqberrydemo1/scripts/script_usrcommands.tcl create mode 100644 zynqberrydemo1/scripts/script_vivado.tcl create mode 100644 zynqberrydemo1/settings/project_settings.tcl create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/data/zynq_fsbl.tcl create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/image_mover.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/image_mover.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/main.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/md5.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/md5.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nand.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nand.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nor.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nor.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/pcap.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/pcap.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/qspi.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/qspi.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/rsa.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/rsa.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/sd.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/sd.h create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/vdma.c create mode 100644 zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/vdma.h create mode 100644 zynqberrydemo3/_readme.txt create mode 100644 zynqberrydemo3/block_design/zsys_bd.tcl create mode 100644 zynqberrydemo3/board_files/TE0726/1.0/board.xml create mode 100644 zynqberrydemo3/board_files/TE0726/1.0/part0_pins.xml create mode 100644 zynqberrydemo3/board_files/TE0726/1.0/preset.xml create mode 100644 zynqberrydemo3/board_files/TE0726/2.1/board.xml create mode 100644 zynqberrydemo3/board_files/TE0726/2.1/part0_pins.xml create mode 100644 zynqberrydemo3/board_files/TE0726/2.1/preset.xml create mode 100644 zynqberrydemo3/board_files/TE0726/3.1/board.xml create mode 100644 zynqberrydemo3/board_files/TE0726/3.1/part0_pins.xml create mode 100644 zynqberrydemo3/board_files/TE0726/3.1/preset.xml create mode 100644 zynqberrydemo3/board_files/TE0726_7S/3.1/board.xml create mode 100644 zynqberrydemo3/board_files/TE0726_7S/3.1/part0_pins.xml create mode 100644 zynqberrydemo3/board_files/TE0726_7S/3.1/preset.xml create mode 100644 zynqberrydemo3/console/readme.txt create mode 100644 zynqberrydemo3/constraints/_i_bitgen_common.xdc create mode 100644 zynqberrydemo3/constraints/_i_common.xdc create mode 100644 zynqberrydemo3/constraints/_i_csi.xdc create mode 100644 zynqberrydemo3/constraints/_i_hdmi.xdc create mode 100644 zynqberrydemo3/constraints/_i_te0726.xdc create mode 100644 zynqberrydemo3/constraints/_i_timing.xdc create mode 100644 zynqberrydemo3/constraints/vivado_target.xdc create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/clock_system.vhd create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/convert_30to15_fifo.vhd create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dvi_encoder.vhd create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes_ddr.vhd create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/tmds_encoder.vhd create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/src/serdes_ddr.vhd create mode 100644 zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/component.xml create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/design.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/design.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_ctrlif.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_rx_fifo.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_tx_fifo.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/dma_fifo.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/pl330_dma_fifo.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_controller.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/data/axi_reg32.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.c create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.h create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/bfm_design/axi_reg32_v1_0_tb.v create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/bfm_design/design.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/design.tcl create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0_S_AXI.vhd create mode 100644 zynqberrydemo3/ip_lib/axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/xgui/axis_audio_pwm_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_fb_conv_1.0/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_fb_conv_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/axis_fb_conv_1.0/src/axis_fb_conv_v1_0.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_fb_conv_1.0/xgui/axis_fb_conv_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/axis_raw_demosaic_v1_0.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/dualport_ram.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/gamma_rom.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/xgui/axis_raw_demosaic_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/hdl/axis_raw_unpack_v1_0.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/hdl/srl_fifo.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/src/srl_fifo.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/xgui/axis_raw_unpack_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_to_i2s_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/axis_to_i2s_1.0/hdl/axis_to_i2s.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/hdl/axis_video_dwidth_converter_v1_0.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/xgui/axis_video_dwidth_converter_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_video_resize_1.0/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/axis_video_resize_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/axis_video_resize_1.0/hdl/axis_video_resize_v1_0.vhd create mode 100644 zynqberrydemo3/ip_lib/axis_video_resize_1.0/xgui/axis_video_resize_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd create mode 100644 zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc create mode 100644 zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd create mode 100644 zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/phy_clock_system.vhd create mode 100644 zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/xgui/csi2_d_phy_rx_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/csi_to_axis_1.0/bd/bd.tcl create mode 100644 zynqberrydemo3/ip_lib/csi_to_axis_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi2_parser.vhd create mode 100644 zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis.xdc create mode 100644 zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd create mode 100644 zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd create mode 100644 zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd create mode 100644 zynqberrydemo3/ip_lib/csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl create mode 100644 zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/component.xml create mode 100644 zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd create mode 100644 zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/fbgrab/files/fbgrab.c create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/gpio-demo/files/gpio-demo.c create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/peek.c create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/poke.c create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/rpicam.c create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/sensor_config.h create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/startup/files/startup.c create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h create mode 100644 zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-modules/te-audio-codec/files/te-audio-codec.c create mode 100644 zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_io_report.txt create mode 100644 zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_io_report.xdc create mode 100644 zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_ip_status_report.txt create mode 100644 zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_io_report.txt create mode 100644 zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_io_report.xdc create mode 100644 zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_ip_status_report.txt create mode 100644 zynqberrydemo3/prebuilt/os/petalinux/default/u-boot.elf create mode 100644 zynqberrydemo3/prebuilt/software/te0726_7s/zynq_fsbl.elf create mode 100644 zynqberrydemo3/prebuilt/software/te0726_m/zynq_fsbl.elf create mode 100644 zynqberrydemo3/scripts/reinitialise_all.tcl create mode 100644 zynqberrydemo3/scripts/script_designs.tcl create mode 100644 zynqberrydemo3/scripts/script_environment.tcl create mode 100644 zynqberrydemo3/scripts/script_external.tcl create mode 100644 zynqberrydemo3/scripts/script_hsi.tcl create mode 100644 zynqberrydemo3/scripts/script_main.tcl create mode 100644 zynqberrydemo3/scripts/script_sdsoc.tcl create mode 100644 zynqberrydemo3/scripts/script_settings.tcl create mode 100644 zynqberrydemo3/scripts/script_te_utils.tcl create mode 100644 zynqberrydemo3/scripts/script_usrcommands.tcl create mode 100644 zynqberrydemo3/scripts/script_vivado.tcl create mode 100644 zynqberrydemo3/settings/project_settings.tcl create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/data/zynq_fsbl.tcl create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/image_mover.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/image_mover.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/main.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/md5.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/md5.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nand.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nand.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nor.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nor.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/pcap.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/pcap.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/qspi.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/qspi.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/rsa.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/rsa.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/sd.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/sd.h create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/vdma.c create mode 100644 zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/vdma.h diff --git a/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/50c2fa8fed532918.xci b/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/50c2fa8fed532918.xci new file mode 100644 index 0000000..6910d61 --- /dev/null +++ b/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/50c2fa8fed532918.xci @@ -0,0 +1,917 @@ + + + xilinx.com + ipcache + 50c2fa8fed532918 + 0 + + + design_1_processing_system7_0_0 + + + 50000000 + 100000000 + 50000000 + 50000000 + design_1_processing_system7_0_0 + 666.666687 + 23.8095 + 23.8095 + 10.000000 + 10.158730 + 125.000000 + 10.000000 + 50.000000 + 100.000000 + 10.000000 + 10.000000 + 50 + 200.000000 + 200.000000 + 100.000000 + 10.000000 + 166.666672 + 200.000000 + 111.111115 + 111.111115 + 111.111115 + 111.111115 + 111.111115 + 111.111115 + 50 + 100.000000 + 60 + 60 + 111.111115 + 0.251400462962963 + 666.666666 + 40 + 0xE0008000 + <Select> + 0 + <Select> + 0xE0008FFF + External + 0 + -1 + 0xE0009000 + <Select> + 0 + <Select> + 0xE0009FFF + External + 0 + -1 + IO PLL + 1 + 1 + 100 + 0 + 50000000 + 100000000 + 10000000 + 10000000 + 0 + 0 + 0 + 0 + 667 + 1333.333 + ARM PLL + 2 + 33.333333 + DDR PLL + 15 + 7 + 10.159 + 32 + 1066.667 + HPR(0)/LPR(32) + 15 + 2 + DDR PLL + 2 + 0 + 0 + 0 + 0 + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + 0x00100000 + 0x1FFFFFFF + 2 + 2 + 2 + 16 + <Select> + <Select> + 0xE000B000 + <Select> + 0 + <Select> + 0xE000BFFF + External + 1 + 1 + 0 + 1000 Mbps + 0 + <Select> + 0xE000C000 + <Select> + 0 + <Select> + 0xE000CFFF + IO PLL + 1 + 1 + 0 + 1000 Mbps + 0 + <Select> + 0 + Active Low + <Select> + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + IO PLL + 5 + 4 + IO PLL + 5 + 2 + IO PLL + 1 + 1 + IO PLL + 1 + 1 + TRUE + TRUE + FALSE + FALSE + 50 + 100 + 50 + 50 + 1 + 1 + 0 + 0 + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + 1 + 4 + 4 + 1 + 4 + 4 + 0xE000A000 + 1 + 64 + 64 + 0xE000AFFF + 1 + MIO + 0 + 0xE0004000 + 1 + EMIO + 0xE0004FFF + EMIO + 1 + 0 + <Select> + 0xE0005000 + 1 + EMIO + 0xE0005FFF + MIO 48 .. 49 + 1 + 0 + <Select> + 111.111115 + 1 + Active Low + Share reset pin + None + 0 + 0 + 30 + 1000.000 + 1 + DIRECT + in + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + out + LVCMOS 3.3V + enabled + slow + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + inout + LVCMOS 3.3V + enabled + slow + in + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + out + LVCMOS 3.3V + enabled + slow + in + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + in + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + out + LVCMOS 3.3V + disabled + slow + out + LVCMOS 3.3V + disabled + slow + out + LVCMOS 3.3V + disabled + slow + in + LVCMOS 3.3V + enabled + slow + 32 + SD 1#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#USB Reset#UART 1#UART 1#SD 1#SD 1#SD 1#SD 1#SD 1#SD 1#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#I2C 1#I2C 1#Unbonded#Unbonded#GPIO#GPIO + cd#qspi0_ss_b#qspi0_io[0]#qspi0_io[1]#qspi0_io[2]#qspi0_io[3]/HOLD_B#qspi0_sclk#reset#tx#rx#data[0]#cmd#clk#data[1]#data[2]#data[3]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#data[4]#dir#stp#nxt#data[0]#data[1]#data[2]#data[3]#clk#data[5]#data[6]#data[7]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#scl#sda#Unbonded#Unbonded#gpio[52]#gpio[53] + 0 + 50 + 12 + 0 + 12 + 0 + 10 + 12 + 0 + 12 + 1 + 1 + 11 + 1 + 1 + 11 + 1 + 0 + <Select> + <Select> + 0 + 1 + 1 + 11 + 1 + 11 + 1 + 0 + 1 + 1 + 11 + 1 + 11 + 1 + 0 + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + <Select> + 0 + 1 + 1 + 11 + 1 + 11 + 1 + 0 + 1 + 1 + 11 + 1 + 11 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0.082 + 0.070 + 0.318 + 0.433 + 0.005 + 0.029 + -0.434 + -0.614 + clg225 + IO PLL + 5 + 200 + None + 0 + <Select> + 0 + LVCMOS 3.3V + LVCMOS 3.3V + PRODUCTION + 0 + <Select> + 0 + <Select> + 1 + MIO 1 .. 6 + 0 + <Select> + 0xFCFFFFFF + IO PLL + 5 + 1 + 200 + MIO 1 .. 6 + 1 + EMIO + 0 + <Select> + 1 + EMIO + 1 + EMIO + 1 + MIO 0 + 0 + <Select> + 0 + <Select> + 1 + MIO 10 .. 15 + 0xE0100000 + 0xE0100FFF + 0xE0101000 + 0xE0101FFF + IO PLL + 10 + 100 + 1 + x4 + NA + NA + NA + NA + NA + NA + NA + IO PLL + 1 + 100 + 0 + 0xE0006000 + 1 + EMIO + 1 + EMIO + 1 + EMIO + 0xE0006FFF + 1 + EMIO + 0xE0007000 + 1 + EMIO + 1 + EMIO + 1 + EMIO + 0xE0007FFF + 1 + EMIO + IO PLL + 6 + 166.666666 + 1 + 31 + 31 + 10 + 3 + 10 + 6 + 10 + 6 + 64 + 10 + 6 + 64 + 10 + 6 + 64 + 10 + 6 + 64 + 10 + 6 + External + 1 + 200 + 12 + 128 + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + 2 + 0 + 8 + <Select> + 0xE0104000 + CPU_1X + 1 + 133.333333 + CPU_1X + 1 + 133.333333 + CPU_1X + 1 + 133.333333 + 0xE0104fff + 1 + EMIO + 0xE0105000 + CPU_1X + 1 + 133.333333 + CPU_1X + 1 + 133.333333 + CPU_1X + 1 + 133.333333 + 0xE0105fff + 1 + EMIO + 50 + 0xE0000000 + 115200 + 0 + <Select> + 0xE0000FFF + 1 + EMIO + 0xE0001000 + 115200 + 0 + <Select> + 0xE0001FFF + 1 + MIO 8 .. 9 + IO PLL + 10 + 100 + 1 + 533.333374 + 0 + 0 + 3 + 8 + 0.25 + 0.25 + 0.25 + 0.25 + 16 Bit + 7 + 0 + 86.1835 + 160 + 0 + 86.1835 + 160 + 0 + 86.1835 + 160 + 0 + 86.1835 + 160 + 0 + 10 + 6 + 4096 MBits + 0 + 81.244 + 160 + 0 + 57.044 + 160 + 0 + 520 + 160 + 0 + 700 + 160 + 0.0 + 0.0 + 0.0 + 0.0 + 0 + 77.166 + 160 + 0 + 53.995 + 160 + 0 + 550 + 160 + 0 + 780 + 160 + 16 Bits + Disabled + 1 + 533.333333 + Normal (0-85) + DDR 3 (Low Voltage) + MT41J256M16 RE-125 + 15 + DDR3_1066F + 1 + 1 + 1 + 40.0 + 35.0 + 48.91 + 7 + 7 + 0 + NONE + 0xE0102000 + 0xE0102fff + 1 + 60 + 1 + MIO 7 + MIO 28 .. 39 + 0xE0103000 + 0xE0103fff + 0 + 60 + 0 + <Select> + <Select> + 1 + Active Low + Share reset pin + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 3 + CPU_1X + 1 + 0 + 133.333333 + <Select> + None + zynq + + xc7z010 + clg225 + VERILOG + + MIXED + -1 + + TRUE + TRUE + 50c2fa8fed532918 + IP_Unknown + 6 + TRUE + . + + . + 2018.2 + GLOBAL + + + + diff --git a/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0.dcp b/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0.dcp new file mode 100644 index 0000000000000000000000000000000000000000..fa91667b27bf94762fcb169ff05da857b0484aa0 GIT binary patch literal 216957 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%0DE^%vvym1w3eowV|F2KB$kx8(r{ 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 literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0_sim_netlist.v b/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0_sim_netlist.v new file mode 100644 index 0000000..f18fb50 --- /dev/null +++ b/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0_sim_netlist.v @@ -0,0 +1,5171 @@ +// Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +// Date : Fri Aug 17 17:36:45 2018 +// Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +// Command : write_verilog -force -mode funcsim -rename_top decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix -prefix +// decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_ design_1_processing_system7_0_0_sim_netlist.v +// Design : design_1_processing_system7_0_0 +// Purpose : This verilog netlist is a functional simulation representation of the design and should not be modified +// or synthesized. This netlist cannot be used for SDF annotated simulation. +// Device : xc7z010clg225-1 +// -------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +(* CHECK_LICENSE_TYPE = "design_1_processing_system7_0_0,processing_system7_v5_5_processing_system7,{}" *) (* DowngradeIPIdentifiedWarnings = "yes" *) (* X_CORE_INFO = "processing_system7_v5_5_processing_system7,Vivado 2018.2" *) +(* NotValidForBitStream *) +module decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix + (GPIO_I, + GPIO_O, + GPIO_T, + I2C0_SDA_I, + I2C0_SDA_O, + I2C0_SDA_T, + I2C0_SCL_I, + I2C0_SCL_O, + I2C0_SCL_T, + SDIO0_CLK, + SDIO0_CLK_FB, + SDIO0_CMD_O, + SDIO0_CMD_I, + SDIO0_CMD_T, + SDIO0_DATA_I, + SDIO0_DATA_O, + SDIO0_DATA_T, + SDIO0_LED, + SDIO0_CDN, + SDIO0_WP, + SDIO0_BUSPOW, + SDIO0_BUSVOLT, + SPI0_SCLK_I, + SPI0_SCLK_O, + SPI0_SCLK_T, + SPI0_MOSI_I, + SPI0_MOSI_O, + SPI0_MOSI_T, + SPI0_MISO_I, + SPI0_MISO_O, + SPI0_MISO_T, + SPI0_SS_I, + SPI0_SS_O, + SPI0_SS1_O, + SPI0_SS2_O, + SPI0_SS_T, + SPI1_SCLK_I, + SPI1_SCLK_O, + SPI1_SCLK_T, + SPI1_MOSI_I, + SPI1_MOSI_O, + SPI1_MOSI_T, + SPI1_MISO_I, + SPI1_MISO_O, + SPI1_MISO_T, + SPI1_SS_I, + SPI1_SS_O, + SPI1_SS1_O, + SPI1_SS2_O, + SPI1_SS_T, + UART0_TX, + UART0_RX, + TTC0_WAVE0_OUT, + TTC0_WAVE1_OUT, + TTC0_WAVE2_OUT, + TTC1_WAVE0_OUT, + TTC1_WAVE1_OUT, + TTC1_WAVE2_OUT, + USB0_PORT_INDCTL, + USB0_VBUS_PWRSELECT, + USB0_VBUS_PWRFAULT, + M_AXI_GP0_ARVALID, + M_AXI_GP0_AWVALID, + M_AXI_GP0_BREADY, + M_AXI_GP0_RREADY, + M_AXI_GP0_WLAST, + M_AXI_GP0_WVALID, + M_AXI_GP0_ARID, + M_AXI_GP0_AWID, + M_AXI_GP0_WID, + M_AXI_GP0_ARBURST, + M_AXI_GP0_ARLOCK, + M_AXI_GP0_ARSIZE, + M_AXI_GP0_AWBURST, + M_AXI_GP0_AWLOCK, + M_AXI_GP0_AWSIZE, + M_AXI_GP0_ARPROT, + M_AXI_GP0_AWPROT, + M_AXI_GP0_ARADDR, + M_AXI_GP0_AWADDR, + M_AXI_GP0_WDATA, + M_AXI_GP0_ARCACHE, + M_AXI_GP0_ARLEN, + M_AXI_GP0_ARQOS, + M_AXI_GP0_AWCACHE, + M_AXI_GP0_AWLEN, + M_AXI_GP0_AWQOS, + M_AXI_GP0_WSTRB, + M_AXI_GP0_ACLK, + M_AXI_GP0_ARREADY, + M_AXI_GP0_AWREADY, + M_AXI_GP0_BVALID, + M_AXI_GP0_RLAST, + M_AXI_GP0_RVALID, + M_AXI_GP0_WREADY, + M_AXI_GP0_BID, + M_AXI_GP0_RID, + M_AXI_GP0_BRESP, + M_AXI_GP0_RRESP, + M_AXI_GP0_RDATA, + IRQ_F2P, + FCLK_CLK0, + FCLK_CLK1, + FCLK_RESET0_N, + MIO, + DDR_CAS_n, + DDR_CKE, + DDR_Clk_n, + DDR_Clk, + DDR_CS_n, + DDR_DRSTB, + DDR_ODT, + DDR_RAS_n, + DDR_WEB, + DDR_BankAddr, + DDR_Addr, + DDR_VRN, + DDR_VRP, + DDR_DM, + DDR_DQ, + DDR_DQS_n, + DDR_DQS, + PS_SRSTB, + PS_CLK, + PS_PORB); + (* X_INTERFACE_INFO = "xilinx.com:interface:gpio:1.0 GPIO_0 TRI_I" *) input [63:0]GPIO_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:gpio:1.0 GPIO_0 TRI_O" *) output [63:0]GPIO_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:gpio:1.0 GPIO_0 TRI_T" *) output [63:0]GPIO_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SDA_I" *) input I2C0_SDA_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SDA_O" *) output I2C0_SDA_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SDA_T" *) output I2C0_SDA_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SCL_I" *) input I2C0_SCL_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SCL_O" *) output I2C0_SCL_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SCL_T" *) output I2C0_SCL_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CLK" *) output SDIO0_CLK; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CLK_FB" *) input SDIO0_CLK_FB; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CMD_O" *) output SDIO0_CMD_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CMD_I" *) input SDIO0_CMD_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CMD_T" *) output SDIO0_CMD_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 DATA_I" *) input [3:0]SDIO0_DATA_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 DATA_O" *) output [3:0]SDIO0_DATA_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 DATA_T" *) output [3:0]SDIO0_DATA_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 LED" *) output SDIO0_LED; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CDN" *) input SDIO0_CDN; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 WP" *) input SDIO0_WP; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 BUSPOW" *) output SDIO0_BUSPOW; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 BUSVOLT" *) output [2:0]SDIO0_BUSVOLT; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SCK_I" *) input SPI0_SCLK_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SCK_O" *) output SPI0_SCLK_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SCK_T" *) output SPI0_SCLK_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO0_I" *) input SPI0_MOSI_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO0_O" *) output SPI0_MOSI_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO0_T" *) output SPI0_MOSI_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO1_I" *) input SPI0_MISO_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO1_O" *) output SPI0_MISO_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO1_T" *) output SPI0_MISO_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS_I" *) input SPI0_SS_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS_O" *) output SPI0_SS_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS1_O" *) output SPI0_SS1_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS2_O" *) output SPI0_SS2_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS_T" *) output SPI0_SS_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SCK_I" *) input SPI1_SCLK_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SCK_O" *) output SPI1_SCLK_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SCK_T" *) output SPI1_SCLK_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO0_I" *) input SPI1_MOSI_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO0_O" *) output SPI1_MOSI_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO0_T" *) output SPI1_MOSI_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO1_I" *) input SPI1_MISO_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO1_O" *) output SPI1_MISO_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO1_T" *) output SPI1_MISO_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS_I" *) input SPI1_SS_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS_O" *) output SPI1_SS_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS1_O" *) output SPI1_SS1_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS2_O" *) output SPI1_SS2_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS_T" *) output SPI1_SS_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:uart:1.0 UART_0 TxD" *) output UART0_TX; + (* X_INTERFACE_INFO = "xilinx.com:interface:uart:1.0 UART_0 RxD" *) input UART0_RX; + output TTC0_WAVE0_OUT; + output TTC0_WAVE1_OUT; + output TTC0_WAVE2_OUT; + output TTC1_WAVE0_OUT; + output TTC1_WAVE1_OUT; + output TTC1_WAVE2_OUT; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:usbctrl:1.0 USBIND_0 PORT_INDCTL" *) output [1:0]USB0_PORT_INDCTL; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:usbctrl:1.0 USBIND_0 VBUS_PWRSELECT" *) output USB0_VBUS_PWRSELECT; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:usbctrl:1.0 USBIND_0 VBUS_PWRFAULT" *) input USB0_VBUS_PWRFAULT; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARVALID" *) output M_AXI_GP0_ARVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWVALID" *) output M_AXI_GP0_AWVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BREADY" *) output M_AXI_GP0_BREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RREADY" *) output M_AXI_GP0_RREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WLAST" *) output M_AXI_GP0_WLAST; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WVALID" *) output M_AXI_GP0_WVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARID" *) output [11:0]M_AXI_GP0_ARID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWID" *) output [11:0]M_AXI_GP0_AWID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WID" *) output [11:0]M_AXI_GP0_WID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARBURST" *) output [1:0]M_AXI_GP0_ARBURST; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARLOCK" *) output [1:0]M_AXI_GP0_ARLOCK; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARSIZE" *) output [2:0]M_AXI_GP0_ARSIZE; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWBURST" *) output [1:0]M_AXI_GP0_AWBURST; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWLOCK" *) output [1:0]M_AXI_GP0_AWLOCK; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWSIZE" *) output [2:0]M_AXI_GP0_AWSIZE; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARPROT" *) output [2:0]M_AXI_GP0_ARPROT; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWPROT" *) output [2:0]M_AXI_GP0_AWPROT; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARADDR" *) output [31:0]M_AXI_GP0_ARADDR; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWADDR" *) output [31:0]M_AXI_GP0_AWADDR; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WDATA" *) output [31:0]M_AXI_GP0_WDATA; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARCACHE" *) output [3:0]M_AXI_GP0_ARCACHE; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARLEN" *) output [3:0]M_AXI_GP0_ARLEN; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARQOS" *) output [3:0]M_AXI_GP0_ARQOS; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWCACHE" *) output [3:0]M_AXI_GP0_AWCACHE; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWLEN" *) output [3:0]M_AXI_GP0_AWLEN; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWQOS" *) output [3:0]M_AXI_GP0_AWQOS; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WSTRB" *) output [3:0]M_AXI_GP0_WSTRB; + (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 M_AXI_GP0_ACLK CLK" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME M_AXI_GP0_ACLK, ASSOCIATED_BUSIF M_AXI_GP0, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) input M_AXI_GP0_ACLK; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARREADY" *) input M_AXI_GP0_ARREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWREADY" *) input M_AXI_GP0_AWREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BVALID" *) input M_AXI_GP0_BVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RLAST" *) input M_AXI_GP0_RLAST; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RVALID" *) input M_AXI_GP0_RVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WREADY" *) input M_AXI_GP0_WREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BID" *) input [11:0]M_AXI_GP0_BID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RID" *) input [11:0]M_AXI_GP0_RID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BRESP" *) input [1:0]M_AXI_GP0_BRESP; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RRESP" *) input [1:0]M_AXI_GP0_RRESP; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RDATA" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME M_AXI_GP0, SUPPORTS_NARROW_BURST 0, NUM_WRITE_OUTSTANDING 8, NUM_READ_OUTSTANDING 8, DATA_WIDTH 32, PROTOCOL AXI3, FREQ_HZ 50000000, ID_WIDTH 12, ADDR_WIDTH 32, AWUSER_WIDTH 0, ARUSER_WIDTH 0, WUSER_WIDTH 0, RUSER_WIDTH 0, BUSER_WIDTH 0, READ_WRITE_MODE READ_WRITE, HAS_BURST 1, HAS_LOCK 1, HAS_PROT 1, HAS_CACHE 1, HAS_QOS 1, HAS_REGION 0, HAS_WSTRB 1, HAS_BRESP 1, HAS_RRESP 1, MAX_BURST_LENGTH 16, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0, NUM_READ_THREADS 4, NUM_WRITE_THREADS 4, RUSER_BITS_PER_BYTE 0, WUSER_BITS_PER_BYTE 0" *) input [31:0]M_AXI_GP0_RDATA; + (* X_INTERFACE_INFO = "xilinx.com:signal:interrupt:1.0 IRQ_F2P INTERRUPT" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME IRQ_F2P, SENSITIVITY LEVEL_HIGH, PortWidth 1" *) input [0:0]IRQ_F2P; + (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 FCLK_CLK0 CLK" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FCLK_CLK0, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) output FCLK_CLK0; + (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 FCLK_CLK1 CLK" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FCLK_CLK1, FREQ_HZ 100000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK1" *) output FCLK_CLK1; + (* X_INTERFACE_INFO = "xilinx.com:signal:reset:1.0 FCLK_RESET0_N RST" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FCLK_RESET0_N, POLARITY ACTIVE_LOW" *) output FCLK_RESET0_N; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO MIO" *) inout [31:0]MIO; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CAS_N" *) inout DDR_CAS_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CKE" *) inout DDR_CKE; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_N" *) inout DDR_Clk_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_P" *) inout DDR_Clk; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CS_N" *) inout DDR_CS_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RESET_N" *) inout DDR_DRSTB; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ODT" *) inout DDR_ODT; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RAS_N" *) inout DDR_RAS_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR WE_N" *) inout DDR_WEB; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR BA" *) inout [2:0]DDR_BankAddr; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ADDR" *) inout [14:0]DDR_Addr; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRN" *) inout DDR_VRN; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRP" *) inout DDR_VRP; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DM" *) inout [1:0]DDR_DM; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQ" *) inout [15:0]DDR_DQ; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_N" *) inout [1:0]DDR_DQS_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_P" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME DDR, CAN_DEBUG false, TIMEPERIOD_PS 1250, MEMORY_TYPE COMPONENTS, DATA_WIDTH 8, CS_ENABLED true, DATA_MASK_ENABLED true, SLOT Single, MEM_ADDR_MAP ROW_COLUMN_BANK, BURST_LENGTH 8, AXI_ARBITRATION_SCHEME TDM, CAS_LATENCY 11, CAS_WRITE_LATENCY 11" *) inout [1:0]DDR_DQS; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_SRSTB" *) inout PS_SRSTB; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_CLK" *) inout PS_CLK; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_PORB" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FIXED_IO, CAN_DEBUG false" *) inout PS_PORB; + + wire [14:0]DDR_Addr; + wire [2:0]DDR_BankAddr; + wire DDR_CAS_n; + wire DDR_CKE; + wire DDR_CS_n; + wire DDR_Clk; + wire DDR_Clk_n; + wire [1:0]DDR_DM; + wire [15:0]DDR_DQ; + wire [1:0]DDR_DQS; + wire [1:0]DDR_DQS_n; + wire DDR_DRSTB; + wire DDR_ODT; + wire DDR_RAS_n; + wire DDR_VRN; + wire DDR_VRP; + wire DDR_WEB; + wire FCLK_CLK0; + wire FCLK_CLK1; + wire FCLK_RESET0_N; + wire [63:0]GPIO_I; + wire [63:0]GPIO_O; + wire [63:0]GPIO_T; + wire I2C0_SCL_I; + wire I2C0_SCL_O; + wire I2C0_SCL_T; + wire I2C0_SDA_I; + wire I2C0_SDA_O; + wire I2C0_SDA_T; + wire [0:0]IRQ_F2P; + wire [31:0]MIO; + wire M_AXI_GP0_ACLK; + wire [31:0]M_AXI_GP0_ARADDR; + wire [1:0]M_AXI_GP0_ARBURST; + wire [3:0]M_AXI_GP0_ARCACHE; + wire [11:0]M_AXI_GP0_ARID; + wire [3:0]M_AXI_GP0_ARLEN; + wire [1:0]M_AXI_GP0_ARLOCK; + wire [2:0]M_AXI_GP0_ARPROT; + wire [3:0]M_AXI_GP0_ARQOS; + wire M_AXI_GP0_ARREADY; + wire [2:0]M_AXI_GP0_ARSIZE; + wire M_AXI_GP0_ARVALID; + wire [31:0]M_AXI_GP0_AWADDR; + wire [1:0]M_AXI_GP0_AWBURST; + wire [3:0]M_AXI_GP0_AWCACHE; + wire [11:0]M_AXI_GP0_AWID; + wire [3:0]M_AXI_GP0_AWLEN; + wire [1:0]M_AXI_GP0_AWLOCK; + wire [2:0]M_AXI_GP0_AWPROT; + wire [3:0]M_AXI_GP0_AWQOS; + wire M_AXI_GP0_AWREADY; + wire [2:0]M_AXI_GP0_AWSIZE; + wire M_AXI_GP0_AWVALID; + wire [11:0]M_AXI_GP0_BID; + wire M_AXI_GP0_BREADY; + wire [1:0]M_AXI_GP0_BRESP; + wire M_AXI_GP0_BVALID; + wire [31:0]M_AXI_GP0_RDATA; + wire [11:0]M_AXI_GP0_RID; + wire M_AXI_GP0_RLAST; + wire M_AXI_GP0_RREADY; + wire [1:0]M_AXI_GP0_RRESP; + wire M_AXI_GP0_RVALID; + wire [31:0]M_AXI_GP0_WDATA; + wire [11:0]M_AXI_GP0_WID; + wire M_AXI_GP0_WLAST; + wire M_AXI_GP0_WREADY; + wire [3:0]M_AXI_GP0_WSTRB; + wire M_AXI_GP0_WVALID; + wire PS_CLK; + wire PS_PORB; + wire PS_SRSTB; + wire SDIO0_BUSPOW; + wire [2:0]SDIO0_BUSVOLT; + wire SDIO0_CDN; + wire SDIO0_CLK; + wire SDIO0_CLK_FB; + wire SDIO0_CMD_I; + wire SDIO0_CMD_O; + wire SDIO0_CMD_T; + wire [3:0]SDIO0_DATA_I; + wire [3:0]SDIO0_DATA_O; + wire [3:0]SDIO0_DATA_T; + wire SDIO0_LED; + wire SDIO0_WP; + wire SPI0_MISO_I; + wire SPI0_MISO_O; + wire SPI0_MISO_T; + wire SPI0_MOSI_I; + wire SPI0_MOSI_O; + wire SPI0_MOSI_T; + wire SPI0_SCLK_I; + wire SPI0_SCLK_O; + wire SPI0_SCLK_T; + wire SPI0_SS1_O; + wire SPI0_SS2_O; + wire SPI0_SS_I; + wire SPI0_SS_O; + wire SPI0_SS_T; + wire SPI1_MISO_I; + wire SPI1_MISO_O; + wire SPI1_MISO_T; + wire SPI1_MOSI_I; + wire SPI1_MOSI_O; + wire SPI1_MOSI_T; + wire SPI1_SCLK_I; + wire SPI1_SCLK_O; + wire SPI1_SCLK_T; + wire SPI1_SS1_O; + wire SPI1_SS2_O; + wire SPI1_SS_I; + wire SPI1_SS_O; + wire SPI1_SS_T; + wire TTC0_WAVE0_OUT; + wire TTC0_WAVE1_OUT; + wire TTC0_WAVE2_OUT; + wire TTC1_WAVE0_OUT; + wire TTC1_WAVE1_OUT; + wire TTC1_WAVE2_OUT; + wire UART0_RX; + wire UART0_TX; + wire [1:0]USB0_PORT_INDCTL; + wire USB0_VBUS_PWRFAULT; + wire USB0_VBUS_PWRSELECT; + wire NLW_inst_CAN0_PHY_TX_UNCONNECTED; + wire NLW_inst_CAN1_PHY_TX_UNCONNECTED; + wire NLW_inst_DMA0_DAVALID_UNCONNECTED; + wire NLW_inst_DMA0_DRREADY_UNCONNECTED; + wire NLW_inst_DMA0_RSTN_UNCONNECTED; + wire NLW_inst_DMA1_DAVALID_UNCONNECTED; + wire NLW_inst_DMA1_DRREADY_UNCONNECTED; + wire NLW_inst_DMA1_RSTN_UNCONNECTED; + wire NLW_inst_DMA2_DAVALID_UNCONNECTED; + wire NLW_inst_DMA2_DRREADY_UNCONNECTED; + wire NLW_inst_DMA2_RSTN_UNCONNECTED; + wire NLW_inst_DMA3_DAVALID_UNCONNECTED; + wire NLW_inst_DMA3_DRREADY_UNCONNECTED; + wire NLW_inst_DMA3_RSTN_UNCONNECTED; + wire NLW_inst_ENET0_GMII_TX_EN_UNCONNECTED; + wire NLW_inst_ENET0_GMII_TX_ER_UNCONNECTED; + wire NLW_inst_ENET0_MDIO_MDC_UNCONNECTED; + wire NLW_inst_ENET0_MDIO_O_UNCONNECTED; + wire NLW_inst_ENET0_MDIO_T_UNCONNECTED; + wire NLW_inst_ENET0_PTP_DELAY_REQ_RX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_DELAY_REQ_TX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_PDELAY_REQ_RX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_PDELAY_REQ_TX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_PDELAY_RESP_RX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_PDELAY_RESP_TX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_SYNC_FRAME_RX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_SYNC_FRAME_TX_UNCONNECTED; + wire NLW_inst_ENET0_SOF_RX_UNCONNECTED; + wire NLW_inst_ENET0_SOF_TX_UNCONNECTED; + wire NLW_inst_ENET1_GMII_TX_EN_UNCONNECTED; + wire NLW_inst_ENET1_GMII_TX_ER_UNCONNECTED; + wire NLW_inst_ENET1_MDIO_MDC_UNCONNECTED; + wire NLW_inst_ENET1_MDIO_O_UNCONNECTED; + wire NLW_inst_ENET1_MDIO_T_UNCONNECTED; + wire NLW_inst_ENET1_PTP_DELAY_REQ_RX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_DELAY_REQ_TX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_PDELAY_REQ_RX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_PDELAY_REQ_TX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_PDELAY_RESP_RX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_PDELAY_RESP_TX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_SYNC_FRAME_RX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_SYNC_FRAME_TX_UNCONNECTED; + wire NLW_inst_ENET1_SOF_RX_UNCONNECTED; + wire NLW_inst_ENET1_SOF_TX_UNCONNECTED; + wire NLW_inst_EVENT_EVENTO_UNCONNECTED; + wire NLW_inst_FCLK_CLK2_UNCONNECTED; + wire NLW_inst_FCLK_CLK3_UNCONNECTED; + wire NLW_inst_FCLK_RESET1_N_UNCONNECTED; + wire NLW_inst_FCLK_RESET2_N_UNCONNECTED; + wire NLW_inst_FCLK_RESET3_N_UNCONNECTED; + wire NLW_inst_FTMT_F2P_TRIGACK_0_UNCONNECTED; + wire NLW_inst_FTMT_F2P_TRIGACK_1_UNCONNECTED; + wire NLW_inst_FTMT_F2P_TRIGACK_2_UNCONNECTED; + wire NLW_inst_FTMT_F2P_TRIGACK_3_UNCONNECTED; + wire NLW_inst_FTMT_P2F_TRIG_0_UNCONNECTED; + wire NLW_inst_FTMT_P2F_TRIG_1_UNCONNECTED; + wire NLW_inst_FTMT_P2F_TRIG_2_UNCONNECTED; + wire NLW_inst_FTMT_P2F_TRIG_3_UNCONNECTED; + wire NLW_inst_I2C1_SCL_O_UNCONNECTED; + wire NLW_inst_I2C1_SCL_T_UNCONNECTED; + wire NLW_inst_I2C1_SDA_O_UNCONNECTED; + wire NLW_inst_I2C1_SDA_T_UNCONNECTED; + wire NLW_inst_IRQ_P2F_CAN0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_CAN1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_CTI_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC2_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC3_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC4_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC5_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC6_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC7_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC_ABORT_UNCONNECTED; + wire NLW_inst_IRQ_P2F_ENET0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_ENET1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_ENET_WAKE0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_ENET_WAKE1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_GPIO_UNCONNECTED; + wire NLW_inst_IRQ_P2F_I2C0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_I2C1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_QSPI_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SDIO0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SDIO1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SMC_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SPI0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SPI1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_UART0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_UART1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_USB0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_USB1_UNCONNECTED; + wire NLW_inst_M_AXI_GP0_ARESETN_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_ARESETN_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_ARVALID_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_AWVALID_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_BREADY_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_RREADY_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_WLAST_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_WVALID_UNCONNECTED; + wire NLW_inst_PJTAG_TDO_UNCONNECTED; + wire NLW_inst_SDIO1_BUSPOW_UNCONNECTED; + wire NLW_inst_SDIO1_CLK_UNCONNECTED; + wire NLW_inst_SDIO1_CMD_O_UNCONNECTED; + wire NLW_inst_SDIO1_CMD_T_UNCONNECTED; + wire NLW_inst_SDIO1_LED_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_WREADY_UNCONNECTED; + wire NLW_inst_TRACE_CLK_OUT_UNCONNECTED; + wire NLW_inst_TRACE_CTL_UNCONNECTED; + wire NLW_inst_UART0_DTRN_UNCONNECTED; + wire NLW_inst_UART0_RTSN_UNCONNECTED; + wire NLW_inst_UART1_DTRN_UNCONNECTED; + wire NLW_inst_UART1_RTSN_UNCONNECTED; + wire NLW_inst_UART1_TX_UNCONNECTED; + wire NLW_inst_USB1_VBUS_PWRSELECT_UNCONNECTED; + wire NLW_inst_WDT_RST_OUT_UNCONNECTED; + wire [1:0]NLW_inst_DMA0_DATYPE_UNCONNECTED; + wire [1:0]NLW_inst_DMA1_DATYPE_UNCONNECTED; + wire [1:0]NLW_inst_DMA2_DATYPE_UNCONNECTED; + wire [1:0]NLW_inst_DMA3_DATYPE_UNCONNECTED; + wire [7:0]NLW_inst_ENET0_GMII_TXD_UNCONNECTED; + wire [7:0]NLW_inst_ENET1_GMII_TXD_UNCONNECTED; + wire [1:0]NLW_inst_EVENT_STANDBYWFE_UNCONNECTED; + wire [1:0]NLW_inst_EVENT_STANDBYWFI_UNCONNECTED; + wire [31:0]NLW_inst_FTMT_P2F_DEBUG_UNCONNECTED; + wire [31:0]NLW_inst_M_AXI_GP1_ARADDR_UNCONNECTED; + wire [1:0]NLW_inst_M_AXI_GP1_ARBURST_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_ARCACHE_UNCONNECTED; + wire [11:0]NLW_inst_M_AXI_GP1_ARID_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_ARLEN_UNCONNECTED; + wire [1:0]NLW_inst_M_AXI_GP1_ARLOCK_UNCONNECTED; + wire [2:0]NLW_inst_M_AXI_GP1_ARPROT_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_ARQOS_UNCONNECTED; + wire [2:0]NLW_inst_M_AXI_GP1_ARSIZE_UNCONNECTED; + wire [31:0]NLW_inst_M_AXI_GP1_AWADDR_UNCONNECTED; + wire [1:0]NLW_inst_M_AXI_GP1_AWBURST_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_AWCACHE_UNCONNECTED; + wire [11:0]NLW_inst_M_AXI_GP1_AWID_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_AWLEN_UNCONNECTED; + wire [1:0]NLW_inst_M_AXI_GP1_AWLOCK_UNCONNECTED; + wire [2:0]NLW_inst_M_AXI_GP1_AWPROT_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_AWQOS_UNCONNECTED; + wire [2:0]NLW_inst_M_AXI_GP1_AWSIZE_UNCONNECTED; + wire [31:0]NLW_inst_M_AXI_GP1_WDATA_UNCONNECTED; + wire [11:0]NLW_inst_M_AXI_GP1_WID_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_WSTRB_UNCONNECTED; + wire [2:0]NLW_inst_SDIO1_BUSVOLT_UNCONNECTED; + wire [3:0]NLW_inst_SDIO1_DATA_O_UNCONNECTED; + wire [3:0]NLW_inst_SDIO1_DATA_T_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_ACP_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_ACP_BRESP_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_ACP_RDATA_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_ACP_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_ACP_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_GP0_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_GP0_BRESP_UNCONNECTED; + wire [31:0]NLW_inst_S_AXI_GP0_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_GP0_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_GP0_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_GP1_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_GP1_BRESP_UNCONNECTED; + wire [31:0]NLW_inst_S_AXI_GP1_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_GP1_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_GP1_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP0_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP0_BRESP_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_HP0_RACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP0_RCOUNT_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_HP0_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP0_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP0_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP0_WACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP0_WCOUNT_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP1_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP1_BRESP_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_HP1_RACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP1_RCOUNT_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_HP1_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP1_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP1_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP1_WACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP1_WCOUNT_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP2_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP2_BRESP_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_HP2_RACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP2_RCOUNT_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_HP2_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP2_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP2_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP2_WACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP2_WCOUNT_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP3_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP3_BRESP_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_HP3_RACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP3_RCOUNT_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_HP3_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP3_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP3_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP3_WACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP3_WCOUNT_UNCONNECTED; + wire [1:0]NLW_inst_TRACE_DATA_UNCONNECTED; + wire [1:0]NLW_inst_USB1_PORT_INDCTL_UNCONNECTED; + + (* C_DM_WIDTH = "2" *) + (* C_DQS_WIDTH = "2" *) + (* C_DQ_WIDTH = "16" *) + (* C_EMIO_GPIO_WIDTH = "64" *) + (* C_EN_EMIO_ENET0 = "0" *) + (* C_EN_EMIO_ENET1 = "0" *) + (* C_EN_EMIO_PJTAG = "0" *) + (* C_EN_EMIO_TRACE = "0" *) + (* C_FCLK_CLK0_BUF = "TRUE" *) + (* C_FCLK_CLK1_BUF = "TRUE" *) + (* C_FCLK_CLK2_BUF = "FALSE" *) + (* C_FCLK_CLK3_BUF = "FALSE" *) + (* C_GP0_EN_MODIFIABLE_TXN = "1" *) + (* C_GP1_EN_MODIFIABLE_TXN = "1" *) + (* C_INCLUDE_ACP_TRANS_CHECK = "0" *) + (* C_INCLUDE_TRACE_BUFFER = "0" *) + (* C_IRQ_F2P_MODE = "DIRECT" *) + (* C_MIO_PRIMITIVE = "32" *) + (* C_M_AXI_GP0_ENABLE_STATIC_REMAP = "0" *) + (* C_M_AXI_GP0_ID_WIDTH = "12" *) + (* C_M_AXI_GP0_THREAD_ID_WIDTH = "12" *) + (* C_M_AXI_GP1_ENABLE_STATIC_REMAP = "0" *) + (* C_M_AXI_GP1_ID_WIDTH = "12" *) + (* C_M_AXI_GP1_THREAD_ID_WIDTH = "12" *) + (* C_NUM_F2P_INTR_INPUTS = "1" *) + (* C_PACKAGE_NAME = "clg225" *) + (* C_PS7_SI_REV = "PRODUCTION" *) + (* C_S_AXI_ACP_ARUSER_VAL = "31" *) + (* C_S_AXI_ACP_AWUSER_VAL = "31" *) + (* C_S_AXI_ACP_ID_WIDTH = "3" *) + (* C_S_AXI_GP0_ID_WIDTH = "6" *) + (* C_S_AXI_GP1_ID_WIDTH = "6" *) + (* C_S_AXI_HP0_DATA_WIDTH = "64" *) + (* C_S_AXI_HP0_ID_WIDTH = "6" *) + (* C_S_AXI_HP1_DATA_WIDTH = "64" *) + (* C_S_AXI_HP1_ID_WIDTH = "6" *) + (* C_S_AXI_HP2_DATA_WIDTH = "64" *) + (* C_S_AXI_HP2_ID_WIDTH = "6" *) + (* C_S_AXI_HP3_DATA_WIDTH = "64" *) + (* C_S_AXI_HP3_ID_WIDTH = "6" *) + (* C_TRACE_BUFFER_CLOCK_DELAY = "12" *) + (* C_TRACE_BUFFER_FIFO_SIZE = "128" *) + (* C_TRACE_INTERNAL_WIDTH = "2" *) + (* C_TRACE_PIPELINE_WIDTH = "8" *) + (* C_USE_AXI_NONSECURE = "0" *) + (* C_USE_DEFAULT_ACP_USER_VAL = "0" *) + (* C_USE_M_AXI_GP0 = "1" *) + (* C_USE_M_AXI_GP1 = "0" *) + (* C_USE_S_AXI_ACP = "0" *) + (* C_USE_S_AXI_GP0 = "0" *) + (* C_USE_S_AXI_GP1 = "0" *) + (* C_USE_S_AXI_HP0 = "0" *) + (* C_USE_S_AXI_HP1 = "0" *) + (* C_USE_S_AXI_HP2 = "0" *) + (* C_USE_S_AXI_HP3 = "0" *) + (* HW_HANDOFF = "design_1_processing_system7_0_0.hwdef" *) + (* POWER = "/>" *) + (* USE_TRACE_DATA_EDGE_DETECTOR = "0" *) + decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_processing_system7_v5_5_processing_system7 inst + (.CAN0_PHY_RX(1'b0), + .CAN0_PHY_TX(NLW_inst_CAN0_PHY_TX_UNCONNECTED), + .CAN1_PHY_RX(1'b0), + .CAN1_PHY_TX(NLW_inst_CAN1_PHY_TX_UNCONNECTED), + .Core0_nFIQ(1'b0), + .Core0_nIRQ(1'b0), + .Core1_nFIQ(1'b0), + .Core1_nIRQ(1'b0), + .DDR_ARB({1'b0,1'b0,1'b0,1'b0}), + .DDR_Addr(DDR_Addr), + .DDR_BankAddr(DDR_BankAddr), + .DDR_CAS_n(DDR_CAS_n), + .DDR_CKE(DDR_CKE), + .DDR_CS_n(DDR_CS_n), + .DDR_Clk(DDR_Clk), + .DDR_Clk_n(DDR_Clk_n), + .DDR_DM(DDR_DM), + .DDR_DQ(DDR_DQ), + .DDR_DQS(DDR_DQS), + .DDR_DQS_n(DDR_DQS_n), + .DDR_DRSTB(DDR_DRSTB), + .DDR_ODT(DDR_ODT), + .DDR_RAS_n(DDR_RAS_n), + .DDR_VRN(DDR_VRN), + .DDR_VRP(DDR_VRP), + .DDR_WEB(DDR_WEB), + .DMA0_ACLK(1'b0), + .DMA0_DAREADY(1'b0), + .DMA0_DATYPE(NLW_inst_DMA0_DATYPE_UNCONNECTED[1:0]), + .DMA0_DAVALID(NLW_inst_DMA0_DAVALID_UNCONNECTED), + .DMA0_DRLAST(1'b0), + .DMA0_DRREADY(NLW_inst_DMA0_DRREADY_UNCONNECTED), + .DMA0_DRTYPE({1'b0,1'b0}), + .DMA0_DRVALID(1'b0), + .DMA0_RSTN(NLW_inst_DMA0_RSTN_UNCONNECTED), + .DMA1_ACLK(1'b0), + .DMA1_DAREADY(1'b0), + .DMA1_DATYPE(NLW_inst_DMA1_DATYPE_UNCONNECTED[1:0]), + .DMA1_DAVALID(NLW_inst_DMA1_DAVALID_UNCONNECTED), + .DMA1_DRLAST(1'b0), + .DMA1_DRREADY(NLW_inst_DMA1_DRREADY_UNCONNECTED), + .DMA1_DRTYPE({1'b0,1'b0}), + .DMA1_DRVALID(1'b0), + .DMA1_RSTN(NLW_inst_DMA1_RSTN_UNCONNECTED), + .DMA2_ACLK(1'b0), + .DMA2_DAREADY(1'b0), + .DMA2_DATYPE(NLW_inst_DMA2_DATYPE_UNCONNECTED[1:0]), + .DMA2_DAVALID(NLW_inst_DMA2_DAVALID_UNCONNECTED), + .DMA2_DRLAST(1'b0), + .DMA2_DRREADY(NLW_inst_DMA2_DRREADY_UNCONNECTED), + .DMA2_DRTYPE({1'b0,1'b0}), + .DMA2_DRVALID(1'b0), + .DMA2_RSTN(NLW_inst_DMA2_RSTN_UNCONNECTED), + .DMA3_ACLK(1'b0), + .DMA3_DAREADY(1'b0), + .DMA3_DATYPE(NLW_inst_DMA3_DATYPE_UNCONNECTED[1:0]), + .DMA3_DAVALID(NLW_inst_DMA3_DAVALID_UNCONNECTED), + .DMA3_DRLAST(1'b0), + .DMA3_DRREADY(NLW_inst_DMA3_DRREADY_UNCONNECTED), + .DMA3_DRTYPE({1'b0,1'b0}), + .DMA3_DRVALID(1'b0), + .DMA3_RSTN(NLW_inst_DMA3_RSTN_UNCONNECTED), + .ENET0_EXT_INTIN(1'b0), + .ENET0_GMII_COL(1'b0), + .ENET0_GMII_CRS(1'b0), + .ENET0_GMII_RXD({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .ENET0_GMII_RX_CLK(1'b0), + .ENET0_GMII_RX_DV(1'b0), + .ENET0_GMII_RX_ER(1'b0), + .ENET0_GMII_TXD(NLW_inst_ENET0_GMII_TXD_UNCONNECTED[7:0]), + .ENET0_GMII_TX_CLK(1'b0), + .ENET0_GMII_TX_EN(NLW_inst_ENET0_GMII_TX_EN_UNCONNECTED), + .ENET0_GMII_TX_ER(NLW_inst_ENET0_GMII_TX_ER_UNCONNECTED), + .ENET0_MDIO_I(1'b0), + .ENET0_MDIO_MDC(NLW_inst_ENET0_MDIO_MDC_UNCONNECTED), + .ENET0_MDIO_O(NLW_inst_ENET0_MDIO_O_UNCONNECTED), + .ENET0_MDIO_T(NLW_inst_ENET0_MDIO_T_UNCONNECTED), + .ENET0_PTP_DELAY_REQ_RX(NLW_inst_ENET0_PTP_DELAY_REQ_RX_UNCONNECTED), + .ENET0_PTP_DELAY_REQ_TX(NLW_inst_ENET0_PTP_DELAY_REQ_TX_UNCONNECTED), + .ENET0_PTP_PDELAY_REQ_RX(NLW_inst_ENET0_PTP_PDELAY_REQ_RX_UNCONNECTED), + .ENET0_PTP_PDELAY_REQ_TX(NLW_inst_ENET0_PTP_PDELAY_REQ_TX_UNCONNECTED), + .ENET0_PTP_PDELAY_RESP_RX(NLW_inst_ENET0_PTP_PDELAY_RESP_RX_UNCONNECTED), + .ENET0_PTP_PDELAY_RESP_TX(NLW_inst_ENET0_PTP_PDELAY_RESP_TX_UNCONNECTED), + .ENET0_PTP_SYNC_FRAME_RX(NLW_inst_ENET0_PTP_SYNC_FRAME_RX_UNCONNECTED), + .ENET0_PTP_SYNC_FRAME_TX(NLW_inst_ENET0_PTP_SYNC_FRAME_TX_UNCONNECTED), + .ENET0_SOF_RX(NLW_inst_ENET0_SOF_RX_UNCONNECTED), + .ENET0_SOF_TX(NLW_inst_ENET0_SOF_TX_UNCONNECTED), + .ENET1_EXT_INTIN(1'b0), + .ENET1_GMII_COL(1'b0), + .ENET1_GMII_CRS(1'b0), + .ENET1_GMII_RXD({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .ENET1_GMII_RX_CLK(1'b0), + .ENET1_GMII_RX_DV(1'b0), + .ENET1_GMII_RX_ER(1'b0), + .ENET1_GMII_TXD(NLW_inst_ENET1_GMII_TXD_UNCONNECTED[7:0]), + .ENET1_GMII_TX_CLK(1'b0), + .ENET1_GMII_TX_EN(NLW_inst_ENET1_GMII_TX_EN_UNCONNECTED), + .ENET1_GMII_TX_ER(NLW_inst_ENET1_GMII_TX_ER_UNCONNECTED), + .ENET1_MDIO_I(1'b0), + .ENET1_MDIO_MDC(NLW_inst_ENET1_MDIO_MDC_UNCONNECTED), + .ENET1_MDIO_O(NLW_inst_ENET1_MDIO_O_UNCONNECTED), + .ENET1_MDIO_T(NLW_inst_ENET1_MDIO_T_UNCONNECTED), + .ENET1_PTP_DELAY_REQ_RX(NLW_inst_ENET1_PTP_DELAY_REQ_RX_UNCONNECTED), + .ENET1_PTP_DELAY_REQ_TX(NLW_inst_ENET1_PTP_DELAY_REQ_TX_UNCONNECTED), + .ENET1_PTP_PDELAY_REQ_RX(NLW_inst_ENET1_PTP_PDELAY_REQ_RX_UNCONNECTED), + .ENET1_PTP_PDELAY_REQ_TX(NLW_inst_ENET1_PTP_PDELAY_REQ_TX_UNCONNECTED), + .ENET1_PTP_PDELAY_RESP_RX(NLW_inst_ENET1_PTP_PDELAY_RESP_RX_UNCONNECTED), + .ENET1_PTP_PDELAY_RESP_TX(NLW_inst_ENET1_PTP_PDELAY_RESP_TX_UNCONNECTED), + .ENET1_PTP_SYNC_FRAME_RX(NLW_inst_ENET1_PTP_SYNC_FRAME_RX_UNCONNECTED), + .ENET1_PTP_SYNC_FRAME_TX(NLW_inst_ENET1_PTP_SYNC_FRAME_TX_UNCONNECTED), + .ENET1_SOF_RX(NLW_inst_ENET1_SOF_RX_UNCONNECTED), + .ENET1_SOF_TX(NLW_inst_ENET1_SOF_TX_UNCONNECTED), + .EVENT_EVENTI(1'b0), + .EVENT_EVENTO(NLW_inst_EVENT_EVENTO_UNCONNECTED), + .EVENT_STANDBYWFE(NLW_inst_EVENT_STANDBYWFE_UNCONNECTED[1:0]), + .EVENT_STANDBYWFI(NLW_inst_EVENT_STANDBYWFI_UNCONNECTED[1:0]), + .FCLK_CLK0(FCLK_CLK0), + .FCLK_CLK1(FCLK_CLK1), + .FCLK_CLK2(NLW_inst_FCLK_CLK2_UNCONNECTED), + .FCLK_CLK3(NLW_inst_FCLK_CLK3_UNCONNECTED), + .FCLK_CLKTRIG0_N(1'b0), + .FCLK_CLKTRIG1_N(1'b0), + .FCLK_CLKTRIG2_N(1'b0), + .FCLK_CLKTRIG3_N(1'b0), + .FCLK_RESET0_N(FCLK_RESET0_N), + .FCLK_RESET1_N(NLW_inst_FCLK_RESET1_N_UNCONNECTED), + .FCLK_RESET2_N(NLW_inst_FCLK_RESET2_N_UNCONNECTED), + .FCLK_RESET3_N(NLW_inst_FCLK_RESET3_N_UNCONNECTED), + .FPGA_IDLE_N(1'b0), + .FTMD_TRACEIN_ATID({1'b0,1'b0,1'b0,1'b0}), + .FTMD_TRACEIN_CLK(1'b0), + .FTMD_TRACEIN_DATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .FTMD_TRACEIN_VALID(1'b0), + .FTMT_F2P_DEBUG({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .FTMT_F2P_TRIGACK_0(NLW_inst_FTMT_F2P_TRIGACK_0_UNCONNECTED), + .FTMT_F2P_TRIGACK_1(NLW_inst_FTMT_F2P_TRIGACK_1_UNCONNECTED), + .FTMT_F2P_TRIGACK_2(NLW_inst_FTMT_F2P_TRIGACK_2_UNCONNECTED), + .FTMT_F2P_TRIGACK_3(NLW_inst_FTMT_F2P_TRIGACK_3_UNCONNECTED), + .FTMT_F2P_TRIG_0(1'b0), + .FTMT_F2P_TRIG_1(1'b0), + .FTMT_F2P_TRIG_2(1'b0), + .FTMT_F2P_TRIG_3(1'b0), + .FTMT_P2F_DEBUG(NLW_inst_FTMT_P2F_DEBUG_UNCONNECTED[31:0]), + .FTMT_P2F_TRIGACK_0(1'b0), + .FTMT_P2F_TRIGACK_1(1'b0), + .FTMT_P2F_TRIGACK_2(1'b0), + .FTMT_P2F_TRIGACK_3(1'b0), + .FTMT_P2F_TRIG_0(NLW_inst_FTMT_P2F_TRIG_0_UNCONNECTED), + .FTMT_P2F_TRIG_1(NLW_inst_FTMT_P2F_TRIG_1_UNCONNECTED), + .FTMT_P2F_TRIG_2(NLW_inst_FTMT_P2F_TRIG_2_UNCONNECTED), + .FTMT_P2F_TRIG_3(NLW_inst_FTMT_P2F_TRIG_3_UNCONNECTED), + .GPIO_I(GPIO_I), + .GPIO_O(GPIO_O), + .GPIO_T(GPIO_T), + .I2C0_SCL_I(I2C0_SCL_I), + .I2C0_SCL_O(I2C0_SCL_O), + .I2C0_SCL_T(I2C0_SCL_T), + .I2C0_SDA_I(I2C0_SDA_I), + .I2C0_SDA_O(I2C0_SDA_O), + .I2C0_SDA_T(I2C0_SDA_T), + .I2C1_SCL_I(1'b0), + .I2C1_SCL_O(NLW_inst_I2C1_SCL_O_UNCONNECTED), + .I2C1_SCL_T(NLW_inst_I2C1_SCL_T_UNCONNECTED), + .I2C1_SDA_I(1'b0), + .I2C1_SDA_O(NLW_inst_I2C1_SDA_O_UNCONNECTED), + .I2C1_SDA_T(NLW_inst_I2C1_SDA_T_UNCONNECTED), + .IRQ_F2P(IRQ_F2P), + .IRQ_P2F_CAN0(NLW_inst_IRQ_P2F_CAN0_UNCONNECTED), + .IRQ_P2F_CAN1(NLW_inst_IRQ_P2F_CAN1_UNCONNECTED), + .IRQ_P2F_CTI(NLW_inst_IRQ_P2F_CTI_UNCONNECTED), + .IRQ_P2F_DMAC0(NLW_inst_IRQ_P2F_DMAC0_UNCONNECTED), + .IRQ_P2F_DMAC1(NLW_inst_IRQ_P2F_DMAC1_UNCONNECTED), + .IRQ_P2F_DMAC2(NLW_inst_IRQ_P2F_DMAC2_UNCONNECTED), + .IRQ_P2F_DMAC3(NLW_inst_IRQ_P2F_DMAC3_UNCONNECTED), + .IRQ_P2F_DMAC4(NLW_inst_IRQ_P2F_DMAC4_UNCONNECTED), + .IRQ_P2F_DMAC5(NLW_inst_IRQ_P2F_DMAC5_UNCONNECTED), + .IRQ_P2F_DMAC6(NLW_inst_IRQ_P2F_DMAC6_UNCONNECTED), + .IRQ_P2F_DMAC7(NLW_inst_IRQ_P2F_DMAC7_UNCONNECTED), + .IRQ_P2F_DMAC_ABORT(NLW_inst_IRQ_P2F_DMAC_ABORT_UNCONNECTED), + .IRQ_P2F_ENET0(NLW_inst_IRQ_P2F_ENET0_UNCONNECTED), + .IRQ_P2F_ENET1(NLW_inst_IRQ_P2F_ENET1_UNCONNECTED), + .IRQ_P2F_ENET_WAKE0(NLW_inst_IRQ_P2F_ENET_WAKE0_UNCONNECTED), + .IRQ_P2F_ENET_WAKE1(NLW_inst_IRQ_P2F_ENET_WAKE1_UNCONNECTED), + .IRQ_P2F_GPIO(NLW_inst_IRQ_P2F_GPIO_UNCONNECTED), + .IRQ_P2F_I2C0(NLW_inst_IRQ_P2F_I2C0_UNCONNECTED), + .IRQ_P2F_I2C1(NLW_inst_IRQ_P2F_I2C1_UNCONNECTED), + .IRQ_P2F_QSPI(NLW_inst_IRQ_P2F_QSPI_UNCONNECTED), + .IRQ_P2F_SDIO0(NLW_inst_IRQ_P2F_SDIO0_UNCONNECTED), + .IRQ_P2F_SDIO1(NLW_inst_IRQ_P2F_SDIO1_UNCONNECTED), + .IRQ_P2F_SMC(NLW_inst_IRQ_P2F_SMC_UNCONNECTED), + .IRQ_P2F_SPI0(NLW_inst_IRQ_P2F_SPI0_UNCONNECTED), + .IRQ_P2F_SPI1(NLW_inst_IRQ_P2F_SPI1_UNCONNECTED), + .IRQ_P2F_UART0(NLW_inst_IRQ_P2F_UART0_UNCONNECTED), + .IRQ_P2F_UART1(NLW_inst_IRQ_P2F_UART1_UNCONNECTED), + .IRQ_P2F_USB0(NLW_inst_IRQ_P2F_USB0_UNCONNECTED), + .IRQ_P2F_USB1(NLW_inst_IRQ_P2F_USB1_UNCONNECTED), + .MIO(MIO), + .M_AXI_GP0_ACLK(M_AXI_GP0_ACLK), + .M_AXI_GP0_ARADDR(M_AXI_GP0_ARADDR), + .M_AXI_GP0_ARBURST(M_AXI_GP0_ARBURST), + .M_AXI_GP0_ARCACHE(M_AXI_GP0_ARCACHE), + .M_AXI_GP0_ARESETN(NLW_inst_M_AXI_GP0_ARESETN_UNCONNECTED), + .M_AXI_GP0_ARID(M_AXI_GP0_ARID), + .M_AXI_GP0_ARLEN(M_AXI_GP0_ARLEN), + .M_AXI_GP0_ARLOCK(M_AXI_GP0_ARLOCK), + .M_AXI_GP0_ARPROT(M_AXI_GP0_ARPROT), + .M_AXI_GP0_ARQOS(M_AXI_GP0_ARQOS), + .M_AXI_GP0_ARREADY(M_AXI_GP0_ARREADY), + .M_AXI_GP0_ARSIZE(M_AXI_GP0_ARSIZE), + .M_AXI_GP0_ARVALID(M_AXI_GP0_ARVALID), + .M_AXI_GP0_AWADDR(M_AXI_GP0_AWADDR), + .M_AXI_GP0_AWBURST(M_AXI_GP0_AWBURST), + .M_AXI_GP0_AWCACHE(M_AXI_GP0_AWCACHE), + .M_AXI_GP0_AWID(M_AXI_GP0_AWID), + .M_AXI_GP0_AWLEN(M_AXI_GP0_AWLEN), + .M_AXI_GP0_AWLOCK(M_AXI_GP0_AWLOCK), + .M_AXI_GP0_AWPROT(M_AXI_GP0_AWPROT), + .M_AXI_GP0_AWQOS(M_AXI_GP0_AWQOS), + .M_AXI_GP0_AWREADY(M_AXI_GP0_AWREADY), + .M_AXI_GP0_AWSIZE(M_AXI_GP0_AWSIZE), + .M_AXI_GP0_AWVALID(M_AXI_GP0_AWVALID), + .M_AXI_GP0_BID(M_AXI_GP0_BID), + .M_AXI_GP0_BREADY(M_AXI_GP0_BREADY), + .M_AXI_GP0_BRESP(M_AXI_GP0_BRESP), + .M_AXI_GP0_BVALID(M_AXI_GP0_BVALID), + .M_AXI_GP0_RDATA(M_AXI_GP0_RDATA), + .M_AXI_GP0_RID(M_AXI_GP0_RID), + .M_AXI_GP0_RLAST(M_AXI_GP0_RLAST), + .M_AXI_GP0_RREADY(M_AXI_GP0_RREADY), + .M_AXI_GP0_RRESP(M_AXI_GP0_RRESP), + .M_AXI_GP0_RVALID(M_AXI_GP0_RVALID), + .M_AXI_GP0_WDATA(M_AXI_GP0_WDATA), + .M_AXI_GP0_WID(M_AXI_GP0_WID), + .M_AXI_GP0_WLAST(M_AXI_GP0_WLAST), + .M_AXI_GP0_WREADY(M_AXI_GP0_WREADY), + .M_AXI_GP0_WSTRB(M_AXI_GP0_WSTRB), + .M_AXI_GP0_WVALID(M_AXI_GP0_WVALID), + .M_AXI_GP1_ACLK(1'b0), + .M_AXI_GP1_ARADDR(NLW_inst_M_AXI_GP1_ARADDR_UNCONNECTED[31:0]), + .M_AXI_GP1_ARBURST(NLW_inst_M_AXI_GP1_ARBURST_UNCONNECTED[1:0]), + .M_AXI_GP1_ARCACHE(NLW_inst_M_AXI_GP1_ARCACHE_UNCONNECTED[3:0]), + .M_AXI_GP1_ARESETN(NLW_inst_M_AXI_GP1_ARESETN_UNCONNECTED), + .M_AXI_GP1_ARID(NLW_inst_M_AXI_GP1_ARID_UNCONNECTED[11:0]), + .M_AXI_GP1_ARLEN(NLW_inst_M_AXI_GP1_ARLEN_UNCONNECTED[3:0]), + .M_AXI_GP1_ARLOCK(NLW_inst_M_AXI_GP1_ARLOCK_UNCONNECTED[1:0]), + .M_AXI_GP1_ARPROT(NLW_inst_M_AXI_GP1_ARPROT_UNCONNECTED[2:0]), + .M_AXI_GP1_ARQOS(NLW_inst_M_AXI_GP1_ARQOS_UNCONNECTED[3:0]), + .M_AXI_GP1_ARREADY(1'b0), + .M_AXI_GP1_ARSIZE(NLW_inst_M_AXI_GP1_ARSIZE_UNCONNECTED[2:0]), + .M_AXI_GP1_ARVALID(NLW_inst_M_AXI_GP1_ARVALID_UNCONNECTED), + .M_AXI_GP1_AWADDR(NLW_inst_M_AXI_GP1_AWADDR_UNCONNECTED[31:0]), + .M_AXI_GP1_AWBURST(NLW_inst_M_AXI_GP1_AWBURST_UNCONNECTED[1:0]), + .M_AXI_GP1_AWCACHE(NLW_inst_M_AXI_GP1_AWCACHE_UNCONNECTED[3:0]), + .M_AXI_GP1_AWID(NLW_inst_M_AXI_GP1_AWID_UNCONNECTED[11:0]), + .M_AXI_GP1_AWLEN(NLW_inst_M_AXI_GP1_AWLEN_UNCONNECTED[3:0]), + .M_AXI_GP1_AWLOCK(NLW_inst_M_AXI_GP1_AWLOCK_UNCONNECTED[1:0]), + .M_AXI_GP1_AWPROT(NLW_inst_M_AXI_GP1_AWPROT_UNCONNECTED[2:0]), + .M_AXI_GP1_AWQOS(NLW_inst_M_AXI_GP1_AWQOS_UNCONNECTED[3:0]), + .M_AXI_GP1_AWREADY(1'b0), + .M_AXI_GP1_AWSIZE(NLW_inst_M_AXI_GP1_AWSIZE_UNCONNECTED[2:0]), + .M_AXI_GP1_AWVALID(NLW_inst_M_AXI_GP1_AWVALID_UNCONNECTED), + .M_AXI_GP1_BID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP1_BREADY(NLW_inst_M_AXI_GP1_BREADY_UNCONNECTED), + .M_AXI_GP1_BRESP({1'b0,1'b0}), + .M_AXI_GP1_BVALID(1'b0), + .M_AXI_GP1_RDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP1_RID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP1_RLAST(1'b0), + .M_AXI_GP1_RREADY(NLW_inst_M_AXI_GP1_RREADY_UNCONNECTED), + .M_AXI_GP1_RRESP({1'b0,1'b0}), + .M_AXI_GP1_RVALID(1'b0), + .M_AXI_GP1_WDATA(NLW_inst_M_AXI_GP1_WDATA_UNCONNECTED[31:0]), + .M_AXI_GP1_WID(NLW_inst_M_AXI_GP1_WID_UNCONNECTED[11:0]), + .M_AXI_GP1_WLAST(NLW_inst_M_AXI_GP1_WLAST_UNCONNECTED), + .M_AXI_GP1_WREADY(1'b0), + .M_AXI_GP1_WSTRB(NLW_inst_M_AXI_GP1_WSTRB_UNCONNECTED[3:0]), + .M_AXI_GP1_WVALID(NLW_inst_M_AXI_GP1_WVALID_UNCONNECTED), + .PJTAG_TCK(1'b0), + .PJTAG_TDI(1'b0), + .PJTAG_TDO(NLW_inst_PJTAG_TDO_UNCONNECTED), + .PJTAG_TMS(1'b0), + .PS_CLK(PS_CLK), + .PS_PORB(PS_PORB), + .PS_SRSTB(PS_SRSTB), + .SDIO0_BUSPOW(SDIO0_BUSPOW), + .SDIO0_BUSVOLT(SDIO0_BUSVOLT), + .SDIO0_CDN(SDIO0_CDN), + .SDIO0_CLK(SDIO0_CLK), + .SDIO0_CLK_FB(SDIO0_CLK_FB), + .SDIO0_CMD_I(SDIO0_CMD_I), + .SDIO0_CMD_O(SDIO0_CMD_O), + .SDIO0_CMD_T(SDIO0_CMD_T), + .SDIO0_DATA_I(SDIO0_DATA_I), + .SDIO0_DATA_O(SDIO0_DATA_O), + .SDIO0_DATA_T(SDIO0_DATA_T), + .SDIO0_LED(SDIO0_LED), + .SDIO0_WP(SDIO0_WP), + .SDIO1_BUSPOW(NLW_inst_SDIO1_BUSPOW_UNCONNECTED), + .SDIO1_BUSVOLT(NLW_inst_SDIO1_BUSVOLT_UNCONNECTED[2:0]), + .SDIO1_CDN(1'b0), + .SDIO1_CLK(NLW_inst_SDIO1_CLK_UNCONNECTED), + .SDIO1_CLK_FB(1'b0), + .SDIO1_CMD_I(1'b0), + .SDIO1_CMD_O(NLW_inst_SDIO1_CMD_O_UNCONNECTED), + .SDIO1_CMD_T(NLW_inst_SDIO1_CMD_T_UNCONNECTED), + .SDIO1_DATA_I({1'b0,1'b0,1'b0,1'b0}), + .SDIO1_DATA_O(NLW_inst_SDIO1_DATA_O_UNCONNECTED[3:0]), + .SDIO1_DATA_T(NLW_inst_SDIO1_DATA_T_UNCONNECTED[3:0]), + .SDIO1_LED(NLW_inst_SDIO1_LED_UNCONNECTED), + .SDIO1_WP(1'b0), + .SPI0_MISO_I(SPI0_MISO_I), + .SPI0_MISO_O(SPI0_MISO_O), + .SPI0_MISO_T(SPI0_MISO_T), + .SPI0_MOSI_I(SPI0_MOSI_I), + .SPI0_MOSI_O(SPI0_MOSI_O), + .SPI0_MOSI_T(SPI0_MOSI_T), + .SPI0_SCLK_I(SPI0_SCLK_I), + .SPI0_SCLK_O(SPI0_SCLK_O), + .SPI0_SCLK_T(SPI0_SCLK_T), + .SPI0_SS1_O(SPI0_SS1_O), + .SPI0_SS2_O(SPI0_SS2_O), + .SPI0_SS_I(SPI0_SS_I), + .SPI0_SS_O(SPI0_SS_O), + .SPI0_SS_T(SPI0_SS_T), + .SPI1_MISO_I(SPI1_MISO_I), + .SPI1_MISO_O(SPI1_MISO_O), + .SPI1_MISO_T(SPI1_MISO_T), + .SPI1_MOSI_I(SPI1_MOSI_I), + .SPI1_MOSI_O(SPI1_MOSI_O), + .SPI1_MOSI_T(SPI1_MOSI_T), + .SPI1_SCLK_I(SPI1_SCLK_I), + .SPI1_SCLK_O(SPI1_SCLK_O), + .SPI1_SCLK_T(SPI1_SCLK_T), + .SPI1_SS1_O(SPI1_SS1_O), + .SPI1_SS2_O(SPI1_SS2_O), + .SPI1_SS_I(SPI1_SS_I), + .SPI1_SS_O(SPI1_SS_O), + .SPI1_SS_T(SPI1_SS_T), + .SRAM_INTIN(1'b0), + .S_AXI_ACP_ACLK(1'b0), + .S_AXI_ACP_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARBURST({1'b0,1'b0}), + .S_AXI_ACP_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARESETN(NLW_inst_S_AXI_ACP_ARESETN_UNCONNECTED), + .S_AXI_ACP_ARID({1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARLOCK({1'b0,1'b0}), + .S_AXI_ACP_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARREADY(NLW_inst_S_AXI_ACP_ARREADY_UNCONNECTED), + .S_AXI_ACP_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARUSER({1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARVALID(1'b0), + .S_AXI_ACP_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWBURST({1'b0,1'b0}), + .S_AXI_ACP_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWID({1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWLOCK({1'b0,1'b0}), + .S_AXI_ACP_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWREADY(NLW_inst_S_AXI_ACP_AWREADY_UNCONNECTED), + .S_AXI_ACP_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWUSER({1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWVALID(1'b0), + .S_AXI_ACP_BID(NLW_inst_S_AXI_ACP_BID_UNCONNECTED[2:0]), + .S_AXI_ACP_BREADY(1'b0), + .S_AXI_ACP_BRESP(NLW_inst_S_AXI_ACP_BRESP_UNCONNECTED[1:0]), + .S_AXI_ACP_BVALID(NLW_inst_S_AXI_ACP_BVALID_UNCONNECTED), + .S_AXI_ACP_RDATA(NLW_inst_S_AXI_ACP_RDATA_UNCONNECTED[63:0]), + .S_AXI_ACP_RID(NLW_inst_S_AXI_ACP_RID_UNCONNECTED[2:0]), + .S_AXI_ACP_RLAST(NLW_inst_S_AXI_ACP_RLAST_UNCONNECTED), + .S_AXI_ACP_RREADY(1'b0), + .S_AXI_ACP_RRESP(NLW_inst_S_AXI_ACP_RRESP_UNCONNECTED[1:0]), + .S_AXI_ACP_RVALID(NLW_inst_S_AXI_ACP_RVALID_UNCONNECTED), + .S_AXI_ACP_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_WID({1'b0,1'b0,1'b0}), + .S_AXI_ACP_WLAST(1'b0), + .S_AXI_ACP_WREADY(NLW_inst_S_AXI_ACP_WREADY_UNCONNECTED), + .S_AXI_ACP_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_WVALID(1'b0), + .S_AXI_GP0_ACLK(1'b0), + .S_AXI_GP0_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARBURST({1'b0,1'b0}), + .S_AXI_GP0_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARESETN(NLW_inst_S_AXI_GP0_ARESETN_UNCONNECTED), + .S_AXI_GP0_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARLOCK({1'b0,1'b0}), + .S_AXI_GP0_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARREADY(NLW_inst_S_AXI_GP0_ARREADY_UNCONNECTED), + .S_AXI_GP0_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARVALID(1'b0), + .S_AXI_GP0_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWBURST({1'b0,1'b0}), + .S_AXI_GP0_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWLOCK({1'b0,1'b0}), + .S_AXI_GP0_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWREADY(NLW_inst_S_AXI_GP0_AWREADY_UNCONNECTED), + .S_AXI_GP0_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWVALID(1'b0), + .S_AXI_GP0_BID(NLW_inst_S_AXI_GP0_BID_UNCONNECTED[5:0]), + .S_AXI_GP0_BREADY(1'b0), + .S_AXI_GP0_BRESP(NLW_inst_S_AXI_GP0_BRESP_UNCONNECTED[1:0]), + .S_AXI_GP0_BVALID(NLW_inst_S_AXI_GP0_BVALID_UNCONNECTED), + .S_AXI_GP0_RDATA(NLW_inst_S_AXI_GP0_RDATA_UNCONNECTED[31:0]), + .S_AXI_GP0_RID(NLW_inst_S_AXI_GP0_RID_UNCONNECTED[5:0]), + .S_AXI_GP0_RLAST(NLW_inst_S_AXI_GP0_RLAST_UNCONNECTED), + .S_AXI_GP0_RREADY(1'b0), + .S_AXI_GP0_RRESP(NLW_inst_S_AXI_GP0_RRESP_UNCONNECTED[1:0]), + .S_AXI_GP0_RVALID(NLW_inst_S_AXI_GP0_RVALID_UNCONNECTED), + .S_AXI_GP0_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_WLAST(1'b0), + .S_AXI_GP0_WREADY(NLW_inst_S_AXI_GP0_WREADY_UNCONNECTED), + .S_AXI_GP0_WSTRB({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_WVALID(1'b0), + .S_AXI_GP1_ACLK(1'b0), + .S_AXI_GP1_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARBURST({1'b0,1'b0}), + .S_AXI_GP1_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARESETN(NLW_inst_S_AXI_GP1_ARESETN_UNCONNECTED), + .S_AXI_GP1_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARLOCK({1'b0,1'b0}), + .S_AXI_GP1_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARREADY(NLW_inst_S_AXI_GP1_ARREADY_UNCONNECTED), + .S_AXI_GP1_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARVALID(1'b0), + .S_AXI_GP1_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWBURST({1'b0,1'b0}), + .S_AXI_GP1_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWLOCK({1'b0,1'b0}), + .S_AXI_GP1_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWREADY(NLW_inst_S_AXI_GP1_AWREADY_UNCONNECTED), + .S_AXI_GP1_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWVALID(1'b0), + .S_AXI_GP1_BID(NLW_inst_S_AXI_GP1_BID_UNCONNECTED[5:0]), + .S_AXI_GP1_BREADY(1'b0), + .S_AXI_GP1_BRESP(NLW_inst_S_AXI_GP1_BRESP_UNCONNECTED[1:0]), + .S_AXI_GP1_BVALID(NLW_inst_S_AXI_GP1_BVALID_UNCONNECTED), + .S_AXI_GP1_RDATA(NLW_inst_S_AXI_GP1_RDATA_UNCONNECTED[31:0]), + .S_AXI_GP1_RID(NLW_inst_S_AXI_GP1_RID_UNCONNECTED[5:0]), + .S_AXI_GP1_RLAST(NLW_inst_S_AXI_GP1_RLAST_UNCONNECTED), + .S_AXI_GP1_RREADY(1'b0), + .S_AXI_GP1_RRESP(NLW_inst_S_AXI_GP1_RRESP_UNCONNECTED[1:0]), + .S_AXI_GP1_RVALID(NLW_inst_S_AXI_GP1_RVALID_UNCONNECTED), + .S_AXI_GP1_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_WLAST(1'b0), + .S_AXI_GP1_WREADY(NLW_inst_S_AXI_GP1_WREADY_UNCONNECTED), + .S_AXI_GP1_WSTRB({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_WVALID(1'b0), + .S_AXI_HP0_ACLK(1'b0), + .S_AXI_HP0_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARBURST({1'b0,1'b0}), + .S_AXI_HP0_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARESETN(NLW_inst_S_AXI_HP0_ARESETN_UNCONNECTED), + .S_AXI_HP0_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARLOCK({1'b0,1'b0}), + .S_AXI_HP0_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARREADY(NLW_inst_S_AXI_HP0_ARREADY_UNCONNECTED), + .S_AXI_HP0_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARVALID(1'b0), + .S_AXI_HP0_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWBURST({1'b0,1'b0}), + .S_AXI_HP0_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWLOCK({1'b0,1'b0}), + .S_AXI_HP0_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWREADY(NLW_inst_S_AXI_HP0_AWREADY_UNCONNECTED), + .S_AXI_HP0_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWVALID(1'b0), + .S_AXI_HP0_BID(NLW_inst_S_AXI_HP0_BID_UNCONNECTED[5:0]), + .S_AXI_HP0_BREADY(1'b0), + .S_AXI_HP0_BRESP(NLW_inst_S_AXI_HP0_BRESP_UNCONNECTED[1:0]), + .S_AXI_HP0_BVALID(NLW_inst_S_AXI_HP0_BVALID_UNCONNECTED), + .S_AXI_HP0_RACOUNT(NLW_inst_S_AXI_HP0_RACOUNT_UNCONNECTED[2:0]), + .S_AXI_HP0_RCOUNT(NLW_inst_S_AXI_HP0_RCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP0_RDATA(NLW_inst_S_AXI_HP0_RDATA_UNCONNECTED[63:0]), + .S_AXI_HP0_RDISSUECAP1_EN(1'b0), + .S_AXI_HP0_RID(NLW_inst_S_AXI_HP0_RID_UNCONNECTED[5:0]), + .S_AXI_HP0_RLAST(NLW_inst_S_AXI_HP0_RLAST_UNCONNECTED), + .S_AXI_HP0_RREADY(1'b0), + .S_AXI_HP0_RRESP(NLW_inst_S_AXI_HP0_RRESP_UNCONNECTED[1:0]), + .S_AXI_HP0_RVALID(NLW_inst_S_AXI_HP0_RVALID_UNCONNECTED), + .S_AXI_HP0_WACOUNT(NLW_inst_S_AXI_HP0_WACOUNT_UNCONNECTED[5:0]), + .S_AXI_HP0_WCOUNT(NLW_inst_S_AXI_HP0_WCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP0_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_WLAST(1'b0), + .S_AXI_HP0_WREADY(NLW_inst_S_AXI_HP0_WREADY_UNCONNECTED), + .S_AXI_HP0_WRISSUECAP1_EN(1'b0), + .S_AXI_HP0_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_WVALID(1'b0), + .S_AXI_HP1_ACLK(1'b0), + .S_AXI_HP1_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARBURST({1'b0,1'b0}), + .S_AXI_HP1_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARESETN(NLW_inst_S_AXI_HP1_ARESETN_UNCONNECTED), + .S_AXI_HP1_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARLOCK({1'b0,1'b0}), + .S_AXI_HP1_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARREADY(NLW_inst_S_AXI_HP1_ARREADY_UNCONNECTED), + .S_AXI_HP1_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARVALID(1'b0), + .S_AXI_HP1_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWBURST({1'b0,1'b0}), + .S_AXI_HP1_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWLOCK({1'b0,1'b0}), + .S_AXI_HP1_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWREADY(NLW_inst_S_AXI_HP1_AWREADY_UNCONNECTED), + .S_AXI_HP1_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWVALID(1'b0), + .S_AXI_HP1_BID(NLW_inst_S_AXI_HP1_BID_UNCONNECTED[5:0]), + .S_AXI_HP1_BREADY(1'b0), + .S_AXI_HP1_BRESP(NLW_inst_S_AXI_HP1_BRESP_UNCONNECTED[1:0]), + .S_AXI_HP1_BVALID(NLW_inst_S_AXI_HP1_BVALID_UNCONNECTED), + .S_AXI_HP1_RACOUNT(NLW_inst_S_AXI_HP1_RACOUNT_UNCONNECTED[2:0]), + .S_AXI_HP1_RCOUNT(NLW_inst_S_AXI_HP1_RCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP1_RDATA(NLW_inst_S_AXI_HP1_RDATA_UNCONNECTED[63:0]), + .S_AXI_HP1_RDISSUECAP1_EN(1'b0), + .S_AXI_HP1_RID(NLW_inst_S_AXI_HP1_RID_UNCONNECTED[5:0]), + .S_AXI_HP1_RLAST(NLW_inst_S_AXI_HP1_RLAST_UNCONNECTED), + .S_AXI_HP1_RREADY(1'b0), + .S_AXI_HP1_RRESP(NLW_inst_S_AXI_HP1_RRESP_UNCONNECTED[1:0]), + .S_AXI_HP1_RVALID(NLW_inst_S_AXI_HP1_RVALID_UNCONNECTED), + .S_AXI_HP1_WACOUNT(NLW_inst_S_AXI_HP1_WACOUNT_UNCONNECTED[5:0]), + .S_AXI_HP1_WCOUNT(NLW_inst_S_AXI_HP1_WCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP1_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_WLAST(1'b0), + .S_AXI_HP1_WREADY(NLW_inst_S_AXI_HP1_WREADY_UNCONNECTED), + .S_AXI_HP1_WRISSUECAP1_EN(1'b0), + .S_AXI_HP1_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_WVALID(1'b0), + .S_AXI_HP2_ACLK(1'b0), + .S_AXI_HP2_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARBURST({1'b0,1'b0}), + .S_AXI_HP2_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARESETN(NLW_inst_S_AXI_HP2_ARESETN_UNCONNECTED), + .S_AXI_HP2_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARLOCK({1'b0,1'b0}), + .S_AXI_HP2_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARREADY(NLW_inst_S_AXI_HP2_ARREADY_UNCONNECTED), + .S_AXI_HP2_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARVALID(1'b0), + .S_AXI_HP2_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWBURST({1'b0,1'b0}), + .S_AXI_HP2_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWLOCK({1'b0,1'b0}), + .S_AXI_HP2_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWREADY(NLW_inst_S_AXI_HP2_AWREADY_UNCONNECTED), + .S_AXI_HP2_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWVALID(1'b0), + .S_AXI_HP2_BID(NLW_inst_S_AXI_HP2_BID_UNCONNECTED[5:0]), + .S_AXI_HP2_BREADY(1'b0), + .S_AXI_HP2_BRESP(NLW_inst_S_AXI_HP2_BRESP_UNCONNECTED[1:0]), + .S_AXI_HP2_BVALID(NLW_inst_S_AXI_HP2_BVALID_UNCONNECTED), + .S_AXI_HP2_RACOUNT(NLW_inst_S_AXI_HP2_RACOUNT_UNCONNECTED[2:0]), + .S_AXI_HP2_RCOUNT(NLW_inst_S_AXI_HP2_RCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP2_RDATA(NLW_inst_S_AXI_HP2_RDATA_UNCONNECTED[63:0]), + .S_AXI_HP2_RDISSUECAP1_EN(1'b0), + .S_AXI_HP2_RID(NLW_inst_S_AXI_HP2_RID_UNCONNECTED[5:0]), + .S_AXI_HP2_RLAST(NLW_inst_S_AXI_HP2_RLAST_UNCONNECTED), + .S_AXI_HP2_RREADY(1'b0), + .S_AXI_HP2_RRESP(NLW_inst_S_AXI_HP2_RRESP_UNCONNECTED[1:0]), + .S_AXI_HP2_RVALID(NLW_inst_S_AXI_HP2_RVALID_UNCONNECTED), + .S_AXI_HP2_WACOUNT(NLW_inst_S_AXI_HP2_WACOUNT_UNCONNECTED[5:0]), + .S_AXI_HP2_WCOUNT(NLW_inst_S_AXI_HP2_WCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP2_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_WLAST(1'b0), + .S_AXI_HP2_WREADY(NLW_inst_S_AXI_HP2_WREADY_UNCONNECTED), + .S_AXI_HP2_WRISSUECAP1_EN(1'b0), + .S_AXI_HP2_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_WVALID(1'b0), + .S_AXI_HP3_ACLK(1'b0), + .S_AXI_HP3_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARBURST({1'b0,1'b0}), + .S_AXI_HP3_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARESETN(NLW_inst_S_AXI_HP3_ARESETN_UNCONNECTED), + .S_AXI_HP3_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARLOCK({1'b0,1'b0}), + .S_AXI_HP3_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARREADY(NLW_inst_S_AXI_HP3_ARREADY_UNCONNECTED), + .S_AXI_HP3_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARVALID(1'b0), + .S_AXI_HP3_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWBURST({1'b0,1'b0}), + .S_AXI_HP3_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWLOCK({1'b0,1'b0}), + .S_AXI_HP3_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWREADY(NLW_inst_S_AXI_HP3_AWREADY_UNCONNECTED), + .S_AXI_HP3_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWVALID(1'b0), + .S_AXI_HP3_BID(NLW_inst_S_AXI_HP3_BID_UNCONNECTED[5:0]), + .S_AXI_HP3_BREADY(1'b0), + .S_AXI_HP3_BRESP(NLW_inst_S_AXI_HP3_BRESP_UNCONNECTED[1:0]), + .S_AXI_HP3_BVALID(NLW_inst_S_AXI_HP3_BVALID_UNCONNECTED), + .S_AXI_HP3_RACOUNT(NLW_inst_S_AXI_HP3_RACOUNT_UNCONNECTED[2:0]), + .S_AXI_HP3_RCOUNT(NLW_inst_S_AXI_HP3_RCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP3_RDATA(NLW_inst_S_AXI_HP3_RDATA_UNCONNECTED[63:0]), + .S_AXI_HP3_RDISSUECAP1_EN(1'b0), + .S_AXI_HP3_RID(NLW_inst_S_AXI_HP3_RID_UNCONNECTED[5:0]), + .S_AXI_HP3_RLAST(NLW_inst_S_AXI_HP3_RLAST_UNCONNECTED), + .S_AXI_HP3_RREADY(1'b0), + .S_AXI_HP3_RRESP(NLW_inst_S_AXI_HP3_RRESP_UNCONNECTED[1:0]), + .S_AXI_HP3_RVALID(NLW_inst_S_AXI_HP3_RVALID_UNCONNECTED), + .S_AXI_HP3_WACOUNT(NLW_inst_S_AXI_HP3_WACOUNT_UNCONNECTED[5:0]), + .S_AXI_HP3_WCOUNT(NLW_inst_S_AXI_HP3_WCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP3_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_WLAST(1'b0), + .S_AXI_HP3_WREADY(NLW_inst_S_AXI_HP3_WREADY_UNCONNECTED), + .S_AXI_HP3_WRISSUECAP1_EN(1'b0), + .S_AXI_HP3_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_WVALID(1'b0), + .TRACE_CLK(1'b0), + .TRACE_CLK_OUT(NLW_inst_TRACE_CLK_OUT_UNCONNECTED), + .TRACE_CTL(NLW_inst_TRACE_CTL_UNCONNECTED), + .TRACE_DATA(NLW_inst_TRACE_DATA_UNCONNECTED[1:0]), + .TTC0_CLK0_IN(1'b0), + .TTC0_CLK1_IN(1'b0), + .TTC0_CLK2_IN(1'b0), + .TTC0_WAVE0_OUT(TTC0_WAVE0_OUT), + .TTC0_WAVE1_OUT(TTC0_WAVE1_OUT), + .TTC0_WAVE2_OUT(TTC0_WAVE2_OUT), + .TTC1_CLK0_IN(1'b0), + .TTC1_CLK1_IN(1'b0), + .TTC1_CLK2_IN(1'b0), + .TTC1_WAVE0_OUT(TTC1_WAVE0_OUT), + .TTC1_WAVE1_OUT(TTC1_WAVE1_OUT), + .TTC1_WAVE2_OUT(TTC1_WAVE2_OUT), + .UART0_CTSN(1'b0), + .UART0_DCDN(1'b0), + .UART0_DSRN(1'b0), + .UART0_DTRN(NLW_inst_UART0_DTRN_UNCONNECTED), + .UART0_RIN(1'b0), + .UART0_RTSN(NLW_inst_UART0_RTSN_UNCONNECTED), + .UART0_RX(UART0_RX), + .UART0_TX(UART0_TX), + .UART1_CTSN(1'b0), + .UART1_DCDN(1'b0), + .UART1_DSRN(1'b0), + .UART1_DTRN(NLW_inst_UART1_DTRN_UNCONNECTED), + .UART1_RIN(1'b0), + .UART1_RTSN(NLW_inst_UART1_RTSN_UNCONNECTED), + .UART1_RX(1'b1), + .UART1_TX(NLW_inst_UART1_TX_UNCONNECTED), + .USB0_PORT_INDCTL(USB0_PORT_INDCTL), + .USB0_VBUS_PWRFAULT(USB0_VBUS_PWRFAULT), + .USB0_VBUS_PWRSELECT(USB0_VBUS_PWRSELECT), + .USB1_PORT_INDCTL(NLW_inst_USB1_PORT_INDCTL_UNCONNECTED[1:0]), + .USB1_VBUS_PWRFAULT(1'b0), + .USB1_VBUS_PWRSELECT(NLW_inst_USB1_VBUS_PWRSELECT_UNCONNECTED), + .WDT_CLK_IN(1'b0), + .WDT_RST_OUT(NLW_inst_WDT_RST_OUT_UNCONNECTED)); +endmodule + +(* C_DM_WIDTH = "2" *) (* C_DQS_WIDTH = "2" *) (* C_DQ_WIDTH = "16" *) +(* C_EMIO_GPIO_WIDTH = "64" *) (* C_EN_EMIO_ENET0 = "0" *) (* C_EN_EMIO_ENET1 = "0" *) +(* C_EN_EMIO_PJTAG = "0" *) (* C_EN_EMIO_TRACE = "0" *) (* C_FCLK_CLK0_BUF = "TRUE" *) +(* C_FCLK_CLK1_BUF = "TRUE" *) (* C_FCLK_CLK2_BUF = "FALSE" *) (* C_FCLK_CLK3_BUF = "FALSE" *) +(* C_GP0_EN_MODIFIABLE_TXN = "1" *) (* C_GP1_EN_MODIFIABLE_TXN = "1" *) (* C_INCLUDE_ACP_TRANS_CHECK = "0" *) +(* C_INCLUDE_TRACE_BUFFER = "0" *) (* C_IRQ_F2P_MODE = "DIRECT" *) (* C_MIO_PRIMITIVE = "32" *) +(* C_M_AXI_GP0_ENABLE_STATIC_REMAP = "0" *) (* C_M_AXI_GP0_ID_WIDTH = "12" *) (* C_M_AXI_GP0_THREAD_ID_WIDTH = "12" *) +(* C_M_AXI_GP1_ENABLE_STATIC_REMAP = "0" *) (* C_M_AXI_GP1_ID_WIDTH = "12" *) (* C_M_AXI_GP1_THREAD_ID_WIDTH = "12" *) +(* C_NUM_F2P_INTR_INPUTS = "1" *) (* C_PACKAGE_NAME = "clg225" *) (* C_PS7_SI_REV = "PRODUCTION" *) +(* C_S_AXI_ACP_ARUSER_VAL = "31" *) (* C_S_AXI_ACP_AWUSER_VAL = "31" *) (* C_S_AXI_ACP_ID_WIDTH = "3" *) +(* C_S_AXI_GP0_ID_WIDTH = "6" *) (* C_S_AXI_GP1_ID_WIDTH = "6" *) (* C_S_AXI_HP0_DATA_WIDTH = "64" *) +(* C_S_AXI_HP0_ID_WIDTH = "6" *) (* C_S_AXI_HP1_DATA_WIDTH = "64" *) (* C_S_AXI_HP1_ID_WIDTH = "6" *) +(* C_S_AXI_HP2_DATA_WIDTH = "64" *) (* C_S_AXI_HP2_ID_WIDTH = "6" *) (* C_S_AXI_HP3_DATA_WIDTH = "64" *) +(* C_S_AXI_HP3_ID_WIDTH = "6" *) (* C_TRACE_BUFFER_CLOCK_DELAY = "12" *) (* C_TRACE_BUFFER_FIFO_SIZE = "128" *) +(* C_TRACE_INTERNAL_WIDTH = "2" *) (* C_TRACE_PIPELINE_WIDTH = "8" *) (* C_USE_AXI_NONSECURE = "0" *) +(* C_USE_DEFAULT_ACP_USER_VAL = "0" *) (* C_USE_M_AXI_GP0 = "1" *) (* C_USE_M_AXI_GP1 = "0" *) +(* C_USE_S_AXI_ACP = "0" *) (* C_USE_S_AXI_GP0 = "0" *) (* C_USE_S_AXI_GP1 = "0" *) +(* C_USE_S_AXI_HP0 = "0" *) (* C_USE_S_AXI_HP1 = "0" *) (* C_USE_S_AXI_HP2 = "0" *) +(* C_USE_S_AXI_HP3 = "0" *) (* HW_HANDOFF = "design_1_processing_system7_0_0.hwdef" *) (* POWER = "/>" *) +(* USE_TRACE_DATA_EDGE_DETECTOR = "0" *) +module decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_processing_system7_v5_5_processing_system7 + (CAN0_PHY_TX, + CAN0_PHY_RX, + CAN1_PHY_TX, + CAN1_PHY_RX, + ENET0_GMII_TX_EN, + ENET0_GMII_TX_ER, + ENET0_MDIO_MDC, + ENET0_MDIO_O, + ENET0_MDIO_T, + ENET0_PTP_DELAY_REQ_RX, + ENET0_PTP_DELAY_REQ_TX, + ENET0_PTP_PDELAY_REQ_RX, + ENET0_PTP_PDELAY_REQ_TX, + ENET0_PTP_PDELAY_RESP_RX, + ENET0_PTP_PDELAY_RESP_TX, + ENET0_PTP_SYNC_FRAME_RX, + ENET0_PTP_SYNC_FRAME_TX, + ENET0_SOF_RX, + ENET0_SOF_TX, + ENET0_GMII_TXD, + ENET0_GMII_COL, + ENET0_GMII_CRS, + ENET0_GMII_RX_CLK, + ENET0_GMII_RX_DV, + ENET0_GMII_RX_ER, + ENET0_GMII_TX_CLK, + ENET0_MDIO_I, + ENET0_EXT_INTIN, + ENET0_GMII_RXD, + ENET1_GMII_TX_EN, + ENET1_GMII_TX_ER, + ENET1_MDIO_MDC, + ENET1_MDIO_O, + ENET1_MDIO_T, + ENET1_PTP_DELAY_REQ_RX, + ENET1_PTP_DELAY_REQ_TX, + ENET1_PTP_PDELAY_REQ_RX, + ENET1_PTP_PDELAY_REQ_TX, + ENET1_PTP_PDELAY_RESP_RX, + ENET1_PTP_PDELAY_RESP_TX, + ENET1_PTP_SYNC_FRAME_RX, + ENET1_PTP_SYNC_FRAME_TX, + ENET1_SOF_RX, + ENET1_SOF_TX, + ENET1_GMII_TXD, + ENET1_GMII_COL, + ENET1_GMII_CRS, + ENET1_GMII_RX_CLK, + ENET1_GMII_RX_DV, + ENET1_GMII_RX_ER, + ENET1_GMII_TX_CLK, + ENET1_MDIO_I, + ENET1_EXT_INTIN, + ENET1_GMII_RXD, + GPIO_I, + GPIO_O, + GPIO_T, + I2C0_SDA_I, + I2C0_SDA_O, + I2C0_SDA_T, + I2C0_SCL_I, + I2C0_SCL_O, + I2C0_SCL_T, + I2C1_SDA_I, + I2C1_SDA_O, + I2C1_SDA_T, + I2C1_SCL_I, + I2C1_SCL_O, + I2C1_SCL_T, + PJTAG_TCK, + PJTAG_TMS, + PJTAG_TDI, + PJTAG_TDO, + SDIO0_CLK, + SDIO0_CLK_FB, + SDIO0_CMD_O, + SDIO0_CMD_I, + SDIO0_CMD_T, + SDIO0_DATA_I, + SDIO0_DATA_O, + SDIO0_DATA_T, + SDIO0_LED, + SDIO0_CDN, + SDIO0_WP, + SDIO0_BUSPOW, + SDIO0_BUSVOLT, + SDIO1_CLK, + SDIO1_CLK_FB, + SDIO1_CMD_O, + SDIO1_CMD_I, + SDIO1_CMD_T, + SDIO1_DATA_I, + SDIO1_DATA_O, + SDIO1_DATA_T, + SDIO1_LED, + SDIO1_CDN, + SDIO1_WP, + SDIO1_BUSPOW, + SDIO1_BUSVOLT, + SPI0_SCLK_I, + SPI0_SCLK_O, + SPI0_SCLK_T, + SPI0_MOSI_I, + SPI0_MOSI_O, + SPI0_MOSI_T, + SPI0_MISO_I, + SPI0_MISO_O, + SPI0_MISO_T, + SPI0_SS_I, + SPI0_SS_O, + SPI0_SS1_O, + SPI0_SS2_O, + SPI0_SS_T, + SPI1_SCLK_I, + SPI1_SCLK_O, + SPI1_SCLK_T, + SPI1_MOSI_I, + SPI1_MOSI_O, + SPI1_MOSI_T, + SPI1_MISO_I, + SPI1_MISO_O, + SPI1_MISO_T, + SPI1_SS_I, + SPI1_SS_O, + SPI1_SS1_O, + SPI1_SS2_O, + SPI1_SS_T, + UART0_DTRN, + UART0_RTSN, + UART0_TX, + UART0_CTSN, + UART0_DCDN, + UART0_DSRN, + UART0_RIN, + UART0_RX, + UART1_DTRN, + UART1_RTSN, + UART1_TX, + UART1_CTSN, + UART1_DCDN, + UART1_DSRN, + UART1_RIN, + UART1_RX, + TTC0_WAVE0_OUT, + TTC0_WAVE1_OUT, + TTC0_WAVE2_OUT, + TTC0_CLK0_IN, + TTC0_CLK1_IN, + TTC0_CLK2_IN, + TTC1_WAVE0_OUT, + TTC1_WAVE1_OUT, + TTC1_WAVE2_OUT, + TTC1_CLK0_IN, + TTC1_CLK1_IN, + TTC1_CLK2_IN, + WDT_CLK_IN, + WDT_RST_OUT, + TRACE_CLK, + TRACE_CTL, + TRACE_DATA, + TRACE_CLK_OUT, + USB0_PORT_INDCTL, + USB0_VBUS_PWRSELECT, + USB0_VBUS_PWRFAULT, + USB1_PORT_INDCTL, + USB1_VBUS_PWRSELECT, + USB1_VBUS_PWRFAULT, + SRAM_INTIN, + M_AXI_GP0_ARESETN, + M_AXI_GP0_ARVALID, + M_AXI_GP0_AWVALID, + M_AXI_GP0_BREADY, + M_AXI_GP0_RREADY, + M_AXI_GP0_WLAST, + M_AXI_GP0_WVALID, + M_AXI_GP0_ARID, + M_AXI_GP0_AWID, + M_AXI_GP0_WID, + M_AXI_GP0_ARBURST, + M_AXI_GP0_ARLOCK, + M_AXI_GP0_ARSIZE, + M_AXI_GP0_AWBURST, + M_AXI_GP0_AWLOCK, + M_AXI_GP0_AWSIZE, + M_AXI_GP0_ARPROT, + M_AXI_GP0_AWPROT, + M_AXI_GP0_ARADDR, + M_AXI_GP0_AWADDR, + M_AXI_GP0_WDATA, + M_AXI_GP0_ARCACHE, + M_AXI_GP0_ARLEN, + M_AXI_GP0_ARQOS, + M_AXI_GP0_AWCACHE, + M_AXI_GP0_AWLEN, + M_AXI_GP0_AWQOS, + M_AXI_GP0_WSTRB, + M_AXI_GP0_ACLK, + M_AXI_GP0_ARREADY, + M_AXI_GP0_AWREADY, + M_AXI_GP0_BVALID, + M_AXI_GP0_RLAST, + M_AXI_GP0_RVALID, + M_AXI_GP0_WREADY, + M_AXI_GP0_BID, + M_AXI_GP0_RID, + M_AXI_GP0_BRESP, + M_AXI_GP0_RRESP, + M_AXI_GP0_RDATA, + M_AXI_GP1_ARESETN, + M_AXI_GP1_ARVALID, + M_AXI_GP1_AWVALID, + M_AXI_GP1_BREADY, + M_AXI_GP1_RREADY, + M_AXI_GP1_WLAST, + M_AXI_GP1_WVALID, + M_AXI_GP1_ARID, + M_AXI_GP1_AWID, + M_AXI_GP1_WID, + M_AXI_GP1_ARBURST, + M_AXI_GP1_ARLOCK, + M_AXI_GP1_ARSIZE, + M_AXI_GP1_AWBURST, + M_AXI_GP1_AWLOCK, + M_AXI_GP1_AWSIZE, + M_AXI_GP1_ARPROT, + M_AXI_GP1_AWPROT, + M_AXI_GP1_ARADDR, + M_AXI_GP1_AWADDR, + M_AXI_GP1_WDATA, + M_AXI_GP1_ARCACHE, + M_AXI_GP1_ARLEN, + M_AXI_GP1_ARQOS, + M_AXI_GP1_AWCACHE, + M_AXI_GP1_AWLEN, + M_AXI_GP1_AWQOS, + M_AXI_GP1_WSTRB, + M_AXI_GP1_ACLK, + M_AXI_GP1_ARREADY, + M_AXI_GP1_AWREADY, + M_AXI_GP1_BVALID, + M_AXI_GP1_RLAST, + M_AXI_GP1_RVALID, + M_AXI_GP1_WREADY, + M_AXI_GP1_BID, + M_AXI_GP1_RID, + M_AXI_GP1_BRESP, + M_AXI_GP1_RRESP, + M_AXI_GP1_RDATA, + S_AXI_GP0_ARESETN, + S_AXI_GP0_ARREADY, + S_AXI_GP0_AWREADY, + S_AXI_GP0_BVALID, + S_AXI_GP0_RLAST, + S_AXI_GP0_RVALID, + S_AXI_GP0_WREADY, + S_AXI_GP0_BRESP, + S_AXI_GP0_RRESP, + S_AXI_GP0_RDATA, + S_AXI_GP0_BID, + S_AXI_GP0_RID, + S_AXI_GP0_ACLK, + S_AXI_GP0_ARVALID, + S_AXI_GP0_AWVALID, + S_AXI_GP0_BREADY, + S_AXI_GP0_RREADY, + S_AXI_GP0_WLAST, + S_AXI_GP0_WVALID, + S_AXI_GP0_ARBURST, + S_AXI_GP0_ARLOCK, + S_AXI_GP0_ARSIZE, + S_AXI_GP0_AWBURST, + S_AXI_GP0_AWLOCK, + S_AXI_GP0_AWSIZE, + S_AXI_GP0_ARPROT, + S_AXI_GP0_AWPROT, + S_AXI_GP0_ARADDR, + S_AXI_GP0_AWADDR, + S_AXI_GP0_WDATA, + S_AXI_GP0_ARCACHE, + S_AXI_GP0_ARLEN, + S_AXI_GP0_ARQOS, + S_AXI_GP0_AWCACHE, + S_AXI_GP0_AWLEN, + S_AXI_GP0_AWQOS, + S_AXI_GP0_WSTRB, + S_AXI_GP0_ARID, + S_AXI_GP0_AWID, + S_AXI_GP0_WID, + S_AXI_GP1_ARESETN, + S_AXI_GP1_ARREADY, + S_AXI_GP1_AWREADY, + S_AXI_GP1_BVALID, + S_AXI_GP1_RLAST, + S_AXI_GP1_RVALID, + S_AXI_GP1_WREADY, + S_AXI_GP1_BRESP, + S_AXI_GP1_RRESP, + S_AXI_GP1_RDATA, + S_AXI_GP1_BID, + S_AXI_GP1_RID, + S_AXI_GP1_ACLK, + S_AXI_GP1_ARVALID, + S_AXI_GP1_AWVALID, + S_AXI_GP1_BREADY, + S_AXI_GP1_RREADY, + S_AXI_GP1_WLAST, + S_AXI_GP1_WVALID, + S_AXI_GP1_ARBURST, + S_AXI_GP1_ARLOCK, + S_AXI_GP1_ARSIZE, + S_AXI_GP1_AWBURST, + S_AXI_GP1_AWLOCK, + S_AXI_GP1_AWSIZE, + S_AXI_GP1_ARPROT, + S_AXI_GP1_AWPROT, + S_AXI_GP1_ARADDR, + S_AXI_GP1_AWADDR, + S_AXI_GP1_WDATA, + S_AXI_GP1_ARCACHE, + S_AXI_GP1_ARLEN, + S_AXI_GP1_ARQOS, + S_AXI_GP1_AWCACHE, + S_AXI_GP1_AWLEN, + S_AXI_GP1_AWQOS, + S_AXI_GP1_WSTRB, + S_AXI_GP1_ARID, + S_AXI_GP1_AWID, + S_AXI_GP1_WID, + S_AXI_ACP_ARESETN, + S_AXI_ACP_ARREADY, + S_AXI_ACP_AWREADY, + S_AXI_ACP_BVALID, + S_AXI_ACP_RLAST, + S_AXI_ACP_RVALID, + S_AXI_ACP_WREADY, + S_AXI_ACP_BRESP, + S_AXI_ACP_RRESP, + S_AXI_ACP_BID, + S_AXI_ACP_RID, + S_AXI_ACP_RDATA, + S_AXI_ACP_ACLK, + S_AXI_ACP_ARVALID, + S_AXI_ACP_AWVALID, + S_AXI_ACP_BREADY, + S_AXI_ACP_RREADY, + S_AXI_ACP_WLAST, + S_AXI_ACP_WVALID, + S_AXI_ACP_ARID, + S_AXI_ACP_ARPROT, + S_AXI_ACP_AWID, + S_AXI_ACP_AWPROT, + S_AXI_ACP_WID, + S_AXI_ACP_ARADDR, + S_AXI_ACP_AWADDR, + S_AXI_ACP_ARCACHE, + S_AXI_ACP_ARLEN, + S_AXI_ACP_ARQOS, + S_AXI_ACP_AWCACHE, + S_AXI_ACP_AWLEN, + S_AXI_ACP_AWQOS, + S_AXI_ACP_ARBURST, + S_AXI_ACP_ARLOCK, + S_AXI_ACP_ARSIZE, + S_AXI_ACP_AWBURST, + S_AXI_ACP_AWLOCK, + S_AXI_ACP_AWSIZE, + S_AXI_ACP_ARUSER, + S_AXI_ACP_AWUSER, + S_AXI_ACP_WDATA, + S_AXI_ACP_WSTRB, + S_AXI_HP0_ARESETN, + S_AXI_HP0_ARREADY, + S_AXI_HP0_AWREADY, + S_AXI_HP0_BVALID, + S_AXI_HP0_RLAST, + S_AXI_HP0_RVALID, + S_AXI_HP0_WREADY, + S_AXI_HP0_BRESP, + S_AXI_HP0_RRESP, + S_AXI_HP0_BID, + S_AXI_HP0_RID, + S_AXI_HP0_RDATA, + S_AXI_HP0_RCOUNT, + S_AXI_HP0_WCOUNT, + S_AXI_HP0_RACOUNT, + S_AXI_HP0_WACOUNT, + S_AXI_HP0_ACLK, + S_AXI_HP0_ARVALID, + S_AXI_HP0_AWVALID, + S_AXI_HP0_BREADY, + S_AXI_HP0_RDISSUECAP1_EN, + S_AXI_HP0_RREADY, + S_AXI_HP0_WLAST, + S_AXI_HP0_WRISSUECAP1_EN, + S_AXI_HP0_WVALID, + S_AXI_HP0_ARBURST, + S_AXI_HP0_ARLOCK, + S_AXI_HP0_ARSIZE, + S_AXI_HP0_AWBURST, + S_AXI_HP0_AWLOCK, + S_AXI_HP0_AWSIZE, + S_AXI_HP0_ARPROT, + S_AXI_HP0_AWPROT, + S_AXI_HP0_ARADDR, + S_AXI_HP0_AWADDR, + S_AXI_HP0_ARCACHE, + S_AXI_HP0_ARLEN, + S_AXI_HP0_ARQOS, + S_AXI_HP0_AWCACHE, + S_AXI_HP0_AWLEN, + S_AXI_HP0_AWQOS, + S_AXI_HP0_ARID, + S_AXI_HP0_AWID, + S_AXI_HP0_WID, + S_AXI_HP0_WDATA, + S_AXI_HP0_WSTRB, + S_AXI_HP1_ARESETN, + S_AXI_HP1_ARREADY, + S_AXI_HP1_AWREADY, + S_AXI_HP1_BVALID, + S_AXI_HP1_RLAST, + S_AXI_HP1_RVALID, + S_AXI_HP1_WREADY, + S_AXI_HP1_BRESP, + S_AXI_HP1_RRESP, + S_AXI_HP1_BID, + S_AXI_HP1_RID, + S_AXI_HP1_RDATA, + S_AXI_HP1_RCOUNT, + S_AXI_HP1_WCOUNT, + S_AXI_HP1_RACOUNT, + S_AXI_HP1_WACOUNT, + S_AXI_HP1_ACLK, + S_AXI_HP1_ARVALID, + S_AXI_HP1_AWVALID, + S_AXI_HP1_BREADY, + S_AXI_HP1_RDISSUECAP1_EN, + S_AXI_HP1_RREADY, + S_AXI_HP1_WLAST, + S_AXI_HP1_WRISSUECAP1_EN, + S_AXI_HP1_WVALID, + S_AXI_HP1_ARBURST, + S_AXI_HP1_ARLOCK, + S_AXI_HP1_ARSIZE, + S_AXI_HP1_AWBURST, + S_AXI_HP1_AWLOCK, + S_AXI_HP1_AWSIZE, + S_AXI_HP1_ARPROT, + S_AXI_HP1_AWPROT, + S_AXI_HP1_ARADDR, + S_AXI_HP1_AWADDR, + S_AXI_HP1_ARCACHE, + S_AXI_HP1_ARLEN, + S_AXI_HP1_ARQOS, + S_AXI_HP1_AWCACHE, + S_AXI_HP1_AWLEN, + S_AXI_HP1_AWQOS, + S_AXI_HP1_ARID, + S_AXI_HP1_AWID, + S_AXI_HP1_WID, + S_AXI_HP1_WDATA, + S_AXI_HP1_WSTRB, + S_AXI_HP2_ARESETN, + S_AXI_HP2_ARREADY, + S_AXI_HP2_AWREADY, + S_AXI_HP2_BVALID, + S_AXI_HP2_RLAST, + S_AXI_HP2_RVALID, + S_AXI_HP2_WREADY, + S_AXI_HP2_BRESP, + S_AXI_HP2_RRESP, + S_AXI_HP2_BID, + S_AXI_HP2_RID, + S_AXI_HP2_RDATA, + S_AXI_HP2_RCOUNT, + S_AXI_HP2_WCOUNT, + S_AXI_HP2_RACOUNT, + S_AXI_HP2_WACOUNT, + S_AXI_HP2_ACLK, + S_AXI_HP2_ARVALID, + S_AXI_HP2_AWVALID, + S_AXI_HP2_BREADY, + S_AXI_HP2_RDISSUECAP1_EN, + S_AXI_HP2_RREADY, + S_AXI_HP2_WLAST, + S_AXI_HP2_WRISSUECAP1_EN, + S_AXI_HP2_WVALID, + S_AXI_HP2_ARBURST, + S_AXI_HP2_ARLOCK, + S_AXI_HP2_ARSIZE, + S_AXI_HP2_AWBURST, + S_AXI_HP2_AWLOCK, + S_AXI_HP2_AWSIZE, + S_AXI_HP2_ARPROT, + S_AXI_HP2_AWPROT, + S_AXI_HP2_ARADDR, + S_AXI_HP2_AWADDR, + S_AXI_HP2_ARCACHE, + S_AXI_HP2_ARLEN, + S_AXI_HP2_ARQOS, + S_AXI_HP2_AWCACHE, + S_AXI_HP2_AWLEN, + S_AXI_HP2_AWQOS, + S_AXI_HP2_ARID, + S_AXI_HP2_AWID, + S_AXI_HP2_WID, + S_AXI_HP2_WDATA, + S_AXI_HP2_WSTRB, + S_AXI_HP3_ARESETN, + S_AXI_HP3_ARREADY, + S_AXI_HP3_AWREADY, + S_AXI_HP3_BVALID, + S_AXI_HP3_RLAST, + S_AXI_HP3_RVALID, + S_AXI_HP3_WREADY, + S_AXI_HP3_BRESP, + S_AXI_HP3_RRESP, + S_AXI_HP3_BID, + S_AXI_HP3_RID, + S_AXI_HP3_RDATA, + S_AXI_HP3_RCOUNT, + S_AXI_HP3_WCOUNT, + S_AXI_HP3_RACOUNT, + S_AXI_HP3_WACOUNT, + S_AXI_HP3_ACLK, + S_AXI_HP3_ARVALID, + S_AXI_HP3_AWVALID, + S_AXI_HP3_BREADY, + S_AXI_HP3_RDISSUECAP1_EN, + S_AXI_HP3_RREADY, + S_AXI_HP3_WLAST, + S_AXI_HP3_WRISSUECAP1_EN, + S_AXI_HP3_WVALID, + S_AXI_HP3_ARBURST, + S_AXI_HP3_ARLOCK, + S_AXI_HP3_ARSIZE, + S_AXI_HP3_AWBURST, + S_AXI_HP3_AWLOCK, + S_AXI_HP3_AWSIZE, + S_AXI_HP3_ARPROT, + S_AXI_HP3_AWPROT, + S_AXI_HP3_ARADDR, + S_AXI_HP3_AWADDR, + S_AXI_HP3_ARCACHE, + S_AXI_HP3_ARLEN, + S_AXI_HP3_ARQOS, + S_AXI_HP3_AWCACHE, + S_AXI_HP3_AWLEN, + S_AXI_HP3_AWQOS, + S_AXI_HP3_ARID, + S_AXI_HP3_AWID, + S_AXI_HP3_WID, + S_AXI_HP3_WDATA, + S_AXI_HP3_WSTRB, + IRQ_P2F_DMAC_ABORT, + IRQ_P2F_DMAC0, + IRQ_P2F_DMAC1, + IRQ_P2F_DMAC2, + IRQ_P2F_DMAC3, + IRQ_P2F_DMAC4, + IRQ_P2F_DMAC5, + IRQ_P2F_DMAC6, + IRQ_P2F_DMAC7, + IRQ_P2F_SMC, + IRQ_P2F_QSPI, + IRQ_P2F_CTI, + IRQ_P2F_GPIO, + IRQ_P2F_USB0, + IRQ_P2F_ENET0, + IRQ_P2F_ENET_WAKE0, + IRQ_P2F_SDIO0, + IRQ_P2F_I2C0, + IRQ_P2F_SPI0, + IRQ_P2F_UART0, + IRQ_P2F_CAN0, + IRQ_P2F_USB1, + IRQ_P2F_ENET1, + IRQ_P2F_ENET_WAKE1, + IRQ_P2F_SDIO1, + IRQ_P2F_I2C1, + IRQ_P2F_SPI1, + IRQ_P2F_UART1, + IRQ_P2F_CAN1, + IRQ_F2P, + Core0_nFIQ, + Core0_nIRQ, + Core1_nFIQ, + Core1_nIRQ, + DMA0_DATYPE, + DMA0_DAVALID, + DMA0_DRREADY, + DMA0_RSTN, + DMA1_DATYPE, + DMA1_DAVALID, + DMA1_DRREADY, + DMA1_RSTN, + DMA2_DATYPE, + DMA2_DAVALID, + DMA2_DRREADY, + DMA2_RSTN, + DMA3_DATYPE, + DMA3_DAVALID, + DMA3_DRREADY, + DMA3_RSTN, + DMA0_ACLK, + DMA0_DAREADY, + DMA0_DRLAST, + DMA0_DRVALID, + DMA1_ACLK, + DMA1_DAREADY, + DMA1_DRLAST, + DMA1_DRVALID, + DMA2_ACLK, + DMA2_DAREADY, + DMA2_DRLAST, + DMA2_DRVALID, + DMA3_ACLK, + DMA3_DAREADY, + DMA3_DRLAST, + DMA3_DRVALID, + DMA0_DRTYPE, + DMA1_DRTYPE, + DMA2_DRTYPE, + DMA3_DRTYPE, + FCLK_CLK3, + FCLK_CLK2, + FCLK_CLK1, + FCLK_CLK0, + FCLK_CLKTRIG3_N, + FCLK_CLKTRIG2_N, + FCLK_CLKTRIG1_N, + FCLK_CLKTRIG0_N, + FCLK_RESET3_N, + FCLK_RESET2_N, + FCLK_RESET1_N, + FCLK_RESET0_N, + FTMD_TRACEIN_DATA, + FTMD_TRACEIN_VALID, + FTMD_TRACEIN_CLK, + FTMD_TRACEIN_ATID, + FTMT_F2P_TRIG_0, + FTMT_F2P_TRIGACK_0, + FTMT_F2P_TRIG_1, + FTMT_F2P_TRIGACK_1, + FTMT_F2P_TRIG_2, + FTMT_F2P_TRIGACK_2, + FTMT_F2P_TRIG_3, + FTMT_F2P_TRIGACK_3, + FTMT_F2P_DEBUG, + FTMT_P2F_TRIGACK_0, + FTMT_P2F_TRIG_0, + FTMT_P2F_TRIGACK_1, + FTMT_P2F_TRIG_1, + FTMT_P2F_TRIGACK_2, + FTMT_P2F_TRIG_2, + FTMT_P2F_TRIGACK_3, + FTMT_P2F_TRIG_3, + FTMT_P2F_DEBUG, + FPGA_IDLE_N, + EVENT_EVENTO, + EVENT_STANDBYWFE, + EVENT_STANDBYWFI, + EVENT_EVENTI, + DDR_ARB, + MIO, + DDR_CAS_n, + DDR_CKE, + DDR_Clk_n, + DDR_Clk, + DDR_CS_n, + DDR_DRSTB, + DDR_ODT, + DDR_RAS_n, + DDR_WEB, + DDR_BankAddr, + DDR_Addr, + DDR_VRN, + DDR_VRP, + DDR_DM, + DDR_DQ, + DDR_DQS_n, + DDR_DQS, + PS_SRSTB, + PS_CLK, + PS_PORB); + output CAN0_PHY_TX; + input CAN0_PHY_RX; + output CAN1_PHY_TX; + input CAN1_PHY_RX; + output ENET0_GMII_TX_EN; + output ENET0_GMII_TX_ER; + output ENET0_MDIO_MDC; + output ENET0_MDIO_O; + output ENET0_MDIO_T; + output ENET0_PTP_DELAY_REQ_RX; + output ENET0_PTP_DELAY_REQ_TX; + output ENET0_PTP_PDELAY_REQ_RX; + output ENET0_PTP_PDELAY_REQ_TX; + output ENET0_PTP_PDELAY_RESP_RX; + output ENET0_PTP_PDELAY_RESP_TX; + output ENET0_PTP_SYNC_FRAME_RX; + output ENET0_PTP_SYNC_FRAME_TX; + output ENET0_SOF_RX; + output ENET0_SOF_TX; + output [7:0]ENET0_GMII_TXD; + input ENET0_GMII_COL; + input ENET0_GMII_CRS; + input ENET0_GMII_RX_CLK; + input ENET0_GMII_RX_DV; + input ENET0_GMII_RX_ER; + input ENET0_GMII_TX_CLK; + input ENET0_MDIO_I; + input ENET0_EXT_INTIN; + input [7:0]ENET0_GMII_RXD; + output ENET1_GMII_TX_EN; + output ENET1_GMII_TX_ER; + output ENET1_MDIO_MDC; + output ENET1_MDIO_O; + output ENET1_MDIO_T; + output ENET1_PTP_DELAY_REQ_RX; + output ENET1_PTP_DELAY_REQ_TX; + output ENET1_PTP_PDELAY_REQ_RX; + output ENET1_PTP_PDELAY_REQ_TX; + output ENET1_PTP_PDELAY_RESP_RX; + output ENET1_PTP_PDELAY_RESP_TX; + output ENET1_PTP_SYNC_FRAME_RX; + output ENET1_PTP_SYNC_FRAME_TX; + output ENET1_SOF_RX; + output ENET1_SOF_TX; + output [7:0]ENET1_GMII_TXD; + input ENET1_GMII_COL; + input ENET1_GMII_CRS; + input ENET1_GMII_RX_CLK; + input ENET1_GMII_RX_DV; + input ENET1_GMII_RX_ER; + input ENET1_GMII_TX_CLK; + input ENET1_MDIO_I; + input ENET1_EXT_INTIN; + input [7:0]ENET1_GMII_RXD; + input [63:0]GPIO_I; + output [63:0]GPIO_O; + output [63:0]GPIO_T; + input I2C0_SDA_I; + output I2C0_SDA_O; + output I2C0_SDA_T; + input I2C0_SCL_I; + output I2C0_SCL_O; + output I2C0_SCL_T; + input I2C1_SDA_I; + output I2C1_SDA_O; + output I2C1_SDA_T; + input I2C1_SCL_I; + output I2C1_SCL_O; + output I2C1_SCL_T; + input PJTAG_TCK; + input PJTAG_TMS; + input PJTAG_TDI; + output PJTAG_TDO; + output SDIO0_CLK; + input SDIO0_CLK_FB; + output SDIO0_CMD_O; + input SDIO0_CMD_I; + output SDIO0_CMD_T; + input [3:0]SDIO0_DATA_I; + output [3:0]SDIO0_DATA_O; + output [3:0]SDIO0_DATA_T; + output SDIO0_LED; + input SDIO0_CDN; + input SDIO0_WP; + output SDIO0_BUSPOW; + output [2:0]SDIO0_BUSVOLT; + output SDIO1_CLK; + input SDIO1_CLK_FB; + output SDIO1_CMD_O; + input SDIO1_CMD_I; + output SDIO1_CMD_T; + input [3:0]SDIO1_DATA_I; + output [3:0]SDIO1_DATA_O; + output [3:0]SDIO1_DATA_T; + output SDIO1_LED; + input SDIO1_CDN; + input SDIO1_WP; + output SDIO1_BUSPOW; + output [2:0]SDIO1_BUSVOLT; + input SPI0_SCLK_I; + output SPI0_SCLK_O; + output SPI0_SCLK_T; + input SPI0_MOSI_I; + output SPI0_MOSI_O; + output SPI0_MOSI_T; + input SPI0_MISO_I; + output SPI0_MISO_O; + output SPI0_MISO_T; + input SPI0_SS_I; + output SPI0_SS_O; + output SPI0_SS1_O; + output SPI0_SS2_O; + output SPI0_SS_T; + input SPI1_SCLK_I; + output SPI1_SCLK_O; + output SPI1_SCLK_T; + input SPI1_MOSI_I; + output SPI1_MOSI_O; + output SPI1_MOSI_T; + input SPI1_MISO_I; + output SPI1_MISO_O; + output SPI1_MISO_T; + input SPI1_SS_I; + output SPI1_SS_O; + output SPI1_SS1_O; + output SPI1_SS2_O; + output SPI1_SS_T; + output UART0_DTRN; + output UART0_RTSN; + output UART0_TX; + input UART0_CTSN; + input UART0_DCDN; + input UART0_DSRN; + input UART0_RIN; + input UART0_RX; + output UART1_DTRN; + output UART1_RTSN; + output UART1_TX; + input UART1_CTSN; + input UART1_DCDN; + input UART1_DSRN; + input UART1_RIN; + input UART1_RX; + output TTC0_WAVE0_OUT; + output TTC0_WAVE1_OUT; + output TTC0_WAVE2_OUT; + input TTC0_CLK0_IN; + input TTC0_CLK1_IN; + input TTC0_CLK2_IN; + output TTC1_WAVE0_OUT; + output TTC1_WAVE1_OUT; + output TTC1_WAVE2_OUT; + input TTC1_CLK0_IN; + input TTC1_CLK1_IN; + input TTC1_CLK2_IN; + input WDT_CLK_IN; + output WDT_RST_OUT; + input TRACE_CLK; + output TRACE_CTL; + output [1:0]TRACE_DATA; + output TRACE_CLK_OUT; + output [1:0]USB0_PORT_INDCTL; + output USB0_VBUS_PWRSELECT; + input USB0_VBUS_PWRFAULT; + output [1:0]USB1_PORT_INDCTL; + output USB1_VBUS_PWRSELECT; + input USB1_VBUS_PWRFAULT; + input SRAM_INTIN; + output M_AXI_GP0_ARESETN; + output M_AXI_GP0_ARVALID; + output M_AXI_GP0_AWVALID; + output M_AXI_GP0_BREADY; + output M_AXI_GP0_RREADY; + output M_AXI_GP0_WLAST; + output M_AXI_GP0_WVALID; + output [11:0]M_AXI_GP0_ARID; + output [11:0]M_AXI_GP0_AWID; + output [11:0]M_AXI_GP0_WID; + output [1:0]M_AXI_GP0_ARBURST; + output [1:0]M_AXI_GP0_ARLOCK; + output [2:0]M_AXI_GP0_ARSIZE; + output [1:0]M_AXI_GP0_AWBURST; + output [1:0]M_AXI_GP0_AWLOCK; + output [2:0]M_AXI_GP0_AWSIZE; + output [2:0]M_AXI_GP0_ARPROT; + output [2:0]M_AXI_GP0_AWPROT; + output [31:0]M_AXI_GP0_ARADDR; + output [31:0]M_AXI_GP0_AWADDR; + output [31:0]M_AXI_GP0_WDATA; + output [3:0]M_AXI_GP0_ARCACHE; + output [3:0]M_AXI_GP0_ARLEN; + output [3:0]M_AXI_GP0_ARQOS; + output [3:0]M_AXI_GP0_AWCACHE; + output [3:0]M_AXI_GP0_AWLEN; + output [3:0]M_AXI_GP0_AWQOS; + output [3:0]M_AXI_GP0_WSTRB; + input M_AXI_GP0_ACLK; + input M_AXI_GP0_ARREADY; + input M_AXI_GP0_AWREADY; + input M_AXI_GP0_BVALID; + input M_AXI_GP0_RLAST; + input M_AXI_GP0_RVALID; + input M_AXI_GP0_WREADY; + input [11:0]M_AXI_GP0_BID; + input [11:0]M_AXI_GP0_RID; + input [1:0]M_AXI_GP0_BRESP; + input [1:0]M_AXI_GP0_RRESP; + input [31:0]M_AXI_GP0_RDATA; + output M_AXI_GP1_ARESETN; + output M_AXI_GP1_ARVALID; + output M_AXI_GP1_AWVALID; + output M_AXI_GP1_BREADY; + output M_AXI_GP1_RREADY; + output M_AXI_GP1_WLAST; + output M_AXI_GP1_WVALID; + output [11:0]M_AXI_GP1_ARID; + output [11:0]M_AXI_GP1_AWID; + output [11:0]M_AXI_GP1_WID; + output [1:0]M_AXI_GP1_ARBURST; + output [1:0]M_AXI_GP1_ARLOCK; + output [2:0]M_AXI_GP1_ARSIZE; + output [1:0]M_AXI_GP1_AWBURST; + output [1:0]M_AXI_GP1_AWLOCK; + output [2:0]M_AXI_GP1_AWSIZE; + output [2:0]M_AXI_GP1_ARPROT; + output [2:0]M_AXI_GP1_AWPROT; + output [31:0]M_AXI_GP1_ARADDR; + output [31:0]M_AXI_GP1_AWADDR; + output [31:0]M_AXI_GP1_WDATA; + output [3:0]M_AXI_GP1_ARCACHE; + output [3:0]M_AXI_GP1_ARLEN; + output [3:0]M_AXI_GP1_ARQOS; + output [3:0]M_AXI_GP1_AWCACHE; + output [3:0]M_AXI_GP1_AWLEN; + output [3:0]M_AXI_GP1_AWQOS; + output [3:0]M_AXI_GP1_WSTRB; + input M_AXI_GP1_ACLK; + input M_AXI_GP1_ARREADY; + input M_AXI_GP1_AWREADY; + input M_AXI_GP1_BVALID; + input M_AXI_GP1_RLAST; + input M_AXI_GP1_RVALID; + input M_AXI_GP1_WREADY; + input [11:0]M_AXI_GP1_BID; + input [11:0]M_AXI_GP1_RID; + input [1:0]M_AXI_GP1_BRESP; + input [1:0]M_AXI_GP1_RRESP; + input [31:0]M_AXI_GP1_RDATA; + output S_AXI_GP0_ARESETN; + output S_AXI_GP0_ARREADY; + output S_AXI_GP0_AWREADY; + output S_AXI_GP0_BVALID; + output S_AXI_GP0_RLAST; + output S_AXI_GP0_RVALID; + output S_AXI_GP0_WREADY; + output [1:0]S_AXI_GP0_BRESP; + output [1:0]S_AXI_GP0_RRESP; + output [31:0]S_AXI_GP0_RDATA; + output [5:0]S_AXI_GP0_BID; + output [5:0]S_AXI_GP0_RID; + input S_AXI_GP0_ACLK; + input S_AXI_GP0_ARVALID; + input S_AXI_GP0_AWVALID; + input S_AXI_GP0_BREADY; + input S_AXI_GP0_RREADY; + input S_AXI_GP0_WLAST; + input S_AXI_GP0_WVALID; + input [1:0]S_AXI_GP0_ARBURST; + input [1:0]S_AXI_GP0_ARLOCK; + input [2:0]S_AXI_GP0_ARSIZE; + input [1:0]S_AXI_GP0_AWBURST; + input [1:0]S_AXI_GP0_AWLOCK; + input [2:0]S_AXI_GP0_AWSIZE; + input [2:0]S_AXI_GP0_ARPROT; + input [2:0]S_AXI_GP0_AWPROT; + input [31:0]S_AXI_GP0_ARADDR; + input [31:0]S_AXI_GP0_AWADDR; + input [31:0]S_AXI_GP0_WDATA; + input [3:0]S_AXI_GP0_ARCACHE; + input [3:0]S_AXI_GP0_ARLEN; + input [3:0]S_AXI_GP0_ARQOS; + input [3:0]S_AXI_GP0_AWCACHE; + input [3:0]S_AXI_GP0_AWLEN; + input [3:0]S_AXI_GP0_AWQOS; + input [3:0]S_AXI_GP0_WSTRB; + input [5:0]S_AXI_GP0_ARID; + input [5:0]S_AXI_GP0_AWID; + input [5:0]S_AXI_GP0_WID; + output S_AXI_GP1_ARESETN; + output S_AXI_GP1_ARREADY; + output S_AXI_GP1_AWREADY; + output S_AXI_GP1_BVALID; + output S_AXI_GP1_RLAST; + output S_AXI_GP1_RVALID; + output S_AXI_GP1_WREADY; + output [1:0]S_AXI_GP1_BRESP; + output [1:0]S_AXI_GP1_RRESP; + output [31:0]S_AXI_GP1_RDATA; + output [5:0]S_AXI_GP1_BID; + output [5:0]S_AXI_GP1_RID; + input S_AXI_GP1_ACLK; + input S_AXI_GP1_ARVALID; + input S_AXI_GP1_AWVALID; + input S_AXI_GP1_BREADY; + input S_AXI_GP1_RREADY; + input S_AXI_GP1_WLAST; + input S_AXI_GP1_WVALID; + input [1:0]S_AXI_GP1_ARBURST; + input [1:0]S_AXI_GP1_ARLOCK; + input [2:0]S_AXI_GP1_ARSIZE; + input [1:0]S_AXI_GP1_AWBURST; + input [1:0]S_AXI_GP1_AWLOCK; + input [2:0]S_AXI_GP1_AWSIZE; + input [2:0]S_AXI_GP1_ARPROT; + input [2:0]S_AXI_GP1_AWPROT; + input [31:0]S_AXI_GP1_ARADDR; + input [31:0]S_AXI_GP1_AWADDR; + input [31:0]S_AXI_GP1_WDATA; + input [3:0]S_AXI_GP1_ARCACHE; + input [3:0]S_AXI_GP1_ARLEN; + input [3:0]S_AXI_GP1_ARQOS; + input [3:0]S_AXI_GP1_AWCACHE; + input [3:0]S_AXI_GP1_AWLEN; + input [3:0]S_AXI_GP1_AWQOS; + input [3:0]S_AXI_GP1_WSTRB; + input [5:0]S_AXI_GP1_ARID; + input [5:0]S_AXI_GP1_AWID; + input [5:0]S_AXI_GP1_WID; + output S_AXI_ACP_ARESETN; + output S_AXI_ACP_ARREADY; + output S_AXI_ACP_AWREADY; + output S_AXI_ACP_BVALID; + output S_AXI_ACP_RLAST; + output S_AXI_ACP_RVALID; + output S_AXI_ACP_WREADY; + output [1:0]S_AXI_ACP_BRESP; + output [1:0]S_AXI_ACP_RRESP; + output [2:0]S_AXI_ACP_BID; + output [2:0]S_AXI_ACP_RID; + output [63:0]S_AXI_ACP_RDATA; + input S_AXI_ACP_ACLK; + input S_AXI_ACP_ARVALID; + input S_AXI_ACP_AWVALID; + input S_AXI_ACP_BREADY; + input S_AXI_ACP_RREADY; + input S_AXI_ACP_WLAST; + input S_AXI_ACP_WVALID; + input [2:0]S_AXI_ACP_ARID; + input [2:0]S_AXI_ACP_ARPROT; + input [2:0]S_AXI_ACP_AWID; + input [2:0]S_AXI_ACP_AWPROT; + input [2:0]S_AXI_ACP_WID; + input [31:0]S_AXI_ACP_ARADDR; + input [31:0]S_AXI_ACP_AWADDR; + input [3:0]S_AXI_ACP_ARCACHE; + input [3:0]S_AXI_ACP_ARLEN; + input [3:0]S_AXI_ACP_ARQOS; + input [3:0]S_AXI_ACP_AWCACHE; + input [3:0]S_AXI_ACP_AWLEN; + input [3:0]S_AXI_ACP_AWQOS; + input [1:0]S_AXI_ACP_ARBURST; + input [1:0]S_AXI_ACP_ARLOCK; + input [2:0]S_AXI_ACP_ARSIZE; + input [1:0]S_AXI_ACP_AWBURST; + input [1:0]S_AXI_ACP_AWLOCK; + input [2:0]S_AXI_ACP_AWSIZE; + input [4:0]S_AXI_ACP_ARUSER; + input [4:0]S_AXI_ACP_AWUSER; + input [63:0]S_AXI_ACP_WDATA; + input [7:0]S_AXI_ACP_WSTRB; + output S_AXI_HP0_ARESETN; + output S_AXI_HP0_ARREADY; + output S_AXI_HP0_AWREADY; + output S_AXI_HP0_BVALID; + output S_AXI_HP0_RLAST; + output S_AXI_HP0_RVALID; + output S_AXI_HP0_WREADY; + output [1:0]S_AXI_HP0_BRESP; + output [1:0]S_AXI_HP0_RRESP; + output [5:0]S_AXI_HP0_BID; + output [5:0]S_AXI_HP0_RID; + output [63:0]S_AXI_HP0_RDATA; + output [7:0]S_AXI_HP0_RCOUNT; + output [7:0]S_AXI_HP0_WCOUNT; + output [2:0]S_AXI_HP0_RACOUNT; + output [5:0]S_AXI_HP0_WACOUNT; + input S_AXI_HP0_ACLK; + input S_AXI_HP0_ARVALID; + input S_AXI_HP0_AWVALID; + input S_AXI_HP0_BREADY; + input S_AXI_HP0_RDISSUECAP1_EN; + input S_AXI_HP0_RREADY; + input S_AXI_HP0_WLAST; + input S_AXI_HP0_WRISSUECAP1_EN; + input S_AXI_HP0_WVALID; + input [1:0]S_AXI_HP0_ARBURST; + input [1:0]S_AXI_HP0_ARLOCK; + input [2:0]S_AXI_HP0_ARSIZE; + input [1:0]S_AXI_HP0_AWBURST; + input [1:0]S_AXI_HP0_AWLOCK; + input [2:0]S_AXI_HP0_AWSIZE; + input [2:0]S_AXI_HP0_ARPROT; + input [2:0]S_AXI_HP0_AWPROT; + input [31:0]S_AXI_HP0_ARADDR; + input [31:0]S_AXI_HP0_AWADDR; + input [3:0]S_AXI_HP0_ARCACHE; + input [3:0]S_AXI_HP0_ARLEN; + input [3:0]S_AXI_HP0_ARQOS; + input [3:0]S_AXI_HP0_AWCACHE; + input [3:0]S_AXI_HP0_AWLEN; + input [3:0]S_AXI_HP0_AWQOS; + input [5:0]S_AXI_HP0_ARID; + input [5:0]S_AXI_HP0_AWID; + input [5:0]S_AXI_HP0_WID; + input [63:0]S_AXI_HP0_WDATA; + input [7:0]S_AXI_HP0_WSTRB; + output S_AXI_HP1_ARESETN; + output S_AXI_HP1_ARREADY; + output S_AXI_HP1_AWREADY; + output S_AXI_HP1_BVALID; + output S_AXI_HP1_RLAST; + output S_AXI_HP1_RVALID; + output S_AXI_HP1_WREADY; + output [1:0]S_AXI_HP1_BRESP; + output [1:0]S_AXI_HP1_RRESP; + output [5:0]S_AXI_HP1_BID; + output [5:0]S_AXI_HP1_RID; + output [63:0]S_AXI_HP1_RDATA; + output [7:0]S_AXI_HP1_RCOUNT; + output [7:0]S_AXI_HP1_WCOUNT; + output [2:0]S_AXI_HP1_RACOUNT; + output [5:0]S_AXI_HP1_WACOUNT; + input S_AXI_HP1_ACLK; + input S_AXI_HP1_ARVALID; + input S_AXI_HP1_AWVALID; + input S_AXI_HP1_BREADY; + input S_AXI_HP1_RDISSUECAP1_EN; + input S_AXI_HP1_RREADY; + input S_AXI_HP1_WLAST; + input S_AXI_HP1_WRISSUECAP1_EN; + input S_AXI_HP1_WVALID; + input [1:0]S_AXI_HP1_ARBURST; + input [1:0]S_AXI_HP1_ARLOCK; + input [2:0]S_AXI_HP1_ARSIZE; + input [1:0]S_AXI_HP1_AWBURST; + input [1:0]S_AXI_HP1_AWLOCK; + input [2:0]S_AXI_HP1_AWSIZE; + input [2:0]S_AXI_HP1_ARPROT; + input [2:0]S_AXI_HP1_AWPROT; + input [31:0]S_AXI_HP1_ARADDR; + input [31:0]S_AXI_HP1_AWADDR; + input [3:0]S_AXI_HP1_ARCACHE; + input [3:0]S_AXI_HP1_ARLEN; + input [3:0]S_AXI_HP1_ARQOS; + input [3:0]S_AXI_HP1_AWCACHE; + input [3:0]S_AXI_HP1_AWLEN; + input [3:0]S_AXI_HP1_AWQOS; + input [5:0]S_AXI_HP1_ARID; + input [5:0]S_AXI_HP1_AWID; + input [5:0]S_AXI_HP1_WID; + input [63:0]S_AXI_HP1_WDATA; + input [7:0]S_AXI_HP1_WSTRB; + output S_AXI_HP2_ARESETN; + output S_AXI_HP2_ARREADY; + output S_AXI_HP2_AWREADY; + output S_AXI_HP2_BVALID; + output S_AXI_HP2_RLAST; + output S_AXI_HP2_RVALID; + output S_AXI_HP2_WREADY; + output [1:0]S_AXI_HP2_BRESP; + output [1:0]S_AXI_HP2_RRESP; + output [5:0]S_AXI_HP2_BID; + output [5:0]S_AXI_HP2_RID; + output [63:0]S_AXI_HP2_RDATA; + output [7:0]S_AXI_HP2_RCOUNT; + output [7:0]S_AXI_HP2_WCOUNT; + output [2:0]S_AXI_HP2_RACOUNT; + output [5:0]S_AXI_HP2_WACOUNT; + input S_AXI_HP2_ACLK; + input S_AXI_HP2_ARVALID; + input S_AXI_HP2_AWVALID; + input S_AXI_HP2_BREADY; + input S_AXI_HP2_RDISSUECAP1_EN; + input S_AXI_HP2_RREADY; + input S_AXI_HP2_WLAST; + input S_AXI_HP2_WRISSUECAP1_EN; + input S_AXI_HP2_WVALID; + input [1:0]S_AXI_HP2_ARBURST; + input [1:0]S_AXI_HP2_ARLOCK; + input [2:0]S_AXI_HP2_ARSIZE; + input [1:0]S_AXI_HP2_AWBURST; + input [1:0]S_AXI_HP2_AWLOCK; + input [2:0]S_AXI_HP2_AWSIZE; + input [2:0]S_AXI_HP2_ARPROT; + input [2:0]S_AXI_HP2_AWPROT; + input [31:0]S_AXI_HP2_ARADDR; + input [31:0]S_AXI_HP2_AWADDR; + input [3:0]S_AXI_HP2_ARCACHE; + input [3:0]S_AXI_HP2_ARLEN; + input [3:0]S_AXI_HP2_ARQOS; + input [3:0]S_AXI_HP2_AWCACHE; + input [3:0]S_AXI_HP2_AWLEN; + input [3:0]S_AXI_HP2_AWQOS; + input [5:0]S_AXI_HP2_ARID; + input [5:0]S_AXI_HP2_AWID; + input [5:0]S_AXI_HP2_WID; + input [63:0]S_AXI_HP2_WDATA; + input [7:0]S_AXI_HP2_WSTRB; + output S_AXI_HP3_ARESETN; + output S_AXI_HP3_ARREADY; + output S_AXI_HP3_AWREADY; + output S_AXI_HP3_BVALID; + output S_AXI_HP3_RLAST; + output S_AXI_HP3_RVALID; + output S_AXI_HP3_WREADY; + output [1:0]S_AXI_HP3_BRESP; + output [1:0]S_AXI_HP3_RRESP; + output [5:0]S_AXI_HP3_BID; + output [5:0]S_AXI_HP3_RID; + output [63:0]S_AXI_HP3_RDATA; + output [7:0]S_AXI_HP3_RCOUNT; + output [7:0]S_AXI_HP3_WCOUNT; + output [2:0]S_AXI_HP3_RACOUNT; + output [5:0]S_AXI_HP3_WACOUNT; + input S_AXI_HP3_ACLK; + input S_AXI_HP3_ARVALID; + input S_AXI_HP3_AWVALID; + input S_AXI_HP3_BREADY; + input S_AXI_HP3_RDISSUECAP1_EN; + input S_AXI_HP3_RREADY; + input S_AXI_HP3_WLAST; + input S_AXI_HP3_WRISSUECAP1_EN; + input S_AXI_HP3_WVALID; + input [1:0]S_AXI_HP3_ARBURST; + input [1:0]S_AXI_HP3_ARLOCK; + input [2:0]S_AXI_HP3_ARSIZE; + input [1:0]S_AXI_HP3_AWBURST; + input [1:0]S_AXI_HP3_AWLOCK; + input [2:0]S_AXI_HP3_AWSIZE; + input [2:0]S_AXI_HP3_ARPROT; + input [2:0]S_AXI_HP3_AWPROT; + input [31:0]S_AXI_HP3_ARADDR; + input [31:0]S_AXI_HP3_AWADDR; + input [3:0]S_AXI_HP3_ARCACHE; + input [3:0]S_AXI_HP3_ARLEN; + input [3:0]S_AXI_HP3_ARQOS; + input [3:0]S_AXI_HP3_AWCACHE; + input [3:0]S_AXI_HP3_AWLEN; + input [3:0]S_AXI_HP3_AWQOS; + input [5:0]S_AXI_HP3_ARID; + input [5:0]S_AXI_HP3_AWID; + input [5:0]S_AXI_HP3_WID; + input [63:0]S_AXI_HP3_WDATA; + input [7:0]S_AXI_HP3_WSTRB; + output IRQ_P2F_DMAC_ABORT; + output IRQ_P2F_DMAC0; + output IRQ_P2F_DMAC1; + output IRQ_P2F_DMAC2; + output IRQ_P2F_DMAC3; + output IRQ_P2F_DMAC4; + output IRQ_P2F_DMAC5; + output IRQ_P2F_DMAC6; + output IRQ_P2F_DMAC7; + output IRQ_P2F_SMC; + output IRQ_P2F_QSPI; + output IRQ_P2F_CTI; + output IRQ_P2F_GPIO; + output IRQ_P2F_USB0; + output IRQ_P2F_ENET0; + output IRQ_P2F_ENET_WAKE0; + output IRQ_P2F_SDIO0; + output IRQ_P2F_I2C0; + output IRQ_P2F_SPI0; + output IRQ_P2F_UART0; + output IRQ_P2F_CAN0; + output IRQ_P2F_USB1; + output IRQ_P2F_ENET1; + output IRQ_P2F_ENET_WAKE1; + output IRQ_P2F_SDIO1; + output IRQ_P2F_I2C1; + output IRQ_P2F_SPI1; + output IRQ_P2F_UART1; + output IRQ_P2F_CAN1; + input [0:0]IRQ_F2P; + input Core0_nFIQ; + input Core0_nIRQ; + input Core1_nFIQ; + input Core1_nIRQ; + output [1:0]DMA0_DATYPE; + output DMA0_DAVALID; + output DMA0_DRREADY; + output DMA0_RSTN; + output [1:0]DMA1_DATYPE; + output DMA1_DAVALID; + output DMA1_DRREADY; + output DMA1_RSTN; + output [1:0]DMA2_DATYPE; + output DMA2_DAVALID; + output DMA2_DRREADY; + output DMA2_RSTN; + output [1:0]DMA3_DATYPE; + output DMA3_DAVALID; + output DMA3_DRREADY; + output DMA3_RSTN; + input DMA0_ACLK; + input DMA0_DAREADY; + input DMA0_DRLAST; + input DMA0_DRVALID; + input DMA1_ACLK; + input DMA1_DAREADY; + input DMA1_DRLAST; + input DMA1_DRVALID; + input DMA2_ACLK; + input DMA2_DAREADY; + input DMA2_DRLAST; + input DMA2_DRVALID; + input DMA3_ACLK; + input DMA3_DAREADY; + input DMA3_DRLAST; + input DMA3_DRVALID; + input [1:0]DMA0_DRTYPE; + input [1:0]DMA1_DRTYPE; + input [1:0]DMA2_DRTYPE; + input [1:0]DMA3_DRTYPE; + output FCLK_CLK3; + output FCLK_CLK2; + output FCLK_CLK1; + output FCLK_CLK0; + input FCLK_CLKTRIG3_N; + input FCLK_CLKTRIG2_N; + input FCLK_CLKTRIG1_N; + input FCLK_CLKTRIG0_N; + output FCLK_RESET3_N; + output FCLK_RESET2_N; + output FCLK_RESET1_N; + output FCLK_RESET0_N; + input [31:0]FTMD_TRACEIN_DATA; + input FTMD_TRACEIN_VALID; + input FTMD_TRACEIN_CLK; + input [3:0]FTMD_TRACEIN_ATID; + input FTMT_F2P_TRIG_0; + output FTMT_F2P_TRIGACK_0; + input FTMT_F2P_TRIG_1; + output FTMT_F2P_TRIGACK_1; + input FTMT_F2P_TRIG_2; + output FTMT_F2P_TRIGACK_2; + input FTMT_F2P_TRIG_3; + output FTMT_F2P_TRIGACK_3; + input [31:0]FTMT_F2P_DEBUG; + input FTMT_P2F_TRIGACK_0; + output FTMT_P2F_TRIG_0; + input FTMT_P2F_TRIGACK_1; + output FTMT_P2F_TRIG_1; + input FTMT_P2F_TRIGACK_2; + output FTMT_P2F_TRIG_2; + input FTMT_P2F_TRIGACK_3; + output FTMT_P2F_TRIG_3; + output [31:0]FTMT_P2F_DEBUG; + input FPGA_IDLE_N; + output EVENT_EVENTO; + output [1:0]EVENT_STANDBYWFE; + output [1:0]EVENT_STANDBYWFI; + input EVENT_EVENTI; + input [3:0]DDR_ARB; + inout [31:0]MIO; + inout DDR_CAS_n; + inout DDR_CKE; + inout DDR_Clk_n; + inout DDR_Clk; + inout DDR_CS_n; + inout DDR_DRSTB; + inout DDR_ODT; + inout DDR_RAS_n; + inout DDR_WEB; + inout [2:0]DDR_BankAddr; + inout [14:0]DDR_Addr; + inout DDR_VRN; + inout DDR_VRP; + inout [1:0]DDR_DM; + inout [15:0]DDR_DQ; + inout [1:0]DDR_DQS_n; + inout [1:0]DDR_DQS; + inout PS_SRSTB; + inout PS_CLK; + inout PS_PORB; + + wire \ ; + wire \ ; + wire CAN0_PHY_RX; + wire CAN0_PHY_TX; + wire CAN1_PHY_RX; + wire CAN1_PHY_TX; + wire Core0_nFIQ; + wire Core0_nIRQ; + wire Core1_nFIQ; + wire Core1_nIRQ; + wire [3:0]DDR_ARB; + wire [14:0]DDR_Addr; + wire [2:0]DDR_BankAddr; + wire DDR_CAS_n; + wire DDR_CKE; + wire DDR_CS_n; + wire DDR_Clk; + wire DDR_Clk_n; + wire [1:0]DDR_DM; + wire [15:0]DDR_DQ; + wire [1:0]DDR_DQS; + wire [1:0]DDR_DQS_n; + wire DDR_DRSTB; + wire DDR_ODT; + wire DDR_RAS_n; + wire DDR_VRN; + wire DDR_VRP; + wire DDR_WEB; + wire DMA0_ACLK; + wire DMA0_DAREADY; + wire [1:0]DMA0_DATYPE; + wire DMA0_DAVALID; + wire DMA0_DRLAST; + wire DMA0_DRREADY; + wire [1:0]DMA0_DRTYPE; + wire DMA0_DRVALID; + wire DMA0_RSTN; + wire DMA1_ACLK; + wire DMA1_DAREADY; + wire [1:0]DMA1_DATYPE; + wire DMA1_DAVALID; + wire DMA1_DRLAST; + wire DMA1_DRREADY; + wire [1:0]DMA1_DRTYPE; + wire DMA1_DRVALID; + wire DMA1_RSTN; + wire DMA2_ACLK; + wire DMA2_DAREADY; + wire [1:0]DMA2_DATYPE; + wire DMA2_DAVALID; + wire DMA2_DRLAST; + wire DMA2_DRREADY; + wire [1:0]DMA2_DRTYPE; + wire DMA2_DRVALID; + wire DMA2_RSTN; + wire DMA3_ACLK; + wire DMA3_DAREADY; + wire [1:0]DMA3_DATYPE; + wire DMA3_DAVALID; + wire DMA3_DRLAST; + wire DMA3_DRREADY; + wire [1:0]DMA3_DRTYPE; + wire DMA3_DRVALID; + wire DMA3_RSTN; + wire ENET0_EXT_INTIN; + wire ENET0_GMII_RX_CLK; + wire ENET0_GMII_TX_CLK; + wire ENET0_MDIO_I; + wire ENET0_MDIO_MDC; + wire ENET0_MDIO_O; + wire ENET0_MDIO_T; + wire ENET0_MDIO_T_n; + wire ENET0_PTP_DELAY_REQ_RX; + wire ENET0_PTP_DELAY_REQ_TX; + wire ENET0_PTP_PDELAY_REQ_RX; + wire ENET0_PTP_PDELAY_REQ_TX; + wire ENET0_PTP_PDELAY_RESP_RX; + wire ENET0_PTP_PDELAY_RESP_TX; + wire ENET0_PTP_SYNC_FRAME_RX; + wire ENET0_PTP_SYNC_FRAME_TX; + wire ENET0_SOF_RX; + wire ENET0_SOF_TX; + wire ENET1_EXT_INTIN; + wire ENET1_GMII_RX_CLK; + wire ENET1_GMII_TX_CLK; + wire ENET1_MDIO_I; + wire ENET1_MDIO_MDC; + wire ENET1_MDIO_O; + wire ENET1_MDIO_T; + wire ENET1_MDIO_T_n; + wire ENET1_PTP_DELAY_REQ_RX; + wire ENET1_PTP_DELAY_REQ_TX; + wire ENET1_PTP_PDELAY_REQ_RX; + wire ENET1_PTP_PDELAY_REQ_TX; + wire ENET1_PTP_PDELAY_RESP_RX; + wire ENET1_PTP_PDELAY_RESP_TX; + wire ENET1_PTP_SYNC_FRAME_RX; + wire ENET1_PTP_SYNC_FRAME_TX; + wire ENET1_SOF_RX; + wire ENET1_SOF_TX; + wire EVENT_EVENTI; + wire EVENT_EVENTO; + wire [1:0]EVENT_STANDBYWFE; + wire [1:0]EVENT_STANDBYWFI; + wire FCLK_CLK0; + wire FCLK_CLK1; + wire FCLK_CLK2; + wire FCLK_CLK3; + wire [1:0]FCLK_CLK_unbuffered; + wire FCLK_RESET0_N; + wire FCLK_RESET1_N; + wire FCLK_RESET2_N; + wire FCLK_RESET3_N; + wire FPGA_IDLE_N; + wire FTMD_TRACEIN_CLK; + wire [31:0]FTMT_F2P_DEBUG; + wire FTMT_F2P_TRIGACK_0; + wire FTMT_F2P_TRIGACK_1; + wire FTMT_F2P_TRIGACK_2; + wire FTMT_F2P_TRIGACK_3; + wire FTMT_F2P_TRIG_0; + wire FTMT_F2P_TRIG_1; + wire FTMT_F2P_TRIG_2; + wire FTMT_F2P_TRIG_3; + wire [31:0]FTMT_P2F_DEBUG; + wire FTMT_P2F_TRIGACK_0; + wire FTMT_P2F_TRIGACK_1; + wire FTMT_P2F_TRIGACK_2; + wire FTMT_P2F_TRIGACK_3; + wire FTMT_P2F_TRIG_0; + wire FTMT_P2F_TRIG_1; + wire FTMT_P2F_TRIG_2; + wire FTMT_P2F_TRIG_3; + wire [63:0]GPIO_I; + wire [63:0]GPIO_O; + wire [63:0]GPIO_T; + wire I2C0_SCL_I; + wire I2C0_SCL_O; + wire I2C0_SCL_T; + wire I2C0_SCL_T_n; + wire I2C0_SDA_I; + wire I2C0_SDA_O; + wire I2C0_SDA_T; + wire I2C0_SDA_T_n; + wire I2C1_SCL_I; + wire I2C1_SCL_O; + wire I2C1_SCL_T; + wire I2C1_SCL_T_n; + wire I2C1_SDA_I; + wire I2C1_SDA_O; + wire I2C1_SDA_T; + wire I2C1_SDA_T_n; + wire [0:0]IRQ_F2P; + wire IRQ_P2F_CAN0; + wire IRQ_P2F_CAN1; + wire IRQ_P2F_CTI; + wire IRQ_P2F_DMAC0; + wire IRQ_P2F_DMAC1; + wire IRQ_P2F_DMAC2; + wire IRQ_P2F_DMAC3; + wire IRQ_P2F_DMAC4; + wire IRQ_P2F_DMAC5; + wire IRQ_P2F_DMAC6; + wire IRQ_P2F_DMAC7; + wire IRQ_P2F_DMAC_ABORT; + wire IRQ_P2F_ENET0; + wire IRQ_P2F_ENET1; + wire IRQ_P2F_ENET_WAKE0; + wire IRQ_P2F_ENET_WAKE1; + wire IRQ_P2F_GPIO; + wire IRQ_P2F_I2C0; + wire IRQ_P2F_I2C1; + wire IRQ_P2F_QSPI; + wire IRQ_P2F_SDIO0; + wire IRQ_P2F_SDIO1; + wire IRQ_P2F_SMC; + wire IRQ_P2F_SPI0; + wire IRQ_P2F_SPI1; + wire IRQ_P2F_UART0; + wire IRQ_P2F_UART1; + wire IRQ_P2F_USB0; + wire IRQ_P2F_USB1; + wire [31:0]MIO; + wire M_AXI_GP0_ACLK; + wire [31:0]M_AXI_GP0_ARADDR; + wire [1:0]M_AXI_GP0_ARBURST; + wire [3:0]\^M_AXI_GP0_ARCACHE ; + wire M_AXI_GP0_ARESETN; + wire [11:0]M_AXI_GP0_ARID; + wire [3:0]M_AXI_GP0_ARLEN; + wire [1:0]M_AXI_GP0_ARLOCK; + wire [2:0]M_AXI_GP0_ARPROT; + wire [3:0]M_AXI_GP0_ARQOS; + wire M_AXI_GP0_ARREADY; + wire [1:0]\^M_AXI_GP0_ARSIZE ; + wire M_AXI_GP0_ARVALID; + wire [31:0]M_AXI_GP0_AWADDR; + wire [1:0]M_AXI_GP0_AWBURST; + wire [3:0]\^M_AXI_GP0_AWCACHE ; + wire [11:0]M_AXI_GP0_AWID; + wire [3:0]M_AXI_GP0_AWLEN; + wire [1:0]M_AXI_GP0_AWLOCK; + wire [2:0]M_AXI_GP0_AWPROT; + wire [3:0]M_AXI_GP0_AWQOS; + wire M_AXI_GP0_AWREADY; + wire [1:0]\^M_AXI_GP0_AWSIZE ; + wire M_AXI_GP0_AWVALID; + wire [11:0]M_AXI_GP0_BID; + wire M_AXI_GP0_BREADY; + wire [1:0]M_AXI_GP0_BRESP; + wire M_AXI_GP0_BVALID; + wire [31:0]M_AXI_GP0_RDATA; + wire [11:0]M_AXI_GP0_RID; + wire M_AXI_GP0_RLAST; + wire M_AXI_GP0_RREADY; + wire [1:0]M_AXI_GP0_RRESP; + wire M_AXI_GP0_RVALID; + wire [31:0]M_AXI_GP0_WDATA; + wire [11:0]M_AXI_GP0_WID; + wire M_AXI_GP0_WLAST; + wire M_AXI_GP0_WREADY; + wire [3:0]M_AXI_GP0_WSTRB; + wire M_AXI_GP0_WVALID; + wire M_AXI_GP1_ACLK; + wire [31:0]M_AXI_GP1_ARADDR; + wire [1:0]M_AXI_GP1_ARBURST; + wire [3:0]\^M_AXI_GP1_ARCACHE ; + wire M_AXI_GP1_ARESETN; + wire [11:0]M_AXI_GP1_ARID; + wire [3:0]M_AXI_GP1_ARLEN; + wire [1:0]M_AXI_GP1_ARLOCK; + wire [2:0]M_AXI_GP1_ARPROT; + wire [3:0]M_AXI_GP1_ARQOS; + wire M_AXI_GP1_ARREADY; + wire [1:0]\^M_AXI_GP1_ARSIZE ; + wire M_AXI_GP1_ARVALID; + wire [31:0]M_AXI_GP1_AWADDR; + wire [1:0]M_AXI_GP1_AWBURST; + wire [3:0]\^M_AXI_GP1_AWCACHE ; + wire [11:0]M_AXI_GP1_AWID; + wire [3:0]M_AXI_GP1_AWLEN; + wire [1:0]M_AXI_GP1_AWLOCK; + wire [2:0]M_AXI_GP1_AWPROT; + wire [3:0]M_AXI_GP1_AWQOS; + wire M_AXI_GP1_AWREADY; + wire [1:0]\^M_AXI_GP1_AWSIZE ; + wire M_AXI_GP1_AWVALID; + wire [11:0]M_AXI_GP1_BID; + wire M_AXI_GP1_BREADY; + wire [1:0]M_AXI_GP1_BRESP; + wire M_AXI_GP1_BVALID; + wire [31:0]M_AXI_GP1_RDATA; + wire [11:0]M_AXI_GP1_RID; + wire M_AXI_GP1_RLAST; + wire M_AXI_GP1_RREADY; + wire [1:0]M_AXI_GP1_RRESP; + wire M_AXI_GP1_RVALID; + wire [31:0]M_AXI_GP1_WDATA; + wire [11:0]M_AXI_GP1_WID; + wire M_AXI_GP1_WLAST; + wire M_AXI_GP1_WREADY; + wire [3:0]M_AXI_GP1_WSTRB; + wire M_AXI_GP1_WVALID; + wire PJTAG_TCK; + wire PJTAG_TDI; + wire PJTAG_TMS; + wire PS_CLK; + wire PS_PORB; + wire PS_SRSTB; + wire SDIO0_BUSPOW; + wire [2:0]SDIO0_BUSVOLT; + wire SDIO0_CDN; + wire SDIO0_CLK; + wire SDIO0_CLK_FB; + wire SDIO0_CMD_I; + wire SDIO0_CMD_O; + wire SDIO0_CMD_T; + wire SDIO0_CMD_T_n; + wire [3:0]SDIO0_DATA_I; + wire [3:0]SDIO0_DATA_O; + wire [3:0]SDIO0_DATA_T; + wire [3:0]SDIO0_DATA_T_n; + wire SDIO0_LED; + wire SDIO0_WP; + wire SDIO1_BUSPOW; + wire [2:0]SDIO1_BUSVOLT; + wire SDIO1_CDN; + wire SDIO1_CLK; + wire SDIO1_CLK_FB; + wire SDIO1_CMD_I; + wire SDIO1_CMD_O; + wire SDIO1_CMD_T; + wire SDIO1_CMD_T_n; + wire [3:0]SDIO1_DATA_I; + wire [3:0]SDIO1_DATA_O; + wire [3:0]SDIO1_DATA_T; + wire [3:0]SDIO1_DATA_T_n; + wire SDIO1_LED; + wire SDIO1_WP; + wire SPI0_MISO_I; + wire SPI0_MISO_O; + wire SPI0_MISO_T; + wire SPI0_MISO_T_n; + wire SPI0_MOSI_I; + wire SPI0_MOSI_O; + wire SPI0_MOSI_T; + wire SPI0_MOSI_T_n; + wire SPI0_SCLK_I; + wire SPI0_SCLK_O; + wire SPI0_SCLK_T; + wire SPI0_SCLK_T_n; + wire SPI0_SS1_O; + wire SPI0_SS2_O; + wire SPI0_SS_I; + wire SPI0_SS_O; + wire SPI0_SS_T; + wire SPI0_SS_T_n; + wire SPI1_MISO_I; + wire SPI1_MISO_O; + wire SPI1_MISO_T; + wire SPI1_MISO_T_n; + wire SPI1_MOSI_I; + wire SPI1_MOSI_O; + wire SPI1_MOSI_T; + wire SPI1_MOSI_T_n; + wire SPI1_SCLK_I; + wire SPI1_SCLK_O; + wire SPI1_SCLK_T; + wire SPI1_SCLK_T_n; + wire SPI1_SS1_O; + wire SPI1_SS2_O; + wire SPI1_SS_I; + wire SPI1_SS_O; + wire SPI1_SS_T; + wire SPI1_SS_T_n; + wire SRAM_INTIN; + wire S_AXI_ACP_ACLK; + wire [31:0]S_AXI_ACP_ARADDR; + wire [1:0]S_AXI_ACP_ARBURST; + wire [3:0]S_AXI_ACP_ARCACHE; + wire S_AXI_ACP_ARESETN; + wire [2:0]S_AXI_ACP_ARID; + wire [3:0]S_AXI_ACP_ARLEN; + wire [1:0]S_AXI_ACP_ARLOCK; + wire [2:0]S_AXI_ACP_ARPROT; + wire [3:0]S_AXI_ACP_ARQOS; + wire S_AXI_ACP_ARREADY; + wire [2:0]S_AXI_ACP_ARSIZE; + wire [4:0]S_AXI_ACP_ARUSER; + wire S_AXI_ACP_ARVALID; + wire [31:0]S_AXI_ACP_AWADDR; + wire [1:0]S_AXI_ACP_AWBURST; + wire [3:0]S_AXI_ACP_AWCACHE; + wire [2:0]S_AXI_ACP_AWID; + wire [3:0]S_AXI_ACP_AWLEN; + wire [1:0]S_AXI_ACP_AWLOCK; + wire [2:0]S_AXI_ACP_AWPROT; + wire [3:0]S_AXI_ACP_AWQOS; + wire S_AXI_ACP_AWREADY; + wire [2:0]S_AXI_ACP_AWSIZE; + wire [4:0]S_AXI_ACP_AWUSER; + wire S_AXI_ACP_AWVALID; + wire [2:0]S_AXI_ACP_BID; + wire S_AXI_ACP_BREADY; + wire [1:0]S_AXI_ACP_BRESP; + wire S_AXI_ACP_BVALID; + wire [63:0]S_AXI_ACP_RDATA; + wire [2:0]S_AXI_ACP_RID; + wire S_AXI_ACP_RLAST; + wire S_AXI_ACP_RREADY; + wire [1:0]S_AXI_ACP_RRESP; + wire S_AXI_ACP_RVALID; + wire [63:0]S_AXI_ACP_WDATA; + wire [2:0]S_AXI_ACP_WID; + wire S_AXI_ACP_WLAST; + wire S_AXI_ACP_WREADY; + wire [7:0]S_AXI_ACP_WSTRB; + wire S_AXI_ACP_WVALID; + wire S_AXI_GP0_ACLK; + wire [31:0]S_AXI_GP0_ARADDR; + wire [1:0]S_AXI_GP0_ARBURST; + wire [3:0]S_AXI_GP0_ARCACHE; + wire S_AXI_GP0_ARESETN; + wire [5:0]S_AXI_GP0_ARID; + wire [3:0]S_AXI_GP0_ARLEN; + wire [1:0]S_AXI_GP0_ARLOCK; + wire [2:0]S_AXI_GP0_ARPROT; + wire [3:0]S_AXI_GP0_ARQOS; + wire S_AXI_GP0_ARREADY; + wire [2:0]S_AXI_GP0_ARSIZE; + wire S_AXI_GP0_ARVALID; + wire [31:0]S_AXI_GP0_AWADDR; + wire [1:0]S_AXI_GP0_AWBURST; + wire [3:0]S_AXI_GP0_AWCACHE; + wire [5:0]S_AXI_GP0_AWID; + wire [3:0]S_AXI_GP0_AWLEN; + wire [1:0]S_AXI_GP0_AWLOCK; + wire [2:0]S_AXI_GP0_AWPROT; + wire [3:0]S_AXI_GP0_AWQOS; + wire S_AXI_GP0_AWREADY; + wire [2:0]S_AXI_GP0_AWSIZE; + wire S_AXI_GP0_AWVALID; + wire [5:0]S_AXI_GP0_BID; + wire S_AXI_GP0_BREADY; + wire [1:0]S_AXI_GP0_BRESP; + wire S_AXI_GP0_BVALID; + wire [31:0]S_AXI_GP0_RDATA; + wire [5:0]S_AXI_GP0_RID; + wire S_AXI_GP0_RLAST; + wire S_AXI_GP0_RREADY; + wire [1:0]S_AXI_GP0_RRESP; + wire S_AXI_GP0_RVALID; + wire [31:0]S_AXI_GP0_WDATA; + wire [5:0]S_AXI_GP0_WID; + wire S_AXI_GP0_WLAST; + wire S_AXI_GP0_WREADY; + wire [3:0]S_AXI_GP0_WSTRB; + wire S_AXI_GP0_WVALID; + wire S_AXI_GP1_ACLK; + wire [31:0]S_AXI_GP1_ARADDR; + wire [1:0]S_AXI_GP1_ARBURST; + wire [3:0]S_AXI_GP1_ARCACHE; + wire S_AXI_GP1_ARESETN; + wire [5:0]S_AXI_GP1_ARID; + wire [3:0]S_AXI_GP1_ARLEN; + wire [1:0]S_AXI_GP1_ARLOCK; + wire [2:0]S_AXI_GP1_ARPROT; + wire [3:0]S_AXI_GP1_ARQOS; + wire S_AXI_GP1_ARREADY; + wire [2:0]S_AXI_GP1_ARSIZE; + wire S_AXI_GP1_ARVALID; + wire [31:0]S_AXI_GP1_AWADDR; + wire [1:0]S_AXI_GP1_AWBURST; + wire [3:0]S_AXI_GP1_AWCACHE; + wire [5:0]S_AXI_GP1_AWID; + wire [3:0]S_AXI_GP1_AWLEN; + wire [1:0]S_AXI_GP1_AWLOCK; + wire [2:0]S_AXI_GP1_AWPROT; + wire [3:0]S_AXI_GP1_AWQOS; + wire S_AXI_GP1_AWREADY; + wire [2:0]S_AXI_GP1_AWSIZE; + wire S_AXI_GP1_AWVALID; + wire [5:0]S_AXI_GP1_BID; + wire S_AXI_GP1_BREADY; + wire [1:0]S_AXI_GP1_BRESP; + wire S_AXI_GP1_BVALID; + wire [31:0]S_AXI_GP1_RDATA; + wire [5:0]S_AXI_GP1_RID; + wire S_AXI_GP1_RLAST; + wire S_AXI_GP1_RREADY; + wire [1:0]S_AXI_GP1_RRESP; + wire S_AXI_GP1_RVALID; + wire [31:0]S_AXI_GP1_WDATA; + wire [5:0]S_AXI_GP1_WID; + wire S_AXI_GP1_WLAST; + wire S_AXI_GP1_WREADY; + wire [3:0]S_AXI_GP1_WSTRB; + wire S_AXI_GP1_WVALID; + wire S_AXI_HP0_ACLK; + wire [31:0]S_AXI_HP0_ARADDR; + wire [1:0]S_AXI_HP0_ARBURST; + wire [3:0]S_AXI_HP0_ARCACHE; + wire S_AXI_HP0_ARESETN; + wire [5:0]S_AXI_HP0_ARID; + wire [3:0]S_AXI_HP0_ARLEN; + wire [1:0]S_AXI_HP0_ARLOCK; + wire [2:0]S_AXI_HP0_ARPROT; + wire [3:0]S_AXI_HP0_ARQOS; + wire S_AXI_HP0_ARREADY; + wire [2:0]S_AXI_HP0_ARSIZE; + wire S_AXI_HP0_ARVALID; + wire [31:0]S_AXI_HP0_AWADDR; + wire [1:0]S_AXI_HP0_AWBURST; + wire [3:0]S_AXI_HP0_AWCACHE; + wire [5:0]S_AXI_HP0_AWID; + wire [3:0]S_AXI_HP0_AWLEN; + wire [1:0]S_AXI_HP0_AWLOCK; + wire [2:0]S_AXI_HP0_AWPROT; + wire [3:0]S_AXI_HP0_AWQOS; + wire S_AXI_HP0_AWREADY; + wire [2:0]S_AXI_HP0_AWSIZE; + wire S_AXI_HP0_AWVALID; + wire [5:0]S_AXI_HP0_BID; + wire S_AXI_HP0_BREADY; + wire [1:0]S_AXI_HP0_BRESP; + wire S_AXI_HP0_BVALID; + wire [2:0]S_AXI_HP0_RACOUNT; + wire [7:0]S_AXI_HP0_RCOUNT; + wire [63:0]S_AXI_HP0_RDATA; + wire S_AXI_HP0_RDISSUECAP1_EN; + wire [5:0]S_AXI_HP0_RID; + wire S_AXI_HP0_RLAST; + wire S_AXI_HP0_RREADY; + wire [1:0]S_AXI_HP0_RRESP; + wire S_AXI_HP0_RVALID; + wire [5:0]S_AXI_HP0_WACOUNT; + wire [7:0]S_AXI_HP0_WCOUNT; + wire [63:0]S_AXI_HP0_WDATA; + wire [5:0]S_AXI_HP0_WID; + wire S_AXI_HP0_WLAST; + wire S_AXI_HP0_WREADY; + wire S_AXI_HP0_WRISSUECAP1_EN; + wire [7:0]S_AXI_HP0_WSTRB; + wire S_AXI_HP0_WVALID; + wire S_AXI_HP1_ACLK; + wire [31:0]S_AXI_HP1_ARADDR; + wire [1:0]S_AXI_HP1_ARBURST; + wire [3:0]S_AXI_HP1_ARCACHE; + wire S_AXI_HP1_ARESETN; + wire [5:0]S_AXI_HP1_ARID; + wire [3:0]S_AXI_HP1_ARLEN; + wire [1:0]S_AXI_HP1_ARLOCK; + wire [2:0]S_AXI_HP1_ARPROT; + wire [3:0]S_AXI_HP1_ARQOS; + wire S_AXI_HP1_ARREADY; + wire [2:0]S_AXI_HP1_ARSIZE; + wire S_AXI_HP1_ARVALID; + wire [31:0]S_AXI_HP1_AWADDR; + wire [1:0]S_AXI_HP1_AWBURST; + wire [3:0]S_AXI_HP1_AWCACHE; + wire [5:0]S_AXI_HP1_AWID; + wire [3:0]S_AXI_HP1_AWLEN; + wire [1:0]S_AXI_HP1_AWLOCK; + wire [2:0]S_AXI_HP1_AWPROT; + wire [3:0]S_AXI_HP1_AWQOS; + wire S_AXI_HP1_AWREADY; + wire [2:0]S_AXI_HP1_AWSIZE; + wire S_AXI_HP1_AWVALID; + wire [5:0]S_AXI_HP1_BID; + wire S_AXI_HP1_BREADY; + wire [1:0]S_AXI_HP1_BRESP; + wire S_AXI_HP1_BVALID; + wire [2:0]S_AXI_HP1_RACOUNT; + wire [7:0]S_AXI_HP1_RCOUNT; + wire [63:0]S_AXI_HP1_RDATA; + wire S_AXI_HP1_RDISSUECAP1_EN; + wire [5:0]S_AXI_HP1_RID; + wire S_AXI_HP1_RLAST; + wire S_AXI_HP1_RREADY; + wire [1:0]S_AXI_HP1_RRESP; + wire S_AXI_HP1_RVALID; + wire [5:0]S_AXI_HP1_WACOUNT; + wire [7:0]S_AXI_HP1_WCOUNT; + wire [63:0]S_AXI_HP1_WDATA; + wire [5:0]S_AXI_HP1_WID; + wire S_AXI_HP1_WLAST; + wire S_AXI_HP1_WREADY; + wire S_AXI_HP1_WRISSUECAP1_EN; + wire [7:0]S_AXI_HP1_WSTRB; + wire S_AXI_HP1_WVALID; + wire S_AXI_HP2_ACLK; + wire [31:0]S_AXI_HP2_ARADDR; + wire [1:0]S_AXI_HP2_ARBURST; + wire [3:0]S_AXI_HP2_ARCACHE; + wire S_AXI_HP2_ARESETN; + wire [5:0]S_AXI_HP2_ARID; + wire [3:0]S_AXI_HP2_ARLEN; + wire [1:0]S_AXI_HP2_ARLOCK; + wire [2:0]S_AXI_HP2_ARPROT; + wire [3:0]S_AXI_HP2_ARQOS; + wire S_AXI_HP2_ARREADY; + wire [2:0]S_AXI_HP2_ARSIZE; + wire S_AXI_HP2_ARVALID; + wire [31:0]S_AXI_HP2_AWADDR; + wire [1:0]S_AXI_HP2_AWBURST; + wire [3:0]S_AXI_HP2_AWCACHE; + wire [5:0]S_AXI_HP2_AWID; + wire [3:0]S_AXI_HP2_AWLEN; + wire [1:0]S_AXI_HP2_AWLOCK; + wire [2:0]S_AXI_HP2_AWPROT; + wire [3:0]S_AXI_HP2_AWQOS; + wire S_AXI_HP2_AWREADY; + wire [2:0]S_AXI_HP2_AWSIZE; + wire S_AXI_HP2_AWVALID; + wire [5:0]S_AXI_HP2_BID; + wire S_AXI_HP2_BREADY; + wire [1:0]S_AXI_HP2_BRESP; + wire S_AXI_HP2_BVALID; + wire [2:0]S_AXI_HP2_RACOUNT; + wire [7:0]S_AXI_HP2_RCOUNT; + wire [63:0]S_AXI_HP2_RDATA; + wire S_AXI_HP2_RDISSUECAP1_EN; + wire [5:0]S_AXI_HP2_RID; + wire S_AXI_HP2_RLAST; + wire S_AXI_HP2_RREADY; + wire [1:0]S_AXI_HP2_RRESP; + wire S_AXI_HP2_RVALID; + wire [5:0]S_AXI_HP2_WACOUNT; + wire [7:0]S_AXI_HP2_WCOUNT; + wire [63:0]S_AXI_HP2_WDATA; + wire [5:0]S_AXI_HP2_WID; + wire S_AXI_HP2_WLAST; + wire S_AXI_HP2_WREADY; + wire S_AXI_HP2_WRISSUECAP1_EN; + wire [7:0]S_AXI_HP2_WSTRB; + wire S_AXI_HP2_WVALID; + wire S_AXI_HP3_ACLK; + wire [31:0]S_AXI_HP3_ARADDR; + wire [1:0]S_AXI_HP3_ARBURST; + wire [3:0]S_AXI_HP3_ARCACHE; + wire S_AXI_HP3_ARESETN; + wire [5:0]S_AXI_HP3_ARID; + wire [3:0]S_AXI_HP3_ARLEN; + wire [1:0]S_AXI_HP3_ARLOCK; + wire [2:0]S_AXI_HP3_ARPROT; + wire [3:0]S_AXI_HP3_ARQOS; + wire S_AXI_HP3_ARREADY; + wire [2:0]S_AXI_HP3_ARSIZE; + wire S_AXI_HP3_ARVALID; + wire [31:0]S_AXI_HP3_AWADDR; + wire [1:0]S_AXI_HP3_AWBURST; + wire [3:0]S_AXI_HP3_AWCACHE; + wire [5:0]S_AXI_HP3_AWID; + wire [3:0]S_AXI_HP3_AWLEN; + wire [1:0]S_AXI_HP3_AWLOCK; + wire [2:0]S_AXI_HP3_AWPROT; + wire [3:0]S_AXI_HP3_AWQOS; + wire S_AXI_HP3_AWREADY; + wire [2:0]S_AXI_HP3_AWSIZE; + wire S_AXI_HP3_AWVALID; + wire [5:0]S_AXI_HP3_BID; + wire S_AXI_HP3_BREADY; + wire [1:0]S_AXI_HP3_BRESP; + wire S_AXI_HP3_BVALID; + wire [2:0]S_AXI_HP3_RACOUNT; + wire [7:0]S_AXI_HP3_RCOUNT; + wire [63:0]S_AXI_HP3_RDATA; + wire S_AXI_HP3_RDISSUECAP1_EN; + wire [5:0]S_AXI_HP3_RID; + wire S_AXI_HP3_RLAST; + wire S_AXI_HP3_RREADY; + wire [1:0]S_AXI_HP3_RRESP; + wire S_AXI_HP3_RVALID; + wire [5:0]S_AXI_HP3_WACOUNT; + wire [7:0]S_AXI_HP3_WCOUNT; + wire [63:0]S_AXI_HP3_WDATA; + wire [5:0]S_AXI_HP3_WID; + wire S_AXI_HP3_WLAST; + wire S_AXI_HP3_WREADY; + wire S_AXI_HP3_WRISSUECAP1_EN; + wire [7:0]S_AXI_HP3_WSTRB; + wire S_AXI_HP3_WVALID; + wire TRACE_CLK; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[0] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[1] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[2] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[3] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[4] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[5] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[6] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[7] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[0] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[1] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[2] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[3] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[4] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[5] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[6] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[7] ; + wire TTC0_CLK0_IN; + wire TTC0_CLK1_IN; + wire TTC0_CLK2_IN; + wire TTC0_WAVE0_OUT; + wire TTC0_WAVE1_OUT; + wire TTC0_WAVE2_OUT; + wire TTC1_CLK0_IN; + wire TTC1_CLK1_IN; + wire TTC1_CLK2_IN; + wire TTC1_WAVE0_OUT; + wire TTC1_WAVE1_OUT; + wire TTC1_WAVE2_OUT; + wire UART0_CTSN; + wire UART0_DCDN; + wire UART0_DSRN; + wire UART0_DTRN; + wire UART0_RIN; + wire UART0_RTSN; + wire UART0_RX; + wire UART0_TX; + wire UART1_CTSN; + wire UART1_DCDN; + wire UART1_DSRN; + wire UART1_DTRN; + wire UART1_RIN; + wire UART1_RTSN; + wire UART1_RX; + wire UART1_TX; + wire [1:0]USB0_PORT_INDCTL; + wire USB0_VBUS_PWRFAULT; + wire USB0_VBUS_PWRSELECT; + wire [1:0]USB1_PORT_INDCTL; + wire USB1_VBUS_PWRFAULT; + wire USB1_VBUS_PWRSELECT; + wire WDT_CLK_IN; + wire WDT_RST_OUT; + wire [14:0]buffered_DDR_Addr; + wire [2:0]buffered_DDR_BankAddr; + wire buffered_DDR_CAS_n; + wire buffered_DDR_CKE; + wire buffered_DDR_CS_n; + wire buffered_DDR_Clk; + wire buffered_DDR_Clk_n; + wire [1:0]buffered_DDR_DM; + wire [15:0]buffered_DDR_DQ; + wire [1:0]buffered_DDR_DQS; + wire [1:0]buffered_DDR_DQS_n; + wire buffered_DDR_DRSTB; + wire buffered_DDR_ODT; + wire buffered_DDR_RAS_n; + wire buffered_DDR_VRN; + wire buffered_DDR_VRP; + wire buffered_DDR_WEB; + wire [31:0]buffered_MIO; + wire buffered_PS_CLK; + wire buffered_PS_PORB; + wire buffered_PS_SRSTB; + wire [63:0]gpio_out_t_n; + wire NLW_PS7_i_EMIOENET0GMIITXEN_UNCONNECTED; + wire NLW_PS7_i_EMIOENET0GMIITXER_UNCONNECTED; + wire NLW_PS7_i_EMIOENET1GMIITXEN_UNCONNECTED; + wire NLW_PS7_i_EMIOENET1GMIITXER_UNCONNECTED; + wire NLW_PS7_i_EMIOPJTAGTDO_UNCONNECTED; + wire NLW_PS7_i_EMIOPJTAGTDTN_UNCONNECTED; + wire NLW_PS7_i_EMIOTRACECTL_UNCONNECTED; + wire [3:2]NLW_PS7_i_DDRDM_UNCONNECTED; + wire [31:16]NLW_PS7_i_DDRDQ_UNCONNECTED; + wire [3:2]NLW_PS7_i_DDRDQSN_UNCONNECTED; + wire [3:2]NLW_PS7_i_DDRDQSP_UNCONNECTED; + wire [7:0]NLW_PS7_i_EMIOENET0GMIITXD_UNCONNECTED; + wire [7:0]NLW_PS7_i_EMIOENET1GMIITXD_UNCONNECTED; + wire [31:0]NLW_PS7_i_EMIOTRACEDATA_UNCONNECTED; + wire [1:1]NLW_PS7_i_MAXIGP0ARCACHE_UNCONNECTED; + wire [1:1]NLW_PS7_i_MAXIGP0AWCACHE_UNCONNECTED; + wire [1:1]NLW_PS7_i_MAXIGP1ARCACHE_UNCONNECTED; + wire [1:1]NLW_PS7_i_MAXIGP1AWCACHE_UNCONNECTED; + wire [51:16]NLW_PS7_i_MIO_UNCONNECTED; + + assign ENET0_GMII_TXD[7] = \ ; + assign ENET0_GMII_TXD[6] = \ ; + assign ENET0_GMII_TXD[5] = \ ; + assign ENET0_GMII_TXD[4] = \ ; + assign ENET0_GMII_TXD[3] = \ ; + assign ENET0_GMII_TXD[2] = \ ; + assign ENET0_GMII_TXD[1] = \ ; + assign ENET0_GMII_TXD[0] = \ ; + assign ENET0_GMII_TX_EN = \ ; + assign ENET0_GMII_TX_ER = \ ; + assign ENET1_GMII_TXD[7] = \ ; + assign ENET1_GMII_TXD[6] = \ ; + assign ENET1_GMII_TXD[5] = \ ; + assign ENET1_GMII_TXD[4] = \ ; + assign ENET1_GMII_TXD[3] = \ ; + assign ENET1_GMII_TXD[2] = \ ; + assign ENET1_GMII_TXD[1] = \ ; + assign ENET1_GMII_TXD[0] = \ ; + assign ENET1_GMII_TX_EN = \ ; + assign ENET1_GMII_TX_ER = \ ; + assign M_AXI_GP0_ARCACHE[3:2] = \^M_AXI_GP0_ARCACHE [3:2]; + assign M_AXI_GP0_ARCACHE[1] = \ ; + assign M_AXI_GP0_ARCACHE[0] = \^M_AXI_GP0_ARCACHE [0]; + assign M_AXI_GP0_ARSIZE[2] = \ ; + assign M_AXI_GP0_ARSIZE[1:0] = \^M_AXI_GP0_ARSIZE [1:0]; + assign M_AXI_GP0_AWCACHE[3:2] = \^M_AXI_GP0_AWCACHE [3:2]; + assign M_AXI_GP0_AWCACHE[1] = \ ; + assign M_AXI_GP0_AWCACHE[0] = \^M_AXI_GP0_AWCACHE [0]; + assign M_AXI_GP0_AWSIZE[2] = \ ; + assign M_AXI_GP0_AWSIZE[1:0] = \^M_AXI_GP0_AWSIZE [1:0]; + assign M_AXI_GP1_ARCACHE[3:2] = \^M_AXI_GP1_ARCACHE [3:2]; + assign M_AXI_GP1_ARCACHE[1] = \ ; + assign M_AXI_GP1_ARCACHE[0] = \^M_AXI_GP1_ARCACHE [0]; + assign M_AXI_GP1_ARSIZE[2] = \ ; + assign M_AXI_GP1_ARSIZE[1:0] = \^M_AXI_GP1_ARSIZE [1:0]; + assign M_AXI_GP1_AWCACHE[3:2] = \^M_AXI_GP1_AWCACHE [3:2]; + assign M_AXI_GP1_AWCACHE[1] = \ ; + assign M_AXI_GP1_AWCACHE[0] = \^M_AXI_GP1_AWCACHE [0]; + assign M_AXI_GP1_AWSIZE[2] = \ ; + assign M_AXI_GP1_AWSIZE[1:0] = \^M_AXI_GP1_AWSIZE [1:0]; + assign PJTAG_TDO = \ ; + assign TRACE_CLK_OUT = \ ; + assign TRACE_CTL = \TRACE_CTL_PIPE[0] ; + assign TRACE_DATA[1:0] = \TRACE_DATA_PIPE[0] ; + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_CAS_n_BIBUF + (.IO(buffered_DDR_CAS_n), + .PAD(DDR_CAS_n)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_CKE_BIBUF + (.IO(buffered_DDR_CKE), + .PAD(DDR_CKE)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_CS_n_BIBUF + (.IO(buffered_DDR_CS_n), + .PAD(DDR_CS_n)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_Clk_BIBUF + (.IO(buffered_DDR_Clk), + .PAD(DDR_Clk)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_Clk_n_BIBUF + (.IO(buffered_DDR_Clk_n), + .PAD(DDR_Clk_n)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_DRSTB_BIBUF + (.IO(buffered_DDR_DRSTB), + .PAD(DDR_DRSTB)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_ODT_BIBUF + (.IO(buffered_DDR_ODT), + .PAD(DDR_ODT)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_RAS_n_BIBUF + (.IO(buffered_DDR_RAS_n), + .PAD(DDR_RAS_n)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_VRN_BIBUF + (.IO(buffered_DDR_VRN), + .PAD(DDR_VRN)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_VRP_BIBUF + (.IO(buffered_DDR_VRP), + .PAD(DDR_VRP)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_WEB_BIBUF + (.IO(buffered_DDR_WEB), + .PAD(DDR_WEB)); + LUT1 #( + .INIT(2'h1)) + ENET0_MDIO_T_INST_0 + (.I0(ENET0_MDIO_T_n), + .O(ENET0_MDIO_T)); + LUT1 #( + .INIT(2'h1)) + ENET1_MDIO_T_INST_0 + (.I0(ENET1_MDIO_T_n), + .O(ENET1_MDIO_T)); + GND GND + (.G(\ )); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[0]_INST_0 + (.I0(gpio_out_t_n[0]), + .O(GPIO_T[0])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[10]_INST_0 + (.I0(gpio_out_t_n[10]), + .O(GPIO_T[10])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[11]_INST_0 + (.I0(gpio_out_t_n[11]), + .O(GPIO_T[11])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[12]_INST_0 + (.I0(gpio_out_t_n[12]), + .O(GPIO_T[12])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[13]_INST_0 + (.I0(gpio_out_t_n[13]), + .O(GPIO_T[13])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[14]_INST_0 + (.I0(gpio_out_t_n[14]), + .O(GPIO_T[14])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[15]_INST_0 + (.I0(gpio_out_t_n[15]), + .O(GPIO_T[15])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[16]_INST_0 + (.I0(gpio_out_t_n[16]), + .O(GPIO_T[16])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[17]_INST_0 + (.I0(gpio_out_t_n[17]), + .O(GPIO_T[17])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[18]_INST_0 + (.I0(gpio_out_t_n[18]), + .O(GPIO_T[18])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[19]_INST_0 + (.I0(gpio_out_t_n[19]), + .O(GPIO_T[19])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[1]_INST_0 + (.I0(gpio_out_t_n[1]), + .O(GPIO_T[1])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[20]_INST_0 + (.I0(gpio_out_t_n[20]), + .O(GPIO_T[20])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[21]_INST_0 + (.I0(gpio_out_t_n[21]), + .O(GPIO_T[21])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[22]_INST_0 + (.I0(gpio_out_t_n[22]), + .O(GPIO_T[22])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[23]_INST_0 + (.I0(gpio_out_t_n[23]), + .O(GPIO_T[23])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[24]_INST_0 + (.I0(gpio_out_t_n[24]), + .O(GPIO_T[24])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[25]_INST_0 + (.I0(gpio_out_t_n[25]), + .O(GPIO_T[25])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[26]_INST_0 + (.I0(gpio_out_t_n[26]), + .O(GPIO_T[26])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[27]_INST_0 + (.I0(gpio_out_t_n[27]), + .O(GPIO_T[27])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[28]_INST_0 + (.I0(gpio_out_t_n[28]), + .O(GPIO_T[28])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[29]_INST_0 + (.I0(gpio_out_t_n[29]), + .O(GPIO_T[29])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[2]_INST_0 + (.I0(gpio_out_t_n[2]), + .O(GPIO_T[2])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[30]_INST_0 + (.I0(gpio_out_t_n[30]), + .O(GPIO_T[30])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[31]_INST_0 + (.I0(gpio_out_t_n[31]), + .O(GPIO_T[31])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[32]_INST_0 + (.I0(gpio_out_t_n[32]), + .O(GPIO_T[32])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[33]_INST_0 + (.I0(gpio_out_t_n[33]), + .O(GPIO_T[33])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[34]_INST_0 + (.I0(gpio_out_t_n[34]), + .O(GPIO_T[34])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[35]_INST_0 + (.I0(gpio_out_t_n[35]), + .O(GPIO_T[35])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[36]_INST_0 + (.I0(gpio_out_t_n[36]), + .O(GPIO_T[36])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[37]_INST_0 + (.I0(gpio_out_t_n[37]), + .O(GPIO_T[37])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[38]_INST_0 + (.I0(gpio_out_t_n[38]), + .O(GPIO_T[38])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[39]_INST_0 + (.I0(gpio_out_t_n[39]), + .O(GPIO_T[39])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[3]_INST_0 + (.I0(gpio_out_t_n[3]), + .O(GPIO_T[3])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[40]_INST_0 + (.I0(gpio_out_t_n[40]), + .O(GPIO_T[40])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[41]_INST_0 + (.I0(gpio_out_t_n[41]), + .O(GPIO_T[41])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[42]_INST_0 + (.I0(gpio_out_t_n[42]), + .O(GPIO_T[42])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[43]_INST_0 + (.I0(gpio_out_t_n[43]), + .O(GPIO_T[43])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[44]_INST_0 + (.I0(gpio_out_t_n[44]), + .O(GPIO_T[44])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[45]_INST_0 + (.I0(gpio_out_t_n[45]), + .O(GPIO_T[45])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[46]_INST_0 + (.I0(gpio_out_t_n[46]), + .O(GPIO_T[46])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[47]_INST_0 + (.I0(gpio_out_t_n[47]), + .O(GPIO_T[47])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[48]_INST_0 + (.I0(gpio_out_t_n[48]), + .O(GPIO_T[48])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[49]_INST_0 + (.I0(gpio_out_t_n[49]), + .O(GPIO_T[49])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[4]_INST_0 + (.I0(gpio_out_t_n[4]), + .O(GPIO_T[4])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[50]_INST_0 + (.I0(gpio_out_t_n[50]), + .O(GPIO_T[50])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[51]_INST_0 + (.I0(gpio_out_t_n[51]), + .O(GPIO_T[51])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[52]_INST_0 + (.I0(gpio_out_t_n[52]), + .O(GPIO_T[52])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[53]_INST_0 + (.I0(gpio_out_t_n[53]), + .O(GPIO_T[53])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[54]_INST_0 + (.I0(gpio_out_t_n[54]), + .O(GPIO_T[54])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[55]_INST_0 + (.I0(gpio_out_t_n[55]), + .O(GPIO_T[55])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[56]_INST_0 + (.I0(gpio_out_t_n[56]), + .O(GPIO_T[56])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[57]_INST_0 + (.I0(gpio_out_t_n[57]), + .O(GPIO_T[57])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[58]_INST_0 + (.I0(gpio_out_t_n[58]), + .O(GPIO_T[58])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[59]_INST_0 + (.I0(gpio_out_t_n[59]), + .O(GPIO_T[59])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[5]_INST_0 + (.I0(gpio_out_t_n[5]), + .O(GPIO_T[5])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[60]_INST_0 + (.I0(gpio_out_t_n[60]), + .O(GPIO_T[60])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[61]_INST_0 + (.I0(gpio_out_t_n[61]), + .O(GPIO_T[61])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[62]_INST_0 + (.I0(gpio_out_t_n[62]), + .O(GPIO_T[62])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[63]_INST_0 + (.I0(gpio_out_t_n[63]), + .O(GPIO_T[63])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[6]_INST_0 + (.I0(gpio_out_t_n[6]), + .O(GPIO_T[6])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[7]_INST_0 + (.I0(gpio_out_t_n[7]), + .O(GPIO_T[7])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[8]_INST_0 + (.I0(gpio_out_t_n[8]), + .O(GPIO_T[8])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[9]_INST_0 + (.I0(gpio_out_t_n[9]), + .O(GPIO_T[9])); + LUT1 #( + .INIT(2'h1)) + I2C0_SCL_T_INST_0 + (.I0(I2C0_SCL_T_n), + .O(I2C0_SCL_T)); + LUT1 #( + .INIT(2'h1)) + I2C0_SDA_T_INST_0 + (.I0(I2C0_SDA_T_n), + .O(I2C0_SDA_T)); + LUT1 #( + .INIT(2'h1)) + I2C1_SCL_T_INST_0 + (.I0(I2C1_SCL_T_n), + .O(I2C1_SCL_T)); + LUT1 #( + .INIT(2'h1)) + I2C1_SDA_T_INST_0 + (.I0(I2C1_SDA_T_n), + .O(I2C1_SDA_T)); + (* BOX_TYPE = "PRIMITIVE" *) + PS7 PS7_i + (.DDRA(buffered_DDR_Addr), + .DDRARB(DDR_ARB), + .DDRBA(buffered_DDR_BankAddr), + .DDRCASB(buffered_DDR_CAS_n), + .DDRCKE(buffered_DDR_CKE), + .DDRCKN(buffered_DDR_Clk_n), + .DDRCKP(buffered_DDR_Clk), + .DDRCSB(buffered_DDR_CS_n), + .DDRDM({NLW_PS7_i_DDRDM_UNCONNECTED[3:2],buffered_DDR_DM}), + .DDRDQ({NLW_PS7_i_DDRDQ_UNCONNECTED[31:16],buffered_DDR_DQ}), + .DDRDQSN({NLW_PS7_i_DDRDQSN_UNCONNECTED[3:2],buffered_DDR_DQS_n}), + .DDRDQSP({NLW_PS7_i_DDRDQSP_UNCONNECTED[3:2],buffered_DDR_DQS}), + .DDRDRSTB(buffered_DDR_DRSTB), + .DDRODT(buffered_DDR_ODT), + .DDRRASB(buffered_DDR_RAS_n), + .DDRVRN(buffered_DDR_VRN), + .DDRVRP(buffered_DDR_VRP), + .DDRWEB(buffered_DDR_WEB), + .DMA0ACLK(DMA0_ACLK), + .DMA0DAREADY(DMA0_DAREADY), + .DMA0DATYPE(DMA0_DATYPE), + .DMA0DAVALID(DMA0_DAVALID), + .DMA0DRLAST(DMA0_DRLAST), + .DMA0DRREADY(DMA0_DRREADY), + .DMA0DRTYPE(DMA0_DRTYPE), + .DMA0DRVALID(DMA0_DRVALID), + .DMA0RSTN(DMA0_RSTN), + .DMA1ACLK(DMA1_ACLK), + .DMA1DAREADY(DMA1_DAREADY), + .DMA1DATYPE(DMA1_DATYPE), + .DMA1DAVALID(DMA1_DAVALID), + .DMA1DRLAST(DMA1_DRLAST), + .DMA1DRREADY(DMA1_DRREADY), + .DMA1DRTYPE(DMA1_DRTYPE), + .DMA1DRVALID(DMA1_DRVALID), + .DMA1RSTN(DMA1_RSTN), + .DMA2ACLK(DMA2_ACLK), + .DMA2DAREADY(DMA2_DAREADY), + .DMA2DATYPE(DMA2_DATYPE), + .DMA2DAVALID(DMA2_DAVALID), + .DMA2DRLAST(DMA2_DRLAST), + .DMA2DRREADY(DMA2_DRREADY), + .DMA2DRTYPE(DMA2_DRTYPE), + .DMA2DRVALID(DMA2_DRVALID), + .DMA2RSTN(DMA2_RSTN), + .DMA3ACLK(DMA3_ACLK), + .DMA3DAREADY(DMA3_DAREADY), + .DMA3DATYPE(DMA3_DATYPE), + .DMA3DAVALID(DMA3_DAVALID), + .DMA3DRLAST(DMA3_DRLAST), + .DMA3DRREADY(DMA3_DRREADY), + .DMA3DRTYPE(DMA3_DRTYPE), + .DMA3DRVALID(DMA3_DRVALID), + .DMA3RSTN(DMA3_RSTN), + .EMIOCAN0PHYRX(CAN0_PHY_RX), + .EMIOCAN0PHYTX(CAN0_PHY_TX), + .EMIOCAN1PHYRX(CAN1_PHY_RX), + .EMIOCAN1PHYTX(CAN1_PHY_TX), + .EMIOENET0EXTINTIN(ENET0_EXT_INTIN), + .EMIOENET0GMIICOL(1'b0), + .EMIOENET0GMIICRS(1'b0), + .EMIOENET0GMIIRXCLK(ENET0_GMII_RX_CLK), + .EMIOENET0GMIIRXD({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .EMIOENET0GMIIRXDV(1'b0), + .EMIOENET0GMIIRXER(1'b0), + .EMIOENET0GMIITXCLK(ENET0_GMII_TX_CLK), + .EMIOENET0GMIITXD(NLW_PS7_i_EMIOENET0GMIITXD_UNCONNECTED[7:0]), + .EMIOENET0GMIITXEN(NLW_PS7_i_EMIOENET0GMIITXEN_UNCONNECTED), + .EMIOENET0GMIITXER(NLW_PS7_i_EMIOENET0GMIITXER_UNCONNECTED), + .EMIOENET0MDIOI(ENET0_MDIO_I), + .EMIOENET0MDIOMDC(ENET0_MDIO_MDC), + .EMIOENET0MDIOO(ENET0_MDIO_O), + .EMIOENET0MDIOTN(ENET0_MDIO_T_n), + .EMIOENET0PTPDELAYREQRX(ENET0_PTP_DELAY_REQ_RX), + .EMIOENET0PTPDELAYREQTX(ENET0_PTP_DELAY_REQ_TX), + .EMIOENET0PTPPDELAYREQRX(ENET0_PTP_PDELAY_REQ_RX), + .EMIOENET0PTPPDELAYREQTX(ENET0_PTP_PDELAY_REQ_TX), + .EMIOENET0PTPPDELAYRESPRX(ENET0_PTP_PDELAY_RESP_RX), + .EMIOENET0PTPPDELAYRESPTX(ENET0_PTP_PDELAY_RESP_TX), + .EMIOENET0PTPSYNCFRAMERX(ENET0_PTP_SYNC_FRAME_RX), + .EMIOENET0PTPSYNCFRAMETX(ENET0_PTP_SYNC_FRAME_TX), + .EMIOENET0SOFRX(ENET0_SOF_RX), + .EMIOENET0SOFTX(ENET0_SOF_TX), + .EMIOENET1EXTINTIN(ENET1_EXT_INTIN), + .EMIOENET1GMIICOL(1'b0), + .EMIOENET1GMIICRS(1'b0), + .EMIOENET1GMIIRXCLK(ENET1_GMII_RX_CLK), + .EMIOENET1GMIIRXD({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .EMIOENET1GMIIRXDV(1'b0), + .EMIOENET1GMIIRXER(1'b0), + .EMIOENET1GMIITXCLK(ENET1_GMII_TX_CLK), + .EMIOENET1GMIITXD(NLW_PS7_i_EMIOENET1GMIITXD_UNCONNECTED[7:0]), + .EMIOENET1GMIITXEN(NLW_PS7_i_EMIOENET1GMIITXEN_UNCONNECTED), + .EMIOENET1GMIITXER(NLW_PS7_i_EMIOENET1GMIITXER_UNCONNECTED), + .EMIOENET1MDIOI(ENET1_MDIO_I), + .EMIOENET1MDIOMDC(ENET1_MDIO_MDC), + .EMIOENET1MDIOO(ENET1_MDIO_O), + .EMIOENET1MDIOTN(ENET1_MDIO_T_n), + .EMIOENET1PTPDELAYREQRX(ENET1_PTP_DELAY_REQ_RX), + .EMIOENET1PTPDELAYREQTX(ENET1_PTP_DELAY_REQ_TX), + .EMIOENET1PTPPDELAYREQRX(ENET1_PTP_PDELAY_REQ_RX), + .EMIOENET1PTPPDELAYREQTX(ENET1_PTP_PDELAY_REQ_TX), + .EMIOENET1PTPPDELAYRESPRX(ENET1_PTP_PDELAY_RESP_RX), + .EMIOENET1PTPPDELAYRESPTX(ENET1_PTP_PDELAY_RESP_TX), + .EMIOENET1PTPSYNCFRAMERX(ENET1_PTP_SYNC_FRAME_RX), + .EMIOENET1PTPSYNCFRAMETX(ENET1_PTP_SYNC_FRAME_TX), + .EMIOENET1SOFRX(ENET1_SOF_RX), + .EMIOENET1SOFTX(ENET1_SOF_TX), + .EMIOGPIOI(GPIO_I), + .EMIOGPIOO(GPIO_O), + .EMIOGPIOTN(gpio_out_t_n), + .EMIOI2C0SCLI(I2C0_SCL_I), + .EMIOI2C0SCLO(I2C0_SCL_O), + .EMIOI2C0SCLTN(I2C0_SCL_T_n), + .EMIOI2C0SDAI(I2C0_SDA_I), + .EMIOI2C0SDAO(I2C0_SDA_O), + .EMIOI2C0SDATN(I2C0_SDA_T_n), + .EMIOI2C1SCLI(I2C1_SCL_I), + .EMIOI2C1SCLO(I2C1_SCL_O), + .EMIOI2C1SCLTN(I2C1_SCL_T_n), + .EMIOI2C1SDAI(I2C1_SDA_I), + .EMIOI2C1SDAO(I2C1_SDA_O), + .EMIOI2C1SDATN(I2C1_SDA_T_n), + .EMIOPJTAGTCK(PJTAG_TCK), + .EMIOPJTAGTDI(PJTAG_TDI), + .EMIOPJTAGTDO(NLW_PS7_i_EMIOPJTAGTDO_UNCONNECTED), + .EMIOPJTAGTDTN(NLW_PS7_i_EMIOPJTAGTDTN_UNCONNECTED), + .EMIOPJTAGTMS(PJTAG_TMS), + .EMIOSDIO0BUSPOW(SDIO0_BUSPOW), + .EMIOSDIO0BUSVOLT(SDIO0_BUSVOLT), + .EMIOSDIO0CDN(SDIO0_CDN), + .EMIOSDIO0CLK(SDIO0_CLK), + .EMIOSDIO0CLKFB(SDIO0_CLK_FB), + .EMIOSDIO0CMDI(SDIO0_CMD_I), + .EMIOSDIO0CMDO(SDIO0_CMD_O), + .EMIOSDIO0CMDTN(SDIO0_CMD_T_n), + .EMIOSDIO0DATAI(SDIO0_DATA_I), + .EMIOSDIO0DATAO(SDIO0_DATA_O), + .EMIOSDIO0DATATN(SDIO0_DATA_T_n), + .EMIOSDIO0LED(SDIO0_LED), + .EMIOSDIO0WP(SDIO0_WP), + .EMIOSDIO1BUSPOW(SDIO1_BUSPOW), + .EMIOSDIO1BUSVOLT(SDIO1_BUSVOLT), + .EMIOSDIO1CDN(SDIO1_CDN), + .EMIOSDIO1CLK(SDIO1_CLK), + .EMIOSDIO1CLKFB(SDIO1_CLK_FB), + .EMIOSDIO1CMDI(SDIO1_CMD_I), + .EMIOSDIO1CMDO(SDIO1_CMD_O), + .EMIOSDIO1CMDTN(SDIO1_CMD_T_n), + .EMIOSDIO1DATAI(SDIO1_DATA_I), + .EMIOSDIO1DATAO(SDIO1_DATA_O), + .EMIOSDIO1DATATN(SDIO1_DATA_T_n), + .EMIOSDIO1LED(SDIO1_LED), + .EMIOSDIO1WP(SDIO1_WP), + .EMIOSPI0MI(SPI0_MISO_I), + .EMIOSPI0MO(SPI0_MOSI_O), + .EMIOSPI0MOTN(SPI0_MOSI_T_n), + .EMIOSPI0SCLKI(SPI0_SCLK_I), + .EMIOSPI0SCLKO(SPI0_SCLK_O), + .EMIOSPI0SCLKTN(SPI0_SCLK_T_n), + .EMIOSPI0SI(SPI0_MOSI_I), + .EMIOSPI0SO(SPI0_MISO_O), + .EMIOSPI0SSIN(SPI0_SS_I), + .EMIOSPI0SSNTN(SPI0_SS_T_n), + .EMIOSPI0SSON({SPI0_SS2_O,SPI0_SS1_O,SPI0_SS_O}), + .EMIOSPI0STN(SPI0_MISO_T_n), + .EMIOSPI1MI(SPI1_MISO_I), + .EMIOSPI1MO(SPI1_MOSI_O), + .EMIOSPI1MOTN(SPI1_MOSI_T_n), + .EMIOSPI1SCLKI(SPI1_SCLK_I), + .EMIOSPI1SCLKO(SPI1_SCLK_O), + .EMIOSPI1SCLKTN(SPI1_SCLK_T_n), + .EMIOSPI1SI(SPI1_MOSI_I), + .EMIOSPI1SO(SPI1_MISO_O), + .EMIOSPI1SSIN(SPI1_SS_I), + .EMIOSPI1SSNTN(SPI1_SS_T_n), + .EMIOSPI1SSON({SPI1_SS2_O,SPI1_SS1_O,SPI1_SS_O}), + .EMIOSPI1STN(SPI1_MISO_T_n), + .EMIOSRAMINTIN(SRAM_INTIN), + .EMIOTRACECLK(TRACE_CLK), + .EMIOTRACECTL(NLW_PS7_i_EMIOTRACECTL_UNCONNECTED), + .EMIOTRACEDATA(NLW_PS7_i_EMIOTRACEDATA_UNCONNECTED[31:0]), + .EMIOTTC0CLKI({TTC0_CLK2_IN,TTC0_CLK1_IN,TTC0_CLK0_IN}), + .EMIOTTC0WAVEO({TTC0_WAVE2_OUT,TTC0_WAVE1_OUT,TTC0_WAVE0_OUT}), + .EMIOTTC1CLKI({TTC1_CLK2_IN,TTC1_CLK1_IN,TTC1_CLK0_IN}), + .EMIOTTC1WAVEO({TTC1_WAVE2_OUT,TTC1_WAVE1_OUT,TTC1_WAVE0_OUT}), + .EMIOUART0CTSN(UART0_CTSN), + .EMIOUART0DCDN(UART0_DCDN), + .EMIOUART0DSRN(UART0_DSRN), + .EMIOUART0DTRN(UART0_DTRN), + .EMIOUART0RIN(UART0_RIN), + .EMIOUART0RTSN(UART0_RTSN), + .EMIOUART0RX(UART0_RX), + .EMIOUART0TX(UART0_TX), + .EMIOUART1CTSN(UART1_CTSN), + .EMIOUART1DCDN(UART1_DCDN), + .EMIOUART1DSRN(UART1_DSRN), + .EMIOUART1DTRN(UART1_DTRN), + .EMIOUART1RIN(UART1_RIN), + .EMIOUART1RTSN(UART1_RTSN), + .EMIOUART1RX(UART1_RX), + .EMIOUART1TX(UART1_TX), + .EMIOUSB0PORTINDCTL(USB0_PORT_INDCTL), + .EMIOUSB0VBUSPWRFAULT(USB0_VBUS_PWRFAULT), + .EMIOUSB0VBUSPWRSELECT(USB0_VBUS_PWRSELECT), + .EMIOUSB1PORTINDCTL(USB1_PORT_INDCTL), + .EMIOUSB1VBUSPWRFAULT(USB1_VBUS_PWRFAULT), + .EMIOUSB1VBUSPWRSELECT(USB1_VBUS_PWRSELECT), + .EMIOWDTCLKI(WDT_CLK_IN), + .EMIOWDTRSTO(WDT_RST_OUT), + .EVENTEVENTI(EVENT_EVENTI), + .EVENTEVENTO(EVENT_EVENTO), + .EVENTSTANDBYWFE(EVENT_STANDBYWFE), + .EVENTSTANDBYWFI(EVENT_STANDBYWFI), + .FCLKCLK({FCLK_CLK3,FCLK_CLK2,FCLK_CLK_unbuffered}), + .FCLKCLKTRIGN({1'b0,1'b0,1'b0,1'b0}), + .FCLKRESETN({FCLK_RESET3_N,FCLK_RESET2_N,FCLK_RESET1_N,FCLK_RESET0_N}), + .FPGAIDLEN(FPGA_IDLE_N), + .FTMDTRACEINATID({1'b0,1'b0,1'b0,1'b0}), + .FTMDTRACEINCLOCK(FTMD_TRACEIN_CLK), + .FTMDTRACEINDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .FTMDTRACEINVALID(1'b0), + .FTMTF2PDEBUG(FTMT_F2P_DEBUG), + .FTMTF2PTRIG({FTMT_F2P_TRIG_3,FTMT_F2P_TRIG_2,FTMT_F2P_TRIG_1,FTMT_F2P_TRIG_0}), + .FTMTF2PTRIGACK({FTMT_F2P_TRIGACK_3,FTMT_F2P_TRIGACK_2,FTMT_F2P_TRIGACK_1,FTMT_F2P_TRIGACK_0}), + .FTMTP2FDEBUG(FTMT_P2F_DEBUG), + .FTMTP2FTRIG({FTMT_P2F_TRIG_3,FTMT_P2F_TRIG_2,FTMT_P2F_TRIG_1,FTMT_P2F_TRIG_0}), + .FTMTP2FTRIGACK({FTMT_P2F_TRIGACK_3,FTMT_P2F_TRIGACK_2,FTMT_P2F_TRIGACK_1,FTMT_P2F_TRIGACK_0}), + .IRQF2P({Core1_nFIQ,Core0_nFIQ,Core1_nIRQ,Core0_nIRQ,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,IRQ_F2P}), + .IRQP2F({IRQ_P2F_DMAC_ABORT,IRQ_P2F_DMAC7,IRQ_P2F_DMAC6,IRQ_P2F_DMAC5,IRQ_P2F_DMAC4,IRQ_P2F_DMAC3,IRQ_P2F_DMAC2,IRQ_P2F_DMAC1,IRQ_P2F_DMAC0,IRQ_P2F_SMC,IRQ_P2F_QSPI,IRQ_P2F_CTI,IRQ_P2F_GPIO,IRQ_P2F_USB0,IRQ_P2F_ENET0,IRQ_P2F_ENET_WAKE0,IRQ_P2F_SDIO0,IRQ_P2F_I2C0,IRQ_P2F_SPI0,IRQ_P2F_UART0,IRQ_P2F_CAN0,IRQ_P2F_USB1,IRQ_P2F_ENET1,IRQ_P2F_ENET_WAKE1,IRQ_P2F_SDIO1,IRQ_P2F_I2C1,IRQ_P2F_SPI1,IRQ_P2F_UART1,IRQ_P2F_CAN1}), + .MAXIGP0ACLK(M_AXI_GP0_ACLK), + .MAXIGP0ARADDR(M_AXI_GP0_ARADDR), + .MAXIGP0ARBURST(M_AXI_GP0_ARBURST), + .MAXIGP0ARCACHE(\^M_AXI_GP0_ARCACHE ), + .MAXIGP0ARESETN(M_AXI_GP0_ARESETN), + .MAXIGP0ARID(M_AXI_GP0_ARID), + .MAXIGP0ARLEN(M_AXI_GP0_ARLEN), + .MAXIGP0ARLOCK(M_AXI_GP0_ARLOCK), + .MAXIGP0ARPROT(M_AXI_GP0_ARPROT), + .MAXIGP0ARQOS(M_AXI_GP0_ARQOS), + .MAXIGP0ARREADY(M_AXI_GP0_ARREADY), + .MAXIGP0ARSIZE(\^M_AXI_GP0_ARSIZE ), + .MAXIGP0ARVALID(M_AXI_GP0_ARVALID), + .MAXIGP0AWADDR(M_AXI_GP0_AWADDR), + .MAXIGP0AWBURST(M_AXI_GP0_AWBURST), + .MAXIGP0AWCACHE(\^M_AXI_GP0_AWCACHE ), + .MAXIGP0AWID(M_AXI_GP0_AWID), + .MAXIGP0AWLEN(M_AXI_GP0_AWLEN), + .MAXIGP0AWLOCK(M_AXI_GP0_AWLOCK), + .MAXIGP0AWPROT(M_AXI_GP0_AWPROT), + .MAXIGP0AWQOS(M_AXI_GP0_AWQOS), + .MAXIGP0AWREADY(M_AXI_GP0_AWREADY), + .MAXIGP0AWSIZE(\^M_AXI_GP0_AWSIZE ), + .MAXIGP0AWVALID(M_AXI_GP0_AWVALID), + .MAXIGP0BID(M_AXI_GP0_BID), + .MAXIGP0BREADY(M_AXI_GP0_BREADY), + .MAXIGP0BRESP(M_AXI_GP0_BRESP), + .MAXIGP0BVALID(M_AXI_GP0_BVALID), + .MAXIGP0RDATA(M_AXI_GP0_RDATA), + .MAXIGP0RID(M_AXI_GP0_RID), + .MAXIGP0RLAST(M_AXI_GP0_RLAST), + .MAXIGP0RREADY(M_AXI_GP0_RREADY), + .MAXIGP0RRESP(M_AXI_GP0_RRESP), + .MAXIGP0RVALID(M_AXI_GP0_RVALID), + .MAXIGP0WDATA(M_AXI_GP0_WDATA), + .MAXIGP0WID(M_AXI_GP0_WID), + .MAXIGP0WLAST(M_AXI_GP0_WLAST), + .MAXIGP0WREADY(M_AXI_GP0_WREADY), + .MAXIGP0WSTRB(M_AXI_GP0_WSTRB), + .MAXIGP0WVALID(M_AXI_GP0_WVALID), + .MAXIGP1ACLK(M_AXI_GP1_ACLK), + .MAXIGP1ARADDR(M_AXI_GP1_ARADDR), + .MAXIGP1ARBURST(M_AXI_GP1_ARBURST), + .MAXIGP1ARCACHE(\^M_AXI_GP1_ARCACHE ), + .MAXIGP1ARESETN(M_AXI_GP1_ARESETN), + .MAXIGP1ARID(M_AXI_GP1_ARID), + .MAXIGP1ARLEN(M_AXI_GP1_ARLEN), + .MAXIGP1ARLOCK(M_AXI_GP1_ARLOCK), + .MAXIGP1ARPROT(M_AXI_GP1_ARPROT), + .MAXIGP1ARQOS(M_AXI_GP1_ARQOS), + .MAXIGP1ARREADY(M_AXI_GP1_ARREADY), + .MAXIGP1ARSIZE(\^M_AXI_GP1_ARSIZE ), + .MAXIGP1ARVALID(M_AXI_GP1_ARVALID), + .MAXIGP1AWADDR(M_AXI_GP1_AWADDR), + .MAXIGP1AWBURST(M_AXI_GP1_AWBURST), + .MAXIGP1AWCACHE(\^M_AXI_GP1_AWCACHE ), + .MAXIGP1AWID(M_AXI_GP1_AWID), + .MAXIGP1AWLEN(M_AXI_GP1_AWLEN), + .MAXIGP1AWLOCK(M_AXI_GP1_AWLOCK), + .MAXIGP1AWPROT(M_AXI_GP1_AWPROT), + .MAXIGP1AWQOS(M_AXI_GP1_AWQOS), + .MAXIGP1AWREADY(M_AXI_GP1_AWREADY), + .MAXIGP1AWSIZE(\^M_AXI_GP1_AWSIZE ), + .MAXIGP1AWVALID(M_AXI_GP1_AWVALID), + .MAXIGP1BID(M_AXI_GP1_BID), + .MAXIGP1BREADY(M_AXI_GP1_BREADY), + .MAXIGP1BRESP(M_AXI_GP1_BRESP), + .MAXIGP1BVALID(M_AXI_GP1_BVALID), + .MAXIGP1RDATA(M_AXI_GP1_RDATA), + .MAXIGP1RID(M_AXI_GP1_RID), + .MAXIGP1RLAST(M_AXI_GP1_RLAST), + .MAXIGP1RREADY(M_AXI_GP1_RREADY), + .MAXIGP1RRESP(M_AXI_GP1_RRESP), + .MAXIGP1RVALID(M_AXI_GP1_RVALID), + .MAXIGP1WDATA(M_AXI_GP1_WDATA), + .MAXIGP1WID(M_AXI_GP1_WID), + .MAXIGP1WLAST(M_AXI_GP1_WLAST), + .MAXIGP1WREADY(M_AXI_GP1_WREADY), + .MAXIGP1WSTRB(M_AXI_GP1_WSTRB), + .MAXIGP1WVALID(M_AXI_GP1_WVALID), + .MIO({buffered_MIO[31:30],NLW_PS7_i_MIO_UNCONNECTED[51:50],buffered_MIO[29:28],NLW_PS7_i_MIO_UNCONNECTED[47:40],buffered_MIO[27:16],NLW_PS7_i_MIO_UNCONNECTED[27:16],buffered_MIO[15:0]}), + .PSCLK(buffered_PS_CLK), + .PSPORB(buffered_PS_PORB), + .PSSRSTB(buffered_PS_SRSTB), + .SAXIACPACLK(S_AXI_ACP_ACLK), + .SAXIACPARADDR(S_AXI_ACP_ARADDR), + .SAXIACPARBURST(S_AXI_ACP_ARBURST), + .SAXIACPARCACHE(S_AXI_ACP_ARCACHE), + .SAXIACPARESETN(S_AXI_ACP_ARESETN), + .SAXIACPARID(S_AXI_ACP_ARID), + .SAXIACPARLEN(S_AXI_ACP_ARLEN), + .SAXIACPARLOCK(S_AXI_ACP_ARLOCK), + .SAXIACPARPROT(S_AXI_ACP_ARPROT), + .SAXIACPARQOS(S_AXI_ACP_ARQOS), + .SAXIACPARREADY(S_AXI_ACP_ARREADY), + .SAXIACPARSIZE(S_AXI_ACP_ARSIZE[1:0]), + .SAXIACPARUSER(S_AXI_ACP_ARUSER), + .SAXIACPARVALID(S_AXI_ACP_ARVALID), + .SAXIACPAWADDR(S_AXI_ACP_AWADDR), + .SAXIACPAWBURST(S_AXI_ACP_AWBURST), + .SAXIACPAWCACHE(S_AXI_ACP_AWCACHE), + .SAXIACPAWID(S_AXI_ACP_AWID), + .SAXIACPAWLEN(S_AXI_ACP_AWLEN), + .SAXIACPAWLOCK(S_AXI_ACP_AWLOCK), + .SAXIACPAWPROT(S_AXI_ACP_AWPROT), + .SAXIACPAWQOS(S_AXI_ACP_AWQOS), + .SAXIACPAWREADY(S_AXI_ACP_AWREADY), + .SAXIACPAWSIZE(S_AXI_ACP_AWSIZE[1:0]), + .SAXIACPAWUSER(S_AXI_ACP_AWUSER), + .SAXIACPAWVALID(S_AXI_ACP_AWVALID), + .SAXIACPBID(S_AXI_ACP_BID), + .SAXIACPBREADY(S_AXI_ACP_BREADY), + .SAXIACPBRESP(S_AXI_ACP_BRESP), + .SAXIACPBVALID(S_AXI_ACP_BVALID), + .SAXIACPRDATA(S_AXI_ACP_RDATA), + .SAXIACPRID(S_AXI_ACP_RID), + .SAXIACPRLAST(S_AXI_ACP_RLAST), + .SAXIACPRREADY(S_AXI_ACP_RREADY), + .SAXIACPRRESP(S_AXI_ACP_RRESP), + .SAXIACPRVALID(S_AXI_ACP_RVALID), + .SAXIACPWDATA(S_AXI_ACP_WDATA), + .SAXIACPWID(S_AXI_ACP_WID), + .SAXIACPWLAST(S_AXI_ACP_WLAST), + .SAXIACPWREADY(S_AXI_ACP_WREADY), + .SAXIACPWSTRB(S_AXI_ACP_WSTRB), + .SAXIACPWVALID(S_AXI_ACP_WVALID), + .SAXIGP0ACLK(S_AXI_GP0_ACLK), + .SAXIGP0ARADDR(S_AXI_GP0_ARADDR), + .SAXIGP0ARBURST(S_AXI_GP0_ARBURST), + .SAXIGP0ARCACHE(S_AXI_GP0_ARCACHE), + .SAXIGP0ARESETN(S_AXI_GP0_ARESETN), + .SAXIGP0ARID(S_AXI_GP0_ARID), + .SAXIGP0ARLEN(S_AXI_GP0_ARLEN), + .SAXIGP0ARLOCK(S_AXI_GP0_ARLOCK), + .SAXIGP0ARPROT(S_AXI_GP0_ARPROT), + .SAXIGP0ARQOS(S_AXI_GP0_ARQOS), + .SAXIGP0ARREADY(S_AXI_GP0_ARREADY), + .SAXIGP0ARSIZE(S_AXI_GP0_ARSIZE[1:0]), + .SAXIGP0ARVALID(S_AXI_GP0_ARVALID), + .SAXIGP0AWADDR(S_AXI_GP0_AWADDR), + .SAXIGP0AWBURST(S_AXI_GP0_AWBURST), + .SAXIGP0AWCACHE(S_AXI_GP0_AWCACHE), + .SAXIGP0AWID(S_AXI_GP0_AWID), + .SAXIGP0AWLEN(S_AXI_GP0_AWLEN), + .SAXIGP0AWLOCK(S_AXI_GP0_AWLOCK), + .SAXIGP0AWPROT(S_AXI_GP0_AWPROT), + .SAXIGP0AWQOS(S_AXI_GP0_AWQOS), + .SAXIGP0AWREADY(S_AXI_GP0_AWREADY), + .SAXIGP0AWSIZE(S_AXI_GP0_AWSIZE[1:0]), + .SAXIGP0AWVALID(S_AXI_GP0_AWVALID), + .SAXIGP0BID(S_AXI_GP0_BID), + .SAXIGP0BREADY(S_AXI_GP0_BREADY), + .SAXIGP0BRESP(S_AXI_GP0_BRESP), + .SAXIGP0BVALID(S_AXI_GP0_BVALID), + .SAXIGP0RDATA(S_AXI_GP0_RDATA), + .SAXIGP0RID(S_AXI_GP0_RID), + .SAXIGP0RLAST(S_AXI_GP0_RLAST), + .SAXIGP0RREADY(S_AXI_GP0_RREADY), + .SAXIGP0RRESP(S_AXI_GP0_RRESP), + .SAXIGP0RVALID(S_AXI_GP0_RVALID), + .SAXIGP0WDATA(S_AXI_GP0_WDATA), + .SAXIGP0WID(S_AXI_GP0_WID), + .SAXIGP0WLAST(S_AXI_GP0_WLAST), + .SAXIGP0WREADY(S_AXI_GP0_WREADY), + .SAXIGP0WSTRB(S_AXI_GP0_WSTRB), + .SAXIGP0WVALID(S_AXI_GP0_WVALID), + .SAXIGP1ACLK(S_AXI_GP1_ACLK), + .SAXIGP1ARADDR(S_AXI_GP1_ARADDR), + .SAXIGP1ARBURST(S_AXI_GP1_ARBURST), + .SAXIGP1ARCACHE(S_AXI_GP1_ARCACHE), + .SAXIGP1ARESETN(S_AXI_GP1_ARESETN), + .SAXIGP1ARID(S_AXI_GP1_ARID), + .SAXIGP1ARLEN(S_AXI_GP1_ARLEN), + .SAXIGP1ARLOCK(S_AXI_GP1_ARLOCK), + .SAXIGP1ARPROT(S_AXI_GP1_ARPROT), + .SAXIGP1ARQOS(S_AXI_GP1_ARQOS), + .SAXIGP1ARREADY(S_AXI_GP1_ARREADY), + .SAXIGP1ARSIZE(S_AXI_GP1_ARSIZE[1:0]), + .SAXIGP1ARVALID(S_AXI_GP1_ARVALID), + .SAXIGP1AWADDR(S_AXI_GP1_AWADDR), + .SAXIGP1AWBURST(S_AXI_GP1_AWBURST), + .SAXIGP1AWCACHE(S_AXI_GP1_AWCACHE), + .SAXIGP1AWID(S_AXI_GP1_AWID), + .SAXIGP1AWLEN(S_AXI_GP1_AWLEN), + .SAXIGP1AWLOCK(S_AXI_GP1_AWLOCK), + .SAXIGP1AWPROT(S_AXI_GP1_AWPROT), + .SAXIGP1AWQOS(S_AXI_GP1_AWQOS), + .SAXIGP1AWREADY(S_AXI_GP1_AWREADY), + .SAXIGP1AWSIZE(S_AXI_GP1_AWSIZE[1:0]), + .SAXIGP1AWVALID(S_AXI_GP1_AWVALID), + .SAXIGP1BID(S_AXI_GP1_BID), + .SAXIGP1BREADY(S_AXI_GP1_BREADY), + .SAXIGP1BRESP(S_AXI_GP1_BRESP), + .SAXIGP1BVALID(S_AXI_GP1_BVALID), + .SAXIGP1RDATA(S_AXI_GP1_RDATA), + .SAXIGP1RID(S_AXI_GP1_RID), + .SAXIGP1RLAST(S_AXI_GP1_RLAST), + .SAXIGP1RREADY(S_AXI_GP1_RREADY), + .SAXIGP1RRESP(S_AXI_GP1_RRESP), + .SAXIGP1RVALID(S_AXI_GP1_RVALID), + .SAXIGP1WDATA(S_AXI_GP1_WDATA), + .SAXIGP1WID(S_AXI_GP1_WID), + .SAXIGP1WLAST(S_AXI_GP1_WLAST), + .SAXIGP1WREADY(S_AXI_GP1_WREADY), + .SAXIGP1WSTRB(S_AXI_GP1_WSTRB), + .SAXIGP1WVALID(S_AXI_GP1_WVALID), + .SAXIHP0ACLK(S_AXI_HP0_ACLK), + .SAXIHP0ARADDR(S_AXI_HP0_ARADDR), + .SAXIHP0ARBURST(S_AXI_HP0_ARBURST), + .SAXIHP0ARCACHE(S_AXI_HP0_ARCACHE), + .SAXIHP0ARESETN(S_AXI_HP0_ARESETN), + .SAXIHP0ARID(S_AXI_HP0_ARID), + .SAXIHP0ARLEN(S_AXI_HP0_ARLEN), + .SAXIHP0ARLOCK(S_AXI_HP0_ARLOCK), + .SAXIHP0ARPROT(S_AXI_HP0_ARPROT), + .SAXIHP0ARQOS(S_AXI_HP0_ARQOS), + .SAXIHP0ARREADY(S_AXI_HP0_ARREADY), + .SAXIHP0ARSIZE(S_AXI_HP0_ARSIZE[1:0]), + .SAXIHP0ARVALID(S_AXI_HP0_ARVALID), + .SAXIHP0AWADDR(S_AXI_HP0_AWADDR), + .SAXIHP0AWBURST(S_AXI_HP0_AWBURST), + .SAXIHP0AWCACHE(S_AXI_HP0_AWCACHE), + .SAXIHP0AWID(S_AXI_HP0_AWID), + .SAXIHP0AWLEN(S_AXI_HP0_AWLEN), + .SAXIHP0AWLOCK(S_AXI_HP0_AWLOCK), + .SAXIHP0AWPROT(S_AXI_HP0_AWPROT), + .SAXIHP0AWQOS(S_AXI_HP0_AWQOS), + .SAXIHP0AWREADY(S_AXI_HP0_AWREADY), + .SAXIHP0AWSIZE(S_AXI_HP0_AWSIZE[1:0]), + .SAXIHP0AWVALID(S_AXI_HP0_AWVALID), + .SAXIHP0BID(S_AXI_HP0_BID), + .SAXIHP0BREADY(S_AXI_HP0_BREADY), + .SAXIHP0BRESP(S_AXI_HP0_BRESP), + .SAXIHP0BVALID(S_AXI_HP0_BVALID), + .SAXIHP0RACOUNT(S_AXI_HP0_RACOUNT), + .SAXIHP0RCOUNT(S_AXI_HP0_RCOUNT), + .SAXIHP0RDATA(S_AXI_HP0_RDATA), + .SAXIHP0RDISSUECAP1EN(S_AXI_HP0_RDISSUECAP1_EN), + .SAXIHP0RID(S_AXI_HP0_RID), + .SAXIHP0RLAST(S_AXI_HP0_RLAST), + .SAXIHP0RREADY(S_AXI_HP0_RREADY), + .SAXIHP0RRESP(S_AXI_HP0_RRESP), + .SAXIHP0RVALID(S_AXI_HP0_RVALID), + .SAXIHP0WACOUNT(S_AXI_HP0_WACOUNT), + .SAXIHP0WCOUNT(S_AXI_HP0_WCOUNT), + .SAXIHP0WDATA(S_AXI_HP0_WDATA), + .SAXIHP0WID(S_AXI_HP0_WID), + .SAXIHP0WLAST(S_AXI_HP0_WLAST), + .SAXIHP0WREADY(S_AXI_HP0_WREADY), + .SAXIHP0WRISSUECAP1EN(S_AXI_HP0_WRISSUECAP1_EN), + .SAXIHP0WSTRB(S_AXI_HP0_WSTRB), + .SAXIHP0WVALID(S_AXI_HP0_WVALID), + .SAXIHP1ACLK(S_AXI_HP1_ACLK), + .SAXIHP1ARADDR(S_AXI_HP1_ARADDR), + .SAXIHP1ARBURST(S_AXI_HP1_ARBURST), + .SAXIHP1ARCACHE(S_AXI_HP1_ARCACHE), + .SAXIHP1ARESETN(S_AXI_HP1_ARESETN), + .SAXIHP1ARID(S_AXI_HP1_ARID), + .SAXIHP1ARLEN(S_AXI_HP1_ARLEN), + .SAXIHP1ARLOCK(S_AXI_HP1_ARLOCK), + .SAXIHP1ARPROT(S_AXI_HP1_ARPROT), + .SAXIHP1ARQOS(S_AXI_HP1_ARQOS), + .SAXIHP1ARREADY(S_AXI_HP1_ARREADY), + .SAXIHP1ARSIZE(S_AXI_HP1_ARSIZE[1:0]), + .SAXIHP1ARVALID(S_AXI_HP1_ARVALID), + .SAXIHP1AWADDR(S_AXI_HP1_AWADDR), + .SAXIHP1AWBURST(S_AXI_HP1_AWBURST), + .SAXIHP1AWCACHE(S_AXI_HP1_AWCACHE), + .SAXIHP1AWID(S_AXI_HP1_AWID), + .SAXIHP1AWLEN(S_AXI_HP1_AWLEN), + .SAXIHP1AWLOCK(S_AXI_HP1_AWLOCK), + .SAXIHP1AWPROT(S_AXI_HP1_AWPROT), + .SAXIHP1AWQOS(S_AXI_HP1_AWQOS), + .SAXIHP1AWREADY(S_AXI_HP1_AWREADY), + .SAXIHP1AWSIZE(S_AXI_HP1_AWSIZE[1:0]), + .SAXIHP1AWVALID(S_AXI_HP1_AWVALID), + .SAXIHP1BID(S_AXI_HP1_BID), + .SAXIHP1BREADY(S_AXI_HP1_BREADY), + .SAXIHP1BRESP(S_AXI_HP1_BRESP), + .SAXIHP1BVALID(S_AXI_HP1_BVALID), + .SAXIHP1RACOUNT(S_AXI_HP1_RACOUNT), + .SAXIHP1RCOUNT(S_AXI_HP1_RCOUNT), + .SAXIHP1RDATA(S_AXI_HP1_RDATA), + .SAXIHP1RDISSUECAP1EN(S_AXI_HP1_RDISSUECAP1_EN), + .SAXIHP1RID(S_AXI_HP1_RID), + .SAXIHP1RLAST(S_AXI_HP1_RLAST), + .SAXIHP1RREADY(S_AXI_HP1_RREADY), + .SAXIHP1RRESP(S_AXI_HP1_RRESP), + .SAXIHP1RVALID(S_AXI_HP1_RVALID), + .SAXIHP1WACOUNT(S_AXI_HP1_WACOUNT), + .SAXIHP1WCOUNT(S_AXI_HP1_WCOUNT), + .SAXIHP1WDATA(S_AXI_HP1_WDATA), + .SAXIHP1WID(S_AXI_HP1_WID), + .SAXIHP1WLAST(S_AXI_HP1_WLAST), + .SAXIHP1WREADY(S_AXI_HP1_WREADY), + .SAXIHP1WRISSUECAP1EN(S_AXI_HP1_WRISSUECAP1_EN), + .SAXIHP1WSTRB(S_AXI_HP1_WSTRB), + .SAXIHP1WVALID(S_AXI_HP1_WVALID), + .SAXIHP2ACLK(S_AXI_HP2_ACLK), + .SAXIHP2ARADDR(S_AXI_HP2_ARADDR), + .SAXIHP2ARBURST(S_AXI_HP2_ARBURST), + .SAXIHP2ARCACHE(S_AXI_HP2_ARCACHE), + .SAXIHP2ARESETN(S_AXI_HP2_ARESETN), + .SAXIHP2ARID(S_AXI_HP2_ARID), + .SAXIHP2ARLEN(S_AXI_HP2_ARLEN), + .SAXIHP2ARLOCK(S_AXI_HP2_ARLOCK), + .SAXIHP2ARPROT(S_AXI_HP2_ARPROT), + .SAXIHP2ARQOS(S_AXI_HP2_ARQOS), + .SAXIHP2ARREADY(S_AXI_HP2_ARREADY), + .SAXIHP2ARSIZE(S_AXI_HP2_ARSIZE[1:0]), + .SAXIHP2ARVALID(S_AXI_HP2_ARVALID), + .SAXIHP2AWADDR(S_AXI_HP2_AWADDR), + .SAXIHP2AWBURST(S_AXI_HP2_AWBURST), + .SAXIHP2AWCACHE(S_AXI_HP2_AWCACHE), + .SAXIHP2AWID(S_AXI_HP2_AWID), + .SAXIHP2AWLEN(S_AXI_HP2_AWLEN), + .SAXIHP2AWLOCK(S_AXI_HP2_AWLOCK), + .SAXIHP2AWPROT(S_AXI_HP2_AWPROT), + .SAXIHP2AWQOS(S_AXI_HP2_AWQOS), + .SAXIHP2AWREADY(S_AXI_HP2_AWREADY), + .SAXIHP2AWSIZE(S_AXI_HP2_AWSIZE[1:0]), + .SAXIHP2AWVALID(S_AXI_HP2_AWVALID), + .SAXIHP2BID(S_AXI_HP2_BID), + .SAXIHP2BREADY(S_AXI_HP2_BREADY), + .SAXIHP2BRESP(S_AXI_HP2_BRESP), + .SAXIHP2BVALID(S_AXI_HP2_BVALID), + .SAXIHP2RACOUNT(S_AXI_HP2_RACOUNT), + .SAXIHP2RCOUNT(S_AXI_HP2_RCOUNT), + .SAXIHP2RDATA(S_AXI_HP2_RDATA), + .SAXIHP2RDISSUECAP1EN(S_AXI_HP2_RDISSUECAP1_EN), + .SAXIHP2RID(S_AXI_HP2_RID), + .SAXIHP2RLAST(S_AXI_HP2_RLAST), + .SAXIHP2RREADY(S_AXI_HP2_RREADY), + .SAXIHP2RRESP(S_AXI_HP2_RRESP), + .SAXIHP2RVALID(S_AXI_HP2_RVALID), + .SAXIHP2WACOUNT(S_AXI_HP2_WACOUNT), + .SAXIHP2WCOUNT(S_AXI_HP2_WCOUNT), + .SAXIHP2WDATA(S_AXI_HP2_WDATA), + .SAXIHP2WID(S_AXI_HP2_WID), + .SAXIHP2WLAST(S_AXI_HP2_WLAST), + .SAXIHP2WREADY(S_AXI_HP2_WREADY), + .SAXIHP2WRISSUECAP1EN(S_AXI_HP2_WRISSUECAP1_EN), + .SAXIHP2WSTRB(S_AXI_HP2_WSTRB), + .SAXIHP2WVALID(S_AXI_HP2_WVALID), + .SAXIHP3ACLK(S_AXI_HP3_ACLK), + .SAXIHP3ARADDR(S_AXI_HP3_ARADDR), + .SAXIHP3ARBURST(S_AXI_HP3_ARBURST), + .SAXIHP3ARCACHE(S_AXI_HP3_ARCACHE), + .SAXIHP3ARESETN(S_AXI_HP3_ARESETN), + .SAXIHP3ARID(S_AXI_HP3_ARID), + .SAXIHP3ARLEN(S_AXI_HP3_ARLEN), + .SAXIHP3ARLOCK(S_AXI_HP3_ARLOCK), + .SAXIHP3ARPROT(S_AXI_HP3_ARPROT), + .SAXIHP3ARQOS(S_AXI_HP3_ARQOS), + .SAXIHP3ARREADY(S_AXI_HP3_ARREADY), + .SAXIHP3ARSIZE(S_AXI_HP3_ARSIZE[1:0]), + .SAXIHP3ARVALID(S_AXI_HP3_ARVALID), + .SAXIHP3AWADDR(S_AXI_HP3_AWADDR), + .SAXIHP3AWBURST(S_AXI_HP3_AWBURST), + .SAXIHP3AWCACHE(S_AXI_HP3_AWCACHE), + .SAXIHP3AWID(S_AXI_HP3_AWID), + .SAXIHP3AWLEN(S_AXI_HP3_AWLEN), + .SAXIHP3AWLOCK(S_AXI_HP3_AWLOCK), + .SAXIHP3AWPROT(S_AXI_HP3_AWPROT), + .SAXIHP3AWQOS(S_AXI_HP3_AWQOS), + .SAXIHP3AWREADY(S_AXI_HP3_AWREADY), + .SAXIHP3AWSIZE(S_AXI_HP3_AWSIZE[1:0]), + .SAXIHP3AWVALID(S_AXI_HP3_AWVALID), + .SAXIHP3BID(S_AXI_HP3_BID), + .SAXIHP3BREADY(S_AXI_HP3_BREADY), + .SAXIHP3BRESP(S_AXI_HP3_BRESP), + .SAXIHP3BVALID(S_AXI_HP3_BVALID), + .SAXIHP3RACOUNT(S_AXI_HP3_RACOUNT), + .SAXIHP3RCOUNT(S_AXI_HP3_RCOUNT), + .SAXIHP3RDATA(S_AXI_HP3_RDATA), + .SAXIHP3RDISSUECAP1EN(S_AXI_HP3_RDISSUECAP1_EN), + .SAXIHP3RID(S_AXI_HP3_RID), + .SAXIHP3RLAST(S_AXI_HP3_RLAST), + .SAXIHP3RREADY(S_AXI_HP3_RREADY), + .SAXIHP3RRESP(S_AXI_HP3_RRESP), + .SAXIHP3RVALID(S_AXI_HP3_RVALID), + .SAXIHP3WACOUNT(S_AXI_HP3_WACOUNT), + .SAXIHP3WCOUNT(S_AXI_HP3_WCOUNT), + .SAXIHP3WDATA(S_AXI_HP3_WDATA), + .SAXIHP3WID(S_AXI_HP3_WID), + .SAXIHP3WLAST(S_AXI_HP3_WLAST), + .SAXIHP3WREADY(S_AXI_HP3_WREADY), + .SAXIHP3WRISSUECAP1EN(S_AXI_HP3_WRISSUECAP1_EN), + .SAXIHP3WSTRB(S_AXI_HP3_WSTRB), + .SAXIHP3WVALID(S_AXI_HP3_WVALID)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF PS_CLK_BIBUF + (.IO(buffered_PS_CLK), + .PAD(PS_CLK)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF PS_PORB_BIBUF + (.IO(buffered_PS_PORB), + .PAD(PS_PORB)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF PS_SRSTB_BIBUF + (.IO(buffered_PS_SRSTB), + .PAD(PS_SRSTB)); + LUT1 #( + .INIT(2'h1)) + SDIO0_CMD_T_INST_0 + (.I0(SDIO0_CMD_T_n), + .O(SDIO0_CMD_T)); + LUT1 #( + .INIT(2'h1)) + \SDIO0_DATA_T[0]_INST_0 + (.I0(SDIO0_DATA_T_n[0]), + .O(SDIO0_DATA_T[0])); + LUT1 #( + .INIT(2'h1)) + \SDIO0_DATA_T[1]_INST_0 + (.I0(SDIO0_DATA_T_n[1]), + .O(SDIO0_DATA_T[1])); + LUT1 #( + .INIT(2'h1)) + \SDIO0_DATA_T[2]_INST_0 + (.I0(SDIO0_DATA_T_n[2]), + .O(SDIO0_DATA_T[2])); + LUT1 #( + .INIT(2'h1)) + \SDIO0_DATA_T[3]_INST_0 + (.I0(SDIO0_DATA_T_n[3]), + .O(SDIO0_DATA_T[3])); + LUT1 #( + .INIT(2'h1)) + SDIO1_CMD_T_INST_0 + (.I0(SDIO1_CMD_T_n), + .O(SDIO1_CMD_T)); + LUT1 #( + .INIT(2'h1)) + \SDIO1_DATA_T[0]_INST_0 + (.I0(SDIO1_DATA_T_n[0]), + .O(SDIO1_DATA_T[0])); + LUT1 #( + .INIT(2'h1)) + \SDIO1_DATA_T[1]_INST_0 + (.I0(SDIO1_DATA_T_n[1]), + .O(SDIO1_DATA_T[1])); + LUT1 #( + .INIT(2'h1)) + \SDIO1_DATA_T[2]_INST_0 + (.I0(SDIO1_DATA_T_n[2]), + .O(SDIO1_DATA_T[2])); + LUT1 #( + .INIT(2'h1)) + \SDIO1_DATA_T[3]_INST_0 + (.I0(SDIO1_DATA_T_n[3]), + .O(SDIO1_DATA_T[3])); + LUT1 #( + .INIT(2'h1)) + SPI0_MISO_T_INST_0 + (.I0(SPI0_MISO_T_n), + .O(SPI0_MISO_T)); + LUT1 #( + .INIT(2'h1)) + SPI0_MOSI_T_INST_0 + (.I0(SPI0_MOSI_T_n), + .O(SPI0_MOSI_T)); + LUT1 #( + .INIT(2'h1)) + SPI0_SCLK_T_INST_0 + (.I0(SPI0_SCLK_T_n), + .O(SPI0_SCLK_T)); + LUT1 #( + .INIT(2'h1)) + SPI0_SS_T_INST_0 + (.I0(SPI0_SS_T_n), + .O(SPI0_SS_T)); + LUT1 #( + .INIT(2'h1)) + SPI1_MISO_T_INST_0 + (.I0(SPI1_MISO_T_n), + .O(SPI1_MISO_T)); + LUT1 #( + .INIT(2'h1)) + SPI1_MOSI_T_INST_0 + (.I0(SPI1_MOSI_T_n), + .O(SPI1_MOSI_T)); + LUT1 #( + .INIT(2'h1)) + SPI1_SCLK_T_INST_0 + (.I0(SPI1_SCLK_T_n), + .O(SPI1_SCLK_T)); + LUT1 #( + .INIT(2'h1)) + SPI1_SS_T_INST_0 + (.I0(SPI1_SS_T_n), + .O(SPI1_SS_T)); + VCC VCC + (.P(\ )); + (* BOX_TYPE = "PRIMITIVE" *) + BUFG \buffer_fclk_clk_0.FCLK_CLK_0_BUFG + (.I(FCLK_CLK_unbuffered[0]), + .O(FCLK_CLK0)); + (* BOX_TYPE = "PRIMITIVE" *) + BUFG \buffer_fclk_clk_1.FCLK_CLK_1_BUFG + (.I(FCLK_CLK_unbuffered[1]), + .O(FCLK_CLK1)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[0].MIO_BIBUF + (.IO(buffered_MIO[0]), + .PAD(MIO[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[10].MIO_BIBUF + (.IO(buffered_MIO[10]), + .PAD(MIO[10])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[11].MIO_BIBUF + (.IO(buffered_MIO[11]), + .PAD(MIO[11])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[12].MIO_BIBUF + (.IO(buffered_MIO[12]), + .PAD(MIO[12])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[13].MIO_BIBUF + (.IO(buffered_MIO[13]), + .PAD(MIO[13])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[14].MIO_BIBUF + (.IO(buffered_MIO[14]), + .PAD(MIO[14])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[15].MIO_BIBUF + (.IO(buffered_MIO[15]), + .PAD(MIO[15])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[16].MIO_BIBUF + (.IO(buffered_MIO[16]), + .PAD(MIO[16])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[17].MIO_BIBUF + (.IO(buffered_MIO[17]), + .PAD(MIO[17])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[18].MIO_BIBUF + (.IO(buffered_MIO[18]), + .PAD(MIO[18])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[19].MIO_BIBUF + (.IO(buffered_MIO[19]), + .PAD(MIO[19])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[1].MIO_BIBUF + (.IO(buffered_MIO[1]), + .PAD(MIO[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[20].MIO_BIBUF + (.IO(buffered_MIO[20]), + .PAD(MIO[20])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[21].MIO_BIBUF + (.IO(buffered_MIO[21]), + .PAD(MIO[21])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[22].MIO_BIBUF + (.IO(buffered_MIO[22]), + .PAD(MIO[22])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[23].MIO_BIBUF + (.IO(buffered_MIO[23]), + .PAD(MIO[23])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[24].MIO_BIBUF + (.IO(buffered_MIO[24]), + .PAD(MIO[24])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[25].MIO_BIBUF + (.IO(buffered_MIO[25]), + .PAD(MIO[25])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[26].MIO_BIBUF + (.IO(buffered_MIO[26]), + .PAD(MIO[26])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[27].MIO_BIBUF + (.IO(buffered_MIO[27]), + .PAD(MIO[27])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[28].MIO_BIBUF + (.IO(buffered_MIO[28]), + .PAD(MIO[28])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[29].MIO_BIBUF + (.IO(buffered_MIO[29]), + .PAD(MIO[29])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[2].MIO_BIBUF + (.IO(buffered_MIO[2]), + .PAD(MIO[2])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[30].MIO_BIBUF + (.IO(buffered_MIO[30]), + .PAD(MIO[30])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[31].MIO_BIBUF + (.IO(buffered_MIO[31]), + .PAD(MIO[31])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[3].MIO_BIBUF + (.IO(buffered_MIO[3]), + .PAD(MIO[3])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[4].MIO_BIBUF + (.IO(buffered_MIO[4]), + .PAD(MIO[4])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[5].MIO_BIBUF + (.IO(buffered_MIO[5]), + .PAD(MIO[5])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[6].MIO_BIBUF + (.IO(buffered_MIO[6]), + .PAD(MIO[6])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[7].MIO_BIBUF + (.IO(buffered_MIO[7]), + .PAD(MIO[7])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[8].MIO_BIBUF + (.IO(buffered_MIO[8]), + .PAD(MIO[8])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[9].MIO_BIBUF + (.IO(buffered_MIO[9]), + .PAD(MIO[9])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk14[0].DDR_BankAddr_BIBUF + (.IO(buffered_DDR_BankAddr[0]), + .PAD(DDR_BankAddr[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk14[1].DDR_BankAddr_BIBUF + (.IO(buffered_DDR_BankAddr[1]), + .PAD(DDR_BankAddr[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk14[2].DDR_BankAddr_BIBUF + (.IO(buffered_DDR_BankAddr[2]), + .PAD(DDR_BankAddr[2])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[0].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[0]), + .PAD(DDR_Addr[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[10].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[10]), + .PAD(DDR_Addr[10])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[11].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[11]), + .PAD(DDR_Addr[11])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[12].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[12]), + .PAD(DDR_Addr[12])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[13].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[13]), + .PAD(DDR_Addr[13])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[14].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[14]), + .PAD(DDR_Addr[14])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[1].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[1]), + .PAD(DDR_Addr[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[2].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[2]), + .PAD(DDR_Addr[2])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[3].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[3]), + .PAD(DDR_Addr[3])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[4].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[4]), + .PAD(DDR_Addr[4])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[5].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[5]), + .PAD(DDR_Addr[5])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[6].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[6]), + .PAD(DDR_Addr[6])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[7].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[7]), + .PAD(DDR_Addr[7])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[8].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[8]), + .PAD(DDR_Addr[8])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[9].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[9]), + .PAD(DDR_Addr[9])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk16[0].DDR_DM_BIBUF + (.IO(buffered_DDR_DM[0]), + .PAD(DDR_DM[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk16[1].DDR_DM_BIBUF + (.IO(buffered_DDR_DM[1]), + .PAD(DDR_DM[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[0].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[0]), + .PAD(DDR_DQ[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[10].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[10]), + .PAD(DDR_DQ[10])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[11].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[11]), + .PAD(DDR_DQ[11])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[12].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[12]), + .PAD(DDR_DQ[12])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[13].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[13]), + .PAD(DDR_DQ[13])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[14].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[14]), + .PAD(DDR_DQ[14])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[15].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[15]), + .PAD(DDR_DQ[15])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[1].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[1]), + .PAD(DDR_DQ[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[2].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[2]), + .PAD(DDR_DQ[2])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[3].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[3]), + .PAD(DDR_DQ[3])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[4].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[4]), + .PAD(DDR_DQ[4])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[5].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[5]), + .PAD(DDR_DQ[5])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[6].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[6]), + .PAD(DDR_DQ[6])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[7].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[7]), + .PAD(DDR_DQ[7])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[8].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[8]), + .PAD(DDR_DQ[8])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[9].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[9]), + .PAD(DDR_DQ[9])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk18[0].DDR_DQS_n_BIBUF + (.IO(buffered_DDR_DQS_n[0]), + .PAD(DDR_DQS_n[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk18[1].DDR_DQS_n_BIBUF + (.IO(buffered_DDR_DQS_n[1]), + .PAD(DDR_DQS_n[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk19[0].DDR_DQS_BIBUF + (.IO(buffered_DDR_DQS[0]), + .PAD(DDR_DQS[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk19[1].DDR_DQS_BIBUF + (.IO(buffered_DDR_DQS[1]), + .PAD(DDR_DQS[1])); + LUT1 #( + .INIT(2'h2)) + i_0 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[0] )); + LUT1 #( + .INIT(2'h2)) + i_1 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[0] [1])); + LUT1 #( + .INIT(2'h2)) + i_10 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[7] [1])); + LUT1 #( + .INIT(2'h2)) + i_11 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[7] [0])); + LUT1 #( + .INIT(2'h2)) + i_12 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[6] [1])); + LUT1 #( + .INIT(2'h2)) + i_13 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[6] [0])); + LUT1 #( + .INIT(2'h2)) + i_14 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[5] [1])); + LUT1 #( + .INIT(2'h2)) + i_15 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[5] [0])); + LUT1 #( + .INIT(2'h2)) + i_16 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[4] [1])); + LUT1 #( + .INIT(2'h2)) + i_17 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[4] [0])); + LUT1 #( + .INIT(2'h2)) + i_18 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[3] [1])); + LUT1 #( + .INIT(2'h2)) + i_19 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[3] [0])); + LUT1 #( + .INIT(2'h2)) + i_2 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[0] [0])); + LUT1 #( + .INIT(2'h2)) + i_20 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[2] [1])); + LUT1 #( + .INIT(2'h2)) + i_21 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[2] [0])); + LUT1 #( + .INIT(2'h2)) + i_22 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[1] [1])); + LUT1 #( + .INIT(2'h2)) + i_23 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[1] [0])); + LUT1 #( + .INIT(2'h2)) + i_3 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[7] )); + LUT1 #( + .INIT(2'h2)) + i_4 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[6] )); + LUT1 #( + .INIT(2'h2)) + i_5 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[5] )); + LUT1 #( + .INIT(2'h2)) + i_6 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[4] )); + LUT1 #( + .INIT(2'h2)) + i_7 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[3] )); + LUT1 #( + .INIT(2'h2)) + i_8 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[2] )); + LUT1 #( + .INIT(2'h2)) + i_9 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[1] )); +endmodule +`ifndef GLBL +`define GLBL +`timescale 1 ps / 1 ps + +module glbl (); + + parameter ROC_WIDTH = 100000; + parameter TOC_WIDTH = 0; + +//-------- STARTUP Globals -------------- + wire GSR; + wire GTS; + wire GWE; + wire PRLD; + tri1 p_up_tmp; + tri (weak1, strong0) PLL_LOCKG = p_up_tmp; + + wire PROGB_GLBL; + wire CCLKO_GLBL; + wire FCSBO_GLBL; + wire [3:0] DO_GLBL; + wire [3:0] DI_GLBL; + + reg GSR_int; + reg GTS_int; + reg PRLD_int; + +//-------- JTAG Globals -------------- + wire JTAG_TDO_GLBL; + wire JTAG_TCK_GLBL; + wire JTAG_TDI_GLBL; + wire JTAG_TMS_GLBL; + wire JTAG_TRST_GLBL; + + reg JTAG_CAPTURE_GLBL; + reg JTAG_RESET_GLBL; + reg JTAG_SHIFT_GLBL; + reg JTAG_UPDATE_GLBL; + reg JTAG_RUNTEST_GLBL; + + reg JTAG_SEL1_GLBL = 0; + reg JTAG_SEL2_GLBL = 0 ; + reg JTAG_SEL3_GLBL = 0; + reg JTAG_SEL4_GLBL = 0; + + reg JTAG_USER_TDO1_GLBL = 1'bz; + reg JTAG_USER_TDO2_GLBL = 1'bz; + reg JTAG_USER_TDO3_GLBL = 1'bz; + reg JTAG_USER_TDO4_GLBL = 1'bz; + + assign (strong1, weak0) GSR = GSR_int; + assign (strong1, weak0) GTS = GTS_int; + assign (weak1, weak0) PRLD = PRLD_int; + + initial begin + GSR_int = 1'b1; + PRLD_int = 1'b1; + #(ROC_WIDTH) + GSR_int = 1'b0; + PRLD_int = 1'b0; + end + + initial begin + GTS_int = 1'b1; + #(TOC_WIDTH) + GTS_int = 1'b0; + end + +endmodule +`endif diff --git a/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0_stub.v b/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0_stub.v new file mode 100644 index 0000000..0987209 --- /dev/null +++ b/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/design_1_processing_system7_0_0_stub.v @@ -0,0 +1,164 @@ +// Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +// Date : Fri Aug 17 17:36:45 2018 +// Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +// Command : write_verilog -force -mode synth_stub -rename_top decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix -prefix +// decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_ design_1_processing_system7_0_0_stub.v +// Design : design_1_processing_system7_0_0 +// Purpose : Stub declaration of top-level module interface +// Device : xc7z010clg225-1 +// -------------------------------------------------------------------------------- + +// This empty module with port declaration file causes synthesis tools to infer a black box for IP. +// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion. +// Please paste the declaration into a Verilog source file or add the file as an additional source. +(* X_CORE_INFO = "processing_system7_v5_5_processing_system7,Vivado 2018.2" *) +module decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix(GPIO_I, GPIO_O, GPIO_T, I2C0_SDA_I, I2C0_SDA_O, + I2C0_SDA_T, I2C0_SCL_I, I2C0_SCL_O, I2C0_SCL_T, SDIO0_CLK, SDIO0_CLK_FB, SDIO0_CMD_O, + SDIO0_CMD_I, SDIO0_CMD_T, SDIO0_DATA_I, SDIO0_DATA_O, SDIO0_DATA_T, SDIO0_LED, SDIO0_CDN, + SDIO0_WP, SDIO0_BUSPOW, SDIO0_BUSVOLT, SPI0_SCLK_I, SPI0_SCLK_O, SPI0_SCLK_T, SPI0_MOSI_I, + SPI0_MOSI_O, SPI0_MOSI_T, SPI0_MISO_I, SPI0_MISO_O, SPI0_MISO_T, SPI0_SS_I, SPI0_SS_O, + SPI0_SS1_O, SPI0_SS2_O, SPI0_SS_T, SPI1_SCLK_I, SPI1_SCLK_O, SPI1_SCLK_T, SPI1_MOSI_I, + SPI1_MOSI_O, SPI1_MOSI_T, SPI1_MISO_I, SPI1_MISO_O, SPI1_MISO_T, SPI1_SS_I, SPI1_SS_O, + SPI1_SS1_O, SPI1_SS2_O, SPI1_SS_T, UART0_TX, UART0_RX, TTC0_WAVE0_OUT, TTC0_WAVE1_OUT, + TTC0_WAVE2_OUT, TTC1_WAVE0_OUT, TTC1_WAVE1_OUT, TTC1_WAVE2_OUT, USB0_PORT_INDCTL, + USB0_VBUS_PWRSELECT, USB0_VBUS_PWRFAULT, M_AXI_GP0_ARVALID, M_AXI_GP0_AWVALID, + M_AXI_GP0_BREADY, M_AXI_GP0_RREADY, M_AXI_GP0_WLAST, M_AXI_GP0_WVALID, M_AXI_GP0_ARID, + M_AXI_GP0_AWID, M_AXI_GP0_WID, M_AXI_GP0_ARBURST, M_AXI_GP0_ARLOCK, M_AXI_GP0_ARSIZE, + M_AXI_GP0_AWBURST, M_AXI_GP0_AWLOCK, M_AXI_GP0_AWSIZE, M_AXI_GP0_ARPROT, + M_AXI_GP0_AWPROT, M_AXI_GP0_ARADDR, M_AXI_GP0_AWADDR, M_AXI_GP0_WDATA, M_AXI_GP0_ARCACHE, + M_AXI_GP0_ARLEN, M_AXI_GP0_ARQOS, M_AXI_GP0_AWCACHE, M_AXI_GP0_AWLEN, M_AXI_GP0_AWQOS, + M_AXI_GP0_WSTRB, M_AXI_GP0_ACLK, M_AXI_GP0_ARREADY, M_AXI_GP0_AWREADY, M_AXI_GP0_BVALID, + M_AXI_GP0_RLAST, M_AXI_GP0_RVALID, M_AXI_GP0_WREADY, M_AXI_GP0_BID, M_AXI_GP0_RID, + M_AXI_GP0_BRESP, M_AXI_GP0_RRESP, M_AXI_GP0_RDATA, IRQ_F2P, FCLK_CLK0, FCLK_CLK1, + FCLK_RESET0_N, MIO, DDR_CAS_n, DDR_CKE, DDR_Clk_n, DDR_Clk, DDR_CS_n, DDR_DRSTB, DDR_ODT, + DDR_RAS_n, DDR_WEB, DDR_BankAddr, DDR_Addr, DDR_VRN, DDR_VRP, DDR_DM, DDR_DQ, DDR_DQS_n, DDR_DQS, + PS_SRSTB, PS_CLK, PS_PORB) +/* synthesis syn_black_box black_box_pad_pin="GPIO_I[63:0],GPIO_O[63:0],GPIO_T[63:0],I2C0_SDA_I,I2C0_SDA_O,I2C0_SDA_T,I2C0_SCL_I,I2C0_SCL_O,I2C0_SCL_T,SDIO0_CLK,SDIO0_CLK_FB,SDIO0_CMD_O,SDIO0_CMD_I,SDIO0_CMD_T,SDIO0_DATA_I[3:0],SDIO0_DATA_O[3:0],SDIO0_DATA_T[3:0],SDIO0_LED,SDIO0_CDN,SDIO0_WP,SDIO0_BUSPOW,SDIO0_BUSVOLT[2:0],SPI0_SCLK_I,SPI0_SCLK_O,SPI0_SCLK_T,SPI0_MOSI_I,SPI0_MOSI_O,SPI0_MOSI_T,SPI0_MISO_I,SPI0_MISO_O,SPI0_MISO_T,SPI0_SS_I,SPI0_SS_O,SPI0_SS1_O,SPI0_SS2_O,SPI0_SS_T,SPI1_SCLK_I,SPI1_SCLK_O,SPI1_SCLK_T,SPI1_MOSI_I,SPI1_MOSI_O,SPI1_MOSI_T,SPI1_MISO_I,SPI1_MISO_O,SPI1_MISO_T,SPI1_SS_I,SPI1_SS_O,SPI1_SS1_O,SPI1_SS2_O,SPI1_SS_T,UART0_TX,UART0_RX,TTC0_WAVE0_OUT,TTC0_WAVE1_OUT,TTC0_WAVE2_OUT,TTC1_WAVE0_OUT,TTC1_WAVE1_OUT,TTC1_WAVE2_OUT,USB0_PORT_INDCTL[1:0],USB0_VBUS_PWRSELECT,USB0_VBUS_PWRFAULT,M_AXI_GP0_ARVALID,M_AXI_GP0_AWVALID,M_AXI_GP0_BREADY,M_AXI_GP0_RREADY,M_AXI_GP0_WLAST,M_AXI_GP0_WVALID,M_AXI_GP0_ARID[11:0],M_AXI_GP0_AWID[11:0],M_AXI_GP0_WID[11:0],M_AXI_GP0_ARBURST[1:0],M_AXI_GP0_ARLOCK[1:0],M_AXI_GP0_ARSIZE[2:0],M_AXI_GP0_AWBURST[1:0],M_AXI_GP0_AWLOCK[1:0],M_AXI_GP0_AWSIZE[2:0],M_AXI_GP0_ARPROT[2:0],M_AXI_GP0_AWPROT[2:0],M_AXI_GP0_ARADDR[31:0],M_AXI_GP0_AWADDR[31:0],M_AXI_GP0_WDATA[31:0],M_AXI_GP0_ARCACHE[3:0],M_AXI_GP0_ARLEN[3:0],M_AXI_GP0_ARQOS[3:0],M_AXI_GP0_AWCACHE[3:0],M_AXI_GP0_AWLEN[3:0],M_AXI_GP0_AWQOS[3:0],M_AXI_GP0_WSTRB[3:0],M_AXI_GP0_ACLK,M_AXI_GP0_ARREADY,M_AXI_GP0_AWREADY,M_AXI_GP0_BVALID,M_AXI_GP0_RLAST,M_AXI_GP0_RVALID,M_AXI_GP0_WREADY,M_AXI_GP0_BID[11:0],M_AXI_GP0_RID[11:0],M_AXI_GP0_BRESP[1:0],M_AXI_GP0_RRESP[1:0],M_AXI_GP0_RDATA[31:0],IRQ_F2P[0:0],FCLK_CLK0,FCLK_CLK1,FCLK_RESET0_N,MIO[31:0],DDR_CAS_n,DDR_CKE,DDR_Clk_n,DDR_Clk,DDR_CS_n,DDR_DRSTB,DDR_ODT,DDR_RAS_n,DDR_WEB,DDR_BankAddr[2:0],DDR_Addr[14:0],DDR_VRN,DDR_VRP,DDR_DM[1:0],DDR_DQ[15:0],DDR_DQS_n[1:0],DDR_DQS[1:0],PS_SRSTB,PS_CLK,PS_PORB" */; + input [63:0]GPIO_I; + output [63:0]GPIO_O; + output [63:0]GPIO_T; + input I2C0_SDA_I; + output I2C0_SDA_O; + output I2C0_SDA_T; + input I2C0_SCL_I; + output I2C0_SCL_O; + output I2C0_SCL_T; + output SDIO0_CLK; + input SDIO0_CLK_FB; + output SDIO0_CMD_O; + input SDIO0_CMD_I; + output SDIO0_CMD_T; + input [3:0]SDIO0_DATA_I; + output [3:0]SDIO0_DATA_O; + output [3:0]SDIO0_DATA_T; + output SDIO0_LED; + input SDIO0_CDN; + input SDIO0_WP; + output SDIO0_BUSPOW; + output [2:0]SDIO0_BUSVOLT; + input SPI0_SCLK_I; + output SPI0_SCLK_O; + output SPI0_SCLK_T; + input SPI0_MOSI_I; + output SPI0_MOSI_O; + output SPI0_MOSI_T; + input SPI0_MISO_I; + output SPI0_MISO_O; + output SPI0_MISO_T; + input SPI0_SS_I; + output SPI0_SS_O; + output SPI0_SS1_O; + output SPI0_SS2_O; + output SPI0_SS_T; + input SPI1_SCLK_I; + output SPI1_SCLK_O; + output SPI1_SCLK_T; + input SPI1_MOSI_I; + output SPI1_MOSI_O; + output SPI1_MOSI_T; + input SPI1_MISO_I; + output SPI1_MISO_O; + output SPI1_MISO_T; + input SPI1_SS_I; + output SPI1_SS_O; + output SPI1_SS1_O; + output SPI1_SS2_O; + output SPI1_SS_T; + output UART0_TX; + input UART0_RX; + output TTC0_WAVE0_OUT; + output TTC0_WAVE1_OUT; + output TTC0_WAVE2_OUT; + output TTC1_WAVE0_OUT; + output TTC1_WAVE1_OUT; + output TTC1_WAVE2_OUT; + output [1:0]USB0_PORT_INDCTL; + output USB0_VBUS_PWRSELECT; + input USB0_VBUS_PWRFAULT; + output M_AXI_GP0_ARVALID; + output M_AXI_GP0_AWVALID; + output M_AXI_GP0_BREADY; + output M_AXI_GP0_RREADY; + output M_AXI_GP0_WLAST; + output M_AXI_GP0_WVALID; + output [11:0]M_AXI_GP0_ARID; + output [11:0]M_AXI_GP0_AWID; + output [11:0]M_AXI_GP0_WID; + output [1:0]M_AXI_GP0_ARBURST; + output [1:0]M_AXI_GP0_ARLOCK; + output [2:0]M_AXI_GP0_ARSIZE; + output [1:0]M_AXI_GP0_AWBURST; + output [1:0]M_AXI_GP0_AWLOCK; + output [2:0]M_AXI_GP0_AWSIZE; + output [2:0]M_AXI_GP0_ARPROT; + output [2:0]M_AXI_GP0_AWPROT; + output [31:0]M_AXI_GP0_ARADDR; + output [31:0]M_AXI_GP0_AWADDR; + output [31:0]M_AXI_GP0_WDATA; + output [3:0]M_AXI_GP0_ARCACHE; + output [3:0]M_AXI_GP0_ARLEN; + output [3:0]M_AXI_GP0_ARQOS; + output [3:0]M_AXI_GP0_AWCACHE; + output [3:0]M_AXI_GP0_AWLEN; + output [3:0]M_AXI_GP0_AWQOS; + output [3:0]M_AXI_GP0_WSTRB; + input M_AXI_GP0_ACLK; + input M_AXI_GP0_ARREADY; + input M_AXI_GP0_AWREADY; + input M_AXI_GP0_BVALID; + input M_AXI_GP0_RLAST; + input M_AXI_GP0_RVALID; + input M_AXI_GP0_WREADY; + input [11:0]M_AXI_GP0_BID; + input [11:0]M_AXI_GP0_RID; + input [1:0]M_AXI_GP0_BRESP; + input [1:0]M_AXI_GP0_RRESP; + input [31:0]M_AXI_GP0_RDATA; + input [0:0]IRQ_F2P; + output FCLK_CLK0; + output FCLK_CLK1; + output FCLK_RESET0_N; + inout [31:0]MIO; + inout DDR_CAS_n; + inout DDR_CKE; + inout DDR_Clk_n; + inout DDR_Clk; + inout DDR_CS_n; + inout DDR_DRSTB; + inout DDR_ODT; + inout DDR_RAS_n; + inout DDR_WEB; + inout [2:0]DDR_BankAddr; + inout [14:0]DDR_Addr; + inout DDR_VRN; + inout DDR_VRP; + inout [1:0]DDR_DM; + inout [15:0]DDR_DQ; + inout [1:0]DDR_DQS_n; + inout [1:0]DDR_DQS; + inout PS_SRSTB; + inout PS_CLK; + inout PS_PORB; +endmodule diff --git a/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/stats.txt b/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/stats.txt new file mode 100644 index 0000000..4b52009 --- /dev/null +++ b/LED_Blink/LED_Blink.cache/ip/2018.2/50c2fa8fed532918/stats.txt @@ -0,0 +1,4 @@ +NumberHits:0 +Timestamp: Fri Aug 17 08:36:46 UTC 2018 +VLNV: xilinx.com:ip:processing_system7:5.5 +SynthRuntime: 62 diff --git a/LED_Blink/LED_Blink.cache/wt/webtalk_pa.xml b/LED_Blink/LED_Blink.cache/wt/webtalk_pa.xml new file mode 100644 index 0000000..4ab304f --- /dev/null +++ b/LED_Blink/LED_Blink.cache/wt/webtalk_pa.xml @@ -0,0 +1,122 @@ + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_1.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_1.xml new file mode 100644 index 0000000..723c628 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_1.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_10.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_10.xml new file mode 100644 index 0000000..723c628 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_10.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_11.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_11.xml new file mode 100644 index 0000000..174466d --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_11.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_12.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_12.xml new file mode 100644 index 0000000..723c628 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_12.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_13.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_13.xml new file mode 100644 index 0000000..1b0feda --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_13.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_2.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_2.xml new file mode 100644 index 0000000..a5ccf12 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_2.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_3.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_3.xml new file mode 100644 index 0000000..ae806f5 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_3.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_4.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_4.xml new file mode 100644 index 0000000..723c628 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_4.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_5.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_5.xml new file mode 100644 index 0000000..723c628 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_5.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_6.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_6.xml new file mode 100644 index 0000000..723c628 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_6.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_7.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_7.xml new file mode 100644 index 0000000..723c628 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_7.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_8.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_8.xml new file mode 100644 index 0000000..723c628 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_8.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/.jobs/vrs_config_9.xml b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_9.xml new file mode 100644 index 0000000..723c628 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/.jobs/vrs_config_9.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.dcp b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.dcp new file mode 100644 index 0000000000000000000000000000000000000000..acbdf8ac61273db8fb2a7366576c20a91e3885a6 GIT binary patch literal 13314 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 literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.tcl b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.tcl new file mode 100644 index 0000000..beedb5a --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.tcl @@ -0,0 +1,168 @@ +# +# Synthesis run script generated by Vivado +# + +set TIME_start [clock seconds] +proc create_report { reportName command } { + set status "." + append status $reportName ".fail" + if { [file exists $status] } { + eval file delete [glob $status] + } + send_msg_id runtcl-4 info "Executing : $command" + set retval [eval catch { $command } msg] + if { $retval != 0 } { + set fp [open $status w] + close $fp + send_msg_id runtcl-5 warning "$msg" + } +} +set_msg_config -id {HDL-1065} -limit 10000 +set_param project.vivado.isBlockSynthRun true +create_project -in_memory -part xc7z010clg225-1 + +set_param project.singleFileAddWarning.threshold 0 +set_param project.compositeFile.enableAutoGeneration 0 +set_param synth.vivado.isSynthRun true +set_msg_config -source 4 -id {IP_Flow 19-2162} -severity warning -new_severity info +set_property webtalk.parent_dir C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.cache/wt [current_project] +set_property parent.project_path C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.xpr [current_project] +set_property XPM_LIBRARIES {XPM_FIFO XPM_MEMORY} [current_project] +set_property default_lib xil_defaultlib [current_project] +set_property target_language Verilog [current_project] +set_property ip_output_repo c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.cache/ip [current_project] +set_property ip_cache_permissions {read write} [current_project] +read_verilog -library xil_defaultlib C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/new/led.v +read_ip -quiet c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xci + +# Mark all dcp files as not used in implementation to prevent them from being +# stitched into the results of this synthesis run. Any black boxes in the +# design are intentionally left as such for best results. Dcp files will be +# stitched into the design at a later time, either when this synthesis run is +# opened, or when it is stitched into a dependent implementation run. +foreach dcp [get_files -quiet -all -filter file_type=="Design\ Checkpoint"] { + set_property used_in_implementation false $dcp +} +set_param ips.enableIPCacheLiteLoad 0 + +set cached_ip [config_ip_cache -export -no_bom -use_project_ipc -dir C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1 -new_name design_1_led_0_0 -ip [get_ips design_1_led_0_0]] + +if { $cached_ip eq {} } { +close [open __synthesis_is_running__ w] + +synth_design -top design_1_led_0_0 -part xc7z010clg225-1 -mode out_of_context + +#--------------------------------------------------------- +# Generate Checkpoint/Stub/Simulation Files For IP Cache +#--------------------------------------------------------- +# disable binary constraint mode for IPCache checkpoints +set_param constraints.enableBinaryConstraints false + +catch { + write_checkpoint -force -noxdef -rename_prefix design_1_led_0_0_ design_1_led_0_0.dcp + + set ipCachedFiles {} + write_verilog -force -mode synth_stub -rename_top decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix -prefix decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_ design_1_led_0_0_stub.v + lappend ipCachedFiles design_1_led_0_0_stub.v + + write_vhdl -force -mode synth_stub -rename_top decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix -prefix decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_ design_1_led_0_0_stub.vhdl + lappend ipCachedFiles design_1_led_0_0_stub.vhdl + + write_verilog -force -mode funcsim -rename_top decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix -prefix decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_ design_1_led_0_0_sim_netlist.v + lappend ipCachedFiles design_1_led_0_0_sim_netlist.v + + write_vhdl -force -mode funcsim -rename_top decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix -prefix decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_ design_1_led_0_0_sim_netlist.vhdl + lappend ipCachedFiles design_1_led_0_0_sim_netlist.vhdl +set TIME_taken [expr [clock seconds] - $TIME_start] + + config_ip_cache -add -dcp design_1_led_0_0.dcp -move_files $ipCachedFiles -use_project_ipc -synth_runtime $TIME_taken -ip [get_ips design_1_led_0_0] +} + +rename_ref -prefix_all design_1_led_0_0_ + +# disable binary constraint mode for synth run checkpoints +set_param constraints.enableBinaryConstraints false +write_checkpoint -force -noxdef design_1_led_0_0.dcp +create_report "design_1_led_0_0_synth_1_synth_report_utilization_0" "report_utilization -file design_1_led_0_0_utilization_synth.rpt -pb design_1_led_0_0_utilization_synth.pb" + +if { [catch { + file copy -force C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.dcp c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.dcp +} _RESULT ] } { + send_msg_id runtcl-3 error "ERROR: Unable to successfully create or copy the sub-design checkpoint file." + error "ERROR: Unable to successfully create or copy the sub-design checkpoint file." +} + +if { [catch { + write_verilog -force -mode synth_stub c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.v +} _RESULT ] } { + puts "CRITICAL WARNING: Unable to successfully create a Verilog synthesis stub for the sub-design. This may lead to errors in top level synthesis of the design. Error reported: $_RESULT" +} + +if { [catch { + write_vhdl -force -mode synth_stub c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.vhdl +} _RESULT ] } { + puts "CRITICAL WARNING: Unable to successfully create a VHDL synthesis stub for the sub-design. This may lead to errors in top level synthesis of the design. Error reported: $_RESULT" +} + +if { [catch { + write_verilog -force -mode funcsim c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_sim_netlist.v +} _RESULT ] } { + puts "CRITICAL WARNING: Unable to successfully create the Verilog functional simulation sub-design file. Post-Synthesis Functional Simulation with this file may not be possible or may give incorrect results. Error reported: $_RESULT" +} + +if { [catch { + write_vhdl -force -mode funcsim c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_sim_netlist.vhdl +} _RESULT ] } { + puts "CRITICAL WARNING: Unable to successfully create the VHDL functional simulation sub-design file. Post-Synthesis Functional Simulation with this file may not be possible or may give incorrect results. Error reported: $_RESULT" +} + + +} else { + + +if { [catch { + file copy -force C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.dcp c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.dcp +} _RESULT ] } { + send_msg_id runtcl-3 error "ERROR: Unable to successfully create or copy the sub-design checkpoint file." + error "ERROR: Unable to successfully create or copy the sub-design checkpoint file." +} + +if { [catch { + file rename -force C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_stub.v c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.v +} _RESULT ] } { + puts "CRITICAL WARNING: Unable to successfully create a Verilog synthesis stub for the sub-design. This may lead to errors in top level synthesis of the design. Error reported: $_RESULT" +} + +if { [catch { + file rename -force C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_stub.vhdl c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.vhdl +} _RESULT ] } { + puts "CRITICAL WARNING: Unable to successfully create a VHDL synthesis stub for the sub-design. This may lead to errors in top level synthesis of the design. Error reported: $_RESULT" +} + +if { [catch { + file rename -force C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_sim_netlist.v c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_sim_netlist.v +} _RESULT ] } { + puts "CRITICAL WARNING: Unable to successfully create the Verilog functional simulation sub-design file. Post-Synthesis Functional Simulation with this file may not be possible or may give incorrect results. Error reported: $_RESULT" +} + +if { [catch { + file rename -force C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_sim_netlist.vhdl c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_sim_netlist.vhdl +} _RESULT ] } { + puts "CRITICAL WARNING: Unable to successfully create the VHDL functional simulation sub-design file. Post-Synthesis Functional Simulation with this file may not be possible or may give incorrect results. Error reported: $_RESULT" +} + +}; # end if cached_ip + +if {[file isdir C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.ip_user_files/ip/design_1_led_0_0]} { + catch { + file copy -force c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.v C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.ip_user_files/ip/design_1_led_0_0 + } +} + +if {[file isdir C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.ip_user_files/ip/design_1_led_0_0]} { + catch { + file copy -force c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.vhdl C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.ip_user_files/ip/design_1_led_0_0 + } +} +file delete __synthesis_is_running__ +close [open __synthesis_is_complete__ w] diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.vds b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.vds new file mode 100644 index 0000000..3e7a700 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.vds @@ -0,0 +1,268 @@ +#----------------------------------------------------------- +# Vivado v2018.2 (64-bit) +# SW Build 2258646 on Thu Jun 14 20:03:12 MDT 2018 +# IP Build 2256618 on Thu Jun 14 22:10:49 MDT 2018 +# Start of session at: Fri Aug 17 17:41:53 2018 +# Process ID: 20792 +# Current directory: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1 +# Command line: vivado.exe -log design_1_led_0_0.vds -product Vivado -mode batch -messageDb vivado.pb -notrace -source design_1_led_0_0.tcl +# Log file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.vds +# Journal file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1\vivado.jou +#----------------------------------------------------------- +source design_1_led_0_0.tcl -notrace +Command: synth_design -top design_1_led_0_0 -part xc7z010clg225-1 -mode out_of_context +Starting synth_design +Attempting to get a license for feature 'Synthesis' and/or device 'xc7z010' +INFO: [Common 17-349] Got license for feature 'Synthesis' and/or device 'xc7z010' +INFO: Launching helper process for spawning children vivado processes +INFO: Helper process launched with PID 6368 +--------------------------------------------------------------------------------- +Starting RTL Elaboration : Time (s): cpu = 00:00:03 ; elapsed = 00:00:04 . Memory (MB): peak = 375.090 ; gain = 104.203 +--------------------------------------------------------------------------------- +INFO: [Synth 8-6157] synthesizing module 'design_1_led_0_0' [c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/synth/design_1_led_0_0.v:58] +INFO: [Synth 8-6157] synthesizing module 'led' [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/new/led.v:24] +INFO: [Synth 8-6155] done synthesizing module 'led' (1#1) [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/new/led.v:24] +INFO: [Synth 8-6155] done synthesizing module 'design_1_led_0_0' (2#1) [c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/synth/design_1_led_0_0.v:58] +--------------------------------------------------------------------------------- +Finished RTL Elaboration : Time (s): cpu = 00:00:04 ; elapsed = 00:00:05 . Memory (MB): peak = 429.695 ; gain = 158.809 +--------------------------------------------------------------------------------- + +Report Check Netlist: ++------+------------------+-------+---------+-------+------------------+ +| |Item |Errors |Warnings |Status |Description | ++------+------------------+-------+---------+-------+------------------+ +|1 |multi_driven_nets | 0| 0|Passed |Multi driven nets | ++------+------------------+-------+---------+-------+------------------+ +--------------------------------------------------------------------------------- +Start Handling Custom Attributes +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Handling Custom Attributes : Time (s): cpu = 00:00:04 ; elapsed = 00:00:05 . Memory (MB): peak = 429.695 ; gain = 158.809 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished RTL Optimization Phase 1 : Time (s): cpu = 00:00:04 ; elapsed = 00:00:05 . Memory (MB): peak = 429.695 ; gain = 158.809 +--------------------------------------------------------------------------------- +INFO: [Device 21-403] Loading part xc7z010clg225-1 +INFO: [Project 1-570] Preparing netlist for logic optimization + +Processing XDC Constraints +Initializing timing engine +Completed Processing XDC Constraints + +INFO: [Project 1-111] Unisim Transformation Summary: +No Unisim elements were transformed. + +WARNING: [Constraints 18-5210] No constraint will be written out. +Constraint Validation Runtime : Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.120 . Memory (MB): peak = 724.645 ; gain = 1.859 +--------------------------------------------------------------------------------- +Finished Constraint Validation : Time (s): cpu = 00:00:17 ; elapsed = 00:00:22 . Memory (MB): peak = 724.645 ; gain = 453.758 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Loading Part and Timing Information +--------------------------------------------------------------------------------- +Loading part: xc7z010clg225-1 +--------------------------------------------------------------------------------- +Finished Loading Part and Timing Information : Time (s): cpu = 00:00:17 ; elapsed = 00:00:22 . Memory (MB): peak = 724.645 ; gain = 453.758 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Applying 'set_property' XDC Constraints +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished applying 'set_property' XDC Constraints : Time (s): cpu = 00:00:17 ; elapsed = 00:00:22 . Memory (MB): peak = 724.645 ; gain = 453.758 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished RTL Optimization Phase 2 : Time (s): cpu = 00:00:18 ; elapsed = 00:00:22 . Memory (MB): peak = 724.645 ; gain = 453.758 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start RTL Component Statistics +--------------------------------------------------------------------------------- +Detailed RTL Component Info : ++---Registers : + 1 Bit Registers := 1 +--------------------------------------------------------------------------------- +Finished RTL Component Statistics +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start RTL Hierarchical Component Statistics +--------------------------------------------------------------------------------- +Hierarchical RTL Component report +Module led +Detailed RTL Component Info : ++---Registers : + 1 Bit Registers := 1 +--------------------------------------------------------------------------------- +Finished RTL Hierarchical Component Statistics +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Part Resource Summary +--------------------------------------------------------------------------------- +Part Resources: +DSPs: 80 (col length:40) +BRAMs: 120 (col length: RAMB18 40 RAMB36 20) +--------------------------------------------------------------------------------- +Finished Part Resource Summary +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Cross Boundary and Area Optimization +--------------------------------------------------------------------------------- +Warning: Parallel synthesis criteria is not met +--------------------------------------------------------------------------------- +Finished Cross Boundary and Area Optimization : Time (s): cpu = 00:00:18 ; elapsed = 00:00:24 . Memory (MB): peak = 724.645 ; gain = 453.758 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start Applying XDC Timing Constraints +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Applying XDC Timing Constraints : Time (s): cpu = 00:00:31 ; elapsed = 00:00:39 . Memory (MB): peak = 750.863 ; gain = 479.977 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Timing Optimization +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Timing Optimization : Time (s): cpu = 00:00:31 ; elapsed = 00:00:39 . Memory (MB): peak = 750.863 ; gain = 479.977 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start Technology Mapping +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Technology Mapping : Time (s): cpu = 00:00:31 ; elapsed = 00:00:39 . Memory (MB): peak = 760.973 ; gain = 490.086 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start IO Insertion +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Flattening Before IO Insertion +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Flattening Before IO Insertion +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Final Netlist Cleanup +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Final Netlist Cleanup +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished IO Insertion : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 760.973 ; gain = 490.086 +--------------------------------------------------------------------------------- + +Report Check Netlist: ++------+------------------+-------+---------+-------+------------------+ +| |Item |Errors |Warnings |Status |Description | ++------+------------------+-------+---------+-------+------------------+ +|1 |multi_driven_nets | 0| 0|Passed |Multi driven nets | ++------+------------------+-------+---------+-------+------------------+ +--------------------------------------------------------------------------------- +Start Renaming Generated Instances +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Renaming Generated Instances : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 760.973 ; gain = 490.086 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start Rebuilding User Hierarchy +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Rebuilding User Hierarchy : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 760.973 ; gain = 490.086 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Renaming Generated Ports +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Renaming Generated Ports : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 760.973 ; gain = 490.086 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Handling Custom Attributes +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Handling Custom Attributes : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 760.973 ; gain = 490.086 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Renaming Generated Nets +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Renaming Generated Nets : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 760.973 ; gain = 490.086 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Writing Synthesis Report +--------------------------------------------------------------------------------- + +Report BlackBoxes: ++-+--------------+----------+ +| |BlackBox name |Instances | ++-+--------------+----------+ ++-+--------------+----------+ + +Report Cell Usage: ++------+-------+------+ +| |Cell |Count | ++------+-------+------+ +|1 |CARRY4 | 7| +|2 |LUT1 | 1| +|3 |LUT4 | 2| +|4 |LUT5 | 2| +|5 |LUT6 | 3| +|6 |FDRE | 26| ++------+-------+------+ + +Report Instance Areas: ++------+---------+-------+------+ +| |Instance |Module |Cells | ++------+---------+-------+------+ +|1 |top | | 41| +|2 | inst |led | 41| ++------+---------+-------+------+ +--------------------------------------------------------------------------------- +Finished Writing Synthesis Report : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 760.973 ; gain = 490.086 +--------------------------------------------------------------------------------- +Synthesis finished with 0 errors, 0 critical warnings and 0 warnings. +Synthesis Optimization Runtime : Time (s): cpu = 00:00:19 ; elapsed = 00:00:28 . Memory (MB): peak = 760.973 ; gain = 195.137 +Synthesis Optimization Complete : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 760.973 ; gain = 490.086 +INFO: [Project 1-571] Translating synthesized netlist +INFO: [Netlist 29-17] Analyzing 7 Unisim elements for replacement +INFO: [Netlist 29-28] Unisim Transformation completed in 0 CPU seconds +INFO: [Project 1-570] Preparing netlist for logic optimization +INFO: [Opt 31-138] Pushed 0 inverter(s) to 0 load pin(s). +INFO: [Project 1-111] Unisim Transformation Summary: +No Unisim elements were transformed. + +INFO: [Common 17-83] Releasing license: Synthesis +15 Infos, 1 Warnings, 0 Critical Warnings and 0 Errors encountered. +synth_design completed successfully +synth_design: Time (s): cpu = 00:00:35 ; elapsed = 00:00:44 . Memory (MB): peak = 769.965 ; gain = 512.000 +WARNING: [Constraints 18-5210] No constraint will be written out. +INFO: [Common 17-1381] The checkpoint 'C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.dcp' has been generated. +WARNING: [Constraints 18-5210] No constraint will be written out. +INFO: [Common 17-1381] The checkpoint 'C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.dcp' has been generated. +INFO: [runtcl-4] Executing : report_utilization -file design_1_led_0_0_utilization_synth.rpt -pb design_1_led_0_0_utilization_synth.pb +report_utilization: Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.044 . Memory (MB): peak = 769.965 ; gain = 0.000 +INFO: [Common 17-206] Exiting Vivado at Fri Aug 17 17:42:47 2018... diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_sim_netlist.v b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_sim_netlist.v new file mode 100644 index 0000000..2d4e4a1 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_sim_netlist.v @@ -0,0 +1,503 @@ +// Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +// Date : Fri Aug 17 17:42:46 2018 +// Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +// Command : write_verilog -force -mode funcsim -rename_top decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix -prefix +// decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_ design_1_led_0_0_sim_netlist.v +// Design : design_1_led_0_0 +// Purpose : This verilog netlist is a functional simulation representation of the design and should not be modified +// or synthesized. This netlist cannot be used for SDF annotated simulation. +// Device : xc7z010clg225-1 +// -------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +(* CHECK_LICENSE_TYPE = "design_1_led_0_0,led,{}" *) (* DowngradeIPIdentifiedWarnings = "yes" *) (* IP_DEFINITION_SOURCE = "module_ref" *) +(* X_CORE_INFO = "led,Vivado 2018.2" *) +(* NotValidForBitStream *) +module decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix + (m_clock, + led_op); + (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 m_clock CLK" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME m_clock, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) input m_clock; + output led_op; + + wire led_op; + wire m_clock; + + decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_led inst + (.led_op(led_op), + .m_clock(m_clock)); +endmodule + +module decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_led + (led_op, + m_clock); + output led_op; + input m_clock; + + wire clear; + wire \cnt[0]_i_3_n_0 ; + wire \cnt[0]_i_4_n_0 ; + wire \cnt[0]_i_5_n_0 ; + wire [24:6]cnt_reg; + wire \cnt_reg[0]_i_2_n_0 ; + wire \cnt_reg[0]_i_2_n_1 ; + wire \cnt_reg[0]_i_2_n_2 ; + wire \cnt_reg[0]_i_2_n_3 ; + wire \cnt_reg[0]_i_2_n_4 ; + wire \cnt_reg[0]_i_2_n_5 ; + wire \cnt_reg[0]_i_2_n_6 ; + wire \cnt_reg[0]_i_2_n_7 ; + wire \cnt_reg[12]_i_1_n_0 ; + wire \cnt_reg[12]_i_1_n_1 ; + wire \cnt_reg[12]_i_1_n_2 ; + wire \cnt_reg[12]_i_1_n_3 ; + wire \cnt_reg[12]_i_1_n_4 ; + wire \cnt_reg[12]_i_1_n_5 ; + wire \cnt_reg[12]_i_1_n_6 ; + wire \cnt_reg[12]_i_1_n_7 ; + wire \cnt_reg[16]_i_1_n_0 ; + wire \cnt_reg[16]_i_1_n_1 ; + wire \cnt_reg[16]_i_1_n_2 ; + wire \cnt_reg[16]_i_1_n_3 ; + wire \cnt_reg[16]_i_1_n_4 ; + wire \cnt_reg[16]_i_1_n_5 ; + wire \cnt_reg[16]_i_1_n_6 ; + wire \cnt_reg[16]_i_1_n_7 ; + wire \cnt_reg[20]_i_1_n_0 ; + wire \cnt_reg[20]_i_1_n_1 ; + wire \cnt_reg[20]_i_1_n_2 ; + wire \cnt_reg[20]_i_1_n_3 ; + wire \cnt_reg[20]_i_1_n_4 ; + wire \cnt_reg[20]_i_1_n_5 ; + wire \cnt_reg[20]_i_1_n_6 ; + wire \cnt_reg[20]_i_1_n_7 ; + wire \cnt_reg[24]_i_1_n_7 ; + wire \cnt_reg[4]_i_1_n_0 ; + wire \cnt_reg[4]_i_1_n_1 ; + wire \cnt_reg[4]_i_1_n_2 ; + wire \cnt_reg[4]_i_1_n_3 ; + wire \cnt_reg[4]_i_1_n_4 ; + wire \cnt_reg[4]_i_1_n_5 ; + wire \cnt_reg[4]_i_1_n_6 ; + wire \cnt_reg[4]_i_1_n_7 ; + wire \cnt_reg[8]_i_1_n_0 ; + wire \cnt_reg[8]_i_1_n_1 ; + wire \cnt_reg[8]_i_1_n_2 ; + wire \cnt_reg[8]_i_1_n_3 ; + wire \cnt_reg[8]_i_1_n_4 ; + wire \cnt_reg[8]_i_1_n_5 ; + wire \cnt_reg[8]_i_1_n_6 ; + wire \cnt_reg[8]_i_1_n_7 ; + wire \cnt_reg_n_0_[0] ; + wire \cnt_reg_n_0_[1] ; + wire \cnt_reg_n_0_[2] ; + wire \cnt_reg_n_0_[3] ; + wire \cnt_reg_n_0_[4] ; + wire \cnt_reg_n_0_[5] ; + wire led_op; + wire led_op_r_i_1_n_0; + wire led_op_r_i_2_n_0; + wire led_op_r_i_3_n_0; + wire led_op_r_i_4_n_0; + wire m_clock; + wire [3:0]\NLW_cnt_reg[24]_i_1_CO_UNCONNECTED ; + wire [3:1]\NLW_cnt_reg[24]_i_1_O_UNCONNECTED ; + + LUT6 #( + .INIT(64'hFFFF0000A8880000)) + \cnt[0]_i_1 + (.I0(\cnt[0]_i_3_n_0 ), + .I1(cnt_reg[17]), + .I2(\cnt[0]_i_4_n_0 ), + .I3(cnt_reg[16]), + .I4(cnt_reg[24]), + .I5(cnt_reg[23]), + .O(clear)); + LUT5 #( + .INIT(32'h80000000)) + \cnt[0]_i_3 + (.I0(cnt_reg[18]), + .I1(cnt_reg[19]), + .I2(cnt_reg[20]), + .I3(cnt_reg[22]), + .I4(cnt_reg[21]), + .O(\cnt[0]_i_3_n_0 )); + LUT6 #( + .INIT(64'hFFFFFFFF80000000)) + \cnt[0]_i_4 + (.I0(led_op_r_i_4_n_0), + .I1(cnt_reg[12]), + .I2(cnt_reg[11]), + .I3(cnt_reg[14]), + .I4(cnt_reg[13]), + .I5(cnt_reg[15]), + .O(\cnt[0]_i_4_n_0 )); + LUT1 #( + .INIT(2'h1)) + \cnt[0]_i_5 + (.I0(\cnt_reg_n_0_[0] ), + .O(\cnt[0]_i_5_n_0 )); + FDRE #( + .INIT(1'b0)) + \cnt_reg[0] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[0]_i_2_n_7 ), + .Q(\cnt_reg_n_0_[0] ), + .R(clear)); + CARRY4 \cnt_reg[0]_i_2 + (.CI(1'b0), + .CO({\cnt_reg[0]_i_2_n_0 ,\cnt_reg[0]_i_2_n_1 ,\cnt_reg[0]_i_2_n_2 ,\cnt_reg[0]_i_2_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b1}), + .O({\cnt_reg[0]_i_2_n_4 ,\cnt_reg[0]_i_2_n_5 ,\cnt_reg[0]_i_2_n_6 ,\cnt_reg[0]_i_2_n_7 }), + .S({\cnt_reg_n_0_[3] ,\cnt_reg_n_0_[2] ,\cnt_reg_n_0_[1] ,\cnt[0]_i_5_n_0 })); + FDRE #( + .INIT(1'b0)) + \cnt_reg[10] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[8]_i_1_n_5 ), + .Q(cnt_reg[10]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[11] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[8]_i_1_n_4 ), + .Q(cnt_reg[11]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[12] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[12]_i_1_n_7 ), + .Q(cnt_reg[12]), + .R(clear)); + CARRY4 \cnt_reg[12]_i_1 + (.CI(\cnt_reg[8]_i_1_n_0 ), + .CO({\cnt_reg[12]_i_1_n_0 ,\cnt_reg[12]_i_1_n_1 ,\cnt_reg[12]_i_1_n_2 ,\cnt_reg[12]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[12]_i_1_n_4 ,\cnt_reg[12]_i_1_n_5 ,\cnt_reg[12]_i_1_n_6 ,\cnt_reg[12]_i_1_n_7 }), + .S(cnt_reg[15:12])); + FDRE #( + .INIT(1'b0)) + \cnt_reg[13] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[12]_i_1_n_6 ), + .Q(cnt_reg[13]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[14] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[12]_i_1_n_5 ), + .Q(cnt_reg[14]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[15] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[12]_i_1_n_4 ), + .Q(cnt_reg[15]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[16] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[16]_i_1_n_7 ), + .Q(cnt_reg[16]), + .R(clear)); + CARRY4 \cnt_reg[16]_i_1 + (.CI(\cnt_reg[12]_i_1_n_0 ), + .CO({\cnt_reg[16]_i_1_n_0 ,\cnt_reg[16]_i_1_n_1 ,\cnt_reg[16]_i_1_n_2 ,\cnt_reg[16]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[16]_i_1_n_4 ,\cnt_reg[16]_i_1_n_5 ,\cnt_reg[16]_i_1_n_6 ,\cnt_reg[16]_i_1_n_7 }), + .S(cnt_reg[19:16])); + FDRE #( + .INIT(1'b0)) + \cnt_reg[17] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[16]_i_1_n_6 ), + .Q(cnt_reg[17]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[18] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[16]_i_1_n_5 ), + .Q(cnt_reg[18]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[19] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[16]_i_1_n_4 ), + .Q(cnt_reg[19]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[1] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[0]_i_2_n_6 ), + .Q(\cnt_reg_n_0_[1] ), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[20] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[20]_i_1_n_7 ), + .Q(cnt_reg[20]), + .R(clear)); + CARRY4 \cnt_reg[20]_i_1 + (.CI(\cnt_reg[16]_i_1_n_0 ), + .CO({\cnt_reg[20]_i_1_n_0 ,\cnt_reg[20]_i_1_n_1 ,\cnt_reg[20]_i_1_n_2 ,\cnt_reg[20]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[20]_i_1_n_4 ,\cnt_reg[20]_i_1_n_5 ,\cnt_reg[20]_i_1_n_6 ,\cnt_reg[20]_i_1_n_7 }), + .S(cnt_reg[23:20])); + FDRE #( + .INIT(1'b0)) + \cnt_reg[21] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[20]_i_1_n_6 ), + .Q(cnt_reg[21]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[22] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[20]_i_1_n_5 ), + .Q(cnt_reg[22]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[23] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[20]_i_1_n_4 ), + .Q(cnt_reg[23]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[24] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[24]_i_1_n_7 ), + .Q(cnt_reg[24]), + .R(clear)); + CARRY4 \cnt_reg[24]_i_1 + (.CI(\cnt_reg[20]_i_1_n_0 ), + .CO(\NLW_cnt_reg[24]_i_1_CO_UNCONNECTED [3:0]), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\NLW_cnt_reg[24]_i_1_O_UNCONNECTED [3:1],\cnt_reg[24]_i_1_n_7 }), + .S({1'b0,1'b0,1'b0,cnt_reg[24]})); + FDRE #( + .INIT(1'b0)) + \cnt_reg[2] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[0]_i_2_n_5 ), + .Q(\cnt_reg_n_0_[2] ), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[3] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[0]_i_2_n_4 ), + .Q(\cnt_reg_n_0_[3] ), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[4] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[4]_i_1_n_7 ), + .Q(\cnt_reg_n_0_[4] ), + .R(clear)); + CARRY4 \cnt_reg[4]_i_1 + (.CI(\cnt_reg[0]_i_2_n_0 ), + .CO({\cnt_reg[4]_i_1_n_0 ,\cnt_reg[4]_i_1_n_1 ,\cnt_reg[4]_i_1_n_2 ,\cnt_reg[4]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[4]_i_1_n_4 ,\cnt_reg[4]_i_1_n_5 ,\cnt_reg[4]_i_1_n_6 ,\cnt_reg[4]_i_1_n_7 }), + .S({cnt_reg[7:6],\cnt_reg_n_0_[5] ,\cnt_reg_n_0_[4] })); + FDRE #( + .INIT(1'b0)) + \cnt_reg[5] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[4]_i_1_n_6 ), + .Q(\cnt_reg_n_0_[5] ), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[6] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[4]_i_1_n_5 ), + .Q(cnt_reg[6]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[7] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[4]_i_1_n_4 ), + .Q(cnt_reg[7]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[8] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[8]_i_1_n_7 ), + .Q(cnt_reg[8]), + .R(clear)); + CARRY4 \cnt_reg[8]_i_1 + (.CI(\cnt_reg[4]_i_1_n_0 ), + .CO({\cnt_reg[8]_i_1_n_0 ,\cnt_reg[8]_i_1_n_1 ,\cnt_reg[8]_i_1_n_2 ,\cnt_reg[8]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[8]_i_1_n_4 ,\cnt_reg[8]_i_1_n_5 ,\cnt_reg[8]_i_1_n_6 ,\cnt_reg[8]_i_1_n_7 }), + .S(cnt_reg[11:8])); + FDRE #( + .INIT(1'b0)) + \cnt_reg[9] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[8]_i_1_n_6 ), + .Q(cnt_reg[9]), + .R(clear)); + LUT4 #( + .INIT(16'h37C8)) + led_op_r_i_1 + (.I0(cnt_reg[23]), + .I1(cnt_reg[24]), + .I2(led_op_r_i_2_n_0), + .I3(led_op), + .O(led_op_r_i_1_n_0)); + LUT6 #( + .INIT(64'hAAA8A8A888888888)) + led_op_r_i_2 + (.I0(\cnt[0]_i_3_n_0 ), + .I1(cnt_reg[17]), + .I2(cnt_reg[15]), + .I3(led_op_r_i_3_n_0), + .I4(led_op_r_i_4_n_0), + .I5(cnt_reg[16]), + .O(led_op_r_i_2_n_0)); + LUT4 #( + .INIT(16'h8000)) + led_op_r_i_3 + (.I0(cnt_reg[12]), + .I1(cnt_reg[11]), + .I2(cnt_reg[14]), + .I3(cnt_reg[13]), + .O(led_op_r_i_3_n_0)); + LUT5 #( + .INIT(32'hFFFFFFFE)) + led_op_r_i_4 + (.I0(cnt_reg[6]), + .I1(cnt_reg[9]), + .I2(cnt_reg[10]), + .I3(cnt_reg[8]), + .I4(cnt_reg[7]), + .O(led_op_r_i_4_n_0)); + FDRE #( + .INIT(1'b0)) + led_op_r_reg + (.C(m_clock), + .CE(1'b1), + .D(led_op_r_i_1_n_0), + .Q(led_op), + .R(1'b0)); +endmodule +`ifndef GLBL +`define GLBL +`timescale 1 ps / 1 ps + +module glbl (); + + parameter ROC_WIDTH = 100000; + parameter TOC_WIDTH = 0; + +//-------- STARTUP Globals -------------- + wire GSR; + wire GTS; + wire GWE; + wire PRLD; + tri1 p_up_tmp; + tri (weak1, strong0) PLL_LOCKG = p_up_tmp; + + wire PROGB_GLBL; + wire CCLKO_GLBL; + wire FCSBO_GLBL; + wire [3:0] DO_GLBL; + wire [3:0] DI_GLBL; + + reg GSR_int; + reg GTS_int; + reg PRLD_int; + +//-------- JTAG Globals -------------- + wire JTAG_TDO_GLBL; + wire JTAG_TCK_GLBL; + wire JTAG_TDI_GLBL; + wire JTAG_TMS_GLBL; + wire JTAG_TRST_GLBL; + + reg JTAG_CAPTURE_GLBL; + reg JTAG_RESET_GLBL; + reg JTAG_SHIFT_GLBL; + reg JTAG_UPDATE_GLBL; + reg JTAG_RUNTEST_GLBL; + + reg JTAG_SEL1_GLBL = 0; + reg JTAG_SEL2_GLBL = 0 ; + reg JTAG_SEL3_GLBL = 0; + reg JTAG_SEL4_GLBL = 0; + + reg JTAG_USER_TDO1_GLBL = 1'bz; + reg JTAG_USER_TDO2_GLBL = 1'bz; + reg JTAG_USER_TDO3_GLBL = 1'bz; + reg JTAG_USER_TDO4_GLBL = 1'bz; + + assign (strong1, weak0) GSR = GSR_int; + assign (strong1, weak0) GTS = GTS_int; + assign (weak1, weak0) PRLD = PRLD_int; + + initial begin + GSR_int = 1'b1; + PRLD_int = 1'b1; + #(ROC_WIDTH) + GSR_int = 1'b0; + PRLD_int = 1'b0; + end + + initial begin + GTS_int = 1'b1; + #(TOC_WIDTH) + GTS_int = 1'b0; + end + +endmodule +`endif diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_stub.v b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_stub.v new file mode 100644 index 0000000..59c08e3 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_stub.v @@ -0,0 +1,21 @@ +// Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +// Date : Fri Aug 17 17:42:46 2018 +// Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +// Command : write_verilog -force -mode synth_stub -rename_top decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix -prefix +// decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix_ design_1_led_0_0_stub.v +// Design : design_1_led_0_0 +// Purpose : Stub declaration of top-level module interface +// Device : xc7z010clg225-1 +// -------------------------------------------------------------------------------- + +// This empty module with port declaration file causes synthesis tools to infer a black box for IP. +// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion. +// Please paste the declaration into a Verilog source file or add the file as an additional source. +(* X_CORE_INFO = "led,Vivado 2018.2" *) +module decalper_eb_ot_sdeen_pot_pi_dehcac_xnilix(m_clock, led_op) +/* synthesis syn_black_box black_box_pad_pin="m_clock,led_op" */; + input m_clock; + output led_op; +endmodule diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_utilization_synth.pb b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_utilization_synth.pb new file mode 100644 index 0000000000000000000000000000000000000000..b79f22e89be8500570be2c8a78579e7ae8d69ffe GIT binary patch literal 224 zcmd;LGcqu=&@-CEtPxzAo10ivsgR$hP+F3ilUbEml9`_e;%28-Dioy_=a&{Grxxp- z9%i$7#J8F_X;yKbh@>Q^ypdH_DTXp8170kH0*X=Dg|P% zl?Rc3fno@cO literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_utilization_synth.rpt b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_utilization_synth.rpt new file mode 100644 index 0000000..7014123 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0_utilization_synth.rpt @@ -0,0 +1,173 @@ +Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +--------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +| Date : Fri Aug 17 17:42:47 2018 +| Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +| Command : report_utilization -file design_1_led_0_0_utilization_synth.rpt -pb design_1_led_0_0_utilization_synth.pb +| Design : design_1_led_0_0 +| Device : 7z010clg225-1 +| Design State : Synthesized +--------------------------------------------------------------------------------------------------------------------------- + +Utilization Design Information + +Table of Contents +----------------- +1. Slice Logic +1.1 Summary of Registers by Type +2. Memory +3. DSP +4. IO and GT Specific +5. Clocking +6. Specific Feature +7. Primitives +8. Black Boxes +9. Instantiated Netlists + +1. Slice Logic +-------------- + ++-------------------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-------------------------+------+-------+-----------+-------+ +| Slice LUTs* | 8 | 0 | 17600 | 0.05 | +| LUT as Logic | 8 | 0 | 17600 | 0.05 | +| LUT as Memory | 0 | 0 | 6000 | 0.00 | +| Slice Registers | 26 | 0 | 35200 | 0.07 | +| Register as Flip Flop | 26 | 0 | 35200 | 0.07 | +| Register as Latch | 0 | 0 | 35200 | 0.00 | +| F7 Muxes | 0 | 0 | 8800 | 0.00 | +| F8 Muxes | 0 | 0 | 4400 | 0.00 | ++-------------------------+------+-------+-----------+-------+ +* Warning! The Final LUT count, after physical optimizations and full implementation, is typically lower. Run opt_design after synthesis, if not already completed, for a more realistic count. + + +1.1 Summary of Registers by Type +-------------------------------- + ++-------+--------------+-------------+--------------+ +| Total | Clock Enable | Synchronous | Asynchronous | ++-------+--------------+-------------+--------------+ +| 0 | _ | - | - | +| 0 | _ | - | Set | +| 0 | _ | - | Reset | +| 0 | _ | Set | - | +| 0 | _ | Reset | - | +| 0 | Yes | - | - | +| 0 | Yes | - | Set | +| 0 | Yes | - | Reset | +| 0 | Yes | Set | - | +| 26 | Yes | Reset | - | ++-------+--------------+-------------+--------------+ + + +2. Memory +--------- + ++----------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++----------------+------+-------+-----------+-------+ +| Block RAM Tile | 0 | 0 | 60 | 0.00 | +| RAMB36/FIFO* | 0 | 0 | 60 | 0.00 | +| RAMB18 | 0 | 0 | 120 | 0.00 | ++----------------+------+-------+-----------+-------+ +* Note: Each Block RAM Tile only has one FIFO logic available and therefore can accommodate only one FIFO36E1 or one FIFO18E1. However, if a FIFO18E1 occupies a Block RAM Tile, that tile can still accommodate a RAMB18E1 + + +3. DSP +------ + ++-----------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-----------+------+-------+-----------+-------+ +| DSPs | 0 | 0 | 80 | 0.00 | ++-----------+------+-------+-----------+-------+ + + +4. IO and GT Specific +--------------------- + ++-----------------------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-----------------------------+------+-------+-----------+-------+ +| Bonded IOB | 0 | 0 | 54 | 0.00 | +| Bonded IPADs | 0 | 0 | 2 | 0.00 | +| Bonded IOPADs | 0 | 0 | 130 | 0.00 | +| PHY_CONTROL | 0 | 0 | 2 | 0.00 | +| PHASER_REF | 0 | 0 | 2 | 0.00 | +| OUT_FIFO | 0 | 0 | 8 | 0.00 | +| IN_FIFO | 0 | 0 | 8 | 0.00 | +| IDELAYCTRL | 0 | 0 | 2 | 0.00 | +| IBUFDS | 0 | 0 | 54 | 0.00 | +| PHASER_OUT/PHASER_OUT_PHY | 0 | 0 | 8 | 0.00 | +| PHASER_IN/PHASER_IN_PHY | 0 | 0 | 8 | 0.00 | +| IDELAYE2/IDELAYE2_FINEDELAY | 0 | 0 | 100 | 0.00 | +| ILOGIC | 0 | 0 | 54 | 0.00 | +| OLOGIC | 0 | 0 | 54 | 0.00 | ++-----------------------------+------+-------+-----------+-------+ + + +5. Clocking +----------- + ++------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++------------+------+-------+-----------+-------+ +| BUFGCTRL | 0 | 0 | 32 | 0.00 | +| BUFIO | 0 | 0 | 8 | 0.00 | +| MMCME2_ADV | 0 | 0 | 2 | 0.00 | +| PLLE2_ADV | 0 | 0 | 2 | 0.00 | +| BUFMRCE | 0 | 0 | 4 | 0.00 | +| BUFHCE | 0 | 0 | 48 | 0.00 | +| BUFR | 0 | 0 | 8 | 0.00 | ++------------+------+-------+-----------+-------+ + + +6. Specific Feature +------------------- + ++-------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-------------+------+-------+-----------+-------+ +| BSCANE2 | 0 | 0 | 4 | 0.00 | +| CAPTUREE2 | 0 | 0 | 1 | 0.00 | +| DNA_PORT | 0 | 0 | 1 | 0.00 | +| EFUSE_USR | 0 | 0 | 1 | 0.00 | +| FRAME_ECCE2 | 0 | 0 | 1 | 0.00 | +| ICAPE2 | 0 | 0 | 2 | 0.00 | +| STARTUPE2 | 0 | 0 | 1 | 0.00 | +| XADC | 0 | 0 | 1 | 0.00 | ++-------------+------+-------+-----------+-------+ + + +7. Primitives +------------- + ++----------+------+---------------------+ +| Ref Name | Used | Functional Category | ++----------+------+---------------------+ +| FDRE | 26 | Flop & Latch | +| CARRY4 | 7 | CarryLogic | +| LUT6 | 3 | LUT | +| LUT5 | 2 | LUT | +| LUT4 | 2 | LUT | +| LUT1 | 1 | LUT | ++----------+------+---------------------+ + + +8. Black Boxes +-------------- + ++----------+------+ +| Ref Name | Used | ++----------+------+ + + +9. Instantiated Netlists +------------------------ + ++----------+------+ +| Ref Name | Used | ++----------+------+ + + diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/gen_run.xml b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/gen_run.xml new file mode 100644 index 0000000..e79c9f1 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/gen_run.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vivado Synthesis Defaults + + + + diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/htr.txt b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/htr.txt new file mode 100644 index 0000000..11a5098 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/htr.txt @@ -0,0 +1,9 @@ +REM +REM Vivado(TM) +REM htr.txt: a Vivado-generated description of how-to-repeat the +REM the basic steps of a run. Note that runme.bat/sh needs +REM to be invoked for Vivado to track run status. +REM Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +REM + +vivado -log design_1_led_0_0.vds -m64 -product Vivado -mode batch -messageDb vivado.pb -notrace -source design_1_led_0_0.tcl diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/vivado.jou b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/vivado.jou new file mode 100644 index 0000000..d6b350e --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/vivado.jou @@ -0,0 +1,12 @@ +#----------------------------------------------------------- +# Vivado v2018.2 (64-bit) +# SW Build 2258646 on Thu Jun 14 20:03:12 MDT 2018 +# IP Build 2256618 on Thu Jun 14 22:10:49 MDT 2018 +# Start of session at: Fri Aug 17 17:41:53 2018 +# Process ID: 20792 +# Current directory: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1 +# Command line: vivado.exe -log design_1_led_0_0.vds -product Vivado -mode batch -messageDb vivado.pb -notrace -source design_1_led_0_0.tcl +# Log file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/design_1_led_0_0.vds +# Journal file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1\vivado.jou +#----------------------------------------------------------- +source design_1_led_0_0.tcl -notrace diff --git a/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/vivado.pb b/LED_Blink/LED_Blink.runs/design_1_led_0_0_synth_1/vivado.pb new file mode 100644 index 0000000000000000000000000000000000000000..700f9e00512b0b402db663c48d628d262d1dc141 GIT binary patch literal 27728 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%0DOxg z;9Euk!NPta1Q0bOfT%HpiJBvTs96R|6Ka^K@#h9ajS3)Y905^tucAayuC2?H(*LGC zY*qks9WrfApNikoQPPVZ{TJ^(7*q2kCc3@tR8 zV4=ANh#D4{sF46fP4am_)HFaujRi#1e1CExeL@AIi?^UvNF*AkJPjywm@mYF<;<-9 zwotPSw4B|AcxOP=kU&Ju>&i3>=IJ!6NWVUaE*A0D0@@5M5a$+w$Ye!8L9k*eh~p6u z1;OYaAyRc6^%Kg|CB+f|VlW+GPKLE4u@*V7enWnLEXZfZLjF*!C55%3u-09y6^pez zu-1F56$h;U2FQQF6U80kd!STZENcX@KmWS*H&66mF-rgMc_OUT1*T&Tq%JTWb0Bqr z=$L~Q4yI!cq%QFA1F6e(lu%gV1lfaYa1I7U$4rn?r5{}&0i;p&V=VuSWqz>9y&8^| zO#H>U`Y#6iwgIccW$l3_V?3~A3=K@il*GYgOualr#-xNz!DI|21x&^~#F8JP#J4aK0iuQv z5H+sXAfo0n5Y-EV9N;N#SOx9?w_> z2=J5X=$PJ=loZ?@L|-ynVQi0YH5k7%z2o)$TX8sj<&;Kw9&)?L{ ze;+kd^1C+M7k)Z1FN)V?^-h+#J&(Ricsjo$?<3UY7-y^ zi!;E8LZEp03KTEIytgH5z?3JnB9EAga|C7>U$L4lelig|18O0VgIWleKrI9ym|5Wm z%9$!IFhwkw0tjX%^nh~4M*|3NEV56wS`pqkZMp0NG%9Rk12w0y+1EJ=)_z}EYSV+N z@Mu;k8U?b6X@*Y&#mecgI!ciCB?PSrXc=l&{ zy6HdE5XWE>Buq4&fH+3tF$t&dPKZtyLJ!n8 zvOf82Qqv{){rCv#XPsP;vlLh+eYU5yE)BJBUWZUR)4;qST$|61LI>-K-wP57T#H=%WQYjJ>Syifbj2sWw8 z9}#TZ$v-04wzD88ojTOHxHJ&f;9r>Ms@PzAFPd=CFC9u2Seoi>Z81rbjsQx952%UW zXDvWgr4JM|PL|wqDo)%c?8&ed1FZMJ>Vd5WV0ChvWL<+3meZH6!N z$+bz>0!__eJ-tIxXlJncoBr-qjS)vF@qAGF$pVyqdYo}j&otigDX1|moe3hzc|aH= z0B10zLy~`x!E|u~mi$ACn)^Ue69y}4?g2&3TN)nR7gexKMg~N$XPVp#tnn9rZtSQecV>YM`of&<-!>6wyCtALM?0`7elO*Hfoko|5ExMtxsV&t~ zLtmMJxc;9jzNdn+8yt2*T#x*ZZV;q00%^=3(9@6+fYMsmA!!Vur=RSMv3F7`l)}WZ zMnv{Dn8h!(3OI#-=Y9mFF~?H3fi&hWNMWLK1BKtdffS|{Q2$+Z#yBx4)fPDYRq{Qx zs9J8wj|md^LxtVD{*cD>A5LMiJgldAc~}~A;cyC*M(^PiCd0$h80W)I`G4qXx{cWF zj7g#N0H_3f2_uwor4P!>8zp}Sb=Z#sZOI#~ZUk;eA8J28)DAn;esZWCbg1ojsO{wr zYOk+@gee7(Fg0|L=mfQqhuQ;&+I@%GJ%`#|huWQo+8u}5?T6Z}P$HH8%lm&*_M}fBqzCH-}w>5vh@7RzY0#MXc06o!>BvY|9U>=$AIt zbXs@SEH}k9XBng^UF$_-l`&gbWz1P@c9R5F850OAV^~^YWeg`fB&c~Yy8&l66$QiD zP5IdDrhbs!BvnQ^<3h>#GgXF zyJClhdiPMVhlP6g1ma-R0qFKZ-?QGc#hQ-5i~=TCJlyL9%vfMvjt8nf@vrYD$k@ok zQas{+`h1INl1#{vx;L6ue?;&(>kWoR$><#Vd$Va!29q2R#yEfsCh8$5gUKJtV7di_ zF)nZhQxZ_r$O1)82dt=h1Qaz3X2QK(kfLTPZ3k!KE|N~T7Y{b)A#)g*6QcDYxGw|q z%$wq&73$?n`3t!(1Lc=$HS>(2)SCt3SyxCH17$EZ!NQn)u+aPj8B84TLemKrn(IJO zgMbw^SHYS@l%Z4&30nSPwJNv#!s;08f3<)WE_dbquK7q~bDIvzmcn8h4la5;kk|_k$CegKogf<+NNP;j2bq( zsTrHy#D^8s+`}qkj>3YP8--XwjWnFyl!nc2>LBAS&Mo)ujbos}o%ypgm8%O8T)dQq zeyLaMg;AJ3B#gm>gfXDnVa~*OddRO&G zi~R|ebp@Q>(#>Hms?XZ#5k|M3U%mI- zOtsE}iFJ#)D-mcF>)}2{x=>*t{KFT{jn|Wie~Zd*qew z8@Y)xm|0|dzZ1)g^MwpAfm&|_EO|a&+znG??!dM!`qE*aiieggXvxV{yzSG zeBFoH{^N=EYAv*jIQ%8O8Osx6JLUZSZo1x~8!n+6k+fZ^LHhxrCI$D{?yK!_p(nhlK0`8un0Nr?76JtH@dU>8D%Y`%jwjItNuI$gY-Lom2x%lJV{zJ<( z6T8rY@JAS0PvgRwP^C~zXMD%;(kq6Sb=R8WI|g=gr^6A2vB3>#v7xKM^V!nt4yq64 zoRszE{0a3OJ)%oJJe`%fJB!~5XMK6QzdJVDv)!YruEsgS@NQ$czc2AJZ$Iu^ABJBeeQ){>YGc1O(Q9V_X}E)0 z9y3{ew2eftHIsf{LiyBjC+HbDI2IGqDu!1Oxp1R5sti77uOXJaKmnCXL(;rs8W-aA zy zdqW(Wa}DlWuQuJYgpQmN1xKENBVf$+jMlo*@iZIS z0ut^VH)7tLhR~uGr6+W*I3l;L>;=f!3vZm9H55|G#fq*y{vO56#pH|OH5fc)Xs!jWwYnK zcjP0aq_Nd9czRr3=T37S`6dfvuH?>Ni zK&-b@{rqOV{9z&J^$OKT*PJNmgSpN+4_ zW>8inab$Q<)d-bb+L^MObzANQJdyz<%j#k^p z$m;K{S(0{MObcYpWk)w|x%_-`!oI1nr~uEQHgiHEv$?E}X!4fc(iNSpTV%tW1}|RM zoqVCNVI}zOG5KUx)W*A(8#Hg3&)soXyU6y%KGc5@v5V-mM9|;PfJG4?QQM z65!Z)e(?%}$C=>0Y&!FTa|&mIqs=$orF)(UW`Pbcg9F_r8}G_~y=4Yp#20;xByX8@ zefmOIipeK`os9)Ue#xH+*3{p4=P{}vQI|gv{9JqD=+uXSKQwZNi25i_=jGYC?;)~JS?MtSN$18MVT|fVC;Ie0 zr`Jf^&D>XeJdBrmt_EAE!W$66R4A;Y{|^kPiJ7aw~W7HctjlnfIG*~i7lG=Oc4 zONNPtY)bJl8mJ$S3=;v_bmC)O&tg99Ml3#^8p-TMeUw;s_2o3^ExJ!@FfyXri%N#< zp&wX#sRwHtv|{b>1AC|eYYYC>{}pSucOUqdVQsqu+v`{D&D>u&gx*;$vd`L&Ge^$O ze$sj5>tCr^npi)LpOAE)R&!)TunQHutmC^I%_Dn9(q972o9}LXF_F4a3};f&YFfyc z^ZV9QxhLdkB-^m}qupQ0iLBmZG2Zj2%7p#IjgeYMw1%p?fooSMt2jE<((L`6Ey1NP zwrsWu8RVsNvpF(}-Y?~)WWKw?kj$|;o2wSFY&XHw#8W8^O(g;90glD0;k3W z9iiaT9~`fuPSBro7kQ;%(C#NO_>!#pA&=0+x`j}1dcsi=W|yDAM%yRobKJlH6)?a$ zg}j;s3|IpLo+jWs^{TS@=_FT0bi`IOuegFUNO~Tdx)=+2sEoX6XL`OpQm*>R&rcJH z`*MmpFi$jP=BiKD3+$EsVa&Nh&~=#g_u@L>}-k!-k>z^rh~0I$^*Cwe4Ang#eu zU2>%XzD0hVqArjx{-pW$IBp}7uwJA?1a||&i=IosSxnp{6moXDWpE5QZ;XU^vI6Jb zORlHRk4vDhgH!DtEm!?EqJ#GL7YyWM9c25?^pPYXP*xnRi|tfD=nR58^$t3%8b>5d z8lb7YZyAt*sWITX*sxPegX=>3lWh{N+4A^Xj*^pAu;)Co_m;DZIroSbGcv+^GL#T> zdL4A0f;%%`Q9b$=`i`N!n(hiMIf{ISU!9=+D;u+imf7+M#>e2i`7gfROLV^oznJj5 zKLVei@E4(e67a_w*zHoaG`rt2H&H~Uxc1jY|PoA zo9wD#vNLp;ByzMr=f*PY1o$j_U)k1DA7#-`y z1!=+(C?oA6e~u9{dnciZSN_JvWI;X>Rpr$YV)QseM+ylP!YooTnkGhsL6y_xWN$UDidVt1!!*lTBWIXvxk2y%bBGhFgx z!(R3@Ax3+vY|peE>Af(z$2Q~{x6i=4D}}OJ?|Xs~*&Y5xh+6ux5g=$|9vI`kSVwfi zE7MICoffr<`^;k|Y~^lRouQ;hhScbAf-P&=`MGFMa2uv4W#7soifp8omjubG%9H{+ zy!q%R7x(&(Mt8k4pW5u(ekHqV(V<7{ZJDv(vil}}p}M%V!fOK=EbFm~36Alu+(C~H zAY?IUW3lwztpRe$Sr+oeP{9hX&0uo2eNnG@*V!0B+ToItjNuVw-3o{8=CtUA^>I|y zcnqT5QvHTlVl9FCjyEQ=PcW-+b!uyIYGt{(IkvfVwx(;b)t1rAS@Pz4Z?iUJrR)mc z_SkZJjb%-)_wZ`oJbBFys@TP9z-ZVvXggq+9yF=dW|wJc=xXaRxjlJ& zd}d>N(#;h;>fq#M?CHH(jZ7Gy7Tjr<-7zuua&g;7Z_iDci+Na_aew6DT;ka$TPP!0 z?scE}Ldg$?QU-So5;1ejTgs~ob(@-sUP}{=OU@gcZMLdnbh|XST}<+{S81r6 zM|eL>S7|9dS*Q82ySu!-GSwWM$!b_Rgpkk*u5@%n^CI77GDkaVHyLvTKa4XRPS_ud zIDz?b^uq2(TtBoj;duv1WIQ;y)~viW*W9j^7{6A&H~A8?@@p)2dZ)r82ffn7N*a%u z3Z0%3i!m`QLt9Tbwk!$cyCixp2f7wA-X_$mx;;BxPuEb;t>v=UH@Dh$OGvbIY3Fzc zVMXQlip?EILu=b5+scXJw1=B9Y57NaH|v%SWtKgPB{9vcO{{gS)eZ9*n<3NlifLaE z;8)^LuZpd%y_(teapdIG94ak7xmdu$zbq(+F&SZ(VRtk1$ZmeU{llCtI)dM~{``?#JpI8kbGt z5{F(HGSw`|h+V=cl(nOrsLggg+>M*>+}!+SWYF#)H0Ze-7Z<`)7ot&NJ=ecE8O2#y zw$gaUP)76W){5FWRGaEj`chZv>L}{l0@3>MOjL!`1&;dTDu!8sg&a5XZ9-7$hDCeZ zj=9ApMT63`gNE^|w}jpVcDBwVYkrPz)mR{g`s%uRB%50j?;=ylFK!u$#m%Uyprcli zMRNNe!($)l3e3^Jz}RgROXYXH1&MrE+IpIo=~fcaFJ}N$BvQk znO#D{Fh9AMc|7K&^R^a(ySv&}N;^=nKPA;JYb)wW)@GFF^n%fb$4b}GJ;TLk1*QW# z*9y@AzuLtLH%k>`Tf1Tm4Q%I}`<^AYBM@T)p-9}pn#txatCaFU8NJ0VYbq~?ZTsz_ z@{-=I*nIlVYdhRBQd>WRKOq1_cBSGc6mA6tBvfjJf z8{5Xy#Re<7O}R)UW_?UAZEx7ha<)0PGk3n(O-n2>&cH+3>!LyWl)8bLw+FflsWM$R zrL*}ox-0S7{9H4&KzqBPLD~Lt?6Ai^s&q2h(r#(;dU|(z+t9w5$N2W-bn|;deb23~ z@tVo`(ikx|8O&(xQsUn3mbZrty|>q<9l2PcprPzq+P>$xbi*Y~%hZaj=2X<_J!Rf0 z#c|0PL&NwbRAFcQUb!2(%l6og$=*W#9&)F&xjD2UH;t*})*WxJahI{#G2b?b!=gbouD$WL1Yy8UhJ+;?{6fQ zhI}%$DZmWtWC&O-pVeV$%kYmHXGfe7?a%g;pPCj!B+L8$6qc&Iu@&C@;R3 zTqkjJYpuBzIbJut9W~I(tuo-LWEr18;w~dm>0L1$4Dy7^wq zGVip7hjuA0sd%2etE>0^$`-hZm1p-y?VjW~%Fp_kpV&_$S&R{jAr~SGUW0+}uJFDSK}+yA zo2?C9F+QdkRRaAcS^NKc(QXP+;#ptCF+rL-u-rZ*?z?B#plgY z#J;XSnlMo+wA`L!RxiPwh~{22eZvRrz-D;)3U=<+f6#cT~moy`mLnOtjL)w7?$TO&g)Mg6|7(bng?=#~3h z4GXC;4O^=5d1Kx!DkVF^lH9g&7hEjzKb#NOk>THuNbtB_;wZLZzHKHNQaHU#=xE}Z z6rXvEzqU8(YgbdUfY#QF{f_4`oIfu<)4K<*UN<36(eI-NanW;cAv;5XJA!nn9yway z)*_=#44>u9TJU__dq@|sZ;ol0O3eN_MZG=Xt{N*d7%wJs{>RuE=k67iBI2zDGwt>E z#Lf9A!I^zC3A0i8evL@WOz%}iS05ep6X{{zP{GbZmvbnwX+c%7%tWNV;i}e?8bc3r z#KY|;x=t@M7j(0{6!etGdEJb=&`%6>FH|_9mr|TH#+fqL|KE)U`xe!cF$Bf{_#Wt*uwdud~GwotZw zf3?&S?7hw*NrNkLnV88v1EZgOlx+#l-S&04w(dU{V0I&e?cp4*+u01&5^_mJp`hDr zgYipSM(%~v{;SOcsmh7D$1S{b`c|7ZR+dNS@;|!et6uOlO8rEBqie02wQG`DoypTA z%|ItLquE;Dcz&$Er>pG4RM(&rN5+GD`e0AjN7q_rF!eF#3l;x*-2U9|_DVv9Y||SS zS)|kMu3J0dGt?GakyO6yy~+0WB=Uqk(U2Grzr=@50YKu9}>wLY7$ZRfUbPtzjoPzViLi&GlKNT8}lA z&(%k)KPwy)#L8WD6AEQK-mFiPC0rGJB%h4G-+yf(Pr#88x!&AaqLAD=?0UgFQ`W;` zN4^DNu~Pv3IJ;ORl4;wPIc#t@`uJKFSdF};_UBf1=@gxx#1>{YOO_yW$1FC(OAE<2 zTao4aQaJ+FXWNHFYvyXE7ALu{wl1e@%%n$c>13*8E`>{Etj3Eey+mV< z$KtRzK+S5XUtZ!_R=K@yE?MQ_HPN(tI^FuZmFh4;^rn%AOr=37`uXX+;O5m}z3`RN zw9@AJv{+@&Y?-%j9P?0_F1VXL>hA|_Yz2oBI-9dp^IJ&8R9tbSuA92oe{;V2R&wrX zsMs6N^~Z0Y7A$m&hsi_jiGDt{N|*CFGH+9{d=_T{$r~lYnFjhavFKmTvG2bekyPG) zT^O4th%oKr?Fz;ed8DIPe~HtFGr3E)2xi&=%D%o^ORJ}qw9EiebIV3`%X^Ydc7Fr8 zIV>yr%cy2}d)Cg|V>8`s=x)4nT;l%LUTGz>Ol*Zl+t9O=9<5Ds4fjZ`AAt!PanId% z7N&`eQ(VD^29x+)-UZ|801d)QpLxXc+0vc3&lc}-ZJ{rmAjk4 zOT&9psb`+R5&YR?eC430{xJWOiA$ZxPFQZ)6p_m0c9w zUQ&J0O|A5RdXXs4<@!AFkN(TBxR<)u=cbWOQSz;{Pg$(7U;FJ<-)i18krsWNKbjz)@uuF*n(;x6bfE5q z$o1aK-9hfe`BrD=vp=VkZsJ*~{=D05>ZAkDSe)K4l>^V{q!Zq14$nB1!y4NR&)8}% zEgFNJvH7C40CvV0=ia;683pFEiouL0th(-Y8~>iL2AYsMWf7d^pALdg<)jn*`z&O? z&%*NiEGoZebn*K=koxzjo|mom8OZ)JOF1yITkTo}K2mx90B;ruX~Gu>-kp zNv0J4n?B&#Or5hn`{2EFp!S8A#v(dQi#)ZduSsGX`|qi8Xx=pImFm9gPMqyFKzMrN zesXrcmj=OO8)$TSNyuZ*{%h75Y>h(Ms*=GO>&!vm0FQOXCn0Ns2k$?I#A9ssF{65Y zvL2;&`@a?kg7>{~mnlgd+^yI4kBd^UWv&}m`l26Y>~E9SHayttv16Apn6LE0U0&AR zUuO#0uiU8EEVkin-q_itN%!czo+`!a`@+o9Do^9YH63Pk98$UGBAta*7Q zq9#7BRLZWACoz%wEV!%s*IGLa52TZfu*MCDKXWhL5uIsw-o&rP+(q7?Qa&Z|`h#qb z%n1tW-i;)mS5*as__cTi(r4IDXDwbjD(q`RP8>pH?S4z{hS7jOjtR~H>%q|8L>spM zqU--K%R+krIdlTl30c}^?SJu9*!eKlJHM|&4^hq-YMy@hdj5rz{^L_+=y?RzozwjN z`4EP3H`q&ezn*T>ETO6W3nx#@m1A z&j0VXxq|R+eZlQvJkk-COA3>7fQ|n8;W`8olIw{5z0XZWr0^Q zlk)-QHh%5u=!DTrm4>upeGaKgYe5Q^_&&K`7)<(h(^&V({>|?ddePx#NK8Ai2YJay*&ZZ98N6Fd(ep*y zi01Sk{JEZmmrEu~bYA{%{UylT>t%J;bI88CmLVjodif=Ki<$WX%E zMR)Dam{er0y)V6=^M;M(#`9~k0%H#=PU$@Ean#CrZfku_^K1AQvr~J$&(j0g;+w1z z>h+>De#WN0M^(3oaHG zsdKAb9#FP_Pey%rv0n51$K9E$>iyvvDc83;UZxjBk6dLrUDW@KzbUm8PirUpl#X-E z$W<^tkV*d(IG)jznkM&UulG%Q$#whpHm8cz5JX?rjFq3v@m15PSo2iV7(DC|1k(_U zfdL;s6#OhMy=I?Te=WM$!c1?A4s>Sf4X7lz?pZ<2OCUtC#OsPW+P2$h)^;wM)-65`7YvEXm6HBW($t7x& zKl<-23~4%`tv&Kn(8n7@zmz_|_Q+09bG&f1D{ZpcD(-GL-D(?gsI7PTK3c6rbI38t zuJ5y!*uds>WR7yCN>tyY?N-tF+lYl9$!7C1pCw&pJ6lcS2)y*aAg&E%sfQPUq=LDd zDw^h%$D9Z&Q!qONO38OR_5`!+>k|HV11U^zmHY3 z&&1F=yQ;)^-h+g2*G##`IzDsMXxO@MO_=#r#txGb#lTI&8sEMWS=OW3$TbP*V6{!i z;-{t2Dr=;nJWkpZF;6PO>3M?lPwl3Uw(ecv;!CpG73Lx^TIH8brLefcdx?x1Y^38&>E1##yR2qcPZUV1K0RZGNT5?|L`m_# zi$J<+UgjuW{SYGWGA%(FxX`A4lK6kI_m)w0ZCkhC#tH83?!gJ}ZXrN$C%9{H4elO- z1r6>RoZ#+Ga6%wB1P!$|$vOAjSNE&-zW1uVAJwWg_Fi+YKKq!~#~2f~ut;JmLDgc1 z*YnMdxX&{VwYVixfS+TZ%iu6@rAap(Xy1LyYoS^Nxe4Hw? z$S~y{2zk&_98|p0os3E2mz5#o?M|A*b9$NTSEFET4q}cu+=(49;Qn~b>`CTF@O5?A z57WT!=IhM%^Vt80&~EK>7Pmk2#@kEty(f7f9VnDe%hePVX~;chULj%art19;$=R)h zi)ZI&`(9>2OP|Ef&j(yE1`5&Of*DZA1Q)D;LOHl#2Nc@C1t*{|`d+4~;Sgz82}jpF zY1IZ5$xSEB?da?r4bi>q(wyN9?Yg99XYB@G-eGVnJfa6T&?++r*GP0cKD(fsBR6xHN(cbv2C!aUk0hMOd zGT4jNQi*aUNYH8vdu@REAU&T;eWgw_qA)5&BVYK5x7eDa~kj(jCw=e32_7+V=1&U>Zr+FWyJd?u|7X?R>PCwt9VkQu=r=>-Y`A5xM~Eq(@~h=FE8mb1~fZ z5XrhTX2Rtb1~aRKhGjFkF=4J$LqQ9T?l;=D0)@G&+T`j(9#gCON0bL4ytB~ma zd|U;7sv&%a$yfdXHWKO%1<`fk^1bp7iqE$StQNsj{s|2I zemdCqbf5XaDX+u`Gqu^-o(D;+-T(~K?W>BVi~HK|C!R@H{t|39+Q@mg;|~T6?n28& zJ1_7JM$Y{38|?QGox9%n&NYwLcD+#C8uZQ>Ei47j8NOyLZ@FK{o7unKd&DCm{`Ba< zt(g@&y|}*Kd@pU+k=}>9b+fbnusZ#Kn*Dl`f%fX?XrI30=KFpl@L~h0K^e-~qdQH- z=;P0v`smfr>4nWrnnu!Jw?{oapGiwc%L$ktzg`il=}XtUN6iPxCIFcUd2g|9&)U9vw==OIIAPcn+ru%H0bpJYQMQ zy-gQpV>BOmys^!1oROSmc0CX{wjP2{(RXs{o30mD(C>2Rkg7YZF=-H$XW@ND`K~OH z#ds$r!zEsf+oG7dXet4?zNao40$;8@YRyKs3t+Ip}`TwczB6NI`<%i zEy`}*Xk?W=^c~w=O!KA7r~zTk$NY3;>N}eOU)HF-gfbr%a8?lqvdVY}IIAFovkDFt~;LBXHZm{IDUYvUBo! zF2w#bUdJRJKe-*QK>#JYTi^-{z&AadJ2x_lxx{`!VM06cW0TPVaPDgaBEYY~=nB9^ z$N#wwzO6K{+zZ%^x&ykSFmaCnMS7HhQ8<171EJkZaGP#X+)YiuItEG$UjHp%#bE-5 zcTQtHEI5c|s2VUxMdb3kvyGfcXMjBk|781be+Qd3qMe$h2_J3~gI>bfP4|%;huxob z!l%`0X(6JO^{(Y>lbf=M%Wi6I(OjiEw`qu|tl=ayP})nagnd5yOl9zh1XrliZg=|7 zo0UL_kSXy+B<-nj+*hlaIzdaJSqRX*aW@XkGeUH( z+-M8opRfA-@@P!mk<-TLh^uwpVUNHql6GZZJ|={Dq%Gtp!I5@P=#fh)f8OXsRrFsr z%d4Dld0!ATu>K@ivu<)m{>hH=&_;(i&)SY~p|Dw;J zR4JL8{MDcJPpGo##lI)8N(3>tZ}Yoz-JYXgS)cT3)5c zG|U|9Td{syxiQ9dc!c?H9d)E&{1f#Rru`>Zs|c}5!Cd@^x;52d55p~GAF^y}G0yAR zG4)DwaHe_-DAI*{Tff`unLCS-c|1!eK_+r@>WO}Lru>3d9%7ZmAL=}YkXy<($g+vQ zxvSY*@MIegkgNLL%SlzA<5~QJe;zn{J+oKsKDyNfJv&a_yTVv249?tX29-Mh?jtm{ z>PG$%CHogdyT_TCE4S|MHmt$7j*evEro9^zujpez!l{@0O`!y3AfU?rLzB z-MXzG#ZPL&N3+20uqff@o_}m_f?3;fkEgvY_E3=b&y9`M*fa9bfW zR#bkD62IS#adC#TIA$d-T3b^I{gK(>V7}P(y=II1xm_ZUQ!5_r<_<^Jw*5yf5;?mi zJxb2yt<~vF&v~_nArl#Xp~n4{Y}L&Epyy|gb&obyD@$4Y-e1*`8qaErkB_r`ZyoM* z#HDW!e*WxOYwPfPsqFB}jazRgI=!*@n7HwbqeSn_y~AZQOULHZ+*QN7X;Hp4q4_W0h*mMm^R*G%>|}y zfoa2eM-pIK<*m!0AHVR{QZd|-G+Y;2>jPeEX12$V87TK$EW{pW;X42UUZ%te)A5CE zP(@vdMK=1_v}10>f7$skgM<^M<4Xg+jT&vZ0o*nL-yVU+iPQ0wdTNbiNZ!0-{^s+A zA-^!kGSCUE2@_4@{h>_}Nz<}?b=t}qM_s08Rdja2kC_15dj;Df6q_w`YkpTlLSd8T zVyNY7tz{+Rg}(6>x9^?YzE=(Ma1Cc1O__Y_ea0gJKSDRl?-lGc;YJLscEr`l6#DkR zCm!F192iiVpHH_Re--}4aI?ch5Jsri!0n$iq}>)T)S6}68#G@VbM1HSC_ldLY971Z z6RYE7xEK$${2ey)GSD)?tZ3Oml%?NoM^a$4VME;agWWalvS)S#q3Z>bote($Lf+$POmJgwsA`_kA)mVz`wQ6;$?IUmrx=ru-eOf zh&?Hgh!a@!Irv>0bvo^c*on(-Z&mT^u4OeEXXfH_8_0T(Ge&4d^BBYrG`3lr2%^*P z2fJy+KhV~QO}H@fRq>9e1jdj_WLiMO<{jn6>tqK==B1oPkx8st$wXPWpMH968-V_U zg{)Z;TT{fUxOg3%%kTZ^w(Bc;S%cKX7JW|kys-!?lyYV=Z^LLV?2{U}F;`Z`Io91Y z{ZHuq7n?eIM3319gs5(3edY^Ou7$YmO-C=G4%YKE?z9tx2t4w*&UTl-$;8UWKAx*X z?lR`np7i0)CqH}PRJi{oyMUjhmmT}nJ#CdskZ?+2T%d430Y6T!zCr$gvf+M;g7NY5 zsh3HeQ}|)VTW_XBl0>HPLyYs@OtFGX!Nw+UrpSO2aiFpInjUlv( zCT_Ct;!}JP>O#qI`yX;vnFv%7PbC|&in8_P>JRI?XNIP5J^Qs!_x59&iL#gX-+r4Z#ud1wR#OT9?!gX zc#tQE?$zV#uh{I;K00H>S}o~D0*Hu?k4)SGh(C#26f`VPUh#e}vlY#~MAtCrtZ)3T z{gWng{-xki!5!AL%ZqaKel0$tWc;pzek(G+)qmz`aIi@m@8}8q_6k>%+%$gH9)I@ zkML^-5ea7|;d3Q|m#Tj3+UEJE699Dq}+N_?g zsEl88@QL<1xYWj#ZH+Q0UZDPbC+o7ZUN-mcu~&Skm+~=^K8ZexKKS7#h2W#^(P)br z{LWeZ3hf||CAWSU>fTuDo`+Ix++fH6SB9ENYpYeu_v`EHo9cT~*F_h0`xYj?w7ncyV1;R4=(0XDE zhY`~5z4Ivj=9-m#+b82U??>z27oLBsDXSKYOf~Yo6)~lVRwJm|?u~9;Vj=O=CsMH( zi1e`>h-|Z9qTPBk?OMQByVF`tn}nOeY!FSDNk^coJE5==Vqt169yO!q+jTYUXN2!cQx8EAflZaXjpK!JawIjhEfgf*P8@?9|C@Ej8$3L0cH zM1Roq-8ixalal^iY{c`~%9_RAv+c8u)2$z&U8!(>z8*6UclVWt>_W{0D0v;Iu`$oj zmZ@rmrK2eoPeT=Vi#O62FTE2EY%_{F&JRD_V_#jKuIJt?x$u5a)F?WapM05@{I)q` zwsI)p^u8u79>-wA-jn7##f>veWxnn*OZ-&2&-B}OawAhr`n%(e`->4-ROVFA&o%B` z+4&h+5|HsD*Ie3}3bryL=Q0Q@czLXNQ%UuV$71Kv7%jfTk9s< zV-0=pl#D>YPiSJWM1bWZ@Ov4K2N`2ZB*WY+;#~JkQ)aTZ6sSK~ z^R>ZpSxG1sDJonhqS5v~?v4t7Mmr$t6{Rn>?3ull$m@!Ji^zq)5=J{~SQQ0x&ahmF zL$^V3)A3FdC0ILRj9IC!ibdH%{6JrQX)K&iFxjsTL#=4mj}fI*{8fqu;?J&la&oS24mAsHN{n>d^|$FVj%xxl#p6f0=l(#D*1_ zyg_V`bS$x(5&Ib43=wtVm(&qj^AW{We2}ADZG=8m&e^(E`*qPN!PqX@_t@{FC3{%v z2T@J#rSEy)FJlKuvGFqaZAdB9q)23;#^&|}1@&xg%x^v(?8j;27>`FFv9#aGq8eIx zNDjL?o%QM_Ps=0@4!&r{W5Pvr4IeqNPTiIsr5?*DZI@7E!_sIfe$zvJ^aV&CM>D|F zhvTi0Qf^&xU;9r}1I+Vk1Wh~XLlU~fT*=K%A=Xx?dIlVKm*=ZnMa!tnv8@n;(Y(2XT?#WTO>NWm&eFEwsChyP2TyG>UAB!OaeXxo zErC`fW^`F^IL_QuVf=>|(<6LV#;Y?Uip(oBO`|`S7V@LZ7pLMBZ5L*|6`AK(ETVtR zE~qJ%Qx$sBd{w}yRnxV%P>+e#iBZO3re#{2B^>D+r3F5Oi|A;4B5m!uZpt<5ob&q4 zdV1v7Z~HpqrK^#7TUVuuLtA*nq!nx}YHsXj_?Vw79HS*AYT^b32gPEvTA7AO7j!fA zGvAAKFg05}MwC@YXuj?#nO%Gvf14IZyy`^mQVOYWaABkmzO2Iab^KLKGE>a zj;SM8=HQ!>dwku((!m>>v!w%BtOl#r_n$p!hWvey%BhK`1*~k%74Kx;P@f~74!5Sf zma@K0);drITcS0w&vz8; zx*U+^S5(SIBVM;eJ)d6OW;m6n3(Ym-z29l7}!U3ma!6?cSTYX2lY3axgY8S6%MhbohGs z{q(UG(C*{8!YS$4A-7?dpU#M0i1j}EEOu*hvcDI*RY{8)>#j`Of%=FykS!|g)q3|e z@vGwM9%&FNYU8o8ukc&ni~jZJj}JWRsks4bf~_5QCMTyyCRfYKH^N2Jrc@{Yf__^dsGP;#8|R9M=lNwg)Sv2)mb7P_+j${4<@v8JeV zJTws*)gv*N&Q|^N@@_+JXXN195}p`Sb#n7x!ez_0zT8;%E-hW}aUn7t?Q!OkOD|l4 zo~!&ARC9GZbSA7WtlbdmKe8>c<+gD&Z`MRw6ZURxdvrOwd-d*9=zaa!u{$cSs~(B& z=abE&t)4CWUiB8}CbwAumdclk43z_U)jzb}v#5)Wd?NS~L(u%V)1k9vc960f)H68` zm;7bv_Iy~`J$u;R=RS4e$IZo!A=mZhvfnSohlj7m%Xg0gD}F6r_Ny9pDL8j3vkBuj zJf+*^O$AFrj7ni0jB2)tVO9yDH$k&SwKs&hy#nM~65C!9`Ci`d%?ZEmj7uDxq{httd7SCw%|7 zQHP>S@apazTfVEIiS$9|Qp{Qar4?LzRyd!*se%26+!WD6GC@rbch6;}&G*P2W|V>N z>9Rj4<8t^VioG{q>{VkXA9=2^Wiz&K;ELplTWT`lrA6G+k*99+?98^cQ8Nl1@!N|5 zR`@VKj=CTTgHVtMK4dTn457%k_$r8C5@eu&UJU_#SdRdG*dTW$`UOYqN(G*VT#Z!h zf}E37?2H_XRP2QOf<)}72MzMs$15~r(vX+mS%cL=$?N!#$mfjU>rsLRW(_K_O{TU} zT<;X-gi9({&Jyqm15yXo&@?d`(ckhazy!>SGr*S}sfZe0Mk7F$ngB>!ZeZtk3~cDf zUlW0y!|Dt~hU(`vScDKbTxFJ;Q&qV}qCK7=J4mJPQzO*s!XP`fci)gm7HDf-!euon zuB|6(Oru?+eR6kG(9RG7*_O&huX#iWp-ozKf<#(!Lqt6DLPYrTLqu+YM@s=vF9hmE zIB!9g8<3&7QGuP8(ZhrqJS=v)%T0BTZ??M4kOK7Jb?2MP@blIQpjqVmUNpf5ASSY5 zRER>y(Eu;2D3C#jc*!JxOA`T!=wT9J!h3xZ_cwtwLUo04P#`<}s3bywsp*!%=P*n} zB1Z@9x38U&|1r2aPm%0XWvJPAaW3ef{R|6-4LwhW_IkW>8r9=h?6y^J+xYmYmvj{# z_JSiqOBH%`cpD2MTa1q?_obX$*co?!)u@^AoSi?@pFfCgy2Is3HLxHXZA!MoKalVi z%j5{IFk^UBVEM@D;P1$_AS0FMl{yU6-jEZ(uj2p!~$!= zsn=teAL<$f5`dHu^q+!)7xW*48W8Xwf(jGx@56^WAdmuu!@YcAVx!j&Pxi9!TT2YO zNN&`rD=}rT3|n%RKJ|?ZRAO3pCnq<)@|d|{kvg8H7adZWAQtQ#Nq&F{B4`)J`ltt1 zbA+V}jsdOeH5$Ao2Rw8Y@uqhgLIN5ZUgR4Lb3+q3_!0DH0la5Y_YR~{{`J8kodjZJ zhCj$U2E&@k$ytS|pmzt<`NTPdo&|)9i5ZU4lUMB~q5T@Q{E)D_N^sr3HT;48`x2le0uLHNbb;K2&GL_f*JSL(M8klvfqM%nCThrZ@(dm(fHzQCWaa6$ z^)ui$h2al>Wf3~~5mawTv0q_`X{WOA3RoDB)=JL;xQc>L?3I?2I3bLXlx5!u_r)}* z7atu&Grbg$B1sQ?fdC2+a7P9|HXc`&$xz}qLPA8&ypaR)ZwMd<&$yrywyoi}%kyDk zN4W%kfC$IoX{)|7LwqKFv5uh(4J8aOs>PpCp($@vJ+iO zh|5#)12on50Yk$LWYh!SR2J)?NDPC9T~R_Q^Lo8ifR9=ELvrKc3;rdhbKoWG>c$8O ze`qrFoW1AhIsL#xBT&MhiVB?!T^2ee3NJBgGqm>RLv4Qj+N;jX#cspBPVNxD;doi>i7JLXKe| z1oQExMLY=Tp)BWGV8fFH56n!0(dY|bm2nRN8y+$%wFs!&uwI255V!M~hAa_C;iL1I zJ8(VJ0&NXofV>c7JW@qFwIS$_+2IZO$#(Q`p!*;hj%&zRrE|_$U;>id@uAD8@8p&p&k}XF~)kLJYu+RUMVl;%L zV>ASeQ#3@IJtyppdi|WZ1(W|=wP;5-JlQ2k4wdWz#D_|D4q`whI|C8)!#-$dzmNdE zGYRsIMiYi9T2s5D$JY10-e_yWRPG8J-GvF8z}M7K{=)?6auaAxOdrFc zkpmDh)1@ZRAo8DCViJ|+imSWiN1&)pIx^U%SuLJMW)$$MtyrVw6b40jAw!nlXb$rK zXjIZ`-{euAJ>>klhXEzijr^n^kY!WXdMI>ISL`#`AW|$O*vB^(tk=&ag1U~EVS~PY zj{d#W0l}?b{?k&!u{-A}6H)kg2W+nx0^uSqi!cg=0fXTZgf5n!CO7FS6ck{Iq_@Wb zh$rX38y3nM)#5N8g7uwP9xbxJAfm;6K15ZKfB88!5H<`CykQ_0P!{+Mo&{8c=5N4} z(IHb=(BP)^gBhM1u*>-#j~F8?c#~h26#q*- zxlMikkj;JmYdi!{-%GR)$T@LD4gf_MLC1N53gFN@L78xI9-w46G!IZTAei!}=>XE| z17bc{hd}frys(Z!qv%y5Fq}Ze{fQ6-3i54gnl}Uoz=>GqG%LUrzU7eWaLj@hf&ldx zI@$vRg%tP(7wJU}T%;qtV4#J-7kOYtfT(bO;=pT)1EQ*HY7FkYUq`)dzJzGqT!Uvi zijH9C%5QdIdkKPn#IX zMcSgG>$iP>;*PEEQd5nik$CMh?POL+7HbOzQStSfU>Xb{YAIL{h>AaDafh-96!pn? z2ELb){l#@gC2vBpeo8q2LkDpYYp&>!Ri($qw`M;__21ODESH~Z64Jptq+01av2T8j zKAglUUt3LCm$HEg# z1})Tr`jn|bS6Fd?zJQgk88b)gbQ77oVSsT(sFHH;BC@J4{t+T(!NlqUmp2Vo6o zkvSgNd2d*LPX8z3$Pxe%=PvmFP{d(6QpW@0jG<#?bU?kdzo>AHp*Ex;f+P@Z(k+2t z1Mf0{iv5!Sx(s_=R9J1L6dky{UMVFz0bi_v83A(n)HF|Khzx;xTfM1|2zeeP{B3Uz z&LP6@*`MW&$t-i?`K6_okRoI)lW1XfoWUJ-OF*_H2ejkl z3}nk)AX|Vh|+Z@!IffcWOR{r2oeTBidItK6q(|L1znf$lu8d?Jf+46aD^1+Ed|hCoeWIY z?odH{YrT2aHya&EIPV6s+)@l@ff*Qi1sS$OnGnghk{j>d*Ov8KaM|$WuAyuFr(ND}`5Fqm zH2zOv0!r0K>Pfy(95Jwfd;@r;g8=z6g4f$@|ue>Wfp8nlE1bNwssDe9s(g(Kd* zgEOkMhC$!|o?8Y2>lHee5P75W12?=OrpB{?Z9uNFqkvrBTfF zV$g=LaE4;mVNX7%VS=EqAs-rNM)l0lG{;oordL2 z>>BASsu%GwV|mkslg#{MG!=9cG!^h`U)0G&h(Rmh%NZ1pBQ|^-beEzo45WNWnd}mI zT{vUooDS->P%2(0UZ>%8qb?&XD*`Lt{kk3Nwa=2_iB~-!RBIqjF9K=05m2%_VR`6; zCa4^0D*%Jie+G(9(0>Bzn}Gia)F%P|0VoTiwC^0ZU&tZph|(N6fs-D>2rmIRSDO(d zOTot*Ge{mZBf%E3)nyF>i7nu_c5~POxndzii*bRjm~tG!+J$^Qu1;oH?mz2{4V>}} z!E)_`d=jU0rzZm{ zDj>-|o$d_z(|-b;;HZPbs|AZ_3@hwvZg17u~NO*9Cs801?n zDNum%(_t?ceAojYT&I8}{T4H|6Q1>3D32r95rOkw^*eK9AcqiNm{^Y!fV|LvtPS1( z!*USnEwK0)5F{6QADW=S$(qM887++xINUuo00-SkU}vFs;ru4X%Td>DHwgkiG=;3w zR2Zo+hRJB)zJc)IH{c zTR^?5K+8nqx6l)OtR!^6S?mA)i+DhBJD}$;Q2)Pf|6kH=z=tL&K({LYU(+r0f7UGw zpxeOz2i;mGaLe~4E=E-OF%HwfZQcgWuIQA#Q~XkeKV?G!%VR0NO=C;9QUQEuia)79 zB68nUu3iQ+S5nNGlHxOZ{A$>Modgxn)U<`Gk7sg43eVu;wbjPMX8U`y%}IOTv$?Nx z*#^EXcLLXEr$^I2`agI1m9GhIn@w7s^fo@;f4IHt=oq-W|NXb_uP%3QE-U5}WjPdA zDeP~kfR`A!@QX^7558&QmbWRd`gd<$+EBtdJ`3nNz~A{L6fI&4WsK>4?MMj)-0KV_ zwfygIn zf3#-(0rr0lkN$LDOZjlrLACN|)}Ru8hVgi}m+H0lr~pkCzgK2rsJGq!k&~<@%v)1J z4F~<5B)h!12TASg__24;-0$LP^KMwjb*Bf7xeTQH+lOK!t8*~I+rqw>Qm`ctEa4XU zV8@3YAE@Fh^b5sG=}D4PFny8`Ac<~?kO{uBaDs}J&a0rnIQ8MgbpqX4dE|7^OeyuX zO~t;PjZiB2M18g?$tX~Q&%UrP+Cj=cg(Nx}H+B><<<{G4>NXVD6*J{lx0swx{$5Xo zZ%;htwb|a%WHI_uc~go)^t@Ggdc>ts;qwBFL^But;G#jFP*wx-Bp&#mFx}pM-@;u< z&GLEQ_D79Ho^UqXbM4AUpDAs%Ps!NVy(yu2zx)ha<9hO?#@$zMd|K;%>mBMf;JbkC zz6!5$x*AoSnvqrh%#TyrbNmIot2*^`l#gKc;QrGBHx-|g(pya2?k|p(A|}=PsdJK4 zIBVaTDh)Er)nzXEC{kBKr1p$keB;!bqa>u#;+o5dY1LWsoKA`9@gwW2KRMwiN7^I3 z!iij5;%Rk7ehqo!-9&7+M!)RpjT+0E zF*EaAA>m8Lozz6*B)I7{aemK}*d09bW;&4#=mRY)reWd2djuF-o%uE< z@PzhTq z@9eYhQ7v1Lk2cx3ztEsCu92(TPDLCqJM9j;*q}Ql{^24{A-x@cuwf^GWHDdbbn4SCDcGqs!Bi2BdAlTJM`RU==rCleH}(- zRhFGp?wwS%p^LVR6#CS&dG4Lc;-vi#(qQBh20Wz`6*MF{8eC~W9MQ7?k%8DC6>2o8 zZ5eoIF<+u6h5*)FX)z(o-$e>(F*3B8&2{j*Tnk*Y7ExS{b%^q48sF)?U&n!yk+mBP zqvabWvWQ_{W!B4axk!Lg4ou3J_Eq^*=pQF9;DYEFsFtM+xE$Vp8gg=f3}tPi-<^`C{DOEQ@Zp3MoQ z@zlYchww{jqzKeV+K&&ux@~Tveon0du9^bX?iQfRKqpVKNRhi|O247Il5oQk51_qq z+_due6A?P>UumWiq#N)?c1`KU7w=PAs~b7DRhVI`dDVx|xH~BAN0^a4)FQjAm6F+A zMvn&wt>wi@W{oG(RSS@`&iT*!7N+8)>xs%DEJUL84kvnJbltvD^s%^o+mxzsa$p$1 zFu~<_airAXrNcH2uZ|>cX^Jl;ibANFS?Hx6j@FIGZlN$fG!A7k+m>V8O5`afKlt#h z=ruzIhO^O_vK5|uR?lnp42)W%v14~Ud74$_F-&crO@Tb+D^+cuT%n>2m^)cnor?3T z=^;zZYz<%QE6l_OiKWUEXO)C>;i@f_UteZ~>0{-!2Fwe7UHHDdor@wRWJ_VP-@%+R z^&wSul=mcJ1J;8=%(|u>0$8m!C_H%*E%c9ET3KQggKYY_@sN> z|7`4oWy<7X+PnTL@sd~M zTy#7PBkbRPS(_stWg2CG#F3)V@|y0P#OC`4cHhhqP4<25t`V;$t(7F=QIzIMrkZXo zi74|Z1HGq)B9UR}(Wi*^eF?Jj2$tw1fxV_=RbGldja-}8BVd6LzS*s~#DKJ{IP z^P3FjTT9lHvz4&T{Rk@MiIZF)f(hyOe+8rULlN7zFY( zdWrFba0pRQ{a)Q*h)lMMSY#% z1W#0r5Iv7z>nC3{upol_GGG9f>tBGo3>d(kl>!fcRQ31ppKKY-{==5jKPe{vphRn% z4CZ-RNY+1%Ij#Knn4jkVV*bg%kEc0LSwGF$4Lkr+Xl`HtSH=Y3A$u?Uqm_%zKU%4S zTfJ7}2QL%q3&N*mBF4xg$m3l5n?m8H7TKioV<5sx8khiGEYEKWurpEtt-r?to{Ze~ z?;*#8sYI(#+5heYSfs<8zGzEnw{Up2!fJ5>o?K!r^dDh(lM4{hgyS(~Z`}YL96Izx zn@PXsHqSg55;7K&do-$ z+QbTLD`BUv%7ih57}ErgKlqeFQ42vcWvN6HL_%^ZDc>fa+nObQehPj4bC4E`POi3##mc8fB`^`QIiN> zCT>QRb%1Cg@&B?607?G<0{;nQ`~!d__y;5ZA3)&W0EwRJ0wE^i-<{oW zt$^nRxDwZ2!v#wr@2?5}?*RfW|335ovJ+)KKyHn|GJ>5d`mZelyNku2_5JSyXWziv zt@&rW|0iuNMOp&#W(Icce{&h~tbvU+{-c2Zo-N>0BOwYk|MHdhzo+4h==F{~u?%}0 zyd=O{;js^DPeuW2^%pSw7jQQ4XXbw){eK|v z!_ft>kax=I4@ZGU_4(|OwR z-!AyR{te)0QDELzGKhl2Ml|OFsdwu`=Kx_rD-C=)r_cXBvOp19laMvotkz8jo$&4f8dp7t@+( z#I0$=$LO)SE1&P}Bg}7hrb_Q0?JhpOMcH(V8nm^Q`l*ORj~LkQqp=oV@!YnLjPACK z?Ax+IZzdk*!cvsz%L`S}iN@F={z(pUFj^xoI>A$$5nDG-`3#= z&cxriU%zjLI;0q z7J8<1fh6^T4SuNGsB7Z0mF8L`uKc(2!31M`1-i*#w&=3a7g&)Fn|j1dN4;r$b7n*l zk|L)S@F_nxC9!UGtMfI3v5pxGJ)Y|;d>luWkC1$MT5+EYfY`SgRRD;6Y-Ip|x*x}( z0MPKX;sgw)gkfu$8dc`YgfmCc8`$=J)P%-8meU6sx_lfzMTn^J*LZnRu?B96d)r!( zuPK3h9HI9c-jR#gF?@%i_qOXDwvMS~1r=bVb)q|hsRmC2BVPhX-_WQRTg#X6*{e;2 z=Vev75ll_V(DW+raMd)~BvTgT0+Z6Z5$VgqC?c(>Mdc(mV6a{b#J{OaAfwJY>3+tT zKG3Zt3M|Cyl?Z$VP3TC?O+8vhyIw@<3z-^%j?7AZX4KbPrUIEXX1^wRjncdnr1%=F z%%*t12`lcu+8)v3HuPsMFyqiGY9)1yM%xPDG0agK%dlE$`dz_8V%Kq8D-NN*k$co=wxgRz9DngBf^^hX~?oB)~*^EC?Vd0O3moo8wu* zeB8z1?_V!t<}~cImbJ&W+IXg zk{-{Jhv_6<1@O;L$ zfrV#bGK=#iNrwoAPA&}^0jaZm@U4?jB4ch0?Dn$?*nCGts53fws0iw-78cftz7k83 z=H5yF+~Bq zwPQu~S$x?wEtX2iM86oJKe<{xaJYv|^TJ>s8ZknT;5TaQjybfLD!~wbmj{htH`4A_ zIJ6jzK@+ZntL`@0pS$rF_7tj&+Mqji9i=at88bG#0eIvICIZ7>0GPb>2|fnkk6r-W z^aPJ&0dN%n-z!5JRy0vwu3(R`3YrJ*cw>N^3tsDzNMyEEZB%Xa!lPS&6&c21cm{ zg3x-92AaS8FjWdip7`Ei+05wRU#saRb<|cV@c$LTz5(48d{CSSEdETP_|ER7OINZ%iziSKtyp%}7nE&`$vAI`|`Pidtzr$(xng8ophg#|gc~NVq_tORcufb(RU$X{LNv4sj5I%kg*8Qb1pci$iO&9i8tc45*t=Iyb&0jp{HG^E5bvU#teMTBnMQ@7sYsc zHJc`abLt~8pj?NvI$tWWrLc06TVUsX5y^B)VNX(x>P1q7*B+;1ds&nriM)elq9qQ{ zxu57B;sAXepvS)q58&HjasjN%6Q`pk$*16bQawrtJ&UOQ_K_ZDfIjCTY3X<9Fa(ce zp}emyur~XZO81p&3LxR=a2Rvpf4$0Pn}mct}cr z<$nmdq+GmerSSa49X(e8=mw@P`_<>!G(!h~BnQDB1wYQZ0(8Xe78CHJh=~mdP>D#t z4W$5v)a;t?=#zDRn__}uC;s0H&_^TT6%AX2qoDFP=-Yo{5thbW`$z8a>Eh5th zT88!HzI#=;L2&JX(o87v-pDGB~$ghYd`?^YelFb<``Hk>ce+>K;Ueq zMBKqKH~mOwB-qgDzv|SFGsHZ$Ag0poX%hg^#AUyt?9sEP?4kM~dkQDfg zJ1rHI#(4B1t1>bH#yaG02h zKuo)%hrt!t&Ku)==WR9;DlUX|+KW>a(zOuSmi;PiZi>IUH~PE`hQADx0lF-}>KPCS z&g)?C%P1M3Cy04^F^?R8|Lp^N5P<;U(yw?91PuY@xGugtF_9I^HD&r(ASm?s%6Y`i zQ*JyY!9Xu4Tq+H&C>LM*qmryDdra44zarTax+#1}IwLz6+`6Mje2N5FpR-?`c6~uQ zE>dG@t~5RJmFtDW)4ld^%ZmSI?{`l*UAou1H(!xIw+!_QRw68KjyvuaE$8)2Gp zT`dJ-pjAg~pau`F<%4U92pcH0#b~BgN1xC@?%G$XLt87q763hym|n_w3%`MY;8rbH zbpoU!lokVwbcnjqY>0?EK_P)+E{Cn>ZISV3QSf`O%{YJ~ti&o@NWK-ik2oI`S+l2Vjz zk}_JA;SLR4Qlg787sUn9wJg8JkgM-G=UiJ^OU@gMB&?mOnP&B>^nwg4Kxa? z-ikz9rZx%07a3eY;Ix~gSv3-{mWB0PA_(}Q#7=C!74kfDV5=35MKKeOC6`v3FS2|LMp%KGS$)>rGBgI@*3%w9>yH3AqdgczTtag-MDA%-xk$F?^9+JdP4P5Y{DR7$R`l#1 z1JdPF`XOWJxBYgrAk%wl=x;B%erTXfV)~834nD}kPmr5~as-T#AUH_{G(?2-bM>qg zaGDk&FLn|zAYF^;^$fimBu)d`wO@(luy9c$MJfMZjD2-f9zD=6R$Ph~Z;QLTm*VaY z#kIH;zBFZU17&%Nf4iMh^ z*p=ja?SXcR#_sIhF7sc)C}Fa(K-`_Td*b(|9ruLqO}!5^?`fe7`eZs4QM&zbkNJMx zRRd#aCI@89%fKg^{jf0vnaa(v{&fo3)*gn((VH1&pPOXqi`AYtIkL^#hP&@~?%pxH zi(2q;+|=_()4)b`$aI!YPT%WO)YFgbCY_4V90oS++}Q+M#)vN6VEYK;?4q?oEAHU3 z*c+Bzk8448L6=Ra!sG(gVBE8D)C_#A*#{d%5HXaaDaE~LR`H1s;Jo{0HO0Ll9>twXVeC+*x2!@#3yEg z=ebQ2+Vu?Gs446FK*#NfyA2|dcNhRdxN_#???R;!|AgSu{t0pZCuI9iXyZSj)^{Q2 z=pa>6vY^f^e23gGao75sxWmz6Yg(jaD9kl=0aT2?!eXnsl=XqFE&xXROVJb!GYi61 zf>#Gu+I2|DBCiP>SsV!)dHP*8LI{;eRlfcBxx-_(`|%~(f^Crb9{}N60034~v&qG) z{e##l0I?ly0Alz5Al3^&%&ZlF*wsIXrM*MU6@b_w0I@7{{R;f-g1cm-nAL=LY-8vG z*uDa=J@GH;p>`nYGXUHD|6$t`!1g78?UfDy+jh`k!^Hg`1+Kg7KjcbCwag~c*wlO| zlqmHR&^DLA{-mrQg7U8Mf9RxQ9D|wo6h*}dpmDgf5N*c&A{D#{Z3aLeQrN#p-2Wn% z{)=q=zmdrQMdE+uu(v7ht(9C^0WU_Q{vwx<90MZ~pZJbLvG_#0p&~RzI>zE&;AL?W zz=EoilwO3)k&ycTaar7pLB#XR+a9JsLJB}1!Nn~2IDRUi&_{OrPIMR!>-Y49R$9Sj z@it1k0M(FfYoK||yzQa?6TrEM10VnNpMXIpIy8swe**s(lz;-rfC3n4U_%fma*E|Z zF%%sxl)#5D_N0~d*;l9-FV$`S!{q)@7I_(1l#?xX27r_pm>WM#u$`b-nCjwQC=`kh zae&2>xf>`(LubkCm0c3D;@~7Ik&v47p5`?JjGv)vDHWq2q{LM&?@mDMI)G{@B#OG& zcOjMkg#2XQg_`jH6XN(MWb>cU+PhGTSZ@g$`u7bvWUlFt!@sKVk#@yMWNUV6UxjUd zB_@@@DYEOL4{+e57{c6ghkLU|rPPT#f11#U`Tdk30`xC-?1#w2Zn1`$fU_0>=Tv-| z=AOYV5}ZPMbEs@?z{3JjsZ7Q6v5Wkxg7EI=JaQF8BmPqS%QJsv6^E(jJF%R>S5?QJ zhI?hR$-W~%(;&}xb{=4bkCtjyqOLKnziKQD96%^L{o$Jf&*otzcJ;Fv{k>ONTcn*S zu4upER5^`r+jXGOA`qLm*LkXy$GPPb1dfUA4k_Rd*^3N{xQ; z`ea=h^2O{0-95sB8~S;bJI4D=XMTGm9N8vt2urfX{T1J}mvL4@o?GZ3X*!Qv@?#(T z%gfDzmVt>5q_uJ~Tc#1)@vW`|*$kp{{uhRaul&#N9s%FnZf}-n_FE$9Ro?hC2+EEI zGPKvPw4)uu5@4mh`}A8uD4A01m;=UsifptPRhaxG5- zdV#>@LC~uxH{|AS$>J^zj>+}Iv@HiopswmYKP?f_+8gNXS{(S-Y%ue@bH*A!Pddo; zZS!@eVq%@wJx&z+ew}xX@72lfEf%zIRNfp5ZTaEi!Qt)VaOdDL8g#$2c}dsweBZ|7 zQaWkH{{pxOMsX&euQ6;7(jD?Wd>OcU=mVWvK3P^LYnK~iU%S+S+}J!F?S2pp;ZboH z5(HC;RvYpp4G~|D3~iZnDT-d{9WE}?M3bLDmef3|x1#Y|I-()z^0lCSiz?V%wqWy! ze`6gnj-{#p349rB$=Hz^oHTU;+Q~!UisrZFN~7&x->LLT%e*sBdJ|R0C(?i#h|Oc@ zkWy8MzT)#4eE(#4SoCJg{q@|?kymFhwkQ<|EpR~mmp+E_#EQ~HB2Mn3Qf$=d=;h+> zg9D>xo_cxT5LJ?PSi+T6AEtb$(X4sVg3{S9OM-f^F}|40c9FKVPidTaCm z{np`$A(yOO{GMomHN0k**%R5^8-~~n!ZA^GB2uIg!j@Q(?-J^L^7RtyKGHm*g{a7Qw3hJIAd^S5^O;u6 zJoyMox{h?O1slI7n|kZG+o1)cwxd%FsVejFk68yB3Y7G4>>>{bCC+AiS)Ish_Ws=m zeW$Cl9+aLV|~sI;HiZG_y$TnLu5>mkXEYSF85aj*jP>$JgiQ zmV5Sw$c(G|%UC%4j#b{eZ>`!|?b<`m^Na3`=!~z|t0=#22nh+>IOvG$LHt|%x-W+# zJoxUT=d2H3o1Xb(KU}&0h~h=8_F6?Eb0*?L+&YKZ2adrwK0CbrVS9hxf}%T^`I-l> z)r+U{Pj}V*uCx+zlNr@A7F{EGhv3?0;&t5w+16184&RF5>@%R(6JZ@!^8--3%Xv z?|qyT(Z!~da~;Uz=(Jsaf0@lfn$0E2QjoPy_738H9Carg%~(Gyta2u_Ud_u`wI|gD zx;nwn);E?qT(~C7D$jaM)Zo~iF&r$5IJ5X?7^9}q+gqywUp{f`FMP`l{1)JqcIlz; zXuR!5dNHF)!bhW|@!1KA@)~lHq(q=tN_hQ}St~7XdlTt@7HOx8)XoSfiZ^gk{%?w8 zWN+87P~2&<7msBDJaJte{2N^u>NK2 zqPyCI{GYlO*RDb|(Sd;-6GMQJ{x5X3H`TK-I!%N7f!%jIko387kz~iHrz#URh=M}3 zoA&FT&v!ckWaKH4xS+u-pP&Yp^^p5A7tF|FrRAl+IdK}An#&4he>Il*|CZGMo&LM5 z@pj#A?KyNtLnTJ{BY&awaddfcadq*R_1c;BU1KRS!Rw=;O=szcP%IkGDqW+V5KmUo zG2Z$t-OH8jeL_BG^`0nC;Q@TN>FE#GkzDP%uR*QyFYs8jM}a5Ro|1TfSZR2(^wui* zS{x20^)g>8dL|>D-mU^n@@?~b9wOaBPzs41huLYj-UF!8)t?d`(`kZX}EcrZb z9aZCy#^3srDpt253%WWA3csL=j%io=@n9PM{le|Mh-$yjYWT}c(A9Q~g>w9k3mV5r z+5gr^xsP=BLrsfo3l!hgps`z;l&!S5qpi4f{XFMjA)30iLgKL_Ts7YH75n_Pk0mjC z)eRZ%H4v^#KVi$mcEJ%;U35ero~6iB(P7Oir5G52uU63b+@v#~-z@d=JAuFsWks=g5?KQ9cfasb7eq2B(fylu=aFnodKesJx)Gyr8Xk6{mK%@G7xzQU11U`MeOj zgU0W*>`E&;+p)N%Y4s$XiB8BAg%W1Hjl+&xW!$KF>OmILycytoV`Qdq#Bh9TRSznu zW5;kKW%V^HK`vb;z{c}6udsmowXQm*F;21%hM7CuK7H`q-o!R`duc*R%qgTgIXcY> zC0+#2ANUd4xg1Ncs`t{Br@Y%Y3E%cxke!k?g@;oi>iBeSR`I5sx;Rv#x~(m5Ajy3L z$@~Nrde_x=j5Afi%|_f)S^lTsukr@jsMWZ>rlG65UFNQk8S{Rp>j0?P+3_t1)Ao$&vXG9?WNW z++4S9Um4t4>9fOA?44>kOKiPNWFY52Rp_|7u$M?cOJG94di8MJ+jeeCs%T3!i)@J2TlyZP|*0hmsEq zqo}KeL)L6T1sCoO3^0)x8xqU0;CFB(QFEfw;3+1-) zLJ%v8Y>QNj<-~h9mY=5!pfx9i*qILpy^~E zeeIwVmT@fX-0B%c^|SdV9oF;a?Dl3uJNZYY!W~yuMzU=&S`@ry_F2qKk0hNmLc2z< zV<#h5W|E%p(L3X#bVH32S;2aC>cL5cBQU1cMZtvX;wSYPiQ5-9o0X?HC9DEBdmouy z$GTYZ0=Gbc;?mFOlb_KQJfwd*sz;aK;0cPz3p%pO$f+AOs}eaRD=TZWaIbRH94N`N zTU<3dSeJ_#%(V3gT&w8MEQTYQ<>0H1Yxad?(Iab}{E^{Q&1b@LZDQ$gMTXGuleSJ%ZNf_;~};Gy5gC zWoin#n#FH2lt^v%@q``D24AOKK6*>1A~^4pycjP$N2=J1E^$vcl_En;MSXar zU2Kzoqx?ygxhBCm3BFlbx}=Q0WY(>8&TV>?w!*Wz-Ih*OFrj(4C|;SFdgfdF-q^v3 zw(Y<+k+G>+T!YgLt?IhE1i?XMNVHibsTfv~XX3_nI%-e3U{;k;jRrWwe1KC2;>6}L^uS5Dh1I~a-UH-708RmrTLHLSP2llqUf|Z@ zyUfjd^4;(ERp0Nw%Pg|K6WaGDQr@4C1fF<$&&VwoAdv3~@xE*E8^~!;=bfxkc7M}| z*ZmzVVNa^MUZ2NO(F1F}UGgaaV=T*7Nt|DqB|aj11Vg*XG_Sqr5GF)4!{5O_8yz<= zGhz+0*cNek3j0AcoOygKhK1}Hjf)W?jfmVqAByW3{XLvP@*b8YeW(1A2feTkp6Qdp zs0SdnEOg?@Uv&Q{-#dNO{zfj6dHwAl)&EDI{ba%f_VfNx6u7iczsE=ZQKElItNzQZ z;a|ApUj|;X?-{I#zth*~_iS2I{$ z=(|J{ikm{eNK85Fo#Ofuplet5d^BMR2SZ~|js*ofbu1Ux)>v0qPe-o}TW^z{O36|s zi{4W;N5Apq93Trz9#RUUP!;D%VwPoQP`IiHZ-JW(Y=c`_Va(au=M+Yy;NgJxB3+As zJr?Vwe_&^4f)KMG4Ifv0T^z25{TZdjy){%voL(CnvtOp^#mr54=m5c=`Jgm~>oG9t zAA+3kO*YMUlf?%3M5e+mcu5@mu3wuX_Nkg!BeCk$w57#Terc*<=6=-1dQP#?r1}6? zc+P?8ROI%?UKqiYtu5OWzDz}FK=G2RnbmdRW~J*aQO8sE`6h8zgR~Jhr9IS41v#zk zz-{SgrgPmu)<7k?84GQ$JqGK=%si*-@U7I$+`)l1eujS2fSx=7`)=q_BV`7vhNFvK z7mgvZ_d6r7G!u8uw5wZcc|031RJT78YcY{PeySFJ^_LH7pqN|v!u^6-80GLeh*0hZ zTMEv4CI`D?;*P)7z>P{f`)j+^3-aD^^+s4Usz53uP&*blIZd8z9u;i%c5VwXvsZ4N zA6qZM5xd$<%hF{Jx?=Y0sSg+k-K^yRb9at{=>hZBJ_2cP2uo)xRQbgUmJLE|1hGpI zgw_J%Rkm~Vc;%P*62Q(#b0QIYDAQ=$W9k8wM-EsX0ALZ0LdSqqMUGgwXh zF*wdh7Ir_dL|}?AGhR*lZO}ru=VdlyJ%Kt~Ybnj&A-Uk^saAa*Hbt|fJZHxsGo>9n z!OV^pWahBHVWrd7!n(w@i114@># z9Kr+>ro-O?5qN^=RBn8%INqjT z33*@5(VwcfynIcmYVvCR#>1O)o0g|o&(8LjU@8&DTd` z*@142Qx8-zJcy3*b8SgBnhuh*Ke=_D63XG~g_g4*(Au-tY^;zHdviDs!G6}=rK_^} z0T?%h_csm$Fl1(-FaCEI(>_C|WlajlXGmBks~LK>0l>lOuDI@L+15wP396-yXb8s` zhrg}{p2%`WFi%D4+0;`b)|xJzi&xxaP({FOt^9xn#sfZozuOVf$^_ZR z|72YvY5GGFYa!00r(Rwc*^`GOc0&G2BQPO&PsfdhY) zT~#R5H(A0A)ma?JSj_(={RQ}f+1&Lt1ziTZgk~RtzUxEKGrpm9u-~%$ zS$BtN=wsqb2~YEiI0gk+TBl`v*e}Ha&#g}C>seY@bSgUfSsysa5OMMK904me!|?sxBPZCLsIy)*mbD_% zOxG|VLR)TyGq`3qMMm1kdBa^5d`#&XxT?u|{eDu$GZ+~$uE@g3#8MID55D52C{KV* z#Q+h+{2M44*(B`e(;=wpk0_X_I~A1!qbd?s6J<$DRuc?e$LT(B>9X2|-n!Bqf|mm* zRD;{XkJwYcT@`9|rbt8jXHb-P(r#HVo&V00pNNKa_Jc^?M+&wbeBnopx)~ylE7p+N zT;l`bM;t`+z^gsL3c$-Y9Bew>edRf>LuAoPoLjoQj5bzFQ2}lF z0v#!@;j-y;0>f+YWIjYDQ{zc%svtz<`&Ucf)gBZfjS;G|W0ZROP3-(rY3vSIwHH3) z&a+!eiOAW%z0K5K+%fI3_s@2uva?5VWN-L#dbme; zhEi8?osfU3O|&+B6evxuGm$l6O|2thZ9Sa#1>~__g0Tu8Iv4xL!r*q@l<2HF+=FBF zTz{!5FJ{G|!(UkYTgMzEgLa9_?xiwAexIfOEy07c)tSO@ZqLD@sqb-pRToWT$~f%j zG25A{$~JW+tonw`0jZAh6_K$Nt+p7AVjZ5!r3)J9w(SSjzjzpJp%Zkan|Xhl<)CRN z-@>!%9)4>f2j=4vsc92>{n#b+{_eN}8C4kJ2Br`Au_=K1xQ_ss#YYGcu*EfZaIB>> z@WJ@u4y{Gw^6*%TnLniS`LvQ|Al^G=e((AERNuBGBR7#L0+3`FE|*Y?*#zY)X1{s} zk@P{)eI%m|+qiNCg!L|Jn< zYb_t;2c>K-B?u!gtbdvTw>whKjDif0&xX6P;+tReZ|p_H>BwB?Gfcb&2D9 z8mj%awhJR*G06dZ=L22hI16A!PNmQhmX~jKq;@m(PaRyOG7-dbf4q0m zzP03h*}kQ&ws0zz?#0^^TcKA=v|0p%tAp_bMpZy=QwaHWV6g-NjI z-T_KwMZd9v+uS$cgGJ4vi0g=KuBZ5Hlgr~W(Ky0YIz@+u?6>XvHVQ*R<0k&cD@SJUzug(3`{ASvc*q!x$nsqkYC!}PSqx^g>n@e zE#KmpWSv^6V5R1mLq+Y`C>1;zIl;Uw4b9a#ibs;HWy$}mJJ zFZ;97uE}4w+dlK~%#yO!Q+v$hxoKRKuC6`G50@qmS}YTKWW2X<70Yb6Sr~Q}&1qV5 zBzJgwerQ=TVTf5OR)R2e?!48=D~wuaClsD}9P___#1q;D;a+827!A8F`9m5i63^S( zj-J|`1*0x$uN!nVy#okf1T;o?Is0`jQ3Pm{S6-9Z>+W8Eq_Mps{yl^jras_k7M*gx zT9`-#@FV6K$Lvo8eXvy*!d4vQnB0W!ibK;Fy$1W)DwqA+lBHL^hcBz59jmC~$Xpn? zc8OQm<%PM91?XqrI`}VvOVyMJ{d15aPwDya#Hn>J6??(-!C(|e7gBIQ`;D8&NI3BB;mVu4W4R?H7%awV3-uK3_~L>q6{! zTd}#V9hoORvFW@NvC$w`5Hlg$W;MW-jdR27$!-*zje|;m4r)x;=g9}g4vB!3H(&yc zdm=ED;~^vVwzMXk5gz8(T@1(zkFglpiv=$9wF~t}Xi$dcLtE6^O+Yr94rALNGC9Jr z{BaPDFArA`M6;?e#Mq2>=Hf>ayD+fomy}do;J+CemiBgzY}OLnbu8@dp}&uvUctL0 zgs&-L6Gms>bS8Oyyio4o-WbfFM9+0Y+c+nuTIl%f?RE2jKF94Lna1)=Pn%4$H34Sk0oU(}!K zOzSb2Uj(6nF4KjPuWZ6|Ago&ArR_ZLd0;ibJTxk{pejfzTN-|2(I_-|V-VlYlw4xt{PMD6gJtO%wDB zjBe1#kL@gwhC>$cOgA1280f!lXb3MK?mDORhfXb)6)nyrTSM2od{!oOpC0P6ttaJ| zg4}a!37QB>j7PVL4$8XV^GO}dcW}1bE=|JtWe{H&A+9U`Tg4Fnx3Hk}kG?M*2<-3w zTeGnKw@$JDZ_Q%=Jxp+)$_9XV1{he_F9BVej0Mo3-MHYrO_e}*_Nu*LP5Gu{^h|fk z*7Ubt%dYHali%DVyH?mxr>~lOj-TZ`G$Z#p6=;}spXsF|P?;o=W#t1d zlG*xS#t9-T-Mb1g?qRGe&z{(W)%Cw;Ia^U?s<Dm@oJlyBGXtIc^sA zp5{mkdhh2KSbF+<{56$Fymm9TG$KATeh^f;^WUpb8d=KMEA_X*!x1a;0{Vf8dgQXE zpi#MU$+T>X%d}1t3=hev>sI)DXcz^7KqkJJr%O#j6k+a#I48RRHJfo@*6xJ7UpShf ze|u1oq9v{Q=SP&vD;jY?JwL$#ti=8;l8!1%YQl7z=w-1?fgJBxJ`!kdQ0zPL7~Xk5 zf{@eSOMM^ywKE0HRHyo%RT^i_&o&h=u+&9!u@e>{aZ~tgeI5^@SOt?TryZ@?pBy5f zP$t4)P_*T!fdRG#B|$smDu?B}#m6_!It8&|IsMK2%Q?)ixG3aNLOvgozoRh~x3O;h zfa)G``v3-FFweBY=TH~9e#qKI2Z?8WyL)8c;Kn5;mKl(?E$C^>#+|d36$J(*(P2j% zqSF9mqk)-?Jqa+g!51gaT`dNs#Qp48mbW`yuHRW|_$mH}`WJ5b$qdN<)c1hn>LKuC ze@k$~z-9Z)PNy&CNs*LxmSk&Wjo{vBRkjzfb#DiUkxV3OIZw|Xr!$s$ciF!ayyrdqK6i$O@QXEi&r|MVnw<47 zn>$lIfqN$2CuTQ+x{tjuX~P_TZ|lp0v9~aE%dEbrFFb+Ae*hSWpcL&-;3Rx4YI{T` zkw&!XD}0)Cb$xtwmv~2IZXe1gG8|-cc0tsU{w#jb)rS_DQ^`9Dd}+hfzg$sE=FLj* zGw3|YPtHqTL#Xd~!Y=VbL@u~XmeS5kHShektheH4Qko?+zAKtxjO`EO^;|X#^jy+~ z5zg7_-4sS3901rL@9&Ycb z06PEi4t9va@uPMALeO*k>00gf&eC%AP+fyjY^jhPuQBqQk^|)0gG>(YQ${u%OM3Og za`n7zZc7+8X_9b5(cm%lwE;7X2{3coqA3SDvcC7;pt=zO^mvy!`EBUbOjF_bR2)m_ z4a>6I&6Ovwsny5Xt66!9yj9~?I%J*dM4JAPF+ z*fRJPtZV4}w<21LHbwRUY2xTS_w1R7s(qV$rsClmhOey0^_BQh^!G8U_A7S95z({W z1|y^MCZu6JN_2AmQ@4^{Y&kT)wDNNa=6ZH z9VG%`R85M)z^3v4gnVG3sj5czO6(ECc=WgV4iJ#t*#> za0jxAm`ZUJBz%L>9oC$q$Iz0tUzeF$xI{?_V@}shLaBAk5J5FgB4R1q6ZO_j#**b{ zhUP=fm-=rI85ABKe|52Qjy{=b zoLr#IrGdF~O_2zgnJinp|DPnm^t}u;yh}~?rnUxU^X0aYnyNs(4gMMEkJL5hJ!=W; zM+aGNTBW95Twy#*33R>qKPLurLJ+niskB^pinmi!3M1^TfCfwj+*ESx13p2yv+eDJ zujrNPPt9s}G_L!G>h?loIV7EX)SvJ(4BC~JQ6vgfFTR0*Q&tK_rki73^0ZIsrNf|v zA|7HW5D~^-fm!7u5s=t3;FGqjfgkA=^=@nhV(8S!Lh<-SIC9ybt!_TI|CIl$)eE`K zhkbD24pk7>nr29Q*~8(s+$+hDPzb;LbzF#)qjj*X<0_srumIMttu)||k+tIGv?PxTfinnx_WgVTg*{q}E2g+%;*3I)h zO|Ryqwc!y?wf_ugxZJwt?ggNto!18fw-5F4m|<&2E`Nl7!cUi zlAYerRg?9G$RViff_(Q(;R5zbbfHyyZF^x=xbL;GI+ZTk>E`VPy%zg;bnY9t;q~F% z|BeTG4G%vh6w5v`=X13-!A=L@MU`3BkPU$;>)BLx;w>|y7zwvfJ@qfG(<3{N8g3*DcdlEK%tJ&x) z6dkvRTYBSpFtll+Q?wyWhot}DMet-a=>-Y;Y{QA7I5pnTHBz-6*-33fNay1Fi}c1{ zH7h-SW2Q52T}Jd-^|z{T2c%Aq`*uNL2bMd!3qiy&)4@ci=i3K9^e2T0nu88#KD<*v z`yU4g8IYdH4_`JE-m*;J)+^VoGYN}22>17CFM2xPkod4q-`F2E3-|F;Cx|0D+-u*YFLE-ykRBjxI44AXDA5FGx4ev(g3x zfLb(=j|?*y*yL%2Y{z&q$x1ge?YP*^dP6v%H)(&u-XQmWgLnUMSD9UP=|Fyi8gyJSz=zdw`phH}B&T`OgsSL>Ar&u#2lVl6B*p`=xP2Cp?# zBUgQC8J8L!ql}%igTJ`*5|+ zoEFXUig%2pAzsm`g4r@HMU#|-O3sd5(J572Y0OgY4t$(tGcu{FM6gy&iCpy)da7?p zUOh143CBO&r)W~CZ~90&FTR}nrc1vp2Ga~qibpRz6s}-LDPi?(2zqg1Od;iDAFJq8 z%F@0hZV;zUddZ1XLPauID`PpYUQ*5u7$IrJtx(cNEuF>u+|gR69U$J{NKyFuQ($>eS9qCihPb#50X`{*dBE)sJ_}?q} zOu5TS(9S8t4AzP`7eHi(bRX=3(&%sLK86J)DL?5xHGmWG>Gmc$*n1}F_k;5PRaNu} zHzi~U_#sLO!I6;rM3NF>R$cUoG9{!5_@PS)fvYL{#GDeM4*WDit(KO5;!O#81ek9r zA>y?~pF~qal4^?%A+~izYU)5D0H>W20$yLFrVj|z7cCg4 zghT_JMM}sbz*(n+d}%0Ba{zLcm0QqB38?}&4KeY?uSx`CEEGWH{8SB|rLpPyUwwg3=0VN{Ft$qOF`IRk{RFO>b6C zE76o1KKgbhib;EmN@PKBAw}8JMloiJNmffrWW{XplqJ$e)fS3LcK|!e7GG2&Z8ZH; zG0AgTiR=uBZIw24CRbJD zr(#JZh?64W(w~pE0I)7V?3WaY#KC;DAJs*E$!HjYR4EdT!}(|j0NV=0GNni?jOL@+ zNXq%Gp*ht2jJimZCcQ9Ggacnv@(E;%XULW&1v68G69(8sws@O-Y0{78ig3XITf`P$ zSu9QZ*+LO+3}Bnt;xEdjNf|5^;ZT>Ad`1A-8fj92pNeqG0J{RnHb|4oSt-IL4N$&a zb2;3txno`4BNMd2;5e|0P+x?GmK=u`%#Y&On)1gRXiaBc*Csz@UlqM5l^3yGuoM-Q z7tx*+K-hx`Vvpr3D?<*k!Zs_#DUS^ic~KA_ia>`$#}NLQRQr6G2px{*=SfQ;Tbo;g zR~9WWeT|3ob%CuY1hLmk8~NliEYMzjidA52IVgt{1fSox_SH%Ym#&i#g| zcW_EolKj|g?{&)jQDG9mA56}V{i~yfMODz8T*28xQ)7kc{qe&jc|{6*S*v5US;2OZhk8D;(b|k>#(Ns! zEn9puJy3ODo0($7M(O8#Bx*4fEo**#NM2tZwN1wD)O2QNt|J>JF9{4D5q2US_^en= zX4EdgD`mrwP2(umO6Q~Ak^+axQZG#xG3t*OnIQX3mibEzbH7$McMm7~~fgcQz&iv`NVI#wMAKVkFs(5}WH-Z7snb|1u)$b8dl~@|t%9LZ+v^yF_G=*s>oYBZ;rKbvr*p|Xc?XhX4 zj9u|0g9&6w{lUW627k|P6q8~){Bax}1xO{u&<>U~045n9Vq5R`BC=j`BF%3zxa{7(**yRL&c2?7~gGKd^ z7g4lRCJUUD<`~=g7=&1ma{93xr9>JB;zciOV##P+s*2R`u6dn};ynAf4YwG}tQD1}8m5 zRAFA_z^iW#?#S;6vo;4jle3D5uvYg##^7$};9_8rvs@XR4#E|Xu-w#s%|`VTh6@L& zaohDw=k_lYiZoR66rnClI(tYikkhCLN7`s*!}Hbzo8BOnKtDrf=Iot>hoC&pNvWx(z&)pW!G}S~RNGj&w$|3b*(_e{YytYoa{JfpL8v zG{CmKx9Rw9agAPfiZ?E18ZK^ni-00y8ZK>mi?UBrD?(O#2WvuB+fP~x?H5Q=o{~-} z8euKVtFT1=IiG<6Kc%sfn9WV^ei|}YTiNnpfg3;8Qo0ly30^XLUR+jIs%yi>Mt`Pt zA^+Jl*7%&)Ddz+)BIIuwIZXZ!F%A|TIWzcx0HGM}@Nkx%ZgHUC3j$0$sj0I;x0R?% z5Q|8Wt7*TMqL$&SJaz&fgFSZo=(YwcKW8yAsSFg_Xk_yzjo>%+=JYIm=Y6bVW+J1J zG~MZgZmZht^%LY0j3G5im*{b( zziRx(KtGk-y08H3f{|JQGlr_P@`mhA2KUS;+*_D^(dJn_kb=in=Q2>p(Y5uT;$%oo zXvEq^pU?ix;~?vG|FE{8G~lHAi7>-7rl?rHfI=%~k};uOzJSA0>})hlB3y!WbNah* zKdb3%5SL2d+p9y2KqQxmgh5ettKeTS}+nU;?nHZ<;w z?ShB=g82RX1s6E4nZ2W?WKt4aa@J-j{Cb#$0i@$mA9ZKqNZ#mr{lXv&o? zE)qF(u*C=n+Nh_sdQ}4CXrclnQS80F=1X{?n_%##4fRZU#Wd7^rDmRkr|@J154(KZ z=;2Hid2`P?FUc#+66n$OuogNI{&v94c*`7*xtWn^Y~=&O+1hcVc}1etlT6gk5Rh>h z_Mzg`{_H*`z|vQinSxvCV!FQOXjP4aDwT`5`df#De;!A+Kv!qKrZ0(+xwF?xepnw5 z$th3e%M7KruhG6qsPvi!13_Oce-lntyUAF}abSa2n_2xvRQX^bM*EKj<}PeA|GzdU zEX%5wl^fsbC}>}}wmE$7cs`ohCU zH{L09otFYpRH@AVAdJGTJ~MMKxEyoT{mrH1hLQ4%v^7@nAqjKo{h||u+9SDF9KLI!6beS7=MxGYb)`0F(QJ(^rmH=Si^s-sRtHzxRHCzs{SZN#D0xK zueEH2aCZzpHmAUL4uo$X9LrOnAL&{qFe?2(QyFD1Wjz(cwiqkqTx$Hixsz)i&X5HE z9tmFVXGF{n$)PJ!_Wj%|Qy>U7(SAItWlen1I1``6GcY?z#81sw>GsjA2iyzXm)o0V z=*^ZLGOmN9bIoPL&k-e=!60h3^Yci}gnH}k*^*Pd@<##XgFG*5?N5Dy^ z2`OyYt2xTj>OE8fUPtGPjl85=?LW)V}b1SjCA<4xy9!Njx6EjNN`_jO&_sp zP)N7Y|I?r5?Q7iy6k;;5eoF`gTfT%hD)!7D9(v2_IEAN%;H8Z+xxm8VKGjYKZhxGd zKVB@CF3}sCLXDrz+O*KJFx@aFUCVo0BX@0I2^o9o`#-9TJn3}Spf4X#M-(ep#6QMM z5dImd@NSY3$4l7$qY^;plAMYY2WAQIAx-d(W|8>5i^QeN1g1O0sGDHcR z8~);7SKs}4E@sZNgcL#m3WK<4GFznbX81+`P5}f_c;g*J>Da9wvH95aYtt2z6tn0H z(dzN-X~n#n(9Za!)cBJb#_paist^$ytgY<;{24O+Qf;#hZEguTqIJc$mO}f)u_U;c z^ckO!R5?e>P+#L=5@n?NciW!p@fW7l ztrGjjnneSoTb-Rg>#fgq8fv3|L|DuIya>)LYzKe(b}2tS(0zObg%B6VI?8l)nphu( zA0*seof9DZOaCj6@DlP^@h}7Nl!u}wdM>3XOY>km@!}u<$tdNIn`XyLi36QzY9+H+ z{*0GBmQ(C|Yx$^Q*_^C~{QL~h1WAeh=2$DEM9 zx#GBH?7U#gQ4XFPvAPzb?{DavBlolPw9P%xvgq{7jUjt0$MV+%#cJL(9&8P}h#6vg0@_!Tf&HP9av6t@(z&|F1&BwYyr?hgI&K>ygy)HFe(0 zlAHrg-R%o`nJ>PKW=nyQX(C=Xp94F|GQ+SFF`Mf>b3-q8(C5;LN_K|Ra~{$T6uIVt zHs$HH7|9E~Mp{|K6y|NpA4{s7i_Y zxHVKy3`Y?UZ{o1!xD$zpYMC{*L}9;YnVmOKORRInL<#be+mzU=rFAV+vOITUx*HB6 z!t=Ml!@?0x+03D7XDJXmAVSl!HJl#&J?6eDOCMc=>eHF1z-TIudHM(Qg;q>-!BzP+ zZ#kTh#L7Dng*Ki!kB3B7vcUU^PZ8^*2)g#uv8|qbGQHdpDSGLJ#f3=t7b=)sOj!j^ zr>ieN!`V=uN=9Iyh?v=i)f@vu*lSyaRj0?D3*gs;%glVEc;P+Ezg>xFylEdx+U~6C};GUSLXN#ej_o2zuqDU9O-5$(_6ZbvCk7@DeX(|+|<;c{eoae z5sc2X05Y8*%1aK6d>eL>qsZM4=J~A2-I`<{Fz=|v{*18TM=_tL%0S#WLLZ!pg*Qu8 z4aXgDxZ{~bXUOCB$xObwXZK$5&t(wFr~sv_hL%1Cf%=}{2cMPkr}*~J>9AO-DHwP15e5kR zJ)3O`7{_967p+`V6*NwpA5>EiTvYi~&w0-atRawZ@iYvuMwMBQZGbUCmjbh`V$3Gz z)?cn(!e-ho{gan(L+zo(0WclFkSarX|7{*0L&S?QA1I>g>#(o%@G_S)#YZfU!oPaZ zt~VK7qUu?#MCiwQorMOOT#w_~^xXx9`>CyK+ux%*;FyR&#GFP{GfeWIGOI_#RD1LQ zN?cBlk38ns(u`A>0R(AsfnFLw@%O7`#3)rfs$h?WBce53&aj8r zuF`qd*H7{?`d3;b@Ox9ROeI=qN=BCbcj~|4n^uCEiG~SVVM+OeLPjX);3E|JjT*%u zkGpgG1a3prLSxwgt+N|u`u!bRw?^7DDb`zwq8-ki9#|M1ZP!f)yTUzzaa-<63owM)6Ta^>ue(u|R6tG9c4CtI8j633k{AFy*=B;#NG@$e zq4G9rBR5h$?rA1EGHqvuJacs+IDDA+WL?^qqUJx-%%74grvp__s8_}IrYeayQzT)* zXL%WGoP!*jCn2~Ap zBm-sDH}}UJX@5P-2;q{hdfg5mfi5XRu`yM+2gs))o`;nvb z_*6QQAu@$I^36+s`g}!roAd>8tL=6T^~jzqPxDV+IuN>!!+e42F-K1HHh;`K^1K@v zuZzOJ)@5|KVxy;WkI}B~6Qu(Y{QOb_JeAm}PD$V)8)&jj)CjXUU>CN+kn{YV%Yq8KLWLc~bJPR{8Uw(9p(WVoe<8e-OJM2w|N(e+&PhcTsG zz_~W%Ubr)ai&Ugj5XF+Oit>8{{Z|zCe~`xK^icreQKs=hVa~fWsu9a;f2urlM-2ZG zq#tpQ@oW=>`vnnO2(-l`QPFgZ)-kD>PG6QCv?jv=q76#{x<@boWi|25H=U^+L|~A5 zOCU2CRjvBKTKbaH7?_LtRz_N*fBHGG~8`>Ps9ryi=&5w zT53_9{0GU!*KUHrD|Zm|3Y)A;kjXtabudm^dOgYB-3a2f4uF+IJrx(co)-)R0BHan z{dCr0Kr0=RxeoAvyQQ`Ln}OO~NI^d}T0HwgYv2F$FL(B+Z5cX^qF|&OQ?Awi-M9@)1tod~V|B z-g{+dX0YuWDuS{26vZfE_uI*?dNS`wly4lBlRBV~xHriHb32X}5Y14XeqS5{&Sx#x z0t>W!!L!6MpMBWH`0E6V7-3M7>eV2^m-AE0Q`lZM~}kqRc9?GbMCl2 z%{(j0O`M?9tP?p|X)z&k@0uqypP^lKnENR5Cv&EXl1>T2%&a3!6BGZ#H6hA$@73W=$FhUWj|YA8 zg4$h}&m@kU+!47#L_A|?(5MTYnZ&S2XvoH-``eIr2AbR=6LL^&UKGSqRK?r&)7Ioc zZXg*z_viU*k+l~LS7$Z=LVm%OI$=%m&WNoN}?qe-HyM}FT!cH%keP|?fWO3%)7Iv=*XyujCMTf!5{5VJyJ zDg@M2MxtNImhZ5CU9Zk(<14A58(Pr`N!YKdY)sy2hm{Jq)j3UKkNfQ@Jb*?3z0Z+y z(@*D>0cV@&?Htg3--MK#Ioq{9r@8ikKoBa;rR+5Yhg;6g+`qGSr_;O)RA(DYt)mYC zwTjC+@-CqTMLp`B=E*by?XrZG)e6Q)n}+~1zD~USf9Qa3ydE(24(31_JQ9LsR>Sb|Hz$6XRX)O&EyNrK^`-P40jyPIpX)!mE zl)*m~6Sd_D-J>_`UB}J4qMkvjNmY_lwsFd2Y!LUM^tFY}8XKTGNhXPSe)8o%`lYQT zDLf3r!Y0DIE;n!bNWZoqongVsOVS;7&~aFL8%em;~(C1V)KwiDcO1{*=jHwJ@+ zcpKk{=E%(z!+wV#>k1_~XCoquIo7PKZokDzL%Gc{NUwkaCrdK zeyR^Tb$%CayndAp09rH?=abKpxI)YZ&C zylQ?@!iYwdrqY_U+%8(MgDQANOn}K){Y+vXz1#B65Plff1~DP(IElx z$XOb0_a-0gM#L!O7wWmPJ3~GZrr1JDHpu$fUq}P9By3tf8^pueV{>0iIDd9yzWsWd zl)BF^c)*@6QYP8z0ned|+tGF6LsCbjq+z3m?;ObPfj-GU?Y-$CrqGd>1n}kxv(I!a zmj7rM*`sPTZHRVu53r)K+60=Q{vdY+A9TB{8YsCGycOqd8DJP$=CyNGY5iHmJGC6% z^n!Pq!=?&Tg&ZF_yIiX}phi!q0PjmCFTEQ$-Zl9)1y9kxiJ^%3=Lk*xvu%TEOu$d( ze{#e+HfdT3wkN*mP794@zrm`vcSwElU*C{&U1F;JIO8Pr;#-#Ps8EM!AN;Gqrr##l zW1#KT;!o4$r;KT4|3hm90c77_Md?)EvxdBs9#Il`9N8$L5F{&n6 zXtar6JXTjJdjX_k30y-GNjD-Sb4lPjo=ziv3!j@HbWclqHK80Ct|mUe;X!?zwoE!p zzKBanu1bF`6KOh7biTk7Hx-B!GXF7{8Kc0}8F1z~UJ=Y=z!kmTI6i)p7YyNDSkqpP=pEpBxG7?2CX+oP(VNe9nRlg9$ z70ZYG^eSc*y=H?s-)QmxpKttgjv1x0O0iTfjiLtI{fdP5I0ANJ(O+8sC)1}7JEclsZ3n{IQwf?YZ)2g2UX|v-V9(9;N{&T*ZCyyF?Y3$BisG^}zJx zlV3rpX4k~M*T1Q{cRgdxu^KsI4VBDTt^br~3+ekEp^GH)%|^(8Dx&JuES|T-IF37@ zm>B>oeapyjef3{z9|yzZ9l;LF)?cvde|&>U*jebaUNTNt+pe1yfx0~t_|ocX(KpHo zYK8V|H-n2qHdT>L06m$6>@YZ}4|xJbyMe{b+yyu^%Ib?4dNUxL{2##_MG!NQ2Zr-> zkZ6~*f`=en=)Y3^*~tADgcAVTk(*tS&JPVUXK?h>wPcuwAD+Z_F?gi}$`!)HnWsMu z#b`66prF^&UNX*TBj z%W@h0v<<|7KKmh3Q>Eu}#Y$9*?ZD&>h(xR)EGct0OON57N>?V^l z?874?pLWPNA*ylQ1|ya<>9)r2d>o8-O6{h-VG+=bu+_RlhfB0YG8Mgma0g1+)YM>` z7Tzjp@T+-9G@5@mKoH8u=j^xX*=fHe*}(ySn%XS^i}ci{mfo&8Lq3~@? z&v*X{YKKYvh&%3^vr&J&`ho@4;WHfT^U5f0Q{MBufcYz++(_?ZG8=Voea-g>oXuN8 ztx4^(FN##?*IW>y9%wNGg+C&3Mq5}?J&dKoUpKW?M5cowS1}>|t-Qf1%ZuwzGeuT4 z!t3H7gFZ5-{kt=JlPxp7VXGB@QHdG*ZJp^tVP~S zS1ik&)szq{IM96%fIuJ=Ni^R23nRzB9A+jy*(Q=D;my-uZfh#Adxth=kmQz-K62O~!TQW=j%fdAgfNxC0{>L1KY%u94{~ z{A9W_L*=J0o^wQhby)mHJqzSG1m)6aidy#qxo(zF(xPh5l&ADGO8}6GyiB-24 z%5|99>$()!39}$i*uTl`F0WH-9eMK`232aE{E!Og(ORboZH_Xa$D@_-4zv@j25Lo1 z0u2!?m=4_zNoX<)Sfn1PhcAn=C#E1;^9ec=rxAKCFBO3eRsJdk!ZHs-CEN04`?bcy z2)&J@+db$q5?+r@L#KHDynADzSscOmhAPLHW)*&rkHR&gm+a(m^y$D_;-K|!!2B2J zw|9bY;6GT7D$iMkFo~vr;ViikO7n=zuCFC!J6ydpKXoa*t;^Q4tx{Soku2wUO+TP3 z7oD9(fA=qtOX12`6R7HBYGe*t78%B*&h@oB<7-L9?}=keZ&=QwJHZaMWQc^>8I;ZZ zMzqs z?v~E;Wf!O1$7au|q^Io^H~1aW)@!&r{l&Jpi!V|ZJjckZ08n(vb8&b>G6AIQ8A5?#?}Z{vVb zg(p6uWQ;-w4LEr<9)o?}&+xyqSXreN40=!4s|!MTvRlxqE9M^v z4oA#3B;$dRlZQGjFU1V}+(I#YCN?D!X|`{A)CI7yajWL1l>ZFV5c#UJM4#Dg zcC`yJa!_gn?3r8F+UenQ6QJ60r_ghgpbIlLecqc(z!6q1u|*rTMX=+OMuVQRMTJA` z;3y<{pK`w< zn2I@N>Ij#j%R}}py}kl(MxS0}8B;=ND;$2=IM+)SBjYG)od0zkZf9_oztVWpDKnS} z;bF1X9sVv#%_S~fT2~O;j#qiMg`NLQwioBaM-3WAG0I8ZH{JV`cKWM zK!Bk5;mw<8k6O=Nc%m*BXMwt%W9Gs!h|}a}Hgw>##3oT6HZVxrj+*JQ#+I)i*uw|{1?A?% z>VuM=MUl(!P2|2C4SVNvWcz>nCVo(1xLf}0KI#B`%=Z1KBy9o}buUc~4hxkAj8P4{!pHtS@HmY_TtZw%lap&O9?%nSPkk+X+mT{ZCaI1^8A^ zuUs%BHg0$6bV5B8pg4FSMU@Kca6$oF7C?By96E05ZxT0|tk)t+ZDH(VgJu4b1LqtT zz3*b;St)J6*-ArKj5)Sl{fDLWeP?8WaoI>Df9zAA4P_#WbJY)s@xelbCq~ir@|X{k z;^$Faj<+r2}TW z7PR~PzqX;++4ZjM?IH&s&E*n!z%@80>EbfW5A60)5fJYBflvAy4gY#V>~W>{i_!Wq zgWpVGcYX%#Cwh3Ot?m;%w0jFCA~+cQzR5=D!fLCENn=q>SH`YXNwbPeUXuseqL;^U z3FVPFOzPqD2}4g!XMiZz7c!9_S>sp5MCJD){P;hW-J!9h1#Bmc(>63g^}#rezSmDH zl;o0)9~y?=iWB1qf~fp_i4(}!*jL6tt}HM1y#c_=S6EA-;PB3;MEimzuFcpJ5^B>2 z^~B?42QAPNp)ay9)3`(G>}q-CE3MhtGCp%pB`IkcG^~uTkF_Gh8jWxtMPkVeg3myn zR8D*Qax(sqY0y+Dl@MT5w4VOEfz*STBuG6*alfneCtVd!bP_FpvR#yk0$R>gXC^<5 zh6OkXi}yF#Pj$gwurXM2ZrnHk=TqO z+A>+HqNQOY=-(&%!wKVU_mlM3pI&;W)~QWhBRXI;EG0mtkC|QBhPlJ`qo=vk2Vn>q zEU6BmH=_12SWult5ul|q;R-slny>QO@=S7SLx%4a{cdiu0p+TMsgwTlfYOYe81&|2 zQej79sJsKMN=qZ7w0PZRVvQ^b@f%%QG=9;rPaAM=SuYQ(4@v2l)~J6vm-szyEjr(! zs_;&U8xJs?Ue>tNy}QO29!5Sd=W^=l#5j6wn~yC?09|8t@jtQLFGJEeB_sOl_uDIp zl5|Nc%c&c--FS{Mr;?eTq-NpxSc;~^FynJo5oI~X^oUl<+)N(P;knu5yno-Mt8H5v za*avt?x~Q`pk%n{{FsNrSKe{1_&=HTqfV?;L64B?U{#C+LWF7JA0ew<5Z@$RbA3Vt+(F|6X3P`fqb~4ivzHpF!BFAfVl^g^MiE! zUiD|cK{1hTqz^hCX8TDsHQZ>MLsljR%gekipr-02yqs!Xfkj8q;H?M`{=h+s{4K>a z8Q@TZ`Rqmy^w51*=pI;X46Zw5eLmiz1py_2*qz9AsKqjJ4+uHh^ZrHRYi4YR*Lxq~ zf^uN#2$m8>jK!oKza?qD(-#q&8jQsKLXMb%2CL#p37VHWA=#lAvpqC;p>xo}D|P(= zr)Jr6MUvlvrl=`VTmGVXa!g;9{PT+xs3~O776(m#U(S1{19eJRvkX{&u3TkGmL!Yy_Pc5Yl$z)Ls%Kv~I8{AFW=sk%yw%f^NHfWHv$_veo z=V}0=kxO+5W3q1giD%Wu-sl=Fwy|D}(_|6*4x@k2nIa=vOfb24a#}R_8IonAY6hq# zjF2@11VJ--Phq3e5uaX|OP55Cd>ZSe)&7+J3Beq5@J+HPE)7`~BD;D8Jkt3Zz0YTm zHUQon=5DkdWXSG|v=qxP@Rj2I#-n&M3bHz^~YA!3Loh)_HM2w*G~d zChKc6#EqmK^x;{mEzq>8St@F`))|54Qa!+;p0UAn$nxLlGzc}CKivMgC zqyZ{`2YgCYQ%|4NZc9B!77&SNd){d2o?xcj3b+6ONciil&>}oWJYCYg2yPbky1EjdvPq` zBYsE+%i2#I--C1nJKdN7)TUu^rws4Wu?}V|gB^{v@5lx9LQ{RRVK*&qUm^GZm;E0N zcn>11at)_?#wiF>qEfO!nM;%bbljY4EIwgrTP-h1#7^hqEaCN#I`s z7zfIc<1}pojG$BA(-=-R{c?W}!f-LO84SI1yXfcdI8zNO@uwknBIV{R-KBWM{GH~6 zSKAeEn40f`q#fCW%Wx~h$sGJg74{CWx&9#%!`;^i>d!C`)K|B3bKGrd2}n5+JBL|* zOTb=6kKu2Tbl2Lt{?1W31A$6?ps`0vC|L4Vu3G*q(m$6jaL&ts^)*^zF40N`b1A!` zHf?2XICOTIhCZeDB0=Og_eXTZ|6DkMA~h527)&UVEGk`GOpFM#y^CsQSM9S39~$VF z*0`52Q&$RB-`6@{iA8E7Q>RbF$Ovu0G}bKv3)hmo#*Dzk_DM0I5tny2 ze$G{IwwP11Ps-GHlz@Ub%lN7NvE6|NzI3~@N|G*79>Jg*xZJL64@mI%cSYQdqhR5) z58r)?%5JJ2TB7iAF6s1RQ~RV_%{Mz*-L}Z@yC6Xy7P!U_m5RCv&EkLy#=zg0a+c(( z68TY3-Y1B*`O;9VW}0&Kjexq_#<*@fRDEI=x>Kv8F8I*f??5`UxhC;p@sK%`-RpN zN97JcHic`c72AfUd%Xqqp*AQMrZe(l5-_}y6*vlpS$dpKj4VY1G_~e7V~|SM3RSE9py13K&&vjgWtb%_=HdlIvGzi-e5}~G z|30~@10_IRl2OLoU3^*~9cU{9&L8F;)~{NBcL_Tnl#jF3kV*ZI7sAR%n#muS{L&GN z#EH(xv3 zCLtHm{EBVkL4o9ZMH3Ny?v(60-BH&r#%5%&G70+j$6Msw^**ldL z@vw`aqyBT1=ExxzfM}-qK6M{vw#1;sTfrDEQ$$lPX~1L_?-W!QKzf;0kU&Dko%l2| zBX{u{>u73hd^GJ&h!BWVb16-~{J;{4k4bXAAUO$q*?y_vbR08W>Q2_UJ?o|b7TSgg zQQkyca0o#%3io$zr}>Fh!KS$V!e|9)9@7eis@~~T#sk5K$`$9rB*)2m=13!!6iUWT z5{^~kyP67Zg#ZXrXdGod$MBFbyjGa_C&c}c)a3;=Np-cTtc=!oO zE_g_icHF$Y$ZcbdKqtFu*DcC;(2X74YG3)%L|9KV2I%bcq3TVQ#ynl6Ta=J+ppmgk z%#CSEJaHMM5+>#O?A6{svE|(xEM?cr?KGF@CWX8h4XBEV@oHc}l$w^cVFk8xRNhjxyvK+@!+O3?lqanV)(|NKD`H`6 zI47{avQJz#|H`ZModg;*h{%P|S0i!;>+sr6NC_BH6XLXQA?s>n%|^k-3jLqOljfyM zs^YF`1q-9Q;;58jcacql7)YvySY&e9_U`FV6#;JOyI)>TVErrBL5ZN(FxOp%h>j3| z7VJ>^*aCPzNg8L(znThh+708=euTuJ<^M^%N%}1W`zZ|EhJ_h+1{tTLp578%)GT&v z(|lHIB!u&!gF#B*`*#8w#csnJMmh~{W$%H!dRgyg!Z$LPO@NtFr+5CT=zMQRN%Zgb z3561V{wnQ~-E@^7z2w8!bmx1cb?lxwUI@Emk=}`gEYO8nB$7hkHOXZ6mHzJj2EL&c z4RJ99n;ma(OUOx%&7%3Mq3@wH>L7URcUh54WrL{@6ae%YUREJ|K~E9|p9kCBZWFSt&zUq%n!%qD&4*{!6QWVP01005uu)63f1vL$M-hgKQifION`YP^*A+syB9r~pr_F~`?; zuwFFq-Bt2&{DGUmk=YoRf% zW2QCC;gT)+wmcTlQo!sLm&e<3{2@Kn62$fhwQj+-Vz_%)bU{@fOsqu}4s7MgURktU z2cZd$ZJ!lsWJDq7eYH~RPAP<-a{4diIJL+KE;)$=OCsHqE*t$$R7B$7vk)vx!^D=i zXM>JBYWwp*&tQC(Ka7&n$Gsah!J=51a3Ks^IFV%~d`#J|3le4XBxP=a|9Vne;~#jS z)fJphxUFGj>9*JHD{W5QQ`cT=_A8`x1}{QJP=QEljIX9E6Yy+asEJGzbK~#byNh zQI&T_Ir*#6fYc-MI0Z{ps$7*_+&L8b7u*jb6Uf*9V(le$N)clxRkD^$8}G}=>XdQo zG65APJtv7|4k;S^_R&{?-5PD4t+9~&&3m-yy1mPR6;=M-fXvvGWy2)2YaKbKRPx0P^5Ek4l)s7x|qoUC0JQ<6xG(_&KM&z-bjp&oQjWtp1=w`@AFqTjnfgyVCK!{OvB z^LGoVX+CNY=R;X>H#2*)^FIolJi8&je@YS)FeetJOM>NOYs#xAIh zr6bApJ*}&Q=e4w=liBk&{qFUE39sT|nrW`e0@gB}5&R^|EDvy%qQ0}J9iYTtl1AH? zXM^dFaY+bWmtC*v?)mr*++I=Z%S@ms{y63hf6|7UT+oe`NE^GF*x6Wh5PM6N9 z#cM*Zryo)j^EQMDxM57(b*(t0aV9LJW1L-N5G05;46|jX_1OZO2&1b&OG6n-RiQG=h*n;jHrF-DY>0+qgf-lWs_t z1Q1#>kquU`MYe%}Ranm4K0r+C6@HwZ#xpZVoyB_}621roA_DegxufB$R`fuNPBjWEUPgtOF=j(H!XkI^ zW59ZLn~peCZDHq2;?TXx{TicPE1m{osqo1&*k)8)r4D82?-Ag0uAtScgywrYDjmHc zwzOt9Ct1k(FJfPFgdnL%8uRuc@AE^K;t}Q5mH(u18k~Qm~fq)7S35w)Kr*+a=kkVDVN&=v=aRr@( zS(u4Zt$~gGG$@jygX5Y^76=AfAK^9WzjmrT66=G&n~Jsm2Dxkh)#i`y&Jg-77Sw6* zUQML>-yNf1DJvYH!)nn(#fWjVR5wZQ#7|ng>&!eNCQC^n$! zIb9B1Shp4AZ5r1$m(z7k5J4dQuYm;^nyX7{AyACGwm0$*)b1nHFEYrCqjrQO;4py^ z^CIeF%O7zmXXYu!wQo>*{eKn)l_qpx)?S#dVFmX%x{wL!3h7GAkyq)&R@#%cbT!5k z&z%4$SSpz&GLf7RVIsh*KW%ZdCu!XxN1{KrfpTq>y4jkhF#iovEi~;OS zS=23f;bGv0wLzvsadlaou>lf9g;Oc_Mtl)MqyCppjX{Cv{&Js4{fm%UsBUs4EwFWH zF8pPB7pk?;i&6L8{V3<5Nd3xlz3D-^3hSngHfuZwQI#DrBdTy+Ll^6?LF2%)QQ@ZA z9w=(N#G*PR$B39Q23MSd@IYft%wj)1Yt>MR|G9SXA$h0m83>Z|`I@l}rWz^>Eq-b1 z?6ux)K|Xdw+32IK86g-+;7Epbe^pri7fZ0agv$Qs{giw)77}5X1t-aWPyAg|(0-g8 zJhXJDnvQS`^QKt@9w}&N%3IAkG>+!7%&V(-1~}+d86*`J>Tzq_toQ;j1lxfxaZUgva9d=N^j%k41fpd&5rn7zdbB_mRbr+ zT{b!Ff>n(B8CQ`YK3`R-W0T|Xo)~J%cJ1v}i>$IdX@efXkwr?eOjnPEyWRidGCaJ}J}y8klw_ z9mIoN(Cm82_WA`9X9AAIfIDHW0)nC;Fy%R$S9C)OLQO~kfBl?QBQ4t(x7Tg!8WmGL z=zizn%HrlBo^SgXyLQhGRa+5GD_6id9T7RiZte7b!vu2%FaIQHT*;iYr3MIb1hqE&Nx|NB*zL$PXk z9}&pS520syecd&hSgqD^2h>}Y@ih>lkqkL;hGcsiSr)-Co7`2r`4pR7N{?$yu3F6$ zVygFZKa~&~^{!&R8EGv8@D^uJSZGQ@R6Za&b3LhCeA!6jzTS0Q0iw7~L~P==gT0+0 zke9q-hOgf~9R|hAK>N_4QWSDdJZ8;@? z!4j+AqW>@EBeSm7aDKkWyah*@tbK?;efsztOalatRKxOdu;l~P;?Jt_DM<^gWMpx$ zD8)y@wK){nanCl{tMFeCaa3aHH}GBvY&DpUcLR&54JSNsjJ`K(lQQFl35Z}G+C`7& z6k!dQa|Z}eB&kkIm8D$4cT@wWO#F$Zi`}=BC+(0GL#st$@Xoy`mz$4?b9c9UXAa-2 zcHqZkk#YB0Zol8RtYM}E)L)D!{2u=sY*OaB^n(;hf$Y&H$)xdZ5zemIdlDDQtF5wW z4fDXS+Ee?HF(f2yL-);h zhOR;4-QQma-=;>@rHeYa$pdi1tE$g7FbMisTFH!TV^ZJ4W)Fz1FJ$0-g`239!z<0L zL0kMDx`@*0PnrZRwYxNwBRWHc^v~w^2}H42v%D4E($1cGbAPTM*EQ@{xuQquc zkw*^O?;77gLBztl=ue8QooFaXC&#qGlI-boWzD!u=-dZ6t6y!x`8q(&UYKUBqBA;W zt1h7+6ps?+PjPTUnVpDS;H9X7H`fUS@ZIbpwNU}P-0|pEvy~UkRx>YP!(@`1{#z_R zC&0-AgWZ}y1^&;saJFYD>Si4~Zwd5eX|N2mRKdb;z5oRZk$&gF9-KHbIgU6b-n zECLY#D{Xbb{KZ*otTLwRH33@J<37ITMB`FIP`HB~83YWX0@Tnh4+mi`ah}t`WRtrr z1O3a!EMkw$t;&raNc61hG5_*49GyjU;OA*43~5sUFsqdPERS%2XZohCAElZ*NkX22s%JFElVPf9>d^fm$^^Ug9x0tB>AmCjsti`8d-!VIv|J^Q zDch2L*>ZR`rdddX9KuycMigh&CVQe6!ACfJhH7;0-;rA;-YM5+^(uZ`(DwFM zV7Cj^$IajRX9xy~ci()?r!ta1IlEKY(~aEFd=QnmF+54nMtR$`PcUU0FPF+?1fMzz z!L!-Z=E}Hm85mw<{}Jqq0Uvb^7Xad&BqZId41Io5N6=kXPU6?&EI0zOLe9+9-#c0_ z)jO4YHDA%%y1KBO69rkEoO6yl!Gbuxk(J036t7W0l^vR**p}Mh*r@!x#KBV9tx3)F zmEcLKVu9k|@E-mclnPTnM?Ro%5F$a{cLvAh=Kd{{a!V!cKW_=rGC#5YHd31+fWTcX zMi=YO(s3#c4z#Ep&rnlLw%Tf4d19SsYJd%FpsG&SUPEbb=|4X!Fq0+%6dn;t|IEw+ z3zIgb&udF*lLVvenqR{)%p+H?qZR(=mr5!7vj|*EajQ8^?H@A*PXPo3laLj_KMnJ0 z7%*t*)R@Y#1Mq~(UK-IIjySc=4VH-XXLBC^ULxp$&z*_bSKZW{4BRrrw<`{*-!7l{yVc@es|!F%9M;Uu+h$fXg@ zMuiYD$j3jc28xT$pD!kjd+-!(eVNuaYfx3S{z2rMry8Z;u;4kCFP`w!xg)&EoV1u8 zxIT9QzONn!3cFK_A!%R2l70iiQB`gRPto*|MKf_pa4CX;pTRkhSE9vPT@$niCdxcR zOb;(XI&3go^|Fd<(hL-sZt!Uzs%mfnR*IX7yitV$Ia}cb^JMV(n`GLUK7iAlIL2-X zW;b@Y0#(f;Q&oaar#X(aTAo4jd&m_OslGjYbMroXmFZ)P|Pw9tGdxP)brjS4ZGzGcL{?4g3CQ{;jYK?<9lV2EAr%Q3D$j;F1(mZR+ zkLw$X%B4EbW~1Y~=E}e|tnCrTo!mU@wj{*FjJiYs7(nO0!icLlbdh4qpR{KuZZV~( zzn$`kx~vd}ZM`1JKaqb#*u(qvfb6FZpj+7li`P>ZOt+C>EbDh?+x#0umP@jnM&IEh zk-t$dIHZ_ioGV6HL|O(Av~Rj1BRvVq#GNLhXKksjHCVgD=#>f$pR&(2tBL(V6;D5~ z2n}o}<(YG1d+7!tO;YoU@9oh+3MORBi@oVKz!OAZ^qv(Tjx|Zn3B9oq@0K$_hx`vf zha`%S5i4o!0T&x80&fYG*~)wOFq}(;^gx6HernR6Z@(j$Ga&F&5Z~4wzNsFL9Pw)r zGW0E3>Ws=?G)cyZ0*$!=!`5VSCav_aFa&h-4WK-&M#^+U=2$DI=Ix-07}mWo%pOjv zbKTy?0ur1d5oF>9?ax`ujiKeBTz~lLD0+YXOuAal7Wk!tJb?B}F+G3(U;Kg}!UGIx zap2^3G{7vaV*kN{-5OrWy547pF2Wfsm6I4$#nR%Jo+})rwl~vpu%7EcGOW zrTOec!a6#P)cu?6H$mjHdvGZ8iXDz;a)8^i(H{*2%#mF)Py|@9Ke-`dpA+D39wZHc zJyYZ%JrFQ)#A?s)bX~)#PWNwSQorqsyH3_q)3PZOoy-+4@vT3L4X?eX9{Xdw`0(Nq z<=yT*p5xEtGD_FWB1#sUE5mE`CDn~cVEgqj_m04$`B^lYbxk)@l%Bklq^{+8%E-Jv zUyqt$;ShJA$z@y?J_N55#D$A;CEoV&^Br5^eVDspw7fH%aRy9je+TFI=Y_|#Bj=I# zMUQ`LEIGP-h&>UG6dI>xVX0MuxCZRs`lkOBM`(ED+@~?$=yaTeWk@jpzv!Ks{2)U9 z4nlX!(aW|X(q;vq9t<+QFco^L9BzxT8d%$8|1AnJ#U5@L3GFixJgZe_-@mhir7xSL z32pU_g(wxQi!-Ae`MzBg(>W9tCUR?K`U3WZ5m$)ZYK2w6)Bs~>UIwo3)&~Yo?(n;N z?Ik6vyv~_4%T+-!PI}mrFkJDdmi65J=7D?ZL`LouU!%*+EZ%?bZd{T60CoOe2s8Q#U&{+FA=nQ)nJs zlDI5}^;E7w3_D|XyohswY1NTOf~-)P@qle?;8G-pOW2{id*4J~)!??dekae6 z&cn28A-3bo{Zf{iRqip#&wvl4qACjZtaaF88tOi_9z5YZEt5dH^J&|c3)u}?sR-+CkHhE&R|1D;QfC&(>0ScgoS_y1 zMNzC;glk_CWV?>3SncG|B338oM-QQ{s7N}tzG$~Wqzs#l|7OEd>6R1LczbnA9q_rc zDRwesD0>zk4e03_=&U}<+s{IwnT;ygYZS^5)$puo2p!%QYD|)4^0Mg{H7k(8z*P^C zPZM6SdkXvP;f&p*4}_jS)nN8r9kv?<#Kee#5nO)MW9mNTEf+WL3<9h*(a+95i|jSt zaj~Rf9r&o_NR4W7U4v0uF;ZaFLM7QN9Ae*(qBw?kB6U45CGRvX`P7T?Q z>4YE>nC8^_bn9}RZc$8Mg0zE^()urMtA3KXIWW;TP+7H8fpeBo*s7 zFAPQ%EaM$>UhM8%)FGgAYwf>Frg4MF*(t(jFA5G#J^{ql>WrIT=3=^J&4K-5NAo~Z z%vD*wjr66>AM(`6If7i5tEGm8K0=JX!kniX+Lw$F{1&b1&Yv5FB#6HY*15Um&J6ilG?ZsK^(*UTj=8A7q+w;nz|Ci!0egn zXKz9mq5mA11*NtBMbZ)yvS_K3pAxf}_mwOgEl{D(=PAW36Yt^(oVx_=d81A~ySIw+ z-^Rnpf5ZtX?I4Oo@>%rW>yU0uHw8@|6)OmAoX1yhmFmuElGiw%2WFXlKtmEeC9=0{ zIN!I3VMNHbvangdo|NkyW_b34{T?2PrQPZ+rQo9Ztl?Y|4*zGDyQ6Y1!kJ_f z_0o_QxX4jOMimdxakPoLaR|&!<_B?aPXj@Ji&&lc$<4=|k@wa#74t`lZ=crj)Rn3il+4tozo~OFjxb1BX>#^G0uTxc6QjOBhoT{AE%>cO_YnB5>QC@xjv9i>d z{p2loUV|n5BlibpiY1q*fkCrJ$+-^z4}E4gpPprPrBFY(Zz{B50mo^jTO%Wc>Ag3`7;i5WC}%LBs!&^Vsb)^mk8spbWBa2|$MKi0L#u^Uwb%G)|e* z3E)3COx)w3dQn+{X#It^3iGOEWDIsje+<}u^$CruI|JjX52yFGe*0g_$nW9s+L?q>WJ zP{VLJ7?(abso_)GS_lD$xjQ(uHiAoNCMHf|E&<4Dtkyx!KxT;ek>_O~wry?S*AA#w z!Ed(bN$t2_clDwq-BTt{Bd_PMvmqXq0@Zs)1NB=58!k3!%}$r+X0%1A9f2j^w`SDd za|*f2nsgS&Xqxg`cRiD*5fE=ra&oBZkry4b;9$9^ zA+4=qhBk>L57RbAQB|@(RKzM}fe1eiZ0I>XeJD+ePb|8c9iWHfsFQlj^PqEqo6ngb!fs7~J+W}(F%oYoLmfqmGsb@( zK>4!MV=hp_dB05X0n%aiOiH`gojayZw1xgJJWq-$8t6eO5!M9P37Q^eJR+2k`pa># zmaGjYtc&q`%lNj`gAv^Q9}1-5cQXPR3FMuEJq_Gc!RIL=FR4xicNem!*@j`&b~A9= zzO+6p-S~;4AIHMEa4W1c95`}0nt*1 zePd6v1<)V2#k`RD%l~IwM#*vzi5!O!RUxCM9?!3Bf$izCZdKO%6-P7+@+^U4$#nJD zt?Li80qzd)`0MP~NG}SW7YGJmkVNf*vvRjP!6id&i^>!GTHn{EBQf`{KApRdXMl2a z?hwb5iRM^gQ<7l`MqS#2C+}4~r;2{l`MCK7L=x#$s}(Zhr?SpbgKpPsgvyjd zHiLLBn7DL!kb0^AAuC#$#_g{8Y>zRmh~ekN*B+7%X@L_K_vN->OV)Z4J7!cP$!I|- z=*TVHqRm?a>c8cA!elNl;}E(V?ASqpnuzAQJR>h5e}cK8!DkrPSeS z-)CY2JC}Wm&cR%$^G<#js?7cd4TRn`*z*qF?-kn|?3%j0JbI>;uiBv>LiVVilucCh z%U1YUocF~Re{DF(<1J;+(oB;TO*%0bKy(`D*1YQMPa$@Ds?=*YrOQ=2(02{F zyUVds6H9_JN?lF&vhYe_ghGb7WFJhwlJW1j6S&onm7Sb)GTNUJ@l9=4P@&|FI*M zf*yo^f}G6L0^bp1$lXU)iua1_4MKOXO@%8rSoDp&SAQfarfTw^P+OhG55NrYnm>=Q zOdviw$QoFm0dT*siOM)`?{H6L@ZD9u&5A4}VIDTnhLK+cPykqs zs8lus3@X$|rTK$*``#ADe9;0b;9{Yth3>W5lfLrAw}j>!T+2v)Xwe1vW#;1Sd-7>) z8HQRKpGQw}7hkNU1&BUNG|S}JX3UZ<*eo%m5{! zQ8_T!gnGpYu2p99QSkd=2%)GWb=98F;!jE1@{Zbl8XqZfUXQ~ zblyX=tD|byB4p1G->&k~Md+6X8VIY)y+H>G&)$C3c*km~I$TLt8J}u^>-6L6XOt#u zziCP88GPl{XFV6ow5lQpDJ3<2#}%x>kh0MH(UbH8|Ftqs`ADVA%n|@8Xo4ZZfEsHb z6BuG&-0~Bk%V-wk+%Kvq!aJ1t>i5e*NxaY7Z&x}TXEe|YwC2{d#qZscRQtp!>A36A z+QXOX6TEc@+09N?p@h7+O}+D0HzR5ma{#q!MH|%QTK@_Y6tgC=xho%Zw$#vx^42Pk zMJknIeQtw>JTu)QT_90AM2}Hh#(@e3-);v?1G=JXZDrK*$USFx4`|{~!x64bPH3rY z%4P8sow-IGTLHRR_}Rdo&sqH=doy4#m=n#NT?0mTy8XRr>T28jNa>Lm;v1vAu+j+N zRhp5~)kz683KSMq^&eN=3&@A`nqp;g4SIhsyKKEX3;Z_&nK}x#uPIqk`i=8M*(x{x z7dNCqsn$vVJ9+#wMmrxAfk24_le_EzXEEGJJ04K}WolcmqA}+{+iKt+k>GI8Jd`f1 zWPlmeXe`K)ku~9w;i>A%_d^o)y@unedfSP>yPq&Hss6cg)(kSZd4LfOotIqPX zCQu>MUsRX?83mu3JSh$}W}p%?|2DqWbh^yT|5rySD~$1Ug5MpjWZve=Z8jhFGkW^X z@Er0lGSn=MSEjYrfqJ=0k|l$x`gn9-jn)CU8^$O-R2+~daBy@)xI0&})G>!I+h{C= zE@`-~fiD*jz}2kMoUhBAL{dS3P8fezzfQ6f1p^e2;?v{F+F72V=TI9m)ARskjG%z(Yr0z1K-_Lwq_70ok)cxK{PTUThR7V#Uw(e?nl-$x+2M;s=(E;*> zJ8&DJFrOYVLLYXH^-`DScN+7VPBP*RO@#4LWp*pyj^e`itL(%0#`Y2$=%Dvz+(vqu z*r#zJ8l^QoETBbi#Sohy0&{aS6~Xz#%=CfWEELRW6AUp7EX-`kG6(m9VCwMjIHd%& zN7k&>#wQjjJLbt@L_#W>4OmEyL+T6xnp?EqG!pkkoadCyOp6SkMy9_Fm;AChu#?wv z{q9Zhl^)|(?&`b4!n<;b*TVsMr_vHlo~3$94|s$! zJtlq8Y3x(fvjEs_;#dx}mX9XoxE?uF86lDpnGRV&{qllRM);$ck?CMAn~b%;BcDBTr#)}&2d!Lb)a zws`DsiWH0T3gM~HP~$V^f2PHU>)2?xUD=<->$^DJ@k0!1S6hdi6wBE*`UHH_Ipcj< zS|b#WVS0|(6L_AO50cPiVuw%p*)k9l1VhE9rYO-!0Mx>>z0|)Alg3K(a-IHEgGQy| z6v|_3wzlFuo@L2xol#$}^BJjeXzfBT#7X)MyIj|;m(7?{w=|aTMSAPieuVGKBKZy{ zy@^ywj^rm&=7Z8p!DSUkH`0f7Oue`(#at&ya9g-8}l1fw7|1 z!>Gt^_zD^A@36jSjeCZfp&OYD)&I9gKp@i1ugc7&K{9p&J@1FZ@L z1V1$lNZ;GoosOkbQE`q`U=*&9BGCnM`U>lywFwLh3t+w5Kixr0Yq(xo>Yk_gxF=5_ zGRs42zE6}MCFq?KUQmp0hL(cI>QL|mSRDM`QoBpSTSC^q7vN@+#)aEWc~A9@iME|M zP5ijxlS($%`z>0-&y%BQDaj7@X-vIF+WkGaXCCcX0%6E`bRr1*o!4Mj@1=>$P$nUn z-Gf{^lA>P@teoM@9C-)BEz0m)<11GUG4>^cm6#0s__IKe0A>_v6x~8iaDghKZ`>@i zEWK^lE@#R(8BNc%rVA(@?etcf7#qD2Ka4^wY@Ou`dcs)$gj#ae%A_{Fe%@EPjxZO8 zse;PiCVLM;q%{~fGSGlUAt<@nmq#*^nf;`kfJmB$L~c`y@Al~bFPNWM|HNyWlkXAy zj*{Y^?_MQQVvCOO^t?p&<9~kSCuGh3@{i)Z?_iJOC}a)L)j)Ny!RdH8Lmhpzv~&Js zXaT*-;-AawZuT4i-#)qcXBxJUsy_ACbw`;Q9W475`5ten(`*-Mw1yS_9+j$J+SJC$o6Xc1Si3Y_D!bcAdIQM?U9np zxPb8l{AHmLKGU*hH=@)yo^5Tlr@Od&eRWwXmPO)8bF_!XT$6HOaDY zjAe8$UBNLR)=6|+`cRj{p$?rIY1kSMtuC4h1IX-FZD49Xzsg-az?C8x=of*bgZtQ1P49rN>Nl1`-AHYiFJ2IVqMNS2Ut<5`N5gH|TK{RwUpxZ_Y}dv6~fa3Um}o z!E`bvQ4qHwNcaq6f2FaC{Er56}_`t=BN&{aVFcSc~kkRvyQx4lBRyDrF1 zw$vV2-%H4CtzuxA&&wb-@nM@@X*nGQ=Bjnv1Syv5^gI5;wpr9oN@>Ds$$B{_yree4irBMaAz1o+3 zIRNO{Q*V#dIS zKb1M8+9H``5|)AC&wuGT9a2TqkDphzPIdn1*b2N;|4&6RC+@MXEpP(=t{SZ)4US** z!pVoG<3q4FjmQV&?4TmGkaTtQHLE*VyR_+i+wFuC;>8;%gdL9(d!@!g+|jBP!M`?E zGdF3HtXgnJfd?<@e8!x_f3pa%mk&Pfo0d;aK0e^@D%H^5biIWyjOn@#0{yXQ=~mgu z$bRjj$eUosB@8mWeDmLl^e-hC~G}ofHbr2yI^Up3NrJ zHIOJq&?|N0&~~GN(LeD^Ui@l-vGGpOgFB+LT@gW;C}d-z0T^3@X5fV}DZ~h}v)u7O z=xolRetR0R59GG3o*@F8(chgxlovKqJW`as_c8pi4(hh@3)X-Kt~P){P#pqH{6C4R zMQ8hkb6N8DR`%k&kVT%P?z+_WXjsGLQpT1>2`^@7M^wI+TpIA|I|VM5t2$?;^j;X-A}&Yt(0GG)Jz>nA`Qg0Wv$&sA8QM4x(b%YcD|83SycJwRC=ksWa9R z-Le~ed?9HiBst^ z5G5fmXEIGnQ^V4m4hlDn4UgYI?#=>z6)bl~g)t}={l&RLyMcp*#8A4QlXCLjtUmij zDK5ClK@Ll9Met)%25GXMuos{i6g4oP=KH)Lsu7*BnHEmG#ApXv!!QM4k+U!U;S#Z? zZGPs#Y>cu-?}2RMbi(mk8{(Ux6+5VKxVJ*H|FMM_AxMO{71*iD_<;R0BiWjC8=4B& zW~Skp_Coje5iL@=m3eR|n9qgiOj|})cfI|MpW!q<7e0e9!d@JuBga`PE2qY=gcEL4( z=6+}HX7WcZ_h8_FI+{Mz4YZBk=CEnzq_xIT>!4 z8{P=teYJJ6oLRrgFOLPcK#WIDVZS#g*tXg>Z#{(A#5_4AvU4*!M{YTJ9}u-nKpjc= zzHoMtjb+l$Ph%4%)j&rH*J& z_B7KAJLNly6Ya*6&%Pdzhiq7;s>9*lsAI=U7N4%w!waAhXnh}Hka>w&SQPvO9+>P6 z(>W6+7$@C#OJ9lM6`o2OUI!lOylphS#GGxDQf111cl#9}-a0`xq!@`7tp}IZ?R?F% zzh!f(A+**s+A3YGNtm-#Th*qHqcsvu(@#2&lB*Iz{$*Tgv~G5FX9Dp z?8jWt{x^x*Q~^;A9{R%xQKa+$nBk#Dy|z7zA#(KbNvkE4%Y8wWsTG&}boGnW98K4f z#YY2R!4j$WvRspq!`nBnWY~d`O0L$P27|hLH&6HiFbwRJ6h42RDPxLV&d66pL&Cop zp=Zs7jMs8VCwS%z{1x2HcP?az^iJLqMPW4Sy*(yy!RG=48!@am36 z5k6Tn8eq11OT?Atg*s&(w}1Sdqhgqo zBBS`h+T?O(zlhaBdO@)(Hg387|5OMoc{%L?XX76uSB#NFGC7Q*m$v=HyXm#=EvA^H zw>vlC%BUX5E|Zh5vQ1Tns3 z+-HkOv7V-Gt9I~>!f$BfeGybj`li(>pHql2?bg_AMk(6pj+MQ#!f)bGcc_Z5t!q2K3 z7uh~tk%5c8y`4U3Jj%a4rD7Yy;tgeM@APyJxY>!<#X_GFZVlNiDQ&LYG|5lcTUptu z?gQ}xlBEk`wp$+o=MDRokgpn|IXR|6bc1(NfxI?S0XMH3Ehq-l!$T>c+CDMa{H-3G zL>*vZ__c_I9Ca>Xj=X=7`+W9cXXOm?i)bynRknZRZ5MO37@U)|Xz*F~GG9Qea@e zMF>_GBJi@&@Y-DJ+*It*UnXCcPo{Ev&4)Ve&=iP zFQW>S(`uQaa&>|@pby<;`Lrh_p%+x9l;K2OtC2{qO z?pE&B8fJ6lXYi7IDhxk2=Et%~<5mCbD3G}}?SNEJVx5bSa*E{><4^%dJ*9)@-8)m{Yf0@KTfchIiS0;gc>U2aTfq(ND*et zwy{^4R?^EykJI_?SHQ$?D!Ue0Po(&4ftDokK-xWMQPaqF^h~mp@gn}>b6vRC*5)5y zFLJ(cuxNB^s;3@JF@2@s0m!3`I3Qa`N)*sLh49Rgh6~Ytp$dyiTZOO<);Zh*xQ14q?Qeu8Ae`O~uuHG<*o+;e4)UiZ^hL+xc==z7wv3oAxmn6jku&fU zV#p3bhCHC{@2xPRJvk1!HRY5$94vVn{N*=e^opqkxSY5;-z~`)wz|Gcfkm3tKiQDQ z_c&R#wwf-$Uq!8xL2|jnGiW)QQlrMl-`p(Co zlLrKh))JgWSYlmwN;WJnN!$O_uL=1BTQB0mD_vsQ2$E}JMYwnU8E)?h%;=7ItGCiOE4S!Y1aU3qN^|N9$4L4Vq zd1tuZcm75YvuES2n$a1RV^0lJSx1!I4AwLh6LyU%^s8&EtnDRIeflu{Umc$60SR#u z&O-&Cc7Yoq_KE*B?evrzv-D7ZHzh$r*KE+d6Efuq`IfSgLp*tDjjW#^BL**IM>7=b z`MTwXGQ^3ylK(ZENa!&Pv4Js(1ZoxT#1RGWq@%nz@D%eBn^e(D|CjAjbyDB_){I(m_ zM*1(3e`w|o8cm^Jjh55jLhVuo@ENEHoeq!?&yD7aZvx}4A5vj=7DI=C5;pIDW$?jt z1ej5DP15=+wbRSJq+x6j>K1Za*MPys!;A(kkHW zH``H+=w2z@*iw`R%ki;^BYa{^?rdoJg$~;|lPH=;1uxa~?~wvo0P3xB=E7m))!f&b zB&vFn{DfJ7ia{))j{1;1cu^WNHEtY@{9BJ4-*b+0QQ87?q>;3g)jT%-iA8^S0zO=b z47{O_Bg}{a%rNYyp?<>FZo7|PW}5{(J4>Dy8U4U7K3Mh?X3_7|XF*lN4u}K#jvj>@ z*zM@m-JhgUhMl+A8_|SFeV*j*PfK=Aj806FSg}`#9O=S$>hw)G=k>GWLRGYuwkKSk znTEz~ccI?R*qrqIdCS$*nUFrhW+wNHn0x9wgOK<8aQH?T&4kSD><2GXYi=5mnaVAa z*-OWxE{reRQd!yO`Pzxq^4@LXI^adALN_1imW0X4662RJhQEYBJTc$7gj0z4srW)9;+G zT)Zn)Q^Xf+343g~j=jebLQV%Ck>zs@1n)`r7fS@$O?+{%tl4}fIic8@L4u77(Cap@ zznU>RQZzq{wkSEFZT?o{|!&%K+8vt@!{mbuYfw#}!c~2K$3JM=urHHi;kcSj6FTe^ zBq$(v9N30!@FsPGF6EX>c(p>b;lbnDfag0x_ugVO2XKmx_J9!gJ}Yz_Z)(u-e_nuR z+DGsd6cu=+Z~bsjC7a~o zhn1qZL1+4s=W55;8`X4xE#uVbaK@v@%TNO2qucA>r)g0mA`Zqzq4M`-J>l>&Zs*W2N!cXpVEg2LO5pT~@+Xvz6ha}-=% zjctxAsUWu1pVqdKo&X`$GbpPmJzM(JstY0(ZnnaMXIF5q*6I*yCx!t@GhCMQ#t2!p z0-7gK%&evSkMNJ;p)92%-h(6cm~ny7AW|1?!w883)p8^hwcXBDx&Kwq#>q?{3sUy8 zEzY94moR+KDKTdX3R{7@?$Snh(crE%KXcPYnn$2lO?2uCkan{*&Ql>uAO0vx8Avd( z+ZR_RikP8=z88mL{|pVYo`{u!VXVi^ZK8J>Ip6v;T(Z9I9O9ugXW_a=HR@ACx5!}m zE|5qdeA{kgk8{r1rTvu=!6U?BBFPYhXcc)4(q&xKUQpv;KoJ}p5ta+y^N_t%0m%Km z2W6-S=Ad!TiM)?Uc~~!sT(@UYbT951HO@~1$i#k+_%3w=dktJ0MAyEi>qccBGZm4x^|6E_|}(Po8)+F z5k!nn=_hDn83D(ic1a-#|NZ;@*Qp-)7okt9U`I*d+IJ&Zsv@D`(5_DV9(g+i`{-jJ z!TL>uIrI_*Za?~_bY>!Qa~Yoi6RzhKQDC8pUVPF4*3{~ctyU3CUV<_sjq$c*3>jGy z57B2)70dc^b~v;JC2BK?Wmw*5m>27c<{b=o`Mw^e^u?aHTrAeP4?X^ZGycfB$?B--?EJhUky?@O8MOid6SDv*s6 z$nge?Q6z$>Gbz0(w}SLB>JU6__|JW5VqVkys5`{TXh{@i>t4D!1#u=(W|u7VD&Fv0 zlG)G;zD~Dz<J)+1Zu_Vqc^**BW)>V$6qBp(Zg*5xZL6j*m=(`O$V}odVFL$;K0iFbjv#X|Cr@?_%~~)r$lIhU*Wxc) zwh3E1I3nYkP?jfG34|hX^9uNcW@nLm%GBXFzJ(7h-BT_K1500)#*}*FhcVlb zyI_8qiMFj;G5J_z)!{jJkk3!UPu>rToPYN?xbTQy^VOiRN!MS?Owt<^rQ)RQW7Es? zraVD$wTs*#W!cW6b!sZa*qL0s0#5n#P8GMHI#u3zYc7nh00%jWkjM!A55%TQ#f#Fo zWJ)?XZ+3tb$09DfJ>Cy}x|Ej69^E#RJWId)WRt#H@aXj8#iOb+#(ny;GE|CK2>(w) z`c|2h0LB9cO4+B@0Um(&Q+Qx)-v-ynzH{76UvN913k)_wxd0+SLvo&&#J#-2FQ4mK z!{}gJrmy4+fbkWOsCPWVSo~YkFyU}l`-Y!ih8!Aj;KqYy>Nx#d9o~u$Azh+ZS=@A( zZdf?9zs@DgSmjIS%oTB_-6Yx?w`LT*@Yb}bEN-?g)o>>~pZ`^$4Bdwe|MAt6QNu*E z|5|?!=3o=rm_L4Hf`p`2zp4Qb!H6XByAzuV1b>50I~2xc(I{T80MsHuU$O)}Gk0oH zM?A-BnJ#9)|0n?F%ncQ_Cj?8>$!=!e~khkQI|p zd|a}Hmqq+RRV~d=%*o@jp~dJ*VtM^h1s^Ad+86iZGwBwQPQt^*8u2V|Vyr1*nFqZ` z&B!O%r?|<7FsTTcOWV@SUx?B!FWV)S1+&vij&^$j!N8GodljUPxKC4N0A4f0gIP1i zRi=}waCn3*h9+qTpy0YMk=w0D2wIC+QJ82nuDal$lQ}#qa!fD8vT=r9c4X~zYc;P) z8Jp{FYSq57`QOr#wJW9>Uee5#&it$&)eY^wEu;UxWL!GC4E;|D*`oA}qu3ei0{MLK zni*ZncRvTiXfB!+=ddPSv3D3~@`0f$FH(#KH;ux0!f6}C>kG#+l3NX=iHX#aNgm{q z8HE!>%H&7}qO@hwuh6FRcVT8uOV3G@FO*UXOK{SuIBB$D4}hrbh41IJa%cjTFa2jPaaFftERH zhtHB*rDKKy4WH~B0=_)axL2e6qAe~)#8w?Yp#ap7c^;`CkChLiJGi9gnupd8Z$I#9 z@WytB)o|{r5mc(ts0K`y0CHs3D10?kr$waXmPHEEHZBWbPp33EjbMk&pqq!rhBp%3 zvKZ6@*VIJcda<9+g9_#iq<`mMJ=-0H0)je7H70@m(5Q}FMDsCq#^;eGx&^y3$TIY@ z6|}OyM7iN4UnHU7PrR|h@N$0U%0z1^Zon*nuf)nwgb+=c{Ec`~~ z4I|sQMGUfFcmi=~VllDYyy73SwaV-6MNSyRTB$9C9bBf z^hY2>O_#A&Q?rH#mW%84Wtx*TqtgUOm1q$raNkcDf*bte(lS)Tx&O_OI!Qn(=z4cx z>#}aKU!MJ(2^LCGTd|_U0OvaEKR>K0pl{(<2A4I?UMz4pIebvRcB1(~Oz0`@=P(42H6RvT^Jj z*Z(?a;gOvzu>wySHwC4xv<4|#>2pyXO(+oIQjDVc{LQ3F6HVhKoVb zH-W!s+fL6t%s;~2LctXJaz)qNK45b4EyH=J!N!wk6F5^IU^(|+2*23@@Zb8Nv!i)Ihi z&b7L>KFMc48pc+3##tKQo9^?oNh2n7KY)N!XApD+@a57EOoUpK*OgnO@N-BD`OkHO z=VI+~nA9SBTa|M9-?@!J(tkD7U;izS3UBVFC^X!M>Vysp;56w1G5Vg+ZC=%|Gq;gF z_7=KHGw&R+G?*MW`(P_LXDDF3^~XPorYAtQ(2g-uhWzoc9l)FSoj-3$tzr@0lDEOQU{QUWZh5;zYpgoN z2J`!FL;@s4^c#b?tD)Hb^e;BH0N~MgClZp@K^zinYcq(5Q6z2EAE01^WG0<&jGLC^ zi^^e1q-VB~R2_DQ+fAE?2U0Im9PllW(c6>!G@4Cg)O%1TvSe(SBPCKHu&gg&a@fd* zDF-JBmZ4Pkklpqi!^*D{N7o_h^FR}O20|oW`e#~6SQYv*df~o#iZyh}f@DTDu_Q>Q ztSU%hFySV{<={Orm9=t-%AAZJxF41Nxt@sF9T9^dt{`>=)ra6LFZrUXrK@fI#i zNmG&|j8AK#O;W!gX9HO{thRiFAx?;#N?pQZyd}MG_;c0cZZysze|CPL0;76QB$d4! zHbLX&V15%Ya9{<@->_nK9LeH8e4EFI84X+gkVj_A%!PgTeXYZW zHDl(jCQKPA1o-Qng7GnPd$w^9C#H?S!CSboD=&PFF3cbv|82fkaulbnVjzBBl z+;{%TkRvfB_jG(-S~Ncq)sftS=tmMS0?eX~!lZACl`-~*W1e1r zz>Gz`3{D#9ln8pGF9pBf1W!>D2!B3T!9UVB6eQAnv zZm&wMQIEw67(2_o04U$5KqGsr~u__mvaB zfTL6}^Zx z&uX#72=-~-ax5=gP!~pOY~0BLmiteRhpIkm=LMsBJmEW6C^ZJ_4EMR<1Cq zf9ZjmJ=vYqQ*vAB@;Uzk6fM2B-GlO99GWSnI!E8A#Q@C0Xu|RDA_L&{OpD_!9R68I zq;xEDsI{g+n83o|yDA$dAYuLwSeqj0&h!v2OZF-?={vXFP3nO_bos>F(nZ6SX^Ay# zI8k{m$z!#LDh2TUb#lOfKgVTnK0qmZO&sAu)4|FTbXuU{D2!5bJCJ7o17-ssk*dZd zQ1|l=F8v&q46&X1x^*U2Xw7PKL!9CO}4Yj z&GCn76bye>s(7$?Mc~Q$QE5GD?neG(h9$eQ!A&7&bh=4+`gtw`aYrh31Y!j!glr0! zO(L>$J16r!dKntOV(#etMy(Xz1b$ISE;B4=piIQdf1d(5AmNkKO}zfZ$;OPZ$g+7t zq;3<|)vsR&D~BxbxQCT}0RjmCWg@b{Nm*c>I6*d8RVg+CgF?+J$)%19a|x0{Dg#Qx zB%`~binjZg-&D32r)6EX!OSJ8?}p>Q?%d1v#FsSxkerk5_il^-=2p{H=4a`GVPT&x z+O*pjNaLd7dfw2Jz6``oQFG-S!5Kfh7c{gMo4sMgw7+;74VL{VpZ)0{dYSb7AAZG9 zRw4O|mTm4dsb^~n;Bi6vV8v>*zQYXTdWtavOzpTGs4vj&(o6TX=qxHjQO&_v~+#~A>kPs{g|(g|}N zY;YZ_O0Yv}xEaKX{o?M1Mqg5>i<0cNXknpgO}WK2sE%@q|b977r`-F>%Q^)0@Z;qOt9?;!Mi;v!@-Gcu19t;A|*O= zcn1BipYEOLGz&QxC>ZJ{L4s=Jl~dudpF1N9SW53{^PhMVU~;h*5_0LERRey>GZd_O zt;=)VDVdJyzlxk{Q!<-s9{Q_v7k|ez>x6Xo8x8|r#AngR18O2U81bge^cZbM@gu|d#O#}yaSVv23-(eT^ z{6PL@7aiYK#bGFvm7QYvo7vZ( zLbhE!Yv{LJeE*Og9E6y=0bmRM>kb8@b-T^3)<^Z|@h(u(oXm)TkIz*y3%n){5^@A? zA6cc>aSP8xnf1Z+7xs`!t^TJ!op=M2DmiEF$2n=i2?*tc20TrndUKRKj8p3b%-A50 zi`HO9eIv$>2;uQS(p!wj_?!L73e|LQ4(YTBjZwf~G*D(eGXs8y3uEwWoGOF>Sz8;# zL#`==faRSuB9L3bX=9Jculn;i2mXp=fH(OWr$e^mLw(;IkRFNqLC7@a-22StOQLDY z4dxZ{K-`{U*r+<~X0%{+(?7UiS9=70(?{{dp~$Z<-;&ASVT2}uaI$?`&r>k4G^wBa z-;HR~H@q8umpq7I_?sl6BO&PCMkwmG0rn11qSQ7nw==M=+Ey+xrb0FI_|xsRb@R!% zh!>&y&QVnYcU2WkAq?DZeW@s);_5q?w6Sa~x9Px1$8*RAruYZ@4JO5MTGf=Fr7z zzH5^pt%wkc1NA`>R_8FBWzo=M$l7~3GR@@>=9d>psg#SKTkmE6w}U}WF1}5N@6a9G zjm(F^L*X>Zv^v{6D8Bv)g56(f0!4^yF($#~xXs>{kz1~i+fYwyYly0wFqdo7;k(hV zigF<(^`KT$3l{Oo=XSy~4|q|F*8DS^B|~~6DiyQcANanY`>eig z$?s9ufx9pXoAL>@1|wX1lb3)G+F9R$L6aid{uJkT?>$f9l9Fab`UfJl{)G=Dd(0RS zjDZsB()32z@;BP*b;kuLlJU#EAZf;Sre7G0Vc2mPEH7wz8fOhjZqzIgErUx}J#Z*- zOKIeL-@%(f4*~j9dPkg*=`AOvij+6f8jc?lL@=!wYE8nm_JcH*$$EcaIK8a-Q3dLHie@&o`Z>CULXj$*bE6M9cW$DLFo|0vlaL*i zhbr|9rmu2)%O;bCEUjMS7-&Iq$!C`(RD4q|4fg0w!=H_(WtxN8Z?*=Z?wn; zqeqD!6_7bgwB}bjd(*A}T0o`0iJpclYPKR6LS!!e#U-?-k8ZZ+i^TPc z&GY@?JyV~cI0Myu7u-%ydE-|wO6Ticpt3ph{!c#|$w3XGmk5uPo^bFV0KSmG%|UT0 zIXyIS@Wz{JbBVfL8%YpiHM2u^Z1ghr)Vwy{nc#8Dx@SLqdZ#yEP&M~FLyaHNLn>iP zG``p-3>06T3WiMB?W~93!G&)Y3xho-Mbr|Rx697;YL}?A&wMlp!rIIo+?*z~Z1c}j z#$@^e=IHN>j7LM%bhQ*{tM>vio|npT0s+}fA2lhwVw+*S8M5%qGyt|-5d2ibtPnS@ z_0j0Odu*2$);9^#gw(d*7nr#Ay@9V^bus}fez&0W6gHe24VxsTbxih5<&Obn+zVy< z0mK5k38gPV>v$Y~N3h1FdU3*_N45>v>Wi!Z<$_SR^@fsY{=bTo zz&0>k`txEuNufi5^RL0P~-hqa%`-Nd1kB zWCm*iFI~L|J)klhtPS;&x=>$ivutndLn+$TD5wv;s?g7i%SfCFlsZZI0hZe2b8w4< z!oZD(PCq&XUE{CZnRvNdUz~T7rlPeVBdWGjPnZVljSSqH3%dy0Su;-0Q+waIC3GIb zaBe(6o$uXpWK+$nLi|tfeQ^MSB>oO$S1@PcaE zIt3w_pr!~4uwD-Ih&lhXvbye00RZOU!!vez^K#Ws7753%&>RzJmee97LoB`p#mRzz zjCf=X%V4Iah{gna)Rm_%&Y|WJ&hhrTIzH}G=ls1wG+zxD*RiK!-p=zeL}`_1|15o< z6LLjGNIEr~?HH4=3mXq)?fhu_V&vs5MzR>W$iONsK&&;N*wJC|YWuXHOM9W6= zzJrzwzmSr10G#)`$zEyIQtPc>XoboWI!|DBcBInH&=7ji61#J%!vA7ftYJn6L$w&w z)<3_IgZhI^;1RJz$%iAj;_;VQzPjF0*m6vy73$x9+BXZNqFiYALmC@Im#J#B`P7;7 zGZTi8_-TYz)q@3l;Eny$>z(%pBc=2dtq=|^1~iE>s;Q023VXV&V?uH;#`vep3rolC z8;n$_MW!DTI#d_0MpV>p9xD*vG^Wumd8g}a z8T70{qfnkruu%{*IA4?DpG06Gy%T;jF~Q%!v&l!CZsRB_K=-Ahhf9{SE}jPb0-jk^ zkmMU7G|f3t=&v2ktjSZ?LsdHlhY!f2tDNp&yCSi5OeUKt;#JUV5mr3Lcq0vDCMRX` zWT<)UZv{jwW1<+V#CBSUKd1f-4`sPYp$wuZ> zX3TdOXQA;J%6Qek1ada7Hj9{<21E7IOCiOp!Gyv@&8z#yHNzWQbIIb}yEuP7=cko;t~^y2tZ8!y zNQ(-0)gT)~%5qq^#3t;~4X-U9vye>cJ$CHwUx?p+hlQV0jD>5_Tk4RPfIrRCBl0NH z%c|592~P$P9_?8GC=N`T4G^w90}=PgU4woOOQT}r8enyCnW8GeSbAJV6TY2D(*Q*o z4u+&o$H>AvcxbJ{-X*N0k69+tyL&9Il{ z11olU@xC;NflT(f90>{d6DB3;h<$AuJWd%n3-b8}lw{OldpsA(6L!k7@!37(tP;-- zc{fIPTtUa3e6@5ge{Qvbvw_`AQ9hY}FH&k8oXO44n{Y;Vbf6R20i4q_1#uqEKsb4+ zU`)OJ`ElpCL~Y0k>3W zgk|*9Jz~+XiktIXh**DcWX;ciQaCHN z@-oJ8bM2@p0pGFfXiKI0&P20<*Y$7?7V1rMun)9i~^|yRMGywg|XYG*2 zEJnR!Kp=#Su5Czd7}r~00<9kNqwR?PxRGi=?7f&($G9gS6e(S z&UXvW`6{=$5GqOuLVlM-gUpb9mh!{W?@I$x9SY za**QI&jh{VcNLh8*%|^yO%Wtgp$5;k27@cZI$HjX)gm0V|GSdcA)w78P&<^zs+fK; zv@2yIlX@d&R}mKIz=J}}{7bx1i7MK#q6>lO55(8+P}B+;72l%OeI z&*^{t#3HQP_Nva~;EMxU&_pN)P$A^&Z$FQZna8mhRMa=t-Q&KvV}T+rA=9L2)1UI8 zF==G_7D_sy%$7nW`c3|o!Liz!M<3guU$){=-HDP<2$6_yc53RYvIM;nC(SXa4@HcB zBoA=4IZXJ?clRx>;X~z@YZ)*Ni%QFjL#u2gI9a#-F z8vK>wv(FlZ>{w@4F89gfNxxq6V`n^pn$G3&96R`}P}Kn6O3I^k7}Y6I70#B~w=tW~ zn8}6s`5=FM;5Kvu##b;nyf>_|P6U%FPY9DqO;a~np5y=S$|-y1?uBA#8V8->6pT~6 zDHBch)n00xN_AcISjSHyZ(+DH1hF(8f5R${TB39vSMSJi&d*|uCdc#R=8O0$4eaNq ziBQ!Kb)lZxtIb4)(aEZ}KGWY8L=P;rm7ZAPYN?0e<64Nb9Fh!6vcQ;q*V>OZkjXmg z>aE-6tXq;fzNbTmc!RaOH2zFhU2JDx8hJg0BdLPI>h3kHiHZS{LUu<-KM9zl!B`lc zt^tTec)@O+m-iW~$6LDJM3g>r70xoG=If;LwZp64Z+ls@$@bMz3ZTt z_KI`HO@N>(E(wHPKfy>O`cSbgdmiy?(si5|w*Y@i;!1|bQ%B?Ylx3bm3B7caYX(ix z@A&RzV@V5A@DY$-?KOkaa`bW0E9ZyQ)s4HWithFFCL1@hO3|a3)d96_Z8Bo5I&E9N z7>fqbafaaLS7@zmo|N94N0gy|ha=bY)MVV+2(zBw;8aH$wj{pAJ?i%3B*S4}0d8AO zwMiwWIM5%G6m(MgIxYM2E|oqwDWDYH5h0M@pC3I=>nuvaN#Uo>%iDXukpJWnZoE!H z)6j3*z)1eDw0)%aLnLndv{0J)n=_O1V*?GRE*|*_ZfS+$G!G$4_5B#1Nq&5YudqWG z3!sDMTb3UHr_>gO@P%!8w(4*V2*mi`B+|9}T#`bk+i|j#1}S$5hwqyAt@vw@J`5Bk zp5X?QU{x5Xng@>s!9472wibbQ;RyxK=QG1wgxb~mbE+gp_sEC%h@B6r?(A_wV^7NZ z_YM7Jt1V;{oE|sQe&`Bueu2x#aK_b*-Y)d0_i=RQl$fm)hqHbHSD82GEi8KWl;xvK zfculc4Li`{qcTQGcX+@Od#K5@ZSV~`?B^#oZ^qB5!?DkYN$Xgn=; zy($&A&wnmmXkDiOUROCgN|a+jq5NO=Z%;trQNb3WzzPy;bc7vWgad;HI@}rhf>2+u z^z*ostvL`%JVT9Bu&{gXRlRUo1j7?lmlaLd0nB4hGr2sjCg5Z=bJ+@iOrArgRsMG? zjl%?+#}xt+YUR%kS4cnMasU%(R5QB#C?zl9rll?0XEqZ_V^7lb@Yb+7|3&ecZ|_Cq z8v9+})03k;(>%iwFj94LNq6_e%%pIKnu@X!CFbvQ&zi)Xw+%D?F+cZXnGnFur~6Jv z85JY@XB%i8?zZOO9j6f^;l>Wrz%LC)rwD2TR1@iWC*HkyRWNOTk}vPU1wyxF4mbPL zG7EuD+ACOAc@~fle)%6ZaafEZM4^4{)np`(#w|e`0dbs*r{QF;f9z+bWbuatohl-G z0_|3)*E1iveo^Mpeq1~;D1=+7|KshMPD)2*IwBUpo@MAAm|GSI_mRo1n=omXNn;0NTnfJnrCULEhmol}>@`Gm>#D zy%cgF5bbWYp@mVTfA?+?1>$Tno;&qQ^i=-PbPH}&s@4NMWbW>0TufoXh$O2 z|B|lIH$%-U{to-i8tZ`b37vyXm4mBS+-^*)cTJc8lXlo>1hN0tmQdyK5@Jd@3>(R( zo_!{Cg+#<$7@uynv$vFuIXH#$Z^Fb$zy1PW?uNpjXarVn4q7nk-IX_ejIe&v@@7%Y z?JQK9XVFg=Tu(4T@Rb}LwU3PmkQ+MU11iQQO=at}yc$TD{-E|3&TJSeyTd_DXeq^ux$IULlWAO2+)e6qaT#8t(HzW*hgwco-t&7tcy@d z6d&P5hM|+Oy}u+tmuTqC_eML&_ijoSHq_C|Jzo&}x}H!Ax- z^L75=g9a>(hBcNI)097S9QH()TYxGVF>8X@4%%D?&yhs`dpGvJlI!YRl%(0YdTSmK2J&bOD3)2~Hjsv)dDY zXy0dzc8j%92_e1MA*?2ko4Uqdd6E_W2#fRRz>{zYg=7uuu-o`XpzNH zX0All!{1^yV}v10lec5ED7ibS1s{gcodlZm`tNNwOjAQb%)zr_$=>aKe6w-Vwq}7E zXGdOU2T`~s5~Li^3Naj=wh?zOLUC3m6s*pyhH3FxmcyYs=mmmds|A4{@0%_-NR!PE+Mp2-v4!_%Q!*?r}qzSz)~-DsD^{h*cbQhspJ3ibX)x z&_$7YC)Bx#Z|eGh+-=GVM*F)*_S?v8U`@QlXju1}`E5@Z<1XBt_zS5IJi|tHkGr5u zimIx|Amg2Z3E=~4M@eMyUGwjbG*XM@!Q#>B9UQ0jQB_AGuNZ<@eKnim z2l>v>StFsJi08}%{OiAA`3M0E0f(3;V&4OvF>2lr9%&TtzHBV}1M~-Kd;wZ&R{ZBG z$CS(w9+lBjD)p($!YBl(`Va1Rj2swZ+?qxd@R=&gL zP_43GPS}*UgU+F9Ak^1kbh~vbMM!@W76Spo5Awh?cQyQcXWkOKLPelE7Wgz%qGgrG z@ErhYZ-}FVRB9!Pq1FQ4ys}b<3AwJAplmKblRlf61@PFMq58XPQ}Wybzn(I?tt{0f zLtA)Q{>b2MH}!j%KGQ>bo^)IDT8MfE=J!LZ(j8Ov_r>a)Wyl@dR@>S?!-Q!WUMmz_ zq;0*tf)A+IqcB$|p&mi4OfH0yTYk}4P?6)( zS)zS;su*A#?vX3yO(T_gq7ffbYlzS%^NBK??I?b>Y$Nz@Xw^V=ss*3QI!I_eOz}ie zY3Gx>HL^7Mg|{721%K^7 z%cNi%`6@z|+}R%HZcH%cqHb;PdW_iNgR==9{S7Y)7|hml&N{G9M3jK@18lP5Fa(n0 z2ZvE{j(hLQ&Rc83wQCo6OmYn&h{n_ZTDZHlyEHxYc7LVv;Br=ug@QKtc#=-nRSg(30Q==XgH&Fpdj@I?p!4yN=5Mw(V zZJ}Wn#SBcuCH>1)HGo|-^n>)f`|+Z5tKxLKDAZ1`kri6sV@+m|ThUMrLn%bRM(D=J zTlJj0ThXnA7}wZwm(6Z}y~u0`fdn?RkDyej0v_d^!0(d|!h)`T`&cvfKack_kjtkU zeBkd@hv-l~4AP~y!4W-q+h|TK@&l$CEyRvFBgpzh@S&`@ z56nfJb~ z!RV@W{<8r&f)l)Jm}k_xpY9*~{Zf|q=J2<_T_acGv(o@KtMyWutW$F9cH+=YFy5rZ zF)4^Pv}S@w6pMdsp=WH!kH37rXS)+%Puq0)dw2bE;uZ2B(gu0;ZNYbACs^Chq36km z9S)hQssEx2UGGE}Eny8UB;*skObdUkbR|P)?2o|zMWM2=_t$#Eg2c`brJhzc-o8XAKpq=a**kA(%ZpbzJ-BX!%fVHJ4JO<(hHI^N z6VW=Z`XyBQp%z7GTk@5)rw4xP1SHS@U3$nd$l=|+U)@wCEQ*?&-g8v449Bsc0_Q-1 zHrP5mVTgr|NZd$y>f!$#nVz>?)nC)1zNy_K`Ib|K4zeb{^@O(mZwy zF5iM&s4n3k3yjw1B5NWBQC-DaTD}ILKKLS!YZoCb!i=`luU!YTV4?m+TEQVgi3KWR z5L{HDe8>rIsSAxZ;mbFiJL$zAWzlXqQaF|D?+!5`Kbmpl_Bd5-6MV@FVC6`bniOl8BNK1~*32eJY} zLW#fMghBPPJW4|VdT1+UAv3~0Vt=u%>qtD`FBi)fUW-h#B5Z_NaMck8kR_}2vZ`94 z6y5wdm_T^rKB48)VYg-3`KI;510^A+yaAl{r7Ehf-gkj9GA7I+!a57;oeHGsP7C|v*J=14(C82mw;@Zt$pmgvw8)0+4|p5!yL& zrv@VrwlNUFaWxoW(y-vUh5GwlBN^P_&t}IKCXmeIwaBW8#f^4N{03=Cwcndj=UuZo zz0~KLuBSDy{%qpGRe#$lonwWdG+0^$d~|}d1Go|$FLHlW2XG2IQKZwAfP6R7G{thH;~v^H+Sw`I%!LkAx|3$D5y$vV5;^B3 zWof&j z*``Nv48tf7@d_Mq1QZ^ma2aXdxPfO%#>CQw#Z%N2!H`-Y;nYCf4m^#}pNCN=Q+UO; znShuAKrSIA&!-TuIWCdQ9-|Y;@qgkC`s(;DO^~4Kx>_)(>tq8!x6P^6fbMHuE*e5k z`WzH=vL<<}IUbAp{<4him@u zAPVtmXzYxJj8jV5&{oNG(ZTSEF?LoqEb$tiynfYuEe#9BpI@LO>45T_@TM;~iC! z9&tNM*7{0^r5;$e8$@BPCRh@AozglCJe_RVbk02mur`cKKg}v9BOfR%#EQ1i$iWZz zPaDUD#Lhq*ee@e8o%6FLv3mNk*V6{F$hy*Aa(BlGj%QJ-Fq_=A_$H0xa%-OT=CtB5 z0WDnD>N}=&rScTJ3QUUVz}!zLcr~{~Aq2;!^q1MFF|Cii3&h&-_=AzPm5})|TP6Ob zKD?nVl8ZaeN_&T|JKBG-wx!4Rfv?!jciMsB8H?s$XM^i#aUAV#c5!^Ne3wJsyk)RT z_qWl3%Z%0%o4|LWPvP>l%`;s>|QISM-=RZsC7f@Z1H;wHJ>{{}n zY+^=jbmet{KZkI8)Sn(86GljM<%aBnrF^|4PZ}8?C}?Fn?vSBktr;K>l@|0m#}pkl zi;e#Qhd}8H`EFrTq_#!&8|xmgXFW<6-2Gk0xy=g(kvt>76ye7Hp>`}Tv@^C!S3=-$jcYIE!4Yjai zT!eBYC?;`(CZnO&MowZ%2ih3wFL#eRVJ`JF;cwL#5ian%*sV?Vh6`AQ#Q5>_EwmAC z!SmD1*qyv}i*wd`Qqsf*iVr+xOyrfdI>^=T!eqieXm0H^itw7wxRaw zO;L4q>)2{8Ksaf>67=9_I%rvG&qsD<_ulHs7se`UVcXsq(Q$Uc#Rs!Gw$3?|JJQOi z%bw1DL>wY?`pabw^W{PO#R3ac68@g(;(Nf$_S1tp3p&_e9tMF#F6rtvqMH5^PlW1E zsHckLxHn%7L#^1k3*;D+MW#{c`t}8(gW=Dj$VyajAHha)5_>z6ACKD5IYGChRnPI^ z%4xLCWzId%HQcR{HUj^V_2jVdGa0|s2^iB9Es-$P1A-$e$$_$*JZIVkj>j!8*!Yrg zV|JWmDb}ittI7_o0#njtFJgrNOGU>hgg`)1p}mdChD=uqEtQvfDo9bj1)yS(*3ajK z2BT3La$x8Ys8m|Q7K}z=JN2$D%klR$-p*jD$*w`g- zccp@yL|6`3gwerZ*sh2;&{-doC+3kqAs`1#7T8L6$lDvGN-G-mGhXFQ#xm%m;gltZ zMg8B(c*{ZXNw(vu#a3((>>rM#bEh~vfXQju^R%^;rK{^V9GBb(gKyXEq zfTnsIp!z!~P01~WL!fdDubj1Sk@QWg*XykTM5foR$QYT249RJfN3F##gmN7jxk*UY2Lx9<=8GNa?8()Shem+rGZ(II7~b*#RB4K zD@81a5?f>K1!<}yc=S%{#BC-A)MXAP7Ry2xWPyYXw-j7GgSfI9T~z?T@8zanuz~>> zLo$4T;JhKnfj--DC}cB!hF1w@)!$Cgx(C6-!$S_?s&LZ@ZBLD zUfamoCO2!(*(3$JnN_jU2QclBL7mL(-*j6|F~ZyFg zwz#jm%b(6go5+J%@5rZU3lFi#Pufu8g~z-?%{j#_RVTSS2-y?&UMp-ZdSZsJ!F*rp+ARr(hW??WeARr(h zGB`Fc%E?weUEzr|P|o@1TGTDG`)R>9FG1b2+?%FDFXv+zw)TwR9?&hSLJ$`=EhPtqM?Wg0EB#SPz z9eH+vl!eFEad=0(s(#0qs#lU7#Fho&LhW{zs(98QwtFkLyWQQw8-AGc-`?0a z(8A>wos3a;$ixYc5QAJi1*MJ>ceyq8-E8-2t2>4UqAgRdH=(aG^(B9LQDcdXP? z1b}#OhMINrhFjxYpaKZUaq#2d)bW! zF~~hVIqY#HCuYk`ZK*PKuY~N4*cXFyPoe#)kKhT3Dd4A5AgDZ*4~cUp1u$;y=hb)} zb!RkzD|kLSag5M}<8Z?4mGo(}AQ{D(kIKRv5tn;vS~W_;Z`i5wYztT%Xc=vs{sGQI z`sp5%^d;eS6tN;8Q>WvQT2^g9CX$jg?oDmt%Q8Ot107gBt2x!%`PRS)Vl(l64> zL8Cuk;zcjXIpk*HBll5A=VbP_$Ao@v`_^{>Zprf^hFpDf)SE|sjJLvoz*Z(>$?!nv z%CM&biD(yg2Da8N{gCu^Q9N@h5xi{1%|0t6U&W^Tb4xdIw%YU2eJ5Jdbx=$v0<=<` zpYH?%z8ff=;R}i>5=5n_ClVT$!`ytNk>OG;U-S0Doo7qSfc1w~E*1b@5wJdbFVRRZ zXHk=VKeax_y{7M-u%ZZO zDyg)YetV*#ITGhVrg6S~4o~k?$ptaw&G)piT&5X#--}_fmqEVV+-!prr>CAJ?;JM+ z&GgJCkcehZ4_DZl?8JY4B1FF8gx-da1OHy`ZDpif(n=_Qb0*V20qyB3+#%9MXcT@R zW0`i2OewM-Q~lf~S)=6Dz0S5Dz_o%uZJ)k=%Ctv}O}HND1-Jt=tX_9CT8}qmH<<+? z-0RUiMp6}^sqG#l*yDyr9*Th}rZK0KB?sNKZJ^5e%Du4J*r1r}>CT`_X;gDgfr?us zBsd2BP|Kb|JRwej-Z8d@Wx8g`L`;yY3q$YD*z@vOUIHXM%_S@DK3A|>))_nL3Qr`O z*1Y382%*^!)+nfj-xMKzk3G^->McW-%;l)Ai+`g`@w zTY|cr^D|i2j~$EmCTLA3(QHmTRn7>j@CDlSnXTmr;=Y2CWz4=hL5LyH?AFSAQm^ta z&Ri1$W$&>tYjT1)KJWIz~;3I(EqD&Dym z%@)rk6nhrOwZR;PMSc#+(uMtr)WkF5e%{P(VDz8aA!CGYI4m8g$f|qJy21b3O{@6% z8;<%N5VZRqHhxnP7&zlI;*`fx^zQzL}Cj#iC3j?ujh91W0A2zXSkOrKKiN!`zJ|)=qjvWzhai! zWx;NqJEp{xRvlLvV11tZR0PJv_)CG!)mDlqthOS?Ivxt9gq2;(GG#T zD!On6nO^%{mYiBw7@vqNEfaXTeWT>_((5ReZb=#CW-hb(um1DOVWKrvu_b3?okx6KTXq4y~N#L_e8 zZX@5JD zjH)&-1qw}a)fvl&A0h5T2ShHgvf;_fDkli;iGzA#Oall>%Z&+(g8;Vvxy$vLBUD@p zdHGKkr6$pRgnt$ohSiQ{yis~|`&3u9p<#K%5^9AHRK4|q2qWIGDRMPk4iYwx1|Lt% zYBmRR!e&3Ts)KzKt`^8HyGgUCH&Zm(pxd){jE}x`&ug)<<6z4q-3{Ze9_(t8=RA z!j+Pw#!Z_UoPE5B{UD`~ip$?6-(>xIYF6?Xhz=`r-+8^h0k@5SA3WsmcNnZRQqG9u zzzHJ&eK;?4N<~WN2(bfJ#tEUZvHG_x|3PVO_An7cr*{GD+|XkL5GxF|j zhz(WvJs_~`-OvkJ{IB#iuZ&xA;o3J(I4~ue7BmZJc%wx2)trWxj1bAC#bAyNQI~>%GscwS za^NL(W_>b7ahqjoi}e#SUo^q}*DS-tf|aiQA&)K|0OA`L3N6%CZ#)~BaC>W(MSXd_ z!|)|f=!XcZTQivBa6$A@TUv~frL+B568Px#gJ6Jkv@rsg`c>`ScOO{g>`3L|$OEP3 z_t+_A6p-jja7)S32kAcv6xyAALev*;{?uo@tAkfK_-Sb12URYWKF{^j;+Kia>Mrq( zHZaw8($-=u>6RHVXiyqK%G7pg%zbfmO=Vp_5WmKm`Hbrbq}1;yEpVU4QGK5Y)KnM? zu%>)r6HKCn5+*{o^cJ><)IeFYdX8-FTmzAKh6}QMK9cIrE>+SVC|Sc{=&K$%Wu=?B zDpal;;RSuB5Il!D_fc>2o2$|Fqnhrp- zS1>N_Ldcv}3dC86FI~J%KA`Ir@396{{sr2$f~Z-iz24bHu>MWzsk%3v>iE!I4z~6> z)4hh6GsF%7oe^(Sh~yA+=$8PsApMW(L$)hB4LW6AB@otf;;Rm=sBi zd?+RT?j5D;z!_|uZd%bla+J=D55$!7u8U4qCREhjocWe^p%Sg5$>h>w%pMwF4Xs-f zZB#qN&h=FA>N$yWu=}0D{>0#QkATi+Y-NG5-6c@2&_bpfE#|pYzPf`{fVr$j029`W z!u1{F%Zdfcsrh{UNy$|NNBPu840Mbo{5tH&yi#=}d8VfgZV_$SsmBCg3_7=b)NyhD znU7t2cxgBZ$@M`n-x|!FsCObqDWdqVyXh&XKJO#jdE(S(11GFaAI1p6eLTg|>w**L z+2l~z*|LQ#Y^4v?uER z#}So!8WUOU*1nXJ!dls`B+vw1g(S%uViPpH@iojU@S!ZqLW_58TvgW?KTh~!dlW=DY~NW~JPYhr8-H#`P) zjA3S3ts*wl#30Hu{OAV_*k<(imb;&%=G9LNAHJ-$SPOaFvzP0$-LIwcPfsQYCzD5c zk-Njt_vQU)(_p5zFrUqN`lQX~8_<15T~RwO$Ty2hf+0B_QY1c7{62;I|FqhI&bWU; zF_qORBRPDxN$fuHZe@D6>^Ax)vXS&$Cc8~;vh{wS*Gp9XCQQ7Yf z;Vo1VS*fv*b(?ldKlG0%7s&E35494z2U#FGtfK$om3RnERM@rTGH2ic%^&3hS$v0o zNr+Zc$Y9aEjt}3X2qg!dl24hiOK&1`O*lX33}SbefEznWO#%hvRD3hTVV>=#nq<(q z@WuJ)UV;kTv4RI&JgNV;#Q9{fq(ZJI41TkA_g;BRv)W$d>7&DduBK>6A1(= zwt?+RZiweTDG(Lr5%MtAK11xor2$`T*DWVXnH;mjVi>=U!XibmD06_& zZz?tQ2GdJ450Z;1vKf&iU7a;%JZS&}M!My$^H^ILcZTpcM$Rc#<+zaMK;GQu|kJ^XloxQVzl6}ELm zUuuWGe&?8+5&rx7D>$L<)Jl=cHYbm1l6F|$hDK_1EMdfBPK|L-B)aUMS-QyOZ=#)Nx z7pY{VZVCjn;Mrq)7czDD#WOoqx;gk;aggB!zAeGe87)E=@MW1oQ;J;pXp815)?en8 z$pK2g1587|=sDrwrr?ZiRB-+E1p6q|GL>LHt~e8Q$Esp^x@Z&fdD{WIB$>{X3|N#~ zRCIo5JFTZizqIh{(KcXWK!w$`8!v(M)zMQEoY8iB+}tM6KFZ~yJLH670=BT7kb)Tpi{iT#+A%t0yK z2;(!MSfBbUaUP&Qr*bu+QZlNOf&tj-Uv=NuJr42NuqBXK0|hWxWV{##@sG^W0_H$! z-^n*la94ZE^7!A76n)*#z+#MP;T_+^fOsNc9_O z-t*(u3C9i$aEU#xnr9f7w$c{B6W!h{5=N@cG`C7fM4?&m5v>LQna`Qo9qEu1QeVRv z77=9sYmZlcyrg*%0DKKDJLr75>=b4|6vx4-%-j04;6 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 kQ>dG}b4ZZSSv!!Dx%MC>PeCNZTNe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vivado Synthesis Defaults + + + + diff --git a/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/htr.txt b/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/htr.txt new file mode 100644 index 0000000..43ccfd1 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/htr.txt @@ -0,0 +1,9 @@ +REM +REM Vivado(TM) +REM htr.txt: a Vivado-generated description of how-to-repeat the +REM the basic steps of a run. Note that runme.bat/sh needs +REM to be invoked for Vivado to track run status. +REM Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +REM + +vivado -log design_1_processing_system7_0_0.vds -m64 -product Vivado -mode batch -messageDb vivado.pb -notrace -source design_1_processing_system7_0_0.tcl diff --git a/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/vivado.jou b/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/vivado.jou new file mode 100644 index 0000000..b4e6417 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/vivado.jou @@ -0,0 +1,12 @@ +#----------------------------------------------------------- +# Vivado v2018.2 (64-bit) +# SW Build 2258646 on Thu Jun 14 20:03:12 MDT 2018 +# IP Build 2256618 on Thu Jun 14 22:10:49 MDT 2018 +# Start of session at: Fri Aug 17 17:35:38 2018 +# Process ID: 13472 +# Current directory: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1 +# Command line: vivado.exe -log design_1_processing_system7_0_0.vds -product Vivado -mode batch -messageDb vivado.pb -notrace -source design_1_processing_system7_0_0.tcl +# Log file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/design_1_processing_system7_0_0.vds +# Journal file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1\vivado.jou +#----------------------------------------------------------- +source design_1_processing_system7_0_0.tcl -notrace diff --git a/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/vivado.pb b/LED_Blink/LED_Blink.runs/design_1_processing_system7_0_0_synth_1/vivado.pb new file mode 100644 index 0000000000000000000000000000000000000000..f4dc6c6dd64baca4b580df9a129f1218a0ea3970 GIT binary patch literal 57759 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 NKwXi*A=GCg{|_g`3YGu> literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.tcl b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.tcl new file mode 100644 index 0000000..55f6945 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.tcl @@ -0,0 +1,187 @@ +# +# Report generation script generated by Vivado +# + +proc create_report { reportName command } { + set status "." + append status $reportName ".fail" + if { [file exists $status] } { + eval file delete [glob $status] + } + send_msg_id runtcl-4 info "Executing : $command" + set retval [eval catch { $command } msg] + if { $retval != 0 } { + set fp [open $status w] + close $fp + send_msg_id runtcl-5 warning "$msg" + } +} +proc start_step { step } { + set stopFile ".stop.rst" + if {[file isfile .stop.rst]} { + puts "" + puts "*** Halting run - EA reset detected ***" + puts "" + puts "" + return -code error + } + set beginFile ".$step.begin.rst" + set platform "$::tcl_platform(platform)" + set user "$::tcl_platform(user)" + set pid [pid] + set host "" + if { [string equal $platform unix] } { + if { [info exist ::env(HOSTNAME)] } { + set host $::env(HOSTNAME) + } + } else { + if { [info exist ::env(COMPUTERNAME)] } { + set host $::env(COMPUTERNAME) + } + } + set ch [open $beginFile w] + puts $ch "" + puts $ch "" + puts $ch " " + puts $ch " " + puts $ch "" + close $ch +} + +proc end_step { step } { + set endFile ".$step.end.rst" + set ch [open $endFile w] + close $ch +} + +proc step_failed { step } { + set endFile ".$step.error.rst" + set ch [open $endFile w] + close $ch +} + +set_msg_config -id {HDL-1065} -limit 10000 + +start_step init_design +set ACTIVE_STEP init_design +set rc [catch { + create_msg_db init_design.pb + create_project -in_memory -part xc7z010clg225-1 + set_property design_mode GateLvl [current_fileset] + set_param project.singleFileAddWarning.threshold 0 + set_property webtalk.parent_dir C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.cache/wt [current_project] + set_property parent.project_path C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.xpr [current_project] + set_property ip_output_repo C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.cache/ip [current_project] + set_property ip_cache_permissions {read write} [current_project] + set_property XPM_LIBRARIES {XPM_FIFO XPM_MEMORY} [current_project] + add_files -quiet C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.dcp + set_msg_config -source 4 -id {BD 41-1661} -limit 0 + set_param project.isImplRun true + add_files C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bd + set_param project.isImplRun false + read_xdc C:/Users/qwpmb/Documents/summercamp2018/led.xdc + read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_bitgen_common.xdc + read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_common.xdc + read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc + read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc + read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc + read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_timing.xdc + read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/vivado_target.xdc + set_param project.isImplRun true + link_design -top design_1_wrapper -part xc7z010clg225-1 + set_param project.isImplRun false + write_hwdef -force -file design_1_wrapper.hwdef + close_msg_db -file init_design.pb +} RESULT] +if {$rc} { + step_failed init_design + return -code error $RESULT +} else { + end_step init_design + unset ACTIVE_STEP +} + +start_step opt_design +set ACTIVE_STEP opt_design +set rc [catch { + create_msg_db opt_design.pb + opt_design + write_checkpoint -force design_1_wrapper_opt.dcp + create_report "impl_1_opt_report_drc_0" "report_drc -file design_1_wrapper_drc_opted.rpt -pb design_1_wrapper_drc_opted.pb -rpx design_1_wrapper_drc_opted.rpx" + close_msg_db -file opt_design.pb +} RESULT] +if {$rc} { + step_failed opt_design + return -code error $RESULT +} else { + end_step opt_design + unset ACTIVE_STEP +} + +start_step place_design +set ACTIVE_STEP place_design +set rc [catch { + create_msg_db place_design.pb + if { [llength [get_debug_cores -quiet] ] > 0 } { + implement_debug_core + } + place_design + write_checkpoint -force design_1_wrapper_placed.dcp + create_report "impl_1_place_report_io_0" "report_io -file design_1_wrapper_io_placed.rpt" + create_report "impl_1_place_report_utilization_0" "report_utilization -file design_1_wrapper_utilization_placed.rpt -pb design_1_wrapper_utilization_placed.pb" + create_report "impl_1_place_report_control_sets_0" "report_control_sets -verbose -file design_1_wrapper_control_sets_placed.rpt" + close_msg_db -file place_design.pb +} RESULT] +if {$rc} { + step_failed place_design + return -code error $RESULT +} else { + end_step place_design + unset ACTIVE_STEP +} + +start_step route_design +set ACTIVE_STEP route_design +set rc [catch { + create_msg_db route_design.pb + route_design + write_checkpoint -force design_1_wrapper_routed.dcp + create_report "impl_1_route_report_drc_0" "report_drc -file design_1_wrapper_drc_routed.rpt -pb design_1_wrapper_drc_routed.pb -rpx design_1_wrapper_drc_routed.rpx" + create_report "impl_1_route_report_methodology_0" "report_methodology -file design_1_wrapper_methodology_drc_routed.rpt -pb design_1_wrapper_methodology_drc_routed.pb -rpx design_1_wrapper_methodology_drc_routed.rpx" + create_report "impl_1_route_report_power_0" "report_power -file design_1_wrapper_power_routed.rpt -pb design_1_wrapper_power_summary_routed.pb -rpx design_1_wrapper_power_routed.rpx" + create_report "impl_1_route_report_route_status_0" "report_route_status -file design_1_wrapper_route_status.rpt -pb design_1_wrapper_route_status.pb" + create_report "impl_1_route_report_timing_summary_0" "report_timing_summary -max_paths 10 -file design_1_wrapper_timing_summary_routed.rpt -pb design_1_wrapper_timing_summary_routed.pb -rpx design_1_wrapper_timing_summary_routed.rpx -warn_on_violation " + create_report "impl_1_route_report_incremental_reuse_0" "report_incremental_reuse -file design_1_wrapper_incremental_reuse_routed.rpt" + create_report "impl_1_route_report_clock_utilization_0" "report_clock_utilization -file design_1_wrapper_clock_utilization_routed.rpt" + create_report "impl_1_route_report_bus_skew_0" "report_bus_skew -warn_on_violation -file design_1_wrapper_bus_skew_routed.rpt -pb design_1_wrapper_bus_skew_routed.pb -rpx design_1_wrapper_bus_skew_routed.rpx" + close_msg_db -file route_design.pb +} RESULT] +if {$rc} { + write_checkpoint -force design_1_wrapper_routed_error.dcp + step_failed route_design + return -code error $RESULT +} else { + end_step route_design + unset ACTIVE_STEP +} + +start_step write_bitstream +set ACTIVE_STEP write_bitstream +set rc [catch { + create_msg_db write_bitstream.pb + set_property XPM_LIBRARIES {XPM_FIFO XPM_MEMORY} [current_project] + catch { write_mem_info -force design_1_wrapper.mmi } + write_bitstream -force design_1_wrapper.bit + catch { write_sysdef -hwdef design_1_wrapper.hwdef -bitfile design_1_wrapper.bit -meminfo design_1_wrapper.mmi -file design_1_wrapper.sysdef } + catch {write_debug_probes -quiet -force design_1_wrapper} + catch {file copy -force design_1_wrapper.ltx debug_nets.ltx} + close_msg_db -file write_bitstream.pb +} RESULT] +if {$rc} { + step_failed write_bitstream + return -code error $RESULT +} else { + end_step write_bitstream + unset ACTIVE_STEP +} + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.vdi b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.vdi new file mode 100644 index 0000000..954726d --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.vdi @@ -0,0 +1,660 @@ +#----------------------------------------------------------- +# Vivado v2018.2 (64-bit) +# SW Build 2258646 on Thu Jun 14 20:03:12 MDT 2018 +# IP Build 2256618 on Thu Jun 14 22:10:49 MDT 2018 +# Start of session at: Fri Aug 17 17:43:59 2018 +# Process ID: 18056 +# Current directory: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1 +# Command line: vivado.exe -log design_1_wrapper.vdi -applog -product Vivado -messageDb vivado.pb -mode batch -source design_1_wrapper.tcl -notrace +# Log file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.vdi +# Journal file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1\vivado.jou +#----------------------------------------------------------- +source design_1_wrapper.tcl -notrace +INFO: [IP_Flow 19-234] Refreshing IP repositories +INFO: [IP_Flow 19-1704] No user IP repositories specified +INFO: [IP_Flow 19-2313] Loaded Vivado IP repository 'C:/Xilinx/Vivado/2018.2/data/ip'. +add_files: Time (s): cpu = 00:00:04 ; elapsed = 00:00:05 . Memory (MB): peak = 275.211 ; gain = 38.148 +Command: link_design -top design_1_wrapper -part xc7z010clg225-1 +Design is defaulting to srcset: sources_1 +Design is defaulting to constrset: constrs_1 +INFO: [Project 1-454] Reading design checkpoint 'c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.dcp' for cell 'design_1_i/led_0' +INFO: [Project 1-454] Reading design checkpoint 'c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.dcp' for cell 'design_1_i/processing_system7_0' +INFO: [Netlist 29-17] Analyzing 7 Unisim elements for replacement +INFO: [Netlist 29-28] Unisim Transformation completed in 0 CPU seconds +INFO: [Project 1-479] Netlist was created with Vivado 2018.2 +INFO: [Device 21-403] Loading part xc7z010clg225-1 +INFO: [Project 1-570] Preparing netlist for logic optimization +Parsing XDC File [c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xdc] for cell 'design_1_i/processing_system7_0/inst' +Finished Parsing XDC File [c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xdc] for cell 'design_1_i/processing_system7_0/inst' +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/led.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/led.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_bitgen_common.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_bitgen_common.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_common.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_common.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc] +WARNING: [Vivado 12-584] No ports matched 'csi_c_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:1] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:1] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_c_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:2] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:2] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_n[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:3] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:3] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_n[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:4] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:4] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:5] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:5] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:6] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:6] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:7] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:7] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:8] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:8] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_p[1]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:9] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:9] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_p[1]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:10] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:10] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:12] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:12] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_n[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:13] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:13] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'csi_c_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:15] +CRITICAL WARNING: [Vivado 12-4739] create_clock:No valid object(s) found for '-objects [get_ports csi_c_clk_p]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:15] +Resolution: Check if the specified object(s) exists in the current design. If it does, ensure that the correct design hierarchy was specified for the object. If you are working with clocks, make sure create_clock was used to create the clock object before it is referenced. +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc] +WARNING: [Vivado 12-584] No ports matched 'hdmi_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:1] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:1] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'hdmi_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:2] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:2] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'hdmi_data_p[*]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:4] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:4] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'hdmi_data_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:5] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:5] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'hdmi_data_p[1]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:6] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:6] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'hdmi_data_p[2]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:7] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:7] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[*]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:4] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:4] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:7] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:7] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[1]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:9] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:9] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[2]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:11] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:11] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[3]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:13] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:13] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[4]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:15] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:15] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[5]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:17] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:17] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[6]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:19] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:19] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[7]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:21] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:21] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[8]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:23] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:23] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[9]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:25] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:25] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[10]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:27] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:27] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[11]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:29] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:29] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[12]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:31] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:31] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[13]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:33] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:33] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[14]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:35] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:35] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[15]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:37] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:37] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[16]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:39] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:39] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[17]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:41] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:41] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[18]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:43] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:43] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[19]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:45] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:45] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[20]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:47] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:47] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[21]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:49] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:49] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[22]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:51] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:51] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[23]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:53] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:53] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'PWM_R'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:86] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:86] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'PWM_L'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:88] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:88] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +WARNING: [Vivado 12-584] No ports matched 'PWM_*'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:89] +CRITICAL WARNING: [Common 17-55] 'set_property' expects at least one object. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:89] +Resolution: If [get_] was used to populate the object, check to make sure this command returns at least one valid object. +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_timing.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_timing.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/vivado_target.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/vivado_target.xdc] +INFO: [Opt 31-138] Pushed 0 inverter(s) to 0 load pin(s). +INFO: [Project 1-111] Unisim Transformation Summary: +No Unisim elements were transformed. + +12 Infos, 47 Warnings, 47 Critical Warnings and 0 Errors encountered. +link_design completed successfully +link_design: Time (s): cpu = 00:00:13 ; elapsed = 00:00:22 . Memory (MB): peak = 614.734 ; gain = 339.523 +Command: opt_design +Attempting to get a license for feature 'Implementation' and/or device 'xc7z010' +INFO: [Common 17-349] Got license for feature 'Implementation' and/or device 'xc7z010' +Running DRC as a precondition to command opt_design + +Starting DRC Task +INFO: [DRC 23-27] Running DRC with 2 threads +INFO: [Project 1-461] DRC finished with 0 Errors +INFO: [Project 1-462] Please refer to the DRC report (report_drc) for more information. + +Time (s): cpu = 00:00:02 ; elapsed = 00:00:01 . Memory (MB): peak = 626.629 ; gain = 11.895 + +Starting Cache Timing Information Task +INFO: [Timing 38-35] Done setting XDC timing constraints. +Ending Cache Timing Information Task | Checksum: 156862500 + +Time (s): cpu = 00:00:16 ; elapsed = 00:00:20 . Memory (MB): peak = 1101.488 ; gain = 474.707 + +Starting Logic Optimization Task + +Phase 1 Retarget +INFO: [Opt 31-138] Pushed 0 inverter(s) to 0 load pin(s). +INFO: [Opt 31-49] Retargeted 0 cell(s). +Phase 1 Retarget | Checksum: 119078520 + +Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.097 . Memory (MB): peak = 1101.488 ; gain = 0.000 +INFO: [Opt 31-389] Phase Retarget created 0 cells and removed 0 cells + +Phase 2 Constant propagation +INFO: [Opt 31-138] Pushed 0 inverter(s) to 0 load pin(s). +Phase 2 Constant propagation | Checksum: 119078520 + +Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.120 . Memory (MB): peak = 1101.488 ; gain = 0.000 +INFO: [Opt 31-389] Phase Constant propagation created 0 cells and removed 0 cells + +Phase 3 Sweep +Phase 3 Sweep | Checksum: 96f8efb2 + +Time (s): cpu = 00:00:01 ; elapsed = 00:00:00.372 . Memory (MB): peak = 1101.488 ; gain = 0.000 +INFO: [Opt 31-389] Phase Sweep created 0 cells and removed 89 cells + +Phase 4 BUFG optimization +Phase 4 BUFG optimization | Checksum: 96f8efb2 + +Time (s): cpu = 00:00:01 ; elapsed = 00:00:00.426 . Memory (MB): peak = 1101.488 ; gain = 0.000 +INFO: [Opt 31-662] Phase BUFG optimization created 0 cells of which 0 are BUFGs and removed 0 cells. + +Phase 5 Shift Register Optimization +Phase 5 Shift Register Optimization | Checksum: 1521798de + +Time (s): cpu = 00:00:01 ; elapsed = 00:00:00.614 . Memory (MB): peak = 1101.488 ; gain = 0.000 +INFO: [Opt 31-389] Phase Shift Register Optimization created 0 cells and removed 0 cells + +Phase 6 Post Processing Netlist +Phase 6 Post Processing Netlist | Checksum: 1521798de + +Time (s): cpu = 00:00:01 ; elapsed = 00:00:00.630 . Memory (MB): peak = 1101.488 ; gain = 0.000 +INFO: [Opt 31-389] Phase Post Processing Netlist created 0 cells and removed 0 cells + +Starting Connectivity Check Task + +Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.002 . Memory (MB): peak = 1101.488 ; gain = 0.000 +Ending Logic Optimization Task | Checksum: 1521798de + +Time (s): cpu = 00:00:01 ; elapsed = 00:00:00.643 . Memory (MB): peak = 1101.488 ; gain = 0.000 + +Starting Power Optimization Task +INFO: [Pwropt 34-132] Skipping clock gating for clocks with a period < 2.00 ns. +Ending Power Optimization Task | Checksum: 1521798de + +Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.031 . Memory (MB): peak = 1101.488 ; gain = 0.000 + +Starting Final Cleanup Task +Ending Final Cleanup Task | Checksum: 1521798de + +Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.001 . Memory (MB): peak = 1101.488 ; gain = 0.000 +INFO: [Common 17-83] Releasing license: Implementation +28 Infos, 47 Warnings, 47 Critical Warnings and 0 Errors encountered. +opt_design completed successfully +opt_design: Time (s): cpu = 00:00:19 ; elapsed = 00:00:22 . Memory (MB): peak = 1101.488 ; gain = 486.754 +INFO: [Timing 38-480] Writing timing data to binary archive. +Writing placer database... +Writing XDEF routing. +Writing XDEF routing logical nets. +Writing XDEF routing special nets. +Write XDEF Complete: Time (s): cpu = 00:00:01 ; elapsed = 00:00:00.337 . Memory (MB): peak = 1101.488 ; gain = 0.000 +INFO: [Common 17-1381] The checkpoint 'C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_opt.dcp' has been generated. +INFO: [runtcl-4] Executing : report_drc -file design_1_wrapper_drc_opted.rpt -pb design_1_wrapper_drc_opted.pb -rpx design_1_wrapper_drc_opted.rpx +Command: report_drc -file design_1_wrapper_drc_opted.rpt -pb design_1_wrapper_drc_opted.pb -rpx design_1_wrapper_drc_opted.rpx +INFO: [DRC 23-27] Running DRC with 2 threads +INFO: [Coretcl 2-168] The results of DRC are in file C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_opted.rpt. +report_drc completed successfully +Command: place_design +Attempting to get a license for feature 'Implementation' and/or device 'xc7z010' +INFO: [Common 17-349] Got license for feature 'Implementation' and/or device 'xc7z010' +INFO: [DRC 23-27] Running DRC with 2 threads +INFO: [Vivado_Tcl 4-198] DRC finished with 0 Errors +INFO: [Vivado_Tcl 4-199] Please refer to the DRC report (report_drc) for more information. +Running DRC as a precondition to command place_design +INFO: [DRC 23-27] Running DRC with 2 threads +INFO: [Vivado_Tcl 4-198] DRC finished with 0 Errors +INFO: [Vivado_Tcl 4-199] Please refer to the DRC report (report_drc) for more information. + +Starting Placer Task +INFO: [Place 30-611] Multithreading enabled for place_design using a maximum of 2 CPUs + +Phase 1 Placer Initialization + +Phase 1.1 Placer Initialization Netlist Sorting +Netlist sorting complete. Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.003 . Memory (MB): peak = 1102.777 ; gain = 0.000 +Phase 1.1 Placer Initialization Netlist Sorting | Checksum: 9bd63e32 + +Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.036 . Memory (MB): peak = 1102.777 ; gain = 0.000 +Netlist sorting complete. Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.002 . Memory (MB): peak = 1102.777 ; gain = 0.000 + +Phase 1.2 IO Placement/ Clock Placement/ Build Placer Device +INFO: [Timing 38-35] Done setting XDC timing constraints. +Phase 1.2 IO Placement/ Clock Placement/ Build Placer Device | Checksum: 10f15a0e8 + +Time (s): cpu = 00:00:02 ; elapsed = 00:00:03 . Memory (MB): peak = 1114.027 ; gain = 11.250 + +Phase 1.3 Build Placer Netlist Model +Phase 1.3 Build Placer Netlist Model | Checksum: 1298f0c74 + +Time (s): cpu = 00:00:02 ; elapsed = 00:00:03 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 1.4 Constrain Clocks/Macros +Phase 1.4 Constrain Clocks/Macros | Checksum: 1298f0c74 + +Time (s): cpu = 00:00:02 ; elapsed = 00:00:03 . Memory (MB): peak = 1122.680 ; gain = 19.902 +Phase 1 Placer Initialization | Checksum: 1298f0c74 + +Time (s): cpu = 00:00:02 ; elapsed = 00:00:03 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 2 Global Placement + +Phase 2.1 Floorplanning +Phase 2.1 Floorplanning | Checksum: 20bd731f8 + +Time (s): cpu = 00:00:02 ; elapsed = 00:00:03 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 2.2 Physical Synthesis In Placer +INFO: [Physopt 32-65] No nets found for high-fanout optimization. +INFO: [Physopt 32-232] Optimized 0 net. Created 0 new instance. +INFO: [Physopt 32-775] End 1 Pass. Optimized 0 net or cell. Created 0 new cell, deleted 0 existing cell and moved 0 existing cell +Netlist sorting complete. Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.003 . Memory (MB): peak = 1122.680 ; gain = 0.000 + +Summary of Physical Synthesis Optimizations +============================================ + + +----------------------------------------------------------------------------------------------------------------------------- +| Optimization | Added Cells | Removed Cells | Optimized Cells/Nets | Dont Touch | Iterations | Elapsed | +----------------------------------------------------------------------------------------------------------------------------- +| Very High Fanout | 0 | 0 | 0 | 0 | 1 | 00:00:00 | +| Total | 0 | 0 | 0 | 0 | 1 | 00:00:00 | +----------------------------------------------------------------------------------------------------------------------------- + + +Phase 2.2 Physical Synthesis In Placer | Checksum: 1147e9262 + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:04 . Memory (MB): peak = 1122.680 ; gain = 19.902 +Phase 2 Global Placement | Checksum: 13a0921c6 + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:04 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 3 Detail Placement + +Phase 3.1 Commit Multi Column Macros +Phase 3.1 Commit Multi Column Macros | Checksum: 13a0921c6 + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:04 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 3.2 Commit Most Macros & LUTRAMs +Phase 3.2 Commit Most Macros & LUTRAMs | Checksum: 10864eb18 + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:04 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 3.3 Area Swap Optimization +Phase 3.3 Area Swap Optimization | Checksum: 15bba2e82 + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:04 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 3.4 Pipeline Register Optimization +Phase 3.4 Pipeline Register Optimization | Checksum: 15bba2e82 + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:04 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 3.5 Small Shape Detail Placement +Phase 3.5 Small Shape Detail Placement | Checksum: eb679daa + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 3.6 Re-assign LUT pins +Phase 3.6 Re-assign LUT pins | Checksum: 110bbe024 + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 3.7 Pipeline Register Optimization +Phase 3.7 Pipeline Register Optimization | Checksum: 110bbe024 + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 +Phase 3 Detail Placement | Checksum: 110bbe024 + +Time (s): cpu = 00:00:04 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 4 Post Placement Optimization and Clean-Up + +Phase 4.1 Post Commit Optimization +INFO: [Timing 38-35] Done setting XDC timing constraints. + +Phase 4.1.1 Post Placement Optimization +Post Placement Optimization Initialization | Checksum: 14bc17437 + +Phase 4.1.1.1 BUFG Insertion +INFO: [Place 46-31] BUFG insertion identified 0 candidate nets, 0 success, 0 skipped for placement/routing, 0 skipped for timing, 0 skipped for netlist change reason. +Phase 4.1.1.1 BUFG Insertion | Checksum: 14bc17437 + +Time (s): cpu = 00:00:05 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 +INFO: [Place 30-746] Post Placement Timing Summary WNS=16.016. For the most accurate timing information please run report_timing. +Phase 4.1.1 Post Placement Optimization | Checksum: e7b2cdb2 + +Time (s): cpu = 00:00:05 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 +Phase 4.1 Post Commit Optimization | Checksum: e7b2cdb2 + +Time (s): cpu = 00:00:05 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 4.2 Post Placement Cleanup +Phase 4.2 Post Placement Cleanup | Checksum: e7b2cdb2 + +Time (s): cpu = 00:00:05 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 4.3 Placer Reporting +Phase 4.3 Placer Reporting | Checksum: e7b2cdb2 + +Time (s): cpu = 00:00:05 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 + +Phase 4.4 Final Placement Cleanup +Phase 4.4 Final Placement Cleanup | Checksum: 1485c6970 + +Time (s): cpu = 00:00:05 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 +Phase 4 Post Placement Optimization and Clean-Up | Checksum: 1485c6970 + +Time (s): cpu = 00:00:05 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 +Ending Placer Task | Checksum: 127e304e4 + +Time (s): cpu = 00:00:05 ; elapsed = 00:00:05 . Memory (MB): peak = 1122.680 ; gain = 19.902 +INFO: [Common 17-83] Releasing license: Implementation +49 Infos, 47 Warnings, 47 Critical Warnings and 0 Errors encountered. +place_design completed successfully +place_design: Time (s): cpu = 00:00:09 ; elapsed = 00:00:07 . Memory (MB): peak = 1122.680 ; gain = 21.191 +INFO: [Timing 38-480] Writing timing data to binary archive. +Writing placer database... +Writing XDEF routing. +Writing XDEF routing logical nets. +Writing XDEF routing special nets. +Write XDEF Complete: Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.213 . Memory (MB): peak = 1128.152 ; gain = 5.473 +INFO: [Common 17-1381] The checkpoint 'C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_placed.dcp' has been generated. +INFO: [runtcl-4] Executing : report_io -file design_1_wrapper_io_placed.rpt +report_io: Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.063 . Memory (MB): peak = 1133.535 ; gain = 0.000 +INFO: [runtcl-4] Executing : report_utilization -file design_1_wrapper_utilization_placed.rpt -pb design_1_wrapper_utilization_placed.pb +report_utilization: Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.050 . Memory (MB): peak = 1133.535 ; gain = 0.000 +INFO: [runtcl-4] Executing : report_control_sets -verbose -file design_1_wrapper_control_sets_placed.rpt +report_control_sets: Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.009 . Memory (MB): peak = 1133.535 ; gain = 0.000 +Command: route_design +Attempting to get a license for feature 'Implementation' and/or device 'xc7z010' +INFO: [Common 17-349] Got license for feature 'Implementation' and/or device 'xc7z010' +Running DRC as a precondition to command route_design +INFO: [DRC 23-27] Running DRC with 2 threads +INFO: [Vivado_Tcl 4-198] DRC finished with 0 Errors +INFO: [Vivado_Tcl 4-199] Please refer to the DRC report (report_drc) for more information. + + +Starting Routing Task +INFO: [Route 35-254] Multithreading enabled for route_design using a maximum of 2 CPUs +Checksum: PlaceDB: aa3c114a ConstDB: 0 ShapeSum: 7da6f39a RouteDB: 0 + +Phase 1 Build RT Design +Phase 1 Build RT Design | Checksum: fedd6a1a + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1199.941 ; gain = 66.406 +Post Restoration Checksum: NetGraph: 4b01005f NumContArr: b3dc69bb Constraints: 0 Timing: 0 + +Phase 2 Router Initialization + +Phase 2.1 Create Timer +Phase 2.1 Create Timer | Checksum: fedd6a1a + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1199.941 ; gain = 66.406 + +Phase 2.2 Fix Topology Constraints +Phase 2.2 Fix Topology Constraints | Checksum: fedd6a1a + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1205.953 ; gain = 72.418 + +Phase 2.3 Pre Route Cleanup +Phase 2.3 Pre Route Cleanup | Checksum: fedd6a1a + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1205.953 ; gain = 72.418 + Number of Nodes with overlaps = 0 + +Phase 2.4 Update Timing +Phase 2.4 Update Timing | Checksum: aa6a6345 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1208.652 ; gain = 75.117 +INFO: [Route 35-416] Intermediate Timing Summary | WNS=15.949 | TNS=0.000 | WHS=-0.038 | THS=-0.202 | + +Phase 2 Router Initialization | Checksum: ac238b86 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 + +Phase 3 Initial Routing +Phase 3 Initial Routing | Checksum: 1e5d5c4eb + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 + +Phase 4 Rip-up And Reroute + +Phase 4.1 Global Iteration 0 + Number of Nodes with overlaps = 1 + Number of Nodes with overlaps = 0 +INFO: [Route 35-416] Intermediate Timing Summary | WNS=15.130 | TNS=0.000 | WHS=N/A | THS=N/A | + +Phase 4.1 Global Iteration 0 | Checksum: 1e6acfb26 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 +Phase 4 Rip-up And Reroute | Checksum: 1e6acfb26 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 + +Phase 5 Delay and Skew Optimization + +Phase 5.1 Delay CleanUp +Phase 5.1 Delay CleanUp | Checksum: 1e6acfb26 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 + +Phase 5.2 Clock Skew Optimization +Phase 5.2 Clock Skew Optimization | Checksum: 1e6acfb26 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 +Phase 5 Delay and Skew Optimization | Checksum: 1e6acfb26 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 + +Phase 6 Post Hold Fix + +Phase 6.1 Hold Fix Iter + +Phase 6.1.1 Update Timing +Phase 6.1.1 Update Timing | Checksum: 20fe92fa7 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 +INFO: [Route 35-416] Intermediate Timing Summary | WNS=15.283 | TNS=0.000 | WHS=0.237 | THS=0.000 | + +Phase 6.1 Hold Fix Iter | Checksum: 20fe92fa7 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 +Phase 6 Post Hold Fix | Checksum: 20fe92fa7 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 + +Phase 7 Route finalize + +Router Utilization Summary + Global Vertical Routing Utilization = 0.00436374 % + Global Horizontal Routing Utilization = 0.000919118 % + Routable Net Status* + *Does not include unroutable nets such as driverless and loadless. + Run report_route_status for detailed report. + Number of Failed Nets = 0 + Number of Unrouted Nets = 0 + Number of Partially Routed Nets = 0 + Number of Node Overlaps = 0 + +Phase 7 Route finalize | Checksum: 25dd69eed + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1209.816 ; gain = 76.281 + +Phase 8 Verifying routed nets + + Verification completed successfully +Phase 8 Verifying routed nets | Checksum: 25dd69eed + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1211.625 ; gain = 78.090 + +Phase 9 Depositing Routes +Phase 9 Depositing Routes | Checksum: 1e8724916 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1211.625 ; gain = 78.090 + +Phase 10 Post Router Timing +INFO: [Route 35-57] Estimated Timing Summary | WNS=15.283 | TNS=0.000 | WHS=0.237 | THS=0.000 | + +INFO: [Route 35-327] The final timing numbers are based on the router estimated timing analysis. For a complete and accurate timing signoff, please run report_timing_summary. +Phase 10 Post Router Timing | Checksum: 1e8724916 + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1211.625 ; gain = 78.090 +INFO: [Route 35-16] Router Completed Successfully + +Time (s): cpu = 00:00:23 ; elapsed = 00:00:23 . Memory (MB): peak = 1211.625 ; gain = 78.090 + +Routing Is Done. +INFO: [Common 17-83] Releasing license: Implementation +66 Infos, 47 Warnings, 47 Critical Warnings and 0 Errors encountered. +route_design completed successfully +route_design: Time (s): cpu = 00:00:28 ; elapsed = 00:00:26 . Memory (MB): peak = 1211.625 ; gain = 78.090 +INFO: [Timing 38-480] Writing timing data to binary archive. +Writing placer database... +Writing XDEF routing. +Writing XDEF routing logical nets. +Writing XDEF routing special nets. +Write XDEF Complete: Time (s): cpu = 00:00:01 ; elapsed = 00:00:00.229 . Memory (MB): peak = 1212.715 ; gain = 1.090 +INFO: [Common 17-1381] The checkpoint 'C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_routed.dcp' has been generated. +INFO: [runtcl-4] Executing : report_drc -file design_1_wrapper_drc_routed.rpt -pb design_1_wrapper_drc_routed.pb -rpx design_1_wrapper_drc_routed.rpx +Command: report_drc -file design_1_wrapper_drc_routed.rpt -pb design_1_wrapper_drc_routed.pb -rpx design_1_wrapper_drc_routed.rpx +INFO: [DRC 23-27] Running DRC with 2 threads +INFO: [Coretcl 2-168] The results of DRC are in file C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_routed.rpt. +report_drc completed successfully +INFO: [runtcl-4] Executing : report_methodology -file design_1_wrapper_methodology_drc_routed.rpt -pb design_1_wrapper_methodology_drc_routed.pb -rpx design_1_wrapper_methodology_drc_routed.rpx +Command: report_methodology -file design_1_wrapper_methodology_drc_routed.rpt -pb design_1_wrapper_methodology_drc_routed.pb -rpx design_1_wrapper_methodology_drc_routed.rpx +INFO: [Timing 38-35] Done setting XDC timing constraints. +INFO: [Timing 38-35] Done setting XDC timing constraints. +INFO: [DRC 23-133] Running Methodology with 2 threads +INFO: [Coretcl 2-1520] The results of Report Methodology are in file C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_methodology_drc_routed.rpt. +report_methodology completed successfully +INFO: [runtcl-4] Executing : report_power -file design_1_wrapper_power_routed.rpt -pb design_1_wrapper_power_summary_routed.pb -rpx design_1_wrapper_power_routed.rpx +Command: report_power -file design_1_wrapper_power_routed.rpt -pb design_1_wrapper_power_summary_routed.pb -rpx design_1_wrapper_power_routed.rpx +INFO: [Timing 38-35] Done setting XDC timing constraints. +Running Vector-less Activity Propagation... + +Finished Running Vector-less Activity Propagation +78 Infos, 47 Warnings, 47 Critical Warnings and 0 Errors encountered. +report_power completed successfully +INFO: [runtcl-4] Executing : report_route_status -file design_1_wrapper_route_status.rpt -pb design_1_wrapper_route_status.pb +INFO: [runtcl-4] Executing : report_timing_summary -max_paths 10 -file design_1_wrapper_timing_summary_routed.rpt -pb design_1_wrapper_timing_summary_routed.pb -rpx design_1_wrapper_timing_summary_routed.rpx -warn_on_violation +INFO: [Timing 38-91] UpdateTimingParams: Speed grade: -1, Delay Type: min_max, Timing Stage: Requireds. +INFO: [Timing 38-191] Multithreading enabled for timing update using a maximum of 2 CPUs +INFO: [runtcl-4] Executing : report_incremental_reuse -file design_1_wrapper_incremental_reuse_routed.rpt +INFO: [Vivado_Tcl 4-545] No incremental reuse to report, no incremental placement and routing data was found. +INFO: [runtcl-4] Executing : report_clock_utilization -file design_1_wrapper_clock_utilization_routed.rpt +INFO: [runtcl-4] Executing : report_bus_skew -warn_on_violation -file design_1_wrapper_bus_skew_routed.rpt -pb design_1_wrapper_bus_skew_routed.pb -rpx design_1_wrapper_bus_skew_routed.rpx +INFO: [Timing 38-91] UpdateTimingParams: Speed grade: -1, Delay Type: min_max, Timing Stage: Requireds. +INFO: [Timing 38-191] Multithreading enabled for timing update using a maximum of 2 CPUs +Command: write_bitstream -force design_1_wrapper.bit +Attempting to get a license for feature 'Implementation' and/or device 'xc7z010' +INFO: [Common 17-349] Got license for feature 'Implementation' and/or device 'xc7z010' +Running DRC as a precondition to command write_bitstream +INFO: [DRC 23-27] Running DRC with 2 threads +INFO: [Vivado 12-3199] DRC finished with 0 Errors +INFO: [Vivado 12-3200] Please refer to the DRC report (report_drc) for more information. +INFO: [Designutils 20-2272] Running write_bitstream with 2 threads. +Loading data files... +Loading site data... +Loading route data... +Processing options... +Creating bitmap... +Creating bitstream... +Bitstream compression saved 14888032 bits. +Writing bitstream ./design_1_wrapper.bit... +INFO: [Vivado 12-1842] Bitgen Completed Successfully. +INFO: [Project 1-120] WebTalk data collection is mandatory when using a WebPACK part without a full Vivado license. To see the specific WebTalk data collected for your design, open the usage_statistics_webtalk.html or usage_statistics_webtalk.xml file in the implementation directory. +INFO: [Common 17-186] 'C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1/usage_statistics_webtalk.xml' has been successfully sent to Xilinx on Fri Aug 17 17:46:05 2018. For additional details about this file, please refer to the WebTalk help file at C:/Xilinx/Vivado/2018.2/doc/webtalk_introduction.html. +INFO: [Common 17-83] Releasing license: Implementation +97 Infos, 47 Warnings, 47 Critical Warnings and 0 Errors encountered. +write_bitstream completed successfully +write_bitstream: Time (s): cpu = 00:00:20 ; elapsed = 00:00:23 . Memory (MB): peak = 1623.957 ; gain = 379.250 +INFO: [Common 17-206] Exiting Vivado at Fri Aug 17 17:46:05 2018... diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_bus_skew_routed.pb b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_bus_skew_routed.pb new file mode 100644 index 0000000000000000000000000000000000000000..3390588d5da71a6f6866045d7ae5646edfab7b0e GIT binary patch literal 30 lcmd;LGcqu=&@-IGEZ|gHtWcbtTCPx(T3nh_Qapp10RVJW2(bVF literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_bus_skew_routed.rpt b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_bus_skew_routed.rpt new file mode 100644 index 0000000..c453f47 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_bus_skew_routed.rpt @@ -0,0 +1,15 @@ +Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +| Date : Fri Aug 17 17:45:41 2018 +| Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +| Command : report_bus_skew -warn_on_violation -file design_1_wrapper_bus_skew_routed.rpt -pb design_1_wrapper_bus_skew_routed.pb -rpx design_1_wrapper_bus_skew_routed.rpx +| Design : design_1_wrapper +| Device : 7z010-clg225 +| Speed File : -1 PRODUCTION 1.11 2014-09-11 +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Bus Skew Report + +No bus skew constraints + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_clock_utilization_routed.rpt b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_clock_utilization_routed.rpt new file mode 100644 index 0000000..4d45c9f --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_clock_utilization_routed.rpt @@ -0,0 +1,154 @@ +Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +---------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +| Date : Fri Aug 17 17:45:41 2018 +| Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +| Command : report_clock_utilization -file design_1_wrapper_clock_utilization_routed.rpt +| Design : design_1_wrapper +| Device : 7z010-clg225 +| Speed File : -1 PRODUCTION 1.11 2014-09-11 +---------------------------------------------------------------------------------------------- + +Clock Utilization Report + +Table of Contents +----------------- +1. Clock Primitive Utilization +2. Global Clock Resources +3. Global Clock Source Details +4. Clock Regions: Key Resource Utilization +5. Clock Regions : Global Clock Summary +6. Device Cell Placement Summary for Global Clock g0 +7. Clock Region Cell Placement per Global Clock: Region X1Y0 +8. Clock Region Cell Placement per Global Clock: Region X0Y1 + +1. Clock Primitive Utilization +------------------------------ + ++----------+------+-----------+-----+--------------+--------+ +| Type | Used | Available | LOC | Clock Region | Pblock | ++----------+------+-----------+-----+--------------+--------+ +| BUFGCTRL | 1 | 32 | 0 | 0 | 0 | +| BUFH | 0 | 48 | 0 | 0 | 0 | +| BUFIO | 0 | 8 | 0 | 0 | 0 | +| BUFMR | 0 | 4 | 0 | 0 | 0 | +| BUFR | 0 | 8 | 0 | 0 | 0 | +| MMCM | 0 | 2 | 0 | 0 | 0 | +| PLL | 0 | 2 | 0 | 0 | 0 | ++----------+------+-----------+-----+--------------+--------+ + + +2. Global Clock Resources +------------------------- + ++-----------+-----------+-----------------+------------+---------------+--------------+-------------------+-------------+-----------------+--------------+------------+--------------------------------------------------------------------------+------------------------------------------------+ +| Global Id | Source Id | Driver Type/Pin | Constraint | Site | Clock Region | Load Clock Region | Clock Loads | Non-Clock Loads | Clock Period | Clock | Driver Pin | Net | ++-----------+-----------+-----------------+------------+---------------+--------------+-------------------+-------------+-----------------+--------------+------------+--------------------------------------------------------------------------+------------------------------------------------+ +| g0 | src0 | BUFG/O | None | BUFGCTRL_X0Y0 | n/a | 2 | 27 | 0 | 20.000 | clk_fpga_0 | design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O | design_1_i/processing_system7_0/inst/FCLK_CLK0 | ++-----------+-----------+-----------------+------------+---------------+--------------+-------------------+-------------+-----------------+--------------+------------+--------------------------------------------------------------------------+------------------------------------------------+ +* Clock Loads column represents the clock pin loads (pin count) +** Non-Clock Loads column represents the non-clock pin loads (pin count) + + +3. Global Clock Source Details +------------------------------ + ++-----------+-----------+-----------------+------------+----------+--------------+-------------+-----------------+---------------------+--------------+-------------------------------------------------------+-------------------------------------------------------------+ +| Source Id | Global Id | Driver Type/Pin | Constraint | Site | Clock Region | Clock Loads | Non-Clock Loads | Source Clock Period | Source Clock | Driver Pin | Net | ++-----------+-----------+-----------------+------------+----------+--------------+-------------+-----------------+---------------------+--------------+-------------------------------------------------------+-------------------------------------------------------------+ +| src0 | g0 | PS7/FCLKCLK[0] | PS7_X0Y0 | PS7_X0Y0 | X0Y1 | 1 | 0 | 20.000 | clk_fpga_0 | design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] | design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] | ++-----------+-----------+-----------------+------------+----------+--------------+-------------+-----------------+---------------------+--------------+-------------------------------------------------------+-------------------------------------------------------------+ +* Clock Loads column represents the clock pin loads (pin count) +** Non-Clock Loads column represents the non-clock pin loads (pin count) + + +4. Clock Regions: Key Resource Utilization +------------------------------------------ + ++-------------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+ +| | Global Clock | BUFRs | BUFMRs | BUFIOs | MMCM | PLL | GT | PCI | ILOGIC | OLOGIC | FF | LUTM | RAMB18 | RAMB36 | DSP48E2 | ++-------------------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+ +| Clock Region Name | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | Used | Avail | ++-------------------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+ +| X0Y0 | 0 | 12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1100 | 0 | 400 | 0 | 20 | 0 | 10 | 0 | 20 | +| X1Y0 | 1 | 12 | 0 | 4 | 0 | 2 | 0 | 4 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 50 | 0 | 50 | 26 | 1100 | 1 | 350 | 0 | 40 | 0 | 20 | 0 | 20 | +| X0Y1 | 1 | 12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1100 | 0 | 400 | 0 | 20 | 0 | 10 | 0 | 20 | +| X1Y1 | 0 | 12 | 0 | 4 | 0 | 2 | 0 | 4 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 50 | 0 | 50 | 0 | 1100 | 0 | 350 | 0 | 40 | 0 | 20 | 0 | 20 | ++-------------------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+ +* Global Clock column represents track count; while other columns represents cell counts + + +5. Clock Regions : Global Clock Summary +--------------------------------------- + +All Modules ++----+----+----+ +| | X0 | X1 | ++----+----+----+ +| Y1 | 1 | 0 | +| Y0 | 0 | 1 | ++----+----+----+ + + +6. Device Cell Placement Summary for Global Clock g0 +---------------------------------------------------- + ++-----------+-----------------+-------------------+------------+-------------+----------------+-------------+----------+----------------+----------+------------------------------------------------+ +| Global Id | Driver Type/Pin | Driver Region (D) | Clock | Period (ns) | Waveform (ns) | Slice Loads | IO Loads | Clocking Loads | GT Loads | Net | ++-----------+-----------------+-------------------+------------+-------------+----------------+-------------+----------+----------------+----------+------------------------------------------------+ +| g0 | BUFG/O | n/a | clk_fpga_0 | 20.000 | {0.000 10.000} | 27 | 0 | 0 | 0 | design_1_i/processing_system7_0/inst/FCLK_CLK0 | ++-----------+-----------------+-------------------+------------+-------------+----------------+-------------+----------+----------------+----------+------------------------------------------------+ +* Logic Loads column represents load cell count of all cell types other than IO, GT and clock resources +** IO Loads column represents load cell count of IO types +*** Clocking Loads column represents load cell count that are clock resources (global clock buffer, MMCM, PLL, etc) +**** GT Loads column represents load cell count of GT types + + ++----+----+-----+ +| | X0 | X1 | ++----+----+-----+ +| Y1 | 1 | 0 | +| Y0 | 0 | 26 | ++----+----+-----+ + + +7. Clock Region Cell Placement per Global Clock: Region X1Y0 +------------------------------------------------------------ + ++-----------+-------+-----------------+------------+-------------+-----------------+----+--------+------+-----+----+------+-----+---------+------------------------------------------------+ +| Global Id | Track | Driver Type/Pin | Constraint | Clock Loads | Non-Clock Loads | FF | LUTRAM | RAMB | DSP | GT | MMCM | PLL | Hard IP | Net | ++-----------+-------+-----------------+------------+-------------+-----------------+----+--------+------+-----+----+------+-----+---------+------------------------------------------------+ +| g0 | n/a | BUFG/O | None | 26 | 0 | 26 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | design_1_i/processing_system7_0/inst/FCLK_CLK0 | ++-----------+-------+-----------------+------------+-------------+-----------------+----+--------+------+-----+----+------+-----+---------+------------------------------------------------+ +* Clock Loads column represents the clock pin loads (pin count) +** Non-Clock Loads column represents the non-clock pin loads (pin count) +*** Columns FF, LUTRAM, RAMB through 'Hard IP' represents load cell counts + + +8. Clock Region Cell Placement per Global Clock: Region X0Y1 +------------------------------------------------------------ + ++-----------+-------+-----------------+------------+-------------+-----------------+----+--------+------+-----+----+------+-----+---------+------------------------------------------------+ +| Global Id | Track | Driver Type/Pin | Constraint | Clock Loads | Non-Clock Loads | FF | LUTRAM | RAMB | DSP | GT | MMCM | PLL | Hard IP | Net | ++-----------+-------+-----------------+------------+-------------+-----------------+----+--------+------+-----+----+------+-----+---------+------------------------------------------------+ +| g0 | n/a | BUFG/O | None | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | design_1_i/processing_system7_0/inst/FCLK_CLK0 | ++-----------+-------+-----------------+------------+-------------+-----------------+----+--------+------+-----+----+------+-----+---------+------------------------------------------------+ +* Clock Loads column represents the clock pin loads (pin count) +** Non-Clock Loads column represents the non-clock pin loads (pin count) +*** Columns FF, LUTRAM, RAMB through 'Hard IP' represents load cell counts + + + +# Location of BUFG Primitives +set_property LOC BUFGCTRL_X0Y0 [get_cells design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG] + +# Location of IO Primitives which is load of clock spine + +# Location of clock ports + +# Clock net "design_1_i/processing_system7_0/inst/FCLK_CLK0" driven by instance "design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG" located at site "BUFGCTRL_X0Y0" +#startgroup +create_pblock {CLKAG_design_1_i/processing_system7_0/inst/FCLK_CLK0} +add_cells_to_pblock [get_pblocks {CLKAG_design_1_i/processing_system7_0/inst/FCLK_CLK0}] [get_cells -filter { PRIMITIVE_GROUP != I/O && IS_PRIMITIVE==1 && PRIMITIVE_LEVEL !=INTERNAL } -of_object [get_pins -filter {DIRECTION==IN} -of_objects [get_nets -hierarchical -filter {PARENT=="design_1_i/processing_system7_0/inst/FCLK_CLK0"}]]] +resize_pblock [get_pblocks {CLKAG_design_1_i/processing_system7_0/inst/FCLK_CLK0}] -add {CLOCKREGION_X0Y1:CLOCKREGION_X0Y1 CLOCKREGION_X1Y0:CLOCKREGION_X1Y0} +#endgroup diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_control_sets_placed.rpt b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_control_sets_placed.rpt new file mode 100644 index 0000000..d90640a --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_control_sets_placed.rpt @@ -0,0 +1,67 @@ +Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +--------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +| Date : Fri Aug 17 17:45:07 2018 +| Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +| Command : report_control_sets -verbose -file design_1_wrapper_control_sets_placed.rpt +| Design : design_1_wrapper +| Device : xc7z010 +--------------------------------------------------------------------------------------------- + +Control Set Information + +Table of Contents +----------------- +1. Summary +2. Histogram +3. Flip-Flop Distribution +4. Detailed Control Set Information + +1. Summary +---------- + ++----------------------------------------------------------+-------+ +| Status | Count | ++----------------------------------------------------------+-------+ +| Number of unique control sets | 2 | +| Unused register locations in slices containing registers | 12 | ++----------------------------------------------------------+-------+ + + +2. Histogram +------------ + ++--------+--------------+ +| Fanout | Control Sets | ++--------+--------------+ +| 2 | 1 | +| 16+ | 1 | ++--------+--------------+ + + +3. Flip-Flop Distribution +------------------------- + ++--------------+-----------------------+------------------------+-----------------+--------------+ +| Clock Enable | Synchronous Set/Reset | Asynchronous Set/Reset | Total Registers | Total Slices | ++--------------+-----------------------+------------------------+-----------------+--------------+ +| No | No | No | 2 | 1 | +| No | No | Yes | 0 | 0 | +| No | Yes | No | 50 | 7 | +| Yes | No | No | 0 | 0 | +| Yes | No | Yes | 0 | 0 | +| Yes | Yes | No | 0 | 0 | ++--------------+-----------------------+------------------------+-----------------+--------------+ + + +4. Detailed Control Set Information +----------------------------------- + ++-------------------------------------------------+---------------+-----------------------------+------------------+----------------+ +| Clock Signal | Enable Signal | Set/Reset Signal | Slice Load Count | Bel Load Count | ++-------------------------------------------------+---------------+-----------------------------+------------------+----------------+ +| design_1_i/processing_system7_0/inst/FCLK_CLK0 | | | 1 | 2 | +| design_1_i/processing_system7_0/inst/FCLK_CLK0 | | design_1_i/led_0/inst/clear | 7 | 50 | ++-------------------------------------------------+---------------+-----------------------------+------------------+----------------+ + + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_opted.pb b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_opted.pb new file mode 100644 index 0000000000000000000000000000000000000000..8ebaa788697aa1bbb8ab2b30bd329d93fcb4a328 GIT binary patch literal 37 scmd;LGcqtV(KDRH% + Ruledeck: default + Max violations: + Violations found: 0 ++------+----------+-------------+------------+ +| Rule | Severity | Description | Violations | ++------+----------+-------------+------------+ ++------+----------+-------------+------------+ + +2. REPORT DETAILS +----------------- + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_routed.pb b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_drc_routed.pb new file mode 100644 index 0000000000000000000000000000000000000000..8ebaa788697aa1bbb8ab2b30bd329d93fcb4a328 GIT binary patch literal 37 scmd;LGcqtV(KDRH% + Ruledeck: default + Max violations: + Violations found: 0 ++------+----------+-------------+------------+ +| Rule | Severity | Description | Violations | ++------+----------+-------------+------------+ ++------+----------+-------------+------------+ + +2. REPORT DETAILS +----------------- + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_io_placed.rpt b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_io_placed.rpt new file mode 100644 index 0000000..7685650 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_io_placed.rpt @@ -0,0 +1,267 @@ +Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +| Date : Fri Aug 17 17:45:07 2018 +| Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +| Command : report_io -file design_1_wrapper_io_placed.rpt +| Design : design_1_wrapper +| Device : xc7z010 +| Speed File : -1 +| Package : clg225 +| Package Version : FINAL 2012-11-02 +| Package Pin Delay Version : VERS. 2.0 2012-11-02 +------------------------------------------------------------------------------------------------- + +IO Information + +Table of Contents +----------------- +1. Summary +2. IO Assignments by Package Pin + +1. Summary +---------- + ++---------------+ +| Total User IO | ++---------------+ +| 87 | ++---------------+ + + +2. IO Assignments by Package Pin +-------------------------------- + ++------------+-------------------+------------+-------------------------+-------------+--------------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+------+------------------+--------------+-------------------+--------------+ +| Pin Number | Signal Name | Bank Type | Pin Name | Use | IO Standard | IO Bank | Drive (mA) | Slew | On-Chip Termination | Off-Chip Termination | Voltage | Constraint | Pull Type | DQS Bias | Vref | Signal Integrity | Pre Emphasis | Lvds Pre Emphasis | Equalization | ++------------+-------------------+------------+-------------------------+-------------+--------------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+------+------------------+--------------+-------------------+--------------+ +| A1 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| A2 | DDR_dq[1] | | PS_DDR_DQ1_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| A3 | DDR_dq[7] | | PS_DDR_DQ7_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| A4 | DDR_dq[5] | | PS_DDR_DQ5_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| A5 | FIXED_IO_mio[1] | | PS_MIO1_500 | OUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| A6 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | | | | +| A7 | FIXED_IO_mio[3] | | PS_MIO3_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| A8 | FIXED_IO_mio[2] | | PS_MIO2_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| A9 | FIXED_IO_mio[5] | | PS_MIO5_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| A10 | FIXED_IO_mio[6] | | PS_MIO6_500 | OUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| A11 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| A12 | FIXED_IO_mio[30] | | PS_MIO52_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| A13 | FIXED_IO_mio[26] | | PS_MIO38_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| A14 | FIXED_IO_mio[23] | | PS_MIO35_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| A15 | FIXED_IO_mio[16] | | PS_MIO28_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| B1 | DDR_dm[0] | | PS_DDR_DM0_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| B2 | DDR_dqs_n[0] | | PS_DDR_DQS_N0_502 | INOUT | DIFF_SSTL135_T_DCI | | | FAST | | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| B3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | | | | +| B4 | DDR_dq[4] | | PS_DDR_DQ4_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| B5 | FIXED_IO_mio[9] | | PS_MIO9_500 | IN | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| B6 | FIXED_IO_mio[8] | | PS_MIO8_500 | OUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| B7 | FIXED_IO_mio[12] | | PS_MIO12_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| B8 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| B9 | FIXED_IO_mio[14] | | PS_MIO14_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| B10 | FIXED_IO_mio[11] | | PS_MIO11_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| B11 | FIXED_IO_ps_srstb | | PS_SRST_B_501 | BIDIR | LVCMOS33 | | 12 | FAST | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| B12 | FIXED_IO_mio[28] | | PS_MIO48_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| B13 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | | | | +| B14 | FIXED_IO_mio[24] | | PS_MIO36_501 | IN | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| B15 | FIXED_IO_mio[18] | | PS_MIO30_501 | OUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| C1 | DDR_dq[3] | | PS_DDR_DQ3_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| C2 | DDR_dqs_p[0] | | PS_DDR_DQS_P0_502 | INOUT | DIFF_SSTL135_T_DCI | | | FAST | | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| C3 | DDR_dq[6] | | PS_DDR_DQ6_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| C4 | DDR_dq[2] | | PS_DDR_DQ2_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| C5 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| C6 | FIXED_IO_mio[13] | | PS_MIO13_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| C7 | FIXED_IO_ps_clk | | PS_CLK_500 | BIDIR | LVCMOS33 | | 12 | FAST | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| C8 | FIXED_IO_mio[4] | | PS_MIO4_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| C9 | FIXED_IO_ps_porb | | PS_POR_B_500 | BIDIR | LVCMOS33 | | 12 | FAST | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| C10 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | | | | +| C11 | FIXED_IO_mio[21] | | PS_MIO33_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| C12 | FIXED_IO_mio[19] | | PS_MIO31_501 | IN | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| C13 | FIXED_IO_mio[31] | | PS_MIO53_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| C14 | FIXED_IO_mio[25] | | PS_MIO37_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| C15 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| D1 | DDR_dq[9] | | PS_DDR_DQ9_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| D2 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| D3 | DDR_dm[1] | | PS_DDR_DM1_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| D4 | DDR_dq[0] | | PS_DDR_DQ0_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| D5 | | Dedicated | INIT_B_0 | Config | | 0 | | | | | | | | | | | | | | +| D6 | FIXED_IO_mio[10] | | PS_MIO10_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| D7 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | | | | +| D8 | FIXED_IO_mio[0] | | PS_MIO0_500 | IN | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| D9 | FIXED_IO_mio[7] | | PS_MIO7_500 | OUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| D10 | FIXED_IO_mio[15] | | PS_MIO15_500 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | | | | +| D11 | FIXED_IO_mio[17] | | PS_MIO29_501 | IN | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| D12 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| D13 | FIXED_IO_mio[29] | | PS_MIO49_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| D14 | FIXED_IO_mio[27] | | PS_MIO39_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| D15 | FIXED_IO_mio[22] | | PS_MIO34_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| E1 | DDR_dq[8] | | PS_DDR_DQ8_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| E2 | DDR_dq[10] | | PS_DDR_DQ10_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| E3 | DDR_dq[11] | | PS_DDR_DQ11_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| E4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | | | | +| E5 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| E6 | | Dedicated | VCCBATT_0 | Config | | 0 | | | | | | | | | | | | | | +| E7 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| E8 | | | RSVDGND | GND | | | | | | | | | | | | | | | | +| E9 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| E10 | | | VCCINT | VCCINT | | | | | | | | | | | | | | | | +| E11 | | High Range | IO_L2P_T0_AD8P_35 | User IO | | 35 | | | | | | | | | | | | | | +| E12 | | High Range | IO_L2N_T0_AD8N_35 | User IO | | 35 | | | | | | | | | | | | | | +| E13 | | High Range | IO_L1N_T0_AD0N_35 | User IO | | 35 | | | | | | | | | | | | | | +| E14 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | | | | +| E15 | FIXED_IO_mio[20] | | PS_MIO32_501 | INOUT | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | | | | +| F1 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | | | | +| F2 | DDR_dqs_n[1] | | PS_DDR_DQS_N1_502 | INOUT | DIFF_SSTL135_T_DCI | | | FAST | | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| F3 | DDR_dq[12] | | PS_DDR_DQ12_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| F4 | | | PS_DDR_VREF0_502 | PSS IO | | | | | | | | | | | | | | | | +| F5 | | | VCCPLL | PSS VCCPLL | | | | | | | | | | | | | | | | +| F6 | | Dedicated | CFGBVS_0 | Config | | 0 | | | | | 3.30 | | | | | | | | | +| F7 | | Dedicated | VCCADC_0 | XADC | | 0 | | | | | | | | | | | | | | +| F8 | | Dedicated | GNDADC_0 | XADC | | 0 | | | | | | | | | | | | | | +| F9 | | | VCCINT | VCCINT | | | | | | | | | | | | | | | | +| F10 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| F11 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | | | | +| F12 | | High Range | IO_L1P_T0_AD0P_35 | User IO | | 35 | | | | | | | | | | | | | | +| F13 | | High Range | IO_L3P_T0_DQS_AD1P_35 | User IO | | 35 | | | | | | | | | | | | | | +| F14 | | High Range | IO_L3N_T0_DQS_AD1N_35 | User IO | | 35 | | | | | | | | | | | | | | +| F15 | | High Range | IO_L5N_T0_AD9N_35 | User IO | | 35 | | | | | | | | | | | | | | +| G1 | DDR_dq[13] | | PS_DDR_DQ13_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| G2 | DDR_dqs_p[1] | | PS_DDR_DQS_P1_502 | INOUT | DIFF_SSTL135_T_DCI | | | FAST | | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| G3 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| G4 | | | RSVDVCC1 | Reserved | | | | | | | | | | | | | | | | +| G5 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| G6 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | | | | +| G7 | | Dedicated | VP_0 | XADC | | 0 | | | | | | | | | | | | | | +| G8 | | Dedicated | VREFN_0 | XADC | | 0 | | | | | | | | | | | | | | +| G9 | | Dedicated | TCK_0 | Config | | 0 | | | | | | | | | | | | | | +| G10 | | | VCCINT | VCCINT | | | | | | | | | | | | | | | | +| G11 | | High Range | IO_L1P_T0_34 | User IO | | 34 | | | | | | | | | | | | | | +| G12 | | High Range | IO_L2P_T0_34 | User IO | | 34 | | | | | | | | | | | | | | +| G13 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| G14 | | High Range | IO_L3P_T0_DQS_PUDC_B_34 | User IO | | 34 | | | | | | | | | | | | | | +| G15 | | High Range | IO_L5P_T0_AD9P_35 | User IO | | 35 | | | | | | | | | | | | | | +| H1 | DDR_dq[14] | | PS_DDR_DQ14_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| H2 | DDR_dq[15] | | PS_DDR_DQ15_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| H3 | FIXED_IO_ddr_vrp | | PS_DDR_VRP_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| H4 | | | RSVDVCC3 | Reserved | | | | | | | | | | | | | | | | +| H5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | | | | +| H6 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| H7 | | Dedicated | VREFP_0 | XADC | | 0 | | | | | | | | | | | | | | +| H8 | | Dedicated | VN_0 | XADC | | 0 | | | | | | | | | | | | | | +| H9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | | | | +| H10 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| H11 | | High Range | IO_L6P_T0_34 | User IO | | 34 | | | | | | | | | | | | | | +| H12 | | High Range | IO_L1N_T0_34 | User IO | | 34 | | | | | | | | | | | | | | +| H13 | | High Range | IO_L2N_T0_34 | User IO | | 34 | | | | | | | | | | | | | | +| H14 | | High Range | IO_L3N_T0_DQS_34 | User IO | | 34 | | | | | | | | | | | | | | +| H15 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | | | | +| J1 | DDR_addr[10] | | PS_DDR_A10_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| J2 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | | | | +| J3 | FIXED_IO_ddr_vrn | | PS_DDR_VRN_502 | INOUT | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | | | | +| J4 | | | RSVDVCC2 | Reserved | | | | | | | | | | | | | | | | +| J5 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| J6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | | | | +| J7 | | Dedicated | DXP_0 | Temp Sensor | | 0 | | | | | | | | | | | | | | +| J8 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | | | | +| J9 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| J10 | | | VCCINT | VCCINT | | | | | | | | | | | | | | | | +| J11 | | High Range | IO_L6N_T0_VREF_34 | User IO | | 34 | | | | | | | | | | | | | | +| J12 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | | | | +| J13 | | High Range | IO_L5P_T0_34 | User IO | | 34 | | | | | | | | | | | | | | +| J14 | | High Range | IO_L5N_T0_34 | User IO | | 34 | | | | | | | | | | | | | | +| J15 | | High Range | IO_L4P_T0_34 | User IO | | 34 | | | | | | | | | | | | | | +| K1 | DDR_addr[14] | | PS_DDR_A14_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| K2 | DDR_addr[13] | | PS_DDR_A13_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| K3 | DDR_odt | | PS_DDR_ODT_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| K4 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| K5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | | | | +| K6 | | Dedicated | PROGRAM_B_0 | Config | | 0 | | | | | | | | | | | | | | +| K7 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| K8 | | Dedicated | VCCO_0 | VCCO | | 0 | | | | | 3.30 | | | | | | | | | +| K9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | | | | +| K10 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| K11 | | High Range | IO_L11P_T1_SRCC_34 | User IO | | 34 | | | | | | | | | | | | | | +| K12 | | High Range | IO_L11N_T1_SRCC_34 | User IO | | 34 | | | | | | | | | | | | | | +| K13 | | High Range | IO_L10P_T1_34 | User IO | | 34 | | | | | | | | | | | | | | +| K14 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| K15 | led_op | High Range | IO_L4N_T0_34 | OUTPUT | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| L1 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| L2 | DDR_addr[11] | | PS_DDR_A11_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| L3 | DDR_cke | | PS_DDR_CKE_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| L4 | DDR_reset_n | | PS_DDR_DRST_B_502 | INOUT | SSTL135 | | | FAST | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| L5 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| L6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | | | | +| L7 | | Dedicated | TDI_0 | Config | | 0 | | | | | | | | | | | | | | +| L8 | | Dedicated | TDO_0 | Config | | 0 | | | | | | | | | | | | | | +| L9 | | Dedicated | TMS_0 | Config | | 0 | | | | | | | | | | | | | | +| L10 | | | VCCINT | VCCINT | | | | | | | | | | | | | | | | +| L11 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| L12 | | High Range | IO_L12P_T1_MRCC_34 | User IO | | 34 | | | | | | | | | | | | | | +| L13 | | High Range | IO_L10N_T1_34 | User IO | | 34 | | | | | | | | | | | | | | +| L14 | | High Range | IO_L9P_T1_DQS_34 | User IO | | 34 | | | | | | | | | | | | | | +| L15 | | High Range | IO_L8P_T1_34 | User IO | | 34 | | | | | | | | | | | | | | +| M1 | DDR_addr[2] | | PS_DDR_A2_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| M2 | DDR_addr[12] | | PS_DDR_A12_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| M3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | | | | +| M4 | DDR_addr[3] | | PS_DDR_A3_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| M5 | DDR_addr[7] | | PS_DDR_A7_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| M6 | DDR_ba[0] | | PS_DDR_BA0_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| M7 | | Dedicated | DONE_0 | Config | | 0 | | | | | | | | | | | | | | +| M8 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| M9 | | High Range | IO_L19P_T3_34 | User IO | | 34 | | | | | | | | | | | | | | +| M10 | | High Range | IO_L21P_T3_DQS_34 | User IO | | 34 | | | | | | | | | | | | | | +| M11 | | High Range | IO_L21N_T3_DQS_34 | User IO | | 34 | | | | | | | | | | | | | | +| M12 | | High Range | IO_L12N_T1_MRCC_34 | User IO | | 34 | | | | | | | | | | | | | | +| M13 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | | | | +| M14 | | High Range | IO_L9N_T1_DQS_34 | User IO | | 34 | | | | | | | | | | | | | | +| M15 | | High Range | IO_L8N_T1_34 | User IO | | 34 | | | | | | | | | | | | | | +| N1 | DDR_addr[1] | | PS_DDR_A1_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| N2 | DDR_ck_n | | PS_DDR_CKN_502 | IN | DIFF_SSTL135 | | | FAST | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| N3 | DDR_ck_p | | PS_DDR_CKP_502 | IN | DIFF_SSTL135 | | | FAST | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| N4 | DDR_addr[9] | | PS_DDR_A9_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| N5 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| N6 | DDR_ba[2] | | PS_DDR_BA2_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| N7 | | High Range | IO_L22P_T3_34 | User IO | | 34 | | | | | | | | | | | | | | +| N8 | | High Range | IO_L22N_T3_34 | User IO | | 34 | | | | | | | | | | | | | | +| N9 | | High Range | IO_L19N_T3_VREF_34 | User IO | | 34 | | | | | | | | | | | | | | +| N10 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | | | | +| N11 | | High Range | IO_L13P_T2_MRCC_34 | User IO | | 34 | | | | | | | | | | | | | | +| N12 | | High Range | IO_L13N_T2_MRCC_34 | User IO | | 34 | | | | | | | | | | | | | | +| N13 | | High Range | IO_L7P_T1_34 | User IO | | 34 | | | | | | | | | | | | | | +| N14 | | High Range | IO_L7N_T1_34 | User IO | | 34 | | | | | | | | | | | | | | +| N15 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| P1 | DDR_addr[0] | | PS_DDR_A0_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| P2 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| P3 | DDR_addr[4] | | PS_DDR_A4_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| P4 | DDR_addr[5] | | PS_DDR_A5_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| P5 | DDR_addr[6] | | PS_DDR_A6_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| P6 | DDR_addr[8] | | PS_DDR_A8_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| P7 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | | | | +| P8 | | High Range | IO_L23P_T3_34 | User IO | | 34 | | | | | | | | | | | | | | +| P9 | | High Range | IO_L23N_T3_34 | User IO | | 34 | | | | | | | | | | | | | | +| P10 | | High Range | IO_L24P_T3_34 | User IO | | 34 | | | | | | | | | | | | | | +| P11 | | High Range | IO_L16P_T2_34 | User IO | | 34 | | | | | | | | | | | | | | +| P12 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| P13 | | High Range | IO_L18P_T2_34 | User IO | | 34 | | | | | | | | | | | | | | +| P14 | | High Range | IO_L18N_T2_34 | User IO | | 34 | | | | | | | | | | | | | | +| P15 | | High Range | IO_L15P_T2_DQS_34 | User IO | | 34 | | | | | | | | | | | | | | +| R1 | DDR_ba[1] | | PS_DDR_BA1_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| R2 | DDR_cs_n | | PS_DDR_CS_B_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| R3 | DDR_we_n | | PS_DDR_WE_B_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| R4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | | | | +| R5 | DDR_cas_n | | PS_DDR_CAS_B_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| R6 | DDR_ras_n | | PS_DDR_RAS_B_502 | OUT | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | | | | +| R7 | | High Range | IO_L20P_T3_34 | User IO | | 34 | | | | | | | | | | | | | | +| R8 | | High Range | IO_L20N_T3_34 | User IO | | 34 | | | | | | | | | | | | | | +| R9 | | | GND | GND | | | | | | | 0.0 | | | | | | | | | +| R10 | | High Range | IO_L24N_T3_34 | User IO | | 34 | | | | | | | | | | | | | | +| R11 | | High Range | IO_L16N_T2_34 | User IO | | 34 | | | | | | | | | | | | | | +| R12 | | High Range | IO_L17P_T2_34 | User IO | | 34 | | | | | | | | | | | | | | +| R13 | | High Range | IO_L17N_T2_34 | User IO | | 34 | | | | | | | | | | | | | | +| R14 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | | | | +| R15 | | High Range | IO_L15N_T2_DQS_34 | User IO | | 34 | | | | | | | | | | | | | | ++------------+-------------------+------------+-------------------------+-------------+--------------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+------+------------------+--------------+-------------------+--------------+ +* Default value +** Special VCCO requirements may apply. Please consult the device family datasheet for specific guideline on VCCO requirements. + + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_methodology_drc_routed.pb b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_methodology_drc_routed.pb new file mode 100644 index 0000000000000000000000000000000000000000..1e4a6e8ad979d7f3923fa67d009abcc5d25d3af6 GIT binary patch literal 52 zcmd;LGcqtV(=(jJEajV8l98X1pOc?nso literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_methodology_drc_routed.rpt b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_methodology_drc_routed.rpt new file mode 100644 index 0000000..e82779b --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_methodology_drc_routed.rpt @@ -0,0 +1,40 @@ +Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +| Date : Fri Aug 17 17:45:40 2018 +| Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +| Command : report_methodology -file design_1_wrapper_methodology_drc_routed.rpt -pb design_1_wrapper_methodology_drc_routed.pb -rpx design_1_wrapper_methodology_drc_routed.rpx +| Design : design_1_wrapper +| Device : xc7z010clg225-1 +| Speed File : -1 +| Design State : Routed +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Report Methodology + +Table of Contents +----------------- +1. REPORT SUMMARY +2. REPORT DETAILS + +1. REPORT SUMMARY +----------------- + Netlist: netlist + Floorplan: design_1 + Design limits: + Max violations: + Violations found: 1 ++-----------+----------+-------------------------------+------------+ +| Rule | Severity | Description | Violations | ++-----------+----------+-------------------------------+------------+ +| TIMING-18 | Warning | Missing input or output delay | 1 | ++-----------+----------+-------------------------------+------------+ + +2. REPORT DETAILS +----------------- +TIMING-18#1 Warning +Missing input or output delay +An output delay is missing on led_op relative to clock(s) clk_fpga_0 +Related violations: + + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_opt.dcp b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_opt.dcp new file mode 100644 index 0000000000000000000000000000000000000000..38002014040eff5874072e86e6ee22f8cdf597bc GIT binary patch literal 470949 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 <|6-! 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

-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

*%Xk=5|#aBW{XSW1U+Wqg4$kW?daCaE$t+ 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
jU0MBy<~(OpeCUrsXlVkx^#_Bc0lYVv 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 z%0Dshj8ApfUN$(r-M*m*7CT+}u2%?l!#(_BP@Be@Rr?!f;q0j&_8KLVo13w+FguLF zO>Xn5ynqYr-;g4l8JKi-A?*ZE1{cECkJp|UWNUeW!9Cbkcg(}cxPEHvu(&P|{GyRN z^t4`__+wI zMdfR3h6dATKQzX|1Y}oV_*|N7GfdS2k0d!e_kNje*9i6qt$Em$e(6unsQo+pfW0Zv zli|7Fj#?I;c&qSxh%@<_+4A4x0M0nQP(|6M^DPw;o<-k7ih|FHe5urV|8kXdKp+h(0 z`To-*y!%N0`yCTH>w;V+G_bcS~_N5T+Z_j1~7o^_`&fjbf`Z9O3otKRIw%>4W ze!u11V)4}6+i!_7^!~#m2loshhQIgMN2|}?Ce0ECO{DkH?2A#%fCsrxu) z>==rQaWkEj=smJB>SBEB4aWG4azi#%5n-RsyWA?PrpC^J;%R7S1!M14L87)HwD#zN zPobc|O7iy9Kl0tCGBQY>w1%B)>qi3BCEaRG`}e<&a3+T$147z+diWvkt1Uf!>X7TJ zZ8F_b5X040nO^-G7XOypA;z7EZqDQ+WB|0Or^g%O4sGn|vw>WPHp_J5Acog5Mz=*A zM?4Bzc*#HJa*psm2p!eIBqcQ?J9PY$Qa6y>9bQHW1mx`wU!&W@jw5>Rjl5)&x#}al zlOdxWVM$34WJgC}QmPvW3^htP0|JAMZeMd8iGK%fCT0Ks&9{-;u~?&oPsrP`-bT0c z97ounH1U!@@3kJ`4G$TO4NgkB0*HBdQYvX3GswHW+eG^E_o-JUVuP1n|e&bA-bE5J!Y36Y@5w8#y26dhZ};Vyze`7TdpRBT$Bh&8W4m) z54ZO8Yd~}lxA%NdL~=+38sTk_#u9(d>Gz!)Z>tG?@7^mR!;3M%e}(ed_Uf4PE-D0C z-u>WJDleWbf0eAdd>?LtPpUF>w-j0Mek3T30Jm6Ko~|k*guVF<5h>>}*%tcS7yAC$ zb_?gugp*Zk=$_=W_e;eqm-2(pw4BOhJ)4-I4T`T9t-0l9U8>bk{CuN%yuxqS;M6C_ z`#UFztqP3hbKW-&z1~;s{HJrm=lso=-rk*Ox9s={C+$OGKbGM+S4s@le`jg(fJZ+A>UnL(f^V| z%b%HEvvYL*6#cJz;^wwn$i*pF(7tUty;A$~?eL+d(_bsk#xV+!N~_hNeScLg`}EhL zw%3;)HJ(yg{Sf`H6Nvs5dQs;hXt|nCpK&P^xCi#753-TXLN4lnY~;be`_h*Zn3&m$ zK2qm4ktezTEsy`^z^Pl*{dAE-wt-dIw=Apdq<>elKEcN)CXsnT`|m;q(vNvQFwkJH zVq9u_SQGqyl;7X^jMn@r*R%Sa0a6AY)=c>IYQtvcB!{2ePF5KGnX7-&^gLTgwh)2VmFvK(CQ$6p4Ru??Aw<4ZN z{))XwWY?|jU59)QdUr6xVB61%pxGX7H+eBtal%2^?H96cJqL}Po8~GWyBUMRm;@Mbx*xM4nU#`t7kHe2p^=93UzaAT%SRGwA@~&`yAi$^h@P%B< zMryLBXvay}n*0`z`LmZ=vu=g$utMG@uL4xIyz-Nv&(vdkq?# zgdX49);n93(^sl>BXGB^e@)zVP5tP`UZi_loKiKuk;pd&F}9g3 zV=Ij;k+tkC24g0JP$H5o5s9cI)&JxBd;ah9yzl=#-nZlExSG1h-Q4$F=XGA^wcLW? z7L&nA6az8!@6&U0iJU52Z|CN7I1RX_dFIkMp;>Qv<_jGoxd$E|@nn5Jc{d!KnW(9) z4bD8S83QmeyG8SuHaPRP=DBuo<^hx1L@$brn1IUk-3V}I=ZC&U>SJ%YBHq2t3MaR} zJ5R9+cAIzFI>zZg(S9k3azadf4vOp;+BPEMrod;vjt_CZHd*85XJX*Z^7IoV1tytW6|o?7hAFa)c@KkES-nJ1OHI%@_za zDZ2-NppS7{IRHWb*E6s)2WQ7O8e%FqMad!Is&AQueM2@?CzvD`Ls(R2Q+W78(o{zu zbY!Cs4zz4F#H4eI+FuG+9n$qrT%EX*CNgm)nbd!@@62=cK_=p*>wiCLoKa3hYb6(6 zH%>!qCl}&@(Mc{W0Y*2uunw5h$%Wm$p~+~yb*YGDXkUedk>v)o4<>13`5n9h<_~yv z(#VoYs;}bY6=_Q@AK_a>9;hrkug@4T+`K+~yii$wULQMPgn4}kz=$=8Va9m7%u2FZ z5UjVr<7Ze93cwIq5NKfXSP+506tEy}-FnADBu$zuygHXgw@NNt0>(PIa0eKhTJ{VIF`3PzSiQhiIn-1Cu~#42hQI`lIUYnPa7#vfW(J)C|$Uzx)+ zvzPEa9Kjz+j+s_`Rq1zPgC+2}M{t{_@=)jxHk`xd)?Y@Vn|B-C;Qno?PUX8H*~#j2 zO^@9!x5~wqQ*XSS`8v2;b?MIAu}ZEH@Gr3mcP$zJcuwNpYR!N6(bDx%HgeHD=$oUx zZ||F!Z@iP5cxU=k$5$2S9A7P&IKG0Jo{|3^*7a5svYQlg8}>C?nn`et+}sei$<5~FjbDAE zUm>c*@sKLon=a?P^+tb2XgfMvJ|VEFupth+)#XTkqi=3^6g3?u>-7Utt335aKi?K3 zPNv47nE6?T-stDrV))2ZEQ;Aa-OK4F_yLd86)kJ;iH_G+Cy6-yrF#8fEWCNhc%#3@ z>>4!j%EdXzD|Kq(%F*T9+_@pe)}?M6ane>>+-H2tDwr6jZk!My=?e>FzjH{%frEqu zM+E=AR1y^YL+-1@$GA#4?00u(z1G0JYd{kbOaEwI^mJ4=d~C-`v)}4H9F56Mor`d3H^y?=~>{#7#e!G$kD^t(vne_ zAyhjS^3`3-6?I|%ez z{iP0e_uGVI9Ipk~yWjtz+3)yi*S6eTvEHsKI~_+*jQ&%7{;1!BSN%uq@7GKIu3Ro) zRe!9gp&6yx;wGjRm-q7FwX@~FOrJgc3FF>Z7><3q@v`-U^XH<`Me_UC*A=B!|9&tW zp^Q3gsXuwZEO1TOnp`)&qfjE7jjdWO*7~xx>%3hkSmkwCS6xHv?u{ci9sox0r>6Ii zn5gO|S^IR_87+;ry0Gz2r@Y!8Dr3$IIzkvh^`D{OTYgRQcipln{gnHy8<~TRlzhr2 zC7+r`$xq7NdQ)_%|IGamp=Mix0Lo$vB2Dj^Y;Qu`KXcfVqAeysoxY3cVPfV#6J)!+ z*qZ6pS{Ka!H#8L;;XAEaEPyP-e){C5Iq)nm?6RO^p`D3FrIRi5cyi^Lp9UTm^=k4| z$?1xWeHwPc&Y}>I7JoombO33Y30n67q(v2w78gKT;B{1}kmDjtM(raHUvwVDzsKW3 zrqvObOe;Q@%oBChR23&DU+&rmP1&zsYdmYZHtB8>A5wGgaI4cO&-8V_30#+nY|Li#Cm^|*ftU|t4^M;lVVYS?vE%AlFMO8S3{aKfC6jdkJhi zJe@HR*nB8}W>g}R5pE4C1F^0Q_q)P00hJdX9`1yt`DU1;GwgV~qC%ernzw!+)&#Zn zz?Q-ZWz)i4oZ(xT`)(?`rffF2TTu26qb?#%MvI7?m>H>^uAY{Ctvvq^43`>vCZ7(= z#L5Q3)X>tTq$;dRS#E5M_449z*Te!W)HBy4M!C3h3ni5Cmv)pyIgQNxf#uTubG|6U z8Y`ho{JCNzbXUnWEfmY!`S-l~kRi7#1D{rgWqYzzuX4@e>q}EY_EW-<9iqU!XB8|* z6AC@1Q^t4^=hG-Bp`uARZOGT&b;2-Agx6R^Fa;6B5fG)ikSh85`UtFP>&v(5;BSu8 zn$cGDu!QxWIC?Jo=9^P%)BE4Jl}{JGs+$&;T~tZ2+$h<1-uuU^Q1s2~VwzX*8vp7q z+$w(e&1&?;JCf~hgzvoBe|wKo-X$CG_~y?Z<{MkKL(I{fyK|-*?;C=5YcnMGA1$Xw zpZG)N_`-+!)7V|E`YBcR*N~<;#ADJ9Vm~+R$x-M9V%m8>(B@-xVy&~55`VZm#; zS$RwX#sXuAvGB!U27B&N@-zBz%G?%gZU*^6tw-QWAvhP$$@Ip1c8JWpyc|-plVGcW zlW?p0gg~o!opMNri}U2y#;1)Re2pG-O zGI>rbit%2dsy&ws4i*bOy>!NU?6idEXSY8c8-vsxIrA(1{PtXQNpp3yFbUncfCzSD zjS~_4jtE*0hzd^}?Kebmr$XYz{W-#u5q-8)mVxR#(Se$~9a2v*4%$7{5rokm1(a}= zh<*uXCn6v5T!+f@QAFDPu9I%N+3_K^=v%h)$j_e_*hs0hScCf9an8l5*+j{eI3~8w6I%&qRCY-<|lQFRc97nf&Rek)o)Pym0;IvcuexikOQis=$x-pGR@`LgG0BI8<+f)^92c8C(`}&0Uh! zfT|+i?-gWV#aoY@!HSoVMeY^$LA;T^X$pAWN;@U1Kj)4Qh3J;rVwgUE_K_u}x?&Cd ziN_0#g?v<8lVibUnTj$X(|h3z|8X3iEd!zve*B-laJ_YdFB|9T6lQEpxj`7}~c5#_U%2MY&X`ji3r&F&4w|@JzNYp6CUKM8@VB8ukG#nomjOM_J;xgsaBB+ zQd9SpzYue6sdMwyPl!~6n7DXbPrnvm_L!t>B4GA@#%bf4=d|rt8rMfk%N{HI!G(T= zDS%}`Z`Fj^ZtpjB^QoBIwL7eg-!^ZztPIClE-I3eg0U*~#MpMjY957g2ay0H9`9>h)LBcO~6IU z*D|cEO;=K+`fsod!`um$6dC%z#<3zwJnW%^;_ufo(~4e?%t7-tHiH3kJEQXPNk?8I z(H0|2riP-J;~*aEeqh7c=s*JX5HrMB91GSdUZ{yEWGliXB#%~L@Unuw>Z=eknhvqL zK)q-OT(=BSB#=2;5%|iSIiTjQ$ks=QRXr-MtNrZqyc8+h0()2m6r+uV<{vnc)~{@c zk}1*bEz=!hcs4B&jZlPc`=!_N@!D6akTH&X;p_E0xVXHnd~?iy4Ge-(Nu0@>==3Ge3D4%EtV; zRGn*TZmyA2C2MkSzM9h@Yl>&CofG=B2}-$TlyM#^Iw1PSiDR4YVA9W{8>F{S3v+8J6>! zBJP~}XAWZ|ES;Faw`XAo*(ARBQDnz@lrF%O z8^|FWshZ5_Kab?@rCsNcV^_Ti?=x#=Ap_cm8uZz+IFH0NVMP~d;&{18#6OJQb4W=d zaCBLA1P)Gd0FFM6ZQ31@BT+ayYBNX#JqBUPx3%I>Bn(%mq(JGWn3PpGZeKd@a=!i3 zctub-4>5M?bRfL7r-x6>9S%waNU`hiHt2IUF{8RiP|5?JAp&n_=j2jUa=n7xUUihnj@#OAhre&00RNch)w4z*QJ;BWlBm%ab!EqTXDr2kd7U0L*&xZEVo z-G9SSkt1B5J9d(kx^U*CV2XB0>h<*(##`^R*`&qk#)q$bEZ-e5HIWe?GKPL%D&K7| zHDMe0dOrC{to)xv+g$3_`>J=h)$M)5Cagq%HHRX%pZ^KDv-Bm`M8z7Lsy5#9kDkC6 z$yjYtsyf$ld3&*xWYyQ4B;#25jY|3Ft9nZd;S%Xx3TzRw+_Bn()P>M=sgfaMgREuf zxD}=*IWkuMd6S+%9~8G8E8n-JCqRW}vd79(v|{Dcjk#3(-`#%H-=pQKrK6o2O(fY{ z`~T{@5ekRLwwIh3wp0dZN;fvBUxH?i$C?e4A9CK#Nm7fY-7<#Oe}D=HZ0CrjO1Y01 zOALPiXDjcZg)KoPKW?9&v09dTMoK;6PBV_sB4zA5Nw7sAxclE>RlZJxbKln!xJvAx zeZjuF?J(JYzpmJFmK05NqvVB1YHi3y-g-aC^-1deh{2)g zUk2>wV)BnKTq&+?T@(f!zTt5EQ`NWU|Kxp5da5d@Cb{sJMKbKiuLU^`NsZPJ{u>f} z!k0pbe+T9;UWLo*)Mu@SMi!T0l8e4^E4SBQznXkmF6h~3VZW!twYRe0ZxfsV`RlQ_ zd#djV{!LAYG#B#AFZ^8_AA}{};7*Pw}un+=GUHW;2wSg`$yT3#%%D$xL zszs)Ei)hTM>8|YB8wr;}^rQTDMsbL<&QzXv5b3DDH6iy=+=>@bPBtim*O{OGelE#D@9+FW4A4oI_LYz#!A#Ve@SFU z9nCf_6UYEXlS;?h9g!J05;v89e`IbsM}Z+TUKmiS8Ox;QMWD~f1j27GdFMv&tDAU+ zxbAU;vXUrvgN&#k|NDMewn4hOQ;v=cdf6w>FEHy#=SBMVD&ItoLY=awW=&pWmMun~ zOl3kbi-~xI`0O;2MhAqbhulPrLwxa#r59?NlGuu-!sW;m6;$RsJlA*C&dI?Qj3n4K zia*SynxajE%=0`R>%k~q^zW6%vzdYmFhJ82m)qXrbWP;PLajkplb@q(F{h21Vo8%~ zG3N+UvBdY4_Q=YdQG}C4=!a8mw(YQUiKiT~Xg%#B2yCFo+E3AYjvfT9A1^_$iaY0jIeHMh0ep6QWM%-CtBlwY zgK^c}ezG4ZgRqtDc${8A;IjYHG%R=>VDOi-4-^Pkr;~=7`l9W zL{ZSDCRqi`=0R8Q%+*=3UcSdnN-e`0T+2PaVkLBs+co)VbD-#NK+;}+m$QeQtwiK7 zdQKvRljwRJ&~3zR_;b}}o?f~XKF2Cj)lNuldrcmR8^wzHfiO2#IIY>!<5C~xG zh+A+9c1m5?9*by8uEDa6)6^@8I)#SI|7RKi9@n}&=(9|XKTM(+Au~;|TtdVS7o%m2 z0x8=MdpMtnb1@Xc+z%L7Xo9tV7L<|=2i2h$IT^{3K}g4lno=v3I~b=688iv z`imyME*BY*$mlghN~Y3|h|97^B*Q7TQ|g(%&4r|tY@)(-%=3{ZRZ?K37Fz=Mubj`o$`(kgO^K6|lmOW$#I~cB7j<0|#Q@nSn6%3jFE6wn z9CjMZb`{+4T%C5C<%Pqf)Ksj2MDFnzOQ8i;*W@a2Im+lh{-O!im76y$7iCCE&R7*s zVr-1@@}jb9;#DkkmT0mvX{0`6S|xN3{O3*+6{4WyE9T30i}g$rHwZ>MIRfPY882YP zGjlu5hUIOXqVX3TD(81_-tQM8#sk~Ea>s;k{+1!(tqJHA80k7NA7P{rV3uJd_jW1LiLlHhg1C5d)}7zV?t^0iil#JytPA7UTWs1C>3E-I3fg7GT#YS-F( zRu*M_6W#F8P&HJ$@x!R_0=A-`pC!nY__x!rM6B##m>TOz68aF`@`#x~-`QH^)c$w8 z?R*Cg*qgTVGGwX}in$>}&6>dSg!kU2QyTR&lxvnfVsy*bO)qM%UA1rgV{fSp>6HzE zz7HeyeOdIesf={Jio{9e-;Z?tuMW_M!G(4-7rQ2uefX!gDR>TRp7$dpln<$`m?BdRa^Z9R4c zObHCPg=?*Jp#1-3eVMMng~AT9KInKM=oFS9W&FfS2<7~A0iD9Uu4(;P-h5i6&Ovi8 z`icmNav5+&L4sc0?Iqv5ibJ(BI2UOJ%3F#|X+_XMi8?Ha$|NQp@~Ed@R!lEMg%Q2V z->KaHph7yJ)@qA3B}=ckY+`OYoOMK|twCn}c12_D%l8U-jm4H2ZW7fK$@~knAj@rs zCo%>Mn-8VZjKpO#!p~`1EmngJb{K)gEn-FA=jdn~E-%2q>PM`BHSxH%vCsnCH94|5 zkZX9*$A8KFqm)#wN`A$5>&-91-e?m-358<D zkP}e>QKLzt#x^L)Cy=8%{v4yJ2qP~L#S=gj@B4#iJ9;rp_$YvLscl3d{5elEk1<_} zqeYSUPM#yc0fNC?A*&K>F#=@jMHI7do#=gTBkDapkf)x+mhcc?vW^ylc9?Te6@ zBl01lwwW1f4^yzrt3X&0l2)DE#)?x#uxx6|7GV1C4u-_n z`EfL6A^NUSS;T<$BnGsn_nHXB5dT+`lof9!a>gaRM624~WDmq!&Ns~i&wB+FI@Zg9 zLrxD?H)em=yd_CO@6#+7O#S)JAc?zRUDL<|OU-8|{2a9XF~9~m?55Z*9wR3a`$gpF zSFKrXwUy5;;(3?@aP8W1eZ4;ycx)t--E**Z258X&m`;1hH>_@f2h_eDNJs@9()R7v zl@YzVmyiYTZdZg`5U7{XTpKO}HXob2fE!L7s5=Mtr~{#G$&h9&CLl3&cWaV~*(M}> z>lG9C2pcC|B3Z9Z;c00clnzTUF%RB)D<38U(o-aKfW3zmBapZo- z%DLroHBz<;_HZWww}KKX|21MVu6~W?!N!&+Q5p@(s_93Zla$JSUs)rI(O^ zq@*p)_CoKZ)LUm7fU70tp#OEXX5eZhssD1dM@M9?*2q{ERH%{Y>|;ZA5?1Px6+Dxj~a zwWqg?LPJX?uPZyroY47|e%pZMf1tdgo$gbvk9m8>zI$hkvX;Ega?meT(`htIqwm{r z@`J+vxYs-5jG zR^~;?*=zX2p{gnEbjZ9AV2qalv0gZV!gW1r%ZS5DY!H9OoE4gbx~7?8c_rNP=%E5- zs)~A#Rl96ssMVV#wu{HfNd-=sW6aQouRX;sdZyh%K76`R(J-8Lj9g!T98^O0kCa&3 zEtnQ}DNG?MzhcyckW~K+lx3g9uAnMk0(ED({6O77W_nHp5{px32?BdS{!yYEo&hwn zWb!>Y0CR{$IXgJU8g_n^F#VE`iKxKw(`4Sr>|t^_o~;+6k)oyx=~?lCkyCB)1}HTq zNH4?(?wcF|0{Rw^f5P}7g0jdUOCbM{M*9U&-1Z{zmO%a~Mf7n{S=2y4_XqONvmqe= z7{?X&Wiwz2SlKOUwg2sU0e~pK7gAG%1ETysAE^lUedRK|;@y9W4FtC@bprPq&C{qs zP_7A%jhgRt*cIC*>T~lotnmf;pUAT+?$4X`B*SLZSqH z79D^4>!+`}6VUtVwmgJu*ZlkxI%!M#A0&Ox7g`ZtaNL% z=0F4L3!enmMVbJW7-)GiQq{Ih>NyMzm9i&~+-j$px{!??9@28Z|sJ&yCt(yp|1dTV9G4vuiG$!F-=BVeC68q?z zpM=LbwisSA)d$6F0r7wX?X_;xB)+utx(vayjL8xL7S?I7!)$v4Xow z{$o05*;1tq(s@=fx`1YGV2EsFBaYGUgyf#4T@R51TX*1n*3B$kK%u$+K%>^N};?c!^5Yy}}m|Z&Ba0RXnf%c_piRrpJe_sb$z=G(mxfi?sTy%dHkC8%FPUv8Y%P58bv+`LXdL82H8Hp^W# zu_!xS5T0l`@4a;ZaK?DHR1u9VRbA~DD+>^E>LT9YDTX5)RI|`jmMXv~sty>%u&QE- z-z)8bl{q~!`WHms9lH~83-R2K%Hs?u{(Vs7LmeO5zfx*D52{%Upqk}|H3%gh2QIz< zs#$U1!~XniK&BjJZ~6HdN~TDoG6(QnWdZ>uu-a>i=jKT~nIDbBK_PG9J`Z<8y0IP@ z8@oWDh@nNpWOQNz4hY2)Is28}z|paeI)0K-05VhMj*v|;!_PxTA&OWr>On}7nAjTc zsH^f@b)U$vJlGZJKJjtf{41FJT?tMyIwPjOHx0JeajG!Aox_|jhaSxQYxZYHrI;aa zfuv8A``4q(Kl9!j9Zb|eG_ zhW+6be;^yUVG(cs&D5mTI)Fc&z^YsU^JFH=zFMw{`dH|9g2|*@@iOKae3=xL&8UdO zil)-U#bqNSk{P|WNXY?^!ppG(nI@SZAe;38vQ^Optcigo(8zEnfNVNw=&(h4`26_S zBp$zKxONv83qo9lg{HiFtKnigCs+O3xrHK5iTWEC&`9uI)k@E^ET}8i?6;UuMzghL z+*WbD%EoT{Q@PIrg^Rp*cs;;v#vztF{__Vd(*OKEyhvfHCLFgD)I^NuDJ^*8Tg5el>y z)Wzu21+L`=?#M>IOl6pOA-R9kuI~U@J`rrjZe~fsj*D~T_b=ROIH?vZL87W6nS1Hr zd5_zw1jc}T^C2?b2oKFrbNy1+d6(n(dQ-MP@#GP!|m5j;#QTTzk9ht zmG_1*W3ElB4o|aPR3#@#<5jYd*R-iCi`u@4VG!dIZ+tibl=9NqicFT($rKS(W(%Hc z7*M;BmH8v&>j zQ8v!}YPRkCQ{0q&Co`UnTSP+wp&JtdDtYW%6-bj6@B!?hY$M4R^@JDZa6H1NK>f~9 zq)j*Oz{}C!V1eCvOLL{K^AAAEXuwNY`2fpak}S!C4H;EdcV^IbE3#;E7mQiIZZW`S z13q{Fc{{BD@|+(niG;Jp(*^c^cZNeNoQ!UuaEI}tM@3F>_(UNJM|*itlEy%?_2od6 zASf(B_o-%z7nj>?@oZ!f4XUaxWbopc0g8JO@HKA^)m%g$jLJd;e68|4;A>WX4uzm} z37i_kM9L`O_P9NCPXZ3)txuto4rt(%p-)v5|kZb%C49#Lj%Cr zf2i8>T_sXRC|05qbP^c~-Ia4q^ThIA`-@T^GM4;rqP9oWft+3TIY~-2#2PRWk3)=v zeB@n|F#yg|1_7K&(*#h2K)h6>>IDF25Hyr(p02u~^?@1sHh~@SN9#ZI%sYv4PE1{P zYRAip4)ZBY5zsRsp9}xevv&vd4A5u)19~LiK?GP4ECHJsa_4erwsQg#NY!RO-I z!F@^(DWZQp0IL7W(vuiHR!HGCn%)f1a8u#WJ(_ubfSX=mwY_!rfa)0|ai&<&Y`VB! zZWYU>gI!txK}zow+>rkJE4!G0=i9qmFPNAcE`@JVnYhE)*Dip)F&<5dtDWDUHtxO+ zgX;ciJr4%LN6`fODvWg7nm`8%YceoEVFkEPUrxVW-}EHGEwqyeg7)v}uWcVH05e-L zu6+5U?SqC|8{Zy6aVOvv%loEb@VqJZN*X92oYL@E2S|T4 zqG+@Sf)e%>(Z~DlAj%NWk5PH}MWik7ITfADW-I#U&qk&=fId%kB=@2MhOAWW!9zaCq24(?36IvWQr#$Gai&*)H=1Fugsq$XB&g^i&}~{1u`!WQf`Q# z`u21L3Ks^^um%i{{x6tSiNu!x2A7ZM)1k6_1Yo9e0A?OohjySQw_7gHvyrlEv4`uy zcfeX`KIH(+x70B}u8ju?Ac@$F2=$#?<-B^#@itxu~tAyx>jXZ$nx(7J4gRVW|Xpb^VxJ^WV zM&Y_GAiP~zHjoK#5OreCE-yeysivU(LOdR0x6-)8TY69liK;&c5_)p>F@}{}1V)b% zQn-Px*A3m?%7;Hc-OTfaE)}(JscuCc54Z=wO!xn)zlf1CHn0-ca(=F$h3*Qwrp;n` z_kgm!q6AQ?LGoWPV*)(eY}tngJUj$zkdkv8VlLzZaZR3Y4wR)6!Kw@`f+a?PM7@Y) z_640*Ks?K048$}a;-?u|!ZK9RnnT!sDO_caf+Z-FqL#gN!HPSqgg@bDp^1>UrfZrG zmUsC@<G~R#gk9&?Rxey$Ym_-hGoO0UnNi^QuDABV#^SetXEi_XZ>H=XNwC+yyV-i} z?4rlF#H1gukE-YU9==noA;sNib9(f{w)y+2_bioS|bA2_Y}$GiT|Jf2M&qJa_$nri(YOD@QuIUnWBeGyLwD=v1c z;tL0|`4IxC|0H@dvnDv7zmnS?K6Lw$uV!(b6pk)Wyx0MSeuj=o@GMX`|1f7+e0gHN zGaL8i$q(6UABSMy{Yz6%X0b<0ug$o%Fpgr zh%@my%tx&0>-X7O<5&6k)j?y;v8e)gB|5L^(JF7W`IKCWpSWgINw1L8BfZY^4}AQ_ zUDi@@j+Z%}N}>dxJP+b^?z?P%^T-6v^VnCpIFq_d4_w20i`K9MPbIGyT0G%jEAC{C z)Q@g~zNIzv-Bg{{UWsEZURt6 zD#BH)J&0lds2#GXmwLiI%^E4o=5BL}l>TK@;$!|y;)e{Gk*g85eJ{@H3m5cpop^q7 z^;TuO_-9orLKY%-Ny9nnZQtvaW4`-0qB-6?n(d2z*cNWQc4_9-HRiTQ23gY=?mR#7 z&}N~2qAJ{GZM?mq*pr<*YDnR$M9`C4rWeBIn$qGQf~(-tagpwLGNz)kMn<6-s^C|{X5mt=>=|M!(C_pAJwXO{HRmSUPpaR56AFl2q@`JRQkpJ+EZ+) z{2?{wk6(dDIc-C9UqC$B*m84GecMC`>aN||T0f8C&MW^{> zmP5svyjH}`61`{9hYz)b-~8Zjv3`+(0ij+9udA0a;o*LlRboO9LC?-Ua|wxYLTH;9 zodm!9F{-Ku7U}1&D$3Tb{w(-PoT*Av)OIU{ZDxcopFxZ`*?=C!L zrtglOs~{EAk+HP!-9s84P26#gm9gB9=CiE=a(+F`F>%H}&I{<`-XzV8#%5m0{Bu?V zW;`a%Blva@F=EUCA8gWeuqOJ>ek#O8coD3Nf#$nIJ_)<8=dT9L z!X*E)W?cER_NHeXef25x+(Jf)Z%Q9?IOpD#7r$)4-o3}`8J5@`;r{10tH6@ZdpQG6 zSF}lYm01{xMIBnBsCL!Pc{Z9B(ms}kd(>_r!?H7(sq6U8NB-#%MXr7Q)O%aQmRW9c zQY*MW^LDz2a<*ji{&M}wF1==V>FW8aWYLfJo(?LCkg@|tt=C?fE_QK-UKVA#@VvpJ zx@<*&PeyBW;AaH3U3z0o-2=s>%;~Ga8<`-qlMRe=n0jJx1bx#*^LQ;WN$^JUUlOwYVa~TmE8N0| z+Y!-QB%{mge|nGFxBhl1wp&>&TG;sV?KF&4ya{)saQjB*je_p*^>oYwmXBXYd@Vz6 zhCpjt(yAwJj#i6ld@{Y=E{I@qur2D6K_>TCy~+|F+L$`MM_onUdBbZs)xuwT`n8LY z@h!f?^CK#oiWg2xU6;wbM{#^094P15clq0)(v0@4FxT-ed-U>|ofE7i`#3!+_mLp~ z=|bM$gy!B#mBDk8-=_|z_QRn`G}NlZN&mu+ zZQrjiV-$xiTmO-Gs5yN!fVDTYQB-=*VMDh(ufxYv@#n=kGo=8R@p~J!Ea4Hdmmama zEM0gMiS%)0w{bnP&wo5%T>Mz^=UO{ENwIIX4bB#Sv8_fjo2^B1e|@fe{J4&{3k-i1 z9bc5NT-{+2d{OZMgs7Li;!?mYp1b3z8Y^S+X_#v_W<=Yd<$FIuw?AlW;a5Asa#Tff zMQ(Kdw<~(^OIp_PkG!UQM>9AP&$9iVEXz8!z5fd7*(2(w-gu*=vog^3m-Up()hwkK zhjWyoq}HAWWLzs|`EjI#-D2q6F_O|2(z)+J+2v1mD{^|bXOij!RQrkGL6ScUFw3JC zQf^*16eQ_7nLb?0GAT7inlSq}%0JoEH&<4leJa^$X8)v46t%&2_wxy)#22SPl^5L8 z8Xqcd1y1Bxe$GB!Xy^@OpXZ*Y7#TZ3X~L7076`Y=A#ZU#G8idfTn$Gmke!k(m^ zob%${kQE-w+4U$D8a!Vwx0aFrC3!U}(;Qv*!uT!?zJ_Ni((Pmu2{?lE3U$;wr0&;o za|)=0#|Ezl?pRYo{VMCJw88H7t`9O*=Y6v84wM;6v|xVAyqfp6Mb}G6+)DkLHdLeg z!^C!N>wEY1%!SU;3oM6l%%eVQq7_wy_0ubje}a8(>%U6b{ky^vqkAj7jr{Axho~G+ z&iubw7Kh!FYelSb7UE@waBg9T`zI-;r_sBlG5#9d%%7I^y>8^J#AvF^Ssf)sE}*(3Bh)O6C0U4_i|OjSHyL zEz)KupS#C}KC@HUmVZ&1Zg)(1+m`Juk9_s?;Jo&Ip{Wul-ASSb`#)<7%?=;+oGa3d zdPl}S7<93>a0Mn4bK!&qZ0C$me^zeQ7wfa~LebuJ(2mmvkGi?;aKs5pn700UF>R;* zDjA!0iguO*bt0>2`9At*!b0}2KqXXV^Ke!A3V*%h;T7DYCM9Or?ImfQ?03PT?zfR_ zg1VEGfAGqN#$v;@k0{f2jApE?*9E=?%`Zn=_k} zv|S+XM;pA8(*8(;S+#N9O7wG0&zkRk?AwHZSJJvd!Pipy0tA?l<|l=rnhBTCICDht^Fmdy~(slO?NzSA)oEifZ?t zr-!_Cc;}Tf`b*KLF_~*tWRHx~dePC)b8H0`iCcYh@m62X*<;UA_rjSvo%ofLT>=6iZ`ZBmqX`zK+m^n2eUyly(BfaYU<0hj;a(2L&(cPB>u%; zX!(~1Z&TaYgM^R0>cGx&Ph^wI!l*9pjaA2U7l=@!l8|Qi!v$F@GiPT$6>hwpaM(zy zl)Uw3HsOte`Uf%T`JZ=A@DW#k4ouJnWKX-vCfmv z@nt?%Yqz&ro?Ks_ODQn1DE`15D$F(aRYbKk@6?K!%J98I7al)Ccwjv~I2Nrj&GA2u zc{%ah?1^BDUEkH#C$bmiYD0S#JRfmw9GyJ%sPQ=xZ@I&HRf2-G5;W5$TwX3)#Q)jp zV<}>4w-4^{Zu`>I7v=c2#I)R2^~Cu!77UA+F4)K43qO&t#*);uwjlrFiYq@}^b6J=rUZIo?D{Guf>W_wPQe8{ZZ6zjb|R3S%FhiVhWIIpzZ8b9DS-W_I-X?~KJG z@#9(MH8$pcByGFne|^sE*TE?pMnpVltcLDtL!f}7FXnEq#hYd)NX}#p>mIY z+5Mt`QgHux#W~AVb)(_0T_@U*@tR}o5t()@Yh${xJIpD+@Iyt7Uc-&-W1bb1dyfrp zU+)ZtVZ52{xJV`?vAwx3mc-+dt`eKFc23mD;tW!u{p$nvZpPa>o(kIcNQJb@+(U)% zJM!tx=1d~|cN@QS_MX&LZVMjqQ#u_;Hs@HE|E8ehTmm5|wX@WC5QPX=l_M!S;^z_i z`cqbzot0hh@&0xcS0H%Wt^Z)^{#ibQ*~hZh*FJ9#D;&2l=lEviddqL$OuoO9D3V&| z*J?L=$+K}f>5O$*qk=j5bd*tA_~Rfc$VUramdnj?EXRI#e>)jef$}+RJyLX%S9JXj zX)%}6Dq>+MlC)uyJ6?Lup<#Oct?JdYE>VYl2xfvF+`dIziLT3L^h7 z-;Lw;4Xtr|9G43RS(%Rv;m*9ibBM!b7WvLt`HN|gy3%!()l+>BzMt0Cf25DDX1$_5 zM-5>z`KPPvc3(YRjcT{?b#OC2c9uJj#3x++zJn`5refk*^0oD&^2_pxLal$^J>Q&5 z<*c`mc8mKs8G0<&k-_CiQ3(BXdjo7moVB}J^sGXpO!8KkUs}^%-QSZHXz^E(5h|Qr z)s-zhukGc-LxOA<)(j+yT_)PgZ}?0uU)G!aeFNs_z~{g-{7WWkS5fM$OmV?+b z-P23DnUeQt0!+U?bU!uR`)nipBmeTwcBk)(x$>$Ibya`X=3C?$?~O>-iys(9qN07q zup;#<^4TjXGTOguIz)w+_6wO32J*I0(pdfntYKqQd>%|gSEasywzmbV{{=}vw!e)P zy=aBG1KIIOh_DSQW1MM`bDz^#^QJrzP9;XiEFj_+T%y$o;jnD=e5fOV-ZY(-OpD}F zYmFzugBl9G*QljA%!_D+!ODfo-m=+F`p{*+^T!uvK0IZWlo~*Or7Bm zvUTZx3PPvgJcUuj9fh1iifZf$HVWp(wLxB)M2hFk&+UQ$ zwx9B@)e;qFS=gh=KWhqUDj+T(ZH-4?zCWe*MNK9IA)l%($up=~q=0{V!{A+cG|r;o zK@)edTqICYkR?Cs=O^y-0M*IRN_wu{85uMn1ZLmlZWR|v7ITJ@!#BH6=VwM(iz)=# zUzf)jfW;hJ*_V*QdbJj9tSf@ZXV_70Y8Sex#>T*p*l@%|RoqO+G%m&3RRWEMYs+ZD zFZZV=h@1lnuP0|9I8n1i-TpgymyJrY#7&t^FRpY zBijJy7;9e%XY3#p>#zK|YOx|g7gdyy#Tm@X76OBE0*65^v}5F25>Uhwkk-QlsdR~1kgy0{z=1;yg(BxFakp8cb zFNQYmR`$F$X3rZah2pa+5CO^6M>D4KO1HYo9&J4&s`81s2oI{-8V6!WxZ23b#njns zjj2@6KEI@aJxOF?(>kaPPMA_~zaMHe_=F+GZrhuLT@NDKK@N`Mk~?@*a^(C>xtLnK z_Txo`_3K~6=(Oz5Gv#%v7jQJyCm0_Qu)yW6tr9L)!F2~K)4))aV8yMP^Fv$k(VfB{9y2Ht=edT+kdP6zN8z z@KQ7c?(g!1xrX0<=p30Xckf|rKJ}vt!uTL#BPs~e%k*MV52Uy1-&=l z32&Hj2CCDgg3RPLM<-#G!~Vh}M!-;2O}|jwLpzXU`={N9P`efi9aL--{oN`%`bl-b z_d+NPd^N;M5=;6%@4Y0a;8uzt)vV9BX&ZCJeDT}{ev-meIOY{vicf^v|429*zv7+u zd)gg9i9IrH+RBR=;h5U`*Ohm`+M6f?%iN7Wg?hAeYIyQ~X|nHL zFUhMR@jj7-daPtPlULazbnF5-Bgm=zTnMiMw4&gKS3q@rspq|H)4m#4tEjjD1>AAF zfjcg?@#K)Oi74+|;+rHvM;UNxQobdHK4>zvMxH@TfeB^9jn)X*#I(ojGFShUg@D0c zHz1zqV-LOm(r>R-Up95O8&6`Wqko-7E$~ z23YSg-QR@F$Q25A#$w+pRx9rFZsD$U6I0I?fJquu7=XloqZrorGhrwXVPDj15(m>d zr#P=0%MV<|Ba>1?feID3VXW0fCehWQGYF5ssZI7B(KY364~9%gsF1gSyocTN-+?ui$m>5rnlQE|E5{!0J#dX1yR@v} zJ?%I4e5aLqz=#u*@b=O6L$TwFgV z9;P1%aEbD1AD)JmI=-R{*R}r>32$7KI#~+(3AvCt5_FJ{L3LZ=>DSJw77&Jio%=R z0s=8Z*m*&HD4{7%fWEfyx{9c`*xI z@4~)`@gnt*NHC47T&kcE1>ZEXTPU=7La7v;KbdhZ{HX`QE7)ABI$d9vT)B7o)L5rp z{M}AsSQjxWd}OEP-txVxG5+}RdSNmS$I7EWw}4pdWB7|RzRHb>2YUL1;SrltVs zXMo8f+`;LLOoej}UDlaM6phnFxPh0wBnTcOYJV}@p|UrSHa93};d20f%Dbg+=<(q6 zp1G4>JL(iON|*6F*iBMabmO6(c%0E&tg63gF|TtlGDH_(Ms0(H=Z#rY-1#E3ROYGm zxIu(raAPFoJO5d8ETnzCQ_59?IaVjJ*a1}@u2F9Tn{Y!lt*D!W(FJ(AKb*NvaV^ib z(rFZdUf0qxb3A31{!)43>`M7&+j!V4a1k4Z9`1VVP$A%xpiYfBzXv4_Uc70DhTz11 zncj{MGl}lgSQPCZm{Kse67=Vp*Fc(%8M-ahdnKro1`)i_%&pT38_9%PN)a>~c5niw zPWB1Dmbo3MT<}lj&O%yS3!STRwKkGAJ3xzeCeXCZ2(c=WTN0vuXp`2dj5+!+DmjUd zz3+Z_hB&jY)Gro)7>dKy>jXaYr<+o5>=QT-Nj7FNrMvI-Fv!b_x&|?;xtLB~i(@N( zTu%{Qsd`3Gdm+uH#pySg_xb?pzw<=i)yrkqLi%XtSGTRjVmu@c0ziDUab0RQ*5_73 zVw3S+CT}_gqDM%W2V$SH!sMe&8|;3C3I$!!4@{@%seUrD1{6*)ry@sDPZ33S$(Yrk zz^BiLGA~sF-&y)t#~3qt-Yg&cPIBsQ^1ZRDGs*xc{7e=ud}^pKF76$))6i@-_cr44 zqt*q4;|a79g2hrSL`|GoaRYD~*mS`8LzD1TM)wG+yAp7Z^xp(umsKLt_-TqZEwM6S zXY9*B$p93i$UoR0@Pg2ur31RslhZV%xN^6)$%6R~w^m%WUCUiECOFH4lAn|3Ciq0W6GDtMzN^{1oQZ)av4qo7oL zVUlOylq1^X=w#e8><|QEb%SjRPAsJ=hw%wxLV0j;kfP`M6edW{x^;h}K7Z9AJswmK z!#)@&$h0geg)k=v&D7FXvI=DAI8$R)x@3O1l}9TSk4XFDS*?KapG&Ih!m=n%2r4Kv zML6|N{YttGf>EjzcS&D&>xm92<8Imgh~ymty}o+USS@iBJ3Y+i}o&L;A4+xBsAp%oV{ryKOq?aV2 zp^}=WnwKTdhjFEmvON{Y2as`K{C%fAqC*=O#*l`hO33B=F3?KId&&J24J`s~c;*ha zX?M4wibN43r#RM@%6-Az#K+VA5_XYPUCv`9d$UF@z=cf3qfZ$gE^)AEp!o>MBhM!J zu+nTadQA=^b+CPyk?g1ad^c?yogRf1L(A=GzfEcbkDcv_=p}{?FkIhvSOXJbuAv?~ z^?=tv=nC6M_##x;l!i;=sjPwDv9e9OCK)zBpEQkablf>LZjhT!%3Sd#Kxf0%)Hzz+ zs9|*QQ&=_p!SZ$~=!qn$01RNe-0HLfhFqpVWrbjsglxbTgDsviu>iD}&>kuk@ZxnRu{-x8#{5n`%v;Xg!hSfxl`omKXHR3VMIW zN+|w>MnC!2TMPR4=fgcK5LX3z4gnnZ>lAT=~9I#Ms;?+6rhrT%`m3u($q-$;Wp{RM5R`=mq4BY+eT8 zFDzA8#5f6#RZZ+EA~sHQ;Ow(=c%kgq8C5r)O1tCKOQ;}egaeyY+(_Qo-HGXiVseXZ zl2Uh&AI6t{*#Hu4``Gss)R=`CmiU5FqDYwxnQj{KU@E-kQW`MP7;!ndtiPFSLgW4GZjXBUByql?`j!frHSMi> z5BI5`Qq5;O!Z8gVNC8vg13?u*2CbIFi#V<-;7cogb+R9xPw63h^L5?C<8ZeMW8DA z^#SH>T0l)ml0)>#wyg+ht z`TtmJ?Tw&HqU=(2;+~9WM_(KZE9LwG83LsMkrmr*QZQvax|PoljDiCDI18IWoERTg zim4-32ZVFqswvwoweJw&17kWR9!J;X`QWlHdQ>#&$8=LkDte};@f}urYuZXh+@+1V zaFs31otLSl&9R?_sU@->?)D)TDtnq4^Z3Xc*&q`#ac#jmu@ui>Q<|d>nJ5$9aoJw4 zi-dBI#C)`lh=Q@}uAj99I|qtPiFVaWkH_uBijIc3?)WofY?H5Jn=-Fm%^dNqkngEz zsLpdX-IpDDmanKK$iX7`s=H}awE0BEc}6(67uOirAg?xio@Gz!e7s_gc{pNjFjNDBSJuXEZCLD>(v;FJ zQ>h-CVhJ2nYhVq(Q1xD}R?c=+vP>^iLzT+H9y;3@kwCo&iPvMc-dxnuF+W5`uH>+a zyQ5yqY;8?qIg&>?)!dY=*qnSBvvWrnR52hf&f7O6pJ z)~UWIB?ppcl|o2RD%fCqLj{5rcFlV(kK@Fkag5%kaPmPQ&w6HW*psI5u^jt7Q6+*tml5C3C$ zb=3KPpm%zN1q_+-bMm^Ns+eXhpEXqs88o7mNAW%P+*a1w^seWSfw4(hb>JB2_d~I& zz9+OOhtb{owZ2T4r6Q?L)~q2Vwz!7_8@{>Ik(==YPZm)d!}>W7bdFrL9-BWp1e{PC z=(EG!2~?JrwNy`(TfB;iv&?|YbWrJ|!Qpthkb*&0=AM_P1ZeTO2%Rn-X$Yhab}QB* zcb3(wf=9%bGW-tchn!EDFY)jjO%iotFlkD8E#+%w)?3KshaD9;;&S$m2GJbgVm)Z;e z-cC3|K!Da{EBWnm-v$d@>RZ>PU-g^~xr2Kkzl@7wNcwGnfP8sy2LXw$qOr@~vG(VZft$SD zvY}O|*Rqz(!@O|eDI{`ID*@x2rHk{q-KgCSyU#v^Kb|3p2;ndUW4$_>x5Ra zfS2~F!QoF$^{oCMMO`fuiT9s1{+8YQx)OiCim3&f2Vf4qPFx7y$h`vJHAw4pfxn8b zyo3MKpHX_?PH)JmyQ4ao731mSS9u4hr|?Ms43nslD$Gwr~eU*Ek8BwG|2eB=UN@r z#Mnu5JrF_$EO<#W9OYM%d@Dd!XFrPCyGPh(4I9%X+N@xwjMG3lW)|H`!f9Qg8L6Xs z-Z=+4TWeB7BIrK}bGyxQ{G^alrQ*`F5u{TB5#cZ}JMs51FEJajnV{n;8|apGDpEF! zvE-835$Y#|5O}Tr!L3fb+rl+<1HB=@YHm zd%$l{FDc(TMuf<=?*(hz^jk0NAp5K>A{ycLCz?7_mgQ*FHj?@CM-a-KP z4DB(^Rnc&@BgD$%Je{; z24)?P$woBOZ6VUZ4M`Wm#p3AI?4Rverk|v)rr?6Dm=YVEW0$MJG}8DH{$CrNJq%{( z{j}WHwqvPV#WjUC!B|e!KV?>bhVGIz3PzWWpyc3NZ5EunztxEmgWuQq6x8={LzYfU zXq-S4!xwb%1)(BfTm}=Bmk|B33paA=JUwd&w=yi0rd<~wraz1$Pq(a*2WOF#vK^$E$=TCO7}O$1PnZ|Z)Ql>HK`wRtn}efnXMqv@`lCUf&o0+YF>kPuX!q(J zbR)+SEEjwb#p{(c9k}Jf4)BmHY$Aj^+lw>mrK4Dt_t>%k+%4i_>01|H>6y8Rk8L2& zH$H=eCDS%9{L+b4PUZ1*+lx*B&@$@F%nKGReFroo4$14%wTW%3#+~P-IRduCj|Y;x z3vA>3mJBgDKgCEhQk-9SeJN5dkw122mj*f^E*7dFp8c+uw7P=@)!t@`WFkC^FVCgA z$NpQ(2Swqn162$HWErAD52J3eMmPzTJQkYn9Xy%MF%yhY$XN%*497%G<$?6T5T&m- ze)x}=usNw12<*eg#QxscO~}xl!yCNRD1%5I?su-(j#H1V`kZUS@tyUEw8F~JcCoZ2 z07c^Ua@jYzW{H;ZRPp2>j~ZQrsH|h#HZln?(N+!>50K}&;fue=iZ&F|hm1Xl`JE5@D=A#gL)0#1aI*tkz z=!`gy+*2z*{^Y2b=J;|$=4iV{z)TCwf?waSY4>jUwEu{X-ET{NUr&#IaYNe<&M^vu9A?ea;MaKqcczQ!o>hHcLPT`q4bbxhzuoF=aYx-1eVQomVW)( z3vxX2e;GSXMqU{NbZv2b)_?}X?hd9c!zu`k2+57>YBbfp6Z`EeixQD;93(3TmG+H=Qd)NX+eroh%_h-Q!IZY7_|p1;}*D9AG$V$DW1vO zi_!;|S+B%#_QrM9M@EOAjF-g+`?3tVX4Jic_ly@T~VQE|$QC747Xq;;8Gz#_Lnvo+ep5(Xr*Rr_}nRtk< zSSV6cJ!7%=FG{oXzZ)C5Xt4;F{doZjUyw8sXp~pZ* zXm6!wS?JbL!G2U)GOQV=J87%Oz9$5Wj*T7GhG~28cCsy&Pu9E1XLTc^c7eM?f%;Z` zn9$lQ1D#r~?EenA6q^2?gdKirst!mu;xwn}leG|9jqTdcjN?|(>4dgWb@`L;poy@< zZRa}Fq*$png{jEBq=ZMEScYYNdzDI*`PbFVJH`Fgce#bA zLOfUx2CO6yme`vBC58z`ABi7+!UYbj%*Gf_ zv`7>|lEW+d+`0y-H*m)8>L35ORtAcKTsC7-P*KhZNl_|b=cw$on0+T_7 zt2J9+e-qDHaqpz$Szks964HB-X^zT`S5dukcHy6aw`;IWuI2pg+1=h4?nb-3#Xtts zW@_y25+9_A|2)*Ae2iZy%B}cW`YWT0Q49Qr4hh_heK*v3rR^JkxAeg)a&DWId^Fm_ zIP9_ztL|v>8Ew=C|K*ot?XLWCBC+Lg)fF${8$^y-IV0*-wF$+45K4L90`D}ov*Hdr z9%SCxL9E~^&k-CQYO$<-Z)+-9LI z0O}TR{PNND5u?_$2}BYqH$W|p?Wqg1!a=(-{D(BsMWNU<`YY|}KA6JqY;}xJnB3Hf zpsHhUvdS1IT~5My)ZkbMS5F&rP1+aA!pKf{uQl3T5vhUFNQ6ZPK?fl>VkPt}y%m!^xyXFU_l^*6q1JOQ@2> z?t4b|`biJ$UcLsIwtY-kWX$u*u?B?Kmgt?JlYo9?bgcN(ZZF&5$>NsBM*cup8l7iPXU z(e2hR3onB+JlCdU*z}goIx_|Xliip@hqo2-_W~QYj;gXI$;Li`O4Q(~9vu~(Qu8jZ zk~I*;!{heiFB@Q0a|rA6?O*F!u@PIaFYss6a_{nw^7}InSE6vTg|yH9pU+-opW%#j z$pHKH(#Aqa7$wrd#%GYtz9qf>myG+pTU7sLz%aPgwPg2#pT42c`*8BG%#(RC)7mlk z-QbnC1f}ZctZ-!cR;}8%h-@)ZVA8~rNf9~|nMJE-hrlmc>)7VNZPY{Psy98xH*1w# zJUepJgWA!pd=63V5Q(okE3IkaspibB?Qw?!FfAU}uorp_{1Yp>b?=%9=KP0?DNGgb zlvd*M6pBkiPiFmh`R0K^V8ce-gJBbD!J>P`CS?DIUgKrTF6NE#xU^NT`bh5zhE z%SJl`FRKTQ?4GLpvQ8IJ159!Uk6V6|NzN_l*%d8@<2-9-JYbgg<6ZQzZZE+}14 zcfFjvCEwackN?U1j{IyJ;t~TGh7|nR2D9JCrw566fk+;qh~vG3T5l|>(1VHWd`v(i z!V^QuX1v5TPv?Dj%;rrbVdN>l@ln5^AGP`whx~)=l?CdM& z0^-yfrOO!UW5{tR+f+8sePxP_Lw1LI$*xSX5z3T$4f66@B2}>I)0{)x@kXs_YvUM-3`&E^Ff)BiG z$1VGi$lv=DFR*tR7*uSarskp;#o)uXoc&_W48crmJeKC64sjUt|)7qZ5^G}_Pfo!__?~4@43VUj6pcV&Tnf{$QS@OkI!4NI&_w7)=P#HR!*pP3R@mlSOs=G1aq?eK+xdZ7J^9P%-m|=zK~!En zNDk<@K!}s^=HDX07Z<)*Lnz>;eJ)#-83ROf{0`)w@G|{V6qJ)Fv2k<4BYY41NjhX- zRi0s$bI^p*M3|O|A^Qp`g#-b(D~blp9rSszAF21upiz%HdZ9WzT7IPcm*HN9nZJ87 z%Gy->Hd5D34?AUv54IOFM8}I+h{VUn@HHC6n6V%hO?8Sc)Ov_P6la4wR8uS11V~l2 z6%9&JUyo+wa6RzKA%)Dc+Si<;4XxhNaL;3L8J{iO3LiOzKuHbi)6@4~vlJP5qS}G? zcb5tKYrzKfXHxW-$I?M{?>Y$8PTr8h zR3f=9k?x~bq8h*=&lwQ7)j#9ek}bzH&p1` zq@TLML$~zN!ixiW{+E4LIc{EnD(n;vmEB^+9pBNh1~r-mz}^nboQlq93$)c_F<3Z{k1m*Qj>3G5>OR>(w zXu1VLqAa|VoB19_M`??a3GK{us!$gy>7aqJfLgVm|Jr-MmXqmbBAj2Uw5B*;5756G zO?eMI1Dv$}bh1gz0Nj*yL!jeJ=5LLU+N@D&XLi}^Fb*aX-zv_~f9=g7prI2OkNtlx-M%CJn#IP)?=s zd)-`4dayZ#Iml0nja6w_aBu8^<$-0h$fv|uu@9Dol+-E&RIr#yNayz-eEWx)D}DyfbQRv{oX&hfs2ln zrucgh#%-RQ6@v4NfAg7OmtJ6hJKi8`cpuW{l5lMT0CK&Rp5s`mNv;duBgfKbRu`0nVcuAEB{{tvSKDf+5qd~Vq(&Qn>2IJck=kw2(~!T`b5~&c30h&Wi4z3uko(*#iS=4s!VV((j zTmTzCbl#T`W2)$_h#Cu3hAo{S`ikd9MKLkGP-p>*Nd2;rUkcV{rvhJwQW*Xu?`wW z)uVU~H~)XJCPy^%mk%yp>uZf=&)RKM_qo1u|s z2in~{!{Z`F0=VCVa}_bQ>s)YAPYGc+(mO6hQ%*a4H~Z4^Eb_9ECqZ|_5Fx+T90Xhi zxVGK-v7T7)hmc+5*NGZw+$bJ`z-9AGjQ*otzX!cBA@jv|K!rfU6%vqY2ttK%D0X>J zt#Q}U_c;@kTqhem{<#!za4*_Vn_sQVA@CE$|UE>Np#r zH^AS|YS>-#2t>)3U{T%VEac9RnRZ9TUcwW0kd|q?&#MpfPm%H-{iz#pg$3C0O)4c>ncFtXq<#u!H1^dx!wu;(3?(3`L6=NHt%$>KvV zdNTv+Bq9jP0iY(l0n_vz$u`oM1V=bE#Hu>s8A`#F)=s&Lroc?v24R+GC#6_$4??9) zQkQ%oB&?L{F6~WwT|ng}Kvj%FCVbwpeVB5VLO<-F*d}#!Mhlw~Jw6|K1wP)6N2cve zo7NRzxX)JC^`4hDjfT5c6)Ie0H6^!Wa;gf1=IpuiN6EBra7+gtyPnY~IiE)}*P?lU z7L-MTEb=TbT^1$CTY4n0DQ-ETz$oU~w2)xZye&Cps640XS#TDa#;bdY-sp}v%~Ta` zsHlKT++=N;L7s^WqzIb_Bvz5YtiQv&!#B1*I04DUFnPLd1y@-J#)NrHbP=M1Ic6o` zKQtjlzzGB!Ld6|L6WIvWAl`AtCJ9V7Vg6Q%4H6mwI+!mudMj1GyelinUTlUojf#KD zWfe=P2q8UF&|TVn_`+tt>KpOV2a94g(#-be-MT`05fv0sq!=~3LI@3t2Kmo+iBhOw zIq`$9r)Y`=6*nX|KCTCaBI`9~hUGojRcJd>-KON~$IAbSEI7-BBFVNVvSYLR~ zjG+abMfJ!OUyJ_Xqb6xI#UEnfalj2LI&c*<=bdkAt1=G$^Ue(6C_+@OhHx98{Rz ziFe~7M##u`qog?|eHUpxH7~wTyc1Wy5b^ualfP?|g`#)HnOZ0eQJCz8U7Ez1!@_P} zr?NLRv&?m3zHbX~BHbl0b(v!f-ep(B7y5MjE;K|YD0%ZY$wYk;!r_=su`)Aj_HT=X z2QOn8XGR#eRYNt?I2C&dBuS0PIU9!JzW?_sluey9V*DW9I6F9SU*cH(&P{Vpb@D675c;r6WvkCAE>~b$xqO`QxOSLMSN-orZ8+h zw9Z;X4yX$~%H(wHrL$=>2H^2x9;5CWT`($5GR7_B7$?o^YpX5Xyc6o2u%e*LLC-ep zo*Q#nYY!gyUx6=c9Y|3`d3u0{3?m=7KuKan&Uc!wt;OJGXeQV`9kBT(XkeSAAHg=E zM(3&p2+DML6}9NRG~FVo$nA25QSJTPWip~_pEVB%k4|d0B`muRyWE&KJiZZ~l>zW337(D_wZFaj8QpL#E>F#kBn;Zt=q}skQ5-r5J07*3uD^QK;=!sDFxzr&YG{fvDnX z0%<>}m$iFJz>Z{DCXz+F&JUkr9O79P+m|jq^?3Pwg+v9_fhdf>@9B>EuVk%uk{pfe zoF%|VB*|%Y3=eDX6`%I{yp#xr^la-Ogg}ztV2*oC3y_B$o}{i%mL#y`1ml4MnxM~f z?PI09x^r`;eTDAl^x7;vD!D#Lx+jkYJy;XC$4cB?zKnlh0bpl?7FUBbd=m?Lgoc@?xk25*YTbw50l;t@=hCrVzF|w zk+7(cl`LRa5UUG~T9b-++J4_>y>PW-HFrp%LYem}JIt-#Tx*qg-RcVADgHThbyX05 ziXaY=rh%;xO^2mpKFKVTvl@%_*u^RC}Zn*5C6A_iGoNtTUOH~8+`_T!?wsAeD zy`UEWOz8J1j7rkX{Fk$M?0M3B6rJ2CeemfjsM+n*KYVI9EZcW zzRZ=^4FRy-He3j*v90ME$?~#<^|j`Ly2lwg+(Jvj*q|z;8ID}%V~_~2+-NL-v+w(9lgreoP$WZ|n@2N&W6y2j*nPauq0?OH zaqzuG_5OEb1Ya42*ucmte)Z7FDwiX`ubqp?8_G|Ko@RSHdx}8wN6WL)i8sV331{5^ zW=Sa&K&0)Gj`s+JR0>r9C5&&)0`!Kw!`9ze2u=Qq*;YnNLb4sSAyhLt`+JWeH(>E@ z6SK($QDBJ?G!MV_FT8t07M@G~Vi#xqR75gKa^7z|G8X7hsN3s_xQW#f@gjl1(Tz{F5aP6JVP*vv| z+{F0C+~61w#^=)L?6ZPrp09v=X4fu*qOi(fS*1Kvm9e$gQLUU>G$)ojc#0ejTm``EdEZelBeAj*BI{f?xvKOC%AbuI!+i&xVCB4j zhYyoo8GsC#{ctYN6y1Ax?eVv4mIW5ZmUmTjv+1&qw}YqeZN3N2%h|!E^gS1p)1rg$lb8Q+?wU!?g3;<1r-r7mRIdyl&{!jjZ znI1cVsCz3RW67$;m^dyPzUWUP4;;ZL!$q(%UQs_X$2f8zf44#N@r_7^N7MEuMW|z| zt*vXdG?qL`*;2pRojQih9CceJ{FG+&B>_PIqJ&rqsItPq9JJ*Zg!xUoyy;?P1Pg5L z&o?lc8PmvmofuZAx5!vU#9<4v1}zZ;d?3yKSfZo^K)nnzdwjZ_98t`C1f&Q~h9)kJ zrjVifaIWD}m4ZyhWWDhR;MxHofyn)|$e|H~{Y|UI_JX9|h@l+C*hsx?;mkB@d?#vy z6^-ZLVQu<^X<9e&eb;<+QfgzrCf>BETmboieQV*hSYt7({j%dX>f13>k0DeT5C%hG z4nnajuTs@BwpJCqPYGGO6CzKMZ<7IyFO#KW(M8wlDGKv9den%bRH#+rocyEw4V1!G zPaSm-fu!CQOdNjD64S?#6mj~%3WdefxspzAD|CI&|JOk^E9Kw&ysjF8($^iA6Ffpw zXrvDs)KBrG&;%9k5D-0$b85OtAeKuC-&pv~X>ak6%vM_7gu&8-1Ul|yry#`mF$9=Yt&f^?(Io%8cyq9ek@2EoWE=R0+d>w|g2zo40@?r=;4Sn|y4Nlh24m7j2-O?)*1+;}so2R$G@JTGd zW;Q?oH#wNY?I`9Zz!zAeoFU((r@@mv?GQ~E>G1#_WO z=gt%?ckY$AgfZ-3e4i(TgVwzbyRgkSL6FlFfY^VZsIN!}&{#tvVx6bw{KIc4nZas~ zE|t%HmJ9q}8e4J#g4J4jhHFjR-%IXwKL92Svw=ZSo5)Usnc1|&KU&V)W=tWjj!eaZ z_l~5VKRZA5Qm;k;BvDdC-HamMhr>U0wjSVzjX{0c!ssF z9Z+|PLXNN@&f@PTQ@N(JZK4=I{HA#cM%XE{PViCe7T*9T!kI@@V)et~*ztEEUVUl; z>htTOD?;$E1~HVlQA(#SYUfoNh^`6?Yw?QE7wle1JXZ%_S7vq{o7%P*HI(1}Ye>a{6-1c~fh4QYg zoJ^;Lbb1OTMuun0o#0Y_8)nP9QJB7c4`J$^L}qoFjMicKiwMI+&(RMz(rvnkqCBVL zlYDdK1Y-S}jhi|l9zu7eRvg{svm-j+ICF#7&VaOC+7%h!+LN4}0XM>6OpC^^vG4v; z+sSumD)+kBJ|$eE8BF!hxm{#(@?#~~3(5kV0?qis?}TDhwn3G=iHnm@gFf?Bn^sd8 zQXT!*X3FgYpDRO-0u5gM*@iD!*JLbX=n4nx zhVB3IllQHG#;}e2oeftW0`yd5^@s^SeC}$LEKUOG-(PAHi+WLt+luQqRF#gh&$X0B zVtPtfOd|^4B3#O_Yq>Fgi^{T1pdrYtAfFUIWtfW%IvZfYKBf4Z#7QFWXRREJ`vo|L z(hN0`#Fw9_A)wp-LR+ocOY<$@Qbb~U%rq%uQ(beaVU*cqLU?=Fei$S;8HS$fj1pzG zUG0cDDze5?EZ$IDR6#8|h+%dr*=pbDPCi#?Y+K2l?J&wD>&PN0`vA9jy(9J!G)a(g zPeE*m)R>BSEaZmj-L`laK}R`r_O)brTs$;BAd0wXr9y&E15{i#)`xC=?w~01MUu<8 z|D%$6+r$;?KV8eqhzX(i6bik|$^amAs0C0Ly?qG6=JZ8)MBYp#!Quf@#W29v!vq5; zdn9ERbLJb3G3juV;d0L4?k+Xy@j~}{Y}73c96bV+d$U*XZi;oobyn|C5~spP=LJ(W zefp{Fxzar-GKRLuw3~wAjjt!<&*p&`Xbu4W4rZ^II}N!Y>$LaA2-!}ne~KY+3?kB! znXOU6Vqaur#M}|+2X+)?!n01Lu?!#Cbhed)b?_GiBI- zaXP&9OtnE!q-1^a{_Sp|DDu4Xjr1%YAR=FYwTZhthr);e{5qH$*@S2`%6E^c=wU9G zSWa@g;5BtA=WhXJ?35Y;M=H8h1H8?+Iw*4`DStT&lLgYwy|uly1Q9LU`dq_l>{@kV zjlcS^T$P`z_x_`Bqq0P=fTna)?>m zNJA!J@4jN&zb?{FySpd=#!mMj;gBd$hC zibX+$wKuNaY~-qV3N^sW zQNFW^xT$@xD#%3TGDFMDYlF+2^>>l9rBCv!(nX<&QQ2H%8OX8N89Yd2fjvSe^akmx zt^n~rPfEibHy*A42!^!LM$v5Q_h0>CG@m)Ez;Gh?Jj-)kE$WDo-Qop)l^z4mwbck3Ga{}H{{CMPaItakx#3j zthMs^ii%1$7Bs73Zr1b=%japNuE{F{nt5ZaBP-aQ@1>%WWN7tc7N+u?Rg|{nY@k$` z;qSz2u)Z+Q_1kup*TNOVoK~Qr_$jI$MK5_f^2$$@b-WE-(IhH_bx$yZ#F6JIf{p&~ z*g%&wf?B)T(^UWlp=R*v8I-nmCAPvtJ>$G%oRd-?#)%vHt5x-x2GfXLw!ff_{WO~F zG^cxbsgV~oGB-W`p081$HTQLFW#R-D;HCY@U?{ohgcCMO^AH<`j?6AC$eF{(p2|9Dpkt0Cf20O1PPjLAWvU# zEeMkqio;>%o2Gouj^#>IMfj&(_xz3xpuV&?2nNMw?mG z?^x_~p(78RbF#?#6n5!@olX=T`ofSX%P82vk#gg|X4=Pdd`rIl5ZQ;|DXU2%cwEqynR;P)c@7nrnr6Gl_R%@qiZL)3aCk;nX1Zx@*DW z9($QE62tYm)ka(_zdg(2e|#5^X%8q0r~5%O}kg;%#6hzXxj%=>)5tRBZGP!+brtbY{1h09G5Rf0~&dWY~x8_5tPBg z>22ZK#X8hKk06kkwJxX#H|Co(gza zipIx#*(f>TaRR;@sgYe8^ZN+mHV?txxE*Dne8+@H@#&QUOoyIO@o;xA1=C#sgKJBk zdcvxkIKCk$8f!cu<3q4R zJMDgL0!E6;=AmxAn`JMpvct3zw;MQO_7om-#aOzOK{eSU>z{-%+y_0``_+y<0Ftz$ z%4goTZ6U&u`KnaCr%ysJ!}2-?7fePBrH=2L=fd58?dQAS$<1Y$%%}K05e#rqnv*n6 zR#;K9{A-=V|HiMuBodJ2oTHLWyTQr2RosqKdG&$=jRAWh;k=o!1NtEf?e?hR_nBvf zQ!|?h4Ni#mDa&U+xHDl4QwT> znF^$VlY}WW*KssvJrDsq#(IZcQGc}l{-zrY_Hwdcv3kgbJF(Mf!f_sDmrx>D-Z5Hg z5KMF1Uq*UjjY5D=0}K`;IZ)|w_lR{^XY+g5s=?Tf$ryO?=s)|K!bt&FH$J0X6)@D2 z1kU;l>A#CBg6gkm4LQ+fr#TiqwfCyL-;qxFp1*3dR{*1#9AP1D7VTtzI96Ow9e?ZX zCj26w%n8rgEq!Tff-Fp>@DkUe`hP~27L7Egb8~g2`99jY$~#=WMnv9xiI!t>w&nWi z76!-wZOu?hOZU5~4mmq9Q;1wC&DW`aPPDs2r_|!6>hbP!pcqUWYr>BdcK=BVi9N+x z*Lj9iv;W=)e@6!efC100Is=XaEUtBt{Y*XaL>bNDq^h&6Vn=MIqnva-0$>eE-Wi^J z%v}9Qy+R3yg>P~+xg}R;$v>_v!Y82Os5@Su(o0%NrPNgb!cX?BiV9HvII9m3AzcPF zNgR6yOEuCWgTXy9Bxyn%@$g*`)MyNu*{3P}`dmW?_~kr3E+@rds@+#6NssT;$QX{J zCIG5mB(hP)1rnx?j2Z3CBj$MF^5sy;KCK*&@6;A?>>4&BJD%U-|B$$44;(gmQ=xGu ziCX=n01DDGG^Lm7PvGPSC}K4)54fZNekv<=;lIvUDoz7%?>T_t_a9GI`%e2h=hR*m zu*zV8zmJEgr2JM_avX?wTqMqJz z-%(zujQN$l*~M_`x^#)0C$2fpA4ND@&p2-p1Tx_PsUudC)}aulh(oR^T!T$jQUA_Y zLSEcnAbnifLQ5z;KD)nZ=0Y0B&jO=Im>{&S2^n#3hVPN+dzULW; zekk)SM7YvQ#tcP^TPEs|EQz;;InNQSvUe#Mw+|$gj34IQ78eM)?ZZ?agFK+3P&{$U zb7}quttwN_-;G5MwH)Q=Z=V=!-+tB9%h}xNy+!}&7$3O5A%Ql5)i;i7fQvZ>VyO31%U_>FzM0Q(t^0pOQJC@@bhB3qYH-!Moa^{c&% zN-UuPh!6uEYYD^lAda&`*$+>h5H6yV>yVFm5TLn!*lE(@6vJF-nzKrS zdUP(}DeP#?J1Vb(9Im#XpBG=Ps%&g6VevRwX=gwI1@EnS?6XqCFML+SMjKLy`|q%K z5jQ%{_5%Ezs9mi17!@7IhBJgtkZoWyt4=|5)ju8NVa|jn*|(hvy1r;gGFmoU_vu;p z8-~QTv3kK~9vqrZ`9%Xknk&m$r5LHf_;e8#v`s^LV>^#djI`D-Omqr72kdNfIiWvM z-8UJEp@Z6CKpVU84_(7TAbGxYQEcBGj^j_05=vLQR@;|HfWJ@33w9A5u%CUShY>3n zWu=eQmbt+1+n)E-4bhNWpnAa(D3c_2u$xuBv@J#yUGP@O5RSi&r!Hw=nU_9bC^463 zu+n+Y92_ICg%L)GGA+BbS~Jf=&DfmSGv&=e!yrNAPHFgsg-3_KgF~7-%<0(e(Lrxu zT{INOVfSUw~x<<jZ>BNz*Qw6q3Y)yN3tWXvcLvvU4F)qEZc_W*z(z?}xOkDcnUUt(>p1K=xJsL+_tCw}7l)X;H-xZ&9;07k+Oj7}HPqkp?k=a| zD+vk?>S(tUkyWSy2`JRm(A}jq*X=-U2E!@Kbp91OtFQQM%WgYNfUTABh~an6#*>CQ z$D?R%08qUp^mEX@X}gy4w(s$ zWDkdMX+@47ivkt@{!a--f8r-Df26s8TR>gw<_uZw=?fry(z&C2(V0W%5s8P;#@~G>2lb<(wa__c$8+AW zIRLJYOMP^|*DZP#Yc}?xXH|~yD|e|}F?2!K*#X8adTAildJN0C;F-zbr|_>s@$tf& zhFMZ$!u1pbg`*zqKo}0)j4P!n2JyY*e zNhK}ZHk(m}DJ-`iZ243FuZ(v^_^~|#v(GtDg-XI^bLQlehk%!-4kR2~pz~!@ z=GL@{92mxP&Y}lP&MvZFS&AHgikb< zB!deSsdJe%5CESEr7IIw`+a4I-17Myu9;V?to@qpxzB8Tno(LS-UF$D2$E zl;kR&!I9OK@rhi_bwg+w3e(CFpLE;encGb6n=*E{8ZM*s2LVr<}|RRqI@KX=TW zFyB}>;i}Q7>`Q%dkc0?Xo9-X~(cz#BAyoO@9lmYPe6gm6Zx}(`Yc$~31daFouz@n&@lYt~OlX8(o(SBE`|Ep888o@9JG@-8S zF%oVReOM)&xg{W(T6X>HttJ8nCyngIvXQsO4wpMr7u4!o>6ldx!2TsB`75^TcPO(U zRG4sa;Xh_Wvg%vnwW{+QFgeMgEmudmD%br|_gsMAHwdmx0UF+|t^Ca}P0iG)r5LNs z>7q&mHJZF1sl;=?<{PikTK83$&2cAL(&eIbPI5L~7Bn$WDm$n(NvOPe&V6&dPm2EJ zbVX6gb<|AjU;c)0JY9-vj{O#qPX~m+uV;1QV+N4OSV0>utKFZC;b9 z@MA?!&Ts?w+8>}4u77}|I8LWlI~3|;nBbJg)ySnN(@(7b z;VdVS<(8g+gWX|9{gD{d)ISamt{gfZXW0s4&xv4)7LX1LQH!T`S zg&otlBo>D?P+bVljqp_Zn_PaA9(vK(@swUUuC8WEL<<&Op4>Im-zZ%g`PK1Tm~NXz zg!YeTnG|wElIPgGFuT329RI1fTCf)kCuj?CNYzfDkCxRt>4@!7L1RdWr}lmHL0zIZ z4$oRsH1vgjc~?ciHmId|eX*E1j)MRHwZ`5{x*Q|<(aR&DppZU82N$Nmd~K{Ms{-8W z@Y&h)&=)Hi;atlCIQaq$lAJcf=KC?#$=Pw;F}~B2{p?29x=RD^IUH43xlH}qs4Q3U zgAUk`AmwB90wIoa;^8Gn8j5$_vYusZ*4L6%seD5$semUqWcy-%;8hm5-3zQYI<~Qr zW)^b=1;2cxWpf8Ge%Qqt4&9X+U(j*dP=yuZ;j(Q+`v-&$i^?^eBpr>0){)6G44SrT z1NJ1AR81wpl+|>v{H9QkdlN9{{G+iSHb%Nryc6om0*0elKcbS*=v5^c#j6{ymW`qVO4ZU6s{2~m|L(f z@L4tnLMI9i;*bPpS$gm&+zZ(fAu5I0DWa3z8eEEQOA%U6_uc~bw zQA1>vxIZ6Ix(d*DX*>QOU>5eg3=h=2o_x#;+)MNT!TbZ?xeNo+xiH*yjv|F+(zdrs zqEBTO>UC>so|QJ}8p!RVhgzh>UI>-2cRxAdh-wnwaDN&z#-~>3Z9D_Ei=rI)R32&^ zspkL&lW^H|?i1I`YddK%O#mQfGd*ji3vuE->4oCWytFLyA{cdm$tP5?OVqyN9rMIOp@7GUO@VYpyYiw5#C~!>WOs$P1c`EO1#GT5vx@R2AiY z_e(F%^W)8Ee<4H4&x|QqCk^#U+Ihg&+bVAVb(Kv#OXB)p^gCoMu%+CAUf5Fq)v&-3 z?G&lG;2Rsp;+t#PbOO*bwLBH4<<@B3NorcV_``it4+I!$u30pv$*SI@#NwPT_s9W$ zZ5s4B=41`kx)9To$kYor@bOEIIY#)CkwpX7z_RA5%l%+MW!|3Ky&(f8Ci$Wpi z;9DxzR|8@BT`DKv>5*ubF|n$dpU+nK{b*=h5=ctzEs8)yTFv$HgxiNNB9wZ%>DhBQ z-qW@qvA|>|!g#T;Wv8Dvpm}0Rj$!W-N@OS5Ehw>fPX*q_vPkC3W{g+Rqv`PW&+u4`T8Y6OlF}r^8+787>Kzo?I-cO_?63p|w*Vonq8e~#FbN8OBSlz1?ZeoeHl#+EuaovYI@820uWU8EslXS6WvjF05=_(O{y0Kb*Z z=7GMeEPQ-U#0L^+6TrtuQ(^vav1TTHQ>Tux8qXx7`vA?Iu*E+oJ|*}w89nYiF?l<# zVhCaq44ww2AS5p4T^^gnJo{CAfb^Wf0koMl$YYx#-UHv8bQ!<=rF_$PUsidFj4lLM zs((Ts`2E1R+K^se%P$zP8xd@Kwb047oOr8p;4&~xn%|P z>0w!Nb|l!hHmJY4tr4`J27Oj++5s6RecFj3jO1F3{$a^i!ld-4i882iUR`bfx?Ea}l*rnM-47oE!2HTVS z+754!?Rc?8IE5%caG^uA+^*s7mczHU0{MHlidWZ&R|i>n^b3`fiveq@Cd6}xCi%L% zr&HB+2$X;36^H1T?)(Nr+y$7}ISWGS_GFhdVTE;6AJw*eci(ve|DXgbv?zfY zfn?*4Ol5W`jD1^ALcUAse2^_VbX$5w^epGux09|< zorcCE;N#cMx`e(qMqG_iK8R@8z3kCeNbHhX7yLkT^^)59DqiQ>-|mN+d;yE?1+lPr zl|*!*?ZN#5DF&K#CHf9#-Jo(z$m-cU%EUqBG>MY;h3Mv33^N7Op??-?(qmgce(hk5 z2JnHuiV{4;KbyL&>2x zy3Qg;_<4!jLD<}hod`##IP}{*A_atpX4Ja`RWg%Ew$zC9UbehAQL3SGI zaE#AitQmq8D4OZ%@vmsW81Vz`sxsH*=W$9I3|z%wX%0ps*BkgL08{3gfVJssLb8y~ z%Gs(?&b%{!{ac@T2RkoB248>D>13IxyO_cF^w$03(Ar2xxZ&UD`L)hU|1n)%o zeGB^3o0o|6kqR`K5BfDwMpSGm~a)Jog#%}!c^Q{>288r=rA)@Rbtl_ioV1Fk@STX#t#JT#C33V@PvGfU*D@5^U8cUj4 z(mBv0<)JvqTc&;N{)Ay%XHICzPlSB)dSZ{M;O!7U(p&#rXt5h$+;#&3dE?{{0Oo)d zoSMXJbjkxJ6rO8U)UIKl^!#dt8gl^#%ac!7nQ4jzxcveCn#ATN-ePTx?R^SXf1R@Cb~2x)Yt! zw_$E4F{H}~Kc+sW$@@@?V~ZC{H`R73gN!E=m$;n%UDm}nPdvoCAi-mCr^VkWEN9pT zXWI+L(wKU%9gC>U{DmP82kl<3Bcw`DQd4nomJ#Q0AqS=r- z-{t(oZDo^Bg?j8gxfjLf6-`pqdC1c8Ay{1R&`rVej!DRXTh=rQOZh6Ru@DWl-bi#i zu_V`oUPA%DKYCb~ZtgKN9qp_uBJ5NunYDM(R@;wNV?QCEUBVR7q*yX+a#W|0MD;J{ zZkjN6SwD~$awuR>X>d}rKAg%W_kVziiwH6@bNtrkcw58TjWk*J-`T;KI5hy!;6Dmu zgF*@pR8@0lI>el3+wKyXaFY3)I!AyFGI~(HP1|p)w=7)ONT#% zB(uViGy%HRyR7<$dNEB+z$FV;{yJ^kuseo6mucRo4NMkEq|k9gL1gObi%^=@D{bx~ z4a06(qQFeSxl?uI(2PT#^N6x{dS;A9K=i8j*noetwmO5PH>*Jqrl#(xh1pZ@fBp#I z@`NH%GRdMaA2iuZ(jFoVgX`%U)JTb<;&*S}e(p!>UgK#wEx+Q4B8U`N2RV%#tK>+* zJVXV<0FrDV7=Wfrv0yskta9=wy|UM`(;(lG#(ama68LhLRJ>2Z_OeShdt@7_xqCGU z@bRoH(~^8m-G)?uAjT~5hl+%?*(e;lR?%CLuQ4;Z&mPnlOWM=&Q+lJ{cqNIrIUCo3 z@)tu1L2=FdEHr%9H7+hok)@%Oul;#E&Et4%mvz%-q7|v^tTjBW39rxJ=a=2+5qo}Z zh9*}2UGt!-H9oK=mCA{D`-_!aR=b5>w^H#gld#`i}lUSztiF*wtnj z!JN!oCbdIFw?a`z2fZ!o;n(aSliz8WL%PISzq5gF)h}(R4)PO zvO$MGsaI{bEHxNG=W7@q>V`kHPgm8XAz`>N;NrrsbJobRfmqxVqF5Ezrfle4Vv#>` zJj(_JecE&@_^+^TIdiSaVukjMNp^G9+r~&v*xVQCmHkw@_%QObh36b9(SuK7n3IYa z^ts)5j1bnVXQ~QvLsbqRJ@btPGz2V5>J*W0KL}g6FXub;P`K6Ua{(5?T14)s<93X$ z8&jG+in8CuMBgsxkR&Q_sB+Z7JZL|fLIy?0bikDNl$k;2Nvp?b*Z*Ngse zto0eVf(Gk0RP+SaPoEZ%p2i?>eYB~dTpFOg$gQ~9h_YggNDLVJi+deLrWgRgCR^gq z3N!}f+3koV52`*N@21(GmW@f(miA;hp>@3Q4WL(81ePoIFPN$KPY2^QcpA231ECg{ z88d>uTSheHSPN~pKhuXzhnnx$A#%T7G-a;Ms&kCrb9itW5Rm}B z2%#=h$DR8vo2&)UK10cl~$dr-yY?Siaiq1m3K?=J+rpo@~f6(&OJn{%_+@Y zBEDK%>b3EP2$;6Ud6YLas4p{-8F}5}p=yK^_*bx(} z&`i0v6NlX@5^mC4bE+>^fqbEyPUA`2v8ZaDL71)IflQPm7zhoi>O^&^74yyLN2LMi z9GCzmJ<{u=+%NG>q+m=3<4(NjUbeNA<;Bkd2C5ZT*4cXTRl>CNc3SI5XR9M|xTO<^ ztLCY}pwE{fv8#KOVUx2RUCzGFyY>`b(>>}1%)_aJ;e$3!mD6yUFcbiD+BN&(^vOQB z@1x-3s5wzngUF%md|CDomQ;0xqMQ!#_n$*YDP<3k4go^Q7#W_We-%yoM}OC&%BJ=g zt_b$&1`afnGHqhGq2_zC6jr|_jxSf@P?nEjJaOS@#|@-z*Acnq&Y*J#jDgbc+DLHX z593sby{$zw)eg*D6m0 zjayze^umC)XW?K~*9Bsez$UZn`dQ5RDl$h$_&hE`%=KvOG%@qnVn$~h4FEKVF)RfL zYFUH^ZVC~aMHyXgkjmt=#4o#!S7(iJg;O47sD;^>2@^Xo&_TcFD*}IS=(0{?p^L`u=ANxtIP!{FC4j z>nH!gy8aqbS=1RoScGjPFFmqoQ`R9JyLpv~)1M6$V%YuVAUC&b(w zzFn|`;LQ}pFkQA;PPhVBdBUZ^b+OyunEW z=1+&D3a&X5D z>0Y5i!3DkQnq_5q+^YNCwZaQEytC7!Eg7xXNH#c$T%}2WpQ!K&3yAOfxOx2s4KA|7aS3wQ9mU z28(nSLaci^M&%lmmtl^j__OfItzY{JWmq5MzQOmtD#3nQ`C8-U+6RFJVS|9lGfA3sJ^(Yw(#E1dE~ zC43c~f886rdC2rzwoLCymWLV}+)%OT>cp(jj+}lZC7au%w?B#iw*5CQ`U*41mZA#3 zC)1FrsKWBhMv?K`;jotHCFG!t!G9VNsgdVcM-0UpO#*-D>w}KEnZnP9#j>?QP~<%4 z8Nl47Hb|`7%fYXltAAA*;O_X%L3D2ex1x&1DI+%+9#Uj2jON@UHJ6KEYTy@9(SUkh zX!d(%)E`nNt+(d-Y5OY&L1Acwgb{Lt9{WW%J06mWUkCs>@iibfjqxt8UsoMH-oUJV z>`CH!koQTH!3!Y`a^Ym6;%od64qhcK(K*&H&@mO*ziYQYAUYlg^fKUnF&<0YG$K2m z7qhRI7a(N8QJN{OVVeSq5_D5NN{ynAAerE82)Nohe&AMXP=<`X7bSA>kg-Rvs=leL zyu_PsYI>rW76L<-Z zaC5ZRKsL{>Hci-o%0C}u8BT-^QBQ{w z-0`NpnAdS~L*mySWkdlLXRRj`KwxdkDaOWz#_o^c^FquDx;ZDcn~WpM)nUJ#&CfuA zSMw_Fk3LH}Hqz-=m=cBnC6gJf*{)F#^xy+DcE`DxbS>8G9KFxelnZS4o;Dh!kTMI9 z4I~KvA^wqOdpNK1uU*I$M_{F$CT}RONOTOMz0!4E(}Z?vSY;=;rG*&f9K*L6_RpkU z`S^jAgIp={(#+Xj6RPJN1SO?Dp;|ropVAVFL0;M73h71@xH@&d{9{OG{d;iHfZzDS-27-Hpn zce`_Gj6-or(Ud&JGwTHFvn|Z@-TumB`KnM=6PdvCvj13inx-Y5BENmWP8I4_582yW zm$+c)2st>}T~?_-f^t-J?I0bSa1|mNo(qh%pw=0d+8)SVgM1`rW@8w@)5bZBy_74- z5#oZmbw5CkXP4Ytvg zmOf3vskYM#p*bE}DqJ<%+$W`7rily9iXq8S)|8a>&Ql=dU+!t`vaDpnw1sni(tx3- zJr?cnVIwmSpw^9`nG>9=nY`A#q96R$JkKklzxzi!OZj54&USMLx%NfAjThV_@%`0p zkK=H1N&;SF5o^oKPatb!w9mnvh`{|k?!4wp{jM;^VjZo6JypDa`@@Ns=XWZ|1ccOP zZQm%_DkR>GogS1cPZ3^Y$UVHz_F@OP%3$<9e>k4MK7s1+mJ(gKtDtiBoR(B-*~DdV zg`95{%Zx|W_Y$3T&btR8`&p8`6)Lf1nwddvORKQ#?LB-kn_i8GnLZdEOP4wdDHRiH z0-+2Yk6MkT2(i!J8hD_-4#=Wq#fs8%;2pP*Bw6SK9g3AVUS0 zT0Q#w3TaB%BD?_$6{zzCQOv^LA>i(@Y)5V2H9FNTc3In{=I*93mEqZJp?C2Z4EBw{ zy>^Mg(F%LyLk+j=^St{EpY==Ega4^P2+9Msu)6+voRP8wHkS zYAo+5q}|3=Qmx?*q*Gj&achqT{^a9>O0fwz+Cr*N;6)2Rg+&uW0&xeqQqeaEiR>`pD&cK2vVQOaw(4e&yIXT|KXTMkL-2@O^~Z-}Um287f|>Z{Gf3m^L2ocBdne+zPgd+t&09-9AuBD{S#N6lGN)E>1$X z0CocVVCqI5pSMq9bhmOU$#D@XQsiR~Z~z!U=fC3B4cBfq7p(c}Wj%eDe5EDop5(t* zOC*&C-t$gbA=qcPC*wBwUmbJGZapn`HZ7Y{QP2saI&~@$IlEF<+>1Xz9Ohblbrrs(Hi51=+aU z&<89DzvM%NRWu1LUw1b|j{<)IV7}?ea5EA+M?Jf0W0{|0fYF0rM0Ev|94|0Z@*TAt z@{B?+3n}a1HpYTCsFaZ4-_c>6!>*H13EpS)VLREhr5pnE!H*5*{|SR^JKf)~pbEwN zdU=}ASF&1COb;*b0p1sl%|>fbo(gZ74KZYE9?15>7G4#*U} zom%Prxqbh%`+wYkQ2D~YQJ(e0+#zwt^p_Setw7#U6W+aV=b>n2$tja(8PpPHZ|Op&xoQ z>kj@t#RY0!d;`hQsg?FI=8&u`XW)ji!)*t1lMmOmheuke2)U&RNxs369?b-cUUh(> zwS>ucMI@Jt)}WNm6F?TKIeyet>Hh#P=-z~$V?hnSDLm0P&&OVo{$KsniF1$VS1Zvx zP=H0M*t&B4qQw}wRl;>Ke+s~)%Ons76wUKT1^`0=DBfpxgmd(TLG6sOt$~LHd!Z7I zpc<6ss~CIFY{m~X$vJ&Q2Yyu6Eon92*nt+wEH*6SFvLP@OacW7Lx7BO69DD#v7-xFEtG$KXCpxRf#1*Q9=j&rgWm60Wd=*rjS~g?>yoTGrt7`ia?Q z%^#QxARyg+L&qsyEqkZ!lUle5YQ|cX`+tz-Vk0HklxZ;VEY(bFP_z}4!}@%o{Tl5O zu2_K9xy^sb;f{9?^qyV!RL#kLYcZw=H>8ut5=BhZ@q)wb`p#vXJ z<@5=1TE?6Y$rf9LS2*&bU(<-1aa)ThgHU!Ijwl$Hn_(hM`|Q$GD5HmAOV8;LLsP+Q zINb5`(_00i`kWfqn;925X}jpNo*S}0|R5UaB>$3*6NpFmX0z)MX`Jrx(vbV_i~e8&V6FY zvFLJ@x&u|t%Uc0Qs)zJSlN?F5kd*T@B^9NOZuiIL4HZhJED8^Gee$$9At=IBO|T)H zEO6t3*?UE2~dl90bI8M6APfX%;Rff3t zj9|>@=&=?Z@#+G_{hIA&i#p6UB&IwuJ{163iSmK@!Eczc%|Q>_QxeoSo@G_GIVf7t zHNzV#ky%+zBmtz(rdtNoIJSKC2&ANSAeUd8<@DR$T|?nK>uMvk@leeoitQI!>`KeY`hZ?ows1hRuKWft@BNg!PJ4QMW8>P9Q%Kbqxq(Cp!?tH|f;_5tVyA5-TxD5`N|~xO+m{p!wo8II)!%>0zy*@ySGfPK+C;+aC$NNd!!CId)z@w%{ubQlT+;sORDj; z;U+{8`5EK2BAqOf84h@BzO8EVML@YgvYzj{ho?poQxXi@%~dgLP6V7AqLU3);Ctom zGonxPYu! zojR(IHo+`im7ac5^jW!!^%8@sCl++qO5b9kD5|{j` zf}6(!pY7;KG{rqnrp>hqYug9*0|a0*{GF|Pz~A6p{z_p{Adc;#$*yD@b&129Plu;GAqcFU&6qbh-d2tD^^?qp0yQ6s`H21e~hj!BxUXuSEB zb(H)t7i*x@T!zY(~kMG^rN zO`)Q4Pt5a&MhSD0JKq#D7&KzHOj8Zl)i{{qr{uv~J`FD@tPFnDW+d$`17W9SjX5ic z_YAdO&vhn&Vd(oynv~;`+YG|AVa=|e79`TvTlTCV9%_F`U9c^AIzyPqBrgYPLdQO%eT9A88OtRnt(qcNGHrZPmoX# z>5z7fbJKJr9ORdyl(mb|0HGCyUHDER`VtrenS(K%Bb^M5ToRrFuWZ9bd^bGsD*D;4 zlOMJQ(8JIk^T@DhRYbXVJQS@dAb5Sg!6v#9N9?IL1$pJdS|82o{^dYfmAo$CIfBrLHXFK9uZr$7irMdL_0?{Tf)$2 z%UU#~RL;^A8+vD*c{P)||xYtZ{ax}et3R}KFq5vl_BgP@OOt2{7 zfjjsQ2|y96@eo>et5#&uXt`_d3N_|;NJg=83N)%}ucvdwx-CxR33(|$Wst@e;{_C9N zg|h2#@Lkt_ZT#+NDwnh2;1yHJvqccsZQRog@@s4n!h*_MZr~&?_?0XLp++YcEHttL zk4E?ff%jsGdS) zP*fAOQB>|^dVIK`FlR7Gd8=9z)^Ty|&WL?j0kdTQ5mfJr%tJa~V^4>Jw7R*(F;G66rc)XQcS4jX;rkw})`Wan+L3o%jHK}LF@k2;}2jiE$>KEgHN z(@z9bunf^VgC%2Ai_FVKt2; zCOzhi`#?mdrDogrQjXOk7orXYp2!u{rp~d*tySDMH5@OrVdkRN&g*V6bz|3;2C=Zg zZwLd57T>SjB>jV0)rOxiLcTG+fK*Z&nL?ok6GFS0Nf}LiRw4h)$voSM?N?YEieI?u z8srUD%Qc&t}4gOPnrwFXi$c7x7j0RMyU^EF``SAq7&@1gSk4%sb1v0**vvU>%GPcGOF*>0 z6eb7=>jONll`M$I0qPc{3aUaJE_YRv>B_CuSa0A+$s1H$<0Y19Q1{6^V*f^H7u$3E zVzz{$r$Q`JoHOgF>hTK2Q{i&vP$B(|_AUZA!+4M7#2KZG;90KncmeMi_hAe-eg6k! z=&baiUt&H4?>NkC)p)Zplw_i-;zN{%Ix%|&%4lgT>KS%{GZh;SA|wRuz&eP|)lUuT z!jUD=eofdm!PSD20f1fNw~oU}%v_rt4J=a?r@lO*86r?eMsYOZqic{{W~~HI?ozZD zcDgr3OUnMu8mQZD}f_Li=*${1{RdM2r)5Wa`aUB^ z5c8y0n=~{7;W3J;3}k(_>dwe8CHd(l42JI@PYfiK|HU$~iOyC=cORVb0kU%;%m2L* zWI0J^zPEnvEp-;%R4}uD2*J`QH%N^C-7rz?Z&g2VxSztq>LhcQews#T+PJK=H?mmk z|3%kI&T)dJU6;_7Lk)Tg${6Fa(%Z2J`-HS8%urGFdZdCNd|fkK*wpUmhxf3I94{PE>`Q>g>oRDncK8P9Bwov)ZXHijtbjUmgIOYl zM=%Cu$l@st=4Dx}IzlO{OXmb7nQhMjayi$ZaPgPo1s}q!DsL6(0WJ`-@r3!-j5_pN z9ZGMxVuAcC^TTZ~A*w}oiAn|nsanu-;%D~LMZ%yAhZOqWxX&jQCqjItF+yj~QUf-5 z?f`1jB_)U*j4!^7OiKVUO-!hEi{J6YtUSBmqDlwj>8?=#P$v4Io>a(uUtnnQpzAO( zMzxuwuE9~N#;kUv;{~*-cn|*R0#{%?!6BDb9TTzC^dYWtbruJVN6JINH)n`8SF_Jq zy~>17j_@~J>(e^2w24oDHMfgZQ$a^3>LS&|0E1K-ggqz~EHxQY}(z%5?_ZE8I4`uw_9DrGeI0WgB1L z?0{@0rgjm0B*+6i>&9As)f2I&eKYV?s7At7;N7Wv%zEzBn*^HfnRkbZl4X(}6Hzd! zsA5=UBd8n`?FO51-<);f@-Qp2ia7a3TgM;lRm(-DO_UHH-eCLEeM=?`=Bs;QG&?ke z?Fa>i;SvpwX{F@@25=JTmC>wr7W_FIep+cTKgUY1egF|52im-AV=WD*7sfpwQp((B zp z2q>sDpI}13XG6;Yxh`q~%Xp-&%36XvkkHKt6hfNM!$;2o)owrtq1W~9-#BBhkTLSF zvw=_l5kRO94JpeFYG5uamTx^({2A1o=x}9T%J|q0dEu=cIn8Qr>D{ca>&+cDNNC}R zeh8P?B-YMrq%2@cq|v6KL#F9wZAY1eifl?U!7*~aGjx6eJ2i*9r8LBpBV1KPs4NBd zg5)8*GHeZB97xPk@f2VGGa$LQ%1x>w?=A-JI79YvoANGEX~nVLHcPHG9ca)powA*B zSv@d)=XMNOs_|-S3un=}#12+4yck~a7g4l3K3fT)N9hyyy9n|@Tzi7cUnQ(<@ibSG z27I+T*nKCc9=9nM`lOvvtBpDtaC)xI^{20+DW^$@HFRZ|nnv~BEfbM)p6;3Jpv@`! zIDdUkTJT`-Eex^!6=o^IE`{wkzmcv~n<=Ho0i1NV2!Es`^UB9uGT09S$8J(QNg#Ovr8~x()@`MK~k^jctZ-{xr zzA6-2U2`Mt)w_{fP5Lj#NsdnIK?d8J$OgRF`4Tm0#|iJP&^<=0r}{l#7CY8Has*nn z!it@hhQJs_gDo2wJnGu^D!b0{n@Vy~pRa`X<3rRSnF}nhpZ}JGZq5EPoIo{WUGK8qSj_;l z&W_4RIOEuMn3TnqsFHtt-}+O3B{0QF0?>I)j`5ZH{^? znBF%L;9a4LvnS>K%iF-*KHINc23NN%l%vUCf6wLOOYG=Y!nJ4L&A{2OTMD;|R~>`YaX- z!82{Nhin=G@eQPLn*z!uyR2Lj#M9olfcx^Knd-u)iK(}GKK9yQ)i3l9kXm#G0DmT1 zZ7{;3;3{i@Ff62)8qp4YkOAMrxhTfqf4|pq$1H#iKSCN}q z{CgIjmJg}0N(!*aN_JRGV-Q1g*p4X7d2pmkG|O(A^<d=7g`*{u=$bBO<+ES)g_-Xzc2ua_{DnVXMPdo?h2MpF%h=mRJZOKeSkbRnNn1*$e>au6jfnl*urxzl|~BJOd2^Bk~znTTYQuUJk5><9Q|HHI1tU z8ibik2QiFaF-L8A@Byv7>WN^TbMp#?o=3E{yZ}P+8$ZP8BA392n;-vsE13qwx*hFO z>sASuowO+-Ekl4f(7IdEy&mz5pEbvkP%YtGC3j5#?ALtqJ;`zFA%x%Jy8VUJ%D5y_x6$v)ob+NS3o0aji|_CRo+Ig4JOY99>ONJmXq^soiv(qaAFJw}*3$Z1&B+?L%bcPSlY4SGDm^RZ{hb zpopM^FQ)j0-47F81)B=7&7{d&!}yn1OBp!uiAuXa1jlPwFnbA;|1|85hj7HPQ$~Jt zv?T(@X|xb8alo*;V^vLNzj+?(Z!gRCV}qdNBIu(jKqK9JRpAO~TD z0UzGWc^!M=$S>$b*L@V>&k>T(C7cA*end)y%;i-QNTSPt$zQ5^w1C*Zs&?VO8Vto` zvm0c;Ds>7AC-^vmAzV9SyoY@9@9Li1d~&>A72(DT(vX2*_+qi}N9-E}7pa>WH&gZ0 zIhGdH0gq(k&p;pz_I&p;ug1`uMj!S@<)zJ4mDNv^Z6Mi5M|vEbFuxc>!R4TN(WM)- z_oXo0V|bxwCCn&x`1}w{;pUqztRxts!-e|P4beytg-`yvVB!sd@R+FUFz+r)r4us! z_pq#|6L&Gjyta}j0K(pA*-YAoB6e@xq*GpDZ8L(Bgb<;TznPK5RfF6Y>zOsN@stea ztXnZ816e6@&Kkw~+mB<0Uf4Bc#(fl>xstVw4wvDyE8Idlh(z9a=a{W+O7Bq2AWN#C zR{KFo^)+%jhFs_|SX@*Bqn7gX&z=mdu_5aF)lB-eOUV)ypis%E3Kv2f?H5Xgfvv-( z2`JnGuJ^$tblnj%vKvJwN@Sx~4M(hw2r^(l3nd%f0NY0n_WBjaS67-z=Ern4Pt zIno^kYLGJfPy;5c5xK|$NDR`o=`);-QOg-;67$L4~ za?8ra%zP5YirSj2hHN83Hn?^fuOL?Cs#c6^jEurQ9x`uu!z{iB*82dXMDxZUeU6GU!I}0sAc^ z_VyccFT%mP_7^RjFd7ZeaOG8B)NIlfE!J1qVPYaIRc*mL%4V14$m*k5C&O7?FJNPF zZl_m|8Oo0?upLqI1HjyAs5e9#m1VYxlgpg*V(sGJEJ`%Sw4&B)y^>}j-xr$3?X#^( zbddyF?}f9#V|I_)EMrUQ6P`N7)7}7SFACQgiu{k(htz4VGIKwf^s7>NkOX7!KTaC7 zn|8tih$YtxRo?wnoII_>50-tO+1Cxu;FU}~`Fl7p|Da4{S& zacZbhJyx(wY+Kxvr;`-SlcvPu>|fc6GArcl?=}NT!%Z&TH)frKj3HYM9;>LKwTBj! zD&_&s!V4hl(>3052*X7Cc0t{@Fy{Sheh?jF&JOlDdpilYeSOH!}u`FgEPbok({`l=!gXqq6 zXB|^LFvH(tcad0dtP15&mmizs*+D_X(^$?Z!i!w_!UxMZUstyvG#fLtQa`Oc{>MH4 zCdUxlCCuqC@xF8Wv#ekD4}K!_s)=R*BzcTM+7j^@`H@Ej4YA%TquRRr`Om_K8qV3! z697^zEe%sKBKguN6CGy;-^^m@i(B_JXCbaPFoCEN<7hTA9Ym*q%MI6>hJax^+M`s& zw`cT+c7VODnQhA3d45H{EhpCqIIrE8M~(}$`8+y?4yf9Hzelx7Ss0P;j^LQ~sGlW& zQh7~DOjII2^^6Agxv{wOw2~#Q6SG@qdbMdoIm6Z|4CFCDRF+L6jM%s@@vS*B@A))BX*R);3 z@-G2JV506g^Mmca^2@H@Cst5I0b~#{8Jpn@-C1eP ziW})vCq3u-X3H;#c&1nL6;s9jbE6Sd9nUWVc7XT9|~pMxo3B zRe2iYk1hWi_qDXT*kRQK*Zu%fBSOp4$e8{;vG>#f3xppY6A)%c=p-SuW9eIi^!v3R zlpV^NV|a)Ou?3w$4}B4(!@|+V3PLzlKw6s^5HqJUp86;oC(&G&I%Tmc9u{~FrtZh_ zE|$KVNNm;moSmtl!-_VQ4n89P^VAxsq|VNaH;Dh@39c30=p~z~@px1|CS2_yX`C}A z%`gSyYhkk7GvWQH`h6GzXb(%tvFfJUXJE`7k@wq26zWv=Xj-2CiqT&9(hGk~j7XD9 zL&%F!H~k)yDqgtTK@!jVyHI}5UmDC&E^~`3XI14&WbyWZGdu0jvqR;w620!T>^ruv zXa3x0eM9uT7;HAug+RIz3nGVUstx2<)aN%ROzy{4>0?W;L8rQ5a=M_$6&qOtfmmZl z=66QlUnsR`L}d?fRI}wYS(4nt0$F1bw20VbMhtiGZl1cR2&oA|us(^%hnQy;0JCmy$ zo7eHz#CtD0)k$+Gw_uta`VRJ2Qb5LOOq7^BrZ9E5e0F**Vq1m>Mox|jW09vR79atk zgky#9Z}| zf(Sz!f3ih2@oyt>Sg7X^HAMk8{_aMkRkY$qJgkc`rX(~FmvlmMD*NCdUyE#&U$3$2 zLXlIq_kPizxlL?VR-}3&z_yF7<1G`TLp*Lsvsfi;l{g^wBYsGh2k~8bo6T#AM-A?{ zxjt=9GQ3UI+MJv;e)zQ#hgHy<5ePMjR(*WDj$*lkfF_-){Sj58UzxvVq;2z146ejV$R4vOuyzHy5U`C+2Ovc^Bw;aOcL6oZobl;vKUFaVnY| z0+Dr#I5+BNv2*WKFxP3C&%?isypcu{8EGs|gKEPQl#%Ufb~zD04_znFtk}wGiJIr{ zX1V#9#ULjF0Kb?i>w`54L%mqPvtpPmL88t)KX5Ko(?5ZFL59wjQ-X{_vADzIT zximMzS}x?VdDu?S9^O*GHf%nEQLTbU)5;5scG~l`gjm%jlB4l9t{BBwY1{^Q|Bt{8&&(n7FxK7W4)Ae7gDr7=s?8rSfl;SR>rl76A3o*R3ZKqL;m z7>e~d$av=z@C(?hp_+FE-yNksTJ_8(hA4vO>L*#4^pI8T!?h$af5kLZ0NGDhWn-|y zEB#Q2k5}nP|F_{)1S6_Rw->wI|Qt!5}8vu@rw!N6tD!5PZ7R$X8Y`}Pu-vqzjpa4KN8jG)M~G%PNE|^)Go=@hqYhy78@+s#T+tAuD&7E$R0Sda)7* zW~``(m2F#FNPK?37>0F`B1>a&=Y-5U5|Y(N5=&h!moI&|B96%K(j}4rX`T!bkVafh zwwB)9)kbf44*KRIPQJqNNOIbsm%1vg1`;IMQ+0kSu+a}KBTG`b|a%gQcEB%*BVu>dHnY~R&JJwS3{B9Pz*P;Vh-b8g*Q zt%Kos8i^=&8eI1j^o~o~V4mMvkX{;C{7amrX+T)Cv`m|3E{cIwvq>Et~u-kuioxhj+)SQ5-zmLRc@*K=ZyWGYKX_#@#07|CSYXP%U0K=74G zr8pu0^r79g#p}=m8Ofh?O4K{1|3+tqi?nVbu^?0(hao{6T1(CG#&6AvR(<#``b|J$ zZcexmxQLQTA!H?pFM~kykclVF+ZzDJxH{^m?kZ&o>;OnO@uRpqp0E>>gw}cRtSgMa zpZ0i!h&9X=w@${_q$2YBLuSsSi~dn&x6X)4zVi!?{%kCqJn!{6ggQFiavd-Z$_x>q zD>g7zI!bPlpt?wyuo1dBg)e{C5!^@lRL%3fpKt}rR zceD5Ii7#HOEcM|7Q~NWfDQnF%V-5kPt3ZNE^9VMv!qNm)A<6OAk{DlMpL(R|FhfXB zD>GPet8E%r-9nQ~?0$}3#ZHjdf;%l_c#r7ToSAmagN(Qkt^3Bc4XJr(H7TmF-!Rc% zcof>LIs?E+zsqnzKxRH?xJfHbzZpCW!NctH*J^WMC*2laax6OCbT&u=mK-MX!9%06 z3v16I9DwzlE*c-#ZOXYO}H2#6}YfRyYL`&VsU-VZ9? zq7*lFhoS^sm`YYOBrW2bf35wTI*6H&43x}Y__!n5#VUKA6DHeRY#x>n|Bp;YQ0+(} z5rI*uk%_#IZ+ZJzE}Aa(g%e}EJ!dvI3N1$@zObzG0rfhx_5xTWF$xl1okm*xVUOx3}wKeWGeFG$P7CJm>>vUf$E%9sh5yxZt0r8Rd$*!6$}+Icu^K@IN6;?d}i(>PSjQP~qCMzz6Q9evO& z{9t7!gd#-5z4Kbj{JG(eff2r2eCo`pRL)uas+bB&s1x-fGAB8<5Xfh#Y}-)b?nDWV z+cV_$03>ZBj|!WkaPl`#opCHWxYH!t1909?;k(%!eInJCI2p~MIYH5Rffpyuw;pRy z>erQuh^zW2cpl{pELZwz|L$6QYfOZo0}WzNH;@t}+Ewvsg9x5|UF1D+Q#s-t53a-< zW}6IN$Ee_~NH=F728vbXGD?{%t!(>Q90XZoecpd>WjU4kn!<(qS^J!k13Z&_a#_zm z`oAS+w6|+9A7wtE?T0akszBvpx(8hWJ-E!wT}qFaGF2vp3W_29Ypv`QR0&fC#>D(7 z!BJb=lOiR3j6#!4%CytXG%wkBR%#E!{-`oh^#8k(OVChxkeMdA(Vgku>>pD2zp`0F z;j+)@JVYU$YLFFk+{1avIqq1ye9SlD_HrQq_E`#R2@4u7qZ!>Zpb!?(7!whi4EW&F zqmq@mU0xAP84t;I*{Z2Gc*C7@8)qnkWao)>BP*nrLVm4N&p}CM2Om7q<8mFy z%*YPBngFjvbGCO}X{#p9Zy_d~l9{<i(MbQl`}3*!)PU~8>>0SJB=?xNYie+5mrJm6E+d(1>g#wSEV||6SVy2k zz4V9zJWo@{U*10g&Goi;07Nt;ML%cdKuoe`I-Wh9R6df|VVUzemj_;K+ufmUe)5d% z3Nw}m9G-Y2-S=M0UDj^V&}vRjyOHIahm1B`?0l*CVU|8s`7%Uig~Nd8)VxcUt`t(8 zO(GCoLI#HV;a}Jzij_o*igl|_KOpY$;J+vop(CX!hE2)w-Bx#POaVlG==)Sf+9WqO z)gqmFRnIA}u@US5I^PG4q`}O&Qo3?bpDg2f{r(hR6>8qh@+%$gQv@tz^^`N!RPBs7 zYN-YVle|!7Ws{y0TEL4(jEjVPvQteDK0^Uf9LibJKIFB9yK50UjE~Y_cvqG!dXdd6R zR^Lr!6LIoL2K+ z0Mk8qOF#ndnHrv4e_rA?|4Wy1@bm3%QW|^b1WIN1fBvjD8jC(TuUq`Ta6Ep?S6uJq zRl}ioqOXR(;-vs;mV&7zUkO(-QnC{-d=QbqvGi7VJdPs?R5^r@t}1+<3JNRfeC1DO zdVHaI6H~ltdx@KO+cxx$EjWD`38rEv7E^fYE|(V~eBppp4BRPk-qDVQr9uPGGq#28E{RR<7@S!FE@%6jFa#AG7cc z$%Bbd986Du5>$-lb;yHhKtpt)-+OKKBOZCa@V|h)mWvSG<7de({ zM{?4F$xSNM(w8@Mm$fDV^|NhHW{rofn^pc+CK%BdlIAWUpmer%xEkh9KDuPtHc@m< zdiLs8ejlP3$i`l2IaVjg;V~1)i5fxHX|y>f=qz6o0(!vG=r-?l6Taj9G&CM*|I4LF z(V8|jcQdC+{}%QLn(&2FkyvGU(4UE9N0cyTsh(wybE}CTjN3^Y4}KpMoWlP#Py@#+ zhH3~cbIEE$VayPb8 zMGM&esltr!bW(Gc`VW@ff~9uP zAhQuRK5fYTA`bic`2ANdNwKjQa^|iR?>x|5d-KJs^8X9_kBwofUjnzoyK!pMXc|iD zQ!$A@3ng)E&CvxV`ai}7q0{o*DT|rMaRa~~{9})?rdR0;m^SW!ck$FvYTM8eX}?ey zzOB*TR3O-sw{`8Qrv>IZo0M)vRT+=qr=v&H>on*X>lNg~tCmlE1{5((aks)LNr%2cn|Gt9-AtIGkvJzal}&^B zZA!cP@^7zs9nBI~!WLcV?Di$3qmy=+A_tL zzDlo*3*GXQV{;@Wh83IY=UBgc zJE~86Q<6u_0<--rL(qN7fW=^F^PN*Gh|5{?m}0-OkV-D?_Ewa_g3$^>SYWm%mlw$xz*8k@k2>t{bVLxL|nHd)-4o2ytfPOLQ{Q{p`O*&#?RxEHc3{1k)~nF|Y!hxbMj z+eA{uhz66y__f<4n-6rsc*{ z)-;+w7s~ml?2wQeyjcYdLn*5)om5C9<~=JM$i~0=8b?| zXYco&UN8tXxAB-#X91B-`AQMQ$?^VRgOE=HKP3?Rz91s6*g?$mlvrQ?p|#d>FHu+0 zuB##ubq=9f+`W_(GXKU?6#(<|qHoNKfPTkqn1Tg)AE}#ijUT6m!sc_qA;O1uMDN#r z53{U>SeCmeuW;Zt4bC->#EO%Pd(uKv+2oMu{5w{(CdcJ180wrhs}DO7bE+kB1ZPi< z$O2#zBrLln(!hC!tTzzaps1;MW#hFyJ$M|F9@&%~Sgy zaeKn2LU*lrq?qBT7-sXuV-(&ZVq4Te#*Uu%<;{$bPUTqQ+AfKk7YK0mY0H&KvEq0Q zarWWDVNeW%cVuese`eum&4&e7&l?ao5PPs9x&m_ld^|wQ9mS{;_=YsqI90K zy|$9hgoWfUiVM`d93-e3m7Cw}E#eUF(1vY@LX2$9($5F72#5_8ZygqlIMF0rCJcCD zzzsCa8zEJ*-fQxzpExZ#$1Hkt&M|e4#|(~GG^%8@G$dlhTY!=y!L+Stl5VSP@xe}* zD7Sflc>+ITLd*mhd>dqa?*=Zw?!D1{B#We@vuJCToU`GZfvW?iJw%-yZM3ZZ@J zW&m*y3+9#25sve@RwwJ@EN1rJ8zj78D}+`2i962MkgTRsMdqvl8qY?@Rbe*3?=f&= zzMtjIA4;~DYmkcWOkwbapI~$wg3aV0u)*Qv+i2)9!X5T{gqqQMB$)e3na0=qY|9Q* z)V-t1iWO}hMS`q9_z-#`yrU%+z)^{D5)<4=tMVc|Lut#_b-*C_frEQ`Fv93E;yXNp zqXsX@QQh-K@OulMN;&HyUDo3h1is$^+s1;fBP>S&Onna zI3y6JZ=pg*7F`-P#)wWa!qgjNa4&&CmLJGZrE%qFS#O^ErUW3vSMJJ75y1_suawgq z{Wg_5l}b&OVCSxHRGSI|tbLSye7z)jCyKG(o<2hW>4tWPtg;QapVV`{uJ&9(5L_m9 zl$CUs0s|8RSG{=~$wZdt;m2wbpgN`7L92NU6Wk#s3=1I?QU8&y3t8}lXrHqY+F zKx>0SH+qn*@{utO+7e<^Z;Gn&X%sA5!V?YI>9{)qUQ$MnfrnVhYdm7~8h^D}6?!rb zG`Xo!lk?-hMf8$t3Do~1t6?~VVb98b1SRjx0Z`v_d zyGa{_MW_+{92KoDvZ-5Xdd4l)dzmD8s!GZ2J#9je_gu&gn6vA={P~8|o~T4`0N7}p z42*5)hO{ip;Mv6+1}1^%=yk=87~I>(SaQr#2wT8(&hy7>e?K-*3+CRL7e>m<^V5zs zyfX(1(*{eWRYdy4lB+7^OfVdA>8x~;BqV{e-CVH*3j%`1%k7{G{}nbTe_GrYlkrD2aIY^0Z&+F!Iz zn%{A0D6dydtNZD?y_H874S zK!>?NGYZ)>{wJT92|59p*;G4mrTs%sIaU_b8(m5z*L-fX)(M3NSV~Z`nOGK_JQ=(I z&u8qZ>+4-r52Yp(xSY&^R4CM!n#=}|eY9M6$DC3m1V0k(v9lHJ5xozoMT)%ZJIa0< z+b9XRH=QN072tPp{L!9mzboH?%agGh@|K*)eBgIRyoPt+!_dwYALp2&Gky=%-o30o zhh&?-p)pLp(%++S{W-s%YZhBDLORN&{hFPt)Gq<2J&vQ?`J-#Z><1K==NbUVcn&KN zb#rnCeo(sp?S6m){CXG>7eFF_m?BWSQe{==5F6H#xh!>d6pxGmPA)_f<6SrktVnmm z)mgWzGO+=aVG~};%sOq7%l8NjM56BqBD(lp;>|}x+DAS`$xR1^Y|%P$$21PkXEmUU zuRP3Cyca_+Fo=DYT^>lErFxy>6JQmN3RYl4!W1*5EB$;pIiOQ;1wOtkIt~OqC$&^0 zDUF3`d5BHi(_&(X#*S~0{INiqq~^Ae=i2KZx}{!q305X~+c?wu7%IBD|M(^=Y-Kif zndjbe{>f9~U z1IXuu(6+{BqH(>2A-pC(VcnlH3!akN7xg%*tkDaHpPsGClx^>l6L3K4qAA#BZ7j#( zIg-dZwwPHlIvbOz5_DMer7|@?9fWLz7lkd8!x%HS&!peRwIyvALvTzb&l=J0<3K)n z2WPrZy31l`LV27~cTNL)`tl;L6K1U|CPm=cK)0V5-iKYnij-kARvw4Ig&hh>?2lYm zziJIr?+c$sYB5h?(sRMGku+l>kJ(S$;BvO_svY^7va$QO#z!;-qBlYwl2;XCYT*it zKiQvBu=Rgspo1RNpmFjyC}l1ronO-a@~`~U@PeJs9n~T9wIxB`+gd^@G@SG4NxKoN zq2%K+CxDJ{;2D^u!W&(Z_qhR=rk?LZX~}>?36u5ixr(Z)f|Bdip)LkPC?Et^j%i4D zsAV1GQ(bxJ#pLv}zvCDrGt2`tapfXssY0Pd-^$%XqAkXI6LF6hVXrd0A2ER(D~gQn(0(NZWt8G>^2{{ySiUc7tk$Ypl9 zPoR&e1?+mVG3Hb7ZnJ{IXYMLjpttmAoWdciq7qWdHgIyv4jtKwD=m1TOMRh4oTP$t z$8qI&W<9+@Q#hX!k?TH~Mm#s_70k88sAvCZ59uY!+1D}R!ERkge3d%h4*i~GspCsw zR<6mYZsX#zDo2V-q}z^k!`FS}wB{Zw=DzLN-`KwV$dgK)JZx12?A3lP#P$o)TyUYFPF6*9Ds`^bebMJS#hk0B}_*i%oB za#hEg&76_K{0zeYB|zH0J}62P#Ge88FDI1f{%AXZ%8`b!H!*Y*rsqE7hDO#MSvzB_YbU#+JNyWN9Fp#p=}5Bvxdg61|2 z)%Gy>!Wr>6gGM|F|IkmaOSMhoP6yN-s zCYcBu@ybJAsS3s3ce0`T$c5~*ab+!x53)*P_cg9|QsVO2x>;g;Xx2>xhHK3b8*-FU z^xj}K@27^0qvs>NOVPul7jyRP_0%IO;DN~BGi<}5i3V<06Psxzc`~N0AUgHKkfx#t zM+m@?2RD#U6T~fTx{bCu`fCowr~s%ItIA zTrU=e!*uWJ4% z660?(L#u@V5wT!(pV#Ovi~XaT83&LMeF^{exfO|}nmcz9FpZ+IM8-~Wu}pQ?v%zp= zS6vEz!solm&x+0N7_?i!A+0y~5^JlOWQb75{Rds+#x7(uUJ+bbZFp)dgeMQme7jZ? zZA~2XYoo~3kJl}0zH=}u_{ZS`5Qit&6IkYU{SGY09OppoFiA7)(T;(4AAuMQwFJ>9>?y>RVLWpo6j`#`L!IZ7r|P>S1vO`<25Yvn ztFz_7GSY>W2(BjVs1*(r<)?AexW+QuZm_=*e7YvSc?~_jejtM-{wQ2va>t)WOc{p^ z!;Ii4jYBJ_rqcJ!Dg%4Q=NaSB9_chsX#sZBdZm4~OAr%lumsax1{uYr*tA~nY5nttCyPWBJCa@(DGkANT0_4*(3c=*G)WNfT9J@ zv3tm4*T-H0!B|iIK~5}ng>c@zc~yN8Q%9>Z@c1F`zz^l3)M{C7hR3YjMzPEejrnz5 z6r2%eOXRxkU%6z^_w;?EZg6f&s1unVR*Z!LTQ0d7 zAAnH#M)>+GNFGj^!WEydOCf9%b(7qXJSGe4?Ufn?X`9L9etvuur;y#b?D#)B;$9!aFpq0hEOviRQEX zywR?u+5G(PYr}8J*}=2LKB?MkE!u%L5|A;zs~Z$-^~~vbSP4IE#_5DmbD}o;B}oTC zdm?+F+lxNeT<1zlP zW3Wn@DhIF&V^&qT3+zdi>h_}yaE=w9o=JRAXC!nma*QX22MLh`^-brTvS&%!s2x}J zLilmBb=#&hw~juQM9(v~Y77C^0X)a>*pwVMgvCkZZ9X_ns71~aNUBNmLM{k>EO2n0 z8*uk(fVnVp(gLRe<)Gzy;ck`<8$Sg4eC{2|Q${G1+CDY2q&S$oxFnBc1%I?l5Ukt+ z&+yB(y|$6Mp8?5-(1DtK=*Ucn4}bo8cJnXmVsRwNG;MRSo(rv0U~))ZQ`tm9kC1EW ziF981UK$(U(U72nO@*-*c0SA@!Pn!CH@)d9VSI%!%y6S4;=q(y2++kpTv-P# zp0irh`Zyely*a)d2FrxmZERcr8^H$x8OZe1?F>sDD3S9wR*$u2{si#OI$8lgdgOd^ zj2>@le*^1(UVxH-i1&xTk1f?PZ8t5sgTVABO6x>c_Y@pwGc&V-Zb`27)8C?Azj#q% z$LKl%u4)LQb8W_yVongKm>-ui4LZ30MvYEp@7rUCrRIJ_s1 ztoh%pG))F(<;S}_u9Jc&86Bl9eG}{evbaft{M*jadC_vb_UK?3{D!+16KE@c^C%>J z?V4by%?}Dk0|$;)9{-X%EP*tRTEaUGw>Qw{N%;I^fSB(1`5loCXc*v6A4IM`I<_$x zC`j@4HY{F~CuG0b`Ppwn=#)WHf5);ZS zhE>QL1p$7^q7OlcxD4k1vxb{zhjuZM-i4Zh*}4nNH$K8wxx{{a1eIJ!7e~YP)^wv>mV47u1t?DyDkDy^0Y!zQdNJQDowyRMXE z0KBqz#q~5suS9im`)9+gaYx-2DXx5pi*DOf$oV=}kvKNN!YIHUF6C+h+k{@TO2QB6 zGKBA5BntkPr_`_@Ulnso3wFI+StP<>-sZ+FN{yqnlmDl`x(nnBGru2ecpa_*|INhW zQ6T4?V-vLY>ohz>YK5V(Dh>O4_@rjYi`ooCpWN+0@A?@yeN1olFx?dn$iavH2q-&B z!0p?%c%v^dDdo7wI)qbt7#9_d7e7Hi5%F&d;A>3vOQ)QavV&dD|L7NJ_g8}UauFFB z+yT*evMdx~+edfAV0wPMyKhXCHHnEPPJmx7*e@_2*?A9l3o9#w?CG7NaTUj0`jRZD zn)&IJV6KZ5$1lU!mRh@wp#!n+4A9tIrH=ABV?G>2tGQ$BI^iYo8Q(E-0#-K^8^%se z(k2)b^UDNl+3|p}2$5Or+NtqUd4FO~M&w_3kw$|bw@|`@ zT5tqM{XTBafOy9(q%m%td%Exf>R%k2uWT64;7zs-{+>?pM6&Wff|y(V*PVbPM08x! zx1r`dWY~m#%%E@8C_GMp_$1Qj+6Dt+jP2Q}&=x z1pobRaMCxV6q)*s5ba=RF9d4Wlm$kqaZcP#J@po)>bX;iN;>}X(Mq1n4^NV-jGVFW zzd_GVi46%X-Q&AF0;O)8k*p{e;?;x+IBnuy~s%R=)^;oDz+M!~`N@rDLh_J90(E8Xjs!?GM zXj|ZJddSMyBieut6DQ@u`y>Y^FAq>C&1%!cNmwjR#g1^(1~uReBL_(n+c>K~e72mT zlo{kY8~XOM1x(nM^Ba-l4)cHHH>5Tz$D)53Kx)UknLZbfc%r%C=UOBGEFvvh-qY)7 zJ64d#$T!YCNO-UcoRo@uctAutob0{`am%6jTQM1ZWOG+K3#Ge7(MJG4+6X>%X#SW< zp>8}aMP4AnBDDk@qsk>w?3Yu`PM5D_FY-Jh`thdE?uSQ#L`?YF5s8}4pD$BLGa?1}n&KNnE#o3QjHA3S+ z4lLdPj$= z5XfO5^)bx1gmjwl^3Et#uYz4kA5hDFS{{B^YvBnLuVND;7Z#1MrYM=$4K@+VHM3pf zg*?N2I(KY?d#+_eM<9Q?(ebT55|uc6?0G;__1@dWh}<>lyXX?ItV&3NPK;MOUczJ4 zJiFBq&bGgLbo4W(;amFylc6q#6;6Q(rXt>5F1%5ThjygcYu@`tS5bksF1qtv+%YOfSo$TSr^W%gMB!xQ3De zu+>-);eXJemG5h35Z8E-iZ3bKsVl&JvC{f%MAeqkLG2KF}ha;iDN#BP=(%Hv(_a z{PGHflM_qtj|k&mN0eYFl>~)1=iL0Y|pBq&n)72> z#*%7ll8k(DePp;WK#ycKM23Y!XoD&rwRP>YiRCetr2QjB1c1qdeLr=8JVB0* z5pA@&p#F%evpz*W$lC9Y_?Bq+V6ASEQ1C<2MAvf17CHvh@iXoruZ6PZ1oQ}2^o_&G z-sW98k*eAhh#L%~q?s3^M}}3?!GR(@?Si8Ji6J=29Wpbpgs+b1j!F@ALuo9ysRWOC zQbI@on2fu~#z_g?y&rDOIEoQY6b0S=$eqZnZCk27KNFKt6KEH#%6jnLDX2x9NV>Urk+2nKlcy)|3$Hsd+wMuPV`&;y1+5FGS$cYm zhN2zcw$+N^J$<&13kBDA$vZ?i1e3;N7(b4myBJ%SdD+Z+ds#6-{Kh@@?+L;q4Z5Mn z!Lw4>x^yWsyePv@re?eu4t=SCBAD{H=vGF!2vqMxA#^o!8*9s$S!%W*?@D7v1lykl zBg)VWYZF_-9QTORX0rg7kNjC{T&7cQ>$8E*WYX`%Do>51-U~d)J6aj_GNMf2%Gu&+;pFzJAvR!ORpP(c zDvzXLOUJokOzAJ`<_5`sQvGQH&!-!vAi_MzsHk#SRqsCul4UF<42b(bHUfcL&B6xt zkk0iDL~YQBOa@N(#|nm0=cE!gtp07FzkXlEB#o+qKgIwQ+MKBKHLVGl(809-?6ikBAn;{Eya3E55SsQDsNF)>l;gGG)+@==rG1a8f zl01KE%`QzWYl#l^t!B-K17^PI1wD3A7IJ<~+fWhOVm*<0<6o#*oy0IY19 zS9{)CcouP_QK>f%ip_e7HdtSfdRqXdrkk(Q_zArJgp21dtub(34b+zj?v=K1Ovd7a z9RX2kP`K1Jx<0pwK>XfV6I00Wa zWX~|1DQ~BdQwtFl>3)`cdAsdD{WDGCdpR? z)Lvqy~SBnUC3&p78HUEUaQ~pF8yCz0#Dp@4rlIkIT}FVU@UB2CFuUba{oT~Ne)h( zEkKRsxk7|IIG}IrhesANG0qLIf$<#n?aVsthf<|GoO)W&*qYSyg0eFw2;;1|Tf)C; z$EC|wa9q%tu&*G6V;rP&{5RK$%lb|(soGvj-$OA@WU0qy!lR+k#$GSG+Kyh!mAgy8 zuP=&@xk=nEWXefXTDng?dD{2LsNx5=C9b5ddDe4Zr|91|!FJ1!G}A4}83&pP;9=Ak zMkckt$hvPYrXj?Wvgi8zp*ET?e}4g@;;h2-GN!{CWW-)F42CIA$ccs172BQJx=X%i z*C;ld*H?xG5;vt+^-qmF*x&o!xDa^dSp>N*AzTo^6yZj^w2?(k+M@QJJMN>V+_9!nR3(1Db5UvL8O|w*RdlAq_i&$)U zRxvn5LLeX@AZB4OFd!fxAT%>FFz;fnZblGz{d_ZwoIz=gl++g?i_EdY-k)E}z^MqW zp58Hq$r8lRH7}ClyUU8wJY^Na_qca7ndj6=Q$*;{hzWZ^8K3Xj80sUuRF|ApQ4o3h zI5KCmX2;tJ#xcJ2(A&cI;!?Fhcu;>(AsH4yVGKmJdg_s|`iL>fJDu2a_^A^`fcm^; zEyUpmL6C}^Ps6pwy7pVOV@^8E>vH>psQD%I^9&^@^|+k{M6Rj^7kw+3s10(gQn%4!12L?oxfwuZDko%ngoC@ z&t4S@G+Fu@lwy{4cl|l3yLssHMG{)neZ9a~Cj=rO4(KFLcS4V(#W9eUqGVj@qGCm} zMyy!Z8-{{HwG|0wZ1nz)&?nAIBm95kn-Bg>Lsaq=&g2L-3@1PK3BBtTDaFW8$e=;? zci*mx?9#!HVhi$s-@Cz%Io#oUUW;Q|pSM8i$;1#6YuJ1F_m@q-D>(NwmhbZ3g^42A z5-H)F9nGWdHh;7ra{qsroT^%z-VNBaIDuO7q)IL}mY%by4*j9*iT~H35BBpe4rAm+ zHHfc1nc&JV#X&hDmPjPb)CrMF)P+6rWj0t*-^SUH4#DJk`V3DyBlDs1As6YrjPA$6 z(41XldhxH%>UdqH^_SfjBHsG4X}bUc6;MG{myYp3Fxe>?u;pVRO4)_1xN5T9l5$pN zCv!6WqC1q?e6QMFd0M>74aA0}7?k_ezC`NV@7Fqm`?#||*tau$kwLeSo=b+}Qk>&) zYIMmFYamhWD5@GyGYY{nl-Il4Dlxlm937ZrK}CH;TY_1kRgbv2sl@m%=!eXmE+{>qQ^pcA)%@24)_fLo+v8c1}qnC^UX!)A3| zb=PQgP*NT!8%VW~L3kRi*=63`$TmMx{Ow-4d+h5~J(m_yFm|Mpd(M%bP3ZK0h4J`H z1sr`%@0H!8AChVA8+Ds5DmnGs8-xjmH}X1F7*dtC-N3&%X=0y}szh+pf#)V^Ezg%& zB%8?My|~?!2?n^O&cnkUOALT6d~5Iz|~y6iP4hVe`GH`wN7-rk9oRk`;up@2X z1}=<`Py=ycNOpO8L8|5*f2LY zV-^Jh0Pdwp-jv|*_rp-84;Z15q)@(V@bd1T)x3{QCy#NS_aN?I13B8-Cs)X8S*0QD zbjNn}FSr|H^>g6}M?_n($Zgl=Gh#4ym77%N0g?|uW?3D%NLRnIDPZf?2VaUFi$9^| ztq}>G-HsZa1jaEG$;YKMQ#rFQbXU+c<0}^F?#Xs63Zl@tXn_~OCWvJ{Mqt{_C=j6B z87a_h$!m$pH{1HY<48ycrDCKJAE;6fvp{8EKwd}H<MW;oFFK{k0^3^q<77lM zhaa^$1fQr*_mns(Smhx|M3bVYH$C8Cq(@M`{(LhL(F|P;H)9c|xrCQn!$q9nR?c?*(N7X%C(h@B8ITmlmp=2L?{Dq<)Z8YBssRukW34RMaT z4go)_&GQnvIczcGjsEWVJ<$WPM#{MsRo4er0eX8D(ar8HAe!?x_`#NSixUFBP8A#` zyHxr6#R%KyqD-#8?ss`>fHuI0WzO%Xtbb=0_o$fJzbdtPBjqOCk7YF!vg zJ?=z_TLE^Ya7wpQk3fvx`4fRu9h_0~rHIt%-59Wm1*_L^)C9~^qcn%@ud`dyZln8n z?nj6g#)8ei%pNe1{fKj9DDdiHO3nU~ldNv2_Aa2|KGIr$q&hX^?G`%IANmc1epZ+Q zJPxR5fshuzlH~ba%RU+-f3;`GK$wZ78t~RRjCU}w++dzoDdRX+fhaZ!XK7ykY4bD% z1q&>AwSnNLH8p6N#FaGQ7A?h>>sTD=`7K5huR-YV>xY()-BT`S?tdKK$hA#y)#4yT z+f10~Cc}O@-!EY=G0dBlqao`v+qjB8PDJw#%~vOliV#MY{7^~9%H9{Ayiovi9ay%& zs~adu(tnsZ7ujWA;RAK%g~`18t?JG@ofbw5UoTaOEmV0{+a+P0)<^NR7Qe#cX9+-h zqXXJUj4yo}iPRwf@|ChOSV{%NX=G}l7hoJ}*^5mun2ggEvW$U1y}KPYEndRvTwT#! zjMZi^D~SD5n&m)zmHjvSDGZ~FVxktmV+RNdd_|$`Z6nE5dq0oZ+nwJ4p|D!`I_njS zyFH%~w!E^=RJ)?~uO!9IHJq^DvAJ|f8F|d+u)(COens+Yv^+pVG$hW!8vBtFM9-pk z%I|QIpZentgk`Y{cauT2m@l+Nb0p+_ZE1V)yCY0pnfW_~CkTV+pLrOSXoKQR02rlW zWKjbSGL~OEFTyZHRliy>RXNlUbkPM<3kla&2>Col^v+c5h`p>Y{Vs9(jOdeq@Y}aF z9j4pELKA>lD|DjY$Ki_g9!0a_wJPtnpZqTn#sSQR>*B=URR_HZ+S^`*=<`#h8ol-n z-!2I_1zZRFp0UwGIm{TF-35iyEo&p^s{krc`*qioaPUBTeDKCwF8It^ev=73@G#o; zTc;-91xN`#xync4A*`Gws1{s+Q= zaB`x==a8T!Gu6W|>nWT0YHDocBdS>3d*;ALV$NWMJ8)wStRnB@D&cRdb%+-5{#a(# zn5tyl^4TSELV?EYK4;8w&o$Zwjy^#uEov-TaG2RM27Gh(Cw8UK*n5>!ehd=a%;gu%Ti`Qh%T3H)21l&9xEZ`K3()#Z9}Px}?b< zr)geVTHcv5!w8{q-ZIzShc{49fg`8t{o7FD_~oTnFo5*de*@R1dP(3?nWbV(Ol9R$Bf+-P`hEm!ov=DEW+5=UnPX?r!P%XP}b`?RQGDEzKicml*3= zg+RB&Bfv9+svAD-61~XBUa!?QOB>^TRZ@r~G{8oywH@ZSG8!;hk!g;B%&aBJh1FKL z-*n^YbR?XsGn<$gU}dB*;VACVgiX?Yu`IfaSt*^HdPUZeJDKXlZKV&1s@QPyL{6fX z=$o7`L8VX9`{{Pz-N}RFv0kB8Sqq@AK0e);W#g5lSg!BkQQaz}wKm=>Dw^x;`7oqf zbL^oYCp_T{7J;z@&VgaQb@~oS--RBSD2yYH5}$|XtWmA2m~_sSVrVgnXlkYkC0xQu zu%C@oH|25Exaz>2Z%9PFm)mEzcQ?eZaPx8+3Uv5rj;8w$r~fS(*Oto)6UPgF@i#wQ z8Oi52QK-wb(*NEU3Pmo*V+2nKgB)krGepVV@+L#_7CJoypa()W6%EDja|n5lEqRxY zBC^JMdk|K|S{Ayqpjp|oq#oKqQo>>iR)}uVSJ+em!8D^423;Z8^ui0Y9ZV{QRc3gmhK8eyw2+ax4_dF1Z)#T*&;Yt; zBnSgplO`<-K3g8V{)(&jRN@+iyX4d%zT&z9a)_t&XvFc9Ai^$9oy zAvTn_YEgZl*hSHq%??L>saf(KPObI`B*dPgo$X&smm`CH?{pI!EG9}T*l+99=z5mq zg@*y_DW>?(mwqbSKdKX0_beXO0d>l-$f(<6wi;G+p~R@81VcxQ)8?-qQBI@V@6b#w z$Cv;ArqSbjTRZU4d0rhfeM6&*{X5KLL)GSL%9)+B84XGoqmR2b+Me79_~vee+Ri3P zEH4M$p`jEBpYoe$-#AE2{&pop`vSA>iM6nd8P$-XNz1Py<8t@^Mfx~}#Wo7v7UP(@ z>GGZt?0C8sKq?&>Rf9X_i_y08>u{@mqQo}xe=uSvC{aF=w8lzf8k0^q_8QgRoI1AS zkbCE%Vcmjn3N(S}CGp&2x^p&ps}f)KStE=cFq6ky9>=cQq6KCbqkoQ*oxCPZKV*HW z{Teo&GPEUeONdxn_+QSQf`E%5rPefSApFigk;E`Ye2n?ey}HVdetMdn=d19hLhc5Pr?>90K;j9QWGpXr#tA^@fnFcdSjuQ#YiZnt*$Abm#Fur3mmy9K zR9o2)ojz3^u})A6ZQO`Qv<@jZ>kM+}0NzipD+_N$%Dqo*gBeF{Lpd{B%+C1uLkgYA zmZT(Bit5K$n_7W>M%nn#GN{$(^sMu$E;Dn((|XG{#m4wlQ%=T{>ki14v;g8xK9>Y- zb09*rr|aKC@C&8tq^YrSG1Rg)&uJ@08PnSPv|~$BW-5>wd)hGi&nGHiCFpCp^MMGc zmy6kTp%}+fg~ZPyC*zNRlzok12<5y6X!?ni-7%<4T9~{b8;J zM+AQp0+YpYO!u6CvlyVLkN(Y1>SP$t)3yJODyae3TzJfEe1?@Lw%g*ot zZeVE4mlw})b*QbbG)ep;Hxtgkc0fa$eIlhcU9~&62nyMFPka@9c622(-m#=gU~LPc z0WMT=vknK47-oHBGp=bClhpukc~7cP+h(L}>on-C8IHTOM(+_Rjt}f8EGf!gw>d(j z0JA?=%P!%)y4RmbYfVmvS$;nE0C_moO3jij=80i=BB_lx&XGMrI(o%7O0tIz zumbE6;#w3AM$_EWu&zdhxqfRE&rR>JqlmR;de6)M&PxI2F=gZ+n#r(XQq-(oDtx&3 z?A|QpcrQQ0mqFR?Qp$`JP35#WQzV7M5$hf@HNp}}tw7=pbflP~TjJVCR(K$P4y$1@ zq%VZnJ9aqqwCqni#z&rCAL!05U`(Qr1Ia=A`~SJ}!N6l1!*S6w^BBNMU~QkA@E(s} zM$v^ZiP9Dr()*R4CtN-1gqiw(F(Kny_cVe5&-{}kSfk1?~Cq8$>A}#S-<*p@&vKG zkGrMU5~CPDGh$ebgE*@S2>bajBIVue13?(9&Y+%oI~iODSaotbOkYF_=T(|Ee#h>c z6`>uNTwcy)O2W1i2~d_OGQO~L-c&6(su@g{pV=xs5-ePv?IEGVCgz69bSg50gx=G& z`iH7|A#r+uBb2=9UcFhk$)KWaHDx{eCm#qVejV4LxESj``0Z>@$PJJO$Z8q-&X-@W z9@F=Zs_B1)ug`y@`n3b)6!-V=2>_nr3g2tsHs}ZCx`D19mVwY1?Yi2}PZ*0Hnv%ew zcux+wpWX2FCn_oVOGZq-0$SK{GD6IC4x{Qr--}6`Z`AdUy^RPLJEhxu!G;PU3E*dl z#CkGs*q0!HTEacLj9N0U%#jb|Mv_2J(&th~@sk|gHcJ)+K2+&+?^xJl&v&mr*eb8R8a#=y8tL8`S)kHpnGT%jZH zuN70m)pCN^Z+SI?aFAP9rqnuocAS-{X-hY3%(j8ZLEi8K!K;qw1N_5^D9G0thO0k# zwgI!R{Iq{`1wG6NJr_dfQ>F|s98eD|9s{mqt9bKZ8Ts*?qHjB9Xe`xK@n+cV&=yR< zxX=_L)d~xaEx92#So!~-%(+gN`AW8ug2NjG5=v_ksK1GftU;6jl>ajLm)lt^Wrqam zN5__l)-*4uA!?KHSeK6HM*gn2lza(^4zl&6u;JV?&!uKcXSXE&QU9|nFCr)$vv5|z zLbHF+X!0Z886d}X5tqiTJ8kqGn4x?IXa@(+Nj$5W!D9>u}Isc;FwvNZs9WdJ^xsD zvhbN2X4nB9ef^OEWoM6#7|fgcA6t0E)+2-kFgok^+xO+2p!f|IFzl0lQ^KIosh(t+ zs%Y!Bg?E@7MJ{y$F%b`3mc#w>{qyZN$vRisZ{$l`SaOrf3{_XFKhh450VQKUQ5iD% z>qF4&5C!j8B;cg`>5>Y}e=X(_(pq3zXksHuD-~ioAIk3f4&1#;Ed{nq4{#Fp2=GlP zkg=PE*EdXxf-QdT%Rw^5u`fI3YFmx(nRKzGNxKwG6o6=vRpSpE`h2s&;12RHA`&6V zF0CeLJ<)3(F1w3?+X2_AO4w{D0S-}sp-#5V?i;EyyvJAblX`>yedP3Mo1h1o62kHL zsDigZ!-*z|mkobQc7|9`v@(bfkOkT>NMqPYC{h+@D*vb*cwvfT5b8-o89BB{;h^I)m0p%NogZjT64kWXeOT2XHbK(@z zmVy`n$>h7AP6)e%y!wN^8}X4_RvcJjT~Zh~Wy|XP z22Gi{*FCeEabDj%ZYJvJxwFj?5~0}VG(%#EbzN4so#KEMjBrnHCVi{4M}#DoYW(n> z7?@#qm{wtS>Xfjz&V5DXzy?yZM}+*)SC6)Y;g+n-<}6jo3v_n)QK3;KL2gfUf6vs6 zc5T>;9os*Xm^Dp&AE6u@xy2IZ@!&01r$JuCDG&TQ^lzbX)_BuQb}w1ww-7nH3~&}N zu2iklkge!x5#kwukL}@vulPC63WRnL3%2NnB%T zVM5tnhL)k3bdfa)o>n7dfP`s+j~+>nZpE%gsOJ&SkbnW@dt3!3j--xDPeusU6|yt} zLXVQf5(RN&p0Q8N7eX()pY)hFsavRIiW)@~(K@dBqfSb~!0X9B;oisK^&a1)0@+`H zFtpdR9c7>Pajx5<(9e#BY4ceQZlt*Ee|)$A(~-4wp_XluN-?d~LRrs(t* zOJ*L|0wAXYJf9OMWus`_G@VWD3)B&l@Ju&tMkVB$i3;FbsMir_tKjr5MVD7@S_)+y zHWWzC02Fr9$!M9`i7-Oy`~ZwvEYR&y*PX;YUD_`Z0F({Z4DYV7$K61dsvtWf&W9rl_4Kwxx={3@jm2zEaW2TFr*jxEK4_Mz7rTBokVI>&ISXE0 zV~!wLW8I zO)5I?%8M--?E|3Nq}R5dUm!9t>X-Y$)OsWHd41^|&iF(ir_a7v6`yN&3ii}e(?F;z z`8wAO0Qsu$%iw0ben(XV8IT$i{GXTx(qazNbM44f&Wfv#k>h)}H;3Qpp>Q%fLevQC z6IRPKoXNcg(=H$5mH?tn^K|u#)YHx#By`A*xK6AmSa^5J`nvZpk|gH0h!2CRD(>uh zt^bb^0(N?f6S`hd8nRJVbdtd>30l~F9q}pZvg}`E8wr2f3hVt%)76Dl0%3g}eE zv0CuOilm zk?&>F3Ho^;RJq4H2^0T`%i=r5_(m2ZjN~7fCgrgT3f!JNMdpD-PMet|t2TO!aS&#p z7RVNC1(z_1lI)`j{^a`LtE_N2hUH1=ujVT1YM4ELeq~vn^SYx?l3A0DBdYjsvhRaqeGXrfQdtQvOtXJs z%Li$t^gk&?ef_MII~|{$B@|Y!!OZuc#(aQzBjUF2nTClCBgX8}Dug?Ue4u84gd1;> zu;y?BKd%#&MoI>xek>lhI_8%V>hV6@9=)6i=4k+1R{C5vrZ#a?f~ z?yefqZZHcJW5~h%-?O`%t4n-O)Z5Y*yUj*k$5)88jbfyZpg}@fu`eu@7&R_g5%2v9 zWYDPM<4*#1t*;|+%OO~QdOtKKR;&`rPhFSc9V3N#M|fa1^N zmds9?hT`umyf{EJx^j=%=*%{dg@xNxMg%F~|Aiy<{j1F5AjxwH4ogbDeY6&yHMBgLcog0>(@X28vCEt<20HJjDv1|qCAM0 zMD)MKM{ub(Lun?0;3o{}Ms%LQOx(GEzXQup(f?g{5)#WafYMDdMuk}i2^5sTZ6`&;m zo4XzKN=+?~0<;*d8%WhS_7wwxXvz*-EQ|i`q1xOV!rW#}Ycw2mG-m%0c|gzAtf=d4 zBDdv@&%=uMlZ*Ff04^C{bR@wbXfI=u|4Nq@@QO9q=*Gd3^Uo-TYd&a(P>i|8&rWBi z6OGCp#6R1mYGjePm^N-Xi?e~^?K4wUrjl=+F|^RvHq|2c>OU!!`jA1D+=K2t z)6Wq~Nsj-nK_#k05!WjtO~8Y^_2P{0B57q>h}kaTvIt4{lJ$d{u552TUuvinRWyeI zIRDMMi*CKqu<-;jyT1QnY$<~B&zuzOfO%0Dl}1A=pdB6WCf`ivq#t6YCtZ%H>G`e) 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 =$u@!4~Z&GgWnM~ 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 W@_GW|_Dt%^tcGeVdOuy%xc?u{@5E;S literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_placed.dcp b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_placed.dcp new file mode 100644 index 0000000000000000000000000000000000000000..62baf57e7b2ed03f10aa535326965619478fefc9 GIT binary patch literal 504415 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

5u&W;vm7>&pBwc%_@WP_8u@bhV@^ximK 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

^*t6`J{9;`8SgW4flv-q8qf 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

5Gr`d7i&xs(!8E|<<&-)% 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�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 + + +1.1 On-Chip Components +---------------------- + ++----------------+-----------+----------+-----------+-----------------+ +| On-Chip | Power (W) | Used | Available | Utilization (%) | ++----------------+-----------+----------+-----------+-----------------+ +| Clocks | <0.001 | 4 | --- | --- | +| Slice Logic | <0.001 | 134 | --- | --- | +| LUT as Logic | <0.001 | 8 | 17600 | 0.05 | +| CARRY4 | <0.001 | 7 | 4400 | 0.16 | +| Register | <0.001 | 26 | 35200 | 0.07 | +| Others | 0.000 | 93 | --- | --- | +| Signals | <0.001 | 38 | --- | --- | +| I/O | <0.001 | 1 | 54 | 1.85 | +| PS7 | 1.172 | 1 | --- | --- | +| Static Power | 0.118 | | | | +| Total | 1.291 | | | | ++----------------+-----------+----------+-----------+-----------------+ + + +1.2 Power Supply Summary +------------------------ + ++-----------+-------------+-----------+-------------+------------+ +| Source | Voltage (V) | Total (A) | Dynamic (A) | Static (A) | ++-----------+-------------+-----------+-------------+------------+ +| Vccint | 1.000 | 0.006 | 0.000 | 0.006 | +| Vccaux | 1.800 | 0.007 | 0.000 | 0.007 | +| Vcco33 | 3.300 | 0.001 | 0.000 | 0.001 | +| Vcco25 | 2.500 | 0.000 | 0.000 | 0.000 | +| Vcco18 | 1.800 | 0.000 | 0.000 | 0.000 | +| Vcco15 | 1.500 | 0.000 | 0.000 | 0.000 | +| Vcco135 | 1.350 | 0.000 | 0.000 | 0.000 | +| Vcco12 | 1.200 | 0.000 | 0.000 | 0.000 | +| Vccaux_io | 1.800 | 0.000 | 0.000 | 0.000 | +| Vccbram | 1.000 | 0.000 | 0.000 | 0.000 | +| MGTAVcc | 1.000 | 0.000 | 0.000 | 0.000 | +| MGTAVtt | 1.200 | 0.000 | 0.000 | 0.000 | +| MGTVccaux | 1.800 | 0.000 | 0.000 | 0.000 | +| Vccpint | 1.000 | 0.687 | 0.661 | 0.026 | +| Vccpaux | 1.800 | 0.037 | 0.026 | 0.010 | +| Vccpll | 1.800 | 0.017 | 0.014 | 0.003 | +| Vcco_ddr | 1.350 | 0.321 | 0.319 | 0.002 | +| Vcco_mio0 | 3.300 | 0.003 | 0.002 | 0.001 | +| Vcco_mio1 | 3.300 | 0.002 | 0.001 | 0.001 | +| Vccadc | 1.800 | 0.020 | 0.000 | 0.020 | ++-----------+-------------+-----------+-------------+------------+ + + +1.3 Confidence Level +-------------------- + ++-----------------------------+------------+------------------------------------------------+------------------------------------------------------------------------------------------------------------+ +| User Input Data | Confidence | Details | Action | ++-----------------------------+------------+------------------------------------------------+------------------------------------------------------------------------------------------------------------+ +| Design implementation state | High | Design is routed | | +| Clock nodes activity | High | User specified more than 95% of clocks | | +| I/O nodes activity | High | User specified more than 95% of inputs | | +| Internal nodes activity | Medium | User specified less than 25% of internal nodes | Provide missing internal nodes activity with simulation results or by editing the "By Resource Type" views | +| Device models | High | Device models are Production | | +| | | | | +| Overall confidence level | Medium | | | ++-----------------------------+------------+------------------------------------------------+------------------------------------------------------------------------------------------------------------+ + + +2. Settings +----------- + +2.1 Environment +--------------- + ++-----------------------+------------------------+ +| Ambient Temp (C) | 25.0 | +| ThetaJA (C/W) | 11.5 | +| Airflow (LFM) | 250 | +| Heat Sink | none | +| ThetaSA (C/W) | 0.0 | +| Board Selection | medium (10"x10") | +| # of Board Layers | 8to11 (8 to 11 Layers) | +| Board Temperature (C) | 25.0 | ++-----------------------+------------------------+ + + +2.2 Clock Constraints +--------------------- + ++------------+-------------------------------------------------------------+-----------------+ +| Clock | Domain | Constraint (ns) | ++------------+-------------------------------------------------------------+-----------------+ +| clk_fpga_0 | design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] | 20.0 | ++------------+-------------------------------------------------------------+-----------------+ + + +3. Detailed Reports +------------------- + +3.1 By Hierarchy +---------------- + ++--------------------------+-----------+ +| Name | Power (W) | ++--------------------------+-----------+ +| design_1_wrapper | 1.173 | +| design_1_i | 1.172 | +| led_0 | <0.001 | +| inst | <0.001 | +| processing_system7_0 | 1.172 | +| inst | 1.172 | ++--------------------------+-----------+ + + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_power_summary_routed.pb b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_power_summary_routed.pb new file mode 100644 index 0000000000000000000000000000000000000000..7941c5ca31ba619cabf33d2304a9f9f7c301037d GIT binary patch literal 711 zcmaiyL2DC16o7Y7a}b51r=pM%Y%eWAL&c;;V?q?ADD@!qq8N53?da}IoS98cL0T<~ zco3zq1;K+97Q7XN_2S9ELJ;Xe+>3h9!u|lo9D1?No2Umb&f(+Zy*IoE@9oVMj~y=- zCRTSX&hP~yaDz46j-(Pd1^4g;ujLYtFhv~9h;pe^1zfciZBy034iU7iGp5w$Oe)c! zOzFSWC2|}~>iKR%QO*Vt%mr=}TXCV&@^7m`lzTcARg!&U?`o6beoMdXz@ejSmH41# zy{ZMnH|}ke(_x55`IXOmO8q=|GV=CFaxxqR&&Gi9I4~#zQ^TlqNq#%kFIm=5H7SFK zli-=AuAc%Xr-5MwnANv`hL!lNW%X*oIf$f&!L)J1=rVZUFqs7puL84c!1y{aaDb^{ zbQ8R9n6$vd+rX?1j2D2x9bjtM?|>(Zz~JumqkJt|L9v*qB@fZ_C;pl2G1}Q#S_;pZ_w`ZbZ-7-7Y)^kq;m}G)e7$Gh2HNC za_@U+^orE0mn~w`Ce;h|xFA@~HyAFT7{R=WZI|1(uAwu6DX51li>*Md)KcT~Q(xx`ib2-G-hoh&P5!~_hA#%3-6|T#{H)TC5OUnwy(gRC$1h;eilCgJc8a0(k}i81)S~ literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_route_status.rpt b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_route_status.rpt new file mode 100644 index 0000000..18db509 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_route_status.rpt @@ -0,0 +1,11 @@ +Design Route Status + : # nets : + ------------------------------------------- : ----------- : + # of logical nets.......................... : 492 : + # of nets not needing routing.......... : 364 : + # of internally routed nets........ : 364 : + # of routable nets..................... : 128 : + # of fully routed nets............. : 128 : + # of nets with routing errors.......... : 0 : + ------------------------------------------- : ----------- : + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_routed.dcp b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_routed.dcp new file mode 100644 index 0000000000000000000000000000000000000000..cdeb729fec54d4dff2dbee6689ca5ca1918e78b0 GIT binary patch literal 541746 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%0DT(d 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
    H#$^x&j(7*!jrFk*{>T@x z1)~jHCHEMm8M_=DGgWDj>j0u(WI9TJA72sK{ggc zssOzO*a;ByYA+~WG5F+qtV`J%YLVR=-?*UhPI_TB4{D^? zv1O(o7(G!jtIG0foLk=dZv%n z>Pv|Ls_h_8q8wZIt>^2`xD$HN>kap2HPm<{5dpITz8U>`I|3#V;2068A#ID={t$xY zmd|inTKlB8dS;4Jcok{`3|D`T+dWGk9Uo}yJMZE@%(ZWv)R&-$Uh%qW|H01;Z-K5XbcD>08!%F46$`f1Rv?eD6Kac{L4uN@|=rJTS z3Gy;BHj`iPk-EV24PO<{z?=!%5-**;kTtIlNlKW{a-HNP1hyR-WjpP#BaU-F8DE3n;$jcz5`%p+_ocm6@_vA__Dp{YM$ z=pJigNuH^7t&%ka7`AV>0pR6o0u?vz0676Dz{Aih%0@KIF&#yAhHmIt#Ob!aV;yR% zvcyGyiuc!%Ty{HS@ESP*dI>r9?D?oS*ncH$x8FG~ApZ<>b;Vz>!s{e2rj>b_?*=79 zMouSqe-0ZW-k%*mpoaqi<5vV=yE?9&fGq#G_UwCBTcwF0cHuKrX=|^Yvb4BQA^TPH z=)c!PUR^yq?UW$@YUq@l?*d9b3V)&J&@En5+ktzoL$8vGPvFuNDb&fScH;v-csE$l zmK*aZk(6zwn>5--W4aN#gY$(>)MCeZzHUt!3b)=s5kdn$VybE{!7!LV+ZMW}tCwJ< zf0M)%u&XDqQ(PiNLeaB@;eMjIlpH2?H}z0x`XwxPDS-j~#n5x+ebtrq283dbUou2% zFF+&Nk>e}Zsb&`{m%srkpE+(q#8oYNJ_0$s^Ygqlabx!P5E$IfsA3q5W$G<9f+RU6 z&JyHICo2R0teX`T40;vwBF<~8752TRi9<5=Ax8w$emyY8bn`e>t;^Se(>QM&-XfH6 z^IK4zZds%@Y*`>11VT)0Xs~ z&GmcWBzVrKZTd8Zg+<-wes4Tg321|`e$RxVvfrrS@PxD*)fq)xbVGd8Ld`8x`Mx8> zLb@(-Jlk28EP2%p$0=Tr19Y64C8YcI(ht=#xyrE#Yzw~wi}y`#m9zGsc?2PvN*o1V zzqT&Y)MdV|a?A|#!UT$~e=a0u6v#X5--&npuns3keEe~Ets$Z&zq**k(b16~lYV9u z#|==4(XvhQHmr(i?gu2XV)8P{d;B=$sZXhM`O%cu-=S16)O2qgGNeO8jQ+MeDLExnd~mV_q(E+9kFdgQzNo)hVKRAm;FM>DHv7CAR!(kt*~(GyD~yZN=tYF zm_wk{+;TT^Auq9_KKc@PeUdp4kGjB|i=XG#u8gi?5%o|Gy0lxKFV@IYnga`YDVAh< z1pHtFqR$r&;&m5I1{=sCazs!H*D)s?5*G41gRdZXCFEw&{guzXKc)a0x4eE*_oFYW zuxy|`KXujVAUWys>=vFD6FrlK<~fk=qC!jxLl(S5YjEu;lj82-KyI~!rbncm235${ z3uFA^Jspse0z#2zRv8&CQcsA2cWaQ7uZi;0tB%cKx&H3M4+|}*VFlAt^oCLgcTpLj zY-uJy$Hyd>!XsR*HFI8o(7CpvT4{CIJZt779eE}1DV@cGcIdRg>? z1a20GludmL<>9WiZS4c|yyZu$E*P@og-EE&UYx^sY6lBnK(HpQ5d?dWcIeZ!xUh@G zXTd(#m6z@AQPTv48ipD+_7k8q!Juit_VN^a$c(qcxi3#b%qTno zt+NDT_7&}z9}>SSsJ)Db@3m0611}u_44EHE(6EV;?uiHP77C;dCrUeTT;s(86z@6$ zkshG}oxLJ|VVSb8?bjbWE@yC5;t)|tiWWLz$)58oNCShQ0000$0Mtbz$}UQ)-Zmis z0BjKe0$_ck#wJb{X102adTx#e_Vy-@dL{;r)*f{3#zvD_I!>$VXrfzhYNeKkbwUtO})Ev~jU%xB54aB%W|k zLK-fOxw3=jSKMmmtKFv4k4iQU2Um)o3cf7dk@22l-L^z`SXMt?Z5-bmS{N_4HbM(D z8nHJvHbduquUwH--U~MF=Ea`&O*vj~?-%7*E{3<*e`h@Qm!4hu;+(_vnY;7;?8cKz z)|&?0wF?g|IJ3RyO%G`a+mLGc^>D@g6!e?jM}K`~CHf1+V{>Qw&(qMnAO|mBRnzp> zp6G`=BKXD*MLI6Mo_=e_JyOS=-EHwx!bzzcHr`hQYK>RHim&STPSj5y9VaYs+D}Jr ze$S+uus)rJjBh1%PezYENO*3iDOK*QU*-#4VW5v)?m9<)Ax{Z6&aUg7=3O1P`I|XA zdnxm^>>Rc^OIVQPuVL2&3xI`WN9BD^9-H|6&!Crn59tM;G3Y8(;G1JN7i%q9Z((+S zPGapK|KNel;|6=;D|u~dyi;vz>uuibVaet9+xp>1+pS^`eX^>73Uc{N>}!WzYiBP* zn04*Q-an5o=lEWPEtAuTr<%NRSap?qM4u=0J^<_H$E@p`zA zEMSK0?|o=wSI-NYErg4e6Vt)Yib}7#6!^0c=K|hWyjjhSz$OE%`(e8NwOh5nh3dkE z3zJa{xp6bTJ9xC{XNQvUJl&8=k32$;T^l?f`{jV<`UW51iI`*0fj1CxELWs-qsybB z^pQcoA)j!j+p^o$o$WLjycw%{#PA6_b$VpC%YQ|U|0$M&1~@Kq#|$f;(4q0v-M>PU zSHrY~|_;(<%97rcAwA zs3Z_m%$>kG)u8k6vS_)jT!+Q-LTvaf8f^2Wbt?mQxS(mg`5f3lO{4mcb{!9RpXmxv z78DuqwAZ4gu4l*QgE5D1x84VW-%GOx=a*#%iu=ujEk?evp2<+RYw_X1F6?pEm#UxF zN`&5h$;xmIcE^XtUF`G3+w zv$%6z>M-Xx+8rbegI05@oMNcvC>k=9^@?nB;`jXFOta>eg&!=cmE+@LoQ@fB&3kd>Kgl(xn?WhZ3JjKjy6vz zrAWPEC=@_jGyZr4&ksz=d^{P|vA$Pz$qe&dUa|!W{hah$;Qu!2UjirJ0<0Y-+JDh2 zw~u$NpW^lZkK(}pOBbmlHI$~(Bv;P-p3IGbam6%wyYlb9>{_5WL1NCy^j14|)lzpj z&r*P)DjBqTaO4$}G$B)op=efRdvKE49*X^`r2!jMsqo=e4iFeF^lx_bGaCFkb9-PK zKqqccn#z*=znKd*KqeH^v}z#So%yxGm&0Iyq+O9}RrB^Lui#Y_$#qOys(VHqF^I!drkaL0r$tbXO;L`vWM=ZX5*y5KSXf_9#!4sBaua z0{CkppKdpjG`dogrgWQC~OC>oF2IU%wLe| z!co+pu`Np}V5->cyx!2#eg>=T9#fOiX@g8{ZhHRdL5>aRBoKgU3Z1$~38hR8=p+&# z&aLx&C}3iX3*9>Jo+_cfb^EZATvLP5*@^90zA)5HM4>6AJh+@^fwm2M1M!68k{idc*xrc99{> zxGYYic)ywq&q_EjaGxN#xPv`U0DOByP(eM>gCveTY%Sk9G!KG$T?T{wSCHZEs2B!L zoJUpx14nib@J4X2qJ~2|QPf(m5Qcrug@As)ZC{TM=uZoBYy*3NL#LR&ZFeAeXJjyO zlaLcJ&ZcvMn;kyYojp0e%?5h&O-gWrJFfpzBXB|AY{`qwq2}AEAm03&xJeH!5y$*M zNI*+}EJ(3g9`w|3=9Da2rkuXNYD)@dUM_~qD&B74M4p-nx7G-nElh738J$)q{O2!^ z%nEDHoE`vXlkpRfkW#H-U~!Yr_g1r2xIL$-yOq5yC!5+)S3Snf{X*Ez$;wpf`Wdhz zBeA1mSUK`*0d^aE71e~H)#oQ2yKNUu*{kznbf1`z8`g9f>W$+QF)VBnc$5M;IjTIb zHb5L=#~+YKMngx%NOI)%!t6=kvIWHzB%x)#e|&sAHjlG;%0q1S!GG3~lQ+#wZU`{y z8t0)+4Oh;{(x%EWTI@UD`6tx3FH$5QB=fD!!lU%de-n3f1{h9^2$5#SYUE`|ab)$t zW~uZ^YJgg)jL!2g86$BtCP*E-+T~)f*DHM2j(7Zb?c_=JN~*nBKkC=(4c^`bcM`;% zuh=Qfufy*c;hmKsOORXh5~MgNE41f-Ac=0o#u6ELeFEYz?Goj^^#FR${Hl=Pz;6&> zkGJOvz|_3hv=ln&{n3;v&*+?3rYT2G zAz!634hdR)-gq=73HsTYpC)&7x?XeXR?{Bs>4fSg$&De?;U`BPr@9>q-_BX#vZSgU zJd87g@K}{D4N~qRwN`5PJD9d=jFvh7_X~5fyZt%2_yW7%Dw@i6#+stufi=tOhMj@i zU6}O?i0=1R;7*2=KL?_aXvp(=&>DcbFGMjEw%N<#C;LgeCFJ02@I(S$Oom-~QW<#$ z<76$3Ig>g+rDCYTQPg!@Rq)e&kFn+1Od8T$?h<(Y(vor%x811$ZCR$L+RIFqVmU9j ztroJbE1rM@rb$Az0888_6vPHdQ-PRC1c%l9eg>pe<~nhBY?wfC4Wm34dd-M)ZWaMq zF@f{KXLb@v!+YY%1Ze%r-E%85#3Q9X#*x#lP79o31hs9`X)GGThF1dlnTMiW>lDZ9 zcar>FcPyPjaROk#?kM{ZgAvo9{ZErr&Vn99oj#e2bzlwvLwr*?RrQeMAjRzvI)fpd z)t`9?MyZ?{2CN!zVgcyw!D)}^YN*p`jG<`>sH!0c`Y7&s(y10f)~Hk3f5N^owLpiz z%elI%qAH_*S5i+zM(4;3)j2~t(I{G1?%o>7IFVV|iWK!Xc3&-rD#!Z&k>v`(R73pv z0_K#-sp%l94krv$XVEf zoJABp4ml_hz&VFg)oMut{x?JoB`Vzg7t|9NB@D$gOF8FkRaI_&!Y-a(fT|wvAQ3>` zE|MMuH8G4~E~l!^JA?@uYL0)XeMWB#t=hUE3(EhkIms#-~113?Vs2g$KE;7SvfmMdOxaW#KAU7YradV zLtuQ|h zkg|UCQeH7Py;uE|r*J8!cHIxmBNX)lo6_%2<;g@exdKHy#!=jZuC|+b4-$VM-X@>_ z^7R5C2)cQPa5gE&0GpjZx@mx0V8K#Q2n0U%9q0GfJQ~#;{hUM}DJz|}d|+=*K!pU>V}6pe(k=uN0d42=klkz^VRZvH^91(3*HQy~yIw6L^h3b!=?6bH7zaRg1Qq zNXN%ua3E7LVw0)Bobg5GJdChl1zx2i9JYS;0+VT9qaUus42of|SWI=4A4lYakkW+oHNdAAKm;wG9m1@d?g(d z3VkZp%cn8c{Of~IJx2Xxa_B0ZAJz)VWRQ!?bQ5e8(g{IwaIlF*l7i$z?4}k<3jHXz zbH=&ILFh^3Ul_^tJS)TcBBW!yU>AvG4+}8T8tDVd>^xHKEFLAM_V;szS?LC((g`k> zU9hKEw+Gr;5%b0pGlpHOd~farks0L$i#0fFq}qK zA3}^@VpUkzM4+`Sa(8UsSKklUkLoR?S{99(CSQ6_NcHs9yrlZTqOu-MN?huqGNY|x zfaF8R+$LXxCJ>rQ(M8cQuUeLr;xDP2-dpXRoSH2|Um_ZLI!R(0StgGJw1c_Shm1y6 z8rk1o9T%*ee7(Xk%bRcxF|l#+dpac5x)vaFy5r7HT%U-Vj;(i9)LgG=k&ca#tSg@) z)Z_I!BsAFX9KxJhJ{P~2ZiyOXaDy%`W|GAa$=6I%_JV>A+@mj~3vlrDs)pC-q@29N z+i_}|b)Y8r$Gd6V9|jhwWyvbYC4%^s6k^umS#gS=ch*63k*Hn|r3@nNaOtnl5%}gvx*DjEX0A;AZ?5W38>}h1x7+AoG zsF9VafthQgfPm>2W!b{gVF3QOW=O!8<5_?J0Pr9H0O~15ZEHYAhej_77JedX(*!vr2V^lL$%8-XHck_FB5MU=phnr&? zR2*N_WleS1352PVWY<}*$dQk`DpWCJZ$AoeyB^912`0?86DhC0K|dZ8F&mTtbw5<4 z10cxZPj0-z+1fag1Mj`rpsll7A^DJA4AgFd2OwPg5tQlWxHMdvsGw1C{>Nv95#GQ9 zJ^}@kJ%h5c%zkvPvI(Tll~$Z_*LxuJT?L0$CwOgf5+hQzACCNGWaupON)3rNxGiWK zgYG;giI<)T1yLzxQ@ry(TB}8y!68-9E06t(Da!AT+_OobY%sA9$9l3nIab{`bel1V zE$`UUx?)!Lvu54Tml3TIwTMGlnlc_})XvBVy6X=+K)UV%N`-o(y1a>gST;a1$lKwE zZ4DnRJiCN2`v!htTjjZc*VzQp&bXUqt6qpGhPjEq&L?3l`-Zl(C!ovPUl)c**`+gh zIuqFxOi?vG-eqv8ZTyZYpBu6zTwSTc;fY3qOm3W8F9B(y_zK*I|KA=pp#P5CetUH5 z+oS&)So_Ja$k@If~enLQmeg|A%!A|}GAsGx7C`>! z(P-5@RRCy_i3(GQ#RN&!G&r$dkw<4gPJ6E5S~sb_6Dcpx_70h+SgfCpmJ*J&u=-Ey zcAYPYmaHph`@L8eAXcS4yOkV$MwLB~eKg5veez`-F0td9oO_`<=ghbgYdPrpNp0?d zN~#X{u-pcvIMND!Ip`_9P1Iqw__D(-&Bawd-*51#S{kR=gGKW~qXi=CfOE}eI(Ox$ zUPhO%6{p%1qNY_T_}8HVf9yCsNGMw=){k*nmOxOKW*`;&>97{N5SISL8WAKTJt$0k zu)-iO@085K+dsWLli%5woAV!(5&=YRQ*nu+cm`IG1_S~C_)kRi(*~BR{@Za5pa1~i z-(SVQj_jSCGB&cObGNbnrx5O-p4mGoAV6a${Qpq>RrGJ6fbhew*Au%`mujuaQpAZgj>cx8Y2e)Sp7c#Ph{me E2jp-7asU7T literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_timing_summary_routed.pb b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_timing_summary_routed.pb new file mode 100644 index 0000000000000000000000000000000000000000..73dd77aebedd58ed70a8beaf4625518702137c85 GIT binary patch literal 106 zcmd;LGcqtV(leRFtQnG-o0*rckeHX4Q(2r@tdLfepR3@RTac5Qo0?aWnxc@GT9T7l zT%vcB$DpsoaVjqZ5IhiK*dT1&D!EIh(eA1wNMwOL!v}feqpJV^i#twL1FO+y*q|c~ E01%5IhyVZp literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_timing_summary_routed.rpt b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_timing_summary_routed.rpt new file mode 100644 index 0000000..10b2124 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_timing_summary_routed.rpt @@ -0,0 +1,1291 @@ +Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +| Date : Fri Aug 17 17:45:41 2018 +| Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +| Command : report_timing_summary -max_paths 10 -file design_1_wrapper_timing_summary_routed.rpt -pb design_1_wrapper_timing_summary_routed.pb -rpx design_1_wrapper_timing_summary_routed.rpx -warn_on_violation +| Design : design_1_wrapper +| Device : 7z010-clg225 +| Speed File : -1 PRODUCTION 1.11 2014-09-11 +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +Timing Summary Report + +------------------------------------------------------------------------------------------------ +| Timer Settings +| -------------- +------------------------------------------------------------------------------------------------ + + Enable Multi Corner Analysis : Yes + Enable Pessimism Removal : Yes + Pessimism Removal Resolution : Nearest Common Node + Enable Input Delay Default Clock : No + Enable Preset / Clear Arcs : No + Disable Flight Delays : No + Ignore I/O Paths : No + Timing Early Launch at Borrowing Latches : false + + Corner Analyze Analyze + Name Max Paths Min Paths + ------ --------- --------- + Slow Yes Yes + Fast Yes Yes + + + +check_timing report + +Table of Contents +----------------- +1. checking no_clock +2. checking constant_clock +3. checking pulse_width_clock +4. checking unconstrained_internal_endpoints +5. checking no_input_delay +6. checking no_output_delay +7. checking multiple_clock +8. checking generated_clocks +9. checking loops +10. checking partial_input_delay +11. checking partial_output_delay +12. checking latch_loops + +1. checking no_clock +-------------------- + There are 0 register/latch pins with no clock. + + +2. checking constant_clock +-------------------------- + There are 0 register/latch pins with constant_clock. + + +3. checking pulse_width_clock +----------------------------- + There are 0 register/latch pins which need pulse_width check + + +4. checking unconstrained_internal_endpoints +-------------------------------------------- + There are 0 pins that are not constrained for maximum delay. + + There are 0 pins that are not constrained for maximum delay due to constant clock. + + +5. checking no_input_delay +-------------------------- + There are 0 input ports with no input delay specified. + + There are 0 input ports with no input delay but user has a false path constraint. + + +6. checking no_output_delay +--------------------------- + There is 1 port with no output delay specified. (HIGH) + + There are 0 ports with no output delay but user has a false path constraint + + There are 0 ports with no output delay but with a timing clock defined on it or propagating through it + + +7. checking multiple_clock +-------------------------- + There are 0 register/latch pins with multiple clocks. + + +8. checking generated_clocks +---------------------------- + There are 0 generated clocks that are not connected to a clock source. + + +9. checking loops +----------------- + There are 0 combinational loops in the design. + + +10. checking partial_input_delay +-------------------------------- + There are 0 input ports with partial input delay specified. + + +11. checking partial_output_delay +--------------------------------- + There are 0 ports with partial output delay specified. + + +12. checking latch_loops +------------------------ + There are 0 combinational latch loops in the design through latch input + + + +------------------------------------------------------------------------------------------------ +| Design Timing Summary +| --------------------- +------------------------------------------------------------------------------------------------ + + WNS(ns) TNS(ns) TNS Failing Endpoints TNS Total Endpoints WHS(ns) THS(ns) THS Failing Endpoints THS Total Endpoints WPWS(ns) TPWS(ns) TPWS Failing Endpoints TPWS Total Endpoints + ------- ------- --------------------- ------------------- ------- ------- --------------------- ------------------- -------- -------- ---------------------- -------------------- + 15.285 0.000 0 51 0.252 0.000 0 51 9.500 0.000 0 27 + + +All user specified timing constraints are met. + + +------------------------------------------------------------------------------------------------ +| Clock Summary +| ------------- +------------------------------------------------------------------------------------------------ + +Clock Waveform(ns) Period(ns) Frequency(MHz) +----- ------------ ---------- -------------- +clk_fpga_0 {0.000 10.000} 20.000 50.000 +clk_fpga_1 {0.000 5.000} 10.000 100.000 + + +------------------------------------------------------------------------------------------------ +| Intra Clock Table +| ----------------- +------------------------------------------------------------------------------------------------ + +Clock WNS(ns) TNS(ns) TNS Failing Endpoints TNS Total Endpoints WHS(ns) THS(ns) THS Failing Endpoints THS Total Endpoints WPWS(ns) TPWS(ns) TPWS Failing Endpoints TPWS Total Endpoints +----- ------- ------- --------------------- ------------------- ------- ------- --------------------- ------------------- -------- -------- ---------------------- -------------------- +clk_fpga_0 15.285 0.000 0 51 0.252 0.000 0 51 9.500 0.000 0 27 + + +------------------------------------------------------------------------------------------------ +| Inter Clock Table +| ----------------- +------------------------------------------------------------------------------------------------ + +From Clock To Clock WNS(ns) TNS(ns) TNS Failing Endpoints TNS Total Endpoints WHS(ns) THS(ns) THS Failing Endpoints THS Total Endpoints +---------- -------- ------- ------- --------------------- ------------------- ------- ------- --------------------- ------------------- + + +------------------------------------------------------------------------------------------------ +| Other Path Groups Table +| ----------------------- +------------------------------------------------------------------------------------------------ + +Path Group From Clock To Clock WNS(ns) TNS(ns) TNS Failing Endpoints TNS Total Endpoints WHS(ns) THS(ns) THS Failing Endpoints THS Total Endpoints +---------- ---------- -------- ------- ------- --------------------- ------------------- ------- ------- --------------------- ------------------- + + +------------------------------------------------------------------------------------------------ +| Timing Details +| -------------- +------------------------------------------------------------------------------------------------ + + +--------------------------------------------------------------------------------------------------- +From Clock: clk_fpga_0 + To Clock: clk_fpga_0 + +Setup : 0 Failing Endpoints, Worst Slack 15.285ns, Total Violation 0.000ns +Hold : 0 Failing Endpoints, Worst Slack 0.252ns, Total Violation 0.000ns +PW : 0 Failing Endpoints, Worst Slack 9.500ns, Total Violation 0.000ns +--------------------------------------------------------------------------------------------------- + + +Max Delay Paths +-------------------------------------------------------------------------------------- +Slack (MET) : 15.285ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[24]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.961ns (logic 0.828ns (20.903%) route 3.133ns (79.097%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.023ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.768ns = ( 22.768 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.934 7.021 design_1_i/led_0/inst/clear + SLICE_X43Y43 FDRE r design_1_i/led_0/inst/cnt_reg[24]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.576 22.769 design_1_i/led_0/inst/m_clock + SLICE_X43Y43 FDRE r design_1_i/led_0/inst/cnt_reg[24]/C + clock pessimism 0.269 23.037 + clock uncertainty -0.302 22.735 + SLICE_X43Y43 FDRE (Setup_fdre_C_R) -0.429 22.306 design_1_i/led_0/inst/cnt_reg[24] + ------------------------------------------------------------------- + required time 22.306 + arrival time -7.021 + ------------------------------------------------------------------- + slack 15.285 + +Slack (MET) : 15.400ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[0]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.842ns (logic 0.828ns (21.551%) route 3.014ns (78.449%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.027ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.764ns = ( 22.764 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.815 6.902 design_1_i/led_0/inst/clear + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[0]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.572 22.764 design_1_i/led_0/inst/m_clock + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[0]/C + clock pessimism 0.269 23.033 + clock uncertainty -0.302 22.731 + SLICE_X43Y37 FDRE (Setup_fdre_C_R) -0.429 22.302 design_1_i/led_0/inst/cnt_reg[0] + ------------------------------------------------------------------- + required time 22.302 + arrival time -6.902 + ------------------------------------------------------------------- + slack 15.400 + +Slack (MET) : 15.400ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[1]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.842ns (logic 0.828ns (21.551%) route 3.014ns (78.449%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.027ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.764ns = ( 22.764 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.815 6.902 design_1_i/led_0/inst/clear + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[1]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.572 22.764 design_1_i/led_0/inst/m_clock + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[1]/C + clock pessimism 0.269 23.033 + clock uncertainty -0.302 22.731 + SLICE_X43Y37 FDRE (Setup_fdre_C_R) -0.429 22.302 design_1_i/led_0/inst/cnt_reg[1] + ------------------------------------------------------------------- + required time 22.302 + arrival time -6.902 + ------------------------------------------------------------------- + slack 15.400 + +Slack (MET) : 15.400ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[2]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.842ns (logic 0.828ns (21.551%) route 3.014ns (78.449%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.027ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.764ns = ( 22.764 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.815 6.902 design_1_i/led_0/inst/clear + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[2]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.572 22.764 design_1_i/led_0/inst/m_clock + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[2]/C + clock pessimism 0.269 23.033 + clock uncertainty -0.302 22.731 + SLICE_X43Y37 FDRE (Setup_fdre_C_R) -0.429 22.302 design_1_i/led_0/inst/cnt_reg[2] + ------------------------------------------------------------------- + required time 22.302 + arrival time -6.902 + ------------------------------------------------------------------- + slack 15.400 + +Slack (MET) : 15.400ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[3]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.842ns (logic 0.828ns (21.551%) route 3.014ns (78.449%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.027ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.764ns = ( 22.764 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.815 6.902 design_1_i/led_0/inst/clear + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[3]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.572 22.764 design_1_i/led_0/inst/m_clock + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[3]/C + clock pessimism 0.269 23.033 + clock uncertainty -0.302 22.731 + SLICE_X43Y37 FDRE (Setup_fdre_C_R) -0.429 22.302 design_1_i/led_0/inst/cnt_reg[3] + ------------------------------------------------------------------- + required time 22.302 + arrival time -6.902 + ------------------------------------------------------------------- + slack 15.400 + +Slack (MET) : 15.422ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[20]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.823ns (logic 0.828ns (21.660%) route 2.995ns (78.340%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.024ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.767ns = ( 22.767 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.795 6.883 design_1_i/led_0/inst/clear + SLICE_X43Y42 FDRE r design_1_i/led_0/inst/cnt_reg[20]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.575 22.767 design_1_i/led_0/inst/m_clock + SLICE_X43Y42 FDRE r design_1_i/led_0/inst/cnt_reg[20]/C + clock pessimism 0.269 23.036 + clock uncertainty -0.302 22.734 + SLICE_X43Y42 FDRE (Setup_fdre_C_R) -0.429 22.305 design_1_i/led_0/inst/cnt_reg[20] + ------------------------------------------------------------------- + required time 22.305 + arrival time -6.883 + ------------------------------------------------------------------- + slack 15.422 + +Slack (MET) : 15.422ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[21]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.823ns (logic 0.828ns (21.660%) route 2.995ns (78.340%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.024ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.767ns = ( 22.767 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.795 6.883 design_1_i/led_0/inst/clear + SLICE_X43Y42 FDRE r design_1_i/led_0/inst/cnt_reg[21]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.575 22.767 design_1_i/led_0/inst/m_clock + SLICE_X43Y42 FDRE r design_1_i/led_0/inst/cnt_reg[21]/C + clock pessimism 0.269 23.036 + clock uncertainty -0.302 22.734 + SLICE_X43Y42 FDRE (Setup_fdre_C_R) -0.429 22.305 design_1_i/led_0/inst/cnt_reg[21] + ------------------------------------------------------------------- + required time 22.305 + arrival time -6.883 + ------------------------------------------------------------------- + slack 15.422 + +Slack (MET) : 15.422ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[22]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.823ns (logic 0.828ns (21.660%) route 2.995ns (78.340%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.024ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.767ns = ( 22.767 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.795 6.883 design_1_i/led_0/inst/clear + SLICE_X43Y42 FDRE r design_1_i/led_0/inst/cnt_reg[22]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.575 22.767 design_1_i/led_0/inst/m_clock + SLICE_X43Y42 FDRE r design_1_i/led_0/inst/cnt_reg[22]/C + clock pessimism 0.269 23.036 + clock uncertainty -0.302 22.734 + SLICE_X43Y42 FDRE (Setup_fdre_C_R) -0.429 22.305 design_1_i/led_0/inst/cnt_reg[22] + ------------------------------------------------------------------- + required time 22.305 + arrival time -6.883 + ------------------------------------------------------------------- + slack 15.422 + +Slack (MET) : 15.422ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[23]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.823ns (logic 0.828ns (21.660%) route 2.995ns (78.340%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.024ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.767ns = ( 22.767 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.795 6.883 design_1_i/led_0/inst/clear + SLICE_X43Y42 FDRE r design_1_i/led_0/inst/cnt_reg[23]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.575 22.767 design_1_i/led_0/inst/m_clock + SLICE_X43Y42 FDRE r design_1_i/led_0/inst/cnt_reg[23]/C + clock pessimism 0.269 23.036 + clock uncertainty -0.302 22.734 + SLICE_X43Y42 FDRE (Setup_fdre_C_R) -0.429 22.305 design_1_i/led_0/inst/cnt_reg[23] + ------------------------------------------------------------------- + required time 22.305 + arrival time -6.883 + ------------------------------------------------------------------- + slack 15.422 + +Slack (MET) : 15.542ns (required time - arrival time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[4]/R + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Setup (Max at Slow Process Corner) + Requirement: 20.000ns (clk_fpga_0 rise@20.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 3.701ns (logic 0.828ns (22.371%) route 2.873ns (77.629%)) + Logic Levels: 3 (LUT5=1 LUT6=2) + Clock Path Skew: -0.026ns (DCD - SCD + CPR) + Destination Clock Delay (DCD): 2.766ns = ( 22.765 - 20.000 ) + Source Clock Delay (SCD): 3.060ns + Clock Pessimism Removal (CPR): 0.269ns + Clock Uncertainty: 0.302ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE + Total System Jitter (TSJ): 0.071ns + Total Input Jitter (TIJ): 0.600ns + Discrete Jitter (DJ): 0.000ns + Phase Error (PE): 0.000ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.207 1.207 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.101 1.308 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.752 3.060 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.456 3.516 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.862 4.378 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X42Y39 LUT5 (Prop_lut5_I2_O) 0.124 4.502 r design_1_i/led_0/inst/led_op_r_i_4/O + net (fo=2, routed) 0.676 5.178 design_1_i/led_0/inst/led_op_r_i_4_n_0 + SLICE_X42Y40 LUT6 (Prop_lut6_I0_O) 0.124 5.302 r design_1_i/led_0/inst/cnt[0]_i_4/O + net (fo=1, routed) 0.661 5.963 design_1_i/led_0/inst/cnt[0]_i_4_n_0 + SLICE_X42Y41 LUT6 (Prop_lut6_I2_O) 0.124 6.087 r design_1_i/led_0/inst/cnt[0]_i_1/O + net (fo=25, routed) 0.674 6.761 design_1_i/led_0/inst/clear + SLICE_X43Y38 FDRE r design_1_i/led_0/inst/cnt_reg[4]/R + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 20.000 20.000 r + PS7_X0Y0 PS7 0.000 20.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 1.101 21.101 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.091 21.192 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 1.573 22.766 design_1_i/led_0/inst/m_clock + SLICE_X43Y38 FDRE r design_1_i/led_0/inst/cnt_reg[4]/C + clock pessimism 0.269 23.034 + clock uncertainty -0.302 22.732 + SLICE_X43Y38 FDRE (Setup_fdre_C_R) -0.429 22.303 design_1_i/led_0/inst/cnt_reg[4] + ------------------------------------------------------------------- + required time 22.303 + arrival time -6.761 + ------------------------------------------------------------------- + slack 15.542 + + + + + +Min Delay Paths +-------------------------------------------------------------------------------------- +Slack (MET) : 0.252ns (arrival time - required time) + Source: design_1_i/led_0/inst/cnt_reg[3]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[3]/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.357ns (logic 0.249ns (69.714%) route 0.108ns (30.286%)) + Logic Levels: 1 (CARRY4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.227ns + Source Clock Delay (SCD): 0.930ns + Clock Pessimism Removal (CPR): 0.297ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.589 0.929 design_1_i/led_0/inst/m_clock + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[3]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y37 FDRE (Prop_fdre_C_Q) 0.141 1.071 r design_1_i/led_0/inst/cnt_reg[3]/Q + net (fo=1, routed) 0.108 1.179 design_1_i/led_0/inst/cnt_reg_n_0_[3] + SLICE_X43Y37 CARRY4 (Prop_carry4_S[3]_O[3]) + 0.108 1.287 r design_1_i/led_0/inst/cnt_reg[0]_i_2/O[3] + net (fo=1, routed) 0.000 1.287 design_1_i/led_0/inst/cnt_reg[0]_i_2_n_4 + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[3]/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.857 1.227 design_1_i/led_0/inst/m_clock + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[3]/C + clock pessimism -0.297 0.930 + SLICE_X43Y37 FDRE (Hold_fdre_C_D) 0.105 1.035 design_1_i/led_0/inst/cnt_reg[3] + ------------------------------------------------------------------- + required time -1.035 + arrival time 1.287 + ------------------------------------------------------------------- + slack 0.252 + +Slack (MET) : 0.256ns (arrival time - required time) + Source: design_1_i/led_0/inst/cnt_reg[4]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[4]/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.361ns (logic 0.256ns (70.880%) route 0.105ns (29.120%)) + Logic Levels: 1 (CARRY4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.229ns + Source Clock Delay (SCD): 0.931ns + Clock Pessimism Removal (CPR): 0.298ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.590 0.930 design_1_i/led_0/inst/m_clock + SLICE_X43Y38 FDRE r design_1_i/led_0/inst/cnt_reg[4]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y38 FDRE (Prop_fdre_C_Q) 0.141 1.071 r design_1_i/led_0/inst/cnt_reg[4]/Q + net (fo=1, routed) 0.105 1.177 design_1_i/led_0/inst/cnt_reg_n_0_[4] + SLICE_X43Y38 CARRY4 (Prop_carry4_S[0]_O[0]) + 0.115 1.292 r design_1_i/led_0/inst/cnt_reg[4]_i_1/O[0] + net (fo=1, routed) 0.000 1.292 design_1_i/led_0/inst/cnt_reg[4]_i_1_n_7 + SLICE_X43Y38 FDRE r design_1_i/led_0/inst/cnt_reg[4]/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.859 1.229 design_1_i/led_0/inst/m_clock + SLICE_X43Y38 FDRE r design_1_i/led_0/inst/cnt_reg[4]/C + clock pessimism -0.298 0.931 + SLICE_X43Y38 FDRE (Hold_fdre_C_D) 0.105 1.036 design_1_i/led_0/inst/cnt_reg[4] + ------------------------------------------------------------------- + required time -1.036 + arrival time 1.292 + ------------------------------------------------------------------- + slack 0.256 + +Slack (MET) : 0.256ns (arrival time - required time) + Source: design_1_i/led_0/inst/cnt_reg[2]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[2]/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.361ns (logic 0.252ns (69.733%) route 0.109ns (30.267%)) + Logic Levels: 1 (CARRY4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.227ns + Source Clock Delay (SCD): 0.930ns + Clock Pessimism Removal (CPR): 0.297ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.589 0.929 design_1_i/led_0/inst/m_clock + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[2]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y37 FDRE (Prop_fdre_C_Q) 0.141 1.071 r design_1_i/led_0/inst/cnt_reg[2]/Q + net (fo=1, routed) 0.109 1.180 design_1_i/led_0/inst/cnt_reg_n_0_[2] + SLICE_X43Y37 CARRY4 (Prop_carry4_S[2]_O[2]) + 0.111 1.291 r design_1_i/led_0/inst/cnt_reg[0]_i_2/O[2] + net (fo=1, routed) 0.000 1.291 design_1_i/led_0/inst/cnt_reg[0]_i_2_n_5 + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[2]/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.857 1.227 design_1_i/led_0/inst/m_clock + SLICE_X43Y37 FDRE r design_1_i/led_0/inst/cnt_reg[2]/C + clock pessimism -0.297 0.930 + SLICE_X43Y37 FDRE (Hold_fdre_C_D) 0.105 1.035 design_1_i/led_0/inst/cnt_reg[2] + ------------------------------------------------------------------- + required time -1.035 + arrival time 1.291 + ------------------------------------------------------------------- + slack 0.256 + +Slack (MET) : 0.261ns (arrival time - required time) + Source: design_1_i/led_0/inst/cnt_reg[19]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[19]/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.366ns (logic 0.249ns (68.025%) route 0.117ns (31.975%)) + Logic Levels: 1 (CARRY4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.230ns + Source Clock Delay (SCD): 0.932ns + Clock Pessimism Removal (CPR): 0.298ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.591 0.932 design_1_i/led_0/inst/m_clock + SLICE_X43Y41 FDRE r design_1_i/led_0/inst/cnt_reg[19]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y41 FDRE (Prop_fdre_C_Q) 0.141 1.072 r design_1_i/led_0/inst/cnt_reg[19]/Q + net (fo=2, routed) 0.117 1.190 design_1_i/led_0/inst/cnt_reg[19] + SLICE_X43Y41 CARRY4 (Prop_carry4_S[3]_O[3]) + 0.108 1.298 r design_1_i/led_0/inst/cnt_reg[16]_i_1/O[3] + net (fo=1, routed) 0.000 1.298 design_1_i/led_0/inst/cnt_reg[16]_i_1_n_4 + SLICE_X43Y41 FDRE r design_1_i/led_0/inst/cnt_reg[19]/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.860 1.230 design_1_i/led_0/inst/m_clock + SLICE_X43Y41 FDRE r design_1_i/led_0/inst/cnt_reg[19]/C + clock pessimism -0.298 0.932 + SLICE_X43Y41 FDRE (Hold_fdre_C_D) 0.105 1.037 design_1_i/led_0/inst/cnt_reg[19] + ------------------------------------------------------------------- + required time -1.037 + arrival time 1.298 + ------------------------------------------------------------------- + slack 0.261 + +Slack (MET) : 0.264ns (arrival time - required time) + Source: design_1_i/led_0/inst/led_op_r_reg/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/led_op_r_reg/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.384ns (logic 0.209ns (54.384%) route 0.175ns (45.616%)) + Logic Levels: 1 (LUT4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.230ns + Source Clock Delay (SCD): 0.932ns + Clock Pessimism Removal (CPR): 0.298ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.591 0.932 design_1_i/led_0/inst/m_clock + SLICE_X42Y41 FDRE r design_1_i/led_0/inst/led_op_r_reg/C + ------------------------------------------------------------------- ------------------- + SLICE_X42Y41 FDRE (Prop_fdre_C_Q) 0.164 1.095 r design_1_i/led_0/inst/led_op_r_reg/Q + net (fo=2, routed) 0.175 1.271 design_1_i/led_0/inst/led_op + SLICE_X42Y41 LUT4 (Prop_lut4_I3_O) 0.045 1.316 r design_1_i/led_0/inst/led_op_r_i_1/O + net (fo=1, routed) 0.000 1.316 design_1_i/led_0/inst/led_op_r_i_1_n_0 + SLICE_X42Y41 FDRE r design_1_i/led_0/inst/led_op_r_reg/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.860 1.230 design_1_i/led_0/inst/m_clock + SLICE_X42Y41 FDRE r design_1_i/led_0/inst/led_op_r_reg/C + clock pessimism -0.298 0.932 + SLICE_X42Y41 FDRE (Hold_fdre_C_D) 0.120 1.052 design_1_i/led_0/inst/led_op_r_reg + ------------------------------------------------------------------- + required time -1.052 + arrival time 1.316 + ------------------------------------------------------------------- + slack 0.264 + +Slack (MET) : 0.264ns (arrival time - required time) + Source: design_1_i/led_0/inst/cnt_reg[11]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[11]/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.369ns (logic 0.249ns (67.424%) route 0.120ns (32.576%)) + Logic Levels: 1 (CARRY4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.229ns + Source Clock Delay (SCD): 0.931ns + Clock Pessimism Removal (CPR): 0.298ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.590 0.930 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[11]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.141 1.071 r design_1_i/led_0/inst/cnt_reg[11]/Q + net (fo=3, routed) 0.120 1.192 design_1_i/led_0/inst/cnt_reg[11] + SLICE_X43Y39 CARRY4 (Prop_carry4_S[3]_O[3]) + 0.108 1.300 r design_1_i/led_0/inst/cnt_reg[8]_i_1/O[3] + net (fo=1, routed) 0.000 1.300 design_1_i/led_0/inst/cnt_reg[8]_i_1_n_4 + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[11]/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.859 1.229 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[11]/C + clock pessimism -0.298 0.931 + SLICE_X43Y39 FDRE (Hold_fdre_C_D) 0.105 1.036 design_1_i/led_0/inst/cnt_reg[11] + ------------------------------------------------------------------- + required time -1.036 + arrival time 1.300 + ------------------------------------------------------------------- + slack 0.264 + +Slack (MET) : 0.264ns (arrival time - required time) + Source: design_1_i/led_0/inst/cnt_reg[7]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[7]/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.369ns (logic 0.249ns (67.424%) route 0.120ns (32.576%)) + Logic Levels: 1 (CARRY4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.229ns + Source Clock Delay (SCD): 0.931ns + Clock Pessimism Removal (CPR): 0.298ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.590 0.930 design_1_i/led_0/inst/m_clock + SLICE_X43Y38 FDRE r design_1_i/led_0/inst/cnt_reg[7]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y38 FDRE (Prop_fdre_C_Q) 0.141 1.071 r design_1_i/led_0/inst/cnt_reg[7]/Q + net (fo=2, routed) 0.120 1.192 design_1_i/led_0/inst/cnt_reg[7] + SLICE_X43Y38 CARRY4 (Prop_carry4_S[3]_O[3]) + 0.108 1.300 r design_1_i/led_0/inst/cnt_reg[4]_i_1/O[3] + net (fo=1, routed) 0.000 1.300 design_1_i/led_0/inst/cnt_reg[4]_i_1_n_4 + SLICE_X43Y38 FDRE r design_1_i/led_0/inst/cnt_reg[7]/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.859 1.229 design_1_i/led_0/inst/m_clock + SLICE_X43Y38 FDRE r design_1_i/led_0/inst/cnt_reg[7]/C + clock pessimism -0.298 0.931 + SLICE_X43Y38 FDRE (Hold_fdre_C_D) 0.105 1.036 design_1_i/led_0/inst/cnt_reg[7] + ------------------------------------------------------------------- + required time -1.036 + arrival time 1.300 + ------------------------------------------------------------------- + slack 0.264 + +Slack (MET) : 0.267ns (arrival time - required time) + Source: design_1_i/led_0/inst/cnt_reg[8]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[8]/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.372ns (logic 0.256ns (68.766%) route 0.116ns (31.234%)) + Logic Levels: 1 (CARRY4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.229ns + Source Clock Delay (SCD): 0.931ns + Clock Pessimism Removal (CPR): 0.298ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.590 0.930 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[8]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.141 1.071 r design_1_i/led_0/inst/cnt_reg[8]/Q + net (fo=2, routed) 0.116 1.188 design_1_i/led_0/inst/cnt_reg[8] + SLICE_X43Y39 CARRY4 (Prop_carry4_S[0]_O[0]) + 0.115 1.303 r design_1_i/led_0/inst/cnt_reg[8]_i_1/O[0] + net (fo=1, routed) 0.000 1.303 design_1_i/led_0/inst/cnt_reg[8]_i_1_n_7 + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[8]/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.859 1.229 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[8]/C + clock pessimism -0.298 0.931 + SLICE_X43Y39 FDRE (Hold_fdre_C_D) 0.105 1.036 design_1_i/led_0/inst/cnt_reg[8] + ------------------------------------------------------------------- + required time -1.036 + arrival time 1.303 + ------------------------------------------------------------------- + slack 0.267 + +Slack (MET) : 0.267ns (arrival time - required time) + Source: design_1_i/led_0/inst/cnt_reg[18]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[18]/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.372ns (logic 0.252ns (67.654%) route 0.120ns (32.346%)) + Logic Levels: 1 (CARRY4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.230ns + Source Clock Delay (SCD): 0.932ns + Clock Pessimism Removal (CPR): 0.298ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.591 0.932 design_1_i/led_0/inst/m_clock + SLICE_X43Y41 FDRE r design_1_i/led_0/inst/cnt_reg[18]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y41 FDRE (Prop_fdre_C_Q) 0.141 1.072 r design_1_i/led_0/inst/cnt_reg[18]/Q + net (fo=2, routed) 0.120 1.193 design_1_i/led_0/inst/cnt_reg[18] + SLICE_X43Y41 CARRY4 (Prop_carry4_S[2]_O[2]) + 0.111 1.304 r design_1_i/led_0/inst/cnt_reg[16]_i_1/O[2] + net (fo=1, routed) 0.000 1.304 design_1_i/led_0/inst/cnt_reg[16]_i_1_n_5 + SLICE_X43Y41 FDRE r design_1_i/led_0/inst/cnt_reg[18]/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.860 1.230 design_1_i/led_0/inst/m_clock + SLICE_X43Y41 FDRE r design_1_i/led_0/inst/cnt_reg[18]/C + clock pessimism -0.298 0.932 + SLICE_X43Y41 FDRE (Hold_fdre_C_D) 0.105 1.037 design_1_i/led_0/inst/cnt_reg[18] + ------------------------------------------------------------------- + required time -1.037 + arrival time 1.304 + ------------------------------------------------------------------- + slack 0.267 + +Slack (MET) : 0.268ns (arrival time - required time) + Source: design_1_i/led_0/inst/cnt_reg[10]/C + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Destination: design_1_i/led_0/inst/cnt_reg[10]/D + (rising edge-triggered cell FDRE clocked by clk_fpga_0 {rise@0.000ns fall@10.000ns period=20.000ns}) + Path Group: clk_fpga_0 + Path Type: Hold (Min at Fast Process Corner) + Requirement: 0.000ns (clk_fpga_0 rise@0.000ns - clk_fpga_0 rise@0.000ns) + Data Path Delay: 0.373ns (logic 0.252ns (67.585%) route 0.121ns (32.415%)) + Logic Levels: 1 (CARRY4=1) + Clock Path Skew: 0.000ns (DCD - SCD - CPR) + Destination Clock Delay (DCD): 1.229ns + Source Clock Delay (SCD): 0.931ns + Clock Pessimism Removal (CPR): 0.298ns + + Location Delay type Incr(ns) Path(ns) Netlist Resource(s) + ------------------------------------------------------------------- ------------------- + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.315 0.315 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.026 0.341 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.590 0.930 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + ------------------------------------------------------------------- ------------------- + SLICE_X43Y39 FDRE (Prop_fdre_C_Q) 0.141 1.071 r design_1_i/led_0/inst/cnt_reg[10]/Q + net (fo=2, routed) 0.121 1.192 design_1_i/led_0/inst/cnt_reg[10] + SLICE_X43Y39 CARRY4 (Prop_carry4_S[2]_O[2]) + 0.111 1.303 r design_1_i/led_0/inst/cnt_reg[8]_i_1/O[2] + net (fo=1, routed) 0.000 1.303 design_1_i/led_0/inst/cnt_reg[8]_i_1_n_5 + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/D + ------------------------------------------------------------------- ------------------- + + (clock clk_fpga_0 rise edge) + 0.000 0.000 r + PS7_X0Y0 PS7 0.000 0.000 r design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] + net (fo=1, routed) 0.341 0.341 design_1_i/processing_system7_0/inst/FCLK_CLK_unbuffered[0] + BUFGCTRL_X0Y0 BUFG (Prop_bufg_I_O) 0.029 0.370 r design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/O + net (fo=27, routed) 0.859 1.229 design_1_i/led_0/inst/m_clock + SLICE_X43Y39 FDRE r design_1_i/led_0/inst/cnt_reg[10]/C + clock pessimism -0.298 0.931 + SLICE_X43Y39 FDRE (Hold_fdre_C_D) 0.105 1.036 design_1_i/led_0/inst/cnt_reg[10] + ------------------------------------------------------------------- + required time -1.036 + arrival time 1.303 + ------------------------------------------------------------------- + slack 0.268 + + + + + +Pulse Width Checks +-------------------------------------------------------------------------------------- +Clock Name: clk_fpga_0 +Waveform(ns): { 0.000 10.000 } +Period(ns): 20.000 +Sources: { design_1_i/processing_system7_0/inst/PS7_i/FCLKCLK[0] } + +Check Type Corner Lib Pin Reference Pin Required(ns) Actual(ns) Slack(ns) Location Pin +Min Period n/a BUFG/I n/a 2.155 20.000 17.845 BUFGCTRL_X0Y0 design_1_i/processing_system7_0/inst/buffer_fclk_clk_0.FCLK_CLK_0_BUFG/I +Min Period n/a FDRE/C n/a 1.000 20.000 19.000 SLICE_X43Y37 design_1_i/led_0/inst/cnt_reg[0]/C +Min Period n/a FDRE/C n/a 1.000 20.000 19.000 SLICE_X43Y39 design_1_i/led_0/inst/cnt_reg[10]/C +Min Period n/a FDRE/C n/a 1.000 20.000 19.000 SLICE_X43Y39 design_1_i/led_0/inst/cnt_reg[11]/C +Min Period n/a FDRE/C n/a 1.000 20.000 19.000 SLICE_X43Y40 design_1_i/led_0/inst/cnt_reg[12]/C +Min Period n/a FDRE/C n/a 1.000 20.000 19.000 SLICE_X43Y40 design_1_i/led_0/inst/cnt_reg[13]/C +Min Period n/a FDRE/C n/a 1.000 20.000 19.000 SLICE_X43Y40 design_1_i/led_0/inst/cnt_reg[14]/C +Min Period n/a FDRE/C n/a 1.000 20.000 19.000 SLICE_X43Y40 design_1_i/led_0/inst/cnt_reg[15]/C +Min Period n/a FDRE/C n/a 1.000 20.000 19.000 SLICE_X43Y41 design_1_i/led_0/inst/cnt_reg[16]/C +Min Period n/a FDRE/C n/a 1.000 20.000 19.000 SLICE_X43Y42 design_1_i/led_0/inst/cnt_reg[21]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y41 design_1_i/led_0/inst/cnt_reg[16]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y42 design_1_i/led_0/inst/cnt_reg[21]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y42 design_1_i/led_0/inst/cnt_reg[22]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y42 design_1_i/led_0/inst/cnt_reg[23]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y38 design_1_i/led_0/inst/cnt_reg[4]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y38 design_1_i/led_0/inst/cnt_reg[5]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y38 design_1_i/led_0/inst/cnt_reg[6]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y38 design_1_i/led_0/inst/cnt_reg[7]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y41 design_1_i/led_0/inst/cnt_reg[17]/C +Low Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y41 design_1_i/led_0/inst/cnt_reg[18]/C +High Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y43 design_1_i/led_0/inst/cnt_reg[24]/C +High Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y37 design_1_i/led_0/inst/cnt_reg[0]/C +High Pulse Width Fast FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y37 design_1_i/led_0/inst/cnt_reg[0]/C +High Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y39 design_1_i/led_0/inst/cnt_reg[10]/C +High Pulse Width Fast FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y39 design_1_i/led_0/inst/cnt_reg[10]/C +High Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y39 design_1_i/led_0/inst/cnt_reg[11]/C +High Pulse Width Fast FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y39 design_1_i/led_0/inst/cnt_reg[11]/C +High Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y40 design_1_i/led_0/inst/cnt_reg[12]/C +High Pulse Width Fast FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y40 design_1_i/led_0/inst/cnt_reg[12]/C +High Pulse Width Slow FDRE/C n/a 0.500 10.000 9.500 SLICE_X43Y40 design_1_i/led_0/inst/cnt_reg[13]/C + + + diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_utilization_placed.pb b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_utilization_placed.pb new file mode 100644 index 0000000000000000000000000000000000000000..a7976367558a39261eec95abee5ae74d8267fe9d GIT binary patch literal 224 zcmd;LGcqu=&@-CEtPxzAo10ivsgR$hP+F3ilUbEml9`_e;%28-Dioy_=a&{Grxxp- z9%i$7#J8F_X;yKbh@>Q^ypdH_DTXp8170kH0*X=Dg|P% zm1kgRu>T7rBb<&ZRCB(yKdTB7pR2~eP~h|wNHQ?=8iB~WKyrc8QezN%tp!*YkYsQ= uYRSOh;V{XH!zt9w-8m%4=d2w_$y|FN;qVkhGQ4#Gk$YW%ghQ(vhz$S=GdrpP literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_utilization_placed.rpt b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_utilization_placed.rpt new file mode 100644 index 0000000..758e2b2 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper_utilization_placed.rpt @@ -0,0 +1,207 @@ +Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +----------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +| Date : Fri Aug 17 17:45:07 2018 +| Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +| Command : report_utilization -file design_1_wrapper_utilization_placed.rpt -pb design_1_wrapper_utilization_placed.pb +| Design : design_1_wrapper +| Device : 7z010clg225-1 +| Design State : Fully Placed +----------------------------------------------------------------------------------------------------------------------------- + +Utilization Design Information + +Table of Contents +----------------- +1. Slice Logic +1.1 Summary of Registers by Type +2. Slice Logic Distribution +3. Memory +4. DSP +5. IO and GT Specific +6. Clocking +7. Specific Feature +8. Primitives +9. Black Boxes +10. Instantiated Netlists + +1. Slice Logic +-------------- + ++-------------------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-------------------------+------+-------+-----------+-------+ +| Slice LUTs | 8 | 0 | 17600 | 0.05 | +| LUT as Logic | 8 | 0 | 17600 | 0.05 | +| LUT as Memory | 0 | 0 | 6000 | 0.00 | +| Slice Registers | 26 | 0 | 35200 | 0.07 | +| Register as Flip Flop | 26 | 0 | 35200 | 0.07 | +| Register as Latch | 0 | 0 | 35200 | 0.00 | +| F7 Muxes | 0 | 0 | 8800 | 0.00 | +| F8 Muxes | 0 | 0 | 4400 | 0.00 | ++-------------------------+------+-------+-----------+-------+ + + +1.1 Summary of Registers by Type +-------------------------------- + ++-------+--------------+-------------+--------------+ +| Total | Clock Enable | Synchronous | Asynchronous | ++-------+--------------+-------------+--------------+ +| 0 | _ | - | - | +| 0 | _ | - | Set | +| 0 | _ | - | Reset | +| 0 | _ | Set | - | +| 0 | _ | Reset | - | +| 0 | Yes | - | - | +| 0 | Yes | - | Set | +| 0 | Yes | - | Reset | +| 0 | Yes | Set | - | +| 26 | Yes | Reset | - | ++-------+--------------+-------------+--------------+ + + +2. Slice Logic Distribution +--------------------------- + ++-------------------------------------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-------------------------------------------+------+-------+-----------+-------+ +| Slice | 10 | 0 | 4400 | 0.23 | +| SLICEL | 7 | 0 | | | +| SLICEM | 3 | 0 | | | +| LUT as Logic | 8 | 0 | 17600 | 0.05 | +| using O5 output only | 0 | | | | +| using O6 output only | 8 | | | | +| using O5 and O6 | 0 | | | | +| LUT as Memory | 0 | 0 | 6000 | 0.00 | +| LUT as Distributed RAM | 0 | 0 | | | +| LUT as Shift Register | 0 | 0 | | | +| LUT Flip Flop Pairs | 2 | 0 | 17600 | 0.01 | +| fully used LUT-FF pairs | 0 | | | | +| LUT-FF pairs with one unused LUT output | 2 | | | | +| LUT-FF pairs with one unused Flip Flop | 2 | | | | +| Unique Control Sets | 2 | | | | ++-------------------------------------------+------+-------+-----------+-------+ +* Note: Review the Control Sets Report for more information regarding control sets. + + +3. Memory +--------- + ++----------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++----------------+------+-------+-----------+-------+ +| Block RAM Tile | 0 | 0 | 60 | 0.00 | +| RAMB36/FIFO* | 0 | 0 | 60 | 0.00 | +| RAMB18 | 0 | 0 | 120 | 0.00 | ++----------------+------+-------+-----------+-------+ +* Note: Each Block RAM Tile only has one FIFO logic available and therefore can accommodate only one FIFO36E1 or one FIFO18E1. However, if a FIFO18E1 occupies a Block RAM Tile, that tile can still accommodate a RAMB18E1 + + +4. DSP +------ + ++-----------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-----------+------+-------+-----------+-------+ +| DSPs | 0 | 0 | 80 | 0.00 | ++-----------+------+-------+-----------+-------+ + + +5. IO and GT Specific +--------------------- + ++-----------------------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-----------------------------+------+-------+-----------+-------+ +| Bonded IOB | 1 | 1 | 54 | 1.85 | +| IOB Master Pads | 0 | | | | +| IOB Slave Pads | 1 | | | | +| Bonded IPADs | 0 | 0 | 2 | 0.00 | +| Bonded IOPADs | 86 | 86 | 130 | 66.15 | +| PHY_CONTROL | 0 | 0 | 2 | 0.00 | +| PHASER_REF | 0 | 0 | 2 | 0.00 | +| OUT_FIFO | 0 | 0 | 8 | 0.00 | +| IN_FIFO | 0 | 0 | 8 | 0.00 | +| IDELAYCTRL | 0 | 0 | 2 | 0.00 | +| IBUFDS | 0 | 0 | 54 | 0.00 | +| PHASER_OUT/PHASER_OUT_PHY | 0 | 0 | 8 | 0.00 | +| PHASER_IN/PHASER_IN_PHY | 0 | 0 | 8 | 0.00 | +| IDELAYE2/IDELAYE2_FINEDELAY | 0 | 0 | 100 | 0.00 | +| ILOGIC | 0 | 0 | 54 | 0.00 | +| OLOGIC | 0 | 0 | 54 | 0.00 | ++-----------------------------+------+-------+-----------+-------+ + + +6. Clocking +----------- + ++------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++------------+------+-------+-----------+-------+ +| BUFGCTRL | 1 | 0 | 32 | 3.13 | +| BUFIO | 0 | 0 | 8 | 0.00 | +| MMCME2_ADV | 0 | 0 | 2 | 0.00 | +| PLLE2_ADV | 0 | 0 | 2 | 0.00 | +| BUFMRCE | 0 | 0 | 4 | 0.00 | +| BUFHCE | 0 | 0 | 48 | 0.00 | +| BUFR | 0 | 0 | 8 | 0.00 | ++------------+------+-------+-----------+-------+ + + +7. Specific Feature +------------------- + ++-------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-------------+------+-------+-----------+-------+ +| BSCANE2 | 0 | 0 | 4 | 0.00 | +| CAPTUREE2 | 0 | 0 | 1 | 0.00 | +| DNA_PORT | 0 | 0 | 1 | 0.00 | +| EFUSE_USR | 0 | 0 | 1 | 0.00 | +| FRAME_ECCE2 | 0 | 0 | 1 | 0.00 | +| ICAPE2 | 0 | 0 | 2 | 0.00 | +| STARTUPE2 | 0 | 0 | 1 | 0.00 | +| XADC | 0 | 0 | 1 | 0.00 | ++-------------+------+-------+-----------+-------+ + + +8. Primitives +------------- + ++----------+------+----------------------+ +| Ref Name | Used | Functional Category | ++----------+------+----------------------+ +| BIBUF | 86 | IO | +| FDRE | 26 | Flop & Latch | +| CARRY4 | 7 | CarryLogic | +| LUT6 | 3 | LUT | +| LUT5 | 2 | LUT | +| LUT4 | 2 | LUT | +| PS7 | 1 | Specialized Resource | +| OBUF | 1 | IO | +| LUT1 | 1 | LUT | +| BUFG | 1 | Clock | ++----------+------+----------------------+ + + +9. Black Boxes +-------------- + ++----------+------+ +| Ref Name | Used | ++----------+------+ + + +10. Instantiated Netlists +------------------------- + ++---------------------------------+------+ +| Ref Name | Used | ++---------------------------------+------+ +| design_1_processing_system7_0_0 | 1 | +| design_1_led_0_0 | 1 | ++---------------------------------+------+ + + diff --git a/LED_Blink/LED_Blink.runs/impl_1/gen_run.xml b/LED_Blink/LED_Blink.runs/impl_1/gen_run.xml new file mode 100644 index 0000000..d8f5922 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/gen_run.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/impl_1/htr.txt b/LED_Blink/LED_Blink.runs/impl_1/htr.txt new file mode 100644 index 0000000..244b500 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/htr.txt @@ -0,0 +1,9 @@ +REM +REM Vivado(TM) +REM htr.txt: a Vivado-generated description of how-to-repeat the +REM the basic steps of a run. Note that runme.bat/sh needs +REM to be invoked for Vivado to track run status. +REM Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +REM + +vivado -log design_1_wrapper.vdi -applog -m64 -product Vivado -messageDb vivado.pb -mode batch -source design_1_wrapper.tcl -notrace diff --git a/LED_Blink/LED_Blink.runs/impl_1/init_design.pb b/LED_Blink/LED_Blink.runs/impl_1/init_design.pb new file mode 100644 index 0000000000000000000000000000000000000000..6956c7ca7b81cb6993eca957612b21fbc78b51e5 GIT binary patch literal 28440 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 literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/opt_design.pb b/LED_Blink/LED_Blink.runs/impl_1/opt_design.pb new file mode 100644 index 0000000000000000000000000000000000000000..b6274bcd26d5e8489d66e260d48c642c9fc90b34 GIT binary patch literal 8624 zcmd5>&vV2Rbf$++PrdaY$T8R6`-kK$KvF=kkikf{GNT!ayWrc0_kH`` z?)T7rwBGf{W6SGzaFwGAD_549+Q!choCB-xN485}N5~JN-9F>a(4%X8Hn1jc)S3O$ ztLQaCw9yN}%F)W7lou{6p}#BWx4(-bHVz`k8{){vLl$8RyN=B~&hWqw@qk&;BxLw{ zm0!oOcmu}z>;RsKhlC%?nrd#W+Tfh;(chq#?u`SNjhPo&kpm+$2j-s8t7z@WZhfH= zH9y%~C9RsKx6*$8MM3IaKU&PM3iw6Tv-YbEepQYtN&Gx?YiHtlB6gcQU2JiPT@W(c z_xg@_brDe!76{u6GD;VLY(=k8nvTQ{dIdd*tT4u_%JD;s@5c}jRoi$G7UofCIbOu+ zWwZ=FN#kqQ;OVs0ZS-3DJr12{1peY^6f&z1RI6NBqWZ>iKeXvZq)>^`3e{>G1)={3W=Hfj^fMK2g`ppEnPF1X4U#t8N4K|KW&u4z zHejKMaWrBv03i$fFv2&I&t35MX3XKS4+M5Rpz}DUWPR#|KKG(m5$lLh&tKph1+AcX zqh$l@qfZ_>V}@_=n;mQi6Z{TV)sFb1_$|y_E8y_D^Fe~^_(KLBJi#|UybV7In6(en z1~uviZNpE702mAqQa9Vpdsx&sI3A27L};5E%TR+vmXM_Og5ln(MruSe z)1-MHU7mRgn+cY(nd{D%(c3321000SoJrJgqw7h`2%eeE@{P3Bmf565e1ifc%>^9o z%K4_M627TwU2V5Ya}J(XB~eV{^EU<6XJo)OWb5cST2PFj?1Yed4pM`0`ZZcf{7&RU z0a^vaF^HO(iTb1*RjG`sH_$J;qMBJ=1SQoEtl`OfAkUTH z+&@moxzfNE5UpTX#=k*1{%JD){R&kc95NP^%abO$mf)`8_*WUA+s43TgFRYM%NEZq zM4nr;7Cp<{^4HVhTpYjx1SwQ4vn`7^r1KwSmarVMx(wMWdinOFJ9jbEsi&9TOj_AQ zjRa*K=PaBH;yN|X67la8v{hV9`~f~3Id*(Au;4r`LLjd(bx~xrb~7n5<>FmLip5V7 zM)ny0WjU%eWmIXPs}DxbAc8}~(BW|ODR*AWkmf$>Br$E`6KrMZLzx^L# z{Ve(OuhV6WMWekKWn=~7s2n#888_ZUm$!W$;qB138Rz1D^AU?&pouJn#rLZWFWyH+ z!V3cz*f}RoXytE3B~AOIt)-qZ6}Q`rsudF3cwJIl9R2;y!3ux!rHK+I9=vE#a!?>hmuUEkgZ zktbGBgrXV`@I(*`Sm^kD{IP_GS_+`^n%YcnE2HFtY}%@sB7Ae%^jihp1u_f0k>3)uer$z8Ay2+^LlDMo zfMhlrixluwA^>CN+5W_XlNRg4W`Gt4HPd=IToI_5-wfjFpi9KL!g2YjvIlazo+;9w zqATDVNchmu5Yh^t*rM1ECa(J=aj%_r?`a(vVLv11f4zk6RrwDkBv>*nB*RyEnvb8G zs>ebKTnA;{IPSz?v<@j`+7If;&M-oHkELrOxp&3Fd^}4fiockhZC?o>(BaWdquy%j z`N_D$1C9b~){oYcPRhIJjmLr-z({c`gO9!ySwd#qgB=XoxfR+Y=YYjm3u+j1y?GV% zX5CcN4BSLlXSM>@vLS;DTYDgx*6T5;R)`_GB}t=f5;-pKtx>f`%yuRbyn`;y?0mer zbq9w&JnIc(6U&r<=9;#!3Kn26t;aEOBIQE^jjC;lHC3o-b1k;W z8V{K5WUWElOX8ad(%jlN&ysmJ(M9p%499VUu4TM^PNtwr@=T#X;c0J0t!tofYHLt3Pm-|Zq03_L2R?M& zB>qL{_uWq85oaN9e0~^=_ZpkNJrT`O-hfuen1!}A4ya1Z#s^!QySH7(+duxV9!@;o za3FrWq>->~m+T&fRsaWwUD)0AzAYpZz(BPTzF++_D%9ZD|QXT|T=~ZZr#3g3V|HW(hF{ScL#Ak&}Eq@6iI5&b+ K1hMX4P`(F-`=K`g literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/place_design.pb b/LED_Blink/LED_Blink.runs/impl_1/place_design.pb new file mode 100644 index 0000000000000000000000000000000000000000..fce4698b59dd620a507826dcdb21d021643af94a GIT binary patch literal 15447 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 literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/impl_1/route_design.pb b/LED_Blink/LED_Blink.runs/impl_1/route_design.pb new file mode 100644 index 0000000000000000000000000000000000000000..0bf594a490d1332b074af9c7242aab51516222c7 GIT binary patch literal 14649 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 + +
    +
    + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + + + + +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + +
    +
    +
    +
    + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    diff --git a/LED_Blink/LED_Blink.runs/impl_1/vivado.jou b/LED_Blink/LED_Blink.runs/impl_1/vivado.jou new file mode 100644 index 0000000..2ddf353 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/impl_1/vivado.jou @@ -0,0 +1,12 @@ +#----------------------------------------------------------- +# Vivado v2018.2 (64-bit) +# SW Build 2258646 on Thu Jun 14 20:03:12 MDT 2018 +# IP Build 2256618 on Thu Jun 14 22:10:49 MDT 2018 +# Start of session at: Fri Aug 17 17:43:59 2018 +# Process ID: 18056 +# Current directory: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1 +# Command line: vivado.exe -log design_1_wrapper.vdi -applog -product Vivado -messageDb vivado.pb -mode batch -source design_1_wrapper.tcl -notrace +# Log file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1/design_1_wrapper.vdi +# Journal file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/impl_1\vivado.jou +#----------------------------------------------------------- +source design_1_wrapper.tcl -notrace diff --git a/LED_Blink/LED_Blink.runs/impl_1/vivado.pb b/LED_Blink/LED_Blink.runs/impl_1/vivado.pb new file mode 100644 index 0000000000000000000000000000000000000000..137041b4e178515ef139f90c29f622728ec8467a GIT binary patch literal 149 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%0AjSU=$>2srK%8*V` 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 literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.tcl b/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.tcl new file mode 100644 index 0000000..589127a --- /dev/null +++ b/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.tcl @@ -0,0 +1,84 @@ +# +# Synthesis run script generated by Vivado +# + +set TIME_start [clock seconds] +proc create_report { reportName command } { + set status "." + append status $reportName ".fail" + if { [file exists $status] } { + eval file delete [glob $status] + } + send_msg_id runtcl-4 info "Executing : $command" + set retval [eval catch { $command } msg] + if { $retval != 0 } { + set fp [open $status w] + close $fp + send_msg_id runtcl-5 warning "$msg" + } +} +set_msg_config -id {HDL-1065} -limit 10000 +create_project -in_memory -part xc7z010clg225-1 + +set_param project.singleFileAddWarning.threshold 0 +set_param project.compositeFile.enableAutoGeneration 0 +set_param synth.vivado.isSynthRun true +set_msg_config -source 4 -id {IP_Flow 19-2162} -severity warning -new_severity info +set_property webtalk.parent_dir C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.cache/wt [current_project] +set_property parent.project_path C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.xpr [current_project] +set_property XPM_LIBRARIES {XPM_FIFO XPM_MEMORY} [current_project] +set_property default_lib xil_defaultlib [current_project] +set_property target_language Verilog [current_project] +set_property ip_output_repo c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.cache/ip [current_project] +set_property ip_cache_permissions {read write} [current_project] +read_verilog -library xil_defaultlib C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v +add_files C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bd +set_property used_in_implementation false [get_files -all c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xdc] +set_property used_in_implementation false [get_files -all C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1_ooc.xdc] + +# Mark all dcp files as not used in implementation to prevent them from being +# stitched into the results of this synthesis run. Any black boxes in the +# design are intentionally left as such for best results. Dcp files will be +# stitched into the design at a later time, either when this synthesis run is +# opened, or when it is stitched into a dependent implementation run. +foreach dcp [get_files -quiet -all -filter file_type=="Design\ Checkpoint"] { + set_property used_in_implementation false $dcp +} +read_xdc C:/Users/qwpmb/Documents/summercamp2018/led.xdc +set_property used_in_implementation false [get_files C:/Users/qwpmb/Documents/summercamp2018/led.xdc] + +read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_bitgen_common.xdc +set_property used_in_implementation false [get_files C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_bitgen_common.xdc] + +read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_common.xdc +set_property used_in_implementation false [get_files C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_common.xdc] + +read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc +set_property used_in_implementation false [get_files C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc] + +read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc +set_property used_in_implementation false [get_files C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc] + +read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc +set_property used_in_implementation false [get_files C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc] + +read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_timing.xdc +set_property used_in_implementation false [get_files C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_timing.xdc] + +read_xdc C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/vivado_target.xdc +set_property used_in_implementation false [get_files C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/vivado_target.xdc] + +read_xdc dont_touch.xdc +set_property used_in_implementation false [get_files dont_touch.xdc] +set_param ips.enableIPCacheLiteLoad 0 +close [open __synthesis_is_running__ w] + +synth_design -top design_1_wrapper -part xc7z010clg225-1 + + +# disable binary constraint mode for synth run checkpoints +set_param constraints.enableBinaryConstraints false +write_checkpoint -force -noxdef design_1_wrapper.dcp +create_report "synth_1_synth_report_utilization_0" "report_utilization -file design_1_wrapper_utilization_synth.rpt -pb design_1_wrapper_utilization_synth.pb" +file delete __synthesis_is_running__ +close [open __synthesis_is_complete__ w] diff --git a/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.vds b/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.vds new file mode 100644 index 0000000..d88260d --- /dev/null +++ b/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.vds @@ -0,0 +1,519 @@ +#----------------------------------------------------------- +# Vivado v2018.2 (64-bit) +# SW Build 2258646 on Thu Jun 14 20:03:12 MDT 2018 +# IP Build 2256618 on Thu Jun 14 22:10:49 MDT 2018 +# Start of session at: Fri Aug 17 17:42:51 2018 +# Process ID: 20916 +# Current directory: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1 +# Command line: vivado.exe -log design_1_wrapper.vds -product Vivado -mode batch -messageDb vivado.pb -notrace -source design_1_wrapper.tcl +# Log file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.vds +# Journal file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1\vivado.jou +#----------------------------------------------------------- +source design_1_wrapper.tcl -notrace +INFO: [IP_Flow 19-234] Refreshing IP repositories +INFO: [IP_Flow 19-1704] No user IP repositories specified +INFO: [IP_Flow 19-2313] Loaded Vivado IP repository 'C:/Xilinx/Vivado/2018.2/data/ip'. +add_files: Time (s): cpu = 00:00:03 ; elapsed = 00:00:07 . Memory (MB): peak = 273.254 ; gain = 42.238 +Command: synth_design -top design_1_wrapper -part xc7z010clg225-1 +Starting synth_design +Attempting to get a license for feature 'Synthesis' and/or device 'xc7z010' +INFO: [Common 17-349] Got license for feature 'Synthesis' and/or device 'xc7z010' +INFO: Launching helper process for spawning children vivado processes +INFO: Helper process launched with PID 6780 +--------------------------------------------------------------------------------- +Starting RTL Elaboration : Time (s): cpu = 00:00:04 ; elapsed = 00:00:04 . Memory (MB): peak = 382.750 ; gain = 102.184 +--------------------------------------------------------------------------------- +INFO: [Synth 8-6157] synthesizing module 'design_1_wrapper' [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v:12] +INFO: [Synth 8-6157] synthesizing module 'design_1' [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/synth/design_1.v:13] +INFO: [Synth 8-6157] synthesizing module 'design_1_led_0_0' [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/.Xil/Vivado-20916-DESKTOP-4H60MTS/realtime/design_1_led_0_0_stub.v:6] +INFO: [Synth 8-6155] done synthesizing module 'design_1_led_0_0' (1#1) [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/.Xil/Vivado-20916-DESKTOP-4H60MTS/realtime/design_1_led_0_0_stub.v:6] +INFO: [Synth 8-6157] synthesizing module 'design_1_processing_system7_0_0' [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/.Xil/Vivado-20916-DESKTOP-4H60MTS/realtime/design_1_processing_system7_0_0_stub.v:6] +INFO: [Synth 8-6155] done synthesizing module 'design_1_processing_system7_0_0' (2#1) [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/.Xil/Vivado-20916-DESKTOP-4H60MTS/realtime/design_1_processing_system7_0_0_stub.v:6] +WARNING: [Synth 8-350] instance 'processing_system7_0' of module 'design_1_processing_system7_0_0' requires 125 connections, but only 53 given [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/synth/design_1.v:87] +INFO: [Synth 8-6155] done synthesizing module 'design_1' (3#1) [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/synth/design_1.v:13] +INFO: [Synth 8-6155] done synthesizing module 'design_1_wrapper' (4#1) [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v:12] +--------------------------------------------------------------------------------- +Finished RTL Elaboration : Time (s): cpu = 00:00:05 ; elapsed = 00:00:05 . Memory (MB): peak = 437.102 ; gain = 156.535 +--------------------------------------------------------------------------------- + +Report Check Netlist: ++------+------------------+-------+---------+-------+------------------+ +| |Item |Errors |Warnings |Status |Description | ++------+------------------+-------+---------+-------+------------------+ +|1 |multi_driven_nets | 0| 0|Passed |Multi driven nets | ++------+------------------+-------+---------+-------+------------------+ +--------------------------------------------------------------------------------- +Start Handling Custom Attributes +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Handling Custom Attributes : Time (s): cpu = 00:00:05 ; elapsed = 00:00:06 . Memory (MB): peak = 437.102 ; gain = 156.535 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished RTL Optimization Phase 1 : Time (s): cpu = 00:00:05 ; elapsed = 00:00:06 . Memory (MB): peak = 437.102 ; gain = 156.535 +--------------------------------------------------------------------------------- +INFO: [Device 21-403] Loading part xc7z010clg225-1 +INFO: [Project 1-570] Preparing netlist for logic optimization + +Processing XDC Constraints +Initializing timing engine +Parsing XDC File [c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc] for cell 'design_1_i/processing_system7_0' +Finished Parsing XDC File [c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc] for cell 'design_1_i/processing_system7_0' +Parsing XDC File [c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0/design_1_led_0_0_in_context.xdc] for cell 'design_1_i/led_0' +Finished Parsing XDC File [c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0/design_1_led_0_0_in_context.xdc] for cell 'design_1_i/led_0' +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/led.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/led.xdc] +INFO: [Project 1-236] Implementation specific constraints were found while reading constraint file [C:/Users/qwpmb/Documents/summercamp2018/led.xdc]. These constraints will be ignored for synthesis but will be used in implementation. Impacted constraints are listed in the file [.Xil/design_1_wrapper_propImpl.xdc]. +Resolution: To avoid this warning, move constraints listed in [.Xil/design_1_wrapper_propImpl.xdc] to another XDC file and exclude this new file from synthesis with the used_in_synthesis property (File Properties dialog in GUI) and re-run elaboration/synthesis. +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_bitgen_common.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_bitgen_common.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_common.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_common.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc] +WARNING: [Vivado 12-584] No ports matched 'csi_c_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:1] +WARNING: [Vivado 12-584] No ports matched 'csi_c_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:2] +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_n[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:3] +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_n[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:4] +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:5] +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:6] +WARNING: [Vivado 12-584] No ports matched 'csi_d_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:7] +WARNING: [Vivado 12-584] No ports matched 'csi_d_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:8] +WARNING: [Vivado 12-584] No ports matched 'csi_d_p[1]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:9] +WARNING: [Vivado 12-584] No ports matched 'csi_d_p[1]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:10] +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:12] +WARNING: [Vivado 12-584] No ports matched 'csi_d_lp_n[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:13] +WARNING: [Vivado 12-584] No ports matched 'csi_c_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc:15] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc] +WARNING: [Project 1-498] One or more constraints failed evaluation while reading constraint file [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc] and the design contains unresolved black boxes. These constraints will be read post-synthesis (as long as their source constraint file is marked as used_in_implementation) and should be applied correctly then. You should review the constraints listed in the file [.Xil/design_1_wrapper_propImpl.xdc] and check the run log file to verify that these constraints were correctly applied. +INFO: [Project 1-236] Implementation specific constraints were found while reading constraint file [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc]. These constraints will be ignored for synthesis but will be used in implementation. Impacted constraints are listed in the file [.Xil/design_1_wrapper_propImpl.xdc]. +Resolution: To avoid this warning, move constraints listed in [.Xil/design_1_wrapper_propImpl.xdc] to another XDC file and exclude this new file from synthesis with the used_in_synthesis property (File Properties dialog in GUI) and re-run elaboration/synthesis. +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc] +WARNING: [Vivado 12-584] No ports matched 'hdmi_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:1] +WARNING: [Vivado 12-584] No ports matched 'hdmi_clk_p'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:2] +WARNING: [Vivado 12-584] No ports matched 'hdmi_data_p[*]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:4] +WARNING: [Vivado 12-584] No ports matched 'hdmi_data_p[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:5] +WARNING: [Vivado 12-584] No ports matched 'hdmi_data_p[1]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:6] +WARNING: [Vivado 12-584] No ports matched 'hdmi_data_p[2]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc:7] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc] +WARNING: [Project 1-498] One or more constraints failed evaluation while reading constraint file [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc] and the design contains unresolved black boxes. These constraints will be read post-synthesis (as long as their source constraint file is marked as used_in_implementation) and should be applied correctly then. You should review the constraints listed in the file [.Xil/design_1_wrapper_propImpl.xdc] and check the run log file to verify that these constraints were correctly applied. +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[*]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:4] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[0]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:7] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[1]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:9] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[2]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:11] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[3]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:13] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[4]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:15] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[5]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:17] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[6]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:19] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[7]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:21] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[8]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:23] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[9]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:25] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[10]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:27] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[11]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:29] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[12]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:31] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[13]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:33] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[14]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:35] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[15]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:37] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[16]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:39] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[17]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:41] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[18]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:43] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[19]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:45] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[20]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:47] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[21]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:49] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[22]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:51] +WARNING: [Vivado 12-584] No ports matched 'gpio_1_tri_io[23]'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:53] +WARNING: [Vivado 12-584] No ports matched 'PWM_R'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:86] +WARNING: [Vivado 12-584] No ports matched 'PWM_L'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:88] +WARNING: [Vivado 12-584] No ports matched 'PWM_*'. [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc:89] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc] +WARNING: [Project 1-498] One or more constraints failed evaluation while reading constraint file [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc] and the design contains unresolved black boxes. These constraints will be read post-synthesis (as long as their source constraint file is marked as used_in_implementation) and should be applied correctly then. You should review the constraints listed in the file [.Xil/design_1_wrapper_propImpl.xdc] and check the run log file to verify that these constraints were correctly applied. +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_timing.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_timing.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/vivado_target.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/vivado_target.xdc] +Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/dont_touch.xdc] +Finished Parsing XDC File [C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/dont_touch.xdc] +Completed Processing XDC Constraints + +INFO: [Project 1-111] Unisim Transformation Summary: +No Unisim elements were transformed. + +Constraint Validation Runtime : Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.016 . Memory (MB): peak = 690.461 ; gain = 0.000 +--------------------------------------------------------------------------------- +Finished Constraint Validation : Time (s): cpu = 00:00:18 ; elapsed = 00:00:23 . Memory (MB): peak = 690.461 ; gain = 409.895 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Loading Part and Timing Information +--------------------------------------------------------------------------------- +Loading part: xc7z010clg225-1 +--------------------------------------------------------------------------------- +Finished Loading Part and Timing Information : Time (s): cpu = 00:00:18 ; elapsed = 00:00:23 . Memory (MB): peak = 690.461 ; gain = 409.895 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Applying 'set_property' XDC Constraints +--------------------------------------------------------------------------------- +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 3). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 4). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[10]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 5). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[10]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 6). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[11]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 7). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[11]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 8). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[12]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 9). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[12]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 10). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[13]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 11). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[13]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 12). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[14]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 13). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[14]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 14). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 15). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 16). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[2]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 17). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[2]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 18). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[3]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 19). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[3]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 20). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[4]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 21). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[4]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 22). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[5]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 23). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[5]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 24). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[6]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 25). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[6]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 26). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[7]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 27). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[7]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 28). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[8]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 29). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[8]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 30). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_addr[9]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 31). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_addr[9]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 32). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_ba[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 33). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_ba[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 34). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_ba[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 35). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_ba[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 36). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_ba[2]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 37). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_ba[2]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 38). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_cas_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 39). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_cas_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 40). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_cke. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 41). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_cke. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 42). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_cs_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 43). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_cs_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 44). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_ck_p. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 45). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_ck_p. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 46). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_ck_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 47). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_ck_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 48). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dm[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 49). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dm[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 50). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dm[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 51). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dm[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 52). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dqs_p[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 53). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dqs_p[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 54). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dqs_p[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 55). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dqs_p[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 56). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dqs_n[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 57). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dqs_n[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 58). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dqs_n[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 59). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dqs_n[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 60). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 61). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 62). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[10]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 63). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[10]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 64). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[11]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 65). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[11]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 66). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[12]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 67). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[12]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 68). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[13]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 69). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[13]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 70). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[14]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 71). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[14]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 72). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[15]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 73). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[15]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 74). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 75). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 76). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[2]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 77). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[2]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 78). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[3]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 79). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[3]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 80). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[4]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 81). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[4]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 82). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[5]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 83). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[5]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 84). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[6]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 85). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[6]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 86). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[7]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 87). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[7]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 88). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[8]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 89). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[8]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 90). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_dq[9]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 91). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_dq[9]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 92). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_reset_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 93). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_reset_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 94). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_odt. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 95). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_odt. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 96). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_ras_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 97). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_ras_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 98). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_ddr_vrn. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 99). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_ddr_vrn. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 100). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_ddr_vrp. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 101). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_ddr_vrp. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 102). +Applied set_property IO_BUFFER_TYPE = NONE for DDR_we_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 103). +Applied set_property CLOCK_BUFFER_TYPE = NONE for DDR_we_n. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 104). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 105). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[0]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 106). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[10]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 107). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[10]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 108). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[11]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 109). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[11]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 110). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[12]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 111). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[12]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 112). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[13]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 113). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[13]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 114). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[14]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 115). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[14]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 116). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[15]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 117). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[15]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 118). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[16]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 119). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[16]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 120). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[17]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 121). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[17]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 122). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[18]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 123). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[18]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 124). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[19]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 125). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[19]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 126). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 127). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[1]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 128). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[20]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 129). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[20]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 130). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[21]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 131). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[21]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 132). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[22]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 133). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[22]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 134). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[23]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 135). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[23]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 136). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[24]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 137). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[24]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 138). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[25]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 139). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[25]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 140). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[26]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 141). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[26]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 142). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[27]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 143). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[27]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 144). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[28]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 145). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[28]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 146). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[29]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 147). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[29]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 148). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[2]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 149). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[2]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 150). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[30]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 151). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[30]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 152). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[31]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 153). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[31]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 154). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[3]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 155). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[3]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 156). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[4]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 157). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[4]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 158). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[5]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 159). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[5]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 160). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[6]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 161). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[6]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 162). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[7]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 163). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[7]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 164). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[8]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 165). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[8]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 166). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_mio[9]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 167). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_mio[9]. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 168). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_ps_clk. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 169). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_ps_clk. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 170). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_ps_porb. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 171). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_ps_porb. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 172). +Applied set_property IO_BUFFER_TYPE = NONE for FIXED_IO_ps_srstb. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 173). +Applied set_property CLOCK_BUFFER_TYPE = NONE for FIXED_IO_ps_srstb. (constraint file c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0/design_1_processing_system7_0_0_in_context.xdc, line 174). +Applied set_property DONT_TOUCH = true for design_1_i. (constraint file auto generated constraint, line ). +Applied set_property DONT_TOUCH = true for design_1_i/processing_system7_0. (constraint file auto generated constraint, line ). +Applied set_property DONT_TOUCH = true for design_1_i/led_0. (constraint file auto generated constraint, line ). +--------------------------------------------------------------------------------- +Finished applying 'set_property' XDC Constraints : Time (s): cpu = 00:00:19 ; elapsed = 00:00:24 . Memory (MB): peak = 690.461 ; gain = 409.895 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished RTL Optimization Phase 2 : Time (s): cpu = 00:00:19 ; elapsed = 00:00:24 . Memory (MB): peak = 690.461 ; gain = 409.895 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start RTL Component Statistics +--------------------------------------------------------------------------------- +Detailed RTL Component Info : +--------------------------------------------------------------------------------- +Finished RTL Component Statistics +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start RTL Hierarchical Component Statistics +--------------------------------------------------------------------------------- +Hierarchical RTL Component report +--------------------------------------------------------------------------------- +Finished RTL Hierarchical Component Statistics +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Part Resource Summary +--------------------------------------------------------------------------------- +Part Resources: +DSPs: 80 (col length:40) +BRAMs: 120 (col length: RAMB18 40 RAMB36 20) +--------------------------------------------------------------------------------- +Finished Part Resource Summary +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Cross Boundary and Area Optimization +--------------------------------------------------------------------------------- +Warning: Parallel synthesis criteria is not met +--------------------------------------------------------------------------------- +Finished Cross Boundary and Area Optimization : Time (s): cpu = 00:00:20 ; elapsed = 00:00:25 . Memory (MB): peak = 690.461 ; gain = 409.895 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start Applying XDC Timing Constraints +--------------------------------------------------------------------------------- +INFO: [Synth 8-5578] Moved timing constraint from pin 'design_1_i/processing_system7_0/FCLK_CLK0' to pin 'design_1_i/processing_system7_0/bbstub_FCLK_CLK0/O' +INFO: [Synth 8-5578] Moved timing constraint from pin 'design_1_i/processing_system7_0/FCLK_CLK1' to pin 'design_1_i/processing_system7_0/bbstub_FCLK_CLK1/O' +INFO: [Synth 8-5819] Moved 2 constraints on hierarchical pins to their respective driving/loading pins +--------------------------------------------------------------------------------- +Finished Applying XDC Timing Constraints : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 754.000 ; gain = 473.434 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Timing Optimization +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Timing Optimization : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 754.074 ; gain = 473.508 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start Technology Mapping +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Technology Mapping : Time (s): cpu = 00:00:33 ; elapsed = 00:00:41 . Memory (MB): peak = 754.074 ; gain = 473.508 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start IO Insertion +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Flattening Before IO Insertion +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Flattening Before IO Insertion +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Final Netlist Cleanup +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Final Netlist Cleanup +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished IO Insertion : Time (s): cpu = 00:00:34 ; elapsed = 00:00:43 . Memory (MB): peak = 755.199 ; gain = 474.633 +--------------------------------------------------------------------------------- + +Report Check Netlist: ++------+------------------+-------+---------+-------+------------------+ +| |Item |Errors |Warnings |Status |Description | ++------+------------------+-------+---------+-------+------------------+ +|1 |multi_driven_nets | 0| 0|Passed |Multi driven nets | ++------+------------------+-------+---------+-------+------------------+ +--------------------------------------------------------------------------------- +Start Renaming Generated Instances +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Renaming Generated Instances : Time (s): cpu = 00:00:34 ; elapsed = 00:00:43 . Memory (MB): peak = 755.199 ; gain = 474.633 +--------------------------------------------------------------------------------- + +Report RTL Partitions: ++-+--------------+------------+----------+ +| |RTL Partition |Replication |Instances | ++-+--------------+------------+----------+ ++-+--------------+------------+----------+ +--------------------------------------------------------------------------------- +Start Rebuilding User Hierarchy +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Rebuilding User Hierarchy : Time (s): cpu = 00:00:34 ; elapsed = 00:00:43 . Memory (MB): peak = 755.199 ; gain = 474.633 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Renaming Generated Ports +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Renaming Generated Ports : Time (s): cpu = 00:00:34 ; elapsed = 00:00:43 . Memory (MB): peak = 755.199 ; gain = 474.633 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Handling Custom Attributes +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Handling Custom Attributes : Time (s): cpu = 00:00:34 ; elapsed = 00:00:43 . Memory (MB): peak = 755.199 ; gain = 474.633 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Renaming Generated Nets +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Finished Renaming Generated Nets : Time (s): cpu = 00:00:34 ; elapsed = 00:00:43 . Memory (MB): peak = 755.199 ; gain = 474.633 +--------------------------------------------------------------------------------- +--------------------------------------------------------------------------------- +Start Writing Synthesis Report +--------------------------------------------------------------------------------- + +Report BlackBoxes: ++------+--------------------------------+----------+ +| |BlackBox name |Instances | ++------+--------------------------------+----------+ +|1 |design_1_led_0_0 | 1| +|2 |design_1_processing_system7_0_0 | 1| ++------+--------------------------------+----------+ + +Report Cell Usage: ++------+--------------------------------+------+ +| |Cell |Count | ++------+--------------------------------+------+ +|1 |design_1_led_0_0 | 1| +|2 |design_1_processing_system7_0_0 | 1| +|3 |OBUF | 1| ++------+--------------------------------+------+ + +Report Instance Areas: ++------+-------------+---------+------+ +| |Instance |Module |Cells | ++------+-------------+---------+------+ +|1 |top | | 369| +|2 | design_1_i |design_1 | 368| ++------+-------------+---------+------+ +--------------------------------------------------------------------------------- +Finished Writing Synthesis Report : Time (s): cpu = 00:00:34 ; elapsed = 00:00:43 . Memory (MB): peak = 755.199 ; gain = 474.633 +--------------------------------------------------------------------------------- +Synthesis finished with 0 errors, 0 critical warnings and 0 warnings. +Synthesis Optimization Runtime : Time (s): cpu = 00:00:19 ; elapsed = 00:00:29 . Memory (MB): peak = 755.203 ; gain = 221.277 +Synthesis Optimization Complete : Time (s): cpu = 00:00:34 ; elapsed = 00:00:43 . Memory (MB): peak = 755.203 ; gain = 474.637 +INFO: [Project 1-571] Translating synthesized netlist +INFO: [Project 1-570] Preparing netlist for logic optimization +INFO: [Opt 31-138] Pushed 0 inverter(s) to 0 load pin(s). +INFO: [Project 1-111] Unisim Transformation Summary: +No Unisim elements were transformed. + +INFO: [Common 17-83] Releasing license: Synthesis +25 Infos, 51 Warnings, 0 Critical Warnings and 0 Errors encountered. +synth_design completed successfully +synth_design: Time (s): cpu = 00:00:37 ; elapsed = 00:00:46 . Memory (MB): peak = 776.754 ; gain = 503.500 +WARNING: [Constraints 18-5210] No constraint will be written out. +INFO: [Common 17-1381] The checkpoint 'C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.dcp' has been generated. +INFO: [runtcl-4] Executing : report_utilization -file design_1_wrapper_utilization_synth.rpt -pb design_1_wrapper_utilization_synth.pb +report_utilization: Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.047 . Memory (MB): peak = 776.926 ; gain = 0.000 +INFO: [Common 17-206] Exiting Vivado at Fri Aug 17 17:43:50 2018... diff --git a/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper_utilization_synth.pb b/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper_utilization_synth.pb new file mode 100644 index 0000000000000000000000000000000000000000..5cbc3b6dc2fe482633b65968564938e5e04ae192 GIT binary patch literal 224 zcmd;LGcqu=&@-CEtPxzAo10ivsgR$hP+F3ilUbEml9`_e;%28-Dioy_=a&{Grxxp- zk1?sTHQcw02CZG_5c6? literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper_utilization_synth.rpt b/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper_utilization_synth.rpt new file mode 100644 index 0000000..618ce3c --- /dev/null +++ b/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper_utilization_synth.rpt @@ -0,0 +1,171 @@ +Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +--------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +| Date : Fri Aug 17 17:43:50 2018 +| Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +| Command : report_utilization -file design_1_wrapper_utilization_synth.rpt -pb design_1_wrapper_utilization_synth.pb +| Design : design_1_wrapper +| Device : 7z010clg225-1 +| Design State : Synthesized +--------------------------------------------------------------------------------------------------------------------------- + +Utilization Design Information + +Table of Contents +----------------- +1. Slice Logic +1.1 Summary of Registers by Type +2. Memory +3. DSP +4. IO and GT Specific +5. Clocking +6. Specific Feature +7. Primitives +8. Black Boxes +9. Instantiated Netlists + +1. Slice Logic +-------------- + ++-------------------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-------------------------+------+-------+-----------+-------+ +| Slice LUTs* | 0 | 0 | 17600 | 0.00 | +| LUT as Logic | 0 | 0 | 17600 | 0.00 | +| LUT as Memory | 0 | 0 | 6000 | 0.00 | +| Slice Registers | 0 | 0 | 35200 | 0.00 | +| Register as Flip Flop | 0 | 0 | 35200 | 0.00 | +| Register as Latch | 0 | 0 | 35200 | 0.00 | +| F7 Muxes | 0 | 0 | 8800 | 0.00 | +| F8 Muxes | 0 | 0 | 4400 | 0.00 | ++-------------------------+------+-------+-----------+-------+ +* Warning! The Final LUT count, after physical optimizations and full implementation, is typically lower. Run opt_design after synthesis, if not already completed, for a more realistic count. + + +1.1 Summary of Registers by Type +-------------------------------- + ++-------+--------------+-------------+--------------+ +| Total | Clock Enable | Synchronous | Asynchronous | ++-------+--------------+-------------+--------------+ +| 0 | _ | - | - | +| 0 | _ | - | Set | +| 0 | _ | - | Reset | +| 0 | _ | Set | - | +| 0 | _ | Reset | - | +| 0 | Yes | - | - | +| 0 | Yes | - | Set | +| 0 | Yes | - | Reset | +| 0 | Yes | Set | - | +| 0 | Yes | Reset | - | ++-------+--------------+-------------+--------------+ + + +2. Memory +--------- + ++----------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++----------------+------+-------+-----------+-------+ +| Block RAM Tile | 0 | 0 | 60 | 0.00 | +| RAMB36/FIFO* | 0 | 0 | 60 | 0.00 | +| RAMB18 | 0 | 0 | 120 | 0.00 | ++----------------+------+-------+-----------+-------+ +* Note: Each Block RAM Tile only has one FIFO logic available and therefore can accommodate only one FIFO36E1 or one FIFO18E1. However, if a FIFO18E1 occupies a Block RAM Tile, that tile can still accommodate a RAMB18E1 + + +3. DSP +------ + ++-----------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-----------+------+-------+-----------+-------+ +| DSPs | 0 | 0 | 80 | 0.00 | ++-----------+------+-------+-----------+-------+ + + +4. IO and GT Specific +--------------------- + ++-----------------------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-----------------------------+------+-------+-----------+-------+ +| Bonded IOB | 1 | 0 | 54 | 1.85 | +| Bonded IPADs | 0 | 0 | 2 | 0.00 | +| Bonded IOPADs | 0 | 0 | 130 | 0.00 | +| PHY_CONTROL | 0 | 0 | 2 | 0.00 | +| PHASER_REF | 0 | 0 | 2 | 0.00 | +| OUT_FIFO | 0 | 0 | 8 | 0.00 | +| IN_FIFO | 0 | 0 | 8 | 0.00 | +| IDELAYCTRL | 0 | 0 | 2 | 0.00 | +| IBUFDS | 0 | 0 | 54 | 0.00 | +| PHASER_OUT/PHASER_OUT_PHY | 0 | 0 | 8 | 0.00 | +| PHASER_IN/PHASER_IN_PHY | 0 | 0 | 8 | 0.00 | +| IDELAYE2/IDELAYE2_FINEDELAY | 0 | 0 | 100 | 0.00 | +| ILOGIC | 0 | 0 | 54 | 0.00 | +| OLOGIC | 0 | 0 | 54 | 0.00 | ++-----------------------------+------+-------+-----------+-------+ + + +5. Clocking +----------- + ++------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++------------+------+-------+-----------+-------+ +| BUFGCTRL | 0 | 0 | 32 | 0.00 | +| BUFIO | 0 | 0 | 8 | 0.00 | +| MMCME2_ADV | 0 | 0 | 2 | 0.00 | +| PLLE2_ADV | 0 | 0 | 2 | 0.00 | +| BUFMRCE | 0 | 0 | 4 | 0.00 | +| BUFHCE | 0 | 0 | 48 | 0.00 | +| BUFR | 0 | 0 | 8 | 0.00 | ++------------+------+-------+-----------+-------+ + + +6. Specific Feature +------------------- + ++-------------+------+-------+-----------+-------+ +| Site Type | Used | Fixed | Available | Util% | ++-------------+------+-------+-----------+-------+ +| BSCANE2 | 0 | 0 | 4 | 0.00 | +| CAPTUREE2 | 0 | 0 | 1 | 0.00 | +| DNA_PORT | 0 | 0 | 1 | 0.00 | +| EFUSE_USR | 0 | 0 | 1 | 0.00 | +| FRAME_ECCE2 | 0 | 0 | 1 | 0.00 | +| ICAPE2 | 0 | 0 | 2 | 0.00 | +| STARTUPE2 | 0 | 0 | 1 | 0.00 | +| XADC | 0 | 0 | 1 | 0.00 | ++-------------+------+-------+-----------+-------+ + + +7. Primitives +------------- + ++----------+------+---------------------+ +| Ref Name | Used | Functional Category | ++----------+------+---------------------+ +| OBUF | 1 | IO | ++----------+------+---------------------+ + + +8. Black Boxes +-------------- + ++---------------------------------+------+ +| Ref Name | Used | ++---------------------------------+------+ +| design_1_processing_system7_0_0 | 1 | +| design_1_led_0_0 | 1 | ++---------------------------------+------+ + + +9. Instantiated Netlists +------------------------ + ++----------+------+ +| Ref Name | Used | ++----------+------+ + + diff --git a/LED_Blink/LED_Blink.runs/synth_1/dont_touch.xdc b/LED_Blink/LED_Blink.runs/synth_1/dont_touch.xdc new file mode 100644 index 0000000..8830142 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/synth_1/dont_touch.xdc @@ -0,0 +1,29 @@ +# This file is automatically generated. +# It contains project source information necessary for synthesis and implementation. + +# XDC: C:/Users/qwpmb/Documents/summercamp2018/led.xdc + +# XDC: C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_bitgen_common.xdc + +# XDC: C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_common.xdc + +# XDC: C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_csi.xdc + +# XDC: C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_hdmi.xdc + +# XDC: C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_te0726.xdc + +# XDC: C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/_i_timing.xdc + +# XDC: C:/Users/qwpmb/Documents/summercamp2018/zynqberrydemo1/constraints/vivado_target.xdc + +# Block Designs: bd/design_1/design_1.bd +set_property DONT_TOUCH TRUE [get_cells -hier -filter {REF_NAME==design_1 || ORIG_REF_NAME==design_1} -quiet] -quiet + +# IP: bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xci +set_property DONT_TOUCH TRUE [get_cells -hier -filter {REF_NAME==design_1_processing_system7_0_0 || ORIG_REF_NAME==design_1_processing_system7_0_0} -quiet] -quiet + +# IP: bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xci +set_property DONT_TOUCH TRUE [get_cells -hier -filter {REF_NAME==design_1_led_0_0 || ORIG_REF_NAME==design_1_led_0_0} -quiet] -quiet + +# XDC: bd/design_1/design_1_ooc.xdc diff --git a/LED_Blink/LED_Blink.runs/synth_1/gen_run.xml b/LED_Blink/LED_Blink.runs/synth_1/gen_run.xml new file mode 100644 index 0000000..60fa0d4 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/synth_1/gen_run.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LED_Blink/LED_Blink.runs/synth_1/htr.txt b/LED_Blink/LED_Blink.runs/synth_1/htr.txt new file mode 100644 index 0000000..274e434 --- /dev/null +++ b/LED_Blink/LED_Blink.runs/synth_1/htr.txt @@ -0,0 +1,9 @@ +REM +REM Vivado(TM) +REM htr.txt: a Vivado-generated description of how-to-repeat the +REM the basic steps of a run. Note that runme.bat/sh needs +REM to be invoked for Vivado to track run status. +REM Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +REM + +vivado -log design_1_wrapper.vds -m64 -product Vivado -mode batch -messageDb vivado.pb -notrace -source design_1_wrapper.tcl diff --git a/LED_Blink/LED_Blink.runs/synth_1/vivado.jou b/LED_Blink/LED_Blink.runs/synth_1/vivado.jou new file mode 100644 index 0000000..eba3dec --- /dev/null +++ b/LED_Blink/LED_Blink.runs/synth_1/vivado.jou @@ -0,0 +1,12 @@ +#----------------------------------------------------------- +# Vivado v2018.2 (64-bit) +# SW Build 2258646 on Thu Jun 14 20:03:12 MDT 2018 +# IP Build 2256618 on Thu Jun 14 22:10:49 MDT 2018 +# Start of session at: Fri Aug 17 17:42:51 2018 +# Process ID: 20916 +# Current directory: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1 +# Command line: vivado.exe -log design_1_wrapper.vds -product Vivado -mode batch -messageDb vivado.pb -notrace -source design_1_wrapper.tcl +# Log file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1/design_1_wrapper.vds +# Journal file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.runs/synth_1\vivado.jou +#----------------------------------------------------------- +source design_1_wrapper.tcl -notrace diff --git a/LED_Blink/LED_Blink.runs/synth_1/vivado.pb b/LED_Blink/LED_Blink.runs/synth_1/vivado.pb new file mode 100644 index 0000000000000000000000000000000000000000..70ba99b468bcc56cdf316234bdfa1d91de3c33d8 GIT binary patch literal 48028 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 F`+rBGcHaO1 literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.sdk/.metadata/.plugins/com.xilinx.sdk.hw.ui/dialog_settings.xml b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/com.xilinx.sdk.hw.ui/dialog_settings.xml new file mode 100644 index 0000000..bb90bd0 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/com.xilinx.sdk.hw.ui/dialog_settings.xml @@ -0,0 +1,4 @@ + +
    + +
    diff --git a/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml new file mode 100644 index 0000000..471753f --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.cdt.ui/dialog_settings.xml @@ -0,0 +1,7 @@ + +
    +
    +
    +
    +
    +
    diff --git a/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml new file mode 100644 index 0000000..327d6fe --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.debug.ui/dialog_settings.xml @@ -0,0 +1,11 @@ + +
    +
    + + + + + + +
    +
    diff --git a/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 0000000..d5fe103 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml new file mode 100644 index 0000000..e4f30a7 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.editors/dialog_settings.xml @@ -0,0 +1,5 @@ + +
    +
    +
    +
    diff --git a/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml new file mode 100644 index 0000000..9a8f2a9 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.workbench/dialog_settings.xml @@ -0,0 +1,15 @@ + +
    +
    + + + + + + + + + + +
    +
    diff --git a/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 0000000..0705825 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.c b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.c new file mode 100644 index 0000000..a06e306 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.c @@ -0,0 +1,13206 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the "Software"), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit +* persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* Use of the Software is limited solely to applications: (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used in advertising or +* otherwise to promote the sale, use or other dealings in this Software without prior written +* authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file ps7_init.c +* +* This file is automatically generated +* +*****************************************************************************/ + +#include "ps7_init.h" + +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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x7 + // .. ==> 0XF800015C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. DIVISOR1 = 0x6 + // .. ==> 0XF800015C[25:20] = 0x00000006U + // .. ==> MASK : 0x03F00000U VAL : 0x00600000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00600701U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00001081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27087290U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 + // .. .. reserved_reg_ddrc_rank0_wr_odt = 0x1 + // .. .. ==> 0XF8006048[5:3] = 0x00000001U + // .. .. ==> MASK : 0x00000038U VAL : 0x00000008U + // .. .. reserved_reg_ddrc_rank0_rd_odt = 0x0 + // .. .. ==> 0XF8006048[2:0] = 0x00000000U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006048, 0x0003F03FU ,0x0003C008U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B5C[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B5C[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. reserved_SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B60[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B60[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F9861CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B64[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B64[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F9861CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B68[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B68[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. reserved_VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. reserved_REFIO_TEST = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. reserved_REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. reserved_DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. reserved_CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x00007FFFU ,0x00000209U), + // .. .. 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 + // .. .. reserved_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 + // .. .. reserved_VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reserved_VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reserved_VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. reserved_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[15:14] = 0x00000000U + // .. .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. reserved_INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reserved_TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reserved_TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reserved_TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. reserved_TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reserved_INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FEFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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 = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. .. START: USB1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: USB1 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: ENET0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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: ENET0 RESET + // .. .. .. START: ENET1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: ENET1 RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. .. START: I2C0 RESET + // .. .. .. .. START: DIR MODE GPIO BANK0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: OUTPUT ENABLE + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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: I2C0 RESET + // .. .. .. START: I2C1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: I2C1 RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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 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 + // .. .. START: AFI2 SECURE REGISTER + // .. .. FINISH: AFI2 SECURE REGISTER + // .. 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_debug_3_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x7 + // .. ==> 0XF800015C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. DIVISOR1 = 0x6 + // .. ==> 0XF800015C[25:20] = 0x00000006U + // .. ==> MASK : 0x03F00000U VAL : 0x00600000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00600701U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27287290U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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_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 = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. 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 = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. 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 ,0x00000209U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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 = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. .. START: USB1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: USB1 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: ENET0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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: ENET0 RESET + // .. .. .. START: ENET1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: ENET1 RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. .. START: I2C0 RESET + // .. .. .. .. START: DIR MODE GPIO BANK0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: OUTPUT ENABLE + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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: I2C0 RESET + // .. .. .. START: I2C1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: I2C1 RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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 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_debug_2_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x7 + // .. ==> 0XF800015C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. DIVISOR1 = 0x6 + // .. ==> 0XF800015C[25:20] = 0x00000006U + // .. ==> MASK : 0x03F00000U VAL : 0x00600000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00600701U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27287290U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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_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 = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. 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 = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 ,0x00000209U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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 = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. .. START: USB1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: USB1 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: ENET0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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: ENET0 RESET + // .. .. .. START: ENET1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: ENET1 RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. .. START: I2C0 RESET + // .. .. .. .. START: DIR MODE GPIO BANK0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: OUTPUT ENABLE + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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: I2C0 RESET + // .. .. .. START: I2C1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: I2C1 RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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 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_debug_1_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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; + case OPCODE_MASKDELAY: + addr = (unsigned long*) args[0]; + mask = args[1]; + int delay = get_number_of_cycles_for_delay(mask); + perf_reset_and_start_timer(); + while ((*addr < delay)) { + } + 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_debug() +{ + // 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_debug_1_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else if (si_ver == PCW_SILICON_VERSION_2) { + ret = ps7_config (ps7_debug_2_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else { + ret = ps7_config (ps7_debug_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 ret; + //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 + 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; +} + + + + +/* For delay calculation using global timer */ + +/* start timer */ + void perf_start_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = ((1 << 0) | // Timer Enable + (1 << 3) | // Auto-increment + (0 << 8) // Pre-scale + ); +} + +/* stop timer and reset timer count regs */ + void perf_reset_clock(void) +{ + perf_disable_clock(); + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_L32 = 0; + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_U32 = 0; +} + +/* Compute mask for given delay in miliseconds*/ +int get_number_of_cycles_for_delay(unsigned int delay) +{ + // GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + return (APU_FREQ*delay/(2*1000)); + +} + +/* stop timer */ + void perf_disable_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = 0; +} + +void perf_reset_and_start_timer() +{ + perf_reset_clock(); + perf_start_clock(); +} + + + + diff --git a/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.h b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.h new file mode 100644 index 0000000..fd189b5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.h @@ -0,0 +1,137 @@ + +/****************************************************************************** +* +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the "Software"), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit +* persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* Use of the Software is limited solely to applications: (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used in advertising or +* otherwise to promote the sale, use or other dealings in this Software without prior written +* authorization from Xilinx. +* +*******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 OPCODE_MASKDELAY 5U +#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 +#define EMIT_MASKDELAY(addr,mask) ( (OPCODE_MASKDELAY << 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 666666687 +#define DDR_FREQ 533333374 +#define DCI_FREQ 10158730 +#define QSPI_FREQ 200000000 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 25000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 50000000 +#define UART_FREQ 50000000 +#define SPI_FREQ 10000000 +#define I2C_FREQ 111111115 +#define WDT_FREQ 111111115 +#define TTC_FREQ 50000000 +#define CAN_FREQ 23809523 +#define PCAP_FREQ 200000000 +#define TPIU_FREQ 200000000 +#define FPGA0_FREQ 50000000 +#define FPGA1_FREQ 10000000 +#define FPGA2_FREQ 10000000 +#define FPGA3_FREQ 10000000 + + +/* For delay calculation using global registers*/ +#define SCU_GLOBAL_TIMER_COUNT_L32 0xF8F00200 +#define SCU_GLOBAL_TIMER_COUNT_U32 0xF8F00204 +#define SCU_GLOBAL_TIMER_CONTROL 0xF8F00208 +#define SCU_GLOBAL_TIMER_AUTO_INC 0xF8F00218 + +int ps7_config( unsigned long*); +int ps7_init(); +int ps7_post_config(); +int ps7_debug(); +char* getPS7MessageInfo(unsigned key); + +void perf_start_clock(void); +void perf_disable_clock(void); +void perf_reset_clock(void); +void perf_reset_and_start_timer(); +int get_number_of_cycles_for_delay(unsigned int delay); +#ifdef __cplusplus +} +#endif + diff --git a/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.tcl b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.tcl new file mode 100644 index 0000000..05a88d2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init.tcl @@ -0,0 +1,882 @@ +proc ps7_pll_init_data_3_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000110 0x003FFFF0 0x000FA220 + mask_write 0XF8000100 0x0007F000 0x00028000 + mask_write 0XF8000100 0x00000010 0x00000010 + mask_write 0XF8000100 0x00000001 0x00000001 + mask_write 0XF8000100 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000001 + mask_write 0XF8000100 0x00000010 0x00000000 + mask_write 0XF8000120 0x1F003F30 0x1F000200 + mask_write 0XF8000114 0x003FFFF0 0x0012C220 + mask_write 0XF8000104 0x0007F000 0x00020000 + mask_write 0XF8000104 0x00000010 0x00000010 + mask_write 0XF8000104 0x00000001 0x00000001 + mask_write 0XF8000104 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000002 + mask_write 0XF8000104 0x00000010 0x00000000 + mask_write 0XF8000124 0xFFF00003 0x0C200003 + mask_write 0XF8000118 0x003FFFF0 0x001452C0 + mask_write 0XF8000108 0x0007F000 0x0001E000 + mask_write 0XF8000108 0x00000010 0x00000010 + mask_write 0XF8000108 0x00000001 0x00000001 + mask_write 0XF8000108 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000004 + mask_write 0XF8000108 0x00000010 0x00000000 + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_clock_init_data_3_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000128 0x03F03F01 0x00700F01 + mask_write 0XF8000138 0x00000011 0x00000001 + mask_write 0XF8000140 0x03F03F71 0x00500801 + mask_write 0XF800014C 0x00003F31 0x00000501 + mask_write 0XF8000150 0x00003F33 0x00001401 + mask_write 0XF8000154 0x00003F33 0x00001402 + mask_write 0XF800015C 0x03F03F33 0x00600701 + mask_write 0XF8000160 0x007F007F 0x00000000 + mask_write 0XF8000168 0x00003F31 0x00000501 + mask_write 0XF8000170 0x03F03F30 0x00400500 + mask_write 0XF80001C4 0x00000001 0x00000001 + mask_write 0XF800012C 0x01FFCCCD 0x01ED044D + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_ddr_init_data_3_0 {} { + mask_write 0XF8006000 0x0001FFFF 0x00000080 + mask_write 0XF8006004 0x0007FFFF 0x00001081 + mask_write 0XF8006008 0x03FFFFFF 0x03C0780F + mask_write 0XF800600C 0x03FFFFFF 0x02001001 + mask_write 0XF8006010 0x03FFFFFF 0x00014001 + mask_write 0XF8006014 0x001FFFFF 0x0004159B + mask_write 0XF8006018 0xF7FFFFFF 0x452440D2 + mask_write 0XF800601C 0xFFFFFFFF 0x720238E5 + mask_write 0XF8006020 0x7FDFFFFC 0x27087290 + mask_write 0XF8006024 0x0FFFFFC3 0x00000000 + mask_write 0XF8006028 0x00003FFF 0x00002007 + mask_write 0XF800602C 0xFFFFFFFF 0x00000008 + mask_write 0XF8006030 0xFFFFFFFF 0x00040930 + mask_write 0XF8006034 0x13FF3FFF 0x000116D4 + mask_write 0XF8006038 0x00000003 0x00000000 + mask_write 0XF800603C 0x000FFFFF 0x00000777 + mask_write 0XF8006040 0xFFFFFFFF 0xFFF00000 + mask_write 0XF8006044 0x0FFFFFFF 0x0F666666 + mask_write 0XF8006048 0x0003F03F 0x0003C008 + mask_write 0XF8006050 0xFF0F8FFF 0x77010800 + mask_write 0XF8006058 0x00010000 0x00000000 + mask_write 0XF800605C 0x0000FFFF 0x00005003 + mask_write 0XF8006060 0x000017FF 0x0000003E + mask_write 0XF8006064 0x00021FE0 0x00020000 + mask_write 0XF8006068 0x03FFFFFF 0x00284141 + mask_write 0XF800606C 0x0000FFFF 0x00001610 + mask_write 0XF8006078 0x03FFFFFF 0x00466111 + mask_write 0XF800607C 0x000FFFFF 0x00032222 + mask_write 0XF80060A4 0xFFFFFFFF 0x10200802 + mask_write 0XF80060A8 0x0FFFFFFF 0x0690CB73 + mask_write 0XF80060AC 0x000001FF 0x000001FE + mask_write 0XF80060B0 0x1FFFFFFF 0x1CFFFFFF + mask_write 0XF80060B4 0x00000200 0x00000200 + mask_write 0XF80060B8 0x01FFFFFF 0x00200066 + mask_write 0XF80060C4 0x00000003 0x00000000 + mask_write 0XF80060C8 0x000000FF 0x00000000 + mask_write 0XF80060DC 0x00000001 0x00000000 + mask_write 0XF80060F0 0x0000FFFF 0x00000000 + mask_write 0XF80060F4 0x0000000F 0x00000008 + mask_write 0XF8006114 0x000000FF 0x00000000 + mask_write 0XF8006118 0x7FFFFFCF 0x40000001 + mask_write 0XF800611C 0x7FFFFFCF 0x40000001 + mask_write 0XF8006120 0x7FFFFFCF 0x40000001 + mask_write 0XF8006124 0x7FFFFFCF 0x40000001 + mask_write 0XF800612C 0x000FFFFF 0x0003C81D + mask_write 0XF8006130 0x000FFFFF 0x00036012 + mask_write 0XF8006134 0x000FFFFF 0x0003780C + mask_write 0XF8006138 0x000FFFFF 0x0003B821 + mask_write 0XF8006140 0x000FFFFF 0x00000035 + mask_write 0XF8006144 0x000FFFFF 0x00000035 + mask_write 0XF8006148 0x000FFFFF 0x00000035 + mask_write 0XF800614C 0x000FFFFF 0x00000035 + mask_write 0XF8006154 0x000FFFFF 0x0000009D + mask_write 0XF8006158 0x000FFFFF 0x00000092 + mask_write 0XF800615C 0x000FFFFF 0x0000008C + mask_write 0XF8006160 0x000FFFFF 0x000000A1 + mask_write 0XF8006168 0x001FFFFF 0x00000147 + mask_write 0XF800616C 0x001FFFFF 0x0000012D + mask_write 0XF8006170 0x001FFFFF 0x00000133 + mask_write 0XF8006174 0x001FFFFF 0x00000143 + mask_write 0XF800617C 0x000FFFFF 0x000000DD + mask_write 0XF8006180 0x000FFFFF 0x000000D2 + mask_write 0XF8006184 0x000FFFFF 0x000000CC + mask_write 0XF8006188 0x000FFFFF 0x000000E1 + mask_write 0XF8006190 0x6FFFFEFE 0x00040080 + mask_write 0XF8006194 0x000FFFFF 0x0001FC82 + mask_write 0XF8006204 0xFFFFFFFF 0x00000000 + mask_write 0XF8006208 0x000703FF 0x000003FF + mask_write 0XF800620C 0x000703FF 0x000003FF + mask_write 0XF8006210 0x000703FF 0x000003FF + mask_write 0XF8006214 0x000703FF 0x000003FF + mask_write 0XF8006218 0x000F03FF 0x000003FF + mask_write 0XF800621C 0x000F03FF 0x000003FF + mask_write 0XF8006220 0x000F03FF 0x000003FF + mask_write 0XF8006224 0x000F03FF 0x000003FF + mask_write 0XF80062A8 0x00000FF5 0x00000000 + mask_write 0XF80062AC 0xFFFFFFFF 0x00000000 + mask_write 0XF80062B0 0x003FFFFF 0x00005125 + mask_write 0XF80062B4 0x0003FFFF 0x000012A8 + mask_poll 0XF8000B74 0x00002000 + mask_write 0XF8006000 0x0001FFFF 0x00000081 + mask_poll 0XF8006054 0x00000007 +} +proc ps7_mio_init_data_3_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000B00 0x00000071 0x00000001 + mask_write 0XF8000B40 0x00000FFF 0x00000600 + mask_write 0XF8000B44 0x00000FFF 0x00000600 + mask_write 0XF8000B48 0x00000FFF 0x00000672 + mask_write 0XF8000B4C 0x00000FFF 0x00000672 + mask_write 0XF8000B50 0x00000FFF 0x00000674 + mask_write 0XF8000B54 0x00000FFF 0x00000674 + mask_write 0XF8000B58 0x00000FFF 0x00000600 + mask_write 0XF8000B5C 0xFFFFFFFF 0x0018C61C + mask_write 0XF8000B60 0xFFFFFFFF 0x00F9861C + mask_write 0XF8000B64 0xFFFFFFFF 0x00F9861C + mask_write 0XF8000B68 0xFFFFFFFF 0x00F9861C + mask_write 0XF8000B6C 0x00007FFF 0x00000209 + mask_write 0XF8000B70 0x00000001 0x00000001 + mask_write 0XF8000B70 0x00000021 0x00000020 + mask_write 0XF8000B70 0x07FEFFFF 0x00000823 + mask_write 0XF8000700 0x00003F01 0x00001201 + mask_write 0XF8000704 0x00003FFF 0x00001202 + mask_write 0XF8000708 0x00003FFF 0x00000202 + mask_write 0XF800070C 0x00003FFF 0x00000202 + mask_write 0XF8000710 0x00003FFF 0x00000202 + mask_write 0XF8000714 0x00003FFF 0x00000202 + mask_write 0XF8000718 0x00003FFF 0x00000202 + mask_write 0XF800071C 0x00003FFF 0x00000200 + mask_write 0XF8000720 0x00003FFF 0x00000202 + mask_write 0XF8000724 0x00003FFF 0x00001200 + mask_write 0XF8000728 0x00003FFF 0x00001200 + mask_write 0XF800072C 0x00003FFF 0x00001200 + mask_write 0XF8000730 0x00003FFF 0x00001200 + mask_write 0XF8000734 0x00003FFF 0x00001200 + mask_write 0XF8000738 0x00003FFF 0x00001200 + mask_write 0XF800073C 0x00003F01 0x00001201 + mask_write 0XF8000740 0x00003FFF 0x00002802 + mask_write 0XF8000744 0x00003FFF 0x00002802 + mask_write 0XF8000748 0x00003FFF 0x00002802 + mask_write 0XF800074C 0x00003FFF 0x00002802 + mask_write 0XF8000750 0x00003FFF 0x00002802 + mask_write 0XF8000754 0x00003FFF 0x00002802 + mask_write 0XF8000758 0x00003FFF 0x00000803 + mask_write 0XF800075C 0x00003FFF 0x00000803 + mask_write 0XF8000760 0x00003FFF 0x00000803 + mask_write 0XF8000764 0x00003FFF 0x00000803 + mask_write 0XF8000768 0x00003FFF 0x00000803 + mask_write 0XF800076C 0x00003FFF 0x00000803 + mask_write 0XF8000770 0x00003FFF 0x00000204 + mask_write 0XF8000774 0x00003FFF 0x00000205 + mask_write 0XF8000778 0x00003FFF 0x00000204 + mask_write 0XF800077C 0x00003FFF 0x00000205 + mask_write 0XF8000780 0x00003FFF 0x00000204 + mask_write 0XF8000784 0x00003FFF 0x00000204 + mask_write 0XF8000788 0x00003FFF 0x00000204 + mask_write 0XF800078C 0x00003FFF 0x00000204 + mask_write 0XF8000790 0x00003FFF 0x00000205 + mask_write 0XF8000794 0x00003FFF 0x00000204 + mask_write 0XF8000798 0x00003FFF 0x00000204 + mask_write 0XF800079C 0x00003FFF 0x00000204 + mask_write 0XF80007A0 0x00003FFF 0x00000280 + mask_write 0XF80007A4 0x00003FFF 0x00000280 + mask_write 0XF80007A8 0x00003FFF 0x00000280 + mask_write 0XF80007AC 0x00003FFF 0x00000280 + mask_write 0XF80007B0 0x00003FFF 0x00000280 + mask_write 0XF80007B4 0x00003FFF 0x00000280 + mask_write 0XF80007B8 0x00003FFF 0x00001221 + mask_write 0XF80007BC 0x00003FFF 0x00001220 + mask_write 0XF80007C0 0x00003FFF 0x000002E0 + mask_write 0XF80007C4 0x00003FFF 0x000002E1 + mask_write 0XF80007C8 0x00003FFF 0x00001240 + mask_write 0XF80007CC 0x00003FFF 0x00001240 + mask_write 0XF80007D0 0x00003FFF 0x00000280 + mask_write 0XF80007D4 0x00003FFF 0x00000280 + mask_write 0XF8000830 0x003F003F 0x0000000F + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_peripherals_init_data_3_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000B48 0x00000180 0x00000180 + mask_write 0XF8000B4C 0x00000180 0x00000180 + mask_write 0XF8000B50 0x00000180 0x00000180 + mask_write 0XF8000B54 0x00000180 0x00000180 + mask_write 0XF8000004 0x0000FFFF 0x0000767B + mask_write 0XE0001034 0x000000FF 0x00000006 + mask_write 0XE0001018 0x0000FFFF 0x0000003E + mask_write 0XE0001000 0x000001FF 0x00000017 + mask_write 0XE0001004 0x000003FF 0x00000020 + mask_write 0XE000D000 0x00080000 0x00080000 + mask_write 0XF8007000 0x20000000 0x00000000 + mask_write 0XE000A204 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_write 0XE000A208 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_delay 0XF8F00200 1 + mask_write 0XE000A204 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xF7FF0800 + mask_write 0XE000A208 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xF7FF0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xF7FF0800 + mask_delay 0XF8F00200 1 + mask_write 0XE000A204 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xDFFF2000 + mask_write 0XE000A208 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xDFFF0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xDFFF2000 + mask_delay 0XF8F00200 1 +} +proc ps7_post_config_3_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000900 0x0000000F 0x0000000F + mask_write 0XF8000240 0xFFFFFFFF 0x00000000 + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_debug_3_0 {} { + mask_write 0XF8898FB0 0xFFFFFFFF 0xC5ACCE55 + mask_write 0XF8899FB0 0xFFFFFFFF 0xC5ACCE55 + mask_write 0XF8809FB0 0xFFFFFFFF 0xC5ACCE55 +} +proc ps7_pll_init_data_2_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000110 0x003FFFF0 0x000FA220 + mask_write 0XF8000100 0x0007F000 0x00028000 + mask_write 0XF8000100 0x00000010 0x00000010 + mask_write 0XF8000100 0x00000001 0x00000001 + mask_write 0XF8000100 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000001 + mask_write 0XF8000100 0x00000010 0x00000000 + mask_write 0XF8000120 0x1F003F30 0x1F000200 + mask_write 0XF8000114 0x003FFFF0 0x0012C220 + mask_write 0XF8000104 0x0007F000 0x00020000 + mask_write 0XF8000104 0x00000010 0x00000010 + mask_write 0XF8000104 0x00000001 0x00000001 + mask_write 0XF8000104 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000002 + mask_write 0XF8000104 0x00000010 0x00000000 + mask_write 0XF8000124 0xFFF00003 0x0C200003 + mask_write 0XF8000118 0x003FFFF0 0x001452C0 + mask_write 0XF8000108 0x0007F000 0x0001E000 + mask_write 0XF8000108 0x00000010 0x00000010 + mask_write 0XF8000108 0x00000001 0x00000001 + mask_write 0XF8000108 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000004 + mask_write 0XF8000108 0x00000010 0x00000000 + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_clock_init_data_2_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000128 0x03F03F01 0x00700F01 + mask_write 0XF8000138 0x00000011 0x00000001 + mask_write 0XF8000140 0x03F03F71 0x00500801 + mask_write 0XF800014C 0x00003F31 0x00000501 + mask_write 0XF8000150 0x00003F33 0x00001401 + mask_write 0XF8000154 0x00003F33 0x00001402 + mask_write 0XF800015C 0x03F03F33 0x00600701 + mask_write 0XF8000160 0x007F007F 0x00000000 + mask_write 0XF8000168 0x00003F31 0x00000501 + mask_write 0XF8000170 0x03F03F30 0x00400500 + mask_write 0XF80001C4 0x00000001 0x00000001 + mask_write 0XF800012C 0x01FFCCCD 0x01ED044D + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_ddr_init_data_2_0 {} { + mask_write 0XF8006000 0x0001FFFF 0x00000080 + mask_write 0XF8006004 0x1FFFFFFF 0x00081081 + mask_write 0XF8006008 0x03FFFFFF 0x03C0780F + mask_write 0XF800600C 0x03FFFFFF 0x02001001 + mask_write 0XF8006010 0x03FFFFFF 0x00014001 + mask_write 0XF8006014 0x001FFFFF 0x0004159B + mask_write 0XF8006018 0xF7FFFFFF 0x452440D2 + mask_write 0XF800601C 0xFFFFFFFF 0x720238E5 + mask_write 0XF8006020 0xFFFFFFFC 0x27287290 + mask_write 0XF8006024 0x0FFFFFFF 0x0000003C + mask_write 0XF8006028 0x00003FFF 0x00002007 + mask_write 0XF800602C 0xFFFFFFFF 0x00000008 + mask_write 0XF8006030 0xFFFFFFFF 0x00040930 + mask_write 0XF8006034 0x13FF3FFF 0x000116D4 + mask_write 0XF8006038 0x00001FC3 0x00000000 + mask_write 0XF800603C 0x000FFFFF 0x00000777 + mask_write 0XF8006040 0xFFFFFFFF 0xFFF00000 + mask_write 0XF8006044 0x0FFFFFFF 0x0F666666 + mask_write 0XF8006048 0x3FFFFFFF 0x0003C248 + mask_write 0XF8006050 0xFF0F8FFF 0x77010800 + mask_write 0XF8006058 0x0001FFFF 0x00000101 + mask_write 0XF800605C 0x0000FFFF 0x00005003 + mask_write 0XF8006060 0x000017FF 0x0000003E + mask_write 0XF8006064 0x00021FE0 0x00020000 + mask_write 0XF8006068 0x03FFFFFF 0x00284141 + mask_write 0XF800606C 0x0000FFFF 0x00001610 + mask_write 0XF8006078 0x03FFFFFF 0x00466111 + mask_write 0XF800607C 0x000FFFFF 0x00032222 + mask_write 0XF80060A0 0x00FFFFFF 0x00008000 + mask_write 0XF80060A4 0xFFFFFFFF 0x10200802 + mask_write 0XF80060A8 0x0FFFFFFF 0x0690CB73 + mask_write 0XF80060AC 0x000001FF 0x000001FE + mask_write 0XF80060B0 0x1FFFFFFF 0x1CFFFFFF + mask_write 0XF80060B4 0x000007FF 0x00000200 + mask_write 0XF80060B8 0x01FFFFFF 0x00200066 + mask_write 0XF80060C4 0x00000003 0x00000000 + mask_write 0XF80060C8 0x000000FF 0x00000000 + mask_write 0XF80060DC 0x00000001 0x00000000 + mask_write 0XF80060F0 0x0000FFFF 0x00000000 + mask_write 0XF80060F4 0x0000000F 0x00000008 + mask_write 0XF8006114 0x000000FF 0x00000000 + mask_write 0XF8006118 0x7FFFFFFF 0x40000001 + mask_write 0XF800611C 0x7FFFFFFF 0x40000001 + mask_write 0XF8006120 0x7FFFFFFF 0x40000001 + mask_write 0XF8006124 0x7FFFFFFF 0x40000001 + mask_write 0XF800612C 0x000FFFFF 0x0003C81D + mask_write 0XF8006130 0x000FFFFF 0x00036012 + mask_write 0XF8006134 0x000FFFFF 0x0003780C + mask_write 0XF8006138 0x000FFFFF 0x0003B821 + mask_write 0XF8006140 0x000FFFFF 0x00000035 + mask_write 0XF8006144 0x000FFFFF 0x00000035 + mask_write 0XF8006148 0x000FFFFF 0x00000035 + mask_write 0XF800614C 0x000FFFFF 0x00000035 + mask_write 0XF8006154 0x000FFFFF 0x0000009D + mask_write 0XF8006158 0x000FFFFF 0x00000092 + mask_write 0XF800615C 0x000FFFFF 0x0000008C + mask_write 0XF8006160 0x000FFFFF 0x000000A1 + mask_write 0XF8006168 0x001FFFFF 0x00000147 + mask_write 0XF800616C 0x001FFFFF 0x0000012D + mask_write 0XF8006170 0x001FFFFF 0x00000133 + mask_write 0XF8006174 0x001FFFFF 0x00000143 + mask_write 0XF800617C 0x000FFFFF 0x000000DD + mask_write 0XF8006180 0x000FFFFF 0x000000D2 + mask_write 0XF8006184 0x000FFFFF 0x000000CC + mask_write 0XF8006188 0x000FFFFF 0x000000E1 + mask_write 0XF8006190 0xFFFFFFFF 0x10040080 + mask_write 0XF8006194 0x000FFFFF 0x0001FC82 + mask_write 0XF8006204 0xFFFFFFFF 0x00000000 + mask_write 0XF8006208 0x000F03FF 0x000803FF + mask_write 0XF800620C 0x000F03FF 0x000803FF + mask_write 0XF8006210 0x000F03FF 0x000803FF + mask_write 0XF8006214 0x000F03FF 0x000803FF + mask_write 0XF8006218 0x000F03FF 0x000003FF + mask_write 0XF800621C 0x000F03FF 0x000003FF + mask_write 0XF8006220 0x000F03FF 0x000003FF + mask_write 0XF8006224 0x000F03FF 0x000003FF + mask_write 0XF80062A8 0x00000FF7 0x00000000 + mask_write 0XF80062AC 0xFFFFFFFF 0x00000000 + mask_write 0XF80062B0 0x003FFFFF 0x00005125 + mask_write 0XF80062B4 0x0003FFFF 0x000012A8 + mask_poll 0XF8000B74 0x00002000 + mask_write 0XF8006000 0x0001FFFF 0x00000081 + mask_poll 0XF8006054 0x00000007 +} +proc ps7_mio_init_data_2_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000B00 0x00000303 0x00000001 + mask_write 0XF8000B40 0x00000FFF 0x00000600 + mask_write 0XF8000B44 0x00000FFF 0x00000600 + mask_write 0XF8000B48 0x00000FFF 0x00000672 + mask_write 0XF8000B4C 0x00000FFF 0x00000672 + mask_write 0XF8000B50 0x00000FFF 0x00000674 + mask_write 0XF8000B54 0x00000FFF 0x00000674 + mask_write 0XF8000B58 0x00000FFF 0x00000600 + mask_write 0XF8000B5C 0xFFFFFFFF 0x0018C61C + mask_write 0XF8000B60 0xFFFFFFFF 0x00F9861C + mask_write 0XF8000B64 0xFFFFFFFF 0x00F9861C + mask_write 0XF8000B68 0xFFFFFFFF 0x00F9861C + mask_write 0XF8000B6C 0x00007FFF 0x00000209 + mask_write 0XF8000B70 0x00000021 0x00000021 + mask_write 0XF8000B70 0x00000021 0x00000020 + mask_write 0XF8000B70 0x07FFFFFF 0x00000823 + mask_write 0XF8000700 0x00003F01 0x00001201 + mask_write 0XF8000704 0x00003FFF 0x00001202 + mask_write 0XF8000708 0x00003FFF 0x00000202 + mask_write 0XF800070C 0x00003FFF 0x00000202 + mask_write 0XF8000710 0x00003FFF 0x00000202 + mask_write 0XF8000714 0x00003FFF 0x00000202 + mask_write 0XF8000718 0x00003FFF 0x00000202 + mask_write 0XF800071C 0x00003FFF 0x00000200 + mask_write 0XF8000720 0x00003FFF 0x00000202 + mask_write 0XF8000724 0x00003FFF 0x00001200 + mask_write 0XF8000728 0x00003FFF 0x00001200 + mask_write 0XF800072C 0x00003FFF 0x00001200 + mask_write 0XF8000730 0x00003FFF 0x00001200 + mask_write 0XF8000734 0x00003FFF 0x00001200 + mask_write 0XF8000738 0x00003FFF 0x00001200 + mask_write 0XF800073C 0x00003F01 0x00001201 + mask_write 0XF8000740 0x00003FFF 0x00002802 + mask_write 0XF8000744 0x00003FFF 0x00002802 + mask_write 0XF8000748 0x00003FFF 0x00002802 + mask_write 0XF800074C 0x00003FFF 0x00002802 + mask_write 0XF8000750 0x00003FFF 0x00002802 + mask_write 0XF8000754 0x00003FFF 0x00002802 + mask_write 0XF8000758 0x00003FFF 0x00000803 + mask_write 0XF800075C 0x00003FFF 0x00000803 + mask_write 0XF8000760 0x00003FFF 0x00000803 + mask_write 0XF8000764 0x00003FFF 0x00000803 + mask_write 0XF8000768 0x00003FFF 0x00000803 + mask_write 0XF800076C 0x00003FFF 0x00000803 + mask_write 0XF8000770 0x00003FFF 0x00000204 + mask_write 0XF8000774 0x00003FFF 0x00000205 + mask_write 0XF8000778 0x00003FFF 0x00000204 + mask_write 0XF800077C 0x00003FFF 0x00000205 + mask_write 0XF8000780 0x00003FFF 0x00000204 + mask_write 0XF8000784 0x00003FFF 0x00000204 + mask_write 0XF8000788 0x00003FFF 0x00000204 + mask_write 0XF800078C 0x00003FFF 0x00000204 + mask_write 0XF8000790 0x00003FFF 0x00000205 + mask_write 0XF8000794 0x00003FFF 0x00000204 + mask_write 0XF8000798 0x00003FFF 0x00000204 + mask_write 0XF800079C 0x00003FFF 0x00000204 + mask_write 0XF80007A0 0x00003FFF 0x00000280 + mask_write 0XF80007A4 0x00003FFF 0x00000280 + mask_write 0XF80007A8 0x00003FFF 0x00000280 + mask_write 0XF80007AC 0x00003FFF 0x00000280 + mask_write 0XF80007B0 0x00003FFF 0x00000280 + mask_write 0XF80007B4 0x00003FFF 0x00000280 + mask_write 0XF80007B8 0x00003FFF 0x00001221 + mask_write 0XF80007BC 0x00003FFF 0x00001220 + mask_write 0XF80007C0 0x00003FFF 0x000002E0 + mask_write 0XF80007C4 0x00003FFF 0x000002E1 + mask_write 0XF80007C8 0x00003FFF 0x00001240 + mask_write 0XF80007CC 0x00003FFF 0x00001240 + mask_write 0XF80007D0 0x00003FFF 0x00000280 + mask_write 0XF80007D4 0x00003FFF 0x00000280 + mask_write 0XF8000830 0x003F003F 0x0000000F + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_peripherals_init_data_2_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000B48 0x00000180 0x00000180 + mask_write 0XF8000B4C 0x00000180 0x00000180 + mask_write 0XF8000B50 0x00000180 0x00000180 + mask_write 0XF8000B54 0x00000180 0x00000180 + mask_write 0XF8000004 0x0000FFFF 0x0000767B + mask_write 0XE0001034 0x000000FF 0x00000006 + mask_write 0XE0001018 0x0000FFFF 0x0000003E + mask_write 0XE0001000 0x000001FF 0x00000017 + mask_write 0XE0001004 0x00000FFF 0x00000020 + mask_write 0XE000D000 0x00080000 0x00080000 + mask_write 0XF8007000 0x20000000 0x00000000 + mask_write 0XE000A204 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_write 0XE000A208 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_delay 0XF8F00200 1 + mask_write 0XE000A204 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xF7FF0800 + mask_write 0XE000A208 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xF7FF0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xF7FF0800 + mask_delay 0XF8F00200 1 + mask_write 0XE000A204 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xDFFF2000 + mask_write 0XE000A208 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xDFFF0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xDFFF2000 + mask_delay 0XF8F00200 1 +} +proc ps7_post_config_2_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000900 0x0000000F 0x0000000F + mask_write 0XF8000240 0xFFFFFFFF 0x00000000 + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_debug_2_0 {} { + mask_write 0XF8898FB0 0xFFFFFFFF 0xC5ACCE55 + mask_write 0XF8899FB0 0xFFFFFFFF 0xC5ACCE55 + mask_write 0XF8809FB0 0xFFFFFFFF 0xC5ACCE55 +} +proc ps7_pll_init_data_1_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000110 0x003FFFF0 0x000FA220 + mask_write 0XF8000100 0x0007F000 0x00028000 + mask_write 0XF8000100 0x00000010 0x00000010 + mask_write 0XF8000100 0x00000001 0x00000001 + mask_write 0XF8000100 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000001 + mask_write 0XF8000100 0x00000010 0x00000000 + mask_write 0XF8000120 0x1F003F30 0x1F000200 + mask_write 0XF8000114 0x003FFFF0 0x0012C220 + mask_write 0XF8000104 0x0007F000 0x00020000 + mask_write 0XF8000104 0x00000010 0x00000010 + mask_write 0XF8000104 0x00000001 0x00000001 + mask_write 0XF8000104 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000002 + mask_write 0XF8000104 0x00000010 0x00000000 + mask_write 0XF8000124 0xFFF00003 0x0C200003 + mask_write 0XF8000118 0x003FFFF0 0x001452C0 + mask_write 0XF8000108 0x0007F000 0x0001E000 + mask_write 0XF8000108 0x00000010 0x00000010 + mask_write 0XF8000108 0x00000001 0x00000001 + mask_write 0XF8000108 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000004 + mask_write 0XF8000108 0x00000010 0x00000000 + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_clock_init_data_1_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000128 0x03F03F01 0x00700F01 + mask_write 0XF8000138 0x00000011 0x00000001 + mask_write 0XF8000140 0x03F03F71 0x00500801 + mask_write 0XF800014C 0x00003F31 0x00000501 + mask_write 0XF8000150 0x00003F33 0x00001401 + mask_write 0XF8000154 0x00003F33 0x00001402 + mask_write 0XF800015C 0x03F03F33 0x00600701 + mask_write 0XF8000160 0x007F007F 0x00000000 + mask_write 0XF8000168 0x00003F31 0x00000501 + mask_write 0XF8000170 0x03F03F30 0x00400500 + mask_write 0XF80001C4 0x00000001 0x00000001 + mask_write 0XF800012C 0x01FFCCCD 0x01ED044D + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_ddr_init_data_1_0 {} { + mask_write 0XF8006000 0x0001FFFF 0x00000080 + mask_write 0XF8006004 0x1FFFFFFF 0x00081081 + mask_write 0XF8006008 0x03FFFFFF 0x03C0780F + mask_write 0XF800600C 0x03FFFFFF 0x02001001 + mask_write 0XF8006010 0x03FFFFFF 0x00014001 + mask_write 0XF8006014 0x001FFFFF 0x0004159B + mask_write 0XF8006018 0xF7FFFFFF 0x452440D2 + mask_write 0XF800601C 0xFFFFFFFF 0x720238E5 + mask_write 0XF8006020 0xFFFFFFFC 0x27287290 + mask_write 0XF8006024 0x0FFFFFFF 0x0000003C + mask_write 0XF8006028 0x00003FFF 0x00002007 + mask_write 0XF800602C 0xFFFFFFFF 0x00000008 + mask_write 0XF8006030 0xFFFFFFFF 0x00040930 + mask_write 0XF8006034 0x13FF3FFF 0x000116D4 + mask_write 0XF8006038 0x00001FC3 0x00000000 + mask_write 0XF800603C 0x000FFFFF 0x00000777 + mask_write 0XF8006040 0xFFFFFFFF 0xFFF00000 + mask_write 0XF8006044 0x0FFFFFFF 0x0F666666 + mask_write 0XF8006048 0x3FFFFFFF 0x0003C248 + mask_write 0XF8006050 0xFF0F8FFF 0x77010800 + mask_write 0XF8006058 0x0001FFFF 0x00000101 + mask_write 0XF800605C 0x0000FFFF 0x00005003 + mask_write 0XF8006060 0x000017FF 0x0000003E + mask_write 0XF8006064 0x00021FE0 0x00020000 + mask_write 0XF8006068 0x03FFFFFF 0x00284141 + mask_write 0XF800606C 0x0000FFFF 0x00001610 + mask_write 0XF80060A0 0x00FFFFFF 0x00008000 + mask_write 0XF80060A4 0xFFFFFFFF 0x10200802 + mask_write 0XF80060A8 0x0FFFFFFF 0x0690CB73 + mask_write 0XF80060AC 0x000001FF 0x000001FE + mask_write 0XF80060B0 0x1FFFFFFF 0x1CFFFFFF + mask_write 0XF80060B4 0x000007FF 0x00000200 + mask_write 0XF80060B8 0x01FFFFFF 0x00200066 + mask_write 0XF80060C4 0x00000003 0x00000000 + mask_write 0XF80060C8 0x000000FF 0x00000000 + mask_write 0XF80060DC 0x00000001 0x00000000 + mask_write 0XF80060F0 0x0000FFFF 0x00000000 + mask_write 0XF80060F4 0x0000000F 0x00000008 + mask_write 0XF8006114 0x000000FF 0x00000000 + mask_write 0XF8006118 0x7FFFFFFF 0x40000001 + mask_write 0XF800611C 0x7FFFFFFF 0x40000001 + mask_write 0XF8006120 0x7FFFFFFF 0x40000001 + mask_write 0XF8006124 0x7FFFFFFF 0x40000001 + mask_write 0XF800612C 0x000FFFFF 0x0003C81D + mask_write 0XF8006130 0x000FFFFF 0x00036012 + mask_write 0XF8006134 0x000FFFFF 0x0003780C + mask_write 0XF8006138 0x000FFFFF 0x0003B821 + mask_write 0XF8006140 0x000FFFFF 0x00000035 + mask_write 0XF8006144 0x000FFFFF 0x00000035 + mask_write 0XF8006148 0x000FFFFF 0x00000035 + mask_write 0XF800614C 0x000FFFFF 0x00000035 + mask_write 0XF8006154 0x000FFFFF 0x0000009D + mask_write 0XF8006158 0x000FFFFF 0x00000092 + mask_write 0XF800615C 0x000FFFFF 0x0000008C + mask_write 0XF8006160 0x000FFFFF 0x000000A1 + mask_write 0XF8006168 0x001FFFFF 0x00000147 + mask_write 0XF800616C 0x001FFFFF 0x0000012D + mask_write 0XF8006170 0x001FFFFF 0x00000133 + mask_write 0XF8006174 0x001FFFFF 0x00000143 + mask_write 0XF800617C 0x000FFFFF 0x000000DD + mask_write 0XF8006180 0x000FFFFF 0x000000D2 + mask_write 0XF8006184 0x000FFFFF 0x000000CC + mask_write 0XF8006188 0x000FFFFF 0x000000E1 + mask_write 0XF8006190 0xFFFFFFFF 0x10040080 + mask_write 0XF8006194 0x000FFFFF 0x0001FC82 + mask_write 0XF8006204 0xFFFFFFFF 0x00000000 + mask_write 0XF8006208 0x000F03FF 0x000803FF + mask_write 0XF800620C 0x000F03FF 0x000803FF + mask_write 0XF8006210 0x000F03FF 0x000803FF + mask_write 0XF8006214 0x000F03FF 0x000803FF + mask_write 0XF8006218 0x000F03FF 0x000003FF + mask_write 0XF800621C 0x000F03FF 0x000003FF + mask_write 0XF8006220 0x000F03FF 0x000003FF + mask_write 0XF8006224 0x000F03FF 0x000003FF + mask_write 0XF80062A8 0x00000FF7 0x00000000 + mask_write 0XF80062AC 0xFFFFFFFF 0x00000000 + mask_write 0XF80062B0 0x003FFFFF 0x00005125 + mask_write 0XF80062B4 0x0003FFFF 0x000012A8 + mask_poll 0XF8000B74 0x00002000 + mask_write 0XF8006000 0x0001FFFF 0x00000081 + mask_poll 0XF8006054 0x00000007 +} +proc ps7_mio_init_data_1_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000B00 0x00000303 0x00000001 + mask_write 0XF8000B40 0x00000FFF 0x00000600 + mask_write 0XF8000B44 0x00000FFF 0x00000600 + mask_write 0XF8000B48 0x00000FFF 0x00000672 + mask_write 0XF8000B4C 0x00000FFF 0x00000672 + mask_write 0XF8000B50 0x00000FFF 0x00000674 + mask_write 0XF8000B54 0x00000FFF 0x00000674 + mask_write 0XF8000B58 0x00000FFF 0x00000600 + mask_write 0XF8000B5C 0xFFFFFFFF 0x0018C61C + mask_write 0XF8000B60 0xFFFFFFFF 0x00F9861C + mask_write 0XF8000B64 0xFFFFFFFF 0x00F9861C + mask_write 0XF8000B68 0xFFFFFFFF 0x00F9861C + mask_write 0XF8000B6C 0x000073FF 0x00000209 + mask_write 0XF8000B70 0x00000021 0x00000021 + mask_write 0XF8000B70 0x00000021 0x00000020 + mask_write 0XF8000B70 0x07FFFFFF 0x00000823 + mask_write 0XF8000700 0x00003F01 0x00001201 + mask_write 0XF8000704 0x00003FFF 0x00001202 + mask_write 0XF8000708 0x00003FFF 0x00000202 + mask_write 0XF800070C 0x00003FFF 0x00000202 + mask_write 0XF8000710 0x00003FFF 0x00000202 + mask_write 0XF8000714 0x00003FFF 0x00000202 + mask_write 0XF8000718 0x00003FFF 0x00000202 + mask_write 0XF800071C 0x00003FFF 0x00000200 + mask_write 0XF8000720 0x00003FFF 0x00000202 + mask_write 0XF8000724 0x00003FFF 0x00001200 + mask_write 0XF8000728 0x00003FFF 0x00001200 + mask_write 0XF800072C 0x00003FFF 0x00001200 + mask_write 0XF8000730 0x00003FFF 0x00001200 + mask_write 0XF8000734 0x00003FFF 0x00001200 + mask_write 0XF8000738 0x00003FFF 0x00001200 + mask_write 0XF800073C 0x00003F01 0x00001201 + mask_write 0XF8000740 0x00003FFF 0x00002802 + mask_write 0XF8000744 0x00003FFF 0x00002802 + mask_write 0XF8000748 0x00003FFF 0x00002802 + mask_write 0XF800074C 0x00003FFF 0x00002802 + mask_write 0XF8000750 0x00003FFF 0x00002802 + mask_write 0XF8000754 0x00003FFF 0x00002802 + mask_write 0XF8000758 0x00003FFF 0x00000803 + mask_write 0XF800075C 0x00003FFF 0x00000803 + mask_write 0XF8000760 0x00003FFF 0x00000803 + mask_write 0XF8000764 0x00003FFF 0x00000803 + mask_write 0XF8000768 0x00003FFF 0x00000803 + mask_write 0XF800076C 0x00003FFF 0x00000803 + mask_write 0XF8000770 0x00003FFF 0x00000204 + mask_write 0XF8000774 0x00003FFF 0x00000205 + mask_write 0XF8000778 0x00003FFF 0x00000204 + mask_write 0XF800077C 0x00003FFF 0x00000205 + mask_write 0XF8000780 0x00003FFF 0x00000204 + mask_write 0XF8000784 0x00003FFF 0x00000204 + mask_write 0XF8000788 0x00003FFF 0x00000204 + mask_write 0XF800078C 0x00003FFF 0x00000204 + mask_write 0XF8000790 0x00003FFF 0x00000205 + mask_write 0XF8000794 0x00003FFF 0x00000204 + mask_write 0XF8000798 0x00003FFF 0x00000204 + mask_write 0XF800079C 0x00003FFF 0x00000204 + mask_write 0XF80007A0 0x00003FFF 0x00000280 + mask_write 0XF80007A4 0x00003FFF 0x00000280 + mask_write 0XF80007A8 0x00003FFF 0x00000280 + mask_write 0XF80007AC 0x00003FFF 0x00000280 + mask_write 0XF80007B0 0x00003FFF 0x00000280 + mask_write 0XF80007B4 0x00003FFF 0x00000280 + mask_write 0XF80007B8 0x00003FFF 0x00001221 + mask_write 0XF80007BC 0x00003FFF 0x00001220 + mask_write 0XF80007C0 0x00003FFF 0x000002E0 + mask_write 0XF80007C4 0x00003FFF 0x000002E1 + mask_write 0XF80007C8 0x00003FFF 0x00001240 + mask_write 0XF80007CC 0x00003FFF 0x00001240 + mask_write 0XF80007D0 0x00003FFF 0x00000280 + mask_write 0XF80007D4 0x00003FFF 0x00000280 + mask_write 0XF8000830 0x003F003F 0x0000000F + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_peripherals_init_data_1_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000B48 0x00000180 0x00000180 + mask_write 0XF8000B4C 0x00000180 0x00000180 + mask_write 0XF8000B50 0x00000180 0x00000180 + mask_write 0XF8000B54 0x00000180 0x00000180 + mask_write 0XF8000004 0x0000FFFF 0x0000767B + mask_write 0XE0001034 0x000000FF 0x00000006 + mask_write 0XE0001018 0x0000FFFF 0x0000003E + mask_write 0XE0001000 0x000001FF 0x00000017 + mask_write 0XE0001004 0x00000FFF 0x00000020 + mask_write 0XE000D000 0x00080000 0x00080000 + mask_write 0XF8007000 0x20000000 0x00000000 + mask_write 0XE000A204 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_write 0XE000A208 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_delay 0XF8F00200 1 + mask_write 0XE000A204 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xF7FF0800 + mask_write 0XE000A208 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xF7FF0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xF7FF0800 + mask_delay 0XF8F00200 1 + mask_write 0XE000A204 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xDFFF2000 + mask_write 0XE000A208 0xFFFFFFFF 0x00002880 + mask_write 0XE000A000 0xFFFFFFFF 0xDFFF0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xDFFF2000 + mask_delay 0XF8F00200 1 +} +proc ps7_post_config_1_0 {} { + mask_write 0XF8000008 0x0000FFFF 0x0000DF0D + mask_write 0XF8000900 0x0000000F 0x0000000F + mask_write 0XF8000240 0xFFFFFFFF 0x00000000 + mask_write 0XF8000004 0x0000FFFF 0x0000767B +} +proc ps7_debug_1_0 {} { + mask_write 0XF8898FB0 0xFFFFFFFF 0xC5ACCE55 + mask_write 0XF8899FB0 0xFFFFFFFF 0xC5ACCE55 + mask_write 0XF8809FB0 0xFFFFFFFF 0xC5ACCE55 +} +set PCW_SILICON_VER_1_0 "0x0" +set PCW_SILICON_VER_2_0 "0x1" +set PCW_SILICON_VER_3_0 "0x2" +set APU_FREQ 666666666 + + + +proc mask_poll { addr mask } { + set count 1 + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval & $mask}] + while { $maskedval == 0 } { + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval & $mask}] + set count [ expr { $count + 1 } ] + if { $count == 100000000 } { + puts "Timeout Reached. Mask poll failed at ADDRESS: $addr MASK: $mask" + break + } + } +} + + + +proc mask_delay { addr val } { + set delay [ get_number_of_cycles_for_delay $val ] + perf_reset_and_start_timer + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval < $delay}] + while { $maskedval == 1 } { + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval < $delay}] + } + perf_reset_clock +} + +proc ps_version { } { + set si_ver "0x[string range [mrd 0xF8007080] end-8 end]" + set mask_sil_ver "0x[expr {$si_ver >> 28}]" + return $mask_sil_ver; +} + +proc ps7_post_config {} { + variable PCW_SILICON_VER_1_0 + variable PCW_SILICON_VER_2_0 + variable PCW_SILICON_VER_3_0 + set sil_ver [ps_version] + + if { $sil_ver == $PCW_SILICON_VER_1_0} { + ps7_post_config_1_0 + } elseif { $sil_ver == $PCW_SILICON_VER_2_0 } { + ps7_post_config_2_0 + } else { + ps7_post_config_3_0 + } +} + +proc ps7_debug {} { + variable PCW_SILICON_VER_1_0 + variable PCW_SILICON_VER_2_0 + variable PCW_SILICON_VER_3_0 + set sil_ver [ps_version] + + if { $sil_ver == $PCW_SILICON_VER_1_0} { + ps7_debug_1_0 + } elseif { $sil_ver == $PCW_SILICON_VER_2_0 } { + ps7_debug_2_0 + } else { + ps7_debug_3_0 + } +} +proc ps7_init {} { + variable PCW_SILICON_VER_1_0 + variable PCW_SILICON_VER_2_0 + variable PCW_SILICON_VER_3_0 + set sil_ver [ps_version] + if { $sil_ver == $PCW_SILICON_VER_1_0} { + ps7_mio_init_data_1_0 + ps7_pll_init_data_1_0 + ps7_clock_init_data_1_0 + ps7_ddr_init_data_1_0 + ps7_peripherals_init_data_1_0 + #puts "PCW Silicon Version : 1.0" + } elseif { $sil_ver == $PCW_SILICON_VER_2_0 } { + ps7_mio_init_data_2_0 + ps7_pll_init_data_2_0 + ps7_clock_init_data_2_0 + ps7_ddr_init_data_2_0 + ps7_peripherals_init_data_2_0 + #puts "PCW Silicon Version : 2.0" + } else { + ps7_mio_init_data_3_0 + ps7_pll_init_data_3_0 + ps7_clock_init_data_3_0 + ps7_ddr_init_data_3_0 + ps7_peripherals_init_data_3_0 + #puts "PCW Silicon Version : 3.0" + } +} + + +# For delay calculation using global timer + +# start timer + proc perf_start_clock { } { + + #writing SCU_GLOBAL_TIMER_CONTROL register + + mask_write 0xF8F00208 0x00000109 0x00000009 +} + +# stop timer and reset timer count regs + proc perf_reset_clock { } { + perf_disable_clock + mask_write 0xF8F00200 0xFFFFFFFF 0x00000000 + mask_write 0xF8F00204 0xFFFFFFFF 0x00000000 +} + +# Compute mask for given delay in miliseconds +proc get_number_of_cycles_for_delay { delay } { + + # GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + variable APU_FREQ + return [ expr ($delay * $APU_FREQ /(2 * 1000))] +} + + +# stop timer +proc perf_disable_clock {} { + mask_write 0xF8F00208 0xFFFFFFFF 0x00000000 +} + +proc perf_reset_and_start_timer {} { + perf_reset_clock + perf_start_clock +} + + diff --git a/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init_gpl.c b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init_gpl.c new file mode 100644 index 0000000..2000dd4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init_gpl.c @@ -0,0 +1,13197 @@ +/****************************************************************************** +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along +* with this program; if not, see +* +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file ps7_init_gpl.c +* +* This file is automatically generated +* +*****************************************************************************/ + +#include "ps7_init_gpl.h" + +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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x7 + // .. ==> 0XF800015C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. DIVISOR1 = 0x6 + // .. ==> 0XF800015C[25:20] = 0x00000006U + // .. ==> MASK : 0x03F00000U VAL : 0x00600000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00600701U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00001081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27087290U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 + // .. .. reserved_reg_ddrc_rank0_wr_odt = 0x1 + // .. .. ==> 0XF8006048[5:3] = 0x00000001U + // .. .. ==> MASK : 0x00000038U VAL : 0x00000008U + // .. .. reserved_reg_ddrc_rank0_rd_odt = 0x0 + // .. .. ==> 0XF8006048[2:0] = 0x00000000U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006048, 0x0003F03FU ,0x0003C008U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B5C[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B5C[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. reserved_SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B60[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B60[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F9861CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B64[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B64[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F9861CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B68[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B68[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. reserved_VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. reserved_REFIO_TEST = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. reserved_REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. reserved_DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. reserved_CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x00007FFFU ,0x00000209U), + // .. .. 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 + // .. .. reserved_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 + // .. .. reserved_VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reserved_VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reserved_VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. reserved_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[15:14] = 0x00000000U + // .. .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. reserved_INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reserved_TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reserved_TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reserved_TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. reserved_TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reserved_INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FEFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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 = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. .. START: USB1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: USB1 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: ENET0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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: ENET0 RESET + // .. .. .. START: ENET1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: ENET1 RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. .. START: I2C0 RESET + // .. .. .. .. START: DIR MODE GPIO BANK0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: OUTPUT ENABLE + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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: I2C0 RESET + // .. .. .. START: I2C1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: I2C1 RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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 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 + // .. .. START: AFI2 SECURE REGISTER + // .. .. FINISH: AFI2 SECURE REGISTER + // .. 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_debug_3_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x7 + // .. ==> 0XF800015C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. DIVISOR1 = 0x6 + // .. ==> 0XF800015C[25:20] = 0x00000006U + // .. ==> MASK : 0x03F00000U VAL : 0x00600000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00600701U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27287290U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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_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 = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. 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 = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. 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 ,0x00000209U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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 = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. .. START: USB1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: USB1 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: ENET0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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: ENET0 RESET + // .. .. .. START: ENET1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: ENET1 RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. .. START: I2C0 RESET + // .. .. .. .. START: DIR MODE GPIO BANK0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: OUTPUT ENABLE + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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: I2C0 RESET + // .. .. .. START: I2C1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: I2C1 RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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 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_debug_2_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x7 + // .. ==> 0XF800015C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. DIVISOR1 = 0x6 + // .. ==> 0XF800015C[25:20] = 0x00000006U + // .. ==> MASK : 0x03F00000U VAL : 0x00600000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00600701U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27287290U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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_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 = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. 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 = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 ,0x00000209U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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 = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. .. START: USB1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: USB1 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: ENET0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. .. DATA_0_LSW = 0x800 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. .. 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: ENET0 RESET + // .. .. .. START: ENET1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: ENET1 RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. .. START: I2C0 RESET + // .. .. .. .. START: DIR MODE GPIO BANK0 + // .. .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: OUTPUT ENABLE + // .. .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. .. 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: I2C0 RESET + // .. .. .. START: I2C1 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. 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: I2C1 RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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 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_debug_1_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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; + case OPCODE_MASKDELAY: + addr = (unsigned long*) args[0]; + mask = args[1]; + int delay = get_number_of_cycles_for_delay(mask); + perf_reset_and_start_timer(); + while ((*addr < delay)) { + } + 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_debug() +{ + // 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_debug_1_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else if (si_ver == PCW_SILICON_VERSION_2) { + ret = ps7_config (ps7_debug_2_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else { + ret = ps7_config (ps7_debug_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 ret; + //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 + 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; +} + + + + +/* For delay calculation using global timer */ + +/* start timer */ + void perf_start_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = ((1 << 0) | // Timer Enable + (1 << 3) | // Auto-increment + (0 << 8) // Pre-scale + ); +} + +/* stop timer and reset timer count regs */ + void perf_reset_clock(void) +{ + perf_disable_clock(); + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_L32 = 0; + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_U32 = 0; +} + +/* Compute mask for given delay in miliseconds*/ +int get_number_of_cycles_for_delay(unsigned int delay) +{ + // GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + return (APU_FREQ*delay/(2*1000)); + +} + +/* stop timer */ + void perf_disable_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = 0; +} + +void perf_reset_and_start_timer() +{ + perf_reset_clock(); + perf_start_clock(); +} + + + + diff --git a/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init_gpl.h b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init_gpl.h new file mode 100644 index 0000000..fd189b5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/ZC702_hw_platform/ps7_init_gpl.h @@ -0,0 +1,137 @@ + +/****************************************************************************** +* +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the "Software"), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit +* persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* Use of the Software is limited solely to applications: (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used in advertising or +* otherwise to promote the sale, use or other dealings in this Software without prior written +* authorization from Xilinx. +* +*******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 OPCODE_MASKDELAY 5U +#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 +#define EMIT_MASKDELAY(addr,mask) ( (OPCODE_MASKDELAY << 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 666666687 +#define DDR_FREQ 533333374 +#define DCI_FREQ 10158730 +#define QSPI_FREQ 200000000 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 25000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 50000000 +#define UART_FREQ 50000000 +#define SPI_FREQ 10000000 +#define I2C_FREQ 111111115 +#define WDT_FREQ 111111115 +#define TTC_FREQ 50000000 +#define CAN_FREQ 23809523 +#define PCAP_FREQ 200000000 +#define TPIU_FREQ 200000000 +#define FPGA0_FREQ 50000000 +#define FPGA1_FREQ 10000000 +#define FPGA2_FREQ 10000000 +#define FPGA3_FREQ 10000000 + + +/* For delay calculation using global registers*/ +#define SCU_GLOBAL_TIMER_COUNT_L32 0xF8F00200 +#define SCU_GLOBAL_TIMER_COUNT_U32 0xF8F00204 +#define SCU_GLOBAL_TIMER_CONTROL 0xF8F00208 +#define SCU_GLOBAL_TIMER_AUTO_INC 0xF8F00218 + +int ps7_config( unsigned long*); +int ps7_init(); +int ps7_post_config(); +int ps7_debug(); +char* getPS7MessageInfo(unsigned key); + +void perf_start_clock(void); +void perf_disable_clock(void); +void perf_reset_clock(void); +void perf_reset_and_start_timer(); +int get_number_of_cycles_for_delay(unsigned int delay); +#ifdef __cplusplus +} +#endif + diff --git a/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.c b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.c new file mode 100644 index 0000000..3bcce86 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.c @@ -0,0 +1,10638 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the "Software"), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit +* persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* Use of the Software is limited solely to applications: (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used in advertising or +* otherwise to promote the sale, use or other dealings in this Software without prior written +* authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file ps7_init.c +* +* This file is automatically generated +* +*****************************************************************************/ + +#include "ps7_init.h" + +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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00001081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 + // .. .. reserved_reg_ddrc_rank0_wr_odt = 0x1 + // .. .. ==> 0XF8006048[5:3] = 0x00000001U + // .. .. ==> MASK : 0x00000038U VAL : 0x00000008U + // .. .. reserved_reg_ddrc_rank0_rd_odt = 0x0 + // .. .. ==> 0XF8006048[2:0] = 0x00000000U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006048, 0x0003F03FU ,0x0003C008U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. FINISH: OCM REMAPPING + // .. START: DDRIOB SETTINGS + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. reserved_SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F98068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F98068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. reserved_VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. reserved_REFIO_TEST = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. reserved_REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. reserved_DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. reserved_CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x00007FFFU ,0x00000220U), + // .. .. 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 + // .. .. reserved_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 + // .. .. reserved_VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reserved_VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reserved_VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. reserved_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[15:14] = 0x00000000U + // .. .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. reserved_INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reserved_TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reserved_TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reserved_TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. reserved_TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reserved_INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FEFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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 + // .. .. START: AFI2 SECURE REGISTER + // .. .. FINISH: AFI2 SECURE REGISTER + // .. FINISH: AFI REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_3_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_2_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. 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 = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. 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 ,0x00000220U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_2_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_1_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. 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 ,0x00000220U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_1_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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; + case OPCODE_MASKDELAY: + addr = (unsigned long*) args[0]; + mask = args[1]; + int delay = get_number_of_cycles_for_delay(mask); + perf_reset_and_start_timer(); + while ((*addr < delay)) { + } + 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_debug() +{ + // 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_debug_1_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else if (si_ver == PCW_SILICON_VERSION_2) { + ret = ps7_config (ps7_debug_2_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else { + ret = ps7_config (ps7_debug_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 ret; + //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 + 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; +} + + + + +/* For delay calculation using global timer */ + +/* start timer */ + void perf_start_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = ((1 << 0) | // Timer Enable + (1 << 3) | // Auto-increment + (0 << 8) // Pre-scale + ); +} + +/* stop timer and reset timer count regs */ + void perf_reset_clock(void) +{ + perf_disable_clock(); + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_L32 = 0; + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_U32 = 0; +} + +/* Compute mask for given delay in miliseconds*/ +int get_number_of_cycles_for_delay(unsigned int delay) +{ + // GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + return (APU_FREQ*delay/(2*1000)); + +} + +/* stop timer */ + void perf_disable_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = 0; +} + +void perf_reset_and_start_timer() +{ + perf_reset_clock(); + perf_start_clock(); +} + + + + diff --git a/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.h b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.h new file mode 100644 index 0000000..bb95e06 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.h @@ -0,0 +1,137 @@ + +/****************************************************************************** +* +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the "Software"), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit +* persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* Use of the Software is limited solely to applications: (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used in advertising or +* otherwise to promote the sale, use or other dealings in this Software without prior written +* authorization from Xilinx. +* +*******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 OPCODE_MASKDELAY 5U +#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 +#define EMIT_MASKDELAY(addr,mask) ( (OPCODE_MASKDELAY << 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 666666687 +#define DDR_FREQ 533333374 +#define DCI_FREQ 10158730 +#define QSPI_FREQ 200000000 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 125000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 100000000 +#define UART_FREQ 100000000 +#define SPI_FREQ 166666672 +#define I2C_FREQ 111111115 +#define WDT_FREQ 111111115 +#define TTC_FREQ 50000000 +#define CAN_FREQ 10000000 +#define PCAP_FREQ 200000000 +#define TPIU_FREQ 200000000 +#define FPGA0_FREQ 50000000 +#define FPGA1_FREQ 100000000 +#define FPGA2_FREQ 10000000 +#define FPGA3_FREQ 10000000 + + +/* For delay calculation using global registers*/ +#define SCU_GLOBAL_TIMER_COUNT_L32 0xF8F00200 +#define SCU_GLOBAL_TIMER_COUNT_U32 0xF8F00204 +#define SCU_GLOBAL_TIMER_CONTROL 0xF8F00208 +#define SCU_GLOBAL_TIMER_AUTO_INC 0xF8F00218 + +int ps7_config( unsigned long*); +int ps7_init(); +int ps7_post_config(); +int ps7_debug(); +char* getPS7MessageInfo(unsigned key); + +void perf_start_clock(void); +void perf_disable_clock(void); +void perf_reset_clock(void); +void perf_reset_and_start_timer(); +int get_number_of_cycles_for_delay(unsigned int delay); +#ifdef __cplusplus +} +#endif + diff --git a/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.tcl b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.tcl new file mode 100644 index 0000000..d0f4463 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init.tcl @@ -0,0 +1,781 @@ +proc ps7_pll_init_data_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000110 0x003FFFF0 0x000FA220 + mask_write 0XF8000100 0x0007F000 0x00028000 + mask_write 0XF8000100 0x00000010 0x00000010 + mask_write 0XF8000100 0x00000001 0x00000001 + mask_write 0XF8000100 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000001 + mask_write 0XF8000100 0x00000010 0x00000000 + mask_write 0XF8000120 0x1F003F30 0x1F000200 + mask_write 0XF8000114 0x003FFFF0 0x0012C220 + mask_write 0XF8000104 0x0007F000 0x00020000 + mask_write 0XF8000104 0x00000010 0x00000010 + mask_write 0XF8000104 0x00000001 0x00000001 + mask_write 0XF8000104 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000002 + mask_write 0XF8000104 0x00000010 0x00000000 + mask_write 0XF8000124 0xFFF00003 0x0C200003 + mask_write 0XF8000118 0x003FFFF0 0x001452C0 + mask_write 0XF8000108 0x0007F000 0x0001E000 + mask_write 0XF8000108 0x00000010 0x00000010 + mask_write 0XF8000108 0x00000001 0x00000001 + mask_write 0XF8000108 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000004 + mask_write 0XF8000108 0x00000010 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_clock_init_data_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000128 0x03F03F01 0x00700F01 + mask_write 0XF800014C 0x00003F31 0x00000501 + mask_write 0XF8000150 0x00003F33 0x00000A03 + mask_write 0XF8000154 0x00003F33 0x00000A03 + mask_write 0XF8000158 0x00003F33 0x00000603 + mask_write 0XF8000168 0x00003F31 0x00000501 + mask_write 0XF8000170 0x03F03F30 0x00400500 + mask_write 0XF8000180 0x03F03F30 0x00200500 + mask_write 0XF80001C4 0x00000001 0x00000001 + mask_write 0XF800012C 0x01FFCCCD 0x01FCCC0D + mwr -force 0XF8000004 0x0000767B +} +proc ps7_ddr_init_data_3_0 {} { + mask_write 0XF8006000 0x0001FFFF 0x00000084 + mask_write 0XF8006004 0x0007FFFF 0x00001081 + mask_write 0XF8006008 0x03FFFFFF 0x03C0780F + mask_write 0XF800600C 0x03FFFFFF 0x02001001 + mask_write 0XF8006010 0x03FFFFFF 0x00014001 + mask_write 0XF8006014 0x001FFFFF 0x0004281B + mask_write 0XF8006018 0xF7FFFFFF 0x44E458D2 + mask_write 0XF800601C 0xFFFFFFFF 0x720238E5 + mask_write 0XF8006020 0x7FDFFFFC 0x270872D0 + mask_write 0XF8006024 0x0FFFFFC3 0x00000000 + mask_write 0XF8006028 0x00003FFF 0x00002007 + mask_write 0XF800602C 0xFFFFFFFF 0x00000008 + mask_write 0XF8006030 0xFFFFFFFF 0x00040930 + mask_write 0XF8006034 0x13FF3FFF 0x000116D4 + mask_write 0XF8006038 0x00000003 0x00000000 + mask_write 0XF800603C 0x000FFFFF 0x00000666 + mask_write 0XF8006040 0xFFFFFFFF 0xFFFF0000 + mask_write 0XF8006044 0x0FFFFFFF 0x0F555555 + mask_write 0XF8006048 0x0003F03F 0x0003C008 + mask_write 0XF8006050 0xFF0F8FFF 0x77010800 + mask_write 0XF8006058 0x00010000 0x00000000 + mask_write 0XF800605C 0x0000FFFF 0x00005003 + mask_write 0XF8006060 0x000017FF 0x0000003E + mask_write 0XF8006064 0x00021FE0 0x00020000 + mask_write 0XF8006068 0x03FFFFFF 0x00284141 + mask_write 0XF800606C 0x0000FFFF 0x00001610 + mask_write 0XF8006078 0x03FFFFFF 0x00466111 + mask_write 0XF800607C 0x000FFFFF 0x00032222 + mask_write 0XF80060A4 0xFFFFFFFF 0x10200802 + mask_write 0XF80060A8 0x0FFFFFFF 0x0690CB73 + mask_write 0XF80060AC 0x000001FF 0x000001FE + mask_write 0XF80060B0 0x1FFFFFFF 0x1CFFFFFF + mask_write 0XF80060B4 0x00000200 0x00000200 + mask_write 0XF80060B8 0x01FFFFFF 0x00200066 + mask_write 0XF80060C4 0x00000003 0x00000000 + mask_write 0XF80060C8 0x000000FF 0x00000000 + mask_write 0XF80060DC 0x00000001 0x00000000 + mask_write 0XF80060F0 0x0000FFFF 0x00000000 + mask_write 0XF80060F4 0x0000000F 0x00000008 + mask_write 0XF8006114 0x000000FF 0x00000000 + mask_write 0XF8006118 0x7FFFFFCF 0x40000001 + mask_write 0XF800611C 0x7FFFFFCF 0x40000001 + mask_write 0XF8006120 0x7FFFFFCF 0x40000000 + mask_write 0XF8006124 0x7FFFFFCF 0x40000000 + mask_write 0XF800612C 0x000FFFFF 0x00029000 + mask_write 0XF8006130 0x000FFFFF 0x00029000 + mask_write 0XF8006134 0x000FFFFF 0x00029000 + mask_write 0XF8006138 0x000FFFFF 0x00029000 + mask_write 0XF8006140 0x000FFFFF 0x00000035 + mask_write 0XF8006144 0x000FFFFF 0x00000035 + mask_write 0XF8006148 0x000FFFFF 0x00000035 + mask_write 0XF800614C 0x000FFFFF 0x00000035 + mask_write 0XF8006154 0x000FFFFF 0x00000080 + mask_write 0XF8006158 0x000FFFFF 0x00000080 + mask_write 0XF800615C 0x000FFFFF 0x00000080 + mask_write 0XF8006160 0x000FFFFF 0x00000080 + mask_write 0XF8006168 0x001FFFFF 0x000000F9 + mask_write 0XF800616C 0x001FFFFF 0x000000F9 + mask_write 0XF8006170 0x001FFFFF 0x000000F9 + mask_write 0XF8006174 0x001FFFFF 0x000000F9 + mask_write 0XF800617C 0x000FFFFF 0x000000C0 + mask_write 0XF8006180 0x000FFFFF 0x000000C0 + mask_write 0XF8006184 0x000FFFFF 0x000000C0 + mask_write 0XF8006188 0x000FFFFF 0x000000C0 + mask_write 0XF8006190 0x6FFFFEFE 0x00040080 + mask_write 0XF8006194 0x000FFFFF 0x0001FC82 + mask_write 0XF8006204 0xFFFFFFFF 0x00000000 + mask_write 0XF8006208 0x000703FF 0x000003FF + mask_write 0XF800620C 0x000703FF 0x000003FF + mask_write 0XF8006210 0x000703FF 0x000003FF + mask_write 0XF8006214 0x000703FF 0x000003FF + mask_write 0XF8006218 0x000F03FF 0x000003FF + mask_write 0XF800621C 0x000F03FF 0x000003FF + mask_write 0XF8006220 0x000F03FF 0x000003FF + mask_write 0XF8006224 0x000F03FF 0x000003FF + mask_write 0XF80062A8 0x00000FF5 0x00000000 + mask_write 0XF80062AC 0xFFFFFFFF 0x00000000 + mask_write 0XF80062B0 0x003FFFFF 0x00005125 + mask_write 0XF80062B4 0x0003FFFF 0x000012A8 + mask_poll 0XF8000B74 0x00002000 + mask_write 0XF8006000 0x0001FFFF 0x00000085 + mask_poll 0XF8006054 0x00000007 +} +proc ps7_mio_init_data_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B40 0x00000FFF 0x00000600 + mask_write 0XF8000B44 0x00000FFF 0x00000600 + mask_write 0XF8000B48 0x00000FFF 0x00000672 + mask_write 0XF8000B4C 0x00000FFF 0x00000800 + mask_write 0XF8000B50 0x00000FFF 0x00000674 + mask_write 0XF8000B54 0x00000FFF 0x00000800 + mask_write 0XF8000B58 0x00000FFF 0x00000600 + mask_write 0XF8000B5C 0xFFFFFFFF 0x0018C068 + mask_write 0XF8000B60 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B64 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B68 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B6C 0x00007FFF 0x00000220 + mask_write 0XF8000B70 0x00000001 0x00000001 + mask_write 0XF8000B70 0x00000021 0x00000020 + mask_write 0XF8000B70 0x07FEFFFF 0x00000823 + mask_write 0XF8000700 0x00003F01 0x00001601 + mask_write 0XF8000704 0x00003FFF 0x00001602 + mask_write 0XF8000708 0x00003FFF 0x00000602 + mask_write 0XF800070C 0x00003FFF 0x00000602 + mask_write 0XF8000710 0x00003FFF 0x00000602 + mask_write 0XF8000714 0x00003FFF 0x00000602 + mask_write 0XF8000718 0x00003FFF 0x00000602 + mask_write 0XF800071C 0x00003FFF 0x00000600 + mask_write 0XF8000720 0x00003FFF 0x000006E0 + mask_write 0XF8000724 0x00003FFF 0x000016E1 + mask_write 0XF8000728 0x00003FFF 0x00000680 + mask_write 0XF800072C 0x00003FFF 0x00000680 + mask_write 0XF8000730 0x00003FFF 0x00000680 + mask_write 0XF8000734 0x00003FFF 0x00000680 + mask_write 0XF8000738 0x00003FFF 0x00000680 + mask_write 0XF800073C 0x00003FFF 0x00000680 + mask_write 0XF8000770 0x00003FFF 0x00001604 + mask_write 0XF8000774 0x00003FFF 0x00001605 + mask_write 0XF8000778 0x00003FFF 0x00001604 + mask_write 0XF800077C 0x00003FFF 0x00001605 + mask_write 0XF8000780 0x00003FFF 0x00001604 + mask_write 0XF8000784 0x00003FFF 0x00001604 + mask_write 0XF8000788 0x00003FFF 0x00001604 + mask_write 0XF800078C 0x00003FFF 0x00001604 + mask_write 0XF8000790 0x00003FFF 0x00001605 + mask_write 0XF8000794 0x00003FFF 0x00001604 + mask_write 0XF8000798 0x00003FFF 0x00001604 + mask_write 0XF800079C 0x00003FFF 0x00001604 + mask_write 0XF80007C0 0x00003FFF 0x00001640 + mask_write 0XF80007C4 0x00003FFF 0x00001640 + mask_write 0XF80007D0 0x00003FFF 0x00001600 + mask_write 0XF80007D4 0x00003FFF 0x00001600 + mask_write 0XF8000830 0x003F003F 0x00380037 + mask_write 0XF8000834 0x003F003F 0x00000039 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_peripherals_init_data_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B48 0x00000180 0x00000180 + mask_write 0XF8000B4C 0x00000180 0x00000000 + mask_write 0XF8000B50 0x00000180 0x00000180 + mask_write 0XF8000B54 0x00000180 0x00000000 + mwr -force 0XF8000004 0x0000767B + mask_write 0XE0001034 0x000000FF 0x00000006 + mask_write 0XE0001018 0x0000FFFF 0x0000007C + mask_write 0XE0001000 0x000001FF 0x00000017 + mask_write 0XE0001004 0x000003FF 0x00000020 + mask_write 0XE0000034 0x000000FF 0x00000006 + mask_write 0XE0000018 0x0000FFFF 0x0000007C + mask_write 0XE0000000 0x000001FF 0x00000017 + mask_write 0XE0000004 0x000003FF 0x00000020 + mask_write 0XE000D000 0x00080000 0x00080000 + mask_write 0XF8007000 0x20000000 0x00000000 + mask_write 0XE000A204 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_write 0XE000A208 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 +} +proc ps7_post_config_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000900 0x0000000F 0x0000000F + mask_write 0XF8000240 0xFFFFFFFF 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_debug_3_0 {} { + mwr -force 0XF8898FB0 0xC5ACCE55 + mwr -force 0XF8899FB0 0xC5ACCE55 + mwr -force 0XF8809FB0 0xC5ACCE55 +} +proc ps7_pll_init_data_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000110 0x003FFFF0 0x000FA220 + mask_write 0XF8000100 0x0007F000 0x00028000 + mask_write 0XF8000100 0x00000010 0x00000010 + mask_write 0XF8000100 0x00000001 0x00000001 + mask_write 0XF8000100 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000001 + mask_write 0XF8000100 0x00000010 0x00000000 + mask_write 0XF8000120 0x1F003F30 0x1F000200 + mask_write 0XF8000114 0x003FFFF0 0x0012C220 + mask_write 0XF8000104 0x0007F000 0x00020000 + mask_write 0XF8000104 0x00000010 0x00000010 + mask_write 0XF8000104 0x00000001 0x00000001 + mask_write 0XF8000104 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000002 + mask_write 0XF8000104 0x00000010 0x00000000 + mask_write 0XF8000124 0xFFF00003 0x0C200003 + mask_write 0XF8000118 0x003FFFF0 0x001452C0 + mask_write 0XF8000108 0x0007F000 0x0001E000 + mask_write 0XF8000108 0x00000010 0x00000010 + mask_write 0XF8000108 0x00000001 0x00000001 + mask_write 0XF8000108 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000004 + mask_write 0XF8000108 0x00000010 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_clock_init_data_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000128 0x03F03F01 0x00700F01 + mask_write 0XF800014C 0x00003F31 0x00000501 + mask_write 0XF8000150 0x00003F33 0x00000A03 + mask_write 0XF8000154 0x00003F33 0x00000A03 + mask_write 0XF8000158 0x00003F33 0x00000603 + mask_write 0XF8000168 0x00003F31 0x00000501 + mask_write 0XF8000170 0x03F03F30 0x00400500 + mask_write 0XF8000180 0x03F03F30 0x00200500 + mask_write 0XF80001C4 0x00000001 0x00000001 + mask_write 0XF800012C 0x01FFCCCD 0x01FCCC0D + mwr -force 0XF8000004 0x0000767B +} +proc ps7_ddr_init_data_2_0 {} { + mask_write 0XF8006000 0x0001FFFF 0x00000084 + mask_write 0XF8006004 0x1FFFFFFF 0x00081081 + mask_write 0XF8006008 0x03FFFFFF 0x03C0780F + mask_write 0XF800600C 0x03FFFFFF 0x02001001 + mask_write 0XF8006010 0x03FFFFFF 0x00014001 + mask_write 0XF8006014 0x001FFFFF 0x0004281B + mask_write 0XF8006018 0xF7FFFFFF 0x44E458D2 + mask_write 0XF800601C 0xFFFFFFFF 0x720238E5 + mask_write 0XF8006020 0xFFFFFFFC 0x272872D0 + mask_write 0XF8006024 0x0FFFFFFF 0x0000003C + mask_write 0XF8006028 0x00003FFF 0x00002007 + mask_write 0XF800602C 0xFFFFFFFF 0x00000008 + mask_write 0XF8006030 0xFFFFFFFF 0x00040930 + mask_write 0XF8006034 0x13FF3FFF 0x000116D4 + mask_write 0XF8006038 0x00001FC3 0x00000000 + mask_write 0XF800603C 0x000FFFFF 0x00000666 + mask_write 0XF8006040 0xFFFFFFFF 0xFFFF0000 + mask_write 0XF8006044 0x0FFFFFFF 0x0F555555 + mask_write 0XF8006048 0x3FFFFFFF 0x0003C248 + mask_write 0XF8006050 0xFF0F8FFF 0x77010800 + mask_write 0XF8006058 0x0001FFFF 0x00000101 + mask_write 0XF800605C 0x0000FFFF 0x00005003 + mask_write 0XF8006060 0x000017FF 0x0000003E + mask_write 0XF8006064 0x00021FE0 0x00020000 + mask_write 0XF8006068 0x03FFFFFF 0x00284141 + mask_write 0XF800606C 0x0000FFFF 0x00001610 + mask_write 0XF8006078 0x03FFFFFF 0x00466111 + mask_write 0XF800607C 0x000FFFFF 0x00032222 + mask_write 0XF80060A0 0x00FFFFFF 0x00008000 + mask_write 0XF80060A4 0xFFFFFFFF 0x10200802 + mask_write 0XF80060A8 0x0FFFFFFF 0x0690CB73 + mask_write 0XF80060AC 0x000001FF 0x000001FE + mask_write 0XF80060B0 0x1FFFFFFF 0x1CFFFFFF + mask_write 0XF80060B4 0x000007FF 0x00000200 + mask_write 0XF80060B8 0x01FFFFFF 0x00200066 + mask_write 0XF80060C4 0x00000003 0x00000000 + mask_write 0XF80060C8 0x000000FF 0x00000000 + mask_write 0XF80060DC 0x00000001 0x00000000 + mask_write 0XF80060F0 0x0000FFFF 0x00000000 + mask_write 0XF80060F4 0x0000000F 0x00000008 + mask_write 0XF8006114 0x000000FF 0x00000000 + mask_write 0XF8006118 0x7FFFFFFF 0x40000001 + mask_write 0XF800611C 0x7FFFFFFF 0x40000001 + mask_write 0XF8006120 0x7FFFFFFF 0x40000000 + mask_write 0XF8006124 0x7FFFFFFF 0x40000000 + mask_write 0XF800612C 0x000FFFFF 0x00029000 + mask_write 0XF8006130 0x000FFFFF 0x00029000 + mask_write 0XF8006134 0x000FFFFF 0x00029000 + mask_write 0XF8006138 0x000FFFFF 0x00029000 + mask_write 0XF8006140 0x000FFFFF 0x00000035 + mask_write 0XF8006144 0x000FFFFF 0x00000035 + mask_write 0XF8006148 0x000FFFFF 0x00000035 + mask_write 0XF800614C 0x000FFFFF 0x00000035 + mask_write 0XF8006154 0x000FFFFF 0x00000080 + mask_write 0XF8006158 0x000FFFFF 0x00000080 + mask_write 0XF800615C 0x000FFFFF 0x00000080 + mask_write 0XF8006160 0x000FFFFF 0x00000080 + mask_write 0XF8006168 0x001FFFFF 0x000000F9 + mask_write 0XF800616C 0x001FFFFF 0x000000F9 + mask_write 0XF8006170 0x001FFFFF 0x000000F9 + mask_write 0XF8006174 0x001FFFFF 0x000000F9 + mask_write 0XF800617C 0x000FFFFF 0x000000C0 + mask_write 0XF8006180 0x000FFFFF 0x000000C0 + mask_write 0XF8006184 0x000FFFFF 0x000000C0 + mask_write 0XF8006188 0x000FFFFF 0x000000C0 + mask_write 0XF8006190 0xFFFFFFFF 0x10040080 + mask_write 0XF8006194 0x000FFFFF 0x0001FC82 + mask_write 0XF8006204 0xFFFFFFFF 0x00000000 + mask_write 0XF8006208 0x000F03FF 0x000803FF + mask_write 0XF800620C 0x000F03FF 0x000803FF + mask_write 0XF8006210 0x000F03FF 0x000803FF + mask_write 0XF8006214 0x000F03FF 0x000803FF + mask_write 0XF8006218 0x000F03FF 0x000003FF + mask_write 0XF800621C 0x000F03FF 0x000003FF + mask_write 0XF8006220 0x000F03FF 0x000003FF + mask_write 0XF8006224 0x000F03FF 0x000003FF + mask_write 0XF80062A8 0x00000FF7 0x00000000 + mask_write 0XF80062AC 0xFFFFFFFF 0x00000000 + mask_write 0XF80062B0 0x003FFFFF 0x00005125 + mask_write 0XF80062B4 0x0003FFFF 0x000012A8 + mask_poll 0XF8000B74 0x00002000 + mask_write 0XF8006000 0x0001FFFF 0x00000085 + mask_poll 0XF8006054 0x00000007 +} +proc ps7_mio_init_data_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B40 0x00000FFF 0x00000600 + mask_write 0XF8000B44 0x00000FFF 0x00000600 + mask_write 0XF8000B48 0x00000FFF 0x00000672 + mask_write 0XF8000B4C 0x00000FFF 0x00000800 + mask_write 0XF8000B50 0x00000FFF 0x00000674 + mask_write 0XF8000B54 0x00000FFF 0x00000800 + mask_write 0XF8000B58 0x00000FFF 0x00000600 + mask_write 0XF8000B5C 0xFFFFFFFF 0x0018C068 + mask_write 0XF8000B60 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B64 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B68 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B6C 0x00007FFF 0x00000220 + mask_write 0XF8000B70 0x00000021 0x00000021 + mask_write 0XF8000B70 0x00000021 0x00000020 + mask_write 0XF8000B70 0x07FFFFFF 0x00000823 + mask_write 0XF8000700 0x00003F01 0x00001601 + mask_write 0XF8000704 0x00003FFF 0x00001602 + mask_write 0XF8000708 0x00003FFF 0x00000602 + mask_write 0XF800070C 0x00003FFF 0x00000602 + mask_write 0XF8000710 0x00003FFF 0x00000602 + mask_write 0XF8000714 0x00003FFF 0x00000602 + mask_write 0XF8000718 0x00003FFF 0x00000602 + mask_write 0XF800071C 0x00003FFF 0x00000600 + mask_write 0XF8000720 0x00003FFF 0x000006E0 + mask_write 0XF8000724 0x00003FFF 0x000016E1 + mask_write 0XF8000728 0x00003FFF 0x00000680 + mask_write 0XF800072C 0x00003FFF 0x00000680 + mask_write 0XF8000730 0x00003FFF 0x00000680 + mask_write 0XF8000734 0x00003FFF 0x00000680 + mask_write 0XF8000738 0x00003FFF 0x00000680 + mask_write 0XF800073C 0x00003FFF 0x00000680 + mask_write 0XF8000770 0x00003FFF 0x00001604 + mask_write 0XF8000774 0x00003FFF 0x00001605 + mask_write 0XF8000778 0x00003FFF 0x00001604 + mask_write 0XF800077C 0x00003FFF 0x00001605 + mask_write 0XF8000780 0x00003FFF 0x00001604 + mask_write 0XF8000784 0x00003FFF 0x00001604 + mask_write 0XF8000788 0x00003FFF 0x00001604 + mask_write 0XF800078C 0x00003FFF 0x00001604 + mask_write 0XF8000790 0x00003FFF 0x00001605 + mask_write 0XF8000794 0x00003FFF 0x00001604 + mask_write 0XF8000798 0x00003FFF 0x00001604 + mask_write 0XF800079C 0x00003FFF 0x00001604 + mask_write 0XF80007C0 0x00003FFF 0x00001640 + mask_write 0XF80007C4 0x00003FFF 0x00001640 + mask_write 0XF80007D0 0x00003FFF 0x00001600 + mask_write 0XF80007D4 0x00003FFF 0x00001600 + mask_write 0XF8000830 0x003F003F 0x00380037 + mask_write 0XF8000834 0x003F003F 0x00000039 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_peripherals_init_data_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B48 0x00000180 0x00000180 + mask_write 0XF8000B4C 0x00000180 0x00000000 + mask_write 0XF8000B50 0x00000180 0x00000180 + mask_write 0XF8000B54 0x00000180 0x00000000 + mwr -force 0XF8000004 0x0000767B + mask_write 0XE0001034 0x000000FF 0x00000006 + mask_write 0XE0001018 0x0000FFFF 0x0000007C + mask_write 0XE0001000 0x000001FF 0x00000017 + mask_write 0XE0001004 0x00000FFF 0x00000020 + mask_write 0XE0000034 0x000000FF 0x00000006 + mask_write 0XE0000018 0x0000FFFF 0x0000007C + mask_write 0XE0000000 0x000001FF 0x00000017 + mask_write 0XE0000004 0x00000FFF 0x00000020 + mask_write 0XE000D000 0x00080000 0x00080000 + mask_write 0XF8007000 0x20000000 0x00000000 + mask_write 0XE000A204 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_write 0XE000A208 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 +} +proc ps7_post_config_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000900 0x0000000F 0x0000000F + mask_write 0XF8000240 0xFFFFFFFF 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_debug_2_0 {} { + mwr -force 0XF8898FB0 0xC5ACCE55 + mwr -force 0XF8899FB0 0xC5ACCE55 + mwr -force 0XF8809FB0 0xC5ACCE55 +} +proc ps7_pll_init_data_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000110 0x003FFFF0 0x000FA220 + mask_write 0XF8000100 0x0007F000 0x00028000 + mask_write 0XF8000100 0x00000010 0x00000010 + mask_write 0XF8000100 0x00000001 0x00000001 + mask_write 0XF8000100 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000001 + mask_write 0XF8000100 0x00000010 0x00000000 + mask_write 0XF8000120 0x1F003F30 0x1F000200 + mask_write 0XF8000114 0x003FFFF0 0x0012C220 + mask_write 0XF8000104 0x0007F000 0x00020000 + mask_write 0XF8000104 0x00000010 0x00000010 + mask_write 0XF8000104 0x00000001 0x00000001 + mask_write 0XF8000104 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000002 + mask_write 0XF8000104 0x00000010 0x00000000 + mask_write 0XF8000124 0xFFF00003 0x0C200003 + mask_write 0XF8000118 0x003FFFF0 0x001452C0 + mask_write 0XF8000108 0x0007F000 0x0001E000 + mask_write 0XF8000108 0x00000010 0x00000010 + mask_write 0XF8000108 0x00000001 0x00000001 + mask_write 0XF8000108 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000004 + mask_write 0XF8000108 0x00000010 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_clock_init_data_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000128 0x03F03F01 0x00700F01 + mask_write 0XF800014C 0x00003F31 0x00000501 + mask_write 0XF8000150 0x00003F33 0x00000A03 + mask_write 0XF8000154 0x00003F33 0x00000A03 + mask_write 0XF8000158 0x00003F33 0x00000603 + mask_write 0XF8000168 0x00003F31 0x00000501 + mask_write 0XF8000170 0x03F03F30 0x00400500 + mask_write 0XF8000180 0x03F03F30 0x00200500 + mask_write 0XF80001C4 0x00000001 0x00000001 + mask_write 0XF800012C 0x01FFCCCD 0x01FCCC0D + mwr -force 0XF8000004 0x0000767B +} +proc ps7_ddr_init_data_1_0 {} { + mask_write 0XF8006000 0x0001FFFF 0x00000084 + mask_write 0XF8006004 0x1FFFFFFF 0x00081081 + mask_write 0XF8006008 0x03FFFFFF 0x03C0780F + mask_write 0XF800600C 0x03FFFFFF 0x02001001 + mask_write 0XF8006010 0x03FFFFFF 0x00014001 + mask_write 0XF8006014 0x001FFFFF 0x0004281B + mask_write 0XF8006018 0xF7FFFFFF 0x44E458D2 + mask_write 0XF800601C 0xFFFFFFFF 0x720238E5 + mask_write 0XF8006020 0xFFFFFFFC 0x272872D0 + mask_write 0XF8006024 0x0FFFFFFF 0x0000003C + mask_write 0XF8006028 0x00003FFF 0x00002007 + mask_write 0XF800602C 0xFFFFFFFF 0x00000008 + mask_write 0XF8006030 0xFFFFFFFF 0x00040930 + mask_write 0XF8006034 0x13FF3FFF 0x000116D4 + mask_write 0XF8006038 0x00001FC3 0x00000000 + mask_write 0XF800603C 0x000FFFFF 0x00000666 + mask_write 0XF8006040 0xFFFFFFFF 0xFFFF0000 + mask_write 0XF8006044 0x0FFFFFFF 0x0F555555 + mask_write 0XF8006048 0x3FFFFFFF 0x0003C248 + mask_write 0XF8006050 0xFF0F8FFF 0x77010800 + mask_write 0XF8006058 0x0001FFFF 0x00000101 + mask_write 0XF800605C 0x0000FFFF 0x00005003 + mask_write 0XF8006060 0x000017FF 0x0000003E + mask_write 0XF8006064 0x00021FE0 0x00020000 + mask_write 0XF8006068 0x03FFFFFF 0x00284141 + mask_write 0XF800606C 0x0000FFFF 0x00001610 + mask_write 0XF80060A0 0x00FFFFFF 0x00008000 + mask_write 0XF80060A4 0xFFFFFFFF 0x10200802 + mask_write 0XF80060A8 0x0FFFFFFF 0x0690CB73 + mask_write 0XF80060AC 0x000001FF 0x000001FE + mask_write 0XF80060B0 0x1FFFFFFF 0x1CFFFFFF + mask_write 0XF80060B4 0x000007FF 0x00000200 + mask_write 0XF80060B8 0x01FFFFFF 0x00200066 + mask_write 0XF80060C4 0x00000003 0x00000000 + mask_write 0XF80060C8 0x000000FF 0x00000000 + mask_write 0XF80060DC 0x00000001 0x00000000 + mask_write 0XF80060F0 0x0000FFFF 0x00000000 + mask_write 0XF80060F4 0x0000000F 0x00000008 + mask_write 0XF8006114 0x000000FF 0x00000000 + mask_write 0XF8006118 0x7FFFFFFF 0x40000001 + mask_write 0XF800611C 0x7FFFFFFF 0x40000001 + mask_write 0XF8006120 0x7FFFFFFF 0x40000000 + mask_write 0XF8006124 0x7FFFFFFF 0x40000000 + mask_write 0XF800612C 0x000FFFFF 0x00029000 + mask_write 0XF8006130 0x000FFFFF 0x00029000 + mask_write 0XF8006134 0x000FFFFF 0x00029000 + mask_write 0XF8006138 0x000FFFFF 0x00029000 + mask_write 0XF8006140 0x000FFFFF 0x00000035 + mask_write 0XF8006144 0x000FFFFF 0x00000035 + mask_write 0XF8006148 0x000FFFFF 0x00000035 + mask_write 0XF800614C 0x000FFFFF 0x00000035 + mask_write 0XF8006154 0x000FFFFF 0x00000080 + mask_write 0XF8006158 0x000FFFFF 0x00000080 + mask_write 0XF800615C 0x000FFFFF 0x00000080 + mask_write 0XF8006160 0x000FFFFF 0x00000080 + mask_write 0XF8006168 0x001FFFFF 0x000000F9 + mask_write 0XF800616C 0x001FFFFF 0x000000F9 + mask_write 0XF8006170 0x001FFFFF 0x000000F9 + mask_write 0XF8006174 0x001FFFFF 0x000000F9 + mask_write 0XF800617C 0x000FFFFF 0x000000C0 + mask_write 0XF8006180 0x000FFFFF 0x000000C0 + mask_write 0XF8006184 0x000FFFFF 0x000000C0 + mask_write 0XF8006188 0x000FFFFF 0x000000C0 + mask_write 0XF8006190 0xFFFFFFFF 0x10040080 + mask_write 0XF8006194 0x000FFFFF 0x0001FC82 + mask_write 0XF8006204 0xFFFFFFFF 0x00000000 + mask_write 0XF8006208 0x000F03FF 0x000803FF + mask_write 0XF800620C 0x000F03FF 0x000803FF + mask_write 0XF8006210 0x000F03FF 0x000803FF + mask_write 0XF8006214 0x000F03FF 0x000803FF + mask_write 0XF8006218 0x000F03FF 0x000003FF + mask_write 0XF800621C 0x000F03FF 0x000003FF + mask_write 0XF8006220 0x000F03FF 0x000003FF + mask_write 0XF8006224 0x000F03FF 0x000003FF + mask_write 0XF80062A8 0x00000FF7 0x00000000 + mask_write 0XF80062AC 0xFFFFFFFF 0x00000000 + mask_write 0XF80062B0 0x003FFFFF 0x00005125 + mask_write 0XF80062B4 0x0003FFFF 0x000012A8 + mask_poll 0XF8000B74 0x00002000 + mask_write 0XF8006000 0x0001FFFF 0x00000085 + mask_poll 0XF8006054 0x00000007 +} +proc ps7_mio_init_data_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B40 0x00000FFF 0x00000600 + mask_write 0XF8000B44 0x00000FFF 0x00000600 + mask_write 0XF8000B48 0x00000FFF 0x00000672 + mask_write 0XF8000B4C 0x00000FFF 0x00000800 + mask_write 0XF8000B50 0x00000FFF 0x00000674 + mask_write 0XF8000B54 0x00000FFF 0x00000800 + mask_write 0XF8000B58 0x00000FFF 0x00000600 + mask_write 0XF8000B5C 0xFFFFFFFF 0x0018C068 + mask_write 0XF8000B60 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B64 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B68 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B6C 0x000073FF 0x00000220 + mask_write 0XF8000B70 0x00000021 0x00000021 + mask_write 0XF8000B70 0x00000021 0x00000020 + mask_write 0XF8000B70 0x07FFFFFF 0x00000823 + mask_write 0XF8000700 0x00003F01 0x00001601 + mask_write 0XF8000704 0x00003FFF 0x00001602 + mask_write 0XF8000708 0x00003FFF 0x00000602 + mask_write 0XF800070C 0x00003FFF 0x00000602 + mask_write 0XF8000710 0x00003FFF 0x00000602 + mask_write 0XF8000714 0x00003FFF 0x00000602 + mask_write 0XF8000718 0x00003FFF 0x00000602 + mask_write 0XF800071C 0x00003FFF 0x00000600 + mask_write 0XF8000720 0x00003FFF 0x000006E0 + mask_write 0XF8000724 0x00003FFF 0x000016E1 + mask_write 0XF8000728 0x00003FFF 0x00000680 + mask_write 0XF800072C 0x00003FFF 0x00000680 + mask_write 0XF8000730 0x00003FFF 0x00000680 + mask_write 0XF8000734 0x00003FFF 0x00000680 + mask_write 0XF8000738 0x00003FFF 0x00000680 + mask_write 0XF800073C 0x00003FFF 0x00000680 + mask_write 0XF8000770 0x00003FFF 0x00001604 + mask_write 0XF8000774 0x00003FFF 0x00001605 + mask_write 0XF8000778 0x00003FFF 0x00001604 + mask_write 0XF800077C 0x00003FFF 0x00001605 + mask_write 0XF8000780 0x00003FFF 0x00001604 + mask_write 0XF8000784 0x00003FFF 0x00001604 + mask_write 0XF8000788 0x00003FFF 0x00001604 + mask_write 0XF800078C 0x00003FFF 0x00001604 + mask_write 0XF8000790 0x00003FFF 0x00001605 + mask_write 0XF8000794 0x00003FFF 0x00001604 + mask_write 0XF8000798 0x00003FFF 0x00001604 + mask_write 0XF800079C 0x00003FFF 0x00001604 + mask_write 0XF80007C0 0x00003FFF 0x00001640 + mask_write 0XF80007C4 0x00003FFF 0x00001640 + mask_write 0XF80007D0 0x00003FFF 0x00001600 + mask_write 0XF80007D4 0x00003FFF 0x00001600 + mask_write 0XF8000830 0x003F003F 0x00380037 + mask_write 0XF8000834 0x003F003F 0x00000039 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_peripherals_init_data_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B48 0x00000180 0x00000180 + mask_write 0XF8000B4C 0x00000180 0x00000000 + mask_write 0XF8000B50 0x00000180 0x00000180 + mask_write 0XF8000B54 0x00000180 0x00000000 + mwr -force 0XF8000004 0x0000767B + mask_write 0XE0001034 0x000000FF 0x00000006 + mask_write 0XE0001018 0x0000FFFF 0x0000007C + mask_write 0XE0001000 0x000001FF 0x00000017 + mask_write 0XE0001004 0x00000FFF 0x00000020 + mask_write 0XE0000034 0x000000FF 0x00000006 + mask_write 0XE0000018 0x0000FFFF 0x0000007C + mask_write 0XE0000000 0x000001FF 0x00000017 + mask_write 0XE0000004 0x00000FFF 0x00000020 + mask_write 0XE000D000 0x00080000 0x00080000 + mask_write 0XF8007000 0x20000000 0x00000000 + mask_write 0XE000A204 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_write 0XE000A208 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 +} +proc ps7_post_config_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000900 0x0000000F 0x0000000F + mask_write 0XF8000240 0xFFFFFFFF 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_debug_1_0 {} { + mwr -force 0XF8898FB0 0xC5ACCE55 + mwr -force 0XF8899FB0 0xC5ACCE55 + mwr -force 0XF8809FB0 0xC5ACCE55 +} +set PCW_SILICON_VER_1_0 "0x0" +set PCW_SILICON_VER_2_0 "0x1" +set PCW_SILICON_VER_3_0 "0x2" +set APU_FREQ 666666666 + + + +proc mask_poll { addr mask } { + set count 1 + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval & $mask}] + while { $maskedval == 0 } { + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval & $mask}] + set count [ expr { $count + 1 } ] + if { $count == 100000000 } { + puts "Timeout Reached. Mask poll failed at ADDRESS: $addr MASK: $mask" + break + } + } +} + + + +proc mask_delay { addr val } { + set delay [ get_number_of_cycles_for_delay $val ] + perf_reset_and_start_timer + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval < $delay}] + while { $maskedval == 1 } { + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval < $delay}] + } + perf_reset_clock +} + +proc ps_version { } { + set si_ver "0x[string range [mrd 0xF8007080] end-8 end]" + set mask_sil_ver "0x[expr {$si_ver >> 28}]" + return $mask_sil_ver; +} + +proc ps7_post_config {} { + set saved_mode [configparams force-mem-accesses] + configparams force-mem-accesses 1 + + variable PCW_SILICON_VER_1_0 + variable PCW_SILICON_VER_2_0 + variable PCW_SILICON_VER_3_0 + set sil_ver [ps_version] + + if { $sil_ver == $PCW_SILICON_VER_1_0} { + ps7_post_config_1_0 + } elseif { $sil_ver == $PCW_SILICON_VER_2_0 } { + ps7_post_config_2_0 + } else { + ps7_post_config_3_0 + } + configparams force-mem-accesses $saved_mode +} + +proc ps7_debug {} { + variable PCW_SILICON_VER_1_0 + variable PCW_SILICON_VER_2_0 + variable PCW_SILICON_VER_3_0 + set sil_ver [ps_version] + + if { $sil_ver == $PCW_SILICON_VER_1_0} { + ps7_debug_1_0 + } elseif { $sil_ver == $PCW_SILICON_VER_2_0 } { + ps7_debug_2_0 + } else { + ps7_debug_3_0 + } +} +proc ps7_init {} { + variable PCW_SILICON_VER_1_0 + variable PCW_SILICON_VER_2_0 + variable PCW_SILICON_VER_3_0 + set sil_ver [ps_version] + if { $sil_ver == $PCW_SILICON_VER_1_0} { + ps7_mio_init_data_1_0 + ps7_pll_init_data_1_0 + ps7_clock_init_data_1_0 + ps7_ddr_init_data_1_0 + ps7_peripherals_init_data_1_0 + #puts "PCW Silicon Version : 1.0" + } elseif { $sil_ver == $PCW_SILICON_VER_2_0 } { + ps7_mio_init_data_2_0 + ps7_pll_init_data_2_0 + ps7_clock_init_data_2_0 + ps7_ddr_init_data_2_0 + ps7_peripherals_init_data_2_0 + #puts "PCW Silicon Version : 2.0" + } else { + ps7_mio_init_data_3_0 + ps7_pll_init_data_3_0 + ps7_clock_init_data_3_0 + ps7_ddr_init_data_3_0 + ps7_peripherals_init_data_3_0 + #puts "PCW Silicon Version : 3.0" + } +} + + +# For delay calculation using global timer + +# start timer + proc perf_start_clock { } { + + #writing SCU_GLOBAL_TIMER_CONTROL register + + mask_write 0xF8F00208 0x00000109 0x00000009 +} + +# stop timer and reset timer count regs + proc perf_reset_clock { } { + perf_disable_clock + mask_write 0xF8F00200 0xFFFFFFFF 0x00000000 + mask_write 0xF8F00204 0xFFFFFFFF 0x00000000 +} + +# Compute mask for given delay in miliseconds +proc get_number_of_cycles_for_delay { delay } { + + # GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + variable APU_FREQ + return [ expr ($delay * $APU_FREQ /(2 * 1000))] +} + + +# stop timer +proc perf_disable_clock {} { + mask_write 0xF8F00208 0xFFFFFFFF 0x00000000 +} + +proc perf_reset_and_start_timer {} { + perf_reset_clock + perf_start_clock +} + + diff --git a/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.c b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.c new file mode 100644 index 0000000..52d7d38 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.c @@ -0,0 +1,10629 @@ +/****************************************************************************** +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along +* with this program; if not, see +* +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file ps7_init_gpl.c +* +* This file is automatically generated +* +*****************************************************************************/ + +#include "ps7_init_gpl.h" + +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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00001081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 + // .. .. reserved_reg_ddrc_rank0_wr_odt = 0x1 + // .. .. ==> 0XF8006048[5:3] = 0x00000001U + // .. .. ==> MASK : 0x00000038U VAL : 0x00000008U + // .. .. reserved_reg_ddrc_rank0_rd_odt = 0x0 + // .. .. ==> 0XF8006048[2:0] = 0x00000000U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006048, 0x0003F03FU ,0x0003C008U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. FINISH: OCM REMAPPING + // .. START: DDRIOB SETTINGS + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. reserved_SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F98068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F98068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. reserved_VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. reserved_REFIO_TEST = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. reserved_REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. reserved_DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. reserved_CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x00007FFFU ,0x00000220U), + // .. .. 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 + // .. .. reserved_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 + // .. .. reserved_VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reserved_VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reserved_VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. reserved_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[15:14] = 0x00000000U + // .. .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. reserved_INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reserved_TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reserved_TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reserved_TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. reserved_TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reserved_INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FEFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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 + // .. .. START: AFI2 SECURE REGISTER + // .. .. FINISH: AFI2 SECURE REGISTER + // .. FINISH: AFI REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_3_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_2_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. 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 = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. 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 ,0x00000220U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_2_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_1_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. 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 ,0x00000220U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_1_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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; + case OPCODE_MASKDELAY: + addr = (unsigned long*) args[0]; + mask = args[1]; + int delay = get_number_of_cycles_for_delay(mask); + perf_reset_and_start_timer(); + while ((*addr < delay)) { + } + 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_debug() +{ + // 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_debug_1_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else if (si_ver == PCW_SILICON_VERSION_2) { + ret = ps7_config (ps7_debug_2_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else { + ret = ps7_config (ps7_debug_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 ret; + //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 + 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; +} + + + + +/* For delay calculation using global timer */ + +/* start timer */ + void perf_start_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = ((1 << 0) | // Timer Enable + (1 << 3) | // Auto-increment + (0 << 8) // Pre-scale + ); +} + +/* stop timer and reset timer count regs */ + void perf_reset_clock(void) +{ + perf_disable_clock(); + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_L32 = 0; + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_U32 = 0; +} + +/* Compute mask for given delay in miliseconds*/ +int get_number_of_cycles_for_delay(unsigned int delay) +{ + // GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + return (APU_FREQ*delay/(2*1000)); + +} + +/* stop timer */ + void perf_disable_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = 0; +} + +void perf_reset_and_start_timer() +{ + perf_reset_clock(); + perf_start_clock(); +} + + + + diff --git a/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.h b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.h new file mode 100644 index 0000000..bb95e06 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/design_1_wrapper_hw_platform_0/ps7_init_gpl.h @@ -0,0 +1,137 @@ + +/****************************************************************************** +* +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the "Software"), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit +* persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* Use of the Software is limited solely to applications: (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used in advertising or +* otherwise to promote the sale, use or other dealings in this Software without prior written +* authorization from Xilinx. +* +*******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 OPCODE_MASKDELAY 5U +#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 +#define EMIT_MASKDELAY(addr,mask) ( (OPCODE_MASKDELAY << 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 666666687 +#define DDR_FREQ 533333374 +#define DCI_FREQ 10158730 +#define QSPI_FREQ 200000000 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 125000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 100000000 +#define UART_FREQ 100000000 +#define SPI_FREQ 166666672 +#define I2C_FREQ 111111115 +#define WDT_FREQ 111111115 +#define TTC_FREQ 50000000 +#define CAN_FREQ 10000000 +#define PCAP_FREQ 200000000 +#define TPIU_FREQ 200000000 +#define FPGA0_FREQ 50000000 +#define FPGA1_FREQ 100000000 +#define FPGA2_FREQ 10000000 +#define FPGA3_FREQ 10000000 + + +/* For delay calculation using global registers*/ +#define SCU_GLOBAL_TIMER_COUNT_L32 0xF8F00200 +#define SCU_GLOBAL_TIMER_COUNT_U32 0xF8F00204 +#define SCU_GLOBAL_TIMER_CONTROL 0xF8F00208 +#define SCU_GLOBAL_TIMER_AUTO_INC 0xF8F00218 + +int ps7_config( unsigned long*); +int ps7_init(); +int ps7_post_config(); +int ps7_debug(); +char* getPS7MessageInfo(unsigned key); + +void perf_start_clock(void); +void perf_disable_clock(void); +void perf_reset_clock(void); +void perf_reset_and_start_timer(); +int get_number_of_cycles_for_delay(unsigned int delay); +#ifdef __cplusplus +} +#endif + diff --git a/LED_Blink/LED_Blink.sdk/hello/Debug/hello.elf b/LED_Blink/LED_Blink.sdk/hello/Debug/hello.elf new file mode 100644 index 0000000000000000000000000000000000000000..d59e292c674b40400fe4a3c1acdea2388e69f005 GIT binary patch literal 206856 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 +#include "platform.h" +#include "xil_printf.h" + + +int main() +{ + init_platform(); + + print("Hello World\n\r"); + + cleanup_platform(); + return 0; +} diff --git a/LED_Blink/LED_Blink.sdk/hello/src/platform.c b/LED_Blink/LED_Blink.sdk/hello/src/platform.c new file mode 100644 index 0000000..0ee2dcb --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello/src/platform.c @@ -0,0 +1,111 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include "xparameters.h" +#include "xil_cache.h" + +#include "platform_config.h" + +/* + * Uncomment one of the following two lines, depending on the target, + * if ps7/psu init source files are added in the source directory for + * compiling example outside of SDK. + */ +/*#include "ps7_init.h"*/ +/*#include "psu_init.h"*/ + +#ifdef STDOUT_IS_16550 + #include "xuartns550_l.h" + + #define UART_BAUD 9600 +#endif + +void +enable_caches() +{ +#ifdef __PPC__ + Xil_ICacheEnableRegion(CACHEABLE_REGION_MASK); + Xil_DCacheEnableRegion(CACHEABLE_REGION_MASK); +#elif __MICROBLAZE__ +#ifdef XPAR_MICROBLAZE_USE_ICACHE + Xil_ICacheEnable(); +#endif +#ifdef XPAR_MICROBLAZE_USE_DCACHE + Xil_DCacheEnable(); +#endif +#endif +} + +void +disable_caches() +{ +#ifdef __MICROBLAZE__ +#ifdef XPAR_MICROBLAZE_USE_DCACHE + Xil_DCacheDisable(); +#endif +#ifdef XPAR_MICROBLAZE_USE_ICACHE + Xil_ICacheDisable(); +#endif +#endif +} + +void +init_uart() +{ +#ifdef STDOUT_IS_16550 + XUartNs550_SetBaud(STDOUT_BASEADDR, XPAR_XUARTNS550_CLOCK_HZ, UART_BAUD); + XUartNs550_SetLineControlReg(STDOUT_BASEADDR, XUN_LCR_8_DATA_BITS); +#endif + /* Bootrom/BSP configures PS7/PSU UART to 115200 bps */ +} + +void +init_platform() +{ + /* + * If you want to run this example outside of SDK, + * uncomment one of the following two lines and also #include "ps7_init.h" + * or #include "ps7_init.h" at the top, depending on the target. + * Make sure that the ps7/psu_init.c and ps7/psu_init.h files are included + * along with this example source files for compilation. + */ + /* ps7_init();*/ + /* psu_init();*/ + enable_caches(); + init_uart(); +} + +void +cleanup_platform() +{ + disable_caches(); +} diff --git a/LED_Blink/LED_Blink.sdk/hello/src/platform.h b/LED_Blink/LED_Blink.sdk/hello/src/platform.h new file mode 100644 index 0000000..e273e37 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello/src/platform.h @@ -0,0 +1,41 @@ +/****************************************************************************** +* +* Copyright (C) 2008 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#ifndef __PLATFORM_H_ +#define __PLATFORM_H_ + +#include "platform_config.h" + +void init_platform(); +void cleanup_platform(); + +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello/src/platform_config.h b/LED_Blink/LED_Blink.sdk/hello/src/platform_config.h new file mode 100644 index 0000000..3e9b7f1 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello/src/platform_config.h @@ -0,0 +1,6 @@ +#ifndef __PLATFORM_CONFIG_H_ +#define __PLATFORM_CONFIG_H_ + +#define STDOUT_IS_PS7_UART +#define UART_DEVICE_ID 0 +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/_profile_timer_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/_profile_timer_hw.h new file mode 100644 index 0000000..2cee66b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/_profile_timer_hw.h @@ -0,0 +1,312 @@ +/****************************************************************************** +* +* Copyright (C) 2004 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +****************************************************************************** +* +* _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(((u32)(BaseAddress) + (u32)XTmrCtr_Offsets[(TmrCtrNumber)] + \ + (u32)(RegOffset)), (u32)(ValueToWrite)) + +#define ProfTimerCtr_mReadReg(BaseAddress, TmrCtrNumber, RegOffset) \ + ProfIo_In32((u32)(BaseAddress) + (u32)XTmrCtr_Offsets[(TmrCtrNumber)] + (u32)(RegOffset)) + +#define ProfTmrCtr_mSetControlStatusReg(BaseAddress, TmrCtrNumber, RegisterValue)\ + ProfTmrCtr_mWriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (RegisterValue)) + +#define ProfTmrCtr_mGetControlStatusReg(BaseAddress, TmrCtrNumber) \ + ProfTimerCtr_mReadReg((u32)(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 u32 timer_clk_ticks ; + +/*-------------------------------------------------------------------- + * PowerPC Target - Timer related functions + *-------------------------------------------------------------------- */ +#ifdef PROC_PPC + +#ifdef PPC_PIT_INTERRUPT +u32 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() \ + { \ + u32 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() \ + { \ + u32 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() \ + { \ + u32 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() \ + { \ + u32 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 = ((u32)PROFILE_TIMER_BASEADDR); \ + Addr += (u32)XTmrCtr_Offsets[(u16)(0)]; \ + Addr += (u32)XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(Addr); \ + tmp_v = tmp_v & (u32)(~XTC_CSR_ENABLE_TMR_MASK); \ + u32 OutAddr = (u32)PROFILE_TIMER_BASEADDR; \ + OutAddr += (u32)XTmrCtr_Offsets[(u16)(0)]; \ + OutAddr += (u32)XTC_TCSR_OFFSET; \ + ProfIo_Out32(OutAddr, (u32)tmp_v); \ + } + + +/* -------------------------------------------------------------------- + * Enable the Timer after Call-Graph Data collection + * + *-------------------------------------------------------------------- */ +#define enable_timer() \ + { \ + u32 Addr = ((u32)PROFILE_TIMER_BASEADDR); \ + Addr += (u32)XTmrCtr_Offsets[(u16)(0)]; \ + Addr += (u32)XTC_TCSR_OFFSET; \ + u32 tmp_v = (u32)ProfIo_In32(Addr); \ + tmp_v = tmp_v | (u32)XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((u32)(PROFILE_TIMER_BASEADDR) + (u32)XTmrCtr_Offsets[(u16)(0)] + (u32)XTC_TCSR_OFFSET, (u32)tmp_v); \ + } + + +/* -------------------------------------------------------------------- + * Send Ack to Timer Interrupt + * + *-------------------------------------------------------------------- */ +#define timer_ack() \ + { \ + u32 csr; \ + csr = ProfTmrCtr_mGetControlStatusReg((u32)PROFILE_TIMER_BASEADDR, (u16)0); \ + ProfTmrCtr_mSetControlStatusReg((u32)PROFILE_TIMER_BASEADDR, (u16)0, (u32)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((u32)PROFILE_TIMER_BASEADDR + (u32)XSCUTIMER_ISR_OFFSET, \ + (u32)XSCUTIMER_ISR_EVENT_FLAG_MASK);\ +} + +/*-------------------------------------------------------------------- */ +#endif /* PROC_CORTEXA9 */ +/*-------------------------------------------------------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/bspconfig.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/bspconfig.h new file mode 100644 index 0000000..9427ad0 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/bspconfig.h @@ -0,0 +1,45 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Configurations for Standalone BSP +* +*******************************************************************/ + +#ifndef BSPCONFIG_H /* prevent circular inclusions */ +#define BSPCONFIG_H /* by using protection macros */ + +#define MICROBLAZE_PVR_NONE + +#endif /*end of __BSPCONFIG_H_*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/mblaze_nt_types.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/mblaze_nt_types.h new file mode 100644 index 0000000..7096a92 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/mblaze_nt_types.h @@ -0,0 +1,54 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + + +#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; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/profile.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/profile.h new file mode 100644 index 0000000..4cb07a7 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/profile.h @@ -0,0 +1,131 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#ifndef PROFILE_H +#define PROFILE_H 1 + +#include +#include "xil_types.h" +#include "profile_config.h" + +#ifdef PROC_MICROBLAZE +#include "mblaze_nt_types.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +void _system_init( void ) ; +void _system_clean( void ) ; +void mcount(u32 frompc, u32 selfpc); +void profile_intr_handler( void ) ; +void _profile_init( 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 u16 + +struct tostruct { + u32 selfpc; + s32 count; + s16 link; + u16 pad; +}; + +struct fromstruct { + u32 frompc ; + s16 link ; + u16 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 { + s32 state; + + /* Histogram Information */ + u16 *kcount; /* No. of bins in histogram */ + u32 kcountsize; /* Histogram samples */ + + /* Call-graph Information */ + struct fromstruct *froms; + u32 fromssize; + struct tostruct *tos; + u32 tossize; + + /* Initialization I/Ps */ + u32 lowpc; + u32 highpc; + u32 textsize; + /* u32 cg_froms, */ + /* u32 cg_tos, */ +}; +extern struct gmonparam *_gmonparam; +extern s32 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/sleep.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/sleep.h new file mode 100644 index 0000000..f53b2d8 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/sleep.h @@ -0,0 +1,119 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/*****************************************************************************/ +/** +* @file sleep.h +* +* This header file contains ARM Cortex A53,A9,R5,Microblaze specific sleep +* related APIs. +* +*
    +* MODIFICATION HISTORY :
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 6.6   srm  11/02/17 Added processor specific sleep rountines
    +*								 function prototypes.
    +*
    +* 
    +* +******************************************************************************/ + +#ifndef SLEEP_H +#define SLEEP_H + +#include "xil_types.h" +#include "xil_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*****************************************************************************/ +/** +* +* This macro polls an address periodically until a condition is met or till the +* timeout occurs. +* The minimum timeout for calling this macro is 100us. If the timeout is less +* than 100us, it still waits for 100us. Also the unit for the timeout is 100us. +* If the timeout is not a multiple of 100us, it waits for a timeout of +* the next usec value which is a multiple of 100us. +* +* @param IO_func - accessor function to read the register contents. +* Depends on the register width. +* @param ADDR - Address to be polled +* @param VALUE - variable to read the value +* @param COND - Condition to checked (usually involves VALUE) +* @param TIMEOUT_US - timeout in micro seconds +* +* @return 0 - when the condition is met +* -1 - when the condition is not met till the timeout period +* +* @note none +* +*****************************************************************************/ +#define Xil_poll_timeout(IO_func, ADDR, VALUE, COND, TIMEOUT_US) \ + ( { \ + u64 timeout = TIMEOUT_US/100; \ + if(TIMEOUT_US%100!=0) \ + timeout++; \ + for(;;) { \ + VALUE = IO_func(ADDR); \ + if(COND) \ + break; \ + else { \ + usleep(100); \ + timeout--; \ + if(timeout==0) \ + break; \ + } \ + } \ + (timeout>0) ? 0 : -1; \ + } ) + +void usleep(unsigned long useconds); +void sleep(unsigned int seconds); +int usleep_R5(unsigned long useconds); +unsigned sleep_R5(unsigned int seconds); +int usleep_MB(unsigned long useconds); +unsigned sleep_MB(unsigned int seconds); +int usleep_A53(unsigned long useconds); +unsigned sleep_A53(unsigned int seconds); +int usleep_A9(unsigned long useconds); +unsigned sleep_A9(unsigned int seconds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/smc.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/smc.h new file mode 100644 index 0000000..5a4d336 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/smc.h @@ -0,0 +1,114 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file smc.h +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- ---------------------------------------------------
    +* 1.00a sdm  11/03/09 Initial release.
    +* 4.2	pkp	 08/04/14 Removed function definition of XSmc_NorInit and XSmc_NorInit
    +*					  as smc.c is removed
    +* 
    +* +* @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 0x000U /* Controller status reg, RO */ +#define XSMCPSS_MC_INTERFACE_CONFIG 0x004U /* Interface config reg, RO */ +#define XSMCPSS_MC_SET_CONFIG 0x008U /* Set configuration reg, WO */ +#define XSMCPSS_MC_CLR_CONFIG 0x00CU /* Clear config reg, WO */ +#define XSMCPSS_MC_DIRECT_CMD 0x010U /* Direct command reg, WO */ +#define XSMCPSS_MC_SET_CYCLES 0x014U /* Set cycles register, WO */ +#define XSMCPSS_MC_SET_OPMODE 0x018U /* Set opmode register, WO */ +#define XSMCPSS_MC_REFRESH_PERIOD_0 0x020U /* Refresh period_0 reg, RW */ +#define XSMCPSS_MC_REFRESH_PERIOD_1 0x024U /* Refresh period_1 reg, RW */ + +/* Chip select configuration register offset */ +#define XSMCPSS_CS_IF0_CHIP_0_OFFSET 0x100U /* Interface 0 chip 0 config */ +#define XSMCPSS_CS_IF0_CHIP_1_OFFSET 0x120U /* Interface 0 chip 1 config */ +#define XSMCPSS_CS_IF0_CHIP_2_OFFSET 0x140U /* Interface 0 chip 2 config */ +#define XSMCPSS_CS_IF0_CHIP_3_OFFSET 0x160U /* Interface 0 chip 3 config */ +#define XSMCPSS_CS_IF1_CHIP_0_OFFSET 0x180U /* Interface 1 chip 0 config */ +#define XSMCPSS_CS_IF1_CHIP_1_OFFSET 0x1A0U /* Interface 1 chip 1 config */ +#define XSMCPSS_CS_IF1_CHIP_2_OFFSET 0x1C0U /* Interface 1 chip 2 config */ +#define XSMCPSS_CS_IF1_CHIP_3_OFFSET 0x1E0U /* Interface 1 chip 3 config */ + +/* User configuration register offset */ +#define XSMCPSS_UC_STATUS_OFFSET 0x200U /* User status reg, RO */ +#define XSMCPSS_UC_CONFIG_OFFSET 0x204U /* User config reg, WO */ + +/* Integration test register offset */ +#define XSMCPSS_IT_OFFSET 0xE00U + +/* ID configuration register offset */ +#define XSMCPSS_ID_PERIP_0_OFFSET 0xFE0U +#define XSMCPSS_ID_PERIP_1_OFFSET 0xFE4U +#define XSMCPSS_ID_PERIP_2_OFFSET 0xFE8U +#define XSMCPSS_ID_PERIP_3_OFFSET 0xFECU +#define XSMCPSS_ID_PCELL_0_OFFSET 0xFF0U +#define XSMCPSS_ID_PCELL_1_OFFSET 0xFF4U +#define XSMCPSS_ID_PCELL_2_OFFSET 0xFF8U +#define XSMCPSS_ID_PCELL_3_OFFSET 0xFFCU + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SMC_H */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/vectors.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/vectors.h new file mode 100644 index 0000000..bb599b5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/vectors.h @@ -0,0 +1,88 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file vectors.h +* +* This file contains the C level vector prototypes for the ARM Cortex A9 core. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- ---------------------------------------------------
    +* 1.00a ecm  10/20/10 Initial version, moved over from bsp area
    +* 6.0   mus  07/27/16 Consolidated vectors for a9,a53 and r5 processors
    +* 
    +* +* @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); +#if !defined (__aarch64__) +void SWInterrupt(void); +void DataAbortInterrupt(void); +void PrefetchAbortInterrupt(void); +void UndefinedException(void); +#else +void SynchronousInterrupt(void); +void SErrorInterrupt(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xadcps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xadcps.h new file mode 100644 index 0000000..549bfff --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xadcps.h @@ -0,0 +1,591 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps.h +* @addtogroup xadcps_v2_2 +* @{ +* @details +* +* 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. +* +* +* XADC Channel Sequencer Modes +* +* The XADC Channel Sequencer supports the following operating modes: +* +* - Default : 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. +* - One pass through sequence : In this mode the XADC +* converts the channels enabled in the Sequencer Channel Enable +* registers for a single pass and then stops. +* - Continuous cycling of sequence : In this mode the XADC +* converts the channels enabled in the Sequencer Channel Enable +* registers continuously. +* - Single channel mode: 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. +* - Simultaneous Sampling Mode: In this mode the XADC Channel +* Sequencer will automatically sequence through eight fixed pairs +* of auxiliary analog input channels for simulataneous conversion. +* - Independent ADC mode: 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. +* +* Initialization and Configuration +* +* 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. +* +* +* Interrupts +* +* 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. +* +* +* Virtual Memory +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* +* Asserts +* +* 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. +* +* +* Building the driver +* +* 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. +* +* Limitations of the driver +* +* 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. +* +*

    +* +*
    +*
    +* 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
    +* 1.03a bss    11/01/13 Modified xadcps_hw.h to use correct Register offsets
    +*			CR#749687
    +* 2.1   bss    08/05/14 Added declarations for XAdcPs_SetSequencerEvent,
    +*			XAdcPs_GetSamplingMode, XAdcPs_SetMuxMode,
    +*			XAdcPs_SetPowerdownMode and XAdcPs_GetPowerdownMode
    +*			functions.
    +*			Modified Assert for XAdcPs_SetSingleChParams in
    +*			xadcps.c to fix CR #807563.
    +* 2.2   bss    04/27/14 Modified to use correct Device Config base address in
    +*						xadcps.c (CR#854437).
    +*       ms     01/23/17 Added xil_printf statement in main function for all
    +*                       examples to ensure that "Successfully ran" and "Failed"
    +*                       strings are available in all examples. This is a fix
    +*                       for CR-965028.
    +*       ms     03/17/17 Added readme.txt file in examples folder for doxygen
    +*                       generation.
    +*       ms     04/05/17 Modified Comment lines in functions of xadcps
    +*                       examples to recognize it as documentation block
    +*                       for doxygen generation.
    +*
    +* 
    +* +*****************************************************************************/ +#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); + +void XAdcPs_SetSequencerEvent(XAdcPs *InstancePtr, int IsEventMode); + +int XAdcPs_GetSamplingMode(XAdcPs *InstancePtr); + +void XAdcPs_SetMuxMode(XAdcPs *InstancePtr, int MuxMode, u8 Channel); + +void XAdcPs_SetPowerdownMode(XAdcPs *InstancePtr, u32 Mode); + +u32 XAdcPs_GetPowerdownMode(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xadcps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xadcps_hw.h new file mode 100644 index 0000000..55a47a4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xadcps_hw.h @@ -0,0 +1,502 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps_hw.h +* @addtogroup xadcps_v2_2 +* @{ +* +* 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. +* +* +*
    +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- -----  -------- -----------------------------------------------------
    +* 1.00a bss    12/22/11 First release based on the XPS/AXI xadc driver
    +* 1.03a bss    11/01/13 Modified macros to use correct Register offsets
    +*			CR#749687
    +*
    +* 
    +* +*****************************************************************************/ +#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 0x00 /**< Configuration Register */ +#define XADCPS_INT_STS_OFFSET 0x04 /**< Interrupt Status Register */ +#define XADCPS_INT_MASK_OFFSET 0x08 /**< Interrupt Mask Register */ +#define XADCPS_MSTS_OFFSET 0x0C /**< Misc status register */ +#define XADCPS_CMDFIFO_OFFSET 0x10 /**< Command FIFO Register */ +#define XADCPS_RDFIFO_OFFSET 0x14 /**< Read FIFO Register */ +#define XADCPS_MCTL_OFFSET 0x18 /**< 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 /** +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a adk 1/31/14 Added in bsp common folder for backward compatibility +* +* +******************************************************************************/ + +#ifndef XBASIC_TYPES_H /* prevent circular inclusions */ +#define XBASIC_TYPES_H /* by using protection macros */ + +/** @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 +#endif + +#ifndef TRUE +# define TRUE 1U +#endif + +#ifndef FALSE +# define FALSE 0U +#endif + +#ifndef NULL +#define NULL 0U +#endif + +/* + * Xilinx NULL, TRUE and FALSE legacy support. Deprecated. + * Please use NULL, TRUE and FALSE + */ +#define XNULL NULL +#define XTRUE TRUE +#define XFALSE FALSE + +/* + * This file is deprecated and users + * should use xil_types.h and xil_assert.h\n\r + */ +#warning The xbasics_type.h file is deprecated and users should use xil_types.h and xil_assert. +#warning Please refer the Standalone BSP UG647 for further details + + +#endif /* end of protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcanps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcanps.h new file mode 100644 index 0000000..9feb45e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcanps.h @@ -0,0 +1,577 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcanps.h +* @addtogroup canps_v3_2 +* @{ +* @details +* +* The Xilinx CAN driver component. This component supports the Xilinx +* CAN Controller. +* +* The CAN Controller supports the following features: +* - Confirms to the ISO 11898-1, CAN 2.0A and CAN 2.0B standards. +* - Supports both Standard (11 bit Identifier) and Extended (29 bit +* Identifier) frames. +* - Supports Bit Rates up to 1 Mbps. +* - Transmit message object FIFO with a user configurable depth of +* up to 64 message objects. +* - Transmit prioritization through one TX High Priority Buffer. +* - Receive message object FIFO with a user configurable depth of +* up to 64 message objects. +* - Watermark interrupts for Rx FIFO with configurable Watermark. +* - Acceptance filtering with 4 acceptance filters. +* - Sleep mode with automatic wake up. +* - Loop Back mode for diagnostic applications. +* - Snoop mode for diagnostic applications. +* - Maskable Error and Status Interrupts. +* - Readable Error Counters. +* - External PHY chip required. +* - Receive Timestamp. +* +* The device driver supports all the features listed above, if applicable. +* +* Driver Description +* +* The device driver enables higher layer software (e.g., an application) to +* communicate to the CAN. The driver handles transmission and reception of +* CAN frames, as well as configuration of the controller. The driver is simply a +* pass-through mechanism between a protocol stack and the CAN. A single device +* driver can support multiple CANs. +* +* Since the driver is a simple pass-through mechanism between a protocol stack +* and the CAN, no assembly or disassembly of CAN frames is done at the +* driver-level. This assumes that the protocol stack passes a correctly +* formatted CAN frame to the driver for transmission, and that the driver +* does not validate the contents of an incoming frame +* +* Operation Modes +* +* The CAN controller supports the following modes of operation: +* - Configuration Mode: In this mode the CAN timing parameters and +* Baud Rate Pre-scalar parameters can be changed. In this mode the CAN +* controller loses synchronization with the CAN bus and drives a +* constant recessive bit on the bus line. The Error Counter Register are +* reset. The CAN controller does not receive or transmit any messages +* even if there are pending transmit requests from the TX FIFO or the TX +* High Priority Buffer. The Storage FIFOs and the CAN configuration +* registers are still accessible. +* - Normal Mode:In Normal Mode the CAN controller participates in bus +* communication, by transmitting and receiving messages. +* - Sleep Mode: In Sleep Mode the CAN Controller does not transmit any +* messages. However, if any other node transmits a message, then the CAN +* Controller receives the transmitted message and exits from Sleep Mode. +* If there are new transmission requests from either the TX FIFO or the +* TX High Priority Buffer when the CAN Controller is in Sleep Mode, these +* requests are not serviced, and the CAN Controller continues to remain +* in Sleep Mode. Interrupts are generated when the CAN controller enters +* Sleep mode or Wakes up from Sleep mode. +* - Loop Back Mode: In Loop Back mode, the CAN controller transmits a +* recessive bit stream on to the CAN Bus. Any message that is transmitted +* is looped back to the �Rx� line and acknowledged. The CAN controller +* thus receives any message that it transmits. It does not participate in +* normal bus communication and does not receive any messages that are +* transmitted by other CAN nodes. This mode is used for diagnostic +* purposes. +* - Snoop Mode: In Snoop mode, the CAN controller transmits a +* recessive bit stream on to the CAN Bus and does not participate +* in normal bus communication but receives messages that are transmitted +* by other CAN nodes. This mode is used for diagnostic purposes. +* +* +* Buffer Alignment +* +* It is important to note that frame buffers passed to the driver must be +* 32-bit aligned. +* +* Receive Address Filtering +* +* The device can be set to accept frames whose Identifiers match any of the +* 4 filters set in the Acceptance Filter Mask/ID registers. +* +* The incoming Identifier is masked with the bits in the Acceptance Filter Mask +* Register. This value is compared with the result of masking the bits in the +* Acceptance Filter ID Register with the Acceptance Filter Mask Register. If +* both these values are equal, the message will be stored in the RX FIFO. +* +* Acceptance Filtering is performed by each of the defined acceptance filters. +* If the incoming identifier passes through any acceptance filter then the +* frame is stored in the RX FIFO. +* +* If the Accpetance Filters are not set up then all the received messages are +* stroed in the RX FIFO. +* +* PHY Communication +* +* This driver does not provide any mechanism for directly programming PHY. +* +* Interrupts +* +* The driver has no dependencies on the interrupt controller. The driver +* provides an interrupt handler. User of this driver needs to provide +* callback functions. An interrupt handler example is available with +* the driver. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Device Reset +* +* Bus Off interrupt that can occur in the device requires a device reset. +* The user is responsible for resetting the device and re-configuring it +* based on its needs (the driver does not save the current configuration). +* When integrating into an RTOS, these reset and re-configure obligations are +* taken care of by the OS adapter software if it exists for that RTOS. +* +* Device Configuration +* +* The device can be configured in various ways during the FPGA implementation +* process. Configuration parameters are stored in the xcanps_g.c files. +* A table is defined where each entry contains configuration information +* for a CAN device. This information includes such things as the base address +* of the memory-mapped device. +* +* Asserts +* +* 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. +* +* Building the driver +* +* The XCanPs driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +*

    +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00a xd/sv  01/12/10 First release
    +* 1.01a bss    12/27/11 Added the APIs XCanPs_SetTxIntrWatermark and
    +* 			XCanPs_GetTxIntrWatermark.
    +*			Updated the Register/bit definitions
    +*                       Changed XCANPS_RXFWIR_RXFLL_MASK to XCANPS_WIR_FW_MASK
    +*                       Changed XCANPS_RXWIR_OFFSET to XCANPS_WIR_OFFSET
    +*			Added XCANPS_IXR_TXFEMP_MASK for Tx Fifo Empty
    +*			Changed XCANPS_IXR_RXFLL_MASK to
    +*			XCANPS_IXR_RXFWMFLL_MASK
    +* 			Changed
    +*			XCANPS_TXBUF_ID_OFFSET to XCANPS_TXHPB_ID_OFFSET
    +* 			XCANPS_TXBUF_DLC_OFFSET to XCANPS_TXHPB_DLC_OFFSET
    +*			XCANPS_TXBUF_DW1_OFFSET to XCANPS_TXHPB_DW1_OFFSET
    +*			XCANPS_TXBUF_DW2_OFFSET to XCANPS_TXHPB_DW2_OFFSET
    +* 2.1 adk 		23/08/14 Fixed CR:798792 Peripheral test for CANPS IP in
    +*			SDK claims a 40kbps baud rate but it's not.
    +* 3.0 adk     09/12/14  Added support for Zynq Ultrascale Mp.Also code
    +*			modified for MISRA-C:2012 compliance.
    +* 3.1 adk     10/11/15  Fixed CR#911958 Add support for Tx Watermark example.
    +*			Data mismatch while sending data less than 8 bytes.
    +* 3.1 nsk     12/21/15  Updated XCanPs_IntrHandler in xcanps_intr.c to handle
    +*			error interrupts correctly. CR#925615
    +*     ms      03/17/17  Added readme.txt file in examples folder for doxygen
    +*                       generation.
    +* 
    +* +******************************************************************************/ +#ifndef XCANPS_H /* prevent circular inclusions */ +#define XCANPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xcanps_hw.h" +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + +/** @name CAN operation modes + * @{ + */ +#define XCANPS_MODE_CONFIG 0x00000001U /**< Configuration mode */ +#define XCANPS_MODE_NORMAL 0x00000002U /**< Normal mode */ +#define XCANPS_MODE_LOOPBACK 0x00000004U /**< Loop Back mode */ +#define XCANPS_MODE_SLEEP 0x00000008U /**< Sleep mode */ +#define XCANPS_MODE_SNOOP 0x00000010U /**< Snoop mode */ +/* @} */ + +/** @name Callback identifiers used as parameters to XCanPs_SetHandler() + * @{ + */ +#define XCANPS_HANDLER_SEND 1U /**< Handler type for frame sending interrupt */ +#define XCANPS_HANDLER_RECV 2U /**< Handler type for frame reception interrupt*/ +#define XCANPS_HANDLER_ERROR 3U /**< Handler type for error interrupt */ +#define XCANPS_HANDLER_EVENT 4U /**< Handler type for all other interrupts */ +/* @} */ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for a device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Register base address */ +} XCanPs_Config; + +/******************************************************************************/ +/** + * Callback type for frame sending and reception interrupts. + * + * @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. +*******************************************************************************/ +typedef void (*XCanPs_SendRecvHandler) (void *CallBackRef); + +/******************************************************************************/ +/** + * Callback type for error interrupt. + * + * @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. + * @param ErrorMask is a bit mask indicating the cause of the error. Its + * value equals 'OR'ing one or more XCANPS_ESR_* values defined in + * xcanps_hw.h +*******************************************************************************/ +typedef void (*XCanPs_ErrorHandler) (void *CallBackRef, u32 ErrorMask); + +/******************************************************************************/ +/** + * Callback type for all kinds of interrupts except sending frame interrupt, + * receiving frame interrupt, and error interrupt. + * + * @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. + * @param Mask is a bit mask indicating the pending interrupts. Its value + * equals 'OR'ing one or more XCANPS_IXR_* defined in xcanps_hw.h +*******************************************************************************/ +typedef void (*XCanPs_EventHandler) (void *CallBackRef, u32 Mask); + +/** + * The XCanPs driver instance data. The user is required to allocate a + * variable of this type for every CAN device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XCanPs_Config CanConfig; /**< Device configuration */ + u32 IsReady; /**< Device is initialized and ready */ + + /** + * Callback and callback reference for TXOK interrupt. + */ + XCanPs_SendRecvHandler SendHandler; + void *SendRef; + + /** + * Callback and callback reference for RXOK/RXNEMP/RXFLL interrupts. + */ + XCanPs_SendRecvHandler RecvHandler; + void *RecvRef; + + /** + * Callback and callback reference for ERROR interrupt. + */ + XCanPs_ErrorHandler ErrorHandler; + void *ErrorRef; + + /** + * Callback and callback reference for RXOFLW/RXUFLW/TXBFLL/TXFLL/ + * Wakeup/Sleep/Bus off/ARBLST interrupts. + */ + XCanPs_EventHandler EventHandler; + void *EventRef; + +} XCanPs; + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* This macro checks if the transmission is complete. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if the transmission is done. +* - FALSE if the transmission is not done. +* +* @note C-Style signature: +* int XCanPs_IsTxDone(XCanPs *InstancePtr) +* +*******************************************************************************/ +#define XCanPs_IsTxDone(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_ISR_OFFSET) & XCANPS_IXR_TXOK_MASK) != (u32)0) ? TRUE : FALSE) + + +/****************************************************************************/ +/** +* +* This macro checks if the transmission FIFO is full. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if TX FIFO is full. +* - FALSE if the TX FIFO is NOT full. +* +* @note C-Style signature: +* int XCanPs_IsTxFifoFull(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_IsTxFifoFull(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_SR_OFFSET) & XCANPS_SR_TXFLL_MASK) != (u32)0) ? TRUE : FALSE) + + +/****************************************************************************/ +/** +* +* This macro checks if the Transmission High Priority Buffer is full. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if the TX High Priority Buffer is full. +* - FALSE if the TX High Priority Buffer is NOT full. +* +* @note C-Style signature: +* int XCanPs_IsHighPriorityBufFull(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_IsHighPriorityBufFull(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_SR_OFFSET) & XCANPS_SR_TXBFLL_MASK) != (u32)0) ? TRUE : FALSE) + + +/****************************************************************************/ +/** +* +* This macro checks if the receive FIFO is empty. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if RX FIFO is empty. +* - FALSE if the RX FIFO is NOT empty. +* +* @note C-Style signature: +* int XCanPs_IsRxEmpty(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_IsRxEmpty(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_ISR_OFFSET) & XCANPS_IXR_RXNEMP_MASK) != (u32)0) ? FALSE : TRUE) + + +/****************************************************************************/ +/** +* +* This macro checks if the CAN device is ready for the driver to change +* Acceptance Filter Identifier Registers (AFIR) and Acceptance Filter Mask +* Registers (AFMR). +* +* AFIR and AFMR for a filter are changeable only after the filter is disabled +* and this routine returns FALSE. The filter can be disabled using the +* XCanPs_AcceptFilterDisable function. +* +* Use the XCanPs_Accept_* functions for configuring the acceptance filters. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if the device is busy and NOT ready to accept writes to +* AFIR and AFMR. +* - FALSE if the device is ready to accept writes to AFIR and +* AFMR. +* +* @note C-Style signature: +* int XCanPs_IsAcceptFilterBusy(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_IsAcceptFilterBusy(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_SR_OFFSET) & XCANPS_SR_ACFBSY_MASK) != (u32)0) ? TRUE : FALSE) + + +/****************************************************************************/ +/** +* +* This macro calculates CAN message identifier value given identifier field +* values. +* +* @param StandardId contains Standard Message ID value. +* @param SubRemoteTransReq contains Substitute Remote Transmission +* Request value. +* @param IdExtension contains Identifier Extension value. +* @param ExtendedId contains Extended Message ID value. +* @param RemoteTransReq contains Remote Transmission Request value. +* +* @return Message Identifier value. +* +* @note C-Style signature: +* u32 XCanPs_CreateIdValue(u32 StandardId, +* u32 SubRemoteTransReq, +* u32 IdExtension, u32 ExtendedId, +* u32 RemoteTransReq) +* +* Read the CAN specification for meaning of each parameter. +* +*****************************************************************************/ +#define XCanPs_CreateIdValue(StandardId, SubRemoteTransReq, IdExtension, \ + ExtendedId, RemoteTransReq) \ + ((((StandardId) << XCANPS_IDR_ID1_SHIFT) & XCANPS_IDR_ID1_MASK) | \ + (((SubRemoteTransReq) << XCANPS_IDR_SRR_SHIFT) & XCANPS_IDR_SRR_MASK)|\ + (((IdExtension) << XCANPS_IDR_IDE_SHIFT) & XCANPS_IDR_IDE_MASK) | \ + (((ExtendedId) << XCANPS_IDR_ID2_SHIFT) & XCANPS_IDR_ID2_MASK) | \ + ((RemoteTransReq) & XCANPS_IDR_RTR_MASK)) + + +/****************************************************************************/ +/** +* +* This macro calculates value for Data Length Code register given Data +* Length Code value. +* +* @param DataLengCode indicates Data Length Code value. +* +* @return Value that can be assigned to Data Length Code register. +* +* @note C-Style signature: +* u32 XCanPs_CreateDlcValue(u32 DataLengCode) +* +* Read the CAN specification for meaning of Data Length Code. +* +*****************************************************************************/ +#define XCanPs_CreateDlcValue(DataLengCode) \ + (((DataLengCode) << XCANPS_DLCR_DLC_SHIFT) & XCANPS_DLCR_DLC_MASK) + + +/****************************************************************************/ +/** +* +* This macro clears the timestamp in the Timestamp Control Register. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XCanPs_ClearTimestamp(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_ClearTimestamp(InstancePtr) \ + XCanPs_WriteReg((InstancePtr)->CanConfig.BaseAddr, \ + XCANPS_TCR_OFFSET, XCANPS_TCR_CTS_MASK) + +/************************** Function Prototypes ******************************/ + +/* + * Functions in xcanps.c + */ +s32 XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr, + u32 EffectiveAddr); + +void XCanPs_Reset(XCanPs *InstancePtr); +u8 XCanPs_GetMode(XCanPs *InstancePtr); +void XCanPs_EnterMode(XCanPs *InstancePtr, u8 OperationMode); +u32 XCanPs_GetStatus(XCanPs *InstancePtr); +void XCanPs_GetBusErrorCounter(XCanPs *InstancePtr, u8 *RxErrorCount, + u8 *TxErrorCount); +u32 XCanPs_GetBusErrorStatus(XCanPs *InstancePtr); +void XCanPs_ClearBusErrorStatus(XCanPs *InstancePtr, u32 Mask); +s32 XCanPs_Send(XCanPs *InstancePtr, u32 *FramePtr); +s32 XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr); +s32 XCanPs_SendHighPriority(XCanPs *InstancePtr, u32 *FramePtr); +void XCanPs_AcceptFilterEnable(XCanPs *InstancePtr, u32 FilterIndexes); +void XCanPs_AcceptFilterDisable(XCanPs *InstancePtr, u32 FilterIndexes); +u32 XCanPs_AcceptFilterGetEnabled(XCanPs *InstancePtr); +s32 XCanPs_AcceptFilterSet(XCanPs *InstancePtr, u32 FilterIndex, + u32 MaskValue, u32 IdValue); +void XCanPs_AcceptFilterGet(XCanPs *InstancePtr, u32 FilterIndex, + u32 *MaskValue, u32 *IdValue); + +s32 XCanPs_SetBaudRatePrescaler(XCanPs *InstancePtr, u8 Prescaler); +u8 XCanPs_GetBaudRatePrescaler(XCanPs *InstancePtr); +s32 XCanPs_SetBitTiming(XCanPs *InstancePtr, u8 SyncJumpWidth, + u8 TimeSegment2, u8 TimeSegment1); +void XCanPs_GetBitTiming(XCanPs *InstancePtr, u8 *SyncJumpWidth, + u8 *TimeSegment2, u8 *TimeSegment1); + +s32 XCanPs_SetRxIntrWatermark(XCanPs *InstancePtr, u8 Threshold); +u8 XCanPs_GetRxIntrWatermark(XCanPs *InstancePtr); +s32 XCanPs_SetTxIntrWatermark(XCanPs *InstancePtr, u8 Threshold); +u8 XCanPs_GetTxIntrWatermark(XCanPs *InstancePtr); + +/* + * Diagnostic functions in xcanps_selftest.c + */ +s32 XCanPs_SelfTest(XCanPs *InstancePtr); + +/* + * Functions in xcanps_intr.c + */ +void XCanPs_IntrEnable(XCanPs *InstancePtr, u32 Mask); +void XCanPs_IntrDisable(XCanPs *InstancePtr, u32 Mask); +u32 XCanPs_IntrGetEnabled(XCanPs *InstancePtr); +u32 XCanPs_IntrGetStatus(XCanPs *InstancePtr); +void XCanPs_IntrClear(XCanPs *InstancePtr, u32 Mask); +void XCanPs_IntrHandler(void *InstancePtr); +s32 XCanPs_SetHandler(XCanPs *InstancePtr, u32 HandlerType, + void *CallBackFunc, void *CallBackRef); + +/* + * Functions in xcanps_sinit.c + */ +XCanPs_Config *XCanPs_LookupConfig(u16 DeviceId); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcanps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcanps_hw.h new file mode 100644 index 0000000..30ec68a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcanps_hw.h @@ -0,0 +1,369 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcanps_hw.h +* @addtogroup canps_v3_2 +* @{ +* +* 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 xcanps.h. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00a xd/sv  01/12/10 First release
    +* 1.01a sbs    12/27/11 Updated the Register/bit definitions
    +*                       Changed XCANPS_RXFWIR_RXFLL_MASK to XCANPS_WIR_FW_MASK
    +*                       Changed XCANPS_RXWIR_OFFSET to XCANPS_WIR_OFFSET
    +*			Added XCANPS_IXR_TXFEMP_MASK for Tx Fifo Empty
    +*			Changed XCANPS_IXR_RXFLL_MASK to
    +*			XCANPS_IXR_RXFWMFLL_MASK
    +* 			Changed
    +*			XCANPS_TXBUF_ID_OFFSET to XCANPS_TXHPB_ID_OFFSET
    +* 			XCANPS_TXBUF_DLC_OFFSET to XCANPS_TXHPB_DLC_OFFSET
    +*			XCANPS_TXBUF_DW1_OFFSET  to XCANPS_TXHPB_DW1_OFFSET
    +*			XCANPS_TXBUF_DW2_OFFSET  to XCANPS_TXHPB_DW2_OFFSET
    +* 1.02a adk   08/08/13  Updated for inclding the function prototype
    +* 3.00  kvn   02/13/15  Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +#ifndef XCANPS_HW_H /* prevent circular inclusions */ +#define XCANPS_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 for the CAN. Each register is 32 bits. + * @{ + */ +#define XCANPS_SRR_OFFSET 0x00000000U /**< Software Reset Register */ +#define XCANPS_MSR_OFFSET 0x00000004U /**< Mode Select Register */ +#define XCANPS_BRPR_OFFSET 0x00000008U /**< Baud Rate Prescaler */ +#define XCANPS_BTR_OFFSET 0x0000000CU /**< Bit Timing Register */ +#define XCANPS_ECR_OFFSET 0x00000010U /**< Error Counter Register */ +#define XCANPS_ESR_OFFSET 0x00000014U /**< Error Status Register */ +#define XCANPS_SR_OFFSET 0x00000018U /**< Status Register */ + +#define XCANPS_ISR_OFFSET 0x0000001CU /**< Interrupt Status Register */ +#define XCANPS_IER_OFFSET 0x00000020U /**< Interrupt Enable Register */ +#define XCANPS_ICR_OFFSET 0x00000024U /**< Interrupt Clear Register */ +#define XCANPS_TCR_OFFSET 0x00000028U /**< Timestamp Control Register */ +#define XCANPS_WIR_OFFSET 0x0000002CU /**< Watermark Interrupt Reg */ + +#define XCANPS_TXFIFO_ID_OFFSET 0x00000030U /**< TX FIFO ID */ +#define XCANPS_TXFIFO_DLC_OFFSET 0x00000034U /**< TX FIFO DLC */ +#define XCANPS_TXFIFO_DW1_OFFSET 0x00000038U /**< TX FIFO Data Word 1 */ +#define XCANPS_TXFIFO_DW2_OFFSET 0x0000003CU /**< TX FIFO Data Word 2 */ + +#define XCANPS_TXHPB_ID_OFFSET 0x00000040U /**< TX High Priority Buffer ID */ +#define XCANPS_TXHPB_DLC_OFFSET 0x00000044U /**< TX High Priority Buffer DLC */ +#define XCANPS_TXHPB_DW1_OFFSET 0x00000048U /**< TX High Priority Buf Data 1 */ +#define XCANPS_TXHPB_DW2_OFFSET 0x0000004CU /**< TX High Priority Buf Data Word 2 */ + +#define XCANPS_RXFIFO_ID_OFFSET 0x00000050U /**< RX FIFO ID */ +#define XCANPS_RXFIFO_DLC_OFFSET 0x00000054U /**< RX FIFO DLC */ +#define XCANPS_RXFIFO_DW1_OFFSET 0x00000058U /**< RX FIFO Data Word 1 */ +#define XCANPS_RXFIFO_DW2_OFFSET 0x0000005CU /**< RX FIFO Data Word 2 */ + +#define XCANPS_AFR_OFFSET 0x00000060U /**< Acceptance Filter Register */ +#define XCANPS_AFMR1_OFFSET 0x00000064U /**< Acceptance Filter Mask 1 */ +#define XCANPS_AFIR1_OFFSET 0x00000068U /**< Acceptance Filter ID 1 */ +#define XCANPS_AFMR2_OFFSET 0x0000006CU /**< Acceptance Filter Mask 2 */ +#define XCANPS_AFIR2_OFFSET 0x00000070U /**< Acceptance Filter ID 2 */ +#define XCANPS_AFMR3_OFFSET 0x00000074U /**< Acceptance Filter Mask 3 */ +#define XCANPS_AFIR3_OFFSET 0x00000078U /**< Acceptance Filter ID 3 */ +#define XCANPS_AFMR4_OFFSET 0x0000007CU /**< Acceptance Filter Mask 4 */ +#define XCANPS_AFIR4_OFFSET 0x00000080U /**< Acceptance Filter ID 4 */ +/* @} */ + +/** @name Software Reset Register (SRR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_SRR_CEN_MASK 0x00000002U /**< Can Enable */ +#define XCANPS_SRR_SRST_MASK 0x00000001U /**< Reset */ +/* @} */ + +/** @name Mode Select Register (MSR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_MSR_SNOOP_MASK 0x00000004U /**< Snoop Mode Select */ +#define XCANPS_MSR_LBACK_MASK 0x00000002U /**< Loop Back Mode Select */ +#define XCANPS_MSR_SLEEP_MASK 0x00000001U /**< Sleep Mode Select */ +/* @} */ + +/** @name Baud Rate Prescaler register (BRPR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_BRPR_BRP_MASK 0x000000FFU /**< Baud Rate Prescaler */ +/* @} */ + +/** @name Bit Timing Register (BTR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_BTR_SJW_MASK 0x00000180U /**< Synchronization Jump Width */ +#define XCANPS_BTR_SJW_SHIFT 7U +#define XCANPS_BTR_TS2_MASK 0x00000070U /**< Time Segment 2 */ +#define XCANPS_BTR_TS2_SHIFT 4U +#define XCANPS_BTR_TS1_MASK 0x0000000FU /**< Time Segment 1 */ +/* @} */ + +/** @name Error Counter Register (ECR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_ECR_REC_MASK 0x0000FF00U /**< Receive Error Counter */ +#define XCANPS_ECR_REC_SHIFT 8U +#define XCANPS_ECR_TEC_MASK 0x000000FFU /**< Transmit Error Counter */ +/* @} */ + +/** @name Error Status Register (ESR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_ESR_ACKER_MASK 0x00000010U /**< ACK Error */ +#define XCANPS_ESR_BERR_MASK 0x00000008U /**< Bit Error */ +#define XCANPS_ESR_STER_MASK 0x00000004U /**< Stuff Error */ +#define XCANPS_ESR_FMER_MASK 0x00000002U /**< Form Error */ +#define XCANPS_ESR_CRCER_MASK 0x00000001U /**< CRC Error */ +/* @} */ + +/** @name Status Register (SR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_SR_SNOOP_MASK 0x00001000U /**< Snoop Mask */ +#define XCANPS_SR_ACFBSY_MASK 0x00000800U /**< Acceptance Filter busy */ +#define XCANPS_SR_TXFLL_MASK 0x00000400U /**< TX FIFO is full */ +#define XCANPS_SR_TXBFLL_MASK 0x00000200U /**< TX High Priority Buffer full */ +#define XCANPS_SR_ESTAT_MASK 0x00000180U /**< Error Status */ +#define XCANPS_SR_ESTAT_SHIFT 7U +#define XCANPS_SR_ERRWRN_MASK 0x00000040U /**< Error Warning */ +#define XCANPS_SR_BBSY_MASK 0x00000020U /**< Bus Busy */ +#define XCANPS_SR_BIDLE_MASK 0x00000010U /**< Bus Idle */ +#define XCANPS_SR_NORMAL_MASK 0x00000008U /**< Normal Mode */ +#define XCANPS_SR_SLEEP_MASK 0x00000004U /**< Sleep Mode */ +#define XCANPS_SR_LBACK_MASK 0x00000002U /**< Loop Back Mode */ +#define XCANPS_SR_CONFIG_MASK 0x00000001U /**< Configuration Mode */ +/* @} */ + +/** @name Interrupt Status/Enable/Clear Register Bit Definitions and Masks + * @{ + */ +#define XCANPS_IXR_TXFEMP_MASK 0x00004000U /**< Tx Fifo Empty Interrupt */ +#define XCANPS_IXR_TXFWMEMP_MASK 0x00002000U /**< Tx Fifo Watermark Empty */ +#define XCANPS_IXR_RXFWMFLL_MASK 0x00001000U /**< Rx FIFO Watermark Full */ +#define XCANPS_IXR_WKUP_MASK 0x00000800U /**< Wake up Interrupt */ +#define XCANPS_IXR_SLP_MASK 0x00000400U /**< Sleep Interrupt */ +#define XCANPS_IXR_BSOFF_MASK 0x00000200U /**< Bus Off Interrupt */ +#define XCANPS_IXR_ERROR_MASK 0x00000100U /**< Error Interrupt */ +#define XCANPS_IXR_RXNEMP_MASK 0x00000080U /**< RX FIFO Not Empty Interrupt */ +#define XCANPS_IXR_RXOFLW_MASK 0x00000040U /**< RX FIFO Overflow Interrupt */ +#define XCANPS_IXR_RXUFLW_MASK 0x00000020U /**< RX FIFO Underflow Interrupt */ +#define XCANPS_IXR_RXOK_MASK 0x00000010U /**< New Message Received Intr */ +#define XCANPS_IXR_TXBFLL_MASK 0x00000008U /**< TX High Priority Buf Full */ +#define XCANPS_IXR_TXFLL_MASK 0x00000004U /**< TX FIFO Full Interrupt */ +#define XCANPS_IXR_TXOK_MASK 0x00000002U /**< TX Successful Interrupt */ +#define XCANPS_IXR_ARBLST_MASK 0x00000001U /**< Arbitration Lost Interrupt */ +#define XCANPS_IXR_ALL ((u32)XCANPS_IXR_RXFWMFLL_MASK | \ + (u32)XCANPS_IXR_WKUP_MASK | \ + (u32)XCANPS_IXR_SLP_MASK | \ + (u32)XCANPS_IXR_BSOFF_MASK | \ + (u32)XCANPS_IXR_ERROR_MASK | \ + (u32)XCANPS_IXR_RXNEMP_MASK | \ + (u32)XCANPS_IXR_RXOFLW_MASK | \ + (u32)XCANPS_IXR_RXUFLW_MASK | \ + (u32)XCANPS_IXR_RXOK_MASK | \ + (u32)XCANPS_IXR_TXBFLL_MASK | \ + (u32)XCANPS_IXR_TXFLL_MASK | \ + (u32)XCANPS_IXR_TXOK_MASK | \ + (u32)XCANPS_IXR_ARBLST_MASK) +/* @} */ + +/** @name CAN Timestamp Control Register (TCR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_TCR_CTS_MASK 0x00000001U /**< Clear Timestamp counter mask */ +/* @} */ + +/** @name CAN Watermark Register (WIR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_WIR_FW_MASK 0x0000003FU /**< Rx Full Threshold mask */ +#define XCANPS_WIR_EW_MASK 0x00003F00U /**< Tx Empty Threshold mask */ +#define XCANPS_WIR_EW_SHIFT 0x00000008U /**< Tx Empty Threshold shift */ + +/* @} */ + +/** @name CAN Frame Identifier (TX High Priority Buffer/TX/RX/Acceptance Filter + Mask/Acceptance Filter ID) + * @{ + */ +#define XCANPS_IDR_ID1_MASK 0xFFE00000U /**< Standard Messg Identifier */ +#define XCANPS_IDR_ID1_SHIFT 21U +#define XCANPS_IDR_SRR_MASK 0x00100000U /**< Substitute Remote TX Req */ +#define XCANPS_IDR_SRR_SHIFT 20U +#define XCANPS_IDR_IDE_MASK 0x00080000U /**< Identifier Extension */ +#define XCANPS_IDR_IDE_SHIFT 19U +#define XCANPS_IDR_ID2_MASK 0x0007FFFEU /**< Extended Message Ident */ +#define XCANPS_IDR_ID2_SHIFT 1U +#define XCANPS_IDR_RTR_MASK 0x00000001U /**< Remote TX Request */ +/* @} */ + +/** @name CAN Frame Data Length Code (TX High Priority Buffer/TX/RX) + * @{ + */ +#define XCANPS_DLCR_DLC_MASK 0xF0000000U /**< Data Length Code */ +#define XCANPS_DLCR_DLC_SHIFT 28U +#define XCANPS_DLCR_TIMESTAMP_MASK 0x0000FFFFU /**< Timestamp Mask (Rx only) */ + +/* @} */ + +/** @name CAN Frame Data Word 1 (TX High Priority Buffer/TX/RX) + * @{ + */ +#define XCANPS_DW1R_DB0_MASK 0xFF000000U /**< Data Byte 0 */ +#define XCANPS_DW1R_DB0_SHIFT 24U +#define XCANPS_DW1R_DB1_MASK 0x00FF0000U /**< Data Byte 1 */ +#define XCANPS_DW1R_DB1_SHIFT 16U +#define XCANPS_DW1R_DB2_MASK 0x0000FF00U /**< Data Byte 2 */ +#define XCANPS_DW1R_DB2_SHIFT 8U +#define XCANPS_DW1R_DB3_MASK 0x000000FFU /**< Data Byte 3 */ +/* @} */ + +/** @name CAN Frame Data Word 2 (TX High Priority Buffer/TX/RX) + * @{ + */ +#define XCANPS_DW2R_DB4_MASK 0xFF000000U /**< Data Byte 4 */ +#define XCANPS_DW2R_DB4_SHIFT 24U +#define XCANPS_DW2R_DB5_MASK 0x00FF0000U /**< Data Byte 5 */ +#define XCANPS_DW2R_DB5_SHIFT 16U +#define XCANPS_DW2R_DB6_MASK 0x0000FF00U /**< Data Byte 6 */ +#define XCANPS_DW2R_DB6_SHIFT 8U +#define XCANPS_DW2R_DB7_MASK 0x000000FFU /**< Data Byte 7 */ +/* @} */ + +/** @name Acceptance Filter Register (AFR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_AFR_UAF4_MASK 0x00000008U /**< Use Acceptance Filter No.4 */ +#define XCANPS_AFR_UAF3_MASK 0x00000004U /**< Use Acceptance Filter No.3 */ +#define XCANPS_AFR_UAF2_MASK 0x00000002U /**< Use Acceptance Filter No.2 */ +#define XCANPS_AFR_UAF1_MASK 0x00000001U /**< Use Acceptance Filter No.1 */ +#define XCANPS_AFR_UAF_ALL_MASK ((u32)XCANPS_AFR_UAF4_MASK | \ + (u32)XCANPS_AFR_UAF3_MASK | \ + (u32)XCANPS_AFR_UAF2_MASK | \ + (u32)XCANPS_AFR_UAF1_MASK) +/* @} */ + +/** @name CAN frame length constants + * @{ + */ +#define XCANPS_MAX_FRAME_SIZE sizeof(u32)*16U /**< Maximum CAN frame length in bytes */ +/* @} */ + +/* For backwards compatibilty */ +#define XCANPS_TXBUF_ID_OFFSET XCANPS_TXHPB_ID_OFFSET +#define XCANPS_TXBUF_DLC_OFFSET XCANPS_TXHPB_DLC_OFFSET +#define XCANPS_TXBUF_DW1_OFFSET XCANPS_TXHPB_DW1_OFFSET +#define XCANPS_TXBUF_DW2_OFFSET XCANPS_TXHPB_DW2_OFFSET + +#define XCANPS_RXFWIR_RXFLL_MASK XCANPS_WIR_FW_MASK +#define XCANPS_RXWIR_OFFSET XCANPS_WIR_OFFSET +#define XCANPS_IXR_RXFLL_MASK XCANPS_IXR_RXFWMFLL_MASK + + + + +/**************************** 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 XCanPs_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (u32)(RegOffset)) + + +/****************************************************************************/ +/** +* +* This macro writes 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 None. +* +*****************************************************************************/ +#define XCanPs_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data)) + +/************************** Function Prototypes ******************************/ +/* + * Perform reset operation to the CanPs interface + */ +void XCanPs_ResetHw(u32 BaseAddr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcoresightpsdcc.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcoresightpsdcc.h new file mode 100644 index 0000000..67959e3 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcoresightpsdcc.h @@ -0,0 +1,74 @@ +/****************************************************************************** +* +* Copyright (C) 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcoresightpsdcc.h +* @addtogroup coresightps_dcc_v1_4 +* @{ +* @details +* +* CoreSight driver component. +* +* The coresight is a part of debug communication channel (DCC) group. Jtag UART +* for ARM uses DCC. Each ARM core has its own DCC, so one need to select an +* ARM target in XSDB console before running the jtag terminal command. Using the +* coresight driver component, the output stream can be directed to a log file. +* +* @note None. +* +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date		Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00  kvn    02/14/15 First release
    +* 1.1   kvn    06/12/15 Add support for Zynq Ultrascale+ MP.
    +*       kvn    08/18/15 Modified Makefile according to compiler changes.
    +* 1.3   asa    07/01/16 Made changes to ensure that the file does not compile
    +*                       for MB BSPs. Instead it throws up a warning. This
    +*                       fixes the CR#953056.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#ifndef __MICROBLAZE__ +#include + +void XCoresightPs_DccSendByte(u32 BaseAddress, u8 Data); + +u8 XCoresightPs_DccRecvByte(u32 BaseAddress); +#endif +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcpu_cortexa9.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcpu_cortexa9.h new file mode 100644 index 0000000..95c8ba5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xcpu_cortexa9.h @@ -0,0 +1,48 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcpu_cortexa9.h +* @addtogroup cpu_cortexa9_v2_5 +* @{ +* @details +* +* dummy file +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------------- +* 2.5 ms 04/18/17 Modified tcl file to add suffix U for XPAR_CPU_ID +* parameter of cpu_cortexa9 in xparameters.h +******************************************************************************/ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xddrps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xddrps.h new file mode 100644 index 0000000..c8804d2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xddrps.h @@ -0,0 +1,66 @@ +/******************************************************************************* + * + * Copyright (C) 2015 Xilinx, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * Use of the Software is limited solely to applications: + * (a) running on a Xilinx device, or + * (b) that interact with a Xilinx device through a bus or interconnect. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF + * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Except as contained in this notice, the name of the Xilinx shall not be used + * in advertising or otherwise to promote the sale, use or other dealings in + * this Software without prior written authorization from Xilinx. + * +*******************************************************************************/ +/******************************************************************************/ +/** + * + * @file xddrps.h + * @addtogroup ddrps_v1_0 + * @{ + * @details + * + * The Xilinx DdrPs driver. This driver supports the Xilinx ddrps + * IP core. + * + * @note None. + * + *
    + * MODIFICATION HISTORY:
    + *
    + * Ver   Who  Date     Changes
    + * ----- ---- -------- -----------------------------------------------
    + * 1.0	 nsk  08/06/15 First Release
    + * 1.0	 nsk  08/20/15 Updated define_addr_params in ddrps.tcl
    + *		       to support PBD Designs (CR #876857)
    + *
    + * 
    + * +*******************************************************************************/ + +#ifndef XDDRPS_H_ +/* Prevent circular inclusions by using protection macros. */ +#define XDDRPS_H_ + +/******************************* Include Files ********************************/ + + +#endif /* XDDRPS_H_ */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdebug.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdebug.h new file mode 100644 index 0000000..650946b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdebug.h @@ -0,0 +1,32 @@ +#ifndef XDEBUG /* prevent circular inclusions */ +#define XDEBUG /* by using protection macros */ + +#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 0x00000001U /* error condition messages */ +#define XDBG_DEBUG_GENERAL 0x00000002U /* general debug messages */ +#define XDBG_DEBUG_ALL 0xFFFFFFFFU /* all debugging data */ + +#define xdbg_current_types (XDBG_DEBUG_GENERAL) + +#define xdbg_stmnt(x) x + +#define xdbg_printf(type, ...) (((type) & xdbg_current_types) ? printf (__VA_ARGS__) : 0) + + +#else /* defined(DEBUG) && !defined(NDEBUG) */ + +#define xdbg_stmnt(x) + +#define xdbg_printf(...) + +#endif /* defined(DEBUG) && !defined(NDEBUG) */ + +#endif /* XDEBUG */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdevcfg.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdevcfg.h new file mode 100644 index 0000000..b9a0111 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdevcfg.h @@ -0,0 +1,403 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg.h +* @addtogroup devcfg_v3_5 +* @{ +* @details +* +* 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. +* +* Initialization and Configuration +* +* 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. +* +* Interrupts +* The Driver implements an interrupt handler to support the interrupts provided +* by this interface. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Asserts +* +* 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. +* +* Building the driver +* +* 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. +* +*

    +* +*
    +* 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.
    +* 3.0   adk 10/12/13 Updated as per the New Tcl API's
    +* 3.0   kpc 21/02/14 Added function prototype for XDcfg_ClearControlRegister
    +* 3.2   sb  08/25/14 Fixed XDcfg_PcapReadback() function
    +*		     updated driver code with != instead of ==,
    +*		     while checking for Interrupt Status with DMA and
    +*		     PCAP Done Mask
    +*		     ((XDcfg_ReadReg(InstancePtr->Config.BaseAddr,
    +*			XDCFG_INT_STS_OFFSET) &
    +*			XDCFG_IXR_D_P_DONE_MASK) !=
    +*			XDCFG_IXR_D_P_DONE_MASK);
    +*		     A new example has been added to read back the
    +*		     configuration registers from the PL region.
    +*		     xdevcfg_reg_readback_example.c
    +* 3.3   sk  04/06/15 Modified XDcfg_ReadMultiBootConfig Macro CR# 851335.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +*       ms  04/10/17 Modified filename tag in interrupt and polled examples
    +*                    to include them in doxygen examples.
    +* 3.5   ms  04/18/17 Modified tcl file to add suffix U for all macros
    +*                    definitions of devcfg in xparameters.h
    +*       ms  08/07/17 Fixed compilation warnings in xdevcfg_sinit.c
    +* 
    +* +******************************************************************************/ +#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); + +void XDcfg_ClearControlRegister(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdevcfg_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdevcfg_hw.h new file mode 100644 index 0000000..c506ca5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdevcfg_hw.h @@ -0,0 +1,395 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_hw.h +* @addtogroup devcfg_v3_3 +* @{ +* +* This file contains the hardware interface to the Device Config Interface. +* +*
    +* 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.
    +* 3.00a	kpc	25/02/14 Corrected the XDCFG_BASE_ADDRESS macro value.
    +* 
    +* +******************************************************************************/ +#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 0xF8007000 /**< 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdmaps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdmaps.h new file mode 100644 index 0000000..5a0c1a2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdmaps.h @@ -0,0 +1,352 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps.h +* @addtogroup dmaps_v2_3 +* @{ +* @details +* +* +*
    +* 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.
    +* 1.07a asa    11/02/13. Made changes to fix compilation issues for iarcc.
    +*			   Removed the PDBG prints. By default they were always
    +*			   defined out and never used. The PDBG is non-standard for
    +*			   Xilinx drivers and no other driver does something similar.
    +*			   Since there is no easy way to fix compilation issues with
    +*			   the IARCC compiler around PDBG, it is better to remove it.
    +*			   Users can always use xil_printfs if they want to debug.
    +* 2.0   adk    10/12/13  Updated as per the New Tcl API's
    +* 2.01  kpc    08/23/14  Fixed the IAR compiler reported errors
    +* 2.2   mus    08/12/16  Declared all inline functions in xdmaps.c as extern, to avoid
    +*                        linker error for IAR compiler
    +* 2.3   ms     01/23/17 Modified xil_printf statement in main function for all
    +*                       examples to ensure that "Successfully ran" and "Failed"
    +*                       strings are available in all examples. This is a fix
    +*                       for CR-965028.
    +*       ms     03/17/17 Added readme.txt file in examples folder for doxygen
    +*                       generation.
    +* 
    +* +*****************************************************************************/ + +#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); + +/** + * To avoid linking error,Declare all inline functions as extern for + * IAR compiler + */ +#ifdef __ICCARM__ +extern INLINE int XDmaPs_Instr_DMAEND(char *DmaProg); +extern INLINE void XDmaPs_Memcpy4(char *Dst, char *Src); +extern INLINE int XDmaPs_Instr_DMAGO(char *DmaProg, unsigned int Cn, + u32 Imm, unsigned int Ns); +extern INLINE int XDmaPs_Instr_DMALD(char *DmaProg); +extern INLINE int XDmaPs_Instr_DMALP(char *DmaProg, unsigned Lc, + unsigned LoopIterations); +extern INLINE int XDmaPs_Instr_DMALPEND(char *DmaProg, char *BodyStart, unsigned Lc); +extern INLINE int XDmaPs_Instr_DMAMOV(char *DmaProg, unsigned Rd, u32 Imm); +extern INLINE int XDmaPs_Instr_DMANOP(char *DmaProg); +extern INLINE int XDmaPs_Instr_DMARMB(char *DmaProg); +extern INLINE int XDmaPs_Instr_DMASEV(char *DmaProg, unsigned int EventNumber); +extern INLINE int XDmaPs_Instr_DMAST(char *DmaProg); +extern INLINE int XDmaPs_Instr_DMAWMB(char *DmaProg); +extern INLINE unsigned XDmaPs_ToEndianSwapSizeBits(unsigned int EndianSwapSize); +extern INLINE unsigned XDmaPs_ToBurstSizeBits(unsigned BurstSize); +#endif + +/** + * 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdmaps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdmaps_hw.h new file mode 100644 index 0000000..628f1ec --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xdmaps_hw.h @@ -0,0 +1,293 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xdmaps_hw.h +* @addtogroup dmaps_v2_3 +* @{ +* +* This header file contains the hardware interface of an XDmaPs device. +* +*
    +* 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
    +* 
    +* +******************************************************************************/ + +#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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps.h new file mode 100644 index 0000000..6d4b15b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps.h @@ -0,0 +1,809 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** + * + * @file xemacps.h +* @addtogroup emacps_v3_7 +* @{ +* @details + * + * 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 + * + * Driver Description + * + * 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. + * + * Initialization & Configuration + * + * 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. + * + * Interrupts and Asynchronous Callbacks + * + * 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. + * + * Virtual Memory + * + * 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. + * + * DMA + * + * 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. + * + * Alignment & Data Cache Restrictions + * + * 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. + * + * Buffer Copying + * + * 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. + * + * Checksum Offloading + * + * 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. + * + * PHY Interfaces + * + * RGMII 1.3 is the only interface supported. + * + * Asserts + * + * 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. + * + *
    + * 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.
    + * 1.06a asa  11/02/13 Changed the value for XEMACPS_RXBUF_LEN_MASK from 0x3fff
    + *				to 0x1fff. This fixes the CR#744902.
    + *			  Made changes in example file xemacps_example.h to fix compilation
    + *			  issues with iarcc compiler.
    + * 2.0   adk  10/12/13 Updated as per the New Tcl API's
    + * 2.1   adk  11/08/14 Fixed the CR#811288. Changes are made in the driver tcl file.
    + * 2.1   bss  09/08/14 Modified driver tcl to fix CR#820349 to export phy
    + *		       address in xparameters.h when GMII to RGMII converter
    + *		       is present in hw.
    + * 2.1   srt  07/15/14 Add support for Zynq Ultrascale Mp GEM specification and 64-bit
    + *		       changes.
    + * 2.2   adk  29/10/14 Fixed CR#827686 when PCS/PMA core is configured with
    + *                    1000BASE-X mode export proper values to the xparameters.h
    + *                    file. Changes are made in the driver tcl file.
    + * 3.0   adk  08/1/15  Don't include gem in peripheral test when gem is
    + *                    configured with PCS/PMA Core. Changes are made in the
    + *		       test app tcl(CR:827686).
    + * 3.0   kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    + * 3.0   hk   03/18/15 Added support for jumbo frames. Increase AHB burst.
    + *                     Disable extended mode. Perform all 64 bit changes under
    + *                     check for arch64.
    + *                     Remove "used bit set" from TX error interrupt masks.
    + * 3.1   hk   07/27/15 Do not call error handler with '0' error code when
    + *                     there is no error. CR# 869403
    + *            08/10/15 Update upper 32 bit tx and rx queue ptr registers.
    + * 3.2   hk   02/22/16 Added SGMII support for Zynq Ultrascale+ MPSoC.
    + * 3.4   ms   01/23/17 Modified xil_printf statement in main function for all
    + *                     examples to ensure that "Successfully ran" and "Failed"
    + *                     strings are available in all examples. This is a fix
    + *                     for CR-965028.
    + *       ms   03/17/17 Modified text file in examples folder for doxygen
    + *                     generation.
    + *       ms   04/05/17 Added tabspace for return statements in functions of
    + *                     xemacps_ieee1588_example.c for proper documentation
    + *                     while generating doxygen.
    + * 3.5   hk   08/14/17 Update cache coherency information of the interface in
    + *                     its config structure.
    + * 3.6   rb   09/08/17 HwCnt variable (in XEmacPs_BdRing structure) is
    + *		       changed to volatile.
    + *		       Add API XEmacPs_BdRingPtrReset() to reset pointers
    + *
    + * 
    + * + ****************************************************************************/ + +#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 0x00000001U +/**< Accept all incoming packets. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_FRAME1536_OPTION 0x00000002U +/**< Frame larger than 1516 support for Tx & Rx. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_VLAN_OPTION 0x00000004U +/**< VLAN Rx & Tx frame support. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_FLOW_CONTROL_OPTION 0x00000010U +/**< Enable recognition of flow control frames on Rx + * This option defaults to enabled (set) */ + +#define XEMACPS_FCS_STRIP_OPTION 0x00000020U +/**< 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 0x00000040U +/**< Generate FCS field and add PAD automatically for outgoing frames. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_LENTYPE_ERR_OPTION 0x00000080U +/**< 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 0x00000100U +/**< Enable the transmitter. + * This option defaults to enabled (set) */ + +#define XEMACPS_RECEIVER_ENABLE_OPTION 0x00000200U +/**< Enable the receiver + * This option defaults to enabled (set) */ + +#define XEMACPS_BROADCAST_OPTION 0x00000400U +/**< Allow reception of the broadcast address + * This option defaults to enabled (set) */ + +#define XEMACPS_MULTICAST_OPTION 0x00000800U +/**< Allows reception of multicast addresses programmed into hash + * This option defaults to disabled (clear) */ + +#define XEMACPS_RX_CHKSUM_ENABLE_OPTION 0x00001000U +/**< Enable the RX checksum offload + * This option defaults to enabled (set) */ + +#define XEMACPS_TX_CHKSUM_ENABLE_OPTION 0x00002000U +/**< Enable the TX checksum offload + * This option defaults to enabled (set) */ + +#define XEMACPS_JUMBO_ENABLE_OPTION 0x00004000U +#define XEMACPS_SGMII_ENABLE_OPTION 0x00008000U + +#define XEMACPS_DEFAULT_OPTIONS \ + ((u32)XEMACPS_FLOW_CONTROL_OPTION | \ + (u32)XEMACPS_FCS_INSERT_OPTION | \ + (u32)XEMACPS_FCS_STRIP_OPTION | \ + (u32)XEMACPS_BROADCAST_OPTION | \ + (u32)XEMACPS_LENTYPE_ERR_OPTION | \ + (u32)XEMACPS_TRANSMITTER_ENABLE_OPTION | \ + (u32)XEMACPS_RECEIVER_ENABLE_OPTION | \ + (u32)XEMACPS_RX_CHKSUM_ENABLE_OPTION | \ + (u32)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 1U +#define XEMACPS_HANDLER_DMARECV 2U +#define XEMACPS_HANDLER_ERROR 3U +/*@}*/ + +/* 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 6U /* size of Ethernet header */ + +#define XEMACPS_MTU 1500U /* max MTU size of Ethernet frame */ +#define XEMACPS_MTU_JUMBO 10240U /* max MTU size of jumbo frame */ +#define XEMACPS_HDR_SIZE 14U /* size of Ethernet header */ +#define XEMACPS_HDR_VLAN_SIZE 18U /* size of Ethernet header with VLAN */ +#define XEMACPS_TRL_SIZE 4U /* 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) +#define XEMACPS_MAX_VLAN_FRAME_SIZE_JUMBO (XEMACPS_MTU_JUMBO + XEMACPS_HDR_SIZE + \ + XEMACPS_HDR_VLAN_SIZE + XEMACPS_TRL_SIZE) + +/* DMACR Bust length hash defines */ + +#define XEMACPS_SINGLE_BURST 0x00000001 +#define XEMACPS_4BYTE_BURST 0x00000004 +#define XEMACPS_8BYTE_BURST 0x00000008 +#define XEMACPS_16BYTE_BURST 0x00000010 + + +/**************************** 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 */ + UINTPTR BaseAddress;/**< Physical base address of IPIF registers */ + u8 IsCacheCoherent; /**< Applicable only to A53 in EL1 mode; + * describes whether Cache Coherent or not */ +} 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_Instance { + 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; + u32 Version; + u32 RxBufMask; + u32 MaxMtuSize; + u32 MaxFrameSize; + u32 MaxVlanFrameSize; + +} 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 Mask. The corresponding interrupt for +* each bit set to 1 in Mask, 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 Mask. The corresponding interrupt for +* each bit set to 1 in Mask, 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)); + +/****************************************************************************/ +/** +* +* Enable interrupts specified in Mask. The corresponding interrupt for +* each bit set to 1 in Mask, 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_IntQ1Enable(XEmacPs *InstancePtr, u32 Mask) +* +*****************************************************************************/ +#define XEmacPs_IntQ1Enable(InstancePtr, Mask) \ + XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_INTQ1_IER_OFFSET, \ + ((Mask) & XEMACPS_INTQ1_IXR_ALL_MASK)); + +/****************************************************************************/ +/** +* +* Disable interrupts specified in Mask. The corresponding interrupt for +* each bit set to 1 in Mask, 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_IntQ1Disable(InstancePtr, Mask) \ + XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_INTQ1_IDR_OFFSET, \ + ((Mask) & XEMACPS_INTQ1_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) != 0U \ + ? 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) != 0U \ + ? TRUE : FALSE) + +/************************** Function Prototypes *****************************/ + +/* + * Initialization functions in xemacps.c + */ +LONG XEmacPs_CfgInitialize(XEmacPs *InstancePtr, XEmacPs_Config *CfgPtr, + UINTPTR EffectiveAddress); +void XEmacPs_Start(XEmacPs *InstancePtr); +void XEmacPs_Stop(XEmacPs *InstancePtr); +void XEmacPs_Reset(XEmacPs *InstancePtr); +void XEmacPs_SetQueuePtr(XEmacPs *InstancePtr, UINTPTR QPtr, u8 QueueNum, + u16 Direction); + +/* + * 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. + */ +LONG XEmacPs_SetHandler(XEmacPs *InstancePtr, u32 HandlerType, + void *FuncPointer, void *CallBackRef); +void XEmacPs_IntrHandler(void *XEmacPsPtr); + +/* + * MAC configuration/control functions in XEmacPs_control.c + */ +LONG XEmacPs_SetOptions(XEmacPs *InstancePtr, u32 Options); +LONG XEmacPs_ClearOptions(XEmacPs *InstancePtr, u32 Options); +u32 XEmacPs_GetOptions(XEmacPs *InstancePtr); + +LONG XEmacPs_SetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index); +LONG XEmacPs_DeleteHash(XEmacPs *InstancePtr, void *AddressPtr); +void XEmacPs_GetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index); + +LONG 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); +LONG XEmacPs_PhyRead(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 *PhyDataPtr); +LONG XEmacPs_PhyWrite(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 PhyData); +LONG XEmacPs_SetTypeIdCheck(XEmacPs *InstancePtr, u32 Id_Check, u8 Index); + +LONG XEmacPs_SendPausePacket(XEmacPs *InstancePtr); +void XEmacPs_DMABLengthUpdate(XEmacPs *InstancePtr, s32 BLength); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_bd.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_bd.h new file mode 100644 index 0000000..83f9a87 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_bd.h @@ -0,0 +1,804 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xemacps_bd.h +* @addtogroup emacps_v3_7 +* @{ + * + * 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. + * + * Buffer Descriptors + * + * 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. + * + * Performance + * + * Limiting I/O to BDs can improve overall performance of the DMA channel. + * + *
    + * MODIFICATION HISTORY:
    + *
    + * Ver   Who  Date     Changes
    + * ----- ---- -------- -------------------------------------------------------
    + * 1.00a wsy  01/10/10 First release
    + * 2.1   srt  07/15/14 Add support for Zynq Ultrascale MP GEM specification
    + *                     and 64-bit changes.
    + * 3.0   kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    + * 3.0   hk   02/20/15 Added support for jumbo frames.
    + *                     Disable extended mode. Perform all 64 bit changes under
    + *                     check for arch64.
    + * 3.2   hk   11/18/15 Change BD typedef and number of words.
    + *
    + * 
    + * + * *************************************************************************** + */ + +#ifndef XEMACPS_BD_H /* prevent circular inclusions */ +#define XEMACPS_BD_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include +#include "xil_types.h" +#include "xil_assert.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ +#ifdef __aarch64__ +/* Minimum BD alignment */ +#define XEMACPS_DMABD_MINIMUM_ALIGNMENT 64U +#define XEMACPS_BD_NUM_WORDS 4U +#else +/* Minimum BD alignment */ +#define XEMACPS_DMABD_MINIMUM_ALIGNMENT 4U +#define XEMACPS_BD_NUM_WORDS 2U +#endif + +/** + * The XEmacPs_Bd is the type for buffer descriptors (BDs). + */ +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(UINTPTR BaseAddress, UINTPTR Offset) +* +*****************************************************************************/ +#define XEmacPs_BdRead(BaseAddress, Offset) \ + (*(u32 *)((UINTPTR)((void*)(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(UINTPTR BaseAddress, UINTPTR Offset, UINTPTR Data) +* +*****************************************************************************/ +#define XEmacPs_BdWrite(BaseAddress, Offset, Data) \ + (*(u32 *)((UINTPTR)(void*)(BaseAddress) + (u32)(Offset)) = (u32)(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, UINTPTR Addr) + * + *****************************************************************************/ +#ifdef __aarch64__ +#define XEmacPs_BdSetAddressTx(BdPtr, Addr) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + (u32)((Addr) & ULONG64_LO_MASK)); \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_HI_OFFSET, \ + (u32)(((Addr) & ULONG64_HI_MASK) >> 32U)); +#else +#define XEmacPs_BdSetAddressTx(BdPtr, Addr) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, (u32)(Addr)) +#endif + +/*****************************************************************************/ +/** + * 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, UINTPTR Addr) + * + *****************************************************************************/ +#ifdef __aarch64__ +#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) & ULONG64_LO_MASK)))); \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_HI_OFFSET, \ + (u32)(((Addr) & ULONG64_HI_MASK) >> 32U)); +#else +#define XEmacPs_BdSetAddressRx(BdPtr, Addr) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + ~XEMACPS_RXBUF_ADD_MASK) | (UINTPTR)(Addr))) +#endif + +/*****************************************************************************/ +/** + * 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, UINTPTR 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: + * UINTPTR XEmacPs_BdGetBufAddr(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#ifdef __aarch64__ +#define XEmacPs_BdGetBufAddr(BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) | \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_HI_OFFSET)) << 32U) +#else +#define XEmacPs_BdGetBufAddr(BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET)) +#endif + +/*****************************************************************************/ +/** + * 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))) + + + +/*****************************************************************************/ +/** + * 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: + * UINTPTR 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) + +/*****************************************************************************/ +/** + * Retrieve the RX frame size. + * + * The returned value is the size of the received packet. + * This API supports jumbo frame sizes if enabled. + * + * @param BdPtr is the BD pointer to operate on + * + * @return Length field processed by hardware or set by + * XEmacPs_BdSetLength(). + * + * @note + * C-style signature: + * UINTPTR XEmacPs_GetRxFrameSize(XEmacPs* InstancePtr, XEmacPs_Bd* BdPtr) + * RxBufMask is dependent on whether jumbo is enabled or not. + * + *****************************************************************************/ +#define XEmacPs_GetRxFrameSize(InstancePtr, BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + (InstancePtr)->RxBufMask) + +/*****************************************************************************/ +/** + * 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: + * UINTPTR XEmacPs_BdIsLast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsLast(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_EOF_MASK)!=0U ? 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: + * u8 XEmacPs_BdIsRxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxWrap(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + XEMACPS_RXBUF_WRAP_MASK)!=0U ? 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: + * u8 XEmacPs_BdGetTxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxWrap(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_WRAP_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsRxNew(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxNew(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + XEMACPS_RXBUF_NEW_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsTxUsed(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxUsed(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_USED_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsTxRetry(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxRetry(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_RETRY_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsTxUrun(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxUrun(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_URUN_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsTxExh(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxExh(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_EXH_MASK)!=0U ? 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: + * UINTPTR 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: + * UINTPTR 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: + * UINTPTR XEmacPs_BdIsRxBcast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxBcast(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_BCAST_MASK)!=0U ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the multicast hash bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * UINTPTR XEmacPs_BdIsRxMultiHash(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxMultiHash(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_MULTIHASH_MASK)!=0U ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the unicast hash bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * UINTPTR XEmacPs_BdIsRxUniHash(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxUniHash(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_UNIHASH_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsRxVlan(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxVlan(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_VLAN_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsRxPri(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxPri(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_PRI_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsRxCFI(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxCFI(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_CFI_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdGetRxEOF(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxEOF(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_EOF_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdGetRxSOF(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxSOF(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_SOF_MASK)!=0U ? TRUE : FALSE) + + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_bdring.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_bdring.h new file mode 100644 index 0000000..b89e898 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_bdring.h @@ -0,0 +1,241 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_bdring.h +* @addtogroup emacps_v3_7 +* @{ +* +* The Xiline EmacPs Buffer Descriptor ring driver. This is part of EmacPs +* DMA functionalities. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a wsy  01/10/10 First release
    +* 2.1   srt  07/15/14 Add support for Zynq Ultrascale Mp architecture.
    +* 3.0   kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.6   rb   09/08/17 HwCnt variable (in XEmacPs_BdRing structure) is
    +*		      changed to volatile.
    +*
    +* 
    +* +******************************************************************************/ + +#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 { + UINTPTR PhysBaseAddr;/**< Physical address of 1st BD in list */ + UINTPTR BaseBdAddr; /**< Virtual address of 1st BD in list */ + UINTPTR 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 */ + + volatile u32 HwCnt; /**< Number of BDs in work group */ + u32 PreCnt; /**< Number of BDs in pre-work group */ + u32 FreeCnt; /**< Number of allocatable BDs in the free group */ + u32 PostCnt; /**< Number of BDs in post-work group */ + u32 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))) + +/*****************************************************************************/ +/** +* 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) * (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) \ + (((UINTPTR)((void *)(BdPtr)) >= (RingPtr)->HighBdAddr) ? \ + (XEmacPs_Bd*)((void*)(RingPtr)->BaseBdAddr) : \ + (XEmacPs_Bd*)((UINTPTR)((void *)(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) \ + (((UINTPTR)(BdPtr) <= (RingPtr)->BaseBdAddr) ? \ + (XEmacPs_Bd*)(RingPtr)->HighBdAddr : \ + (XEmacPs_Bd*)((UINTPTR)(BdPtr) - (RingPtr)->Separation)) + +/************************** Function Prototypes ******************************/ + +/* + * Scatter gather DMA related functions in xemacps_bdring.c + */ +LONG XEmacPs_BdRingCreate(XEmacPs_BdRing * RingPtr, UINTPTR PhysAddr, + UINTPTR VirtAddr, u32 Alignment, u32 BdCount); +LONG XEmacPs_BdRingClone(XEmacPs_BdRing * RingPtr, XEmacPs_Bd * SrcBdPtr, + u8 Direction); +LONG XEmacPs_BdRingAlloc(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd ** BdSetPtr); +LONG XEmacPs_BdRingUnAlloc(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd * BdSetPtr); +LONG XEmacPs_BdRingToHw(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd * BdSetPtr); +LONG XEmacPs_BdRingFree(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd * BdSetPtr); +u32 XEmacPs_BdRingFromHwTx(XEmacPs_BdRing * RingPtr, u32 BdLimit, + XEmacPs_Bd ** BdSetPtr); +u32 XEmacPs_BdRingFromHwRx(XEmacPs_BdRing * RingPtr, u32 BdLimit, + XEmacPs_Bd ** BdSetPtr); +LONG XEmacPs_BdRingCheck(XEmacPs_BdRing * RingPtr, u8 Direction); + +void XEmacPs_BdRingPtrReset(XEmacPs_BdRing * RingPtr, void *virtaddrloc); + +#ifdef __cplusplus +} +#endif + + +#endif /* end of protection macros */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_hw.h new file mode 100644 index 0000000..e535470 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xemacps_hw.h @@ -0,0 +1,656 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_hw.h +* @addtogroup emacps_v3_7 +* @{ +* +* 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 +* +*
    +* 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
    +* 1.06a asa  11/02/13 Changed the value for XEMACPS_RXBUF_LEN_MASK from 0x3fff
    +*					  to 0x1fff. This fixes the CR#744902.
    +* 2.1   srt  07/15/14 Add support for Zynq Ultrascale Mp GEM specification.
    +* 3.0   kvn  12/16/14 Changed name of XEMACPS_NWCFG_LENGTHERRDSCRD_MASK to
    +*					  XEMACPS_NWCFG_LENERRDSCRD_MASK as it exceeds 31 characters.
    +* 3.0  kpc   1/23/15  Corrected the extended descriptor macro values.
    +* 3.0  kvn   02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.0  hk   03/18/15 Added support for jumbo frames.
    +*                    Remove "used bit set" from TX error interrupt masks.
    +* 3.1  hk   08/10/15 Update upper 32 bit tx and rx queue ptr register offsets.
    +* 3.2   hk   02/22/16 Added SGMII support for Zynq Ultrascale+ MPSoC.
    +* 
    +* +******************************************************************************/ + +#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 4U /**< Maxmum number of mac address + supported */ +#define XEMACPS_MAX_TYPE_ID 4U /**< Maxmum number of type id supported */ + +#ifdef __aarch64__ +#define XEMACPS_BD_ALIGNMENT 64U /**< Minimum buffer descriptor alignment + on the local bus */ +#else + +#define XEMACPS_BD_ALIGNMENT 4U /**< Minimum buffer descriptor alignment + on the local bus */ +#endif +#define XEMACPS_RX_BUF_ALIGNMENT 4U /**< 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 1U /**< send direction */ +#define XEMACPS_RECV 2U /**< receive direction */ +/*@}*/ + +/** @name MDC clock division + * currently supporting 8, 16, 32, 48, 64, 96, 128, 224. + * @{ + */ +typedef enum { MDC_DIV_8 = 0U, 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 1536U /**< Specify the receive buffer size in + bytes, 64, 128, ... 10240 */ +#define XEMACPS_RX_BUF_SIZE_JUMBO 10240U + +#define XEMACPS_RX_BUF_UNIT 64U /**< Number of receive buffer bytes as a + unit, this is HW setup */ + +#define XEMACPS_MAX_RXBD 128U /**< Size of RX buffer descriptor queues */ +#define XEMACPS_MAX_TXBD 128U /**< Size of TX buffer descriptor queues */ + +#define XEMACPS_MAX_HASH_BITS 64U /**< 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 0x00000000U /**< Network Control reg */ +#define XEMACPS_NWCFG_OFFSET 0x00000004U /**< Network Config reg */ +#define XEMACPS_NWSR_OFFSET 0x00000008U /**< Network Status reg */ + +#define XEMACPS_DMACR_OFFSET 0x00000010U /**< DMA Control reg */ +#define XEMACPS_TXSR_OFFSET 0x00000014U /**< TX Status reg */ +#define XEMACPS_RXQBASE_OFFSET 0x00000018U /**< RX Q Base address reg */ +#define XEMACPS_TXQBASE_OFFSET 0x0000001CU /**< TX Q Base address reg */ +#define XEMACPS_RXSR_OFFSET 0x00000020U /**< RX Status reg */ + +#define XEMACPS_ISR_OFFSET 0x00000024U /**< Interrupt Status reg */ +#define XEMACPS_IER_OFFSET 0x00000028U /**< Interrupt Enable reg */ +#define XEMACPS_IDR_OFFSET 0x0000002CU /**< Interrupt Disable reg */ +#define XEMACPS_IMR_OFFSET 0x00000030U /**< Interrupt Mask reg */ + +#define XEMACPS_PHYMNTNC_OFFSET 0x00000034U /**< Phy Maintaince reg */ +#define XEMACPS_RXPAUSE_OFFSET 0x00000038U /**< RX Pause Time reg */ +#define XEMACPS_TXPAUSE_OFFSET 0x0000003CU /**< TX Pause Time reg */ + +#define XEMACPS_JUMBOMAXLEN_OFFSET 0x00000048U /**< Jumbo max length reg */ + +#define XEMACPS_HASHL_OFFSET 0x00000080U /**< Hash Low address reg */ +#define XEMACPS_HASHH_OFFSET 0x00000084U /**< Hash High address reg */ + +#define XEMACPS_LADDR1L_OFFSET 0x00000088U /**< Specific1 addr low reg */ +#define XEMACPS_LADDR1H_OFFSET 0x0000008CU /**< Specific1 addr high reg */ +#define XEMACPS_LADDR2L_OFFSET 0x00000090U /**< Specific2 addr low reg */ +#define XEMACPS_LADDR2H_OFFSET 0x00000094U /**< Specific2 addr high reg */ +#define XEMACPS_LADDR3L_OFFSET 0x00000098U /**< Specific3 addr low reg */ +#define XEMACPS_LADDR3H_OFFSET 0x0000009CU /**< Specific3 addr high reg */ +#define XEMACPS_LADDR4L_OFFSET 0x000000A0U /**< Specific4 addr low reg */ +#define XEMACPS_LADDR4H_OFFSET 0x000000A4U /**< Specific4 addr high reg */ + +#define XEMACPS_MATCH1_OFFSET 0x000000A8U /**< Type ID1 Match reg */ +#define XEMACPS_MATCH2_OFFSET 0x000000ACU /**< Type ID2 Match reg */ +#define XEMACPS_MATCH3_OFFSET 0x000000B0U /**< Type ID3 Match reg */ +#define XEMACPS_MATCH4_OFFSET 0x000000B4U /**< Type ID4 Match reg */ + +#define XEMACPS_STRETCH_OFFSET 0x000000BCU /**< IPG Stretch reg */ + +#define XEMACPS_OCTTXL_OFFSET 0x00000100U /**< Octects transmitted Low + reg */ +#define XEMACPS_OCTTXH_OFFSET 0x00000104U /**< Octects transmitted High + reg */ + +#define XEMACPS_TXCNT_OFFSET 0x00000108U /**< Error-free Frmaes + transmitted counter */ +#define XEMACPS_TXBCCNT_OFFSET 0x0000010CU /**< Error-free Broadcast + Frames counter*/ +#define XEMACPS_TXMCCNT_OFFSET 0x00000110U /**< Error-free Multicast + Frame counter */ +#define XEMACPS_TXPAUSECNT_OFFSET 0x00000114U /**< Pause Frames Transmitted + Counter */ +#define XEMACPS_TX64CNT_OFFSET 0x00000118U /**< Error-free 64 byte Frames + Transmitted counter */ +#define XEMACPS_TX65CNT_OFFSET 0x0000011CU /**< Error-free 65-127 byte + Frames Transmitted + counter */ +#define XEMACPS_TX128CNT_OFFSET 0x00000120U /**< Error-free 128-255 byte + Frames Transmitted + counter*/ +#define XEMACPS_TX256CNT_OFFSET 0x00000124U /**< Error-free 256-511 byte + Frames transmitted + counter */ +#define XEMACPS_TX512CNT_OFFSET 0x00000128U /**< Error-free 512-1023 byte + Frames transmitted + counter */ +#define XEMACPS_TX1024CNT_OFFSET 0x0000012CU /**< Error-free 1024-1518 byte + Frames transmitted + counter */ +#define XEMACPS_TX1519CNT_OFFSET 0x00000130U /**< Error-free larger than + 1519 byte Frames + transmitted counter */ +#define XEMACPS_TXURUNCNT_OFFSET 0x00000134U /**< TX under run error + counter */ + +#define XEMACPS_SNGLCOLLCNT_OFFSET 0x00000138U /**< Single Collision Frame + Counter */ +#define XEMACPS_MULTICOLLCNT_OFFSET 0x0000013CU /**< Multiple Collision Frame + Counter */ +#define XEMACPS_EXCESSCOLLCNT_OFFSET 0x00000140U /**< Excessive Collision Frame + Counter */ +#define XEMACPS_LATECOLLCNT_OFFSET 0x00000144U /**< Late Collision Frame + Counter */ +#define XEMACPS_TXDEFERCNT_OFFSET 0x00000148U /**< Deferred Transmission + Frame Counter */ +#define XEMACPS_TXCSENSECNT_OFFSET 0x0000014CU /**< Transmit Carrier Sense + Error Counter */ + +#define XEMACPS_OCTRXL_OFFSET 0x00000150U /**< Octects Received register + Low */ +#define XEMACPS_OCTRXH_OFFSET 0x00000154U /**< Octects Received register + High */ + +#define XEMACPS_RXCNT_OFFSET 0x00000158U /**< Error-free Frames + Received Counter */ +#define XEMACPS_RXBROADCNT_OFFSET 0x0000015CU /**< Error-free Broadcast + Frames Received Counter */ +#define XEMACPS_RXMULTICNT_OFFSET 0x00000160U /**< Error-free Multicast + Frames Received Counter */ +#define XEMACPS_RXPAUSECNT_OFFSET 0x00000164U /**< Pause Frames + Received Counter */ +#define XEMACPS_RX64CNT_OFFSET 0x00000168U /**< Error-free 64 byte Frames + Received Counter */ +#define XEMACPS_RX65CNT_OFFSET 0x0000016CU /**< Error-free 65-127 byte + Frames Received Counter */ +#define XEMACPS_RX128CNT_OFFSET 0x00000170U /**< Error-free 128-255 byte + Frames Received Counter */ +#define XEMACPS_RX256CNT_OFFSET 0x00000174U /**< Error-free 256-512 byte + Frames Received Counter */ +#define XEMACPS_RX512CNT_OFFSET 0x00000178U /**< Error-free 512-1023 byte + Frames Received Counter */ +#define XEMACPS_RX1024CNT_OFFSET 0x0000017CU /**< Error-free 1024-1518 byte + Frames Received Counter */ +#define XEMACPS_RX1519CNT_OFFSET 0x00000180U /**< Error-free 1519-max byte + Frames Received Counter */ +#define XEMACPS_RXUNDRCNT_OFFSET 0x00000184U /**< Undersize Frames Received + Counter */ +#define XEMACPS_RXOVRCNT_OFFSET 0x00000188U /**< Oversize Frames Received + Counter */ +#define XEMACPS_RXJABCNT_OFFSET 0x0000018CU /**< Jabbers Received + Counter */ +#define XEMACPS_RXFCSCNT_OFFSET 0x00000190U /**< Frame Check Sequence + Error Counter */ +#define XEMACPS_RXLENGTHCNT_OFFSET 0x00000194U /**< Length Field Error + Counter */ +#define XEMACPS_RXSYMBCNT_OFFSET 0x00000198U /**< Symbol Error Counter */ +#define XEMACPS_RXALIGNCNT_OFFSET 0x0000019CU /**< Alignment Error Counter */ +#define XEMACPS_RXRESERRCNT_OFFSET 0x000001A0U /**< Receive Resource Error + Counter */ +#define XEMACPS_RXORCNT_OFFSET 0x000001A4U /**< Receive Overrun Counter */ +#define XEMACPS_RXIPCCNT_OFFSET 0x000001A8U /**< IP header Checksum Error + Counter */ +#define XEMACPS_RXTCPCCNT_OFFSET 0x000001ACU /**< TCP Checksum Error + Counter */ +#define XEMACPS_RXUDPCCNT_OFFSET 0x000001B0U /**< UDP Checksum Error + Counter */ +#define XEMACPS_LAST_OFFSET 0x000001B4U /**< Last statistic counter + offset, for clearing */ + +#define XEMACPS_1588_SEC_OFFSET 0x000001D0U /**< 1588 second counter */ +#define XEMACPS_1588_NANOSEC_OFFSET 0x000001D4U /**< 1588 nanosecond counter */ +#define XEMACPS_1588_ADJ_OFFSET 0x000001D8U /**< 1588 nanosecond + adjustment counter */ +#define XEMACPS_1588_INC_OFFSET 0x000001DCU /**< 1588 nanosecond + increment counter */ +#define XEMACPS_PTP_TXSEC_OFFSET 0x000001E0U /**< 1588 PTP transmit second + counter */ +#define XEMACPS_PTP_TXNANOSEC_OFFSET 0x000001E4U /**< 1588 PTP transmit + nanosecond counter */ +#define XEMACPS_PTP_RXSEC_OFFSET 0x000001E8U /**< 1588 PTP receive second + counter */ +#define XEMACPS_PTP_RXNANOSEC_OFFSET 0x000001ECU /**< 1588 PTP receive + nanosecond counter */ +#define XEMACPS_PTPP_TXSEC_OFFSET 0x000001F0U /**< 1588 PTP peer transmit + second counter */ +#define XEMACPS_PTPP_TXNANOSEC_OFFSET 0x000001F4U /**< 1588 PTP peer transmit + nanosecond counter */ +#define XEMACPS_PTPP_RXSEC_OFFSET 0x000001F8U /**< 1588 PTP peer receive + second counter */ +#define XEMACPS_PTPP_RXNANOSEC_OFFSET 0x000001FCU /**< 1588 PTP peer receive + nanosecond counter */ + +#define XEMACPS_INTQ1_STS_OFFSET 0x00000400U /**< Interrupt Q1 Status + reg */ +#define XEMACPS_TXQ1BASE_OFFSET 0x00000440U /**< TX Q1 Base address + reg */ +#define XEMACPS_RXQ1BASE_OFFSET 0x00000480U /**< RX Q1 Base address + reg */ +#define XEMACPS_MSBBUF_TXQBASE_OFFSET 0x000004C8U /**< MSB Buffer TX Q Base + reg */ +#define XEMACPS_MSBBUF_RXQBASE_OFFSET 0x000004D4U /**< MSB Buffer RX Q Base + reg */ +#define XEMACPS_INTQ1_IER_OFFSET 0x00000600U /**< Interrupt Q1 Enable + reg */ +#define XEMACPS_INTQ1_IDR_OFFSET 0x00000620U /**< Interrupt Q1 Disable + reg */ +#define XEMACPS_INTQ1_IMR_OFFSET 0x00000640U /**< Interrupt Q1 Mask + reg */ + +/* Define some bit positions for registers. */ + +/** @name network control register bit definitions + * @{ + */ +#define XEMACPS_NWCTRL_FLUSH_DPRAM_MASK 0x00040000U /**< Flush a packet from + Rx SRAM */ +#define XEMACPS_NWCTRL_ZEROPAUSETX_MASK 0x00000800U /**< Transmit zero quantum + pause frame */ +#define XEMACPS_NWCTRL_PAUSETX_MASK 0x00000800U /**< Transmit pause frame */ +#define XEMACPS_NWCTRL_HALTTX_MASK 0x00000400U /**< Halt transmission + after current frame */ +#define XEMACPS_NWCTRL_STARTTX_MASK 0x00000200U /**< Start tx (tx_go) */ + +#define XEMACPS_NWCTRL_STATWEN_MASK 0x00000080U /**< Enable writing to + stat counters */ +#define XEMACPS_NWCTRL_STATINC_MASK 0x00000040U /**< Increment statistic + registers */ +#define XEMACPS_NWCTRL_STATCLR_MASK 0x00000020U /**< Clear statistic + registers */ +#define XEMACPS_NWCTRL_MDEN_MASK 0x00000010U /**< Enable MDIO port */ +#define XEMACPS_NWCTRL_TXEN_MASK 0x00000008U /**< Enable transmit */ +#define XEMACPS_NWCTRL_RXEN_MASK 0x00000004U /**< Enable receive */ +#define XEMACPS_NWCTRL_LOOPEN_MASK 0x00000002U /**< local loopback */ +/*@}*/ + +/** @name network configuration register bit definitions + * @{ + */ +#define XEMACPS_NWCFG_BADPREAMBEN_MASK 0x20000000U /**< disable rejection of + non-standard preamble */ +#define XEMACPS_NWCFG_IPDSTRETCH_MASK 0x10000000U /**< enable transmit IPG */ +#define XEMACPS_NWCFG_SGMIIEN_MASK 0x08000000U /**< SGMII Enable */ +#define XEMACPS_NWCFG_FCSIGNORE_MASK 0x04000000U /**< disable rejection of + FCS error */ +#define XEMACPS_NWCFG_HDRXEN_MASK 0x02000000U /**< RX half duplex */ +#define XEMACPS_NWCFG_RXCHKSUMEN_MASK 0x01000000U /**< enable RX checksum + offload */ +#define XEMACPS_NWCFG_PAUSECOPYDI_MASK 0x00800000U /**< Do not copy pause + Frames to memory */ +#define XEMACPS_NWCFG_DWIDTH_64_MASK 0x00200000U /**< 64 bit Data bus width */ +#define XEMACPS_NWCFG_MDC_SHIFT_MASK 18U /**< shift bits for MDC */ +#define XEMACPS_NWCFG_MDCCLKDIV_MASK 0x001C0000U /**< MDC Mask PCLK divisor */ +#define XEMACPS_NWCFG_FCSREM_MASK 0x00020000U /**< Discard FCS from + received frames */ +#define XEMACPS_NWCFG_LENERRDSCRD_MASK 0x00010000U +/**< RX length error discard */ +#define XEMACPS_NWCFG_RXOFFS_MASK 0x0000C000U /**< RX buffer offset */ +#define XEMACPS_NWCFG_PAUSEEN_MASK 0x00002000U /**< Enable pause RX */ +#define XEMACPS_NWCFG_RETRYTESTEN_MASK 0x00001000U /**< Retry test */ +#define XEMACPS_NWCFG_XTADDMACHEN_MASK 0x00000200U +/**< External address match enable */ +#define XEMACPS_NWCFG_PCSSEL_MASK 0x00000800U /**< PCS Select */ +#define XEMACPS_NWCFG_1000_MASK 0x00000400U /**< 1000 Mbps */ +#define XEMACPS_NWCFG_1536RXEN_MASK 0x00000100U /**< Enable 1536 byte + frames reception */ +#define XEMACPS_NWCFG_UCASTHASHEN_MASK 0x00000080U /**< Receive unicast hash + frames */ +#define XEMACPS_NWCFG_MCASTHASHEN_MASK 0x00000040U /**< Receive multicast hash + frames */ +#define XEMACPS_NWCFG_BCASTDI_MASK 0x00000020U /**< Do not receive + broadcast frames */ +#define XEMACPS_NWCFG_COPYALLEN_MASK 0x00000010U /**< Copy all frames */ +#define XEMACPS_NWCFG_JUMBO_MASK 0x00000008U /**< Jumbo frames */ +#define XEMACPS_NWCFG_NVLANDISC_MASK 0x00000004U /**< Receive only VLAN + frames */ +#define XEMACPS_NWCFG_FDEN_MASK 0x00000002U/**< full duplex */ +#define XEMACPS_NWCFG_100_MASK 0x00000001U /**< 100 Mbps */ +#define XEMACPS_NWCFG_RESET_MASK 0x00080000U/**< reset value */ +/*@}*/ + +/** @name network status register bit definitaions + * @{ + */ +#define XEMACPS_NWSR_MDIOIDLE_MASK 0x00000004U /**< PHY management idle */ +#define XEMACPS_NWSR_MDIO_MASK 0x00000002U /**< Status of mdio_in */ +/*@}*/ + + +/** @name MAC address register word 1 mask + * @{ + */ +#define XEMACPS_LADDR_MACH_MASK 0x0000FFFFU /**< Address bits[47:32] + bit[31:0] are in BOTTOM */ +/*@}*/ + + +/** @name DMA control register bit definitions + * @{ + */ +#define XEMACPS_DMACR_ADDR_WIDTH_64 0x40000000U /**< 64 bit address bus */ +#define XEMACPS_DMACR_TXEXTEND_MASK 0x20000000U /**< Tx Extended desc mode */ +#define XEMACPS_DMACR_RXEXTEND_MASK 0x10000000U /**< Rx Extended desc mode */ +#define XEMACPS_DMACR_RXBUF_MASK 0x00FF0000U /**< Mask bit for RX buffer + size */ +#define XEMACPS_DMACR_RXBUF_SHIFT 16U /**< Shift bit for RX buffer + size */ +#define XEMACPS_DMACR_TCPCKSUM_MASK 0x00000800U /**< enable/disable TX + checksum offload */ +#define XEMACPS_DMACR_TXSIZE_MASK 0x00000400U /**< TX buffer memory size */ +#define XEMACPS_DMACR_RXSIZE_MASK 0x00000300U /**< RX buffer memory size */ +#define XEMACPS_DMACR_ENDIAN_MASK 0x00000080U /**< endian configuration */ +#define XEMACPS_DMACR_BLENGTH_MASK 0x0000001FU /**< buffer burst length */ +#define XEMACPS_DMACR_SINGLE_AHB_BURST 0x00000001U /**< single AHB bursts */ +#define XEMACPS_DMACR_INCR4_AHB_BURST 0x00000004U /**< 4 bytes AHB bursts */ +#define XEMACPS_DMACR_INCR8_AHB_BURST 0x00000008U /**< 8 bytes AHB bursts */ +#define XEMACPS_DMACR_INCR16_AHB_BURST 0x00000010U /**< 16 bytes AHB bursts */ +/*@}*/ + +/** @name transmit status register bit definitions + * @{ + */ +#define XEMACPS_TXSR_HRESPNOK_MASK 0x00000100U /**< Transmit hresp not OK */ +#define XEMACPS_TXSR_URUN_MASK 0x00000040U /**< Transmit underrun */ +#define XEMACPS_TXSR_TXCOMPL_MASK 0x00000020U /**< Transmit completed OK */ +#define XEMACPS_TXSR_BUFEXH_MASK 0x00000010U /**< Transmit buffs exhausted + mid frame */ +#define XEMACPS_TXSR_TXGO_MASK 0x00000008U /**< Status of go flag */ +#define XEMACPS_TXSR_RXOVR_MASK 0x00000004U /**< Retry limit exceeded */ +#define XEMACPS_TXSR_FRAMERX_MASK 0x00000002U /**< Collision tx frame */ +#define XEMACPS_TXSR_USEDREAD_MASK 0x00000001U /**< TX buffer used bit set */ + +#define XEMACPS_TXSR_ERROR_MASK ((u32)XEMACPS_TXSR_HRESPNOK_MASK | \ + (u32)XEMACPS_TXSR_URUN_MASK | \ + (u32)XEMACPS_TXSR_BUFEXH_MASK | \ + (u32)XEMACPS_TXSR_RXOVR_MASK | \ + (u32)XEMACPS_TXSR_FRAMERX_MASK | \ + (u32)XEMACPS_TXSR_USEDREAD_MASK) +/*@}*/ + +/** + * @name receive status register bit definitions + * @{ + */ +#define XEMACPS_RXSR_HRESPNOK_MASK 0x00000008U /**< Receive hresp not OK */ +#define XEMACPS_RXSR_RXOVR_MASK 0x00000004U /**< Receive overrun */ +#define XEMACPS_RXSR_FRAMERX_MASK 0x00000002U /**< Frame received OK */ +#define XEMACPS_RXSR_BUFFNA_MASK 0x00000001U /**< RX buffer used bit set */ + +#define XEMACPS_RXSR_ERROR_MASK ((u32)XEMACPS_RXSR_HRESPNOK_MASK | \ + (u32)XEMACPS_RXSR_RXOVR_MASK | \ + (u32)XEMACPS_RXSR_BUFFNA_MASK) +/*@}*/ + +/** + * @name Interrupt Q1 status register bit definitions + * @{ + */ +#define XEMACPS_INTQ1SR_TXCOMPL_MASK 0x00000080U /**< Transmit completed OK */ +#define XEMACPS_INTQ1SR_TXERR_MASK 0x00000040U /**< Transmit AMBA Error */ + +#define XEMACPS_INTQ1_IXR_ALL_MASK ((u32)XEMACPS_INTQ1SR_TXCOMPL_MASK | \ + (u32)XEMACPS_INTQ1SR_TXERR_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 0x02000000U /**< PTP Psync transmitted */ +#define XEMACPS_IXR_PTPPDRTX_MASK 0x01000000U /**< PTP Pdelay_req + transmitted */ +#define XEMACPS_IXR_PTPSTX_MASK 0x00800000U /**< PTP Sync transmitted */ +#define XEMACPS_IXR_PTPDRTX_MASK 0x00400000U /**< PTP Delay_req transmitted + */ +#define XEMACPS_IXR_PTPPSRX_MASK 0x00200000U /**< PTP Psync received */ +#define XEMACPS_IXR_PTPPDRRX_MASK 0x00100000U /**< PTP Pdelay_req received */ +#define XEMACPS_IXR_PTPSRX_MASK 0x00080000U /**< PTP Sync received */ +#define XEMACPS_IXR_PTPDRRX_MASK 0x00040000U /**< PTP Delay_req received */ +#define XEMACPS_IXR_PAUSETX_MASK 0x00004000U /**< Pause frame transmitted */ +#define XEMACPS_IXR_PAUSEZERO_MASK 0x00002000U /**< Pause time has reached + zero */ +#define XEMACPS_IXR_PAUSENZERO_MASK 0x00001000U /**< Pause frame received */ +#define XEMACPS_IXR_HRESPNOK_MASK 0x00000800U /**< hresp not ok */ +#define XEMACPS_IXR_RXOVR_MASK 0x00000400U /**< Receive overrun occurred */ +#define XEMACPS_IXR_TXCOMPL_MASK 0x00000080U /**< Frame transmitted ok */ +#define XEMACPS_IXR_TXEXH_MASK 0x00000040U /**< Transmit err occurred or + no buffers*/ +#define XEMACPS_IXR_RETRY_MASK 0x00000020U /**< Retry limit exceeded */ +#define XEMACPS_IXR_URUN_MASK 0x00000010U /**< Transmit underrun */ +#define XEMACPS_IXR_TXUSED_MASK 0x00000008U /**< Tx buffer used bit read */ +#define XEMACPS_IXR_RXUSED_MASK 0x00000004U /**< Rx buffer used bit read */ +#define XEMACPS_IXR_FRAMERX_MASK 0x00000002U /**< Frame received ok */ +#define XEMACPS_IXR_MGMNT_MASK 0x00000001U /**< PHY management complete */ +#define XEMACPS_IXR_ALL_MASK 0x00007FFFU /**< Everything! */ + +#define XEMACPS_IXR_TX_ERR_MASK ((u32)XEMACPS_IXR_TXEXH_MASK | \ + (u32)XEMACPS_IXR_RETRY_MASK | \ + (u32)XEMACPS_IXR_URUN_MASK) + + +#define XEMACPS_IXR_RX_ERR_MASK ((u32)XEMACPS_IXR_HRESPNOK_MASK | \ + (u32)XEMACPS_IXR_RXUSED_MASK | \ + (u32)XEMACPS_IXR_RXOVR_MASK) + +/*@}*/ + +/** @name PHY Maintenance bit definitions + * @{ + */ +#define XEMACPS_PHYMNTNC_OP_MASK 0x40020000U /**< operation mask bits */ +#define XEMACPS_PHYMNTNC_OP_R_MASK 0x20000000U /**< read operation */ +#define XEMACPS_PHYMNTNC_OP_W_MASK 0x10000000U /**< write operation */ +#define XEMACPS_PHYMNTNC_ADDR_MASK 0x0F800000U /**< Address bits */ +#define XEMACPS_PHYMNTNC_REG_MASK 0x007C0000U /**< register bits */ +#define XEMACPS_PHYMNTNC_DATA_MASK 0x00000FFFU /**< data bits */ +#define XEMACPS_PHYMNTNC_PHAD_SHFT_MSK 23U /**< Shift bits for PHYAD */ +#define XEMACPS_PHYMNTNC_PREG_SHFT_MSK 18U /**< Shift bits for PHREG */ +/*@}*/ + +/* Transmit buffer descriptor status words offset + * @{ + */ +#define XEMACPS_BD_ADDR_OFFSET 0x00000000U /**< word 0/addr of BDs */ +#define XEMACPS_BD_STAT_OFFSET 0x00000004U /**< word 1/status of BDs */ +#define XEMACPS_BD_ADDR_HI_OFFSET 0x00000008U /**< word 2/addr 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 0x80000000U /**< Used bit. */ +#define XEMACPS_TXBUF_WRAP_MASK 0x40000000U /**< Wrap bit, last descriptor */ +#define XEMACPS_TXBUF_RETRY_MASK 0x20000000U /**< Retry limit exceeded */ +#define XEMACPS_TXBUF_URUN_MASK 0x10000000U /**< Transmit underrun occurred */ +#define XEMACPS_TXBUF_EXH_MASK 0x08000000U /**< Buffers exhausted */ +#define XEMACPS_TXBUF_TCP_MASK 0x04000000U /**< Late collision. */ +#define XEMACPS_TXBUF_NOCRC_MASK 0x00010000U /**< No CRC */ +#define XEMACPS_TXBUF_LAST_MASK 0x00008000U /**< Last buffer */ +#define XEMACPS_TXBUF_LEN_MASK 0x00003FFFU /**< 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 0x80000000U /**< Broadcast frame */ +#define XEMACPS_RXBUF_MULTIHASH_MASK 0x40000000U /**< Multicast hashed frame */ +#define XEMACPS_RXBUF_UNIHASH_MASK 0x20000000U /**< Unicast hashed frame */ +#define XEMACPS_RXBUF_EXH_MASK 0x08000000U /**< buffer exhausted */ +#define XEMACPS_RXBUF_AMATCH_MASK 0x06000000U /**< Specific address + matched */ +#define XEMACPS_RXBUF_IDFOUND_MASK 0x01000000U /**< Type ID matched */ +#define XEMACPS_RXBUF_IDMATCH_MASK 0x00C00000U /**< ID matched mask */ +#define XEMACPS_RXBUF_VLAN_MASK 0x00200000U /**< VLAN tagged */ +#define XEMACPS_RXBUF_PRI_MASK 0x00100000U /**< Priority tagged */ +#define XEMACPS_RXBUF_VPRI_MASK 0x000E0000U /**< Vlan priority */ +#define XEMACPS_RXBUF_CFI_MASK 0x00010000U /**< CFI frame */ +#define XEMACPS_RXBUF_EOF_MASK 0x00008000U /**< End of frame. */ +#define XEMACPS_RXBUF_SOF_MASK 0x00004000U /**< Start of frame. */ +#define XEMACPS_RXBUF_LEN_MASK 0x00001FFFU /**< Mask for length field */ +#define XEMACPS_RXBUF_LEN_JUMBO_MASK 0x00003FFFU /**< Mask for jumbo length */ + +#define XEMACPS_RXBUF_WRAP_MASK 0x00000002U /**< Wrap bit, last BD */ +#define XEMACPS_RXBUF_NEW_MASK 0x00000001U /**< Used bit.. */ +#define XEMACPS_RXBUF_ADD_MASK 0xFFFFFFFCU /**< Mask for address */ +/* + * @} + */ + +/* + * Define appropriate I/O access method to memory mapped I/O or other + * interface 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) + (u32)(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) + (u32)(RegOffset), (u32)(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xenv.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xenv.h new file mode 100644 index 0000000..3d97beb --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xenv.h @@ -0,0 +1,187 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00b ch   10/24/02 Added XENV_LINUX
    +* 1.00a rmm  04/17/02 First release
    +* 
    +* +******************************************************************************/ + +#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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xenv_standalone.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xenv_standalone.h new file mode 100644 index 0000000..f186018 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xenv_standalone.h @@ -0,0 +1,368 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @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. +* +*
    +* 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
    +*
    +* 
    +* +* +******************************************************************************/ + +#ifndef XENV_STANDALONE_H +#define XENV_STANDALONE_H + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +/****************************************************************************** + * + * Get the processor dependent includes + * + ******************************************************************************/ + +#include + +#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, (s32) 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 s32 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) + *

    + * 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((s32)(Addr), (s32)(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((s32)(Addr), (s32)(Len)) +#else +# define XCACHE_FLUSH_DCACHE() microblaze_invalidate_dcache() +# define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + microblaze_invalidate_dcache_range((s32)(Addr), (s32)(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((s32)(Addr), (s32)(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((u32)(Addr), (u32)(Len)) + +#define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + XCache_FlushDCacheRange((u32)(Addr), (u32)(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xgpiops.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xgpiops.h new file mode 100644 index 0000000..fda562d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xgpiops.h @@ -0,0 +1,277 @@ + +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops.h +* @addtogroup gpiops_v3_3 +* @{ +* @details +* +* 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. +* +* Driver Description +* +* The device driver enables higher layer software (e.g., an application) to +* communicate to the GPIO. +* +* Interrupts +* +* 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. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Asserts +* +* 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. +* +* Building the driver +* +* 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. +*

    +* +*
    +* 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
    +* 2.1   hk   04/29/14 Use Input data register DATA_RO for read. CR# 771667.
    +* 2.2	sk	 10/13/14 Used Pin number in Bank instead of pin number
    +* 					  passed to APIs. CR# 822636
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn  04/13/15 Add support for Zynq Ultrascale+ MP. CR# 856980.
    +*       ms   03/17/17 Added readme.txt file in examples folder for doxygen
    +*                     generation.
    +*       ms   04/05/17 Added tabspace for return statements in functions of
    +*                     gpiops examples for proper documentation while
    +*                     generating doxygen.
    +* 3.3   ms   04/17/17 Added notes about gpio input and output pin description
    +*                     for zcu102 and zc702 boards in polled and interrupt
    +*                     example, configured Interrupt pin to input pin for
    +*                     proper functioning of interrupt example.
    +* 
    +* +******************************************************************************/ +#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" +#include "xplatform_info.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 0x00U /**< Interrupt on Rising edge */ +#define XGPIOPS_IRQ_TYPE_EDGE_FALLING 0x01U /**< Interrupt Falling edge */ +#define XGPIOPS_IRQ_TYPE_EDGE_BOTH 0x02U /**< Interrupt on both edges */ +#define XGPIOPS_IRQ_TYPE_LEVEL_HIGH 0x03U /**< Interrupt on high level */ +#define XGPIOPS_IRQ_TYPE_LEVEL_LOW 0x04U /**< Interrupt on low level */ +/*@}*/ + +#define XGPIOPS_BANK_MAX_PINS (u32)32 /**< Max pins in a GPIO bank */ +#define XGPIOPS_BANK0 0x00U /**< GPIO Bank 0 */ +#define XGPIOPS_BANK1 0x01U /**< GPIO Bank 1 */ +#define XGPIOPS_BANK2 0x02U /**< GPIO Bank 2 */ +#define XGPIOPS_BANK3 0x03U /**< GPIO Bank 3 */ + +#ifdef XPAR_PSU_GPIO_0_BASEADDR +#define XGPIOPS_BANK4 0x04U /**< GPIO Bank 4 */ +#define XGPIOPS_BANK5 0x05U /**< GPIO Bank 5 */ +#endif + +#define XGPIOPS_MAX_BANKS_ZYNQMP 0x06U /**< Max banks in a + * Zynq Ultrascale+ MP GPIO device + */ +#define XGPIOPS_MAX_BANKS 0x04U /**< Max banks in a Zynq GPIO device */ + +#define XGPIOPS_DEVICE_MAX_PIN_NUM_ZYNQMP (u32)174 /**< Max pins in the + * Zynq Ultrascale+ MP GPIO device + * 0 - 25, Bank 0 + * 26 - 51, Bank 1 + * 52 - 77, Bank 2 + * 78 - 109, Bank 3 + * 110 - 141, Bank 4 + * 142 - 173, Bank 5 + */ +#define XGPIOPS_DEVICE_MAX_PIN_NUM (u32)118 /**< Max pins in the Zynq 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, u32 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 */ + u32 Platform; /**< Platform data */ + u32 MaxPinNum; /**< Max pins in the GPIO device */ + u8 MaxBanks; /**< Max banks in a GPIO device */ +} XGpioPs; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/* Functions in xgpiops.c */ +s32 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 OpEnable); +u32 XGpioPs_GetOutputEnable(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_GetBankPin(u8 PinNumber, u8 *BankNumber, u8 *PinNumberInBank); + +/* Pin APIs in xgpiops.c */ +u32 XGpioPs_ReadPin(XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_WritePin(XGpioPs *InstancePtr, u32 Pin, u32 Data); +void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, u32 Pin, u32 Direction); +u32 XGpioPs_GetDirectionPin(XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, u32 Pin, u32 OpEnable); +u32 XGpioPs_GetOutputEnablePin(XGpioPs *InstancePtr, u32 Pin); + +/* Diagnostic functions in xgpiops_selftest.c */ +s32 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 FuncPointer); +void XGpioPs_IntrHandler(XGpioPs *InstancePtr); + +/* Pin APIs in xgpiops_intr.c */ +void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, u32 Pin, u8 IrqType); +u8 XGpioPs_GetIntrTypePin(XGpioPs *InstancePtr, u32 Pin); + +void XGpioPs_IntrEnablePin(XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_IntrDisablePin(XGpioPs *InstancePtr, u32 Pin); +u32 XGpioPs_IntrGetEnabledPin(XGpioPs *InstancePtr, u32 Pin); +u32 XGpioPs_IntrGetStatusPin(XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_IntrClearPin(XGpioPs *InstancePtr, u32 Pin); + +/* Functions in xgpiops_sinit.c */ +XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xgpiops_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xgpiops_hw.h new file mode 100644 index 0000000..ff01906 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xgpiops_hw.h @@ -0,0 +1,164 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_hw.h +* @addtogroup gpiops_v3_3 +* @{ +* +* 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. +* +*
    +* 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
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn  04/13/15 Corrected reset values of banks.
    +* 
    +* +******************************************************************************/ +#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 0x00000000U /* Mask and Data Register LSW, WO */ +#define XGPIOPS_DATA_MSW_OFFSET 0x00000004U /* Mask and Data Register MSW, WO */ +#define XGPIOPS_DATA_OFFSET 0x00000040U /* Data Register, RW */ +#define XGPIOPS_DATA_RO_OFFSET 0x00000060U /* Data Register - Input, RO */ +#define XGPIOPS_DIRM_OFFSET 0x00000204U /* Direction Mode Register, RW */ +#define XGPIOPS_OUTEN_OFFSET 0x00000208U /* Output Enable Register, RW */ +#define XGPIOPS_INTMASK_OFFSET 0x0000020CU /* Interrupt Mask Register, RO */ +#define XGPIOPS_INTEN_OFFSET 0x00000210U /* Interrupt Enable Register, WO */ +#define XGPIOPS_INTDIS_OFFSET 0x00000214U /* Interrupt Disable Register, WO*/ +#define XGPIOPS_INTSTS_OFFSET 0x00000218U /* Interrupt Status Register, RO */ +#define XGPIOPS_INTTYPE_OFFSET 0x0000021CU /* Interrupt Type Register, RW */ +#define XGPIOPS_INTPOL_OFFSET 0x00000220U /* Interrupt Polarity Register, RW */ +#define XGPIOPS_INTANY_OFFSET 0x00000224U /* Interrupt On Any Register, RW */ +/* @} */ + +/** @name Register offsets for each Bank. + * @{ + */ +#define XGPIOPS_DATA_MASK_OFFSET 0x00000008U /* Data/Mask Registers offset */ +#define XGPIOPS_DATA_BANK_OFFSET 0x00000004U /* Data Registers offset */ +#define XGPIOPS_REG_MASK_OFFSET 0x00000040U /* Registers offset */ +/* @} */ + +/* For backwards compatibility */ +#define XGPIOPS_BYPM_MASK_OFFSET (u32)0x40 + +/** @name Interrupt type reset values for each bank + * @{ + */ +#ifdef XPAR_PSU_GPIO_0_BASEADDR +#define XGPIOPS_INTTYPE_BANK0_RESET 0x03FFFFFFU /* Resets specific to Zynq Ultrascale+ MP */ +#define XGPIOPS_INTTYPE_BANK1_RESET 0x03FFFFFFU +#define XGPIOPS_INTTYPE_BANK2_RESET 0x03FFFFFFU +#else +#define XGPIOPS_INTTYPE_BANK0_RESET 0xFFFFFFFFU /* Resets specific to Zynq */ +#define XGPIOPS_INTTYPE_BANK1_RESET 0x003FFFFFU +#define XGPIOPS_INTTYPE_BANK2_RESET 0xFFFFFFFFU +#endif + +#define XGPIOPS_INTTYPE_BANK3_RESET 0xFFFFFFFFU /* Reset common to both platforms */ +#define XGPIOPS_INTTYPE_BANK4_RESET 0xFFFFFFFFU /* Resets specific to Zynq Ultrascale+ MP */ +#define XGPIOPS_INTTYPE_BANK5_RESET 0xFFFFFFFFU +/* @} */ + +/**************************** 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) + (u32)(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) + (u32)(RegOffset), (u32)(Data)) + +/************************** Function Prototypes ******************************/ + +void XGpioPs_ResetHw(u32 BaseAddress); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XGPIOPS_HW_H */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xiicps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xiicps.h new file mode 100644 index 0000000..d3713de --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xiicps.h @@ -0,0 +1,425 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps.h +* @addtogroup iicps_v3_7 +* @{ +* @details +* +* 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. +* +* Initialization & Configuration +* +* 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. +* +* Multiple Masters +* +* More than one master can exist, bus arbitration is defined in the IIC +* standard. Lost of arbitration causes arbitration loss interrupt on the device. +* +* Multiple Slaves +* +* 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. +* +* Addressing +* +* 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. +* +* FIFO Size +* 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. +* +* Data Rates +* +* 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. +* +* Polled Mode Operation +* +* This driver supports polled mode transfers. +* +* Interrupts +* +* 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 +* +* Bus Busy +* +* Bus busy is checked before the setup of a master mode device, to avoid +* unnecessary arbitration loss interrupt. +* +* RTOS Independence +* +* 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. +* +*Repeated Start +* +* The I2C controller does not indicate completion of a receive transfer if HOLD +* bit is set. Due to this errata, repeated start cannot be used if a receive +* transfer is followed by any other transfer. +* +*
     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.
    +* 2.0   hk  03/07/14 Added check for error status in the while loop that
    +*                    checks for completion.
    +*                    (XIicPs_MasterSendPolled function). CR# 762244, 764875.
    +*                    Limited frequency set when 100KHz or 400KHz is
    +*                    selected. This is a hardware limitation. CR#779290.
    +* 2.1   hk  04/24/14 Fix for CR# 789821 to handle >14 byte transfers.
    +*                    Explicitly reset CR and clear FIFO in Abort function
    +*                    and state the same in the comments. CR# 784254.
    +*                    Fix for CR# 761060 - provision for repeated start.
    +* 2.2   hk  08/23/14 Slave monitor mode changes - clear FIFO, enable
    +*                    read mode and clear transfer size register.
    +*                    Disable NACK to avoid interrupts on each retry.
    +* 2.3	sk	10/07/14 Repeated start feature deleted.
    +* 3.0	sk	11/03/14 Modified TimeOut Register value to 0xFF
    +* 					 in XIicPs_Reset.
    +* 			12/06/14 Implemented Repeated start feature.
    +*			01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +*			02/18/15 Implemented larger data transfer using repeated start
    +*					  in Zynq UltraScale MP.
    +* 3.3   kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +* 3.7   ask  04/17/18 Updated the Eeprom scanning mechanism
    +*                     as per the other examples (CR#997545)
    +*
    +* 
    +* +******************************************************************************/ + +#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" +#include "xplatform_info.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 0x01U /**< 7-bit address mode */ +#define XIICPS_10_BIT_ADDR_OPTION 0x02U /**< 10-bit address mode */ +#define XIICPS_SLAVE_MON_OPTION 0x04U /**< Slave monitor mode */ +#define XIICPS_REP_START_OPTION 0x08U /**< 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 0x0001U /**< Transmit Complete Event*/ +#define XIICPS_EVENT_COMPLETE_RECV 0x0002U /**< Receive Complete Event*/ +#define XIICPS_EVENT_TIME_OUT 0x0004U /**< Transfer timed out */ +#define XIICPS_EVENT_ERROR 0x0008U /**< Receive error */ +#define XIICPS_EVENT_ARB_LOST 0x0010U /**< Arbitration lost */ +#define XIICPS_EVENT_NACK 0x0020U /**< NACK Received */ +#define XIICPS_EVENT_SLAVE_RDY 0x0040U /**< Slave ready */ +#define XIICPS_EVENT_RX_OVR 0x0080U /**< RX overflow */ +#define XIICPS_EVENT_TX_OVR 0x0100U /**< TX overflow */ +#define XIICPS_EVENT_RX_UNF 0x0200U /**< 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 */ + +/* Maximum transfer size */ +#define XIICPS_MAX_TRANSFER_SIZE (u32)(255U - 3U) + +/**************************** 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 */ + s32 SendByteCount; /* Number of bytes still expected to send */ + s32 RecvByteCount; /* Number of bytes still expected to receive */ + s32 CurrByteCount; /* No. of bytes expected in current transfer */ + + s32 UpdateTxSize; /* If tx size register has to be updated */ + s32 IsSend; /* Whether master is sending or receiving */ + s32 IsRepeatedStart; /* Indicates if user set repeated start */ + + 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) \ +{ \ + u8 Data; \ + Data = *((InstancePtr)->SendBufferPtr); \ + XIicPs_Out32((InstancePtr)->Config.BaseAddress \ + + (u32)(XIICPS_DATA_OFFSET), \ + (u32)(Data)); \ + (InstancePtr)->SendBufferPtr += 1; \ + (InstancePtr)->SendByteCount -= 1;\ +} + +/****************************************************************************/ +/* +* +* 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) \ +{ \ + u8 *Data, Value; \ + Value = (u8)(XIicPs_In32((InstancePtr)->Config.BaseAddress \ + + (u32)XIICPS_DATA_OFFSET)); \ + Data = &Value; \ + *(InstancePtr)->RecvBufferPtr = *Data; \ + (InstancePtr)->RecvBufferPtr += 1; \ + (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 + */ +s32 XIicPs_CfgInitialize(XIicPs *InstancePtr, XIicPs_Config * ConfigPtr, + u32 EffectiveAddr); + +void XIicPs_Abort(XIicPs *InstancePtr); +void XIicPs_Reset(XIicPs *InstancePtr); + +s32 XIicPs_BusIsBusy(XIicPs *InstancePtr); +s32 TransmitFifoFill(XIicPs *InstancePtr); + +/* + * Functions for interrupts, in xiicps_intr.c + */ +void XIicPs_SetStatusHandler(XIicPs *InstancePtr, void *CallBackRef, + XIicPs_IntrHandler FunctionPtr); + +/* + * Functions for device as master, in xiicps_master.c + */ +void XIicPs_MasterSend(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount, + u16 SlaveAddr); +void XIicPs_MasterRecv(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount, + u16 SlaveAddr); +s32 XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount, + u16 SlaveAddr); +s32 XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 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, s32 ByteCount); +void XIicPs_SlaveRecv(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount); +s32 XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount); +s32 XIicPs_SlaveRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount); +void XIicPs_SlaveInterruptHandler(XIicPs *InstancePtr); + +/* + * Functions for selftest, in xiicps_selftest.c + */ +s32 XIicPs_SelfTest(XIicPs *InstancePtr); + +/* + * Functions for setting and getting data rate, in xiicps_options.c + */ +s32 XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options); +s32 XIicPs_ClearOptions(XIicPs *InstancePtr, u32 Options); +u32 XIicPs_GetOptions(XIicPs *InstancePtr); + +s32 XIicPs_SetSClk(XIicPs *InstancePtr, u32 FsclHz); +u32 XIicPs_GetSClk(XIicPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xiicps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xiicps_hw.h new file mode 100644 index 0000000..e9d63ec --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xiicps_hw.h @@ -0,0 +1,383 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_hw.h +* @addtogroup iicps_v3_7 +* @{ +* +* This header file contains the hardware definition for an IIC device. +* It includes register definitions and interface functions to read/write +* the registers. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who 	Date     Changes
    +* ----- ------  -------- -----------------------------------------------
    +* 1.00a drg/jz  01/30/10 First release
    +* 1.04a kpc		11/07/13 Added function prototype.
    +* 3.0	sk		11/03/14 Modified the TimeOut Register value to 0xFF
    +*				01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +* 
    +* +******************************************************************************/ +#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 0x00U /**< 32-bit Control */ +#define XIICPS_SR_OFFSET 0x04U /**< Status */ +#define XIICPS_ADDR_OFFSET 0x08U /**< IIC Address */ +#define XIICPS_DATA_OFFSET 0x0CU /**< IIC FIFO Data */ +#define XIICPS_ISR_OFFSET 0x10U /**< Interrupt Status */ +#define XIICPS_TRANS_SIZE_OFFSET 0x14U /**< Transfer Size */ +#define XIICPS_SLV_PAUSE_OFFSET 0x18U /**< Slave monitor pause */ +#define XIICPS_TIME_OUT_OFFSET 0x1CU /**< Time Out */ +#define XIICPS_IMR_OFFSET 0x20U /**< Interrupt Enabled Mask */ +#define XIICPS_IER_OFFSET 0x24U /**< Interrupt Enable */ +#define XIICPS_IDR_OFFSET 0x28U /**< 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 0x0000C000U /**< Clock Divisor A */ +#define XIICPS_CR_DIV_A_SHIFT 14U /**< Clock Divisor A shift */ +#define XIICPS_DIV_A_MAX 4U /**< Maximum value of Divisor A */ +#define XIICPS_CR_DIV_B_MASK 0x00003F00U /**< Clock Divisor B */ +#define XIICPS_CR_DIV_B_SHIFT 8U /**< Clock Divisor B shift */ +#define XIICPS_CR_CLR_FIFO_MASK 0x00000040U /**< Clear FIFO, auto clears*/ +#define XIICPS_CR_SLVMON_MASK 0x00000020U /**< Slave monitor mode */ +#define XIICPS_CR_HOLD_MASK 0x00000010U /**< Hold bus 1=Hold scl, + 0=terminate transfer */ +#define XIICPS_CR_ACKEN_MASK 0x00000008U /**< Enable TX of ACK when + Master receiver*/ +#define XIICPS_CR_NEA_MASK 0x00000004U /**< Addressing Mode 1=7 bit, + 0=10 bit */ +#define XIICPS_CR_MS_MASK 0x00000002U /**< Master mode bit 1=Master, + 0=Slave */ +#define XIICPS_CR_RD_WR_MASK 0x00000001U /**< Read or Write Master + transfer 0=Transmitter, + 1=Receiver*/ +#define XIICPS_CR_RESET_VALUE 0U /**< 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 0x00000100U /**< Bus Active Mask */ +#define XIICPS_SR_RXOVF_MASK 0x00000080U /**< Receiver Overflow Mask */ +#define XIICPS_SR_TXDV_MASK 0x00000040U /**< Transmit Data Valid Mask */ +#define XIICPS_SR_RXDV_MASK 0x00000020U /**< Receiver Data Valid Mask */ +#define XIICPS_SR_RXRW_MASK 0x00000008U /**< 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 + * + * IIC Interrupt Status Register + * + * 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. + * + * IIC Interrupt Enable Register + * + * 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. + * + * IIC Interrupt Disable Register + * + * 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. + * + * IIC Interrupt Mask Register + * + * 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 0x00000200U /**< Arbitration Lost Interrupt + mask */ +#define XIICPS_IXR_RX_UNF_MASK 0x00000080U /**< FIFO Recieve Underflow + Interrupt mask */ +#define XIICPS_IXR_TX_OVR_MASK 0x00000040U /**< Transmit Overflow + Interrupt mask */ +#define XIICPS_IXR_RX_OVR_MASK 0x00000020U /**< Receive Overflow Interrupt + mask */ +#define XIICPS_IXR_SLV_RDY_MASK 0x00000010U /**< Monitored Slave Ready + Interrupt mask */ +#define XIICPS_IXR_TO_MASK 0x00000008U /**< Transfer Time Out + Interrupt mask */ +#define XIICPS_IXR_NACK_MASK 0x00000004U /**< NACK Interrupt mask */ +#define XIICPS_IXR_DATA_MASK 0x00000002U /**< Data Interrupt mask */ +#define XIICPS_IXR_COMP_MASK 0x00000001U /**< Transfer Complete + Interrupt mask */ +#define XIICPS_IXR_DEFAULT_MASK 0x000002FFU /**< Default ISR Mask */ +#define XIICPS_IXR_ALL_INTR_MASK 0x000002FFU /**< 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 0x000000FFU /**< IIC Time Out mask */ +#define XIICPS_TO_RESET_VALUE 0x000000FFU /**< 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) + (u32)(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) + (u32)(RegOffset), (u32)(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 BaseAddress); +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_assert.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_assert.h new file mode 100644 index 0000000..add4124 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_assert.h @@ -0,0 +1,195 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_assert.h +* +* @addtogroup common_assert_apis Assert APIs and Macros +* +* The xil_assert.h file contains assert related functions and macros. +* Assert APIs/Macros specifies that a application program satisfies certain +* conditions at particular points in its execution. These function can be +* used by application programs to ensure that, application code is satisfying +* certain conditions. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date   Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a hbm  07/14/09 First release
    +* 6.0   kvn  05/31/16 Make Xil_AsserWait a global variable
    +* 
    +* +******************************************************************************/ + +#ifndef XIL_ASSERT_H /* prevent circular inclusions */ +#define XIL_ASSERT_H /* by using protection macros */ + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ + + +/************************** Constant Definitions *****************************/ + +#define XIL_ASSERT_NONE 0U +#define XIL_ASSERT_OCCURRED 1U +#define XNULL NULL + +extern u32 Xil_AssertStatus; +extern s32 Xil_AssertWait; +extern void Xil_Assert(const char8 *File, s32 Line); +void XNullHandler(void *NullParameter); + +/** + * 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 char8 *File, s32 Line); + +/***************** Macros (Inline Functions) Definitions *********************/ + +#ifndef NDEBUG + +/*****************************************************************************/ +/** +* @brief This assert macro is to be used for void functions. 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: expression to be evaluated. 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. +* +******************************************************************************/ +#define Xil_AssertVoid(Expression) \ +{ \ + if (Expression) { \ + Xil_AssertStatus = XIL_ASSERT_NONE; \ + } else { \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return; \ + } \ +} + +/*****************************************************************************/ +/** +* @brief 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: expression to be evaluated. 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. +* +******************************************************************************/ +#define Xil_AssertNonvoid(Expression) \ +{ \ + if (Expression) { \ + Xil_AssertStatus = XIL_ASSERT_NONE; \ + } else { \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return 0; \ + } \ +} + +/*****************************************************************************/ +/** +* @brief Always assert. This assert macro is to be used for void functions. +* 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. +* +******************************************************************************/ +#define Xil_AssertVoidAlways() \ +{ \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return; \ +} + +/*****************************************************************************/ +/** +* @brief 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. +* +******************************************************************************/ +#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 */ +/** +* @} End of "addtogroup common_assert_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache.h new file mode 100644 index 0000000..b6614d5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache.h @@ -0,0 +1,121 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache.h +* +* @addtogroup a9_cache_apis Cortex A9 Processor Cache Functions +* +* Cache functions provide access to cache related operations such as flush +* and invalidate for instruction and data caches. It gives option to perform +* the cache operations on a single cacheline, a range of memory and an entire +* cache. +* +* @{ +* +*
    +* 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.
    +* 
    +* +******************************************************************************/ +#ifndef XIL_CACHE_H +#define XIL_CACHE_H + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __GNUC__ + +#define asm_cp15_inval_dc_line_mva_poc(param) __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_DC_LINE_MVA_POC :: "r" (param)); + +#define asm_cp15_clean_inval_dc_line_mva_poc(param) __asm__ __volatile__("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (param)); + +#define asm_cp15_inval_ic_line_mva_pou(param) __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_IC_LINE_MVA_POU :: "r" (param)); + +#define asm_cp15_inval_dc_line_sw(param) __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_DC_LINE_SW :: "r" (param)); + +#define asm_cp15_clean_inval_dc_line_sw(param) __asm__ __volatile__("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_SW :: "r" (param)); + +#elif defined (__ICCARM__) + +#define asm_cp15_inval_dc_line_mva_poc(param) __asm volatile ("mcr " \ + XREG_CP15_INVAL_DC_LINE_MVA_POC :: "r" (param)); + +#define asm_cp15_clean_inval_dc_line_mva_poc(param) __asm volatile ("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (param)); + +#define asm_cp15_inval_ic_line_mva_pou(param) __asm volatile ("mcr " \ + XREG_CP15_INVAL_IC_LINE_MVA_POU :: "r" (param)); + +#define asm_cp15_inval_dc_line_sw(param) __asm volatile ("mcr " \ + XREG_CP15_INVAL_DC_LINE_SW :: "r" (param)); + +#define asm_cp15_clean_inval_dc_line_sw(param) __asm volatile ("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_SW :: "r" (param)); + +#endif + +void Xil_DCacheEnable(void); +void Xil_DCacheDisable(void); +void Xil_DCacheInvalidate(void); +void Xil_DCacheInvalidateRange(INTPTR adr, u32 len); +void Xil_DCacheFlush(void); +void Xil_DCacheFlushRange(INTPTR adr, u32 len); + +void Xil_ICacheEnable(void); +void Xil_ICacheDisable(void); +void Xil_ICacheInvalidate(void); +void Xil_ICacheInvalidateRange(INTPTR adr, u32 len); + +#ifdef __cplusplus +} +#endif + +#endif +/** +* @} End of "addtogroup a9_cache_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache_l.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache_l.h new file mode 100644 index 0000000..fa92c6b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache_l.h @@ -0,0 +1,100 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @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. +* +* @addtogroup a9_cache_apis +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a ecm  01/24/10 First release
    +* 
    +* +******************************************************************************/ +#ifndef XIL_CACHE_MACH_H +#define XIL_CACHE_MACH_H + +#include "xil_types.h" +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Function Prototypes ******************************/ + +void Xil_DCacheInvalidateLine(u32 adr); +void Xil_DCacheFlushLine(u32 adr); +void Xil_DCacheStoreLine(u32 adr); +void Xil_ICacheInvalidateLine(u32 adr); + +void Xil_L1DCacheEnable(void); +void Xil_L1DCacheDisable(void); +void Xil_L1DCacheInvalidate(void); +void Xil_L1DCacheInvalidateLine(u32 adr); +void Xil_L1DCacheInvalidateRange(u32 adr, u32 len); +void Xil_L1DCacheFlush(void); +void Xil_L1DCacheFlushLine(u32 adr); +void Xil_L1DCacheFlushRange(u32 adr, u32 len); +void Xil_L1DCacheStoreLine(u32 adr); + +void Xil_L1ICacheEnable(void); +void Xil_L1ICacheDisable(void); +void Xil_L1ICacheInvalidate(void); +void Xil_L1ICacheInvalidateLine(u32 adr); +void Xil_L1ICacheInvalidateRange(u32 adr, u32 len); + +void Xil_L2CacheEnable(void); +void Xil_L2CacheDisable(void); +void Xil_L2CacheInvalidate(void); +void Xil_L2CacheInvalidateLine(u32 adr); +void Xil_L2CacheInvalidateRange(u32 adr, u32 len); +void Xil_L2CacheFlush(void); +void Xil_L2CacheFlushLine(u32 adr); +void Xil_L2CacheFlushRange(u32 adr, u32 len); +void Xil_L2CacheStoreLine(u32 adr); + +#ifdef __cplusplus +} +#endif + +#endif +/** +* @} End of "addtogroup a9_cache_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache_vxworks.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache_vxworks.h new file mode 100644 index 0000000..6e8cfa7 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_cache_vxworks.h @@ -0,0 +1,93 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache_vxworks.h +* +* Contains the cache related functions for VxWorks that is wrapped by +* xil_cache. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a hbm  12/11/09 Initial release
    +*
    +* 
    +* +* @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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_errata.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_errata.h new file mode 100644 index 0000000..490aebe --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_errata.h @@ -0,0 +1,123 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_errata.h +* +* @addtogroup a9_errata Cortex A9 Processor and pl310 Errata Support +* @{ +* Various ARM errata are handled in the standalone BSP. The implementation for +* errata handling follows ARM guidelines and is based on the open source Linux +* support for these errata. +* +* @note +* The errata handling is enabled by default. To disable handling of all the +* errata globally, un-define the macro ENABLE_ARM_ERRATA in xil_errata.h. To +* disable errata on a per-erratum basis, un-define relevant macros in +* xil_errata.h. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a srt  04/18/13 First release
    +* 6.6   mus  12/07/17 Removed errata 753970, It fixes CR#989132.
    +* 
    +* +******************************************************************************/ +#ifndef XIL_ERRATA_H +#define XIL_ERRATA_H + +/** + * @name errata_definitions + * + * The errata conditions handled in the standalone BSP are listed below + * @{ + */ + +#define ENABLE_ARM_ERRATA 1 + +#ifdef ENABLE_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 + +/*@}*/ +#endif /* ENABLE_ARM_ERRATA */ + +#endif /* XIL_ERRATA_H */ +/** +* @} End of "addtogroup a9_errata". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_exception.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_exception.h new file mode 100644 index 0000000..8330387 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_exception.h @@ -0,0 +1,260 @@ +/****************************************************************************** +* +* Copyright (C) 2015 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_exception.h +* +* This header file contains ARM Cortex A53,A9,R5 specific exception related APIs. +* For exception related functions that can be used across all Xilinx supported +* processors, please use xil_exception.h. +* +* @addtogroup arm_exception_apis ARM Processor Exception Handling +* @{ +* ARM processors specific exception related APIs for cortex A53,A9 and R5 can +* utilized for enabling/disabling IRQ, registering/removing handler for +* exceptions or initializing exception vector table with null handler. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 5.2	pkp  	 28/05/15 First release
    +* 6.0   mus      27/07/16 Consolidated file for a53,a9 and r5 processors
    +* 6.7   mna      26/04/18 Add API Xil_GetExceptionRegisterHandler.
    +* 6.7   asa      18/05/18 Update signature of API Xil_GetExceptionRegisterHandler.
    +* 
    +* +******************************************************************************/ + +#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 0U +#if defined (__aarch64__) +#define XIL_EXCEPTION_ID_SYNC_INT 1U +#define XIL_EXCEPTION_ID_IRQ_INT 2U +#define XIL_EXCEPTION_ID_FIQ_INT 3U +#define XIL_EXCEPTION_ID_SERROR_ABORT_INT 4U +#define XIL_EXCEPTION_ID_LAST 5U +#else +#define XIL_EXCEPTION_ID_RESET 0U +#define XIL_EXCEPTION_ID_UNDEFINED_INT 1U +#define XIL_EXCEPTION_ID_SWI_INT 2U +#define XIL_EXCEPTION_ID_PREFETCH_ABORT_INT 3U +#define XIL_EXCEPTION_ID_DATA_ABORT_INT 4U +#define XIL_EXCEPTION_ID_IRQ_INT 5U +#define XIL_EXCEPTION_ID_FIQ_INT 6U +#define XIL_EXCEPTION_ID_LAST 6U +#endif + +/* + * 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 ********************/ + +/****************************************************************************/ +/** +* @brief Enable Exceptions. +* +* @param Mask: Value for enabling the exceptions. +* +* @return None. +* +* @note If bit is 0, exception is enabled. +* C-Style signature: void Xil_ExceptionEnableMask(Mask) +* +******************************************************************************/ +#if defined (__GNUC__) || defined (__ICCARM__) +#define Xil_ExceptionEnableMask(Mask) \ + mtcpsr(mfcpsr() & ~ ((Mask) & XIL_EXCEPTION_ALL)) +#else +#define Xil_ExceptionEnableMask(Mask) \ + { \ + register u32 Reg __asm("cpsr"); \ + mtcpsr((Reg) & (~((Mask) & XIL_EXCEPTION_ALL))); \ + } +#endif +/****************************************************************************/ +/** +* @brief Enable the IRQ exception. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +#define Xil_ExceptionEnable() \ + Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ) + +/****************************************************************************/ +/** +* @brief Disable Exceptions. +* +* @param Mask: Value for disabling the exceptions. +* +* @return None. +* +* @note If bit is 1, exception is disabled. +* C-Style signature: Xil_ExceptionDisableMask(Mask) +* +******************************************************************************/ +#if defined (__GNUC__) || defined (__ICCARM__) +#define Xil_ExceptionDisableMask(Mask) \ + mtcpsr(mfcpsr() | ((Mask) & XIL_EXCEPTION_ALL)) +#else +#define Xil_ExceptionDisableMask(Mask) \ + { \ + register u32 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) + +#if !defined (__aarch64__) && !defined (ARMA53_32) +/****************************************************************************/ +/** +* @brief Enable nested interrupts by clearing the I and F bits in CPSR. This +* API is defined for cortex-a9 and cortex-r5. +* +* @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__ ("stmfd sp!, {lr}"); \ + __asm__ __volatile__ ("mrs lr, spsr"); \ + __asm__ __volatile__ ("stmfd sp!, {lr}"); \ + __asm__ __volatile__ ("msr cpsr_c, #0x1F"); \ + __asm__ __volatile__ ("stmfd sp!, {lr}"); + +/****************************************************************************/ +/** +* @brief Disable the nested interrupts by setting the I and F bits. This API +* is defined for cortex-a9 and cortex-r5. +* +* @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"); \ + __asm__ __volatile__ ("ldmfd sp!, {lr}"); \ + +#endif +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +extern void Xil_ExceptionRegisterHandler(u32 Exception_id, + Xil_ExceptionHandler Handler, + void *Data); + +extern void Xil_ExceptionRemoveHandler(u32 Exception_id); +extern void Xil_GetExceptionRegisterHandler(u32 Exception_id, + Xil_ExceptionHandler *Handler, void **Data); + +extern void Xil_ExceptionInit(void); +#if defined (__aarch64__) +void Xil_SyncAbortHandler(void *CallBackRef); +void Xil_SErrorAbortHandler(void *CallBackRef); +#else +extern void Xil_DataAbortHandler(void *CallBackRef); +extern void Xil_PrefetchAbortHandler(void *CallBackRef); +extern void Xil_UndefinedExceptionHandler(void *CallBackRef); +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_EXCEPTION_H */ +/** +* @} End of "addtogroup arm_exception_apis". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_hal.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_hal.h new file mode 100644 index 0000000..d4434d0 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_hal.h @@ -0,0 +1,61 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_hal.h +* +* Contains all the HAL header files. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a hbm  07/28/09 Initial release
    +*
    +* 
    +* +* @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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_io.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_io.h new file mode 100644 index 0000000..9c5aa43 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_io.h @@ -0,0 +1,345 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_io.h +* +* @addtogroup common_io_interfacing_apis Register IO interfacing APIs +* +* The xil_io.h file contains the interface for the general I/O component, which +* encapsulates the Input/Output functions for the processors that do not +* require any special I/O handling. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 5.00 	pkp  	 05/29/14 First release
    +* 6.00  mus      08/19/16 Remove checking of __LITTLE_ENDIAN__ flag for
    +*                         ARM processors
    +* 
    +******************************************************************************/ + +#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 "xil_printf.h" + +#if defined (__MICROBLAZE__) +#include "mb_interface.h" +#else +#include "xpseudo_asm.h" +#endif + +/************************** Function Prototypes ******************************/ +u16 Xil_EndianSwap16(u16 Data); +u32 Xil_EndianSwap32(u32 Data); +#ifdef ENABLE_SAFETY +extern u32 XStl_RegUpdate(u32 RegAddr, u32 RegVal); +#endif + +/***************** Macros (Inline Functions) Definitions *********************/ +#if defined __GNUC__ +#if defined (__MICROBLAZE__) +# define INST_SYNC mbar(0) +# define DATA_SYNC mbar(1) +# else +# define SYNCHRONIZE_IO dmb() +# define INST_SYNC isb() +# define DATA_SYNC dsb() +# endif +#else +# define SYNCHRONIZE_IO +# define INST_SYNC +# define DATA_SYNC +# define INST_SYNC +# define DATA_SYNC +#endif + +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__MICROBLAZE__) +#define INLINE inline +#else +#define INLINE __inline +#endif + +/*****************************************************************************/ +/** +* +* @brief Performs an input operation for a memory location by reading +* from the specified address and returning the 8 bit Value read from +* that address. +* +* @param Addr: contains the address to perform the input operation +* +* @return The 8 bit Value read from the specified input address. + +* +******************************************************************************/ +static INLINE u8 Xil_In8(UINTPTR Addr) +{ + return *(volatile u8 *) Addr; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an input operation for a memory location by reading from +* the specified address and returning the 16 bit Value read from that +* address. +* +* @param Addr: contains the address to perform the input operation +* +* @return The 16 bit Value read from the specified input address. +* +******************************************************************************/ +static INLINE u16 Xil_In16(UINTPTR Addr) +{ + return *(volatile u16 *) Addr; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an input operation for a memory location by +* reading from the specified address and returning the 32 bit Value +* read from that address. +* +* @param Addr: contains the address to perform the input operation +* +* @return The 32 bit Value read from the specified input address. +* +******************************************************************************/ +static INLINE u32 Xil_In32(UINTPTR Addr) +{ + return *(volatile u32 *) Addr; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an input operation for a memory location by reading the +* 64 bit Value read from that address. +* +* +* @param Addr: contains the address to perform the input operation +* +* @return The 64 bit Value read from the specified input address. +* +******************************************************************************/ +static INLINE u64 Xil_In64(UINTPTR Addr) +{ + return *(volatile u64 *) Addr; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an output operation for an memory location by +* writing the 8 bit Value to the the specified address. +* +* @param Addr: contains the address to perform the output operation +* @param Value: contains the 8 bit Value to be written at the specified +* address. +* +* @return None. +* +******************************************************************************/ +static INLINE void Xil_Out8(UINTPTR Addr, u8 Value) +{ + volatile u8 *LocalAddr = (volatile u8 *)Addr; + *LocalAddr = Value; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an output operation for a memory location by writing the +* 16 bit Value to the the specified address. +* +* @param Addr contains the address to perform the output operation +* @param Value contains the Value to be written at the specified address. +* +* @return None. +* +******************************************************************************/ +static INLINE void Xil_Out16(UINTPTR Addr, u16 Value) +{ + volatile u16 *LocalAddr = (volatile u16 *)Addr; + *LocalAddr = Value; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an output operation for a memory location by writing the +* 32 bit Value to the the specified address. +* +* @param Addr contains the address to perform the output operation +* @param Value contains the 32 bit Value to be written at the specified +* address. +* +* @return None. +* +******************************************************************************/ +static INLINE void Xil_Out32(UINTPTR Addr, u32 Value) +{ +#ifndef ENABLE_SAFETY + volatile u32 *LocalAddr = (volatile u32 *)Addr; + *LocalAddr = Value; +#else + XStl_RegUpdate(Addr, Value); +#endif +} + +/*****************************************************************************/ +/** +* +* @brief Performs an output operation for a memory location by writing the +* 64 bit Value to the the specified address. +* +* @param Addr contains the address to perform the output operation +* @param Value contains 64 bit Value to be written at the specified address. +* +* @return None. +* +******************************************************************************/ +static INLINE void Xil_Out64(UINTPTR Addr, u64 Value) +{ + volatile u64 *LocalAddr = (volatile u64 *)Addr; + *LocalAddr = Value; +} + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +# define Xil_In16LE Xil_In16 +# define Xil_In32LE Xil_In32 +# define Xil_Out16LE Xil_Out16 +# define Xil_Out32LE Xil_Out32 +# define Xil_Htons Xil_EndianSwap16 +# define Xil_Htonl Xil_EndianSwap32 +# define Xil_Ntohs Xil_EndianSwap16 +# define Xil_Ntohl Xil_EndianSwap32 +# else +# define Xil_In16BE Xil_In16 +# define Xil_In32BE Xil_In32 +# define Xil_Out16BE Xil_Out16 +# define Xil_Out32BE Xil_Out32 +# define Xil_Htons(Data) (Data) +# define Xil_Htonl(Data) (Data) +# define Xil_Ntohs(Data) (Data) +# define Xil_Ntohl(Data) (Data) +#endif +#else +# define Xil_In16LE Xil_In16 +# define Xil_In32LE Xil_In32 +# define Xil_Out16LE Xil_Out16 +# define Xil_Out32LE Xil_Out32 +# define Xil_Htons Xil_EndianSwap16 +# define Xil_Htonl Xil_EndianSwap32 +# define Xil_Ntohs Xil_EndianSwap16 +# define Xil_Ntohl Xil_EndianSwap32 +#endif + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +static INLINE u16 Xil_In16BE(UINTPTR Addr) +#else +static INLINE u16 Xil_In16LE(UINTPTR Addr) +#endif +#else +static INLINE u16 Xil_In16BE(UINTPTR Addr) +#endif +{ + u16 value = Xil_In16(Addr); + return Xil_EndianSwap16(value); +} + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +static INLINE u32 Xil_In32BE(UINTPTR Addr) +#else +static INLINE u32 Xil_In32LE(UINTPTR Addr) +#endif +#else +static INLINE u32 Xil_In32BE(UINTPTR Addr) +#endif +{ + u32 value = Xil_In32(Addr); + return Xil_EndianSwap32(value); +} + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +static INLINE void Xil_Out16BE(UINTPTR Addr, u16 Value) +#else +static INLINE void Xil_Out16LE(UINTPTR Addr, u16 Value) +#endif +#else +static INLINE void Xil_Out16BE(UINTPTR Addr, u16 Value) +#endif +{ + Value = Xil_EndianSwap16(Value); + Xil_Out16(Addr, Value); +} + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +static INLINE void Xil_Out32BE(UINTPTR Addr, u32 Value) +#else +static INLINE void Xil_Out32LE(UINTPTR Addr, u32 Value) +#endif +#else +static INLINE void Xil_Out32BE(UINTPTR Addr, u32 Value) +#endif +{ + Value = Xil_EndianSwap32(Value); + Xil_Out32(Addr, Value); +} + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_io_interfacing_apis". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_macroback.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_macroback.h new file mode 100644 index 0000000..ebafde8 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_macroback.h @@ -0,0 +1,1052 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/*********************************************************************/ +/** + * @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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_mem.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_mem.h new file mode 100644 index 0000000..a2d5e66 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_mem.h @@ -0,0 +1,59 @@ +/******************************************************************************/ +/** +* Copyright (C) 2015 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* @file xil_mem.h +* +* @addtogroup common_mem_operation_api Customized APIs for Memory Operations +* +* The xil_mem.h file contains prototype for functions related +* to memory operations. These APIs are applicable for all processors supported +* by Xilinx. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 6.1   nsk      11/07/16 First release.
    +*
    +* 
    +* +*****************************************************************************/ + +/************************** Function Prototypes *****************************/ + +void Xil_MemCpy(void* dst, const void* src, u32 cnt); +/** +* @} End of "addtogroup common_mem_operation_api". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_misc_psreset_api.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_misc_psreset_api.h new file mode 100644 index 0000000..c228c98 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_misc_psreset_api.h @@ -0,0 +1,277 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @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. +* +* +******************************************************************************/ + +#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 0xF8006000U +#define XSLCR_BASEADDR 0xF8000000U +/**< OCM configuration register */ +#define XSLCR_OCM_CFG_ADDR (XSLCR_BASEADDR + 0x00000910U) +/**< SLCR unlock register */ +#define XSLCR_UNLOCK_ADDR (XSLCR_BASEADDR + 0x00000008U) +/**< SLCR GEM0 rx clock control register */ +#define XSLCR_GEM0_RCLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000138U) +/**< SLCR GEM1 rx clock control register */ +#define XSLCR_GEM1_RCLK_CTRL_ADDR (XSLCR_BASEADDR + 0x0000013CU) +/**< SLCR GEM0 clock control register */ +#define XSLCR_GEM0_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000140U) +/**< SLCR GEM1 clock control register */ +#define XSLCR_GEM1_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000144U) +/**< SLCR SMC clock control register */ +#define XSLCR_SMC_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000148U) +/**< SLCR GEM reset control register */ +#define XSLCR_GEM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000214U) +/**< SLCR USB0 clock control register */ +#define XSLCR_USB0_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000130U) +/**< SLCR USB1 clock control register */ +#define XSLCR_USB1_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000134U) +/**< SLCR USB1 reset control register */ +#define XSLCR_USB_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000210U) +/**< SLCR SMC reset control register */ +#define XSLCR_SMC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000234U) +/**< SLCR Level shifter enable register */ +#define XSLCR_LVL_SHFTR_EN_ADDR (XSLCR_BASEADDR + 0x00000900U) +/**< SLCR ARM pll control register */ +#define XSLCR_ARM_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x00000100U) +/**< SLCR DDR pll control register */ +#define XSLCR_DDR_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x00000104U) +/**< SLCR IO pll control register */ +#define XSLCR_IO_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x00000108U) +/**< SLCR ARM pll configuration register */ +#define XSLCR_ARM_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x00000110U) +/**< SLCR DDR pll configuration register */ +#define XSLCR_DDR_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x00000114U) +/**< SLCR IO pll configuration register */ +#define XSLCR_IO_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x00000118U) +/**< SLCR ARM clock control register */ +#define XSLCR_ARM_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000120U) +/**< SLCR DDR clock control register */ +#define XSLCR_DDR_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000124U) +/**< SLCR MIO pin address register */ +#define XSLCR_MIO_PIN_00_ADDR (XSLCR_BASEADDR + 0x00000700U) +/**< SLCR DMAC reset control address register */ +#define XSLCR_DMAC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x0000020CU) +/**< SLCR USB reset control address register */ +/*#define XSLCR_USB_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000210U)*/ +/**< SLCR GEM reset control address register */ +/*#define XSLCR_GEM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000214U)*/ +/**< SLCR SDIO reset control address register */ +#define XSLCR_SDIO_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000218U) +/**< SLCR SPI reset control address register */ +#define XSLCR_SPI_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x0000021CU) +/**< SLCR CAN reset control address register */ +#define XSLCR_CAN_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000220U) +/**< SLCR I2C reset control address register */ +#define XSLCR_I2C_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000224U) +/**< SLCR UART reset control address register */ +#define XSLCR_UART_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000228U) +/**< SLCR GPIO reset control address register */ +#define XSLCR_GPIO_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x0000022CU) +/**< SLCR LQSPI reset control address register */ +#define XSLCR_LQSPI_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000230U) +/**< SLCR SMC reset control address register */ +/*#define XSLCR_SMC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000234U)*/ +/**< SLCR OCM reset control address register */ +#define XSLCR_OCM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000238U) + +/**< SMC mem controller clear config register */ +#define XSMC_MEMC_CLR_CONFIG_OFFSET 0x0000000CU +/**< SMC idlecount configuration register */ +#define XSMC_REFRESH_PERIOD_0_OFFSET 0x00000020U +#define XSMC_REFRESH_PERIOD_1_OFFSET 0x00000024U +/**< SMC ECC configuration register */ +#define XSMC_ECC_MEMCFG1_OFFSET 0x00000404U +/**< SMC ECC command 1 register */ +#define XSMC_ECC_MEMCMD1_OFFSET 0x00000404U +/**< SMC ECC command 2 register */ +#define XSMC_ECC_MEMCMD2_OFFSET 0x00000404U + +/**< SLCR unlock code */ +#define XSLCR_UNLOCK_CODE 0x0000DF0DU + +/**< SMC mem clear configuration mask */ +#define XSMC_MEMC_CLR_CONFIG_MASK 0x000005FU +/**< SMC ECC memconfig 1 reset value */ +#define XSMC_ECC_MEMCFG1_RESET_VAL 0x0000043U +/**< SMC ECC memcommand 1 reset value */ +#define XSMC_ECC_MEMCMD1_RESET_VAL 0x01300080U +/**< SMC ECC memcommand 2 reset value */ +#define XSMC_ECC_MEMCMD2_RESET_VAL 0x01E00585U + +/**< DDR controller reset bit mask */ +#define XDDRPS_CTRL_RESET_MASK 0x00000001U +/**< SLCR OCM configuration reset value*/ +#define XSLCR_OCM_CFG_RESETVAL 0x00000008U +/**< SLCR OCM bank selection mask*/ +#define XSLCR_OCM_CFG_HIADDR_MASK 0x0000000FU +/**< SLCR level shifter enable mask*/ +#define XSLCR_LVL_SHFTR_EN_MASK 0x0000000FU + +/**< SLCR PLL register reset values */ +#define XSLCR_ARM_PLL_CTRL_RESET_VAL 0x0001A008U +#define XSLCR_DDR_PLL_CTRL_RESET_VAL 0x0001A008U +#define XSLCR_IO_PLL_CTRL_RESET_VAL 0x0001A008U +#define XSLCR_ARM_PLL_CFG_RESET_VAL 0x00177EA0U +#define XSLCR_DDR_PLL_CFG_RESET_VAL 0x00177EA0U +#define XSLCR_IO_PLL_CFG_RESET_VAL 0x00177EA0U +#define XSLCR_ARM_CLK_CTRL_RESET_VAL 0x1F000400U +#define XSLCR_DDR_CLK_CTRL_RESET_VAL 0x18400003U + +/**< SLCR MIO register default values */ +#define XSLCR_MIO_PIN_00_RESET_VAL 0x00001601U +#define XSLCR_MIO_PIN_02_RESET_VAL 0x00000601U + +/**< SLCR Reset control registers default values */ +#define XSLCR_DMAC_RST_CTRL_VAL 0x00000001U +#define XSLCR_GEM_RST_CTRL_VAL 0x000000F3U +#define XSLCR_USB_RST_CTRL_VAL 0x00000003U +#define XSLCR_I2C_RST_CTRL_VAL 0x00000003U +#define XSLCR_SPI_RST_CTRL_VAL 0x0000000FU +#define XSLCR_UART_RST_CTRL_VAL 0x0000000FU +#define XSLCR_QSPI_RST_CTRL_VAL 0x00000003U +#define XSLCR_GPIO_RST_CTRL_VAL 0x00000001U +#define XSLCR_SMC_RST_CTRL_VAL 0x00000003U +#define XSLCR_OCM_RST_CTRL_VAL 0x00000001U +#define XSLCR_SDIO_RST_CTRL_VAL 0x00000033U +#define XSLCR_CAN_RST_CTRL_VAL 0x00000003U +/**************************** 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(void); +/* + * Map the ocm region to post bootrom state + */ +void XOcm_Remap(void); +/* + * Performs the smc interface reset + */ +void XSmc_ResetHw(u32 BaseAddress); +/* + * updates the MIO registers with reset values + */ +void XSlcr_MioWriteResetValues(void); +/* + * updates the PLL and clock registers with reset values + */ +void XSlcr_PllWriteResetValues(void); +/* + * Disables the level shifters + */ +void XSlcr_DisableLevelShifters(void); +/* + * 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_mmu.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_mmu.h new file mode 100644 index 0000000..dd14b63 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_mmu.h @@ -0,0 +1,108 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xil_mmu.h +* +* @addtogroup a9_mmu_apis Cortex A9 Processor MMU Functions +* +* MMU functions equip users to enable MMU, disable MMU and modify default +* memory attributes of MMU table as per the need. +* +* @{ +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- ---------------------------------------------------
    +* 1.00a sdm  01/12/12 Initial version
    +* 4.2	pkp	 07/21/14 Included xil_types.h file which contains definition for
    +*					  u32 which resolves issue of CR#805869
    +* 5.4	pkp	 23/11/15 Added attribute definitions for Xil_SetTlbAttributes API
    +* 
    +* +* +******************************************************************************/ + +#ifndef XIL_MMU_H +#define XIL_MMU_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/* Memory type */ +#define NORM_NONCACHE 0x11DE2 /* Normal Non-cacheable */ +#define STRONG_ORDERED 0xC02 /* Strongly ordered */ +#define DEVICE_MEMORY 0xC06 /* Device memory */ +#define RESERVED 0x0 /* reserved memory */ + +/* Normal write-through cacheable shareable */ +#define NORM_WT_CACHE 0x16DEA + +/* Normal write back cacheable shareable */ +#define NORM_WB_CACHE 0x15DE6 + +/* shareability attribute */ +#define SHAREABLE (0x1 << 16) +#define NON_SHAREABLE (~(0x1 << 16)) + +/* Execution type */ +#define EXECUTE_NEVER ((0x1 << 4) | (0x1 << 0)) + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void Xil_SetTlbAttributes(INTPTR Addr, u32 attrib); +void Xil_EnableMMU(void); +void Xil_DisableMMU(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_MMU_H */ +/** +* @} End of "addtogroup a9_mmu_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_printf.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_printf.h new file mode 100644 index 0000000..016ae3b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_printf.h @@ -0,0 +1,48 @@ + #ifndef XIL_PRINTF_H + #define XIL_PRINTF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include "xil_types.h" +#include "xparameters.h" +#include "bspconfig.h" +#if HYP_GUEST && EL1_NONSECURE && XEN_USE_PV_CONSOLE +#include "xen_console.h" +#endif + +/*----------------------------------------------------*/ +/* 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 char8* charptr; +typedef s32 (*func_ptr)(int c); + +/* */ + +void xil_printf( const char8 *ctrl1, ...); +void print( const char8 *ptr); +extern void outbyte (char8 c); +extern char8 inbyte(void); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_sleeptimer.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_sleeptimer.h new file mode 100644 index 0000000..4bfac0a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_sleeptimer.h @@ -0,0 +1,116 @@ +/****************************************************************************** +* +* Copyright (C) 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_sleeptimer.h +* +* This header file contains ARM Cortex A53,A9,R5 specific sleep related APIs. +* For sleep related functions that can be used across all Xilinx supported +* processors, please use xil_sleeptimer.h. +* +* +*
    +* MODIFICATION HISTORY :
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 6.6	srm  10/18/17 First Release.
    +*
    +* 
    +*****************************************************************************/ + +#ifndef XIL_SLEEPTIMER_H /* prevent circular inclusions */ +#define XIL_SLEEPTIMER_H /* by using protection macros */ +/**************************** Include Files ********************************/ + +#include "xil_io.h" +#include "xparameters.h" +#include "bspconfig.h" + +/************************** Constant Definitions *****************************/ + +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) +#define XSLEEP_TIMER_REG_SHIFT 32U +#define XSleep_ReadCounterVal Xil_In32 +#define XCntrVal u32 +#else +#define XSLEEP_TIMER_REG_SHIFT 16U +#define XSleep_ReadCounterVal Xil_In16 +#define XCntrVal u16 +#endif + +#if defined(ARMR5) || (defined (__aarch64__) && EL3==1) || defined (ARMA53_32) +#define RST_LPD_IOU2 0xFF5E0238U +#define RST_LPD_IOU2_TTC_BASE_RESET_MASK 0x00000800U +#endif + +#if defined (SLEEP_TIMER_BASEADDR) +/** @name Register Map +* +* Register offsets from the base address of the TTC device +* +* @{ +*/ + #define XSLEEP_TIMER_TTC_CLK_CNTRL_OFFSET 0x00000000U + /**< Clock Control Register */ + #define XSLEEP_TIMER_TTC_CNT_CNTRL_OFFSET 0x0000000CU + /**< Counter Control Register*/ + #define XSLEEP_TIMER_TTC_COUNT_VALUE_OFFSET 0x00000018U + /**< Current Counter Value */ +/* @} */ +/** @name Clock Control Register +* Clock Control Register definitions of TTC +* @{ +*/ + #define XSLEEP_TIMER_TTC_CLK_CNTRL_PS_EN_MASK 0x00000001U + /**< Prescale enable */ +/* @} */ +/** @name Counter Control Register +* Counter Control Register definitions of TTC +* @{ +*/ +#define XSLEEP_TIMER_TTC_CNT_CNTRL_DIS_MASK 0x00000001U + /**< Disable the counter */ +#define XSLEEP_TIMER_TTC_CNT_CNTRL_RST_MASK 0x00000010U + /**< Reset counter */ +/* @} */ + +/**************************** Type Definitions *******************************/ + +/************************** Function Prototypes ******************************/ + +void Xil_SleepTTCCommon(u32 delay, u64 frequency); +void XTime_StartTTCTimer(); + +#endif +#endif /* XIL_SLEEPTIMER_H */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testcache.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testcache.h new file mode 100644 index 0000000..c35e9a4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testcache.h @@ -0,0 +1,71 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testcache.h +* +* @addtogroup common_test_utils +*

    Cache test

    +* The xil_testcache.h 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 */ + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern s32 Xil_TestDCacheRange(void); +extern s32 Xil_TestDCacheAll(void); +extern s32 Xil_TestICacheRange(void); +extern s32 Xil_TestICacheAll(void); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_test_utils". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testio.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testio.h new file mode 100644 index 0000000..ad68ead --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testio.h @@ -0,0 +1,94 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testio.h +* +* @addtogroup common_test_utils Test Utilities +*

    I/O test

    +* The xil_testio.h file contains utility functions to test endian related memory +* IO functions. +* +* 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. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver    Who    Date    Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00 hbm  08/05/09 First release
    +* 
    +* +******************************************************************************/ + +#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 s32 Xil_TestIO8(u8 *Addr, s32 Length, u8 Value); +extern s32 Xil_TestIO16(u16 *Addr, s32 Length, u16 Value, s32 Kind, s32 Swap); +extern s32 Xil_TestIO32(u32 *Addr, s32 Length, u32 Value, s32 Kind, s32 Swap); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_test_utils". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testmem.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testmem.h new file mode 100644 index 0000000..c204728 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_testmem.h @@ -0,0 +1,158 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testmem.h +* @addtogroup common_test_utils +* +*

    Memory test

    +* +* The xil_testmem.h file contains utility functions to test memory. +* 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. +* Following list describes the supported memory tests: +* +* - XIL_TESTMEM_ALLMEMTESTS: This test runs all of the subtests. +* +* - XIL_TESTMEM_INCREMENT: This test +* starts at 'XIL_TESTMEM_INIT_VALUE' and uses the incrementing value as the +* test value for memory. +* +* - XIL_TESTMEM_WALKONES: Also known as the Walking ones test. This test +* uses a walking '1' as the test value for memory. +* @code +* location 1 = 0x00000001 +* location 2 = 0x00000002 +* ... +* @endcode +* +* - XIL_TESTMEM_WALKZEROS: Also known as the Walking zero's test. +* This test uses the inverse value of the walking ones test +* as the test value for memory. +* @code +* location 1 = 0xFFFFFFFE +* location 2 = 0xFFFFFFFD +* ... +*@endcode +* +* - XIL_TESTMEM_INVERSEADDR: Also known as the 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: Also known as the 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". +* +* @warning +* The tests are DESTRUCTIVE. 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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver    Who    Date    Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a hbm  08/25/09 First release
    +* 
    +* +******************************************************************************/ + +#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 1U + +/** @name Memory subtests + * @{ + */ +/** + * See the detailed description of the subtests in the file description. + */ +#define XIL_TESTMEM_ALLMEMTESTS 0x00U +#define XIL_TESTMEM_INCREMENT 0x01U +#define XIL_TESTMEM_WALKONES 0x02U +#define XIL_TESTMEM_WALKZEROS 0x03U +#define XIL_TESTMEM_INVERSEADDR 0x04U +#define XIL_TESTMEM_FIXEDPATTERN 0x05U +#define XIL_TESTMEM_MAXTEST XIL_TESTMEM_FIXEDPATTERN +/* @} */ + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/* xutil_testmem prototypes */ + +extern s32 Xil_TestMem32(u32 *Addr, u32 Words, u32 Pattern, u8 Subtest); +extern s32 Xil_TestMem16(u16 *Addr, u32 Words, u16 Pattern, u8 Subtest); +extern s32 Xil_TestMem8(u8 *Addr, u32 Words, u8 Pattern, u8 Subtest); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_test_utils". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_types.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_types.h new file mode 100644 index 0000000..8143aff --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xil_types.h @@ -0,0 +1,209 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_types.h +* +* @addtogroup common_types Basic Data types for Xilinx® Software IP +* +* The xil_types.h file contains basic types for Xilinx software IP. These data types +* are applicable for all processors supported by Xilinx. +* @{ +*
    +* 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
    +* 5.00 	pkp  05/29/14 Made changes for 64 bit architecture
    +*	srt  07/14/14 Use standard definitions from stdint.h and stddef.h
    +*		      Define LONG and ULONG datatypes and mask values
    +* 
    +* +******************************************************************************/ + +#ifndef XIL_TYPES_H /* prevent circular inclusions */ +#define XIL_TYPES_H /* by using protection macros */ + +#include +#include + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +# define TRUE 1U +#endif + +#ifndef FALSE +# define FALSE 0U +#endif + +#ifndef NULL +#define NULL 0U +#endif + +#define XIL_COMPONENT_IS_READY 0x11111111U /**< In device drivers, This macro will be + assigend to "IsReady" member of driver + instance to indicate that driver + instance is initialized and ready to use. */ +#define XIL_COMPONENT_IS_STARTED 0x22222222U /**< In device drivers, This macro will be assigend to + "IsStarted" member of driver instance + to indicate that driver instance is + started and it can be enabled. */ + +/* @name New types + * New simple types. + * @{ + */ +#ifndef __KERNEL__ +#ifndef XBASIC_TYPES_H +/* + * guarded against xbasic_types.h. + */ +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +/** @}*/ +#define __XUINT64__ +typedef struct +{ + u32 Upper; + u32 Lower; +} Xuint64; + + +/*****************************************************************************/ +/** +* @brief 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. +* +******************************************************************************/ +#define XUINT64_MSW(x) ((x).Upper) + +/*****************************************************************************/ +/** +* @brief 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. +* +******************************************************************************/ +#define XUINT64_LSW(x) ((x).Lower) + +#endif /* XBASIC_TYPES_H */ + +/* + * xbasic_types.h does not typedef s* or u64 + */ +/** @{ */ +typedef char char8; +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; +typedef uint64_t u64; +typedef int sint32; + +typedef intptr_t INTPTR; +typedef uintptr_t UINTPTR; +typedef ptrdiff_t PTRDIFF; +/** @}*/ +#if !defined(LONG) || !defined(ULONG) +typedef long LONG; +typedef unsigned long ULONG; +#endif + +#define ULONG64_HI_MASK 0xFFFFFFFF00000000U +#define ULONG64_LO_MASK ~ULONG64_HI_MASK + +#else +#include +#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); + +/** + * @brief Returns 32-63 bits of a number. + * @param n : Number being accessed. + * @return Bits 32-63 of number. + * + * @note A basic shift-right of a 64- or 32-bit quantity. + * Use this to suppress the "right shift count >= width of type" + * warning when that quantity is 32-bits. + */ +#define UPPER_32_BITS(n) ((u32)(((n) >> 16) >> 16)) + +/** + * @brief Returns 0-31 bits of a number + * @param n : Number being accessed. + * @return Bits 0-31 of number + */ +#define LOWER_32_BITS(n) ((u32)(n)) + + + + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +#define TRUE 1U +#endif + +#ifndef FALSE +#define FALSE 0U +#endif + +#ifndef NULL +#define NULL 0U +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_types". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xl2cc.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xl2cc.h new file mode 100644 index 0000000..735e26d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xl2cc.h @@ -0,0 +1,172 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xl2cc.h +* +* This file contains the address definitions for the PL310 Level-2 Cache +* Controller. +* +*
    +* 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
    +* 
    +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _XL2CC_H_ +#define _XL2CC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ +/* L2CC Register Offsets */ +#define XPS_L2CC_ID_OFFSET 0x0000U +#define XPS_L2CC_TYPE_OFFSET 0x0004U +#define XPS_L2CC_CNTRL_OFFSET 0x0100U +#define XPS_L2CC_AUX_CNTRL_OFFSET 0x0104U +#define XPS_L2CC_TAG_RAM_CNTRL_OFFSET 0x0108U +#define XPS_L2CC_DATA_RAM_CNTRL_OFFSET 0x010CU + +#define XPS_L2CC_EVNT_CNTRL_OFFSET 0x0200U +#define XPS_L2CC_EVNT_CNT1_CTRL_OFFSET 0x0204U +#define XPS_L2CC_EVNT_CNT0_CTRL_OFFSET 0x0208U +#define XPS_L2CC_EVNT_CNT1_VAL_OFFSET 0x020CU +#define XPS_L2CC_EVNT_CNT0_VAL_OFFSET 0x0210U + +#define XPS_L2CC_IER_OFFSET 0x0214U /* Interrupt Mask */ +#define XPS_L2CC_IPR_OFFSET 0x0218U /* Masked interrupt status */ +#define XPS_L2CC_ISR_OFFSET 0x021CU /* Raw Interrupt Status */ +#define XPS_L2CC_IAR_OFFSET 0x0220U /* Interrupt Clear */ + +#define XPS_L2CC_CACHE_SYNC_OFFSET 0x0730U /* Cache Sync */ +#define XPS_L2CC_DUMMY_CACHE_SYNC_OFFSET 0x0740U /* Dummy Register for Cache Sync */ +#define XPS_L2CC_CACHE_INVLD_PA_OFFSET 0x0770U /* Cache Invalid by PA */ +#define XPS_L2CC_CACHE_INVLD_WAY_OFFSET 0x077CU /* Cache Invalid by Way */ +#define XPS_L2CC_CACHE_CLEAN_PA_OFFSET 0x07B0U /* Cache Clean by PA */ +#define XPS_L2CC_CACHE_CLEAN_INDX_OFFSET 0x07B8U /* Cache Clean by Index */ +#define XPS_L2CC_CACHE_CLEAN_WAY_OFFSET 0x07BCU /* Cache Clean by Way */ +#define XPS_L2CC_CACHE_INV_CLN_PA_OFFSET 0x07F0U /* Cache Invalidate and Clean by PA */ +#define XPS_L2CC_CACHE_INV_CLN_INDX_OFFSET 0x07F8U /* Cache Invalidate and Clean by Index */ +#define XPS_L2CC_CACHE_INV_CLN_WAY_OFFSET 0x07FCU /* Cache Invalidate and Clean by Way */ + +#define XPS_L2CC_CACHE_DLCKDWN_0_WAY_OFFSET 0x0900U /* Cache Data Lockdown 0 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_0_WAY_OFFSET 0x0904U /* Cache Instruction Lockdown 0 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_1_WAY_OFFSET 0x0908U /* Cache Data Lockdown 1 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_1_WAY_OFFSET 0x090CU /* Cache Instruction Lockdown 1 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_2_WAY_OFFSET 0x0910U /* Cache Data Lockdown 2 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_2_WAY_OFFSET 0x0914U /* Cache Instruction Lockdown 2 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_3_WAY_OFFSET 0x0918U /* Cache Data Lockdown 3 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_3_WAY_OFFSET 0x091CU /* Cache Instruction Lockdown 3 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_4_WAY_OFFSET 0x0920U /* Cache Data Lockdown 4 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_4_WAY_OFFSET 0x0924U /* Cache Instruction Lockdown 4 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_5_WAY_OFFSET 0x0928U /* Cache Data Lockdown 5 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_5_WAY_OFFSET 0x092CU /* Cache Instruction Lockdown 5 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_6_WAY_OFFSET 0x0930U /* Cache Data Lockdown 6 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_6_WAY_OFFSET 0x0934U /* Cache Instruction Lockdown 6 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_7_WAY_OFFSET 0x0938U /* Cache Data Lockdown 7 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_7_WAY_OFFSET 0x093CU /* Cache Instruction Lockdown 7 by Way */ + +#define XPS_L2CC_CACHE_LCKDWN_LINE_ENABLE_OFFSET 0x0950U /* Cache Lockdown Line Enable */ +#define XPS_L2CC_CACHE_UUNLOCK_ALL_WAY_OFFSET 0x0954U /* Cache Unlock All Lines by Way */ + +#define XPS_L2CC_ADDR_FILTER_START_OFFSET 0x0C00U /* Start of address filtering */ +#define XPS_L2CC_ADDR_FILTER_END_OFFSET 0x0C04U /* Start of address filtering */ + +#define XPS_L2CC_DEBUG_CTRL_OFFSET 0x0F40U /* Debug Control Register */ + +/* XPS_L2CC_CNTRL_OFFSET bit masks */ +#define XPS_L2CC_ENABLE_MASK 0x00000001U /* enables the L2CC */ + +/* XPS_L2CC_AUX_CNTRL_OFFSET bit masks */ +#define XPS_L2CC_AUX_EBRESPE_MASK 0x40000000U /* Early BRESP Enable */ +#define XPS_L2CC_AUX_IPFE_MASK 0x20000000U /* Instruction Prefetch Enable */ +#define XPS_L2CC_AUX_DPFE_MASK 0x10000000U /* Data Prefetch Enable */ +#define XPS_L2CC_AUX_NSIC_MASK 0x08000000U /* Non-secure interrupt access control */ +#define XPS_L2CC_AUX_NSLE_MASK 0x04000000U /* Non-secure lockdown enable */ +#define XPS_L2CC_AUX_CRP_MASK 0x02000000U /* Cache replacement policy */ +#define XPS_L2CC_AUX_FWE_MASK 0x01800000U /* Force write allocate */ +#define XPS_L2CC_AUX_SAOE_MASK 0x00400000U /* Shared attribute override enable */ +#define XPS_L2CC_AUX_PE_MASK 0x00200000U /* Parity enable */ +#define XPS_L2CC_AUX_EMBE_MASK 0x00100000U /* Event monitor bus enable */ +#define XPS_L2CC_AUX_WAY_SIZE_MASK 0x000E0000U /* Way-size */ +#define XPS_L2CC_AUX_ASSOC_MASK 0x00010000U /* Associativity */ +#define XPS_L2CC_AUX_SAIE_MASK 0x00002000U /* Shared attribute invalidate enable */ +#define XPS_L2CC_AUX_EXCL_CACHE_MASK 0x00001000U /* Exclusive cache configuration */ +#define XPS_L2CC_AUX_SBDLE_MASK 0x00000800U /* Store buffer device limitation Enable */ +#define XPS_L2CC_AUX_HPSODRE_MASK 0x00000400U /* High Priority for SO and Dev Reads Enable */ +#define XPS_L2CC_AUX_FLZE_MASK 0x00000001U /* Full line of zero enable */ + +#define XPS_L2CC_AUX_REG_DEFAULT_MASK 0x72360000U /* Enable all prefetching, */ + /* Cache replacement policy, Parity enable, */ + /* Event monitor bus enable and Way Size (64 KB) */ +#define XPS_L2CC_AUX_REG_ZERO_MASK 0xFFF1FFFFU /* */ + +#define XPS_L2CC_TAG_RAM_DEFAULT_MASK 0x00000111U /* latency for TAG RAM */ +#define XPS_L2CC_DATA_RAM_DEFAULT_MASK 0x00000121U /* latency for DATA RAM */ + +/* Interrupt bit masks */ +#define XPS_L2CC_IXR_DECERR_MASK 0x00000100U /* DECERR from L3 */ +#define XPS_L2CC_IXR_SLVERR_MASK 0x00000080U /* SLVERR from L3 */ +#define XPS_L2CC_IXR_ERRRD_MASK 0x00000040U /* Error on L2 data RAM (Read) */ +#define XPS_L2CC_IXR_ERRRT_MASK 0x00000020U /* Error on L2 tag RAM (Read) */ +#define XPS_L2CC_IXR_ERRWD_MASK 0x00000010U /* Error on L2 data RAM (Write) */ +#define XPS_L2CC_IXR_ERRWT_MASK 0x00000008U /* Error on L2 tag RAM (Write) */ +#define XPS_L2CC_IXR_PARRD_MASK 0x00000004U /* Parity Error on L2 data RAM (Read) */ +#define XPS_L2CC_IXR_PARRT_MASK 0x00000002U /* Parity Error on L2 tag RAM (Read) */ +#define XPS_L2CC_IXR_ECNTR_MASK 0x00000001U /* Event Counter1/0 Overflow Increment */ + +/* Address filtering mask and enable bit */ +#define XPS_L2CC_ADDR_FILTER_VALID_MASK 0xFFF00000U /* Address filtering valid bits*/ +#define XPS_L2CC_ADDR_FILTER_ENABLE_MASK 0x00000001U /* Address filtering enable bit*/ + +/* Debug control bits */ +#define XPS_L2CC_DEBUG_SPIDEN_MASK 0x00000004U /* Debug SPIDEN bit */ +#define XPS_L2CC_DEBUG_DWB_MASK 0x00000002U /* Debug DWB bit, forces write through */ +#define XPS_L2CC_DEBUG_DCL_MASK 0x00000002U /* Debug DCL bit, disables cache line fill */ + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xl2cc_counter.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xl2cc_counter.h new file mode 100644 index 0000000..8d0a61f --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xl2cc_counter.h @@ -0,0 +1,113 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xl2cc_counter.h +* +* @addtogroup l2_event_counter_apis PL310 L2 Event Counters Functions +* +* xl2cc_counter.h contains APIs for configuring and controlling the event +* counters in PL310 L2 cache controller. +* PL310 has two event counters which can be used to count variety of events +* like DRHIT, DRREQ, DWHIT, DWREQ, etc. xl2cc_counter.h contains definitions +* for different configurations which can be used for the event counters to +* count a set of events. +* +* +* @{ +* +*
    +* 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
    +* 
    +* +******************************************************************************/ + +#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(s32 Event0, s32 Event1); +void XL2cc_EventCtrStart(void); +void XL2cc_EventCtrStop(u32 *EveCtr0, u32 *EveCtr1); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* L2CCCOUNTER_H */ +/** +* @} End of "addtogroup l2_event_counter_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xparameters.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xparameters.h new file mode 100644 index 0000000..cfa8887 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xparameters.h @@ -0,0 +1,499 @@ +#ifndef XPARAMETERS_H /* prevent circular inclusions */ +#define XPARAMETERS_H /* by using protection macros */ + +/* Definition for CPU ID */ +#define XPAR_CPU_ID 0U + +/* Definitions for peripheral PS7_CORTEXA9_0 */ +#define XPAR_PS7_CORTEXA9_0_CPU_CLK_FREQ_HZ 666666687 + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_CORTEXA9_0 */ +#define XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ 666666687 + + +/******************************************************************/ + +#include "xparameters_ps.h" + +#define STDIN_BASEADDRESS 0xE0001000 +#define STDOUT_BASEADDRESS 0xE0001000 + +/******************************************************************/ + +/* Platform specific definitions */ +#define PLATFORM_ZYNQ + +/* Definitions for sleep timer configuration */ +#define XSLEEP_TIMER_IS_DEFAULT_TIMER + + +/******************************************************************/ +/* Definitions for driver CANPS */ +#define XPAR_XCANPS_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_CAN_0 */ +#define XPAR_PS7_CAN_0_DEVICE_ID 0 +#define XPAR_PS7_CAN_0_BASEADDR 0xE0008000 +#define XPAR_PS7_CAN_0_HIGHADDR 0xE0008FFF +#define XPAR_PS7_CAN_0_CAN_CLK_FREQ_HZ 23809523 + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_CAN_0 */ +#define XPAR_XCANPS_0_DEVICE_ID XPAR_PS7_CAN_0_DEVICE_ID +#define XPAR_XCANPS_0_BASEADDR 0xE0008000 +#define XPAR_XCANPS_0_HIGHADDR 0xE0008FFF +#define XPAR_XCANPS_0_CAN_CLK_FREQ_HZ 23809523 + + +/******************************************************************/ + + +/* Definitions for peripheral PS7_DDR_0 */ +#define XPAR_PS7_DDR_0_S_AXI_BASEADDR 0x00100000 +#define XPAR_PS7_DDR_0_S_AXI_HIGHADDR 0x3FFFFFFF + + +/******************************************************************/ + +/* Definitions for driver DEVCFG */ +#define XPAR_XDCFG_NUM_INSTANCES 1U + +/* Definitions for peripheral PS7_DEV_CFG_0 */ +#define XPAR_PS7_DEV_CFG_0_DEVICE_ID 0U +#define XPAR_PS7_DEV_CFG_0_BASEADDR 0xF8007000U +#define XPAR_PS7_DEV_CFG_0_HIGHADDR 0xF80070FFU + + +/******************************************************************/ + +/* 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 0xF8007000U +#define XPAR_XDCFG_0_HIGHADDR 0xF80070FFU + + +/******************************************************************/ + +/* 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 25000000 +#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 +#define XPAR_PS7_ETHERNET_0_ENET_TSU_CLK_FREQ_HZ 0 + + +/******************************************************************/ + +#define XPAR_PS7_ETHERNET_0_IS_CACHE_COHERENT 0 +/* 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 25000000 +#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 +#define XPAR_XEMACPS_0_ENET_TSU_CLK_FREQ_HZ 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_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_PL310_0 */ +#define XPAR_PS7_PL310_0_S_AXI_BASEADDR 0xF8F02000 +#define XPAR_PS7_PL310_0_S_AXI_HIGHADDR 0xF8F02FFF + + +/* Definitions for peripheral PS7_PMU_0 */ +#define XPAR_PS7_PMU_0_S_AXI_BASEADDR 0xF8891000 +#define XPAR_PS7_PMU_0_S_AXI_HIGHADDR 0xF8891FFF +#define XPAR_PS7_PMU_0_PMU1_S_AXI_BASEADDR 0xF8893000 +#define XPAR_PS7_PMU_0_PMU1_S_AXI_HIGHADDR 0xF8893FFF + + +/* 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 0x0003FFFF + + +/* Definitions for peripheral PS7_RAM_1 */ +#define XPAR_PS7_RAM_1_S_AXI_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_1_S_AXI_HIGHADDR 0xFFFFFFFF + + +/* 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_SLCR_0 */ +#define XPAR_PS7_SLCR_0_S_AXI_BASEADDR 0xF8000000 +#define XPAR_PS7_SLCR_0_S_AXI_HIGHADDR 0xF8000FFF + + +/******************************************************************/ + +/* 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 111111115 + + +/******************************************************************/ + +/* 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 111111115 + + +/******************************************************************/ + +/* 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 +#define XPAR_PS7_QSPI_0_QSPI_BUS_WIDTH 2 + + +/******************************************************************/ + +/* 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 +#define XPAR_XQSPIPS_0_QSPI_BUS_WIDTH 2 + + +/******************************************************************/ + +/* Definitions for driver SCUGIC */ +#define XPAR_XSCUGIC_NUM_INSTANCES 1U + +/* Definitions for peripheral PS7_SCUGIC_0 */ +#define XPAR_PS7_SCUGIC_0_DEVICE_ID 0U +#define XPAR_PS7_SCUGIC_0_BASEADDR 0xF8F00100U +#define XPAR_PS7_SCUGIC_0_HIGHADDR 0xF8F001FFU +#define XPAR_PS7_SCUGIC_0_DIST_BASEADDR 0xF8F01000U + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_SCUGIC_0 */ +#define XPAR_SCUGIC_0_DEVICE_ID 0U +#define XPAR_SCUGIC_0_CPU_BASEADDR 0xF8F00100U +#define XPAR_SCUGIC_0_CPU_HIGHADDR 0xF8F001FFU +#define XPAR_SCUGIC_0_DIST_BASEADDR 0xF8F01000U + + +/******************************************************************/ + +/* 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 SDPS */ +#define XPAR_XSDPS_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_SD_0 */ +#define XPAR_PS7_SD_0_DEVICE_ID 0 +#define XPAR_PS7_SD_0_BASEADDR 0xE0100000 +#define XPAR_PS7_SD_0_HIGHADDR 0xE0100FFF +#define XPAR_PS7_SD_0_SDIO_CLK_FREQ_HZ 50000000 +#define XPAR_PS7_SD_0_HAS_CD 1 +#define XPAR_PS7_SD_0_HAS_WP 1 +#define XPAR_PS7_SD_0_BUS_WIDTH 0 +#define XPAR_PS7_SD_0_MIO_BANK 0 +#define XPAR_PS7_SD_0_HAS_EMIO 0 + + +/******************************************************************/ + +#define XPAR_PS7_SD_0_IS_CACHE_COHERENT 0 +/* Canonical definitions for peripheral PS7_SD_0 */ +#define XPAR_XSDPS_0_DEVICE_ID XPAR_PS7_SD_0_DEVICE_ID +#define XPAR_XSDPS_0_BASEADDR 0xE0100000 +#define XPAR_XSDPS_0_HIGHADDR 0xE0100FFF +#define XPAR_XSDPS_0_SDIO_CLK_FREQ_HZ 50000000 +#define XPAR_XSDPS_0_HAS_CD 1 +#define XPAR_XSDPS_0_HAS_WP 1 +#define XPAR_XSDPS_0_BUS_WIDTH 0 +#define XPAR_XSDPS_0_MIO_BANK 0 +#define XPAR_XSDPS_0_HAS_EMIO 0 + + +/******************************************************************/ + +/* Definitions for driver TTCPS */ +#define XPAR_XTTCPS_NUM_INSTANCES 3U + +/* Definitions for peripheral PS7_TTC_0 */ +#define XPAR_PS7_TTC_0_DEVICE_ID 0U +#define XPAR_PS7_TTC_0_BASEADDR 0XF8001000U +#define XPAR_PS7_TTC_0_TTC_CLK_FREQ_HZ 111111115U +#define XPAR_PS7_TTC_0_TTC_CLK_CLKSRC 0U +#define XPAR_PS7_TTC_1_DEVICE_ID 1U +#define XPAR_PS7_TTC_1_BASEADDR 0XF8001004U +#define XPAR_PS7_TTC_1_TTC_CLK_FREQ_HZ 111111115U +#define XPAR_PS7_TTC_1_TTC_CLK_CLKSRC 0U +#define XPAR_PS7_TTC_2_DEVICE_ID 2U +#define XPAR_PS7_TTC_2_BASEADDR 0XF8001008U +#define XPAR_PS7_TTC_2_TTC_CLK_FREQ_HZ 111111115U +#define XPAR_PS7_TTC_2_TTC_CLK_CLKSRC 0U + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_TTC_0 */ +#define XPAR_XTTCPS_0_DEVICE_ID XPAR_PS7_TTC_0_DEVICE_ID +#define XPAR_XTTCPS_0_BASEADDR 0xF8001000U +#define XPAR_XTTCPS_0_TTC_CLK_FREQ_HZ 111111115U +#define XPAR_XTTCPS_0_TTC_CLK_CLKSRC 0U + +#define XPAR_XTTCPS_1_DEVICE_ID XPAR_PS7_TTC_1_DEVICE_ID +#define XPAR_XTTCPS_1_BASEADDR 0xF8001004U +#define XPAR_XTTCPS_1_TTC_CLK_FREQ_HZ 111111115U +#define XPAR_XTTCPS_1_TTC_CLK_CLKSRC 0U + +#define XPAR_XTTCPS_2_DEVICE_ID XPAR_PS7_TTC_2_DEVICE_ID +#define XPAR_XTTCPS_2_BASEADDR 0xF8001008U +#define XPAR_XTTCPS_2_TTC_CLK_FREQ_HZ 111111115U +#define XPAR_XTTCPS_2_TTC_CLK_CLKSRC 0U + + +/******************************************************************/ + +/* Definitions for driver UARTPS */ +#define XPAR_XUARTPS_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_UART_1 */ +#define XPAR_PS7_UART_1_DEVICE_ID 0 +#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_1 */ +#define XPAR_XUARTPS_0_DEVICE_ID XPAR_PS7_UART_1_DEVICE_ID +#define XPAR_XUARTPS_0_BASEADDR 0xE0001000 +#define XPAR_XUARTPS_0_HIGHADDR 0xE0001FFF +#define XPAR_XUARTPS_0_UART_CLK_FREQ_HZ 50000000 +#define XPAR_XUARTPS_0_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 + + +/******************************************************************/ + +#endif /* end of protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xparameters_ps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xparameters_ps.h new file mode 100644 index 0000000..0fa7771 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xparameters_ps.h @@ -0,0 +1,338 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xparameters_ps.h +* +* This file contains the address definitions for the hard peripherals +* attached to the ARM Cortex A9 core. +* +*
    +* 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
    +* 5.0	pkp		01/16/15 Added interrupt ID definition of ttc for TEST APP
    +* 6.6   srm     10/18/17 Added ARMA9 macro to identify CortexA9
    +*
    +* 
    +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _XPARAMETERS_PS_H_ +#define _XPARAMETERS_PS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/**************************** Include Files *******************************/ + + +/************************** Constant Definitions *****************************/ + +/* + * This block contains constant declarations for the peripherals + * within the hardblock + */ + +/* Canonical definitions for DDR MEMORY */ +#define XPAR_DDR_MEM_BASEADDR 0x00000000U +#define XPAR_DDR_MEM_HIGHADDR 0x3FFFFFFFU + +/* 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 1U +#define XPAR_XSLCR_0_DEVICE_ID 0U +#define XPAR_XSLCR_0_BASEADDR XPS_SYS_CTRL_BASEADDR + +/* Canonical definitions for SCU GIC */ +#define XPAR_SCUGIC_NUM_INSTANCES 1U +#define XPAR_SCUGIC_SINGLE_DEVICE_ID 0U +#define XPAR_SCUGIC_CPU_BASEADDR (XPS_SCU_PERIPH_BASE + 0x00000100U) +#define XPAR_SCUGIC_DIST_BASEADDR (XPS_SCU_PERIPH_BASE + 0x00001000U) +#define XPAR_SCUGIC_ACK_BEFORE 0U + +/* Canonical definitions for Global Timer */ +#define XPAR_GLOBAL_TMR_NUM_INSTANCES 1U +#define XPAR_GLOBAL_TMR_DEVICE_ID 0U +#define XPAR_GLOBAL_TMR_BASEADDR (XPS_SCU_PERIPH_BASE + 0x00000200U) +#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 0xE0000000U +#define XPS_UART0_BASEADDR 0xE0000000U +#define XPS_UART1_BASEADDR 0xE0001000U +#define XPS_USB0_BASEADDR 0xE0002000U +#define XPS_USB1_BASEADDR 0xE0003000U +#define XPS_I2C0_BASEADDR 0xE0004000U +#define XPS_I2C1_BASEADDR 0xE0005000U +#define XPS_SPI0_BASEADDR 0xE0006000U +#define XPS_SPI1_BASEADDR 0xE0007000U +#define XPS_CAN0_BASEADDR 0xE0008000U +#define XPS_CAN1_BASEADDR 0xE0009000U +#define XPS_GPIO_BASEADDR 0xE000A000U +#define XPS_GEM0_BASEADDR 0xE000B000U +#define XPS_GEM1_BASEADDR 0xE000C000U +#define XPS_QSPI_BASEADDR 0xE000D000U +#define XPS_PARPORT_CRTL_BASEADDR 0xE000E000U +#define XPS_SDIO0_BASEADDR 0xE0100000U +#define XPS_SDIO1_BASEADDR 0xE0101000U +#define XPS_IOU_BUS_CFG_BASEADDR 0xE0200000U +#define XPS_NAND_BASEADDR 0xE1000000U +#define XPS_PARPORT0_BASEADDR 0xE2000000U +#define XPS_PARPORT1_BASEADDR 0xE4000000U +#define XPS_QSPI_LINEAR_BASEADDR 0xFC000000U +#define XPS_SYS_CTRL_BASEADDR 0xF8000000U /* AKA SLCR */ +#define XPS_TTC0_BASEADDR 0xF8001000U +#define XPS_TTC1_BASEADDR 0xF8002000U +#define XPS_DMAC0_SEC_BASEADDR 0xF8003000U +#define XPS_DMAC0_NON_SEC_BASEADDR 0xF8004000U +#define XPS_WDT_BASEADDR 0xF8005000U +#define XPS_DDR_CTRL_BASEADDR 0xF8006000U +#define XPS_DEV_CFG_APB_BASEADDR 0xF8007000U +#define XPS_AFI0_BASEADDR 0xF8008000U +#define XPS_AFI1_BASEADDR 0xF8009000U +#define XPS_AFI2_BASEADDR 0xF800A000U +#define XPS_AFI3_BASEADDR 0xF800B000U +#define XPS_OCM_BASEADDR 0xF800C000U +#define XPS_EFUSE_BASEADDR 0xF800D000U +#define XPS_CORESIGHT_BASEADDR 0xF8800000U +#define XPS_TOP_BUS_CFG_BASEADDR 0xF8900000U +#define XPS_SCU_PERIPH_BASE 0xF8F00000U +#define XPS_L2CC_BASEADDR 0xF8F02000U +#define XPS_SAM_RAM_BASEADDR 0xFFFC0000U +#define XPS_FPGA_AXI_S0_BASEADDR 0x40000000U +#define XPS_FPGA_AXI_S1_BASEADDR 0x80000000U +#define XPS_IOU_S_SWITCH_BASEADDR 0xE0000000U +#define XPS_PERIPH_APB_BASEADDR 0xF8000000U + +/* Shared Peripheral Interrupts (SPI) */ +#define XPS_CORE_PARITY0_INT_ID 32U +#define XPS_CORE_PARITY1_INT_ID 33U +#define XPS_L2CC_INT_ID 34U +#define XPS_OCMINTR_INT_ID 35U +#define XPS_ECC_INT_ID 36U +#define XPS_PMU0_INT_ID 37U +#define XPS_PMU1_INT_ID 38U +#define XPS_SYSMON_INT_ID 39U +#define XPS_DVC_INT_ID 40U +#define XPS_WDT_INT_ID 41U +#define XPS_TTC0_0_INT_ID 42U +#define XPS_TTC0_1_INT_ID 43U +#define XPS_TTC0_2_INT_ID 44U +#define XPS_DMA0_ABORT_INT_ID 45U +#define XPS_DMA0_INT_ID 46U +#define XPS_DMA1_INT_ID 47U +#define XPS_DMA2_INT_ID 48U +#define XPS_DMA3_INT_ID 49U +#define XPS_SMC_INT_ID 50U +#define XPS_QSPI_INT_ID 51U +#define XPS_GPIO_INT_ID 52U +#define XPS_USB0_INT_ID 53U +#define XPS_GEM0_INT_ID 54U +#define XPS_GEM0_WAKE_INT_ID 55U +#define XPS_SDIO0_INT_ID 56U +#define XPS_I2C0_INT_ID 57U +#define XPS_SPI0_INT_ID 58U +#define XPS_UART0_INT_ID 59U +#define XPS_CAN0_INT_ID 60U +#define XPS_FPGA0_INT_ID 61U +#define XPS_FPGA1_INT_ID 62U +#define XPS_FPGA2_INT_ID 63U +#define XPS_FPGA3_INT_ID 64U +#define XPS_FPGA4_INT_ID 65U +#define XPS_FPGA5_INT_ID 66U +#define XPS_FPGA6_INT_ID 67U +#define XPS_FPGA7_INT_ID 68U +#define XPS_TTC1_0_INT_ID 69U +#define XPS_TTC1_1_INT_ID 70U +#define XPS_TTC1_2_INT_ID 71U +#define XPS_DMA4_INT_ID 72U +#define XPS_DMA5_INT_ID 73U +#define XPS_DMA6_INT_ID 74U +#define XPS_DMA7_INT_ID 75U +#define XPS_USB1_INT_ID 76U +#define XPS_GEM1_INT_ID 77U +#define XPS_GEM1_WAKE_INT_ID 78U +#define XPS_SDIO1_INT_ID 79U +#define XPS_I2C1_INT_ID 80U +#define XPS_SPI1_INT_ID 81U +#define XPS_UART1_INT_ID 82U +#define XPS_CAN1_INT_ID 83U +#define XPS_FPGA8_INT_ID 84U +#define XPS_FPGA9_INT_ID 85U +#define XPS_FPGA10_INT_ID 86U +#define XPS_FPGA11_INT_ID 87U +#define XPS_FPGA12_INT_ID 88U +#define XPS_FPGA13_INT_ID 89U +#define XPS_FPGA14_INT_ID 90U +#define XPS_FPGA15_INT_ID 91U + +/* Private Peripheral Interrupts (PPI) */ +#define XPS_GLOBAL_TMR_INT_ID 27U /* SCU Global Timer interrupt */ +#define XPS_FIQ_INT_ID 28U /* FIQ from FPGA fabric */ +#define XPS_SCU_TMR_INT_ID 29U /* SCU Private Timer interrupt */ +#define XPS_SCU_WDT_INT_ID 30U /* SCU Private WDT interrupt */ +#define XPS_IRQ_INT_ID 31U /* 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_PS7_TTC_0_INTR XPS_TTC0_0_INT_ID +#define XPAR_PS7_TTC_1_INTR XPS_TTC0_1_INT_ID +#define XPAR_PS7_TTC_2_INTR XPS_TTC0_2_INT_ID +#define XPAR_PS7_TTC_3_INTR XPS_TTC1_0_INT_ID +#define XPAR_PS7_TTC_4_INTR XPS_TTC1_1_INT_ID +#define XPAR_PS7_TTC_5_INTR XPS_TTC1_2_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 0U +#define XPAR_SCUWDT_DEVICE_ID 0U + + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xplatform_info.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xplatform_info.h new file mode 100644 index 0000000..0582222 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xplatform_info.h @@ -0,0 +1,109 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xplatform_info.h +* +* @addtogroup common_platform_info APIs to Get Platform Information +* +* The xplatform_info.h file contains definitions for various available Xilinx® +* platforms. Also, it contains prototype of APIs, which can be used to get the +* platform information. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date    Changes
    +* ----- ---- --------- -------------------------------------------------------
    +* 6.4    ms   05/23/17 Added PSU_PMU macro to support XGetPSVersion_Info
    +*                      function for PMUFW.
    +* 
    +* +******************************************************************************/ + +#ifndef XPLATFORM_INFO_H /* prevent circular inclusions */ +#define XPLATFORM_INFO_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + +#define XPAR_CSU_BASEADDR 0xFFCA0000U +#define XPAR_CSU_VER_OFFSET 0x00000044U + +#define XPLAT_ZYNQ_ULTRA_MP_SILICON 0x0 +#define XPLAT_ZYNQ_ULTRA_MP 0x1 +#define XPLAT_ZYNQ_ULTRA_MPVEL 0x2 +#define XPLAT_ZYNQ_ULTRA_MPQEMU 0x3 +#define XPLAT_ZYNQ 0x4 +#define XPLAT_MICROBLAZE 0x5 + +#define XPS_VERSION_1 0x0 +#define XPS_VERSION_2 0x1 + +#define XPLAT_INFO_MASK (0xF) +#define XPLAT_INFO_SHIFT (0xC) +#define XPS_VERSION_INFO_MASK (0xF) + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + + +u32 XGetPlatform_Info(); + +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) || (PSU_PMU) +u32 XGetPSVersion_Info(); +#endif + +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) +u32 XGet_Zynq_UltraMp_Platform_info(); +#endif +/************************** Function Prototypes ******************************/ + + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_platform_info". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpm_counter.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpm_counter.h new file mode 100644 index 0000000..45f0919 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpm_counter.h @@ -0,0 +1,575 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpm_counter.h +* +* @addtogroup a9_event_counter_apis Cortex A9 Event Counters Functions +* +* Cortex A9 event counter functions can be utilized to configure and control +* the Cortex-A9 performance monitor events. +* +* Cortex-A9 performance monitor has six event counters which can be used to +* count a variety of events described in Coretx-A9 TRM. xpm_counter.h defines +* configurations XPM_CNTRCFGx which can be used to program the event counters +* to count a set of events. +* +* @note +* It doesn't handle the Cortex-A9 cycle counter, as the cycle counter is +* being used for time keeping. +* +* @{ +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a sdm  07/11/11 First release
    +* 
    +* +******************************************************************************/ + +#ifndef XPMCOUNTER_H /* prevent circular inclusions */ +#define XPMCOUNTER_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include +#include "xpseudo_asm.h" +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/************************** Constant Definitions ****************************/ + +/* Number of performance counters */ +#define XPM_CTRCOUNT 6U + +/* 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 0x00U + +/* + * 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 0x01U + +/* + * 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 0x02U + +/* + * 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 0x03U + +/* + * 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 0x04U + +/* + * 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 0x05U + +/* + * 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 0x06U + +/* + * 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 0x07U + +/* Exception taken. Counts the number of exceptions architecturally taken.*/ +#define XPM_EVENT_EXCEPTION 0x09U + +/* Exception return architecturally executed.*/ +#define XPM_EVENT_EXCEPRETURN 0x0AU + +/* + * Change to ContextID retired. Counts the number of instructions + * architecturally executed writing into the ContextID Register + */ +#define XPM_EVENT_CHANGECONTEXT 0x0BU + +/* + * 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 0x0CU + +/* + * 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 0x0DU + +/* + * 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 0x0FU + +/* + * 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 0x10U + +/* + * 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 0x11U + +/* + * 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 0x12U + +/* + * Java bytecode execute. Counts the number of Java bytecodes being decoded, + * including speculative ones + */ +#define XPM_EVENT_JAVABYTECODE 0x40U + +/* + * Software Java bytecode executed. Counts the number of software java bytecodes + * being decoded, including speculative ones + */ +#define XPM_EVENT_SWJAVABYTECODE 0x41U + +/* + * 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 0x42U + +/* + * 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 0x50U + +/* + * 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 0x51U + +/* + * 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 0x60U + +/* + * 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 0x61U + +/* + * 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 0x62U + +/* + * Counts the number of STREX instructions architecturally executed and + * passed + */ +#define XPM_EVENT_STREXPASS 0x63U + +/* + * Counts the number of STREX instructions architecturally executed and + * failed + */ +#define XPM_EVENT_STREXFAIL 0x64U + +/* + * Data eviction. Counts the number of eviction requests due to a linefill in + * the data cache + */ +#define XPM_EVENT_DATAEVICT 0x65U + +/* + * 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 0x66U + +/* + * Counts the number of cycles where the issue stage is empty + */ +#define XPM_EVENT_ISSUEEMPTY 0x67U + +/* + * 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 0x68U + +/* + * 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 0x6EU + +/* + * 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 0x70U + +/* + * Counts the number of instructions being executed in the processor second + * execution pipeline (ALU). The counted instructions are still speculative + */ +#define XPM_EVENT_SECEXEC 0x71U + +/* + * Counts the number of instructions being executed in the Load/Store unit. The + * counted instructions are still speculative + */ +#define XPM_EVENT_LDRSTR 0x72U + +/* + * 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 0x73U + +/* + * 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 0x74U + +/* + * Counts the number of cycles where the processor is stalled because PLD slots + * are all full + */ +#define XPM_EVENT_PLDSTALL 0x80U + +/* + * 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 0x81U + +/* + * Counts the number of stall cycles due to main TLB misses on requests issued + * by the instruction side + */ +#define XPM_EVENT_INSTRTLBSTALL 0x82U + +/* + * Counts the number of stall cycles due to main TLB misses on requests issued + * by the data side + */ +#define XPM_EVENT_DATATLBSTALL 0x83U + +/* + * 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 0x84U + +/* + * 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 0x85U + +/* + * 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 0x86U + +/* + * Counts the number of cycles during which the integer core clock is enabled + */ +#define XPM_EVENT_INT_CLKEN 0x8AU + +/* + * Counts the number of cycles during which the Data Engine clock is enabled + */ +#define XPM_EVENT_DE_CLKEN 0x8BU + +/* + * Counts the number of ISB instructions architecturally executed + */ +#define XPM_EVENT_INSTRISB 0x90U + +/* + * Counts the number of DSB instructions architecturally executed + */ +#define XPM_EVENT_INSTRDSB 0x91U + +/* + * Counts the number of DMB instructions speculatively executed + */ +#define XPM_EVENT_INSTRDMB 0x92U + +/* + * Counts the number of external interrupts executed by the processor + */ +#define XPM_EVENT_EXTINT 0x93U + +/* + * PLE cache line request completed + */ +#define XPM_EVENT_PLE_LRC 0xA0U + +/* + * PLE cache line request skipped + */ +#define XPM_EVENT_PLE_LRS 0xA1U + +/* + * PLE FIFO flush + */ +#define XPM_EVENT_PLE_FLUSH 0xA2U + +/* + * PLE request complete + */ +#define XPM_EVENT_PLE_CMPL 0xA3U + +/* + * PLE FIFO overflow + */ +#define XPM_EVENT_PLE_OVFL 0xA4U + +/* + * PLE request programmed + */ +#define XPM_EVENT_PLE_PROG 0xA5U + +/* + * 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(s32 PmcrCfg); +void Xpm_GetEventCounters(u32 *PmCtrValue); + +#ifdef __cplusplus +} +#endif + +#endif +/** +* @} End of "addtogroup a9_event_counter_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpseudo_asm.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpseudo_asm.h new file mode 100644 index 0000000..4ad9e5d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpseudo_asm.h @@ -0,0 +1,77 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpseudo_asm.h +* +* @addtogroup a9_specific Cortex A9 Processor Specific Include Files +* +* The xpseudo_asm.h includes xreg_cortexa9.h and xpseudo_asm_gcc.h. +* +* The xreg_cortexa9.h file contains definitions for inline assembler code. +* It provides inline definitions for Cortex A9 GPRs, SPRs, MPE registers, +* co-processor registers and Debug registers. +* +* The xpseudo_asm_gcc.h contains the definitions for the most often used inline +* assembler instructions, available as macros. These can be very useful for +* tasks such as setting or getting special purpose registers, synchronization, +* or cache manipulation etc. These inline assembler instructions can be used +* from drivers and user applications written in C. +* +* @{ +*
    +* 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.
    +* 
    +* +******************************************************************************/ +#ifndef XPSEUDO_ASM_H +#define XPSEUDO_ASM_H + +#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 + +#endif /* XPSEUDO_ASM_H */ +/** +* @} End of "addtogroup a9_specific". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h new file mode 100644 index 0000000..37971bc --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h @@ -0,0 +1,256 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpseudo_asm_gcc.h +* +* This header file contains macros for using inline assembler code. It is +* written specifically for the GNU compiler. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 5.00 	pkp		 05/21/14 First release
    +* 6.0   mus      07/27/16 Consolidated file for a53,a9 and r5 processors
    +* 
    +* +******************************************************************************/ + +#ifndef XPSEUDO_ASM_GCC_H /* prevent circular inclusions */ +#define XPSEUDO_ASM_GCC_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include "xil_types.h" + +#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 + +#if defined (__aarch64__) +/* pseudo assembler instructions */ +#define mfcpsr() ({u32 rval = 0U; \ + asm volatile("mrs %0, DAIF" : "=r" (rval));\ + rval;\ + }) + +#define mtcpsr(v) __asm__ __volatile__ ("msr DAIF, %0" : : "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) /*({u32 rval; \ + __asm__ __volatile__(\ + "mov %0,r" stringify(rn) "\n"\ + : "=r" (rval)\ + );\ + rval;\ + })*/ + +/* memory synchronization operations */ + +/* Instruction Synchronization Barrier */ +#define isb() __asm__ __volatile__ ("isb sy") + +/* Data Synchronization Barrier */ +#define dsb() __asm__ __volatile__("dsb sy") + +/* Data Memory Barrier */ +#define dmb() __asm__ __volatile__("dmb sy") + + +/* Memory Operations */ +#define ldr(adr) ({u64 rval; \ + __asm__ __volatile__(\ + "ldr %0,[%1]"\ + : "=r" (rval) : "r" (adr)\ + );\ + rval;\ + }) + +#define mfelrel3() ({u64 rval = 0U; \ + asm volatile("mrs %0, ELR_EL3" : "=r" (rval));\ + rval;\ + }) + +#define mtelrel3(v) __asm__ __volatile__ ("msr ELR_EL3, %0" : : "r" (v)) + +#else + +/* pseudo assembler instructions */ +#define mfcpsr() ({u32 rval = 0U; \ + __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) ({u32 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) ({u32 rval; \ + __asm__ __volatile__(\ + "ldr %0,[%1]"\ + : "=r" (rval) : "r" (adr)\ + );\ + rval;\ + }) + +#endif + +#define ldrb(adr) ({u8 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) ({u8 rval; \ + __asm__ __volatile__(\ + "clz %0,%1"\ + : "=r" (rval) : "r" (arg)\ + );\ + rval;\ + }) + +#if defined (__aarch64__) +#define mtcpdc(reg,val) __asm__ __volatile__("dc " #reg ",%0" : : "r" (val)) +#define mtcpic(reg,val) __asm__ __volatile__("ic " #reg ",%0" : : "r" (val)) + +#define mtcpicall(reg) __asm__ __volatile__("ic " #reg) +#define mtcptlbi(reg) __asm__ __volatile__("tlbi " #reg) +#define mtcpat(reg,val) __asm__ __volatile__("at " #reg ",%0" : : "r" (val)) +/* CP15 operations */ +#define mfcp(reg) ({u64 rval = 0U;\ + __asm__ __volatile__("mrs %0, " #reg : "=r" (rval));\ + rval;\ + }) + +#define mtcp(reg,val) __asm__ __volatile__("msr " #reg ",%0" : : "r" (val)) + +#else +/* CP15 operations */ +#define mtcp(rn, v) __asm__ __volatile__(\ + "mcr " rn "\n"\ + : : "r" (v)\ + ); + +#define mfcp(rn) ({u32 rval = 0U; \ + __asm__ __volatile__(\ + "mrc " rn "\n"\ + : "=r" (rval)\ + );\ + rval;\ + }) +#endif + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XPSEUDO_ASM_GCC_H */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xqspips.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xqspips.h new file mode 100644 index 0000000..139ce4d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xqspips.h @@ -0,0 +1,799 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips.h +* @addtogroup qspips_v3_4 +* @{ +* @details +* +* 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. +* +* Linear Mode +* 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. +* +* Initialization & Configuration +* +* 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. +* +* Multiple Masters +* +* 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. +* +* Modes of Operation +* +* 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. +* +* Interrupts +* +* 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. +* +* +* Polled Operation +* +* 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. +* +* Device Busy +* +* 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). +* +* Device Configuration +* +* 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. +* +* RTOS Independence +* +* 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. +* +*
    +* 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.
    +* 3.1   hk  08/13/14 When writing to the configuration register, set/reset
    +*                    required bits leaving reserved bits untouched. CR# 796813.
    +* 3.2	sk	02/05/15 Add SLCR reset in abort function as a workaround because
    +* 					 controller does not update FIFO status flags as expected
    +* 					 when thresholds are used.
    +* 3.3   sk  11/07/15 Modified the API prototypes according to MISRAC standards
    +*                    to remove compilation warnings. CR# 868893.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +*       ms  04/05/17 Modified Comment lines in functions of qspips
    +*                    examples to recognize it as documentation block
    +*                    and modified filename tag in
    +*                    xqspips_dual_flash_stack_lqspi_example.c to include it in
    +*                    doxygen examples.
    +* 3.4   nsk 31/07/17 Added QSPI_BUS_WIDTH parameter in xparameters.h file
    +*
    +* 
    +* +******************************************************************************/ +#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 + +/************************** 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 Active Low Clock option 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 Clock Phase option 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 QSPI Force Slave Select option 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 Manual Start option 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); + +s32 XQspiPs_Transfer(XQspiPs *InstancePtr, u8 *SendBufPtr, u8 *RecvBufPtr, + u32 ByteCount); +s32 XQspiPs_PolledTransfer(XQspiPs *InstancePtr, u8 *SendBufPtr, + u8 *RecvBufPtr, u32 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 + */ +s32 XQspiPs_SetOptions(XQspiPs *InstancePtr, u32 Options); +u32 XQspiPs_GetOptions(XQspiPs *InstancePtr); + +s32 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xqspips_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xqspips_hw.h new file mode 100644 index 0000000..96c867a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xqspips_hw.h @@ -0,0 +1,423 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_hw.h +* @addtogroup qspips_v3_4 +* @{ +* +* 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. +* +*
    +* 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.
    +* 3.1   hk  08/13/14 Changed definition of CR reset value masks to set/reset
    +*                    required bits leaving reserved bits untouched. CR# 796813.
    +* 3.2	sk	02/05/15 Add SLCR reset in abort function as a workaround because
    +* 					 controller does not update FIFO status flags as expected
    +* 					 when thresholds are used.
    +*
    +* 
    +* +******************************************************************************/ +#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 */ + +#define XQSPIPS_CR_REF_CLK_MASK 0x00000100 /**< Ref clk bit - should be 0 */ + +/* Deselect the Slave select line and set the transfer size to 32 at reset */ +#define XQSPIPS_CR_RESET_MASK_SET XQSPIPS_CR_IFMODE_MASK | \ + XQSPIPS_CR_SSCTRL_MASK | \ + XQSPIPS_CR_DATA_SZ_MASK | \ + XQSPIPS_CR_MSTREN_MASK | \ + XQSPIPS_CR_SSFORCE_MASK | \ + XQSPIPS_CR_HOLD_B_MASK +#define XQSPIPS_CR_RESET_MASK_CLR XQSPIPS_CR_CPOL_MASK | \ + XQSPIPS_CR_CPHA_MASK | \ + XQSPIPS_CR_PRESC_MASK | \ + XQSPIPS_CR_MANSTRTEN_MASK | \ + XQSPIPS_CR_MANSTRT_MASK | \ + XQSPIPS_CR_ENDIAN_MASK | \ + XQSPIPS_CR_REF_CLK_MASK +/* @} */ + + +/** @name QSPI Interrupt Registers + * + * QSPI Status Register + * + * 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. + * + * QSPI Interrupt Enable Register + * + * 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. + * + * QSPI Interrupt Disable Register + * + * 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. + * + * QSPI Interrupt Mask Register + * + * 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 */ + +/* @} */ + + +/** @name SLCR Register + * + * Register offsets from SLCR base address. + * + * @{ + */ + +#define SLCR_LOCK 0x00000004 /**< SLCR Write Protection Lock */ +#define SLCR_UNLOCK 0x00000008 /**< SLCR Write Protection Unlock */ +#define LQSPI_RST_CTRL 0x00000230 /**< Quad SPI Software Reset Control */ +#define SLCR_LOCKSTA 0x0000000C /**< SLCR Write Protection status */ + +/* @} */ + + +/** @name SLCR Register + * + * Bit Masks of above SLCR Registers . + * + * @{ + */ + +#ifndef XPAR_XSLCR_0_BASEADDR +#define XPAR_XSLCR_0_BASEADDR 0xF8000000 +#endif +#define SLCR_LOCK_MASK 0x767B /**< Write Protection Lock mask*/ +#define SLCR_UNLOCK_MASK 0xDF0D /**< SLCR Write Protection Unlock */ +#define LQSPI_RST_CTRL_MASK 0x3 /**< Quad SPI Software Reset Control */ + +/* @} */ + + +/**************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h new file mode 100644 index 0000000..dc9a4eb --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h @@ -0,0 +1,591 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xreg_cortexa9.h +* +* This header file contains definitions for using inline assembler code. It is +* written specifically for the GNU, 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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 1.00a ecm/sdm  10/20/09 First release
    +* 
    +* +******************************************************************************/ +#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 0x40000000U +#define XREG_CP15_CONTROL_AFE_BIT 0x20000000U +#define XREG_CP15_CONTROL_TRE_BIT 0x10000000U +#define XREG_CP15_CONTROL_NMFI_BIT 0x08000000U +#define XREG_CP15_CONTROL_EE_BIT 0x02000000U +#define XREG_CP15_CONTROL_HA_BIT 0x00020000U +#define XREG_CP15_CONTROL_RR_BIT 0x00004000U +#define XREG_CP15_CONTROL_V_BIT 0x00002000U +#define XREG_CP15_CONTROL_I_BIT 0x00001000U +#define XREG_CP15_CONTROL_Z_BIT 0x00000800U +#define XREG_CP15_CONTROL_SW_BIT 0x00000400U +#define XREG_CP15_CONTROL_B_BIT 0x00000080U +#define XREG_CP15_CONTROL_C_BIT 0x00000004U +#define XREG_CP15_CONTROL_A_BIT 0x00000002U +#define XREG_CP15_CONTROL_M_BIT 0x00000001U + +#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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscugic.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscugic.h new file mode 100644 index 0000000..e22ee5b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscugic.h @@ -0,0 +1,372 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic.h +* @addtogroup scugic_v3_8 +* @{ +* @details +* +* 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. +* +* Interrupt Vector Tables +* +* 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. +* +* Nested Interrupts Processing +* +* Nested interrupts are not supported by this driver. +* +* NOTE: +* The generic interrupt controller is not a part of the snoop control unit +* as indicated by the prefix "scu" in the name of the driver. +* It is an independent module in APU. +* +*
    +* 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.
    +* 2.0   adk  12/10/13 Updated as per the New Tcl API's
    +* 2.1   adk  25/04/14 Fixed the CR:789373 changes are made in the driver tcl file.
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.2   asa  02/29/16 Modified DistributorInit function for Zynq AMP case. The
    +*			  distributor is left uninitialized for Zynq AMP. It is assumed
    +*             that the distributor will be initialized by Linux master. However
    +*             for CortexR5 case, the earlier code is left unchanged where the
    +*             the interrupt processor target registers in the distributor is
    +*             initialized with the corresponding CPU ID on which the application
    +*             built over the scugic driver runs.
    +*             These changes fix CR#937243.
    +*
    +* 3.4   asa  04/07/16 Created a new static function DoDistributorInit to simplify
    +*            the flow and avoid code duplication. Changes are made for
    +*            USE_AMP use case for R5. In a scenario (in R5 split mode) when
    +*            one R5 is operating with A53 in open amp config and other
    +*            R5 running baremetal app, the existing code
    +*            had the potential to stop the whole AMP solution to work (if
    +*            for some reason the R5 running the baremetal app tasked to
    +*            initialize the Distributor hangs or crashes before initializing).
    +*            Changes are made so that the R5 under AMP first checks if
    +*            the distributor is enabled or not and if not, it does the
    +*            standard Distributor initialization.
    +*            This fixes the CR#952962.
    +* 3.6   ms   01/23/17 Modified xil_printf statement in main function for all
    +*                     examples to ensure that "Successfully ran" and "Failed"
    +*                     strings are available in all examples. This is a fix
    +*                     for CR-965028.
    +*       kvn  02/17/17 Add support for changing GIC CPU master at run time.
    +*       kvn  02/28/17 Make the CpuId as static variable and Added new
    +*                     XScugiC_GetCpuId to access CpuId.
    +*       ms   03/17/17 Added readme.txt file in examples folder for doxygen
    +*                     generation.
    +* 3.7   ms   04/11/17 Modified tcl file to add suffix U for all macro
    +*                     definitions of scugic in xparameters.h
    +* 3.8   mus  07/05/17 Updated scugic.tcl to add support for intrrupts connected
    +*                     through util_reduced_vector IP(OR gate)
    +*       mus  07/05/17 Updated xdefine_zynq_canonical_xpars proc to initialize
    +*                     the HandlerTable in XScuGic_ConfigTable to 0, it removes
    +*                     the compilation warning in xscugic_g.c. Fix for CR#978736.
    +*       mus  07/25/17 Updated xdefine_gic_params proc to export correct canonical
    +*                     definitions for pl to ps interrupts.Fix for CR#980534
    +* 3.9   mus  02/21/18 Added new API's XScuGic_UnmapAllInterruptsFromCpu and
    +*                     XScuGic_InterruptUnmapFromCpu, These API's can be used
    +*                     by applications to unmap specific/all interrupts from
    +*                     target CPU.
    +*
    +* 
    +* +******************************************************************************/ + +#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 *****************************/ + +#define EFUSE_STATUS_OFFSET 0x10 +#define EFUSE_STATUS_CPU_MASK 0x80 + +#if !defined (ARMR5) && !defined (__aarch64__) && !defined (ARMA53_32) +#define ARMA9 +#endif +/**************************** 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 + */ + +s32 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); + +s32 XScuGic_CfgInitialize(XScuGic *InstancePtr, XScuGic_Config *ConfigPtr, + u32 EffectiveAddr); + +s32 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); +void XScuGic_InterruptMaptoCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id); +void XScuGic_InterruptUnmapFromCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id); +void XScuGic_UnmapAllInterruptsFromCpu(XScuGic *InstancePtr, u8 Cpu_Id); +void XScuGic_Stop(XScuGic *InstancePtr); +void XScuGic_SetCpuID(u32 CpuCoreId); +u32 XScuGic_GetCpuID(void); +/* + * 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 + */ +s32 XScuGic_SelfTest(XScuGic *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscugic_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscugic_hw.h new file mode 100644 index 0000000..08e65f4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscugic_hw.h @@ -0,0 +1,650 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_hw.h +* @addtogroup scugic_v3_8 +* @{ +* +* 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. +* +* +*
    +* 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
    +* 3.0	pkp  12/09/14 changed XSCUGIC_MAX_NUM_INTR_INPUTS for
    +*		      Zynq Ultrascale Mp
    +* 3.0   kvn  02/13/14 Modified code for MISRA-C:2012 compliance.
    +* 3.2	pkp  11/09/15 Corrected the interrupt processsor target mask value
    +*					  for CPU interface 2 i.e. XSCUGIC_SPI_CPU2_MASK
    +* 3.9   mus  02/21/18 Added new API's XScuGic_InterruptUnmapFromCpuByDistAddr
    +*					  and XScuGic_UnmapAllInterruptsFromCpuByDistAddr, These
    +*					  API's can be used by applications to unmap specific/all
    +*					  interrupts from target CPU. It fixes CR#992490.
    +* 
    +* +******************************************************************************/ + +#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. + */ +#ifdef __ARM_NEON__ +#define XSCUGIC_MAX_NUM_INTR_INPUTS 95U /* Maximum number of interrupt defined by Zynq */ +#else +#define XSCUGIC_MAX_NUM_INTR_INPUTS 195U /* Maximum number of interrupt defined by Zynq Ultrascale Mp */ +#endif + +/* + * The maximum priority value that can be used in the GIC. + */ +#define XSCUGIC_MAX_INTR_PRIO_VAL 248U +#define XSCUGIC_INTR_PRIO_MASK 0x000000F8U + +/** @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 0x00000000U /**< Distributor Enable + Register */ +#define XSCUGIC_IC_TYPE_OFFSET 0x00000004U /**< Interrupt Controller + Type Register */ +#define XSCUGIC_DIST_IDENT_OFFSET 0x00000008U /**< Implementor ID + Register */ +#define XSCUGIC_SECURITY_OFFSET 0x00000080U /**< Interrupt Security + Register */ +#define XSCUGIC_ENABLE_SET_OFFSET 0x00000100U /**< Enable Set + Register */ +#define XSCUGIC_DISABLE_OFFSET 0x00000180U /**< Enable Clear Register */ +#define XSCUGIC_PENDING_SET_OFFSET 0x00000200U /**< Pending Set + Register */ +#define XSCUGIC_PENDING_CLR_OFFSET 0x00000280U /**< Pending Clear + Register */ +#define XSCUGIC_ACTIVE_OFFSET 0x00000300U /**< Active Status Register */ +#define XSCUGIC_PRIORITY_OFFSET 0x00000400U /**< Priority Level Register */ +#define XSCUGIC_SPI_TARGET_OFFSET 0x00000800U /**< SPI Target + Register 0x800-0x8FB */ +#define XSCUGIC_INT_CFG_OFFSET 0x00000C00U /**< Interrupt Configuration + Register 0xC00-0xCFC */ +#define XSCUGIC_PPI_STAT_OFFSET 0x00000D00U /**< PPI Status Register */ +#define XSCUGIC_SPI_STAT_OFFSET 0x00000D04U /**< SPI Status Register + 0xd04-0xd7C */ +#define XSCUGIC_AHB_CONFIG_OFFSET 0x00000D80U /**< AHB Configuration + Register */ +#define XSCUGIC_SFI_TRIG_OFFSET 0x00000F00U /**< Software Triggered + Interrupt Register */ +#define XSCUGIC_PERPHID_OFFSET 0x00000FD0U /**< Peripheral ID Reg */ +#define XSCUGIC_PCELLID_OFFSET 0x00000FF0U /**< Pcell ID Register */ +/* @} */ + +/** @name Distributor Enable Register + * Controls if the distributor response to external interrupt inputs. + * @{ + */ +#define XSCUGIC_EN_INT_MASK 0x00000001U /**< Interrupt In Enable */ +/* @} */ + +/** @name Interrupt Controller Type Register + * @{ + */ +#define XSCUGIC_LSPI_MASK 0x0000F800U /**< Number of Lockable + Shared Peripheral + Interrupts*/ +#define XSCUGIC_DOMAIN_MASK 0x00000400U /**< Number os Security domains*/ +#define XSCUGIC_CPU_NUM_MASK 0x000000E0U /**< Number of CPU Interfaces */ +#define XSCUGIC_NUM_INT_MASK 0x0000001FU /**< Number of Interrupt IDs */ +/* @} */ + +/** @name Implementor ID Register + * Implementor and revision information. + * @{ + */ +#define XSCUGIC_REV_MASK 0x00FFF000U /**< Revision Number */ +#define XSCUGIC_IMPL_MASK 0x00000FFFU /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x000000FFU /**< Each Byte corresponds to an + INT_ID */ +#define XSCUGIC_PRIORITY_MAX 0x000000FFU /**< 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 0x00000080U /**< CPU 7 Mask*/ +#define XSCUGIC_SPI_CPU6_MASK 0x00000040U /**< CPU 6 Mask*/ +#define XSCUGIC_SPI_CPU5_MASK 0x00000020U /**< CPU 5 Mask*/ +#define XSCUGIC_SPI_CPU4_MASK 0x00000010U /**< CPU 4 Mask*/ +#define XSCUGIC_SPI_CPU3_MASK 0x00000008U /**< CPU 3 Mask*/ +#define XSCUGIC_SPI_CPU2_MASK 0x00000004U /**< CPU 2 Mask*/ +#define XSCUGIC_SPI_CPU1_MASK 0x00000002U /**< CPU 1 Mask*/ +#define XSCUGIC_SPI_CPU0_MASK 0x00000001U /**< 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 0x00000003U /**< */ +/* @} */ + +/** @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 0x00008000U /**< PPI Status */ +#define XSCUGIC_PPI_C14_MASK 0x00004000U /**< PPI Status */ +#define XSCUGIC_PPI_C13_MASK 0x00002000U /**< PPI Status */ +#define XSCUGIC_PPI_C12_MASK 0x00001000U /**< PPI Status */ +#define XSCUGIC_PPI_C11_MASK 0x00000800U /**< PPI Status */ +#define XSCUGIC_PPI_C10_MASK 0x00000400U /**< PPI Status */ +#define XSCUGIC_PPI_C09_MASK 0x00000200U /**< PPI Status */ +#define XSCUGIC_PPI_C08_MASK 0x00000100U /**< PPI Status */ +#define XSCUGIC_PPI_C07_MASK 0x00000080U /**< PPI Status */ +#define XSCUGIC_PPI_C06_MASK 0x00000040U /**< PPI Status */ +#define XSCUGIC_PPI_C05_MASK 0x00000020U /**< PPI Status */ +#define XSCUGIC_PPI_C04_MASK 0x00000010U /**< PPI Status */ +#define XSCUGIC_PPI_C03_MASK 0x00000008U /**< PPI Status */ +#define XSCUGIC_PPI_C02_MASK 0x00000004U /**< PPI Status */ +#define XSCUGIC_PPI_C01_MASK 0x00000002U /**< PPI Status */ +#define XSCUGIC_PPI_C00_MASK 0x00000001U /**< 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 0x00000001U /**< 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 0x00000004U /**< 0-GIC uses little Endian, + 1-GIC uses Big Endian */ +#define XSCUGIC_AHB_ENDOVR_MASK 0x00000002U /**< 0-Uses CFGBIGEND control, + 1-use the AHB_END bit */ +#define XSCUGIC_AHB_TIE_OFF_MASK 0x00000001U /**< State of CFGBIGEND */ + +/* @} */ + +/** @name Software Triggered Interrupt Register + * Controls issueing of software interrupts. + * @{ + */ +#define XSCUGIC_SFI_SELFTRIG_MASK 0x02010000U +#define XSCUGIC_SFI_TRIG_TRGFILT_MASK 0x03000000U /**< Target List filter + b00-Use the target List + b01-All CPUs except requester + b10-To Requester + b11-reserved */ +#define XSCUGIC_SFI_TRIG_CPU_MASK 0x00FF0000U /**< CPU Target list */ +#define XSCUGIC_SFI_TRIG_SATT_MASK 0x00008000U /**< 0= Use a secure interrupt */ +#define XSCUGIC_SFI_TRIG_INTID_MASK 0x0000000FU /**< 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 0x00000000U /**< CPU Interface Control + Register */ +#define XSCUGIC_CPU_PRIOR_OFFSET 0x00000004U /**< Priority Mask Reg */ +#define XSCUGIC_BIN_PT_OFFSET 0x00000008U /**< Binary Point Register */ +#define XSCUGIC_INT_ACK_OFFSET 0x0000000CU /**< Interrupt ACK Reg */ +#define XSCUGIC_EOI_OFFSET 0x00000010U /**< End of Interrupt Reg */ +#define XSCUGIC_RUN_PRIOR_OFFSET 0x00000014U /**< Running Priority Reg */ +#define XSCUGIC_HI_PEND_OFFSET 0x00000018U /**< Highest Pending Interrupt + Register */ +#define XSCUGIC_ALIAS_BIN_PT_OFFSET 0x0000001CU /**< 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 0x00000010U /**< Secure Binary Pointer, + 0=separate registers, + 1=both use bin_pt_s */ +#define XSCUGIC_CNTR_FIQEN_MASK 0x00000008U /**< Use nFIQ_C for secure + interrupts, + 0= use IRQ for both, + 1=Use FIQ for secure, IRQ for non*/ +#define XSCUGIC_CNTR_ACKCTL_MASK 0x00000004U /**< Ack control for secure or non secure */ +#define XSCUGIC_CNTR_EN_NS_MASK 0x00000002U /**< Non Secure enable */ +#define XSCUGIC_CNTR_EN_S_MASK 0x00000001U /**< 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 0x000000FFU*/ /**< All interrupts */ +/* @} */ + +/** @name Binary Point Register + * Binary Point register definitions + * @{ + */ + +#define XSCUGIC_BIN_PT_MASK 0x00000007U /**< 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 0x000003FFU /**< Interrupt ID */ +#define XSCUGIC_CPUID_MASK 0x00000C00U /**< 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 0x000003FFU /**< 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 0x000000FFU /**< Interrupt Priority */ +/* @} */ + +/* + * Highest Pending Interrupt register definitions + * Identifies the interrupt priority of the highest priority pending interupt + */ +#define XSCUGIC_PEND_INTID_MASK 0x000003FFU /**< Pending Interrupt ID */ +/*#define XSCUGIC_CPUID_MASK 0x00000C00U */ /**< 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) \ + ((u32)XSCUGIC_INT_CFG_OFFSET + (((InterruptID)/16U) * 4U)) + +/****************************************************************************/ +/** +* +* 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) \ + ((u32)XSCUGIC_PRIORITY_OFFSET + (((InterruptID)/4U) * 4U)) + +/****************************************************************************/ +/** +* +* 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) \ + ((u32)XSCUGIC_SPI_TARGET_OFFSET + (((InterruptID)/4U) * 4U)) + +/****************************************************************************/ +/** +* +* 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_EN_DIS_OFFSET_CALC(Register, InterruptID) \ + ((Register) + (((InterruptID)/32U) * 4U)) + +/****************************************************************************/ +/** +* +* 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) / 32U) * 4U), \ + (0x00000001U << ((Int_Id) % 32U))) + +/****************************************************************************/ +/** +* +* 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) / 32U) * 4U), \ + (0x00000001U << ((Int_Id) % 32U))) + + +/************************** Function Prototypes ******************************/ + +void XScuGic_DeviceInterruptHandler(void *DeviceId); +s32 XScuGic_DeviceInitialize(u32 DeviceId); +void XScuGic_RegisterHandler(u32 BaseAddress, s32 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); +void XScuGic_InterruptUnmapFromCpuByDistAddr(u32 DistBaseAddress, + u8 Cpu_Id, u32 Int_Id); +void XScuGic_UnmapAllInterruptsFromCpuByDistAddr(u32 DistBaseAddress, + u8 Cpu_Id); +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscutimer.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscutimer.h new file mode 100644 index 0000000..ea4ba79 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscutimer.h @@ -0,0 +1,368 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer.h +* @addtogroup scutimer_v2_1 +* @{ +* @details +* +* 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) +* +* Initialization and Configuration +* +* 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. +* +* Interrupts +* +* 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. +* +* Virtual Memory +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Asserts +* +* 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. +* +* Building the driver +* +* 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. +* +*

    +* +* NOTE: +* The timer is not a part of the snoop control unit as indicated by the +* prefix "scu" in the name of the driver. +* It is an independent module in APU. +* +*
    +* 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.
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +* 
    +* +******************************************************************************/ +#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 + */ +s32 XScuTimer_SelfTest(XScuTimer *InstancePtr); + +/* + * Interface functions in xscutimer.c + */ +s32 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscutimer_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscutimer_hw.h new file mode 100644 index 0000000..ac7b429 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscutimer_hw.h @@ -0,0 +1,287 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer_hw.h +* @addtogroup scutimer_v2_1 +* @{ +* +* This file contains the hardware interface to the Timer. +* +*
    +* 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.
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ +#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 0x00U /**< Timer Load Register */ +#define XSCUTIMER_COUNTER_OFFSET 0x04U /**< Timer Counter Register */ +#define XSCUTIMER_CONTROL_OFFSET 0x08U /**< Timer Control Register */ +#define XSCUTIMER_ISR_OFFSET 0x0CU /**< 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 0x0000FF00U /**< Prescaler */ +#define XSCUTIMER_CONTROL_PRESCALER_SHIFT 8U +#define XSCUTIMER_CONTROL_IRQ_ENABLE_MASK 0x00000004U /**< Intr enable */ +#define XSCUTIMER_CONTROL_AUTO_RELOAD_MASK 0x00000002U /**< Auto-reload */ +#define XSCUTIMER_CONTROL_ENABLE_MASK 0x00000001U /**< Timer enable */ +/* @} */ + +/** @name Interrupt Status register + * This register indicates the Timer counter register has reached zero. + * @{ + */ + +#define XSCUTIMER_ISR_EVENT_FLAG_MASK 0x00000001U /**< 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscuwdt.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscuwdt.h new file mode 100644 index 0000000..372bbc3 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscuwdt.h @@ -0,0 +1,383 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt.h +* @addtogroup scuwdt_v2_1 +* @{ +* @details +* +* 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. +* +* Initialization and Configuration +* +* 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. +* +* Interrupts +* +* 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. +* +* Virtual Memory +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Asserts +* +* 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. +* +* Building the driver +* +* 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. +* +*

    +* +* NOTE: +* The watchdog timer is not a part of the snoop control unit as indicated +* by the prefix "scu" in the name of the driver. +* It is an independent module in APU. +* +*
    +* 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.
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +* 
    +* +******************************************************************************/ +#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 + */ +s32 XScuWdt_SelfTest(XScuWdt *InstancePtr); + +/* + * Interface functions in xscuwdt.c + */ +s32 XScuWdt_CfgInitialize(XScuWdt *InstancePtr, + XScuWdt_Config *ConfigPtr, u32 EffectiveAddress); + +void XScuWdt_Start(XScuWdt *InstancePtr); + +void XScuWdt_Stop(XScuWdt *InstancePtr); + + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscuwdt_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscuwdt_hw.h new file mode 100644 index 0000000..2067d3a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xscuwdt_hw.h @@ -0,0 +1,182 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt_hw.h +* @addtogroup scuwdt_v2_1 +* @{ +* +* This file contains the hardware interface to the Xilinx SCU private Watch Dog +* Timer (XSCUWDT). +* +*
    +* 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.
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ +#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 0x00U /**< Watchdog Load Register */ +#define XSCUWDT_COUNTER_OFFSET 0x04U /**< Watchdog Counter Register */ +#define XSCUWDT_CONTROL_OFFSET 0x08U /**< Watchdog Control Register */ +#define XSCUWDT_ISR_OFFSET 0x0CU /**< Watchdog Interrupt Status Register */ +#define XSCUWDT_RST_STS_OFFSET 0x10U /**< Watchdog Reset Status Register */ +#define XSCUWDT_DISABLE_OFFSET 0x14U /**< 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 0x0000FF00U /**< Prescaler */ +#define XSCUWDT_CONTROL_PRESCALER_SHIFT 8U +#define XSCUWDT_CONTROL_WD_MODE_MASK 0x00000008U /**< Watchdog/Timer mode */ +#define XSCUWDT_CONTROL_IT_ENABLE_MASK 0x00000004U /**< Intr enable (in + timer mode) */ +#define XSCUWDT_CONTROL_AUTO_RELOAD_MASK 0x00000002U /**< Auto-reload (in + timer mode) */ +#define XSCUWDT_CONTROL_WD_ENABLE_MASK 0x00000001U /**< Watchdog enable */ +/* @} */ + +/** @name Interrupt Status register + * This register indicates the Counter register has reached zero in Counter + * mode. + * @{ + */ + +#define XSCUWDT_ISR_EVENT_FLAG_MASK 0x00000001U /**< 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 0x00000001U /**< 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 0x12345678U /**< Watchdog mode disable + value 1 */ +#define XSCUWDT_DISABLE_VALUE2 0x87654321U /**< 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) + ((u32)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) + ((u32)RegOffset), ((u32)Data)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xsdps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xsdps.h new file mode 100644 index 0000000..b8d979d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xsdps.h @@ -0,0 +1,280 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xsdps.h +* @addtogroup sdps_v3_5 +* @{ +* @details +* +* This file contains the implementation of XSdPs driver. +* This driver is used initialize read from and write to the SD card. +* Features such as switching bus width to 4-bit and switching to high speed, +* changing clock frequency, block size etc. are supported. +* SD 2.0 uses 1/4 bus width and speeds of 25/50KHz. Initialization, however +* is done using 1-bit bus width and 400KHz clock frequency. +* SD commands are classified as broadcast and addressed. Commands can be +* those with response only (using only command line) or +* response + data (using command and data lines). +* Only one command can be sent at a time. During a data transfer however, +* when dsta lines are in use, certain commands (which use only the command +* line) can be sent, most often to obtain status. +* This driver does not support multi card slots at present. +* +* Intialization: +* This includes initialization on the host controller side to select +* clock frequency, bus power and default transfer related parameters. +* The default voltage is 3.3V. +* On the SD card side, the initialization and identification state diagram is +* implemented. This resets the card, gives it a unique address/ID and +* identifies key card related specifications. +* +* Data transfer: +* The SD card is put in tranfer state to read from or write to it. +* The default block size is 512 bytes and if supported, +* default bus width is 4-bit and bus speed is High speed. +* The read and write functions are implemented in polled mode using ADMA2. +* +* At any point, when key parameters such as block size or +* clock/speed or bus width are modified, this driver takes care of +* maintaining the same selection on host and card. +* All error bits in host controller are monitored by the driver and in the +* event one of them is set, driver will clear the interrupt status and +* communicate failure to the upper layer. +* +* File system use: +* This driver can be used with xilffs library to read and write files to SD. +* (Please refer to procedure in diskio.c). The file system read/write example +* in polled mode can used for reference. +* +* There is no example for using SD driver without file system at present. +* However, the driver can be used without the file system. The glue layer +* in filesytem can be used as reference for the same. The block count +* passed to the read/write function in one call is limited by the ADMA2 +* descriptor table and hence care will have to be taken to call read/write +* API's in a loop for large file sizes. +* +* Interrupt mode is not supported because it offers no improvement when used +* with file system. +* +* eMMC support: +* SD driver supports SD and eMMC based on the "enable MMC" parameter in SDK. +* The features of eMMC supported by the driver will depend on those supported +* by the host controller. The current driver supports read/write on eMMC card +* using 4-bit and high speed mode currently. +* +* Features not supported include - card write protect, password setting, +* lock/unlock, interrupts, SDMA mode, programmed I/O mode and +* 64-bit addressed ADMA2, erase/pre-erase commands. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ---    -------- -----------------------------------------------
    +* 1.00a hk/sg  10/17/13 Initial release
    +* 2.0   hk      03/07/14 Version number revised.
    +* 2.1   hk     04/18/14 Increase sleep for eMMC switch command.
    +*                       Add sleep for microblaze designs. CR# 781117.
    +* 2.2   hk     07/28/14 Make changes to enable use of data cache.
    +* 2.3   sk     09/23/14 Send command for relative card address
    +*                       when re-initialization is done.CR# 819614.
    +*						Use XSdPs_Change_ClkFreq API whenever changing
    +*						clock.CR# 816586.
    +* 2.4	sk	   12/04/14 Added support for micro SD without
    +* 						WP/CD. CR# 810655.
    +*						Checked for DAT Inhibit mask instead of CMD
    +* 						Inhibit mask in Cmd Transfer API.
    +*						Added Support for SD Card v1.0
    +* 2.5 	sg		07/09/15 Added SD 3.0 features
    +*       kvn     07/15/15 Modified the code according to MISRAC-2012.
    +* 2.6   sk     10/12/15 Added support for SD card v1.0 CR# 840601.
    +* 2.7   sk     11/24/15 Considered the slot type befoe checking CD/WP pins.
    +*       sk     12/10/15 Added support for MMC cards.
    +*              01/08/16 Added workaround for issue in auto tuning mode
    +*                       of SDR50, SDR104 and HS200.
    +*       sk     02/16/16 Corrected the Tuning logic.
    +*       sk     03/01/16 Removed Bus Width check for eMMC. CR# 938311.
    +* 2.8   sk     04/20/16 Added new workaround for auto tuning.
    +*              05/03/16 Standard Speed for SD to 19MHz in ZynqMPSoC. CR#951024
    +* 3.0   sk     06/09/16 Added support for mkfs to calculate sector count.
    +*       sk     07/16/16 Added support for UHS modes.
    +*       sk     07/07/16 Used usleep API for both arm and microblaze.
    +*       sk     07/16/16 Added Tap delays accordingly to different SD/eMMC
    +*                       operating modes.
    +*       sk     08/13/16 Removed sleep.h from xsdps.h as a temporary fix for
    +*                       CR#956899.
    +* 3.1   mi     09/07/16 Removed compilation warnings with extra compiler flags.
    +*       sk     10/13/16 Reduced the delay during power cycle to 1ms as per spec
    +*       sk     10/19/16 Used emmc_hwreset pin to reset eMMC.
    +*       sk     11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
    +*       sk     11/16/16 Issue DLL reset at 31 iteration to load new zero value.
    +* 3.2   sk     11/30/16 Modified the voltage switching sequence as per spec.
    +*       sk     02/01/17 Added HSD and DDR mode support for eMMC.
    +*       sk     02/01/17 Consider bus width parameter from design for switching
    +*       vns    02/09/17 Added ARMA53_32 support for ZynqMP CR#968397
    +*       sk     03/20/17 Add support for EL1 non-secure mode.
    +* 3.3   mn     05/17/17 Add support for 64bit DMA addressing
    +* 	mn     08/07/17 Modify driver to support 64-bit DMA in arm64 only
    +*       mn     08/17/17 Enabled CCI support for A53 by adding cache coherency
    +*                       information.
    +*       mn     09/06/17 Resolved compilation errors with IAR toolchain
    +*
    +* 
    +* +******************************************************************************/ + + +#ifndef SDPS_H_ +#define SDPS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xil_printf.h" +#include "xil_cache.h" +#include "xstatus.h" +#include "xsdps_hw.h" +#include "xplatform_info.h" +#include + +/************************** Constant Definitions *****************************/ + +#define XSDPS_CT_ERROR 0x2U /**< Command timeout flag */ +#define MAX_TUNING_COUNT 40U /**< Maximum Tuning count */ + +/**************************** Type Definitions *******************************/ + +typedef void (*XSdPs_ConfigTap) (u32 Bank, u32 DeviceId, u32 CardType); + +/** + * 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 */ + u32 CardDetect; /**< Card Detect */ + u32 WriteProtect; /**< Write Protect */ + u32 BusWidth; /**< Bus Width */ + u32 BankNumber; /**< MIO Bank selection for SD */ + u32 HasEMIO; /**< If SD is connected to EMIO */ + u8 IsCacheCoherent; /**< If SD is Cache Coherent or not */ +} XSdPs_Config; + +/* ADMA2 descriptor table */ +typedef struct { + u16 Attribute; /**< Attributes of descriptor */ + u16 Length; /**< Length of current dma transfer */ +#ifdef __aarch64__ + u64 Address; /**< Address of current dma transfer */ +#else + u32 Address; /**< Address of current dma transfer */ +#endif +#ifdef __ICCARM__ +#pragma data_alignment = 32 +} XSdPs_Adma2Descriptor; +#pragma data_alignment = 4 +#else +} __attribute__((__packed__))XSdPs_Adma2Descriptor; +#endif + +/** + * The XSdPs driver instance data. The user is required to allocate a + * variable of this type for every SD device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XSdPs_Config Config; /**< Configuration structure */ + u32 IsReady; /**< Device is initialized and ready */ + u32 Host_Caps; /**< Capabilities of host controller */ + u32 Host_CapsExt; /**< Extended Capabilities */ + u32 HCS; /**< High capacity support in card */ + u8 CardType; /**< Type of card - SD/MMC/eMMC */ + u8 Card_Version; /**< Card version */ + u8 HC_Version; /**< Host controller version */ + u8 BusWidth; /**< Current operating bus width */ + u32 BusSpeed; /**< Current operating bus speed */ + u8 Switch1v8; /**< 1.8V Switch support */ + u32 CardID[4]; /**< Card ID Register */ + u32 RelCardAddr; /**< Relative Card Address */ + u32 CardSpecData[4]; /**< Card Specific Data Register */ + u32 SectorCount; /**< Sector Count */ + u32 SdCardConfig; /**< Sd Card Configuration Register */ + u32 Mode; /**< Bus Speed Mode */ + XSdPs_ConfigTap Config_TapDelay; /**< Configuring the tap delays */ + /**< ADMA Descriptors */ +#ifdef __ICCARM__ +#pragma data_alignment = 32 + XSdPs_Adma2Descriptor Adma2_DescrTbl[32]; +#pragma data_alignment = 4 +#else + XSdPs_Adma2Descriptor Adma2_DescrTbl[32] __attribute__ ((aligned(32))); +#endif +} XSdPs; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +XSdPs_Config *XSdPs_LookupConfig(u16 DeviceId); +s32 XSdPs_CfgInitialize(XSdPs *InstancePtr, XSdPs_Config *ConfigPtr, + u32 EffectiveAddr); +s32 XSdPs_SdCardInitialize(XSdPs *InstancePtr); +s32 XSdPs_ReadPolled(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, u8 *Buff); +s32 XSdPs_WritePolled(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, const u8 *Buff); +s32 XSdPs_SetBlkSize(XSdPs *InstancePtr, u16 BlkSize); +s32 XSdPs_Select_Card (XSdPs *InstancePtr); +s32 XSdPs_Change_ClkFreq(XSdPs *InstancePtr, u32 SelFreq); +s32 XSdPs_Change_BusWidth(XSdPs *InstancePtr); +s32 XSdPs_Change_BusSpeed(XSdPs *InstancePtr); +s32 XSdPs_Get_BusWidth(XSdPs *InstancePtr, u8 *SCR); +s32 XSdPs_Get_BusSpeed(XSdPs *InstancePtr, u8 *ReadBuff); +s32 XSdPs_Pullup(XSdPs *InstancePtr); +s32 XSdPs_MmcCardInitialize(XSdPs *InstancePtr); +s32 XSdPs_CardInitialize(XSdPs *InstancePtr); +s32 XSdPs_Get_Mmc_ExtCsd(XSdPs *InstancePtr, u8 *ReadBuff); +s32 XSdPs_Set_Mmc_ExtCsd(XSdPs *InstancePtr, u32 Arg); +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) +void XSdPs_Identify_UhsMode(XSdPs *InstancePtr, u8 *ReadBuff); +void XSdPs_ddr50_tapdelay(u32 Bank, u32 DeviceId, u32 CardType); +void XSdPs_hsd_sdr25_tapdelay(u32 Bank, u32 DeviceId, u32 CardType); +void XSdPs_sdr104_hs200_tapdelay(u32 Bank, u32 DeviceId, u32 CardType); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* SD_H_ */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xsdps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xsdps_hw.h new file mode 100644 index 0000000..c63d8f6 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xsdps_hw.h @@ -0,0 +1,1301 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xsdps_hw.h +* @addtogroup sdps_v3_5 +* @{ +* +* 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 xsdps.h. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ---    -------- -----------------------------------------------
    +* 1.00a hk/sg  10/17/13 Initial release
    +* 2.5 	sg	   07/09/15 Added SD 3.0 features
    +*       kvn    07/15/15 Modified the code according to MISRAC-2012.
    +* 2.7   sk     12/10/15 Added support for MMC cards.
    +*       sk     03/02/16 Configured the Tap Delay values for eMMC HS200 mode.
    +* 2.8   sk     04/20/16 Added new workaround for auto tuning.
    +* 3.0   sk     06/09/16 Added support for mkfs to calculate sector count.
    +*       sk     07/16/16 Added support for UHS modes.
    +*       sk     07/16/16 Added Tap delays accordingly to different SD/eMMC
    +*                       operating modes.
    +* 3.1   sk     11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
    +* 3.2   sk     03/20/17 Add support for EL1 non-secure mode.
    +* 3.3   mn     08/22/17 Updated for Word Access System support
    +*       mn     09/06/17 Added support for ARMCC toolchain
    +* 3.4   mn     01/22/18 Separated out SDR104 and HS200 clock defines
    +*
    +* 
    +* +******************************************************************************/ + +#ifndef SD_HW_H_ +#define SD_HW_H_ + +#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 SD device. + * @{ + */ + +#define XSDPS_SDMA_SYS_ADDR_OFFSET 0x00U /**< SDMA System Address + Register */ +#define XSDPS_SDMA_SYS_ADDR_LO_OFFSET XSDPS_SDMA_SYS_ADDR_OFFSET + /**< SDMA System Address + Low Register */ +#define XSDPS_ARGMT2_LO_OFFSET 0x00U /**< Argument2 Low Register */ +#define XSDPS_SDMA_SYS_ADDR_HI_OFFSET 0x02U /**< SDMA System Address + High Register */ +#define XSDPS_ARGMT2_HI_OFFSET 0x02U /**< Argument2 High Register */ + +#define XSDPS_BLK_SIZE_OFFSET 0x04U /**< Block Size Register */ +#define XSDPS_BLK_CNT_OFFSET 0x06U /**< Block Count Register */ +#define XSDPS_ARGMT_OFFSET 0x08U /**< Argument Register */ +#define XSDPS_ARGMT1_LO_OFFSET XSDPS_ARGMT_OFFSET + /**< Argument1 Register */ +#define XSDPS_ARGMT1_HI_OFFSET 0x0AU /**< Argument1 Register */ + +#define XSDPS_XFER_MODE_OFFSET 0x0CU /**< Transfer Mode Register */ +#define XSDPS_CMD_OFFSET 0x0EU /**< Command Register */ +#define XSDPS_RESP0_OFFSET 0x10U /**< Response0 Register */ +#define XSDPS_RESP1_OFFSET 0x14U /**< Response1 Register */ +#define XSDPS_RESP2_OFFSET 0x18U /**< Response2 Register */ +#define XSDPS_RESP3_OFFSET 0x1CU /**< Response3 Register */ +#define XSDPS_BUF_DAT_PORT_OFFSET 0x20U /**< Buffer Data Port */ +#define XSDPS_PRES_STATE_OFFSET 0x24U /**< Present State */ +#define XSDPS_HOST_CTRL1_OFFSET 0x28U /**< Host Control 1 */ +#define XSDPS_POWER_CTRL_OFFSET 0x29U /**< Power Control */ +#define XSDPS_BLK_GAP_CTRL_OFFSET 0x2AU /**< Block Gap Control */ +#define XSDPS_WAKE_UP_CTRL_OFFSET 0x2BU /**< Wake Up Control */ +#define XSDPS_CLK_CTRL_OFFSET 0x2CU /**< Clock Control */ +#define XSDPS_TIMEOUT_CTRL_OFFSET 0x2EU /**< Timeout Control */ +#define XSDPS_SW_RST_OFFSET 0x2FU /**< Software Reset */ +#define XSDPS_NORM_INTR_STS_OFFSET 0x30U /**< Normal Interrupt + Status Register */ +#define XSDPS_ERR_INTR_STS_OFFSET 0x32U /**< Error Interrupt + Status Register */ +#define XSDPS_NORM_INTR_STS_EN_OFFSET 0x34U /**< Normal Interrupt + Status Enable Register */ +#define XSDPS_ERR_INTR_STS_EN_OFFSET 0x36U /**< Error Interrupt + Status Enable Register */ +#define XSDPS_NORM_INTR_SIG_EN_OFFSET 0x38U /**< Normal Interrupt + Signal Enable Register */ +#define XSDPS_ERR_INTR_SIG_EN_OFFSET 0x3AU /**< Error Interrupt + Signal Enable Register */ + +#define XSDPS_AUTO_CMD12_ERR_STS_OFFSET 0x3CU /**< Auto CMD12 Error Status + Register */ +#define XSDPS_HOST_CTRL2_OFFSET 0x3EU /**< Host Control2 Register */ +#define XSDPS_CAPS_OFFSET 0x40U /**< Capabilities Register */ +#define XSDPS_CAPS_EXT_OFFSET 0x44U /**< Capabilities Extended */ +#define XSDPS_MAX_CURR_CAPS_OFFSET 0x48U /**< Maximum Current + Capabilities Register */ +#define XSDPS_MAX_CURR_CAPS_EXT_OFFSET 0x4CU /**< Maximum Current + Capabilities Ext Register */ +#define XSDPS_FE_ERR_INT_STS_OFFSET 0x52U /**< Force Event for + Error Interrupt Status */ +#define XSDPS_FE_AUTO_CMD12_EIS_OFFSET 0x50U /**< Auto CM12 Error Interrupt + Status Register */ +#define XSDPS_ADMA_ERR_STS_OFFSET 0x54U /**< ADMA Error Status + Register */ +#define XSDPS_ADMA_SAR_OFFSET 0x58U /**< ADMA System Address + Register */ +#define XSDPS_ADMA_SAR_EXT_OFFSET 0x5CU /**< ADMA System Address + Extended Register */ +#define XSDPS_PRE_VAL_1_OFFSET 0x60U /**< Preset Value Register */ +#define XSDPS_PRE_VAL_2_OFFSET 0x64U /**< Preset Value Register */ +#define XSDPS_PRE_VAL_3_OFFSET 0x68U /**< Preset Value Register */ +#define XSDPS_PRE_VAL_4_OFFSET 0x6CU /**< Preset Value Register */ +#define XSDPS_BOOT_TOUT_CTRL_OFFSET 0x70U /**< Boot timeout control + register */ + +#define XSDPS_SHARED_BUS_CTRL_OFFSET 0xE0U /**< Shared Bus Control + Register */ +#define XSDPS_SLOT_INTR_STS_OFFSET 0xFCU /**< Slot Interrupt Status + Register */ +#define XSDPS_HOST_CTRL_VER_OFFSET 0xFEU /**< Host Controller Version + Register */ + +/* @} */ + +/** @name Control Register - Host control, Power control, + * Block Gap control and Wakeup control + * + * This register contains bits for various configuration options of + * the SD host controller. Read/Write apart from the reserved bits. + * @{ + */ + +#define XSDPS_HC_LED_MASK 0x00000001U /**< LED Control */ +#define XSDPS_HC_WIDTH_MASK 0x00000002U /**< Bus width */ +#define XSDPS_HC_BUS_WIDTH_4 0x00000002U +#define XSDPS_HC_SPEED_MASK 0x00000004U /**< High Speed */ +#define XSDPS_HC_DMA_MASK 0x00000018U /**< DMA Mode Select */ +#define XSDPS_HC_DMA_SDMA_MASK 0x00000000U /**< SDMA Mode */ +#define XSDPS_HC_DMA_ADMA1_MASK 0x00000008U /**< ADMA1 Mode */ +#define XSDPS_HC_DMA_ADMA2_32_MASK 0x00000010U /**< ADMA2 Mode - 32 bit */ +#define XSDPS_HC_DMA_ADMA2_64_MASK 0x00000018U /**< ADMA2 Mode - 64 bit */ +#define XSDPS_HC_EXT_BUS_WIDTH 0x00000020U /**< Bus width - 8 bit */ +#define XSDPS_HC_CARD_DET_TL_MASK 0x00000040U /**< Card Detect Tst Lvl */ +#define XSDPS_HC_CARD_DET_SD_MASK 0x00000080U /**< Card Detect Sig Det */ + +#define XSDPS_PC_BUS_PWR_MASK 0x00000001U /**< Bus Power Control */ +#define XSDPS_PC_BUS_VSEL_MASK 0x0000000EU /**< Bus Voltage Select */ +#define XSDPS_PC_BUS_VSEL_3V3_MASK 0x0000000EU /**< Bus Voltage 3.3V */ +#define XSDPS_PC_BUS_VSEL_3V0_MASK 0x0000000CU /**< Bus Voltage 3.0V */ +#define XSDPS_PC_BUS_VSEL_1V8_MASK 0x0000000AU /**< Bus Voltage 1.8V */ +#define XSDPS_PC_EMMC_HW_RST_MASK 0x00000010U /**< HW reset for eMMC */ + +#define XSDPS_BGC_STP_REQ_MASK 0x00000001U /**< Block Gap Stop Req */ +#define XSDPS_BGC_CNT_REQ_MASK 0x00000002U /**< Block Gap Cont Req */ +#define XSDPS_BGC_RWC_MASK 0x00000004U /**< Block Gap Rd Wait */ +#define XSDPS_BGC_INTR_MASK 0x00000008U /**< Block Gap Intr */ +#define XSDPS_BGC_SPI_MODE_MASK 0x00000010U /**< Block Gap SPI Mode */ +#define XSDPS_BGC_BOOT_EN_MASK 0x00000020U /**< Block Gap Boot Enb */ +#define XSDPS_BGC_ALT_BOOT_EN_MASK 0x00000040U /**< Block Gap Alt BootEn */ +#define XSDPS_BGC_BOOT_ACK_MASK 0x00000080U /**< Block Gap Boot Ack */ + +#define XSDPS_WC_WUP_ON_INTR_MASK 0x00000001U /**< Wakeup Card Intr */ +#define XSDPS_WC_WUP_ON_INSRT_MASK 0x00000002U /**< Wakeup Card Insert */ +#define XSDPS_WC_WUP_ON_REM_MASK 0x00000004U /**< Wakeup Card Removal */ + +/* @} */ + +/** @name Control Register - Clock control, Timeout control & Software reset + * + * This register contains bits for configuration options of clock, timeout and + * software reset. + * Read/Write except for Inter_Clock_Stable bit (read only) and reserved bits. + * @{ + */ + +#define XSDPS_CC_INT_CLK_EN_MASK 0x00000001U +#define XSDPS_CC_INT_CLK_STABLE_MASK 0x00000002U +#define XSDPS_CC_SD_CLK_EN_MASK 0x00000004U +#define XSDPS_CC_SD_CLK_GEN_SEL_MASK 0x00000020U +#define XSDPS_CC_SDCLK_FREQ_SEL_EXT_MASK 0x000000C0U +#define XSDPS_CC_SDCLK_FREQ_SEL_MASK 0x0000FF00U +#define XSDPS_CC_SDCLK_FREQ_D256_MASK 0x00008000U +#define XSDPS_CC_SDCLK_FREQ_D128_MASK 0x00004000U +#define XSDPS_CC_SDCLK_FREQ_D64_MASK 0x00002000U +#define XSDPS_CC_SDCLK_FREQ_D32_MASK 0x00001000U +#define XSDPS_CC_SDCLK_FREQ_D16_MASK 0x00000800U +#define XSDPS_CC_SDCLK_FREQ_D8_MASK 0x00000400U +#define XSDPS_CC_SDCLK_FREQ_D4_MASK 0x00000200U +#define XSDPS_CC_SDCLK_FREQ_D2_MASK 0x00000100U +#define XSDPS_CC_SDCLK_FREQ_BASE_MASK 0x00000000U +#define XSDPS_CC_MAX_DIV_CNT 256U +#define XSDPS_CC_EXT_MAX_DIV_CNT 2046U +#define XSDPS_CC_EXT_DIV_SHIFT 6U + +#define XSDPS_TC_CNTR_VAL_MASK 0x0000000FU + +#define XSDPS_SWRST_ALL_MASK 0x00000001U +#define XSDPS_SWRST_CMD_LINE_MASK 0x00000002U +#define XSDPS_SWRST_DAT_LINE_MASK 0x00000004U + +#define XSDPS_CC_MAX_NUM_OF_DIV 9U +#define XSDPS_CC_DIV_SHIFT 8U + +/* @} */ + +/** @name SD Interrupt Registers + * + * Normal and Error Interrupt Status Register + * This register shows the normal and error interrupt status. + * Status enable register affects reads of this register. + * If Signal enable register is set and the corresponding status bit is set, + * interrupt is generated. + * Write to clear except + * Error_interrupt and Card_Interrupt bits - Read only + * + * Normal and Error Interrupt Status Enable Register + * Setting this register bits enables Interrupt status. + * Read/Write except Fixed_to_0 bit (Read only) + * + * Normal and Error Interrupt Signal Enable Register + * This register is used to select which interrupt status is + * indicated to the Host System as the interrupt. + * Read/Write except Fixed_to_0 bit (Read only) + * + * All three registers have same bit definitions + * @{ + */ + +#define XSDPS_INTR_CC_MASK 0x00000001U /**< Command Complete */ +#define XSDPS_INTR_TC_MASK 0x00000002U /**< Transfer Complete */ +#define XSDPS_INTR_BGE_MASK 0x00000004U /**< Block Gap Event */ +#define XSDPS_INTR_DMA_MASK 0x00000008U /**< DMA Interrupt */ +#define XSDPS_INTR_BWR_MASK 0x00000010U /**< Buffer Write Ready */ +#define XSDPS_INTR_BRR_MASK 0x00000020U /**< Buffer Read Ready */ +#define XSDPS_INTR_CARD_INSRT_MASK 0x00000040U /**< Card Insert */ +#define XSDPS_INTR_CARD_REM_MASK 0x00000080U /**< Card Remove */ +#define XSDPS_INTR_CARD_MASK 0x00000100U /**< Card Interrupt */ +#define XSDPS_INTR_INT_A_MASK 0x00000200U /**< INT A Interrupt */ +#define XSDPS_INTR_INT_B_MASK 0x00000400U /**< INT B Interrupt */ +#define XSDPS_INTR_INT_C_MASK 0x00000800U /**< INT C Interrupt */ +#define XSDPS_INTR_RE_TUNING_MASK 0x00001000U /**< Re-Tuning Interrupt */ +#define XSDPS_INTR_BOOT_ACK_RECV_MASK 0x00002000U /**< Boot Ack Recv + Interrupt */ +#define XSDPS_INTR_BOOT_TERM_MASK 0x00004000U /**< Boot Terminate + Interrupt */ +#define XSDPS_INTR_ERR_MASK 0x00008000U /**< Error Interrupt */ +#define XSDPS_NORM_INTR_ALL_MASK 0x0000FFFFU + +#define XSDPS_INTR_ERR_CT_MASK 0x00000001U /**< Command Timeout + Error */ +#define XSDPS_INTR_ERR_CCRC_MASK 0x00000002U /**< Command CRC Error */ +#define XSDPS_INTR_ERR_CEB_MASK 0x00000004U /**< Command End Bit + Error */ +#define XSDPS_INTR_ERR_CI_MASK 0x00000008U /**< Command Index Error */ +#define XSDPS_INTR_ERR_DT_MASK 0x00000010U /**< Data Timeout Error */ +#define XSDPS_INTR_ERR_DCRC_MASK 0x00000020U /**< Data CRC Error */ +#define XSDPS_INTR_ERR_DEB_MASK 0x00000040U /**< Data End Bit Error */ +#define XSDPS_INTR_ERR_CUR_LMT_MASK 0x00000080U /**< Current Limit Error */ +#define XSDPS_INTR_ERR_AUTO_CMD12_MASK 0x00000100U /**< Auto CMD12 Error */ +#define XSDPS_INTR_ERR_ADMA_MASK 0x00000200U /**< ADMA Error */ +#define XSDPS_INTR_ERR_TR_MASK 0x00001000U /**< Tuning Error */ +#define XSDPS_INTR_VEND_SPF_ERR_MASK 0x0000E000U /**< Vendor Specific + Error */ +#define XSDPS_ERROR_INTR_ALL_MASK 0x0000F3FFU /**< Mask for error bits */ +/* @} */ + +/** @name Block Size and Block Count Register + * + * This register contains the block count for current transfer, + * block size and SDMA buffer size. + * Read/Write except for reserved bits. + * @{ + */ + +#define XSDPS_BLK_SIZE_MASK 0x00000FFFU /**< Transfer Block Size */ +#define XSDPS_SDMA_BUFF_SIZE_MASK 0x00007000U /**< Host SDMA Buffer Size */ +#define XSDPS_BLK_SIZE_1024 0x400U +#define XSDPS_BLK_SIZE_2048 0x800U +#define XSDPS_BLK_CNT_MASK 0x0000FFFFU /**< Block Count for + Current Transfer */ + +/* @} */ + +/** @name Transfer Mode and Command Register + * + * The Transfer Mode register is used to control the data transfers and + * Command register is used for command generation + * Read/Write except for reserved bits. + * @{ + */ + +#define XSDPS_TM_DMA_EN_MASK 0x00000001U /**< DMA Enable */ +#define XSDPS_TM_BLK_CNT_EN_MASK 0x00000002U /**< Block Count Enable */ +#define XSDPS_TM_AUTO_CMD12_EN_MASK 0x00000004U /**< Auto CMD12 Enable */ +#define XSDPS_TM_DAT_DIR_SEL_MASK 0x00000010U /**< Data Transfer + Direction Select */ +#define XSDPS_TM_MUL_SIN_BLK_SEL_MASK 0x00000020U /**< Multi/Single + Block Select */ + +#define XSDPS_CMD_RESP_SEL_MASK 0x00000003U /**< Response Type + Select */ +#define XSDPS_CMD_RESP_NONE_MASK 0x00000000U /**< No Response */ +#define XSDPS_CMD_RESP_L136_MASK 0x00000001U /**< Response length 138 */ +#define XSDPS_CMD_RESP_L48_MASK 0x00000002U /**< Response length 48 */ +#define XSDPS_CMD_RESP_L48_BSY_CHK_MASK 0x00000003U /**< Response length 48 & + check busy after + response */ +#define XSDPS_CMD_CRC_CHK_EN_MASK 0x00000008U /**< Command CRC Check + Enable */ +#define XSDPS_CMD_INX_CHK_EN_MASK 0x00000010U /**< Command Index Check + Enable */ +#define XSDPS_DAT_PRESENT_SEL_MASK 0x00000020U /**< Data Present Select */ +#define XSDPS_CMD_TYPE_MASK 0x000000C0U /**< Command Type */ +#define XSDPS_CMD_TYPE_NORM_MASK 0x00000000U /**< CMD Type - Normal */ +#define XSDPS_CMD_TYPE_SUSPEND_MASK 0x00000040U /**< CMD Type - Suspend */ +#define XSDPS_CMD_TYPE_RESUME_MASK 0x00000080U /**< CMD Type - Resume */ +#define XSDPS_CMD_TYPE_ABORT_MASK 0x000000C0U /**< CMD Type - Abort */ +#define XSDPS_CMD_MASK 0x00003F00U /**< Command Index Mask - + Set to CMD0-63, + AMCD0-63 */ + +/* @} */ + +/** @name Auto CMD Error Status Register + * + * This register is read only register which contains + * information about the error status of Auto CMD 12 and 23. + * Read Only + * @{ + */ +#define XSDPS_AUTO_CMD12_NT_EX_MASK 0x0001U /**< Auto CMD12 Not + executed */ +#define XSDPS_AUTO_CMD_TOUT_MASK 0x0002U /**< Auto CMD Timeout + Error */ +#define XSDPS_AUTO_CMD_CRC_MASK 0x0004U /**< Auto CMD CRC Error */ +#define XSDPS_AUTO_CMD_EB_MASK 0x0008U /**< Auto CMD End Bit + Error */ +#define XSDPS_AUTO_CMD_IND_MASK 0x0010U /**< Auto CMD Index Error */ +#define XSDPS_AUTO_CMD_CNI_ERR_MASK 0x0080U /**< Command not issued by + Auto CMD12 Error */ +/* @} */ + +/** @name Host Control2 Register + * + * This register contains extended configuration bits. + * Read Write + * @{ + */ +#define XSDPS_HC2_UHS_MODE_MASK 0x0007U /**< UHS Mode select bits */ +#define XSDPS_HC2_UHS_MODE_SDR12_MASK 0x0000U /**< SDR12 UHS Mode */ +#define XSDPS_HC2_UHS_MODE_SDR25_MASK 0x0001U /**< SDR25 UHS Mode */ +#define XSDPS_HC2_UHS_MODE_SDR50_MASK 0x0002U /**< SDR50 UHS Mode */ +#define XSDPS_HC2_UHS_MODE_SDR104_MASK 0x0003U /**< SDR104 UHS Mode */ +#define XSDPS_HC2_UHS_MODE_DDR50_MASK 0x0004U /**< DDR50 UHS Mode */ +#define XSDPS_HC2_1V8_EN_MASK 0x0008U /**< 1.8V Signal Enable */ +#define XSDPS_HC2_DRV_STR_SEL_MASK 0x0030U /**< Driver Strength + Selection */ +#define XSDPS_HC2_DRV_STR_B_MASK 0x0000U /**< Driver Strength B */ +#define XSDPS_HC2_DRV_STR_A_MASK 0x0010U /**< Driver Strength A */ +#define XSDPS_HC2_DRV_STR_C_MASK 0x0020U /**< Driver Strength C */ +#define XSDPS_HC2_DRV_STR_D_MASK 0x0030U /**< Driver Strength D */ +#define XSDPS_HC2_EXEC_TNG_MASK 0x0040U /**< Execute Tuning */ +#define XSDPS_HC2_SAMP_CLK_SEL_MASK 0x0080U /**< Sampling Clock + Selection */ +#define XSDPS_HC2_ASYNC_INTR_EN_MASK 0x4000U /**< Asynchronous Interrupt + Enable */ +#define XSDPS_HC2_PRE_VAL_EN_MASK 0x8000U /**< Preset Value Enable */ + +/* @} */ + +/** @name Capabilities Register + * + * Capabilities register is a read only register which contains + * information about the host controller. + * Sufficient if read once after power on. + * Read Only + * @{ + */ +#define XSDPS_CAP_TOUT_CLK_FREQ_MASK 0x0000003FU /**< Timeout clock freq + select */ +#define XSDPS_CAP_TOUT_CLK_UNIT_MASK 0x00000080U /**< Timeout clock unit - + MHz/KHz */ +#define XSDPS_CAP_MAX_BLK_LEN_MASK 0x00030000U /**< Max block length */ +#define XSDPS_CAP_MAX_BLK_LEN_512B_MASK 0x00000000U /**< Max block 512 bytes */ +#define XSDPS_CAP_MAX_BL_LN_1024_MASK 0x00010000U /**< Max block 1024 bytes */ +#define XSDPS_CAP_MAX_BL_LN_2048_MASK 0x00020000U /**< Max block 2048 bytes */ +#define XSDPS_CAP_MAX_BL_LN_4096_MASK 0x00030000U /**< Max block 4096 bytes */ + +#define XSDPS_CAP_EXT_MEDIA_BUS_MASK 0x00040000U /**< Extended media bus */ +#define XSDPS_CAP_ADMA2_MASK 0x00080000U /**< ADMA2 support */ +#define XSDPS_CAP_HIGH_SPEED_MASK 0x00200000U /**< High speed support */ +#define XSDPS_CAP_SDMA_MASK 0x00400000U /**< SDMA support */ +#define XSDPS_CAP_SUSP_RESUME_MASK 0x00800000U /**< Suspend/Resume + support */ +#define XSDPS_CAP_VOLT_3V3_MASK 0x01000000U /**< 3.3V support */ +#define XSDPS_CAP_VOLT_3V0_MASK 0x02000000U /**< 3.0V support */ +#define XSDPS_CAP_VOLT_1V8_MASK 0x04000000U /**< 1.8V support */ + +#define XSDPS_CAP_SYS_BUS_64_MASK 0x10000000U /**< 64 bit system bus + support */ +/* Spec 2.0 */ +#define XSDPS_CAP_INTR_MODE_MASK 0x08000000U /**< Interrupt mode + support */ +#define XSDPS_CAP_SPI_MODE_MASK 0x20000000U /**< SPI mode */ +#define XSDPS_CAP_SPI_BLOCK_MODE_MASK 0x40000000U /**< SPI block mode */ + + +/* Spec 3.0 */ +#define XSDPS_CAPS_ASYNC_INTR_MASK 0x20000000U /**< Async Interrupt + support */ +#define XSDPS_CAPS_SLOT_TYPE_MASK 0xC0000000U /**< Slot Type */ +#define XSDPS_CAPS_REM_CARD 0x00000000U /**< Removable Slot */ +#define XSDPS_CAPS_EMB_SLOT 0x40000000U /**< Embedded Slot */ +#define XSDPS_CAPS_SHR_BUS 0x80000000U /**< Shared Bus Slot */ + +#define XSDPS_ECAPS_SDR50_MASK 0x00000001U /**< SDR50 Mode support */ +#define XSDPS_ECAPS_SDR104_MASK 0x00000002U /**< SDR104 Mode support */ +#define XSDPS_ECAPS_DDR50_MASK 0x00000004U /**< DDR50 Mode support */ +#define XSDPS_ECAPS_DRV_TYPE_A_MASK 0x00000010U /**< DriverType A support */ +#define XSDPS_ECAPS_DRV_TYPE_C_MASK 0x00000020U /**< DriverType C support */ +#define XSDPS_ECAPS_DRV_TYPE_D_MASK 0x00000040U /**< DriverType D support */ +#define XSDPS_ECAPS_TMR_CNT_MASK 0x00000F00U /**< Timer Count for + Re-tuning */ +#define XSDPS_ECAPS_USE_TNG_SDR50_MASK 0x00002000U /**< SDR50 Mode needs + tuning */ +#define XSDPS_ECAPS_RE_TNG_MODES_MASK 0x0000C000U /**< Re-tuning modes + support */ +#define XSDPS_ECAPS_RE_TNG_MODE1_MASK 0x00000000U /**< Re-tuning mode 1 */ +#define XSDPS_ECAPS_RE_TNG_MODE2_MASK 0x00004000U /**< Re-tuning mode 2 */ +#define XSDPS_ECAPS_RE_TNG_MODE3_MASK 0x00008000U /**< Re-tuning mode 3 */ +#define XSDPS_ECAPS_CLK_MULT_MASK 0x00FF0000U /**< Clock Multiplier value + for Programmable clock + mode */ +#define XSDPS_ECAPS_SPI_MODE_MASK 0x01000000U /**< SPI mode */ +#define XSDPS_ECAPS_SPI_BLK_MODE_MASK 0x02000000U /**< SPI block mode */ + +/* @} */ + +/** @name Present State Register + * + * Gives the current status of the host controller + * Read Only + * @{ + */ + +#define XSDPS_PSR_INHIBIT_CMD_MASK 0x00000001U /**< Command inhibit - CMD */ +#define XSDPS_PSR_INHIBIT_DAT_MASK 0x00000002U /**< Command Inhibit - DAT */ +#define XSDPS_PSR_DAT_ACTIVE_MASK 0x00000004U /**< DAT line active */ +#define XSDPS_PSR_RE_TUNING_REQ_MASK 0x00000008U /**< Re-tuning request */ +#define XSDPS_PSR_WR_ACTIVE_MASK 0x00000100U /**< Write transfer active */ +#define XSDPS_PSR_RD_ACTIVE_MASK 0x00000200U /**< Read transfer active */ +#define XSDPS_PSR_BUFF_WR_EN_MASK 0x00000400U /**< Buffer write enable */ +#define XSDPS_PSR_BUFF_RD_EN_MASK 0x00000800U /**< Buffer read enable */ +#define XSDPS_PSR_CARD_INSRT_MASK 0x00010000U /**< Card inserted */ +#define XSDPS_PSR_CARD_STABLE_MASK 0x00020000U /**< Card state stable */ +#define XSDPS_PSR_CARD_DPL_MASK 0x00040000U /**< Card detect pin level */ +#define XSDPS_PSR_WPS_PL_MASK 0x00080000U /**< Write protect switch + pin level */ +#define XSDPS_PSR_DAT30_SG_LVL_MASK 0x00F00000U /**< Data 3:0 signal lvl */ +#define XSDPS_PSR_CMD_SG_LVL_MASK 0x01000000U /**< Cmd Line signal lvl */ +#define XSDPS_PSR_DAT74_SG_LVL_MASK 0x1E000000U /**< Data 7:4 signal lvl */ + +/* @} */ + +/** @name Maximum Current Capablities Register + * + * This register is read only register which contains + * information about current capabilities at each voltage levels. + * Read Only + * @{ + */ +#define XSDPS_MAX_CUR_CAPS_1V8_MASK 0x00000F00U /**< Maximum Current + Capability at 1.8V */ +#define XSDPS_MAX_CUR_CAPS_3V0_MASK 0x000000F0U /**< Maximum Current + Capability at 3.0V */ +#define XSDPS_MAX_CUR_CAPS_3V3_MASK 0x0000000FU /**< Maximum Current + Capability at 3.3V */ +/* @} */ + + +/** @name Force Event for Auto CMD Error Status Register + * + * This register is write only register which contains + * control bits to generate events for Auto CMD error status. + * Write Only + * @{ + */ +#define XSDPS_FE_AUTO_CMD12_NT_EX_MASK 0x0001U /**< Auto CMD12 Not + executed */ +#define XSDPS_FE_AUTO_CMD_TOUT_MASK 0x0002U /**< Auto CMD Timeout + Error */ +#define XSDPS_FE_AUTO_CMD_CRC_MASK 0x0004U /**< Auto CMD CRC Error */ +#define XSDPS_FE_AUTO_CMD_EB_MASK 0x0008U /**< Auto CMD End Bit + Error */ +#define XSDPS_FE_AUTO_CMD_IND_MASK 0x0010U /**< Auto CMD Index Error */ +#define XSDPS_FE_AUTO_CMD_CNI_ERR_MASK 0x0080U /**< Command not issued by + Auto CMD12 Error */ +/* @} */ + + + +/** @name Force Event for Error Interrupt Status Register + * + * This register is write only register which contains + * control bits to generate events of error interrupt status register. + * Write Only + * @{ + */ +#define XSDPS_FE_INTR_ERR_CT_MASK 0x0001U /**< Command Timeout + Error */ +#define XSDPS_FE_INTR_ERR_CCRC_MASK 0x0002U /**< Command CRC Error */ +#define XSDPS_FE_INTR_ERR_CEB_MASK 0x0004U /**< Command End Bit + Error */ +#define XSDPS_FE_INTR_ERR_CI_MASK 0x0008U /**< Command Index Error */ +#define XSDPS_FE_INTR_ERR_DT_MASK 0x0010U /**< Data Timeout Error */ +#define XSDPS_FE_INTR_ERR_DCRC_MASK 0x0020U /**< Data CRC Error */ +#define XSDPS_FE_INTR_ERR_DEB_MASK 0x0040U /**< Data End Bit Error */ +#define XSDPS_FE_INTR_ERR_CUR_LMT_MASK 0x0080U /**< Current Limit Error */ +#define XSDPS_FE_INTR_ERR_AUTO_CMD_MASK 0x0100U /**< Auto CMD Error */ +#define XSDPS_FE_INTR_ERR_ADMA_MASK 0x0200U /**< ADMA Error */ +#define XSDPS_FE_INTR_ERR_TR_MASK 0x1000U /**< Target Reponse */ +#define XSDPS_FE_INTR_VEND_SPF_ERR_MASK 0xE000U /**< Vendor Specific + Error */ + +/* @} */ + +/** @name ADMA Error Status Register + * + * This register is read only register which contains + * status information about ADMA errors. + * Read Only + * @{ + */ +#define XSDPS_ADMA_ERR_MM_LEN_MASK 0x04U /**< ADMA Length Mismatch + Error */ +#define XSDPS_ADMA_ERR_STATE_MASK 0x03U /**< ADMA Error State */ +#define XSDPS_ADMA_ERR_STATE_STOP_MASK 0x00U /**< ADMA Error State + STOP */ +#define XSDPS_ADMA_ERR_STATE_FDS_MASK 0x01U /**< ADMA Error State + FDS */ +#define XSDPS_ADMA_ERR_STATE_TFR_MASK 0x03U /**< ADMA Error State + TFR */ +/* @} */ + +/** @name Preset Values Register + * + * This register is read only register which contains + * preset values for each of speed modes. + * Read Only + * @{ + */ +#define XSDPS_PRE_VAL_SDCLK_FSEL_MASK 0x03FFU /**< SDCLK Frequency + Select Value */ +#define XSDPS_PRE_VAL_CLK_GEN_SEL_MASK 0x0400U /**< Clock Generator + Mode Select */ +#define XSDPS_PRE_VAL_DRV_STR_SEL_MASK 0xC000U /**< Driver Strength + Select Value */ + +/* @} */ + +/** @name Slot Interrupt Status Register + * + * This register is read only register which contains + * interrupt slot signal for each slot. + * Read Only + * @{ + */ +#define XSDPS_SLOT_INTR_STS_INT_MASK 0x0007U /**< Interrupt Signal + mask */ + +/* @} */ + +/** @name Host Controller Version Register + * + * This register is read only register which contains + * Host Controller and Vendor Specific version. + * Read Only + * @{ + */ +#define XSDPS_HC_VENDOR_VER 0xFF00U /**< Vendor + Specification + version mask */ +#define XSDPS_HC_SPEC_VER_MASK 0x00FFU /**< Host + Specification + version mask */ +#define XSDPS_HC_SPEC_V3 0x0002U +#define XSDPS_HC_SPEC_V2 0x0001U +#define XSDPS_HC_SPEC_V1 0x0000U + +/** @name Block size mask for 512 bytes + * + * Block size mask for 512 bytes - This is the default block size. + * @{ + */ + +#define XSDPS_BLK_SIZE_512_MASK 0x200U + +/* @} */ + +/** @name Commands + * + * Constant definitions for commands and response related to SD + * @{ + */ + +#define XSDPS_APP_CMD_PREFIX 0x8000U +#define CMD0 0x0000U +#define CMD1 0x0100U +#define CMD2 0x0200U +#define CMD3 0x0300U +#define CMD4 0x0400U +#define CMD5 0x0500U +#define CMD6 0x0600U +#define ACMD6 (XSDPS_APP_CMD_PREFIX + 0x0600U) +#define CMD7 0x0700U +#define CMD8 0x0800U +#define CMD9 0x0900U +#define CMD10 0x0A00U +#define CMD11 0x0B00U +#define CMD12 0x0C00U +#define ACMD13 (XSDPS_APP_CMD_PREFIX + 0x0D00U) +#define CMD16 0x1000U +#define CMD17 0x1100U +#define CMD18 0x1200U +#define CMD19 0x1300U +#define CMD21 0x1500U +#define CMD23 0x1700U +#define ACMD23 (XSDPS_APP_CMD_PREFIX + 0x1700U) +#define CMD24 0x1800U +#define CMD25 0x1900U +#define CMD41 0x2900U +#define ACMD41 (XSDPS_APP_CMD_PREFIX + 0x2900U) +#define ACMD42 (XSDPS_APP_CMD_PREFIX + 0x2A00U) +#define ACMD51 (XSDPS_APP_CMD_PREFIX + 0x3300U) +#define CMD52 0x3400U +#define CMD55 0x3700U +#define CMD58 0x3A00U + +#define RESP_NONE (u32)XSDPS_CMD_RESP_NONE_MASK +#define RESP_R1 (u32)XSDPS_CMD_RESP_L48_MASK | (u32)XSDPS_CMD_CRC_CHK_EN_MASK | \ + (u32)XSDPS_CMD_INX_CHK_EN_MASK + +#define RESP_R1B (u32)XSDPS_CMD_RESP_L48_BSY_CHK_MASK | \ + (u32)XSDPS_CMD_CRC_CHK_EN_MASK | (u32)XSDPS_CMD_INX_CHK_EN_MASK + +#define RESP_R2 (u32)XSDPS_CMD_RESP_L136_MASK | (u32)XSDPS_CMD_CRC_CHK_EN_MASK +#define RESP_R3 (u32)XSDPS_CMD_RESP_L48_MASK + +#define RESP_R6 (u32)XSDPS_CMD_RESP_L48_BSY_CHK_MASK | \ + (u32)XSDPS_CMD_CRC_CHK_EN_MASK | (u32)XSDPS_CMD_INX_CHK_EN_MASK + +/* @} */ + +/* Card Interface Conditions Definitions */ +#define XSDPS_CIC_CHK_PATTERN 0xAAU +#define XSDPS_CIC_VOLT_MASK (0xFU<<8) +#define XSDPS_CIC_VOLT_2V7_3V6 (1U<<8) +#define XSDPS_CIC_VOLT_LOW (1U<<9) + +/* Operation Conditions Register Definitions */ +#define XSDPS_OCR_PWRUP_STS (1U<<31) +#define XSDPS_OCR_CC_STS (1U<<30) +#define XSDPS_OCR_S18 (1U<<24) +#define XSDPS_OCR_3V5_3V6 (1U<<23) +#define XSDPS_OCR_3V4_3V5 (1U<<22) +#define XSDPS_OCR_3V3_3V4 (1U<<21) +#define XSDPS_OCR_3V2_3V3 (1U<<20) +#define XSDPS_OCR_3V1_3V2 (1U<<19) +#define XSDPS_OCR_3V0_3V1 (1U<<18) +#define XSDPS_OCR_2V9_3V0 (1U<<17) +#define XSDPS_OCR_2V8_2V9 (1U<<16) +#define XSDPS_OCR_2V7_2V8 (1U<<15) +#define XSDPS_OCR_1V7_1V95 (1U<<7) +#define XSDPS_OCR_HIGH_VOL 0x00FF8000U +#define XSDPS_OCR_LOW_VOL 0x00000080U + +/* SD Card Configuration Register Definitions */ +#define XSDPS_SCR_REG_LEN 8U +#define XSDPS_SCR_STRUCT_MASK (0xFU<<28) +#define XSDPS_SCR_SPEC_MASK (0xFU<<24) +#define XSDPS_SCR_SPEC_1V0 0U +#define XSDPS_SCR_SPEC_1V1 (1U<<24) +#define XSDPS_SCR_SPEC_2V0_3V0 (2U<<24) +#define XSDPS_SCR_MEM_VAL_AF_ERASE (1U<<23) +#define XSDPS_SCR_SEC_SUPP_MASK (7U<<20) +#define XSDPS_SCR_SEC_SUPP_NONE 0U +#define XSDPS_SCR_SEC_SUPP_1V1 (2U<<20) +#define XSDPS_SCR_SEC_SUPP_2V0 (3U<<20) +#define XSDPS_SCR_SEC_SUPP_3V0 (4U<<20) +#define XSDPS_SCR_BUS_WIDTH_MASK (0xFU<<16) +#define XSDPS_SCR_BUS_WIDTH_1 (1U<<16) +#define XSDPS_SCR_BUS_WIDTH_4 (4U<<16) +#define XSDPS_SCR_SPEC3_MASK (1U<<12) +#define XSDPS_SCR_SPEC3_2V0 0U +#define XSDPS_SCR_SPEC3_3V0 (1U<<12) +#define XSDPS_SCR_CMD_SUPP_MASK 0x3U +#define XSDPS_SCR_CMD23_SUPP (1U<<1) +#define XSDPS_SCR_CMD20_SUPP (1U<<0) + +/* Card Status Register Definitions */ +#define XSDPS_CD_STS_OUT_OF_RANGE (1U<<31) +#define XSDPS_CD_STS_ADDR_ERR (1U<<30) +#define XSDPS_CD_STS_BLK_LEN_ERR (1U<<29) +#define XSDPS_CD_STS_ER_SEQ_ERR (1U<<28) +#define XSDPS_CD_STS_ER_PRM_ERR (1U<<27) +#define XSDPS_CD_STS_WP_VIO (1U<<26) +#define XSDPS_CD_STS_IS_LOCKED (1U<<25) +#define XSDPS_CD_STS_LOCK_UNLOCK_FAIL (1U<<24) +#define XSDPS_CD_STS_CMD_CRC_ERR (1U<<23) +#define XSDPS_CD_STS_ILGL_CMD (1U<<22) +#define XSDPS_CD_STS_CARD_ECC_FAIL (1U<<21) +#define XSDPS_CD_STS_CC_ERR (1U<<20) +#define XSDPS_CD_STS_ERR (1U<<19) +#define XSDPS_CD_STS_CSD_OVRWR (1U<<16) +#define XSDPS_CD_STS_WP_ER_SKIP (1U<<15) +#define XSDPS_CD_STS_CARD_ECC_DIS (1U<<14) +#define XSDPS_CD_STS_ER_RST (1U<<13) +#define XSDPS_CD_STS_CUR_STATE (0xFU<<9) +#define XSDPS_CD_STS_RDY_FOR_DATA (1U<<8) +#define XSDPS_CD_STS_APP_CMD (1U<<5) +#define XSDPS_CD_STS_AKE_SEQ_ERR (1U<<2) + +/* Switch Function Definitions CMD6 */ +#define XSDPS_SWITCH_SD_RESP_LEN 64U + +#define XSDPS_SWITCH_FUNC_SWITCH (1U<<31) +#define XSDPS_SWITCH_FUNC_CHECK 0U + +#define XSDPS_MODE_FUNC_GRP1 1U +#define XSDPS_MODE_FUNC_GRP2 2U +#define XSDPS_MODE_FUNC_GRP3 3U +#define XSDPS_MODE_FUNC_GRP4 4U +#define XSDPS_MODE_FUNC_GRP5 5U +#define XSDPS_MODE_FUNC_GRP6 6U + +#define XSDPS_FUNC_GRP_DEF_VAL 0xFU +#define XSDPS_FUNC_ALL_GRP_DEF_VAL 0xFFFFFFU + +#define XSDPS_ACC_MODE_DEF_SDR12 0U +#define XSDPS_ACC_MODE_HS_SDR25 1U +#define XSDPS_ACC_MODE_SDR50 2U +#define XSDPS_ACC_MODE_SDR104 3U +#define XSDPS_ACC_MODE_DDR50 4U + +#define XSDPS_CMD_SYS_ARG_SHIFT 4U +#define XSDPS_CMD_SYS_DEF 0U +#define XSDPS_CMD_SYS_eC 1U +#define XSDPS_CMD_SYS_OTP 3U +#define XSDPS_CMD_SYS_ASSD 4U +#define XSDPS_CMD_SYS_VEND 5U + +#define XSDPS_DRV_TYPE_ARG_SHIFT 8U +#define XSDPS_DRV_TYPE_B 0U +#define XSDPS_DRV_TYPE_A 1U +#define XSDPS_DRV_TYPE_C 2U +#define XSDPS_DRV_TYPE_D 3U + +#define XSDPS_CUR_LIM_ARG_SHIFT 12U +#define XSDPS_CUR_LIM_200 0U +#define XSDPS_CUR_LIM_400 1U +#define XSDPS_CUR_LIM_600 2U +#define XSDPS_CUR_LIM_800 3U + +#define CSD_SPEC_VER_MASK 0x3C0000U +#define READ_BLK_LEN_MASK 0x00000F00U +#define C_SIZE_MULT_MASK 0x00000380U +#define C_SIZE_LOWER_MASK 0xFFC00000U +#define C_SIZE_UPPER_MASK 0x00000003U +#define CSD_STRUCT_MASK 0x00C00000U +#define CSD_V2_C_SIZE_MASK 0x3FFFFF00U + +/* EXT_CSD field definitions */ +#define XSDPS_EXT_CSD_SIZE 512U + +#define EXT_CSD_WR_REL_PARAM_EN (1U<<2) + +#define EXT_CSD_BOOT_WP_B_PWR_WP_DIS (0x40U) +#define EXT_CSD_BOOT_WP_B_PERM_WP_DIS (0x10U) +#define EXT_CSD_BOOT_WP_B_PERM_WP_EN (0x04U) +#define EXT_CSD_BOOT_WP_B_PWR_WP_EN (0x01U) + +#define EXT_CSD_PART_CONFIG_ACC_MASK (0x7U) +#define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1U) +#define EXT_CSD_PART_CONFIG_ACC_RPMB (0x3U) +#define EXT_CSD_PART_CONFIG_ACC_GP0 (0x4U) + +#define EXT_CSD_PART_SUPPORT_PART_EN (0x1U) + +#define EXT_CSD_CMD_SET_NORMAL (1U<<0) +#define EXT_CSD_CMD_SET_SECURE (1U<<1) +#define EXT_CSD_CMD_SET_CPSECURE (1U<<2) + +#define EXT_CSD_CARD_TYPE_26 (1U<<0) /* Card can run at 26MHz */ +#define EXT_CSD_CARD_TYPE_52 (1U<<1) /* Card can run at 52MHz */ +#define EXT_CSD_CARD_TYPE_MASK 0x3FU /* Mask out reserved bits */ +#define EXT_CSD_CARD_TYPE_DDR_1_8V (1U<<2) /* Card can run at 52MHz */ + /* DDR mode @1.8V or 3V I/O */ +#define EXT_CSD_CARD_TYPE_DDR_1_2V (1U<<3) /* Card can run at 52MHz */ + /* DDR mode @1.2V I/O */ +#define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V \ + | EXT_CSD_CARD_TYPE_DDR_1_2V) +#define EXT_CSD_CARD_TYPE_SDR_1_8V (1U<<4) /* Card can run at 200MHz */ +#define EXT_CSD_CARD_TYPE_SDR_1_2V (1U<<5) /* Card can run at 200MHz */ + /* SDR mode @1.2V I/O */ +#define EXT_CSD_BUS_WIDTH_BYTE 183U +#define EXT_CSD_BUS_WIDTH_1_BIT 0U /* Card is in 1 bit mode */ +#define EXT_CSD_BUS_WIDTH_4_BIT 1U /* Card is in 4 bit mode */ +#define EXT_CSD_BUS_WIDTH_8_BIT 2U /* Card is in 8 bit mode */ +#define EXT_CSD_BUS_WIDTH_DDR_4_BIT 5U /* Card is in 4 bit DDR mode */ +#define EXT_CSD_BUS_WIDTH_DDR_8_BIT 6U /* Card is in 8 bit DDR mode */ + +#define EXT_CSD_HS_TIMING_BYTE 185U +#define EXT_CSD_HS_TIMING_DEF 0U +#define EXT_CSD_HS_TIMING_HIGH 1U /* Card is in high speed mode */ +#define EXT_CSD_HS_TIMING_HS200 2U /* Card is in HS200 mode */ + +#define EXT_CSD_RST_N_FUN_BYTE 162U +#define EXT_CSD_RST_N_FUN_TEMP_DIS 0U /* RST_n signal is temporarily disabled */ +#define EXT_CSD_RST_N_FUN_PERM_EN 1U /* RST_n signal is permanently enabled */ +#define EXT_CSD_RST_N_FUN_PERM_DIS 2U /* RST_n signal is permanently disabled */ + +#define XSDPS_EXT_CSD_CMD_SET 0U +#define XSDPS_EXT_CSD_SET_BITS 1U +#define XSDPS_EXT_CSD_CLR_BITS 2U +#define XSDPS_EXT_CSD_WRITE_BYTE 3U + +#define XSDPS_MMC_DEF_SPEED_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_HS_TIMING_BYTE << 16) \ + | ((u32)EXT_CSD_HS_TIMING_DEF << 8)) + +#define XSDPS_MMC_HIGH_SPEED_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_HS_TIMING_BYTE << 16) \ + | ((u32)EXT_CSD_HS_TIMING_HIGH << 8)) + +#define XSDPS_MMC_HS200_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_HS_TIMING_BYTE << 16) \ + | ((u32)EXT_CSD_HS_TIMING_HS200 << 8)) + +#define XSDPS_MMC_1_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WITH_1_BIT << 8)) + +#define XSDPS_MMC_4_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WIDTH_4_BIT << 8)) + +#define XSDPS_MMC_8_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WIDTH_8_BIT << 8)) + +#define XSDPS_MMC_DDR_4_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WIDTH_DDR_4_BIT << 8)) + +#define XSDPS_MMC_DDR_8_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WIDTH_DDR_8_BIT << 8)) + +#define XSDPS_MMC_RST_FUN_EN_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_RST_N_FUN_BYTE << 16) \ + | ((u32)EXT_CSD_RST_N_FUN_PERM_EN << 8)) + +#define XSDPS_MMC_DELAY_FOR_SWITCH 1000U + +/* @} */ + +/* @400KHz, in usec */ +#define XSDPS_74CLK_DELAY 2960U +#define XSDPS_100CLK_DELAY 4000U +#define XSDPS_INIT_DELAY 10000U + +#define XSDPS_DEF_VOLT_LVL XSDPS_PC_BUS_VSEL_3V0_MASK +#define XSDPS_CARD_DEF_ADDR 0x1234U + +#define XSDPS_CARD_SD 1U +#define XSDPS_CARD_MMC 2U +#define XSDPS_CARD_SDIO 3U +#define XSDPS_CARD_SDCOMBO 4U +#define XSDPS_CHIP_EMMC 5U + + +/** @name ADMA2 Descriptor related definitions + * + * ADMA2 Descriptor related definitions + * @{ + */ + +#define XSDPS_DESC_MAX_LENGTH 65536U + +#define XSDPS_DESC_VALID (0x1U << 0) +#define XSDPS_DESC_END (0x1U << 1) +#define XSDPS_DESC_INT (0x1U << 2) +#define XSDPS_DESC_TRAN (0x2U << 4) + +/* @} */ + +/* For changing clock frequencies */ +#define XSDPS_CLK_400_KHZ 400000U /**< 400 KHZ */ +#define XSDPS_CLK_50_MHZ 50000000U /**< 50 MHZ */ +#define XSDPS_CLK_52_MHZ 52000000U /**< 52 MHZ */ +#define XSDPS_SD_VER_1_0 0x1U /**< SD ver 1 */ +#define XSDPS_SD_VER_2_0 0x2U /**< SD ver 2 */ +#define XSDPS_SCR_BLKCNT 1U +#define XSDPS_SCR_BLKSIZE 8U +#define XSDPS_1_BIT_WIDTH 0x1U +#define XSDPS_4_BIT_WIDTH 0x2U +#define XSDPS_8_BIT_WIDTH 0x3U +#define XSDPS_UHS_SPEED_MODE_SDR12 0x0U +#define XSDPS_UHS_SPEED_MODE_SDR25 0x1U +#define XSDPS_UHS_SPEED_MODE_SDR50 0x2U +#define XSDPS_UHS_SPEED_MODE_SDR104 0x3U +#define XSDPS_UHS_SPEED_MODE_DDR50 0x4U +#define XSDPS_HIGH_SPEED_MODE 0x5U +#define XSDPS_DEFAULT_SPEED_MODE 0x6U +#define XSDPS_HS200_MODE 0x7U +#define XSDPS_DDR52_MODE 0x4U +#define XSDPS_SWITCH_CMD_BLKCNT 1U +#define XSDPS_SWITCH_CMD_BLKSIZE 64U +#define XSDPS_SWITCH_CMD_HS_GET 0x00FFFFF0U +#define XSDPS_SWITCH_CMD_HS_SET 0x80FFFFF1U +#define XSDPS_SWITCH_CMD_SDR12_SET 0x80FFFFF0U +#define XSDPS_SWITCH_CMD_SDR25_SET 0x80FFFFF1U +#define XSDPS_SWITCH_CMD_SDR50_SET 0x80FFFFF2U +#define XSDPS_SWITCH_CMD_SDR104_SET 0x80FFFFF3U +#define XSDPS_SWITCH_CMD_DDR50_SET 0x80FFFFF4U +#define XSDPS_EXT_CSD_CMD_BLKCNT 1U +#define XSDPS_EXT_CSD_CMD_BLKSIZE 512U +#define XSDPS_TUNING_CMD_BLKCNT 1U +#define XSDPS_TUNING_CMD_BLKSIZE 64U + +#define XSDPS_HIGH_SPEED_MAX_CLK 50000000U +#define XSDPS_UHS_SDR104_MAX_CLK 208000000U +#define XSDPS_UHS_SDR50_MAX_CLK 100000000U +#define XSDPS_UHS_DDR50_MAX_CLK 50000000U +#define XSDPS_UHS_SDR25_MAX_CLK 50000000U +#define XSDPS_UHS_SDR12_MAX_CLK 25000000U + +#define SD_DRIVER_TYPE_B 0x01U +#define SD_DRIVER_TYPE_A 0x02U +#define SD_DRIVER_TYPE_C 0x04U +#define SD_DRIVER_TYPE_D 0x08U +#define SD_SET_CURRENT_LIMIT_200 0U +#define SD_SET_CURRENT_LIMIT_400 1U +#define SD_SET_CURRENT_LIMIT_600 2U +#define SD_SET_CURRENT_LIMIT_800 3U + +#define SD_MAX_CURRENT_200 (1U << SD_SET_CURRENT_LIMIT_200) +#define SD_MAX_CURRENT_400 (1U << SD_SET_CURRENT_LIMIT_400) +#define SD_MAX_CURRENT_600 (1U << SD_SET_CURRENT_LIMIT_600) +#define SD_MAX_CURRENT_800 (1U << SD_SET_CURRENT_LIMIT_800) + +#define XSDPS_SD_SDR12_MAX_CLK 25000000U +#define XSDPS_SD_SDR25_MAX_CLK 50000000U +#define XSDPS_SD_SDR50_MAX_CLK 100000000U +#define XSDPS_SD_DDR50_MAX_CLK 50000000U +#define XSDPS_SD_SDR104_MAX_CLK 208000000U +/* + * XSDPS_SD_INPUT_MAX_CLK is set to 175000000 in order to keep it smaller + * than the clock value coming from the core. This value is kept to safely + * switch to SDR104 mode if the SD card supports it. + */ +#define XSDPS_SD_INPUT_MAX_CLK 175000000U + +#define XSDPS_MMC_HS200_MAX_CLK 200000000U +#define XSDPS_MMC_HSD_MAX_CLK 52000000U +#define XSDPS_MMC_DDR_MAX_CLK 52000000U + +#define XSDPS_CARD_STATE_IDLE 0U +#define XSDPS_CARD_STATE_RDY 1U +#define XSDPS_CARD_STATE_IDEN 2U +#define XSDPS_CARD_STATE_STBY 3U +#define XSDPS_CARD_STATE_TRAN 4U +#define XSDPS_CARD_STATE_DATA 5U +#define XSDPS_CARD_STATE_RCV 6U +#define XSDPS_CARD_STATE_PROG 7U +#define XSDPS_CARD_STATE_DIS 8U +#define XSDPS_CARD_STATE_BTST 9U +#define XSDPS_CARD_STATE_SLP 10U + +#define XSDPS_SLOT_REM 0U +#define XSDPS_SLOT_EMB 1U + +#define XSDPS_WIDTH_8 8U +#define XSDPS_WIDTH_4 4U + + +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) +#define SD0_ITAPDLY_SEL_MASK 0x000000FFU +#define SD0_OTAPDLY_SEL_MASK 0x0000003FU +#define SD1_ITAPDLY_SEL_MASK 0x00FF0000U +#define SD1_OTAPDLY_SEL_MASK 0x003F0000U +#define SD_DLL_CTRL 0x00000358U +#define SD_ITAPDLY 0x00000314U +#define SD_OTAPDLY 0x00000318U +#define SD0_DLL_RST 0x00000004U +#define SD1_DLL_RST 0x00040000U +#define SD0_ITAPCHGWIN 0x00000200U +#define SD0_ITAPDLYENA 0x00000100U +#define SD0_OTAPDLYENA 0x00000040U +#define SD1_ITAPCHGWIN 0x02000000U +#define SD1_ITAPDLYENA 0x01000000U +#define SD1_OTAPDLYENA 0x00400000U + +#define SD0_OTAPDLYSEL_HS200_B0 0x00000003U +#define SD0_OTAPDLYSEL_HS200_B2 0x00000002U +#define SD0_ITAPDLYSEL_SD50 0x00000014U +#define SD0_OTAPDLYSEL_SD50 0x00000003U +#define SD0_ITAPDLYSEL_SD_DDR50 0x0000003DU +#define SD0_ITAPDLYSEL_EMMC_DDR50 0x00000012U +#define SD0_OTAPDLYSEL_SD_DDR50 0x00000004U +#define SD0_OTAPDLYSEL_EMMC_DDR50 0x00000006U +#define SD0_ITAPDLYSEL_HSD 0x00000015U +#define SD0_OTAPDLYSEL_SD_HSD 0x00000005U +#define SD0_OTAPDLYSEL_EMMC_HSD 0x00000006U + +#define SD1_OTAPDLYSEL_HS200_B0 0x00030000U +#define SD1_OTAPDLYSEL_HS200_B2 0x00020000U +#define SD1_ITAPDLYSEL_SD50 0x00140000U +#define SD1_OTAPDLYSEL_SD50 0x00030000U +#define SD1_ITAPDLYSEL_SD_DDR50 0x003D0000U +#define SD1_ITAPDLYSEL_EMMC_DDR50 0x00120000U +#define SD1_OTAPDLYSEL_SD_DDR50 0x00040000U +#define SD1_OTAPDLYSEL_EMMC_DDR50 0x00060000U +#define SD1_ITAPDLYSEL_HSD 0x00150000U +#define SD1_OTAPDLYSEL_SD_HSD 0x00050000U +#define SD1_OTAPDLYSEL_EMMC_HSD 0x00060000U + +#endif + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ +#define XSdPs_In64 Xil_In64 +#define XSdPs_Out64 Xil_Out64 + +#define XSdPs_In32 Xil_In32 +#define XSdPs_Out32 Xil_Out32 + +#define XSdPs_In16 Xil_In16 +#define XSdPs_Out16 Xil_Out16 + +#define XSdPs_In8 Xil_In8 +#define XSdPs_Out8 Xil_Out8 + +/****************************************************************************/ +/** +* 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 XSdPs_ReadReg(XSdPs *InstancePtr. s32 RegOffset) +* +******************************************************************************/ +#define XSdPs_ReadReg64(InstancePtr, RegOffset) \ + XSdPs_In64((InstancePtr->Config.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 XSdPs_WriteReg(XSdPs *InstancePtr, s32 RegOffset, +* u64 RegisterValue) +* +******************************************************************************/ +#define XSdPs_WriteReg64(InstancePtr, RegOffset, RegisterValue) \ + XSdPs_Out64((InstancePtr->Config.BaseAddress) + (RegOffset), \ + (RegisterValue)) + +/****************************************************************************/ +/** +* 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 XSdPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +#define XSdPs_ReadReg(BaseAddress, RegOffset) \ + XSdPs_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 XSdPs_WriteReg(u32 BaseAddress, int RegOffset, +* u32 RegisterValue) +* +******************************************************************************/ +#define XSdPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + XSdPs_Out32((BaseAddress) + (RegOffset), (RegisterValue)) + +/****************************************************************************/ +/** +* 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: +* u16 XSdPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +static INLINE u16 XSdPs_ReadReg16(u32 BaseAddress, u8 RegOffset) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg >>= ((RegOffset & 0x3)*8); + return (u16)Reg; +#else + return XSdPs_In16((BaseAddress) + (RegOffset)); +#endif +} + +/***************************************************************************/ +/** +* 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 XSdPs_WriteReg(u32 BaseAddress, int RegOffset, +* u16 RegisterValue) +* +******************************************************************************/ + +static INLINE void XSdPs_WriteReg16(u32 BaseAddress, u8 RegOffset, u16 RegisterValue) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg &= ~(0xFFFF<<((RegOffset & 0x3)*8)); + Reg |= RegisterValue <<((RegOffset & 0x3)*8); + XSdPs_Out32(BaseAddress, Reg); +#else + XSdPs_Out16((BaseAddress) + (RegOffset), (RegisterValue)); +#endif +} + +/****************************************************************************/ +/** +* 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: +* u8 XSdPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +static INLINE u8 XSdPs_ReadReg8(u32 BaseAddress, u8 RegOffset) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg >>= ((RegOffset & 0x3)*8); + return (u8)Reg; +#else + return XSdPs_In8((BaseAddress) + (RegOffset)); +#endif +} +/***************************************************************************/ +/** +* 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 XSdPs_WriteReg(u32 BaseAddress, int RegOffset, +* u8 RegisterValue) +* +******************************************************************************/ +static INLINE void XSdPs_WriteReg8(u32 BaseAddress, u8 RegOffset, u8 RegisterValue) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg &= ~(0xFF<<((RegOffset & 0x3)*8)); + Reg |= RegisterValue <<((RegOffset & 0x3)*8); + XSdPs_Out32(BaseAddress, Reg); +#else + XSdPs_Out8((BaseAddress) + (RegOffset), (RegisterValue)); +#endif +} +/***************************************************************************/ +/** +* Macro to get present status register +* +* @param BaseAddress contains the base address of the device. +* +* @return None. +* +* @note C-Style signature: +* void XSdPs_WriteReg(u32 BaseAddress, int RegOffset, +* u8 RegisterValue) +* +******************************************************************************/ +#define XSdPs_GetPresentStatusReg(BaseAddress) \ + XSdPs_In32((BaseAddress) + (XSDPS_PRES_STATE_OFFSET)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* SD_HW_H_ */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xstatus.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xstatus.h new file mode 100644 index 0000000..9937475 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xstatus.h @@ -0,0 +1,535 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xstatus.h +* +* @addtogroup common_status_codes Xilinx® software status codes +* +* The xstatus.h file contains the Xilinx® software status codes.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 *****************************/ +/** +@name Common Status Codes for All Device Drivers +@{ +*/ +#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 *********************/ +/** +@name Utility Component Status Codes 401 - 500 +@{ +*/ +#define XST_MEMTEST_FAILED 401L /*!< Memory test failed */ + +/** @} */ +/***************** Common Components statuses 501 - 1000 *********************/ +/** +@name Packet Fifo Status Codes 501 - 510 +@{ +*/ +/********************* 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 + */ +/** @} */ +/** +@name DMA Status Codes 511 - 530 +@{ +*/ +/************************** 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 */ +/** @} */ +/** +@name IPIF Status Codes Codes 531 - 550 +@{ +*/ +/************************** 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 *********************/ +/** +@name Ethernet Status Codes 1001 - 1050 +@{ +*/ +/********************* 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 */ +/** @} */ +/** +@name UART Status Codes 1051 - 1075 +@{ +*/ +/*********************** 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 + +/** @} */ +/** +@name IIC Status Codes 1076 - 1100 +@{ +*/ +/************************ 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 */ +/** @} */ +/** +@name ATMC Status Codes 1101 - 1125 +@{ +*/ +/*********************** 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 */ +/** @} */ +/** +@name Flash Status Codes 1126 - 1150 +@{ +*/ +/*********************** 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 */ +/** @} */ +/** +@name SPI Status Codes 1151 - 1175 +@{ +*/ +/*********************** 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 */ +#define XST_SPI_POLL_DONE 1163 /*!< controller completed polling the + device for status */ +/** @} */ +/** +@name OPB Arbiter Status Codes 1176 - 1200 +@{ +*/ +/********************** 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 + */ +/** @} */ +/** +@name INTC Status Codes 1201 - 1225 +@{ +*/ +/************************ Intc statuses 1201 - 1225 **************************/ + +#define XST_INTC_FAIL_SELFTEST 1201 /*!< self test failed */ +#define XST_INTC_CONNECT_ERROR 1202 /*!< interrupt already in use */ +/** @} */ +/** +@name TmrCtr Status Codes 1226 - 1250 +@{ +*/ +/********************** TmrCtr statuses 1226 - 1250 **************************/ + +#define XST_TMRCTR_TIMER_FAILED 1226 /*!< self test failed */ +/** @} */ +/** +@name WdtTb Status Codes 1251 - 1275 +@{ +*/ +/********************** WdtTb statuses 1251 - 1275 ***************************/ + +#define XST_WDTTB_TIMER_FAILED 1251L +/** @} */ +/** +@name PlbArb status Codes 1276 - 1300 +@{ +*/ +/********************** PlbArb statuses 1276 - 1300 **************************/ + +#define XST_PLBARB_FAIL_SELFTEST 1276L +/** @} */ +/** +@name Plb2Opb Status Codes 1301 - 1325 +@{ +*/ +/********************** Plb2Opb statuses 1301 - 1325 *************************/ + +#define XST_PLB2OPB_FAIL_SELFTEST 1301L +/** @} */ +/** +@name Opb2Plb Status 1326 - 1350 +@{ +*/ +/********************** Opb2Plb statuses 1326 - 1350 *************************/ + +#define XST_OPB2PLB_FAIL_SELFTEST 1326L +/** @} */ +/** +@name SysAce Status Codes 1351 - 1360 +@{ +*/ +/********************** SysAce statuses 1351 - 1360 **************************/ + +#define XST_SYSACE_NO_LOCK 1351L /*!< No MPU lock has been granted */ +/** @} */ +/** +@name PCI Bridge Status Codes 1361 - 1375 +@{ +*/ +/********************** PCI Bridge statuses 1361 - 1375 **********************/ + +#define XST_PCI_INVALID_ADDRESS 1361L +/** @} */ +/** +@name FlexRay Constants 1400 - 1409 +@{ +*/ +/********************** 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 +/** @} */ +/** +@name USB constants 1410 - 1420 +@{ +*/ +/****************** 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 +/** @} */ +/** +@name HWICAP constants 1421 - 1429 +@{ +*/ +/****************** HWICAP constants 1421 - 1429 *****************************/ + +#define XST_HWICAP_WRITE_DONE 1421 + +/** @} */ +/** +@name AXI VDMA constants 1430 - 1440 +@{ +*/ +/****************** AXI VDMA constants 1430 - 1440 *****************************/ + +#define XST_VDMA_MISMATCH_ERROR 1430 +/** @} */ +/** +@name NAND Flash Status Codes 1441 - 1459 +@{ +*/ +/*********************** 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 s32 XStatus; + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_status_codes". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xtime_l.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xtime_l.h new file mode 100644 index 0000000..9b872b6 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xtime_l.h @@ -0,0 +1,105 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xtime_l.h +* @addtogroup a9_time_apis Cortex A9 Time Functions +* +* xtime_l.h provides access to the 64-bit Global Counter in the PMU. This +* counter increases by one at every two processor cycles. These functions can +* be used to get/set time in the global timer. +* +* @{ +*
    +* 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
    +* 6.6   srm    10/23/17 Updated the macros to support user configurable sleep
    +*						implementation
    +* 
    +* +******************************************************************************/ + +#ifndef XTIME_H /* prevent circular inclusions */ +#define XTIME_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xparameters.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +typedef u64 XTime; + +/************************** Constant Definitions *****************************/ +#define GLOBAL_TMR_BASEADDR XPAR_GLOBAL_TMR_BASEADDR +#define GTIMER_COUNTER_LOWER_OFFSET 0x00U +#define GTIMER_COUNTER_UPPER_OFFSET 0x04U +#define GTIMER_CONTROL_OFFSET 0x08U + +#if defined (SLEEP_TIMER_BASEADDR) +#define COUNTS_PER_SECOND (SLEEP_TIMER_FREQUENCY) +#else +/* Global Timer is always clocked at half of the CPU frequency */ +#define COUNTS_PER_SECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ /2) +#endif + +#if defined (XSLEEP_TIMER_IS_DEFAULT_TIMER) +#pragma message ("For the sleep routines, Global timer is being used") +#endif +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void XTime_SetTime(XTime Xtime_Global); +void XTime_GetTime(XTime *Xtime_Global); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XTIME_H */ +/** +* @} End of "addtogroup a9_time_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xttcps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xttcps.h new file mode 100644 index 0000000..b7b4e19 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xttcps.h @@ -0,0 +1,467 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xttcps.h +* @addtogroup ttcps_v3_5 +* @{ +* @details +* +* This is the driver for one 16-bit timer counter in the Triple Timer Counter +* (TTC) module in the Ps block. +* +* The TTC module provides three independent timer/counter modules that can each +* be clocked using either the system clock (pclk) or an externally driven +* clock (ext_clk). In addition, each counter can independently prescale its +* selected clock input (divided by 2 to 65536). Counters can be set to +* decrement or increment. +* +* Each of the counters can be programmed to generate interrupt pulses: +* . At a regular, predefined period, that is on a timed interval +* . When the counter registers overflow +* . When the count matches any one of the three 'match' registers +* +* Therefore, up to six different events can trigger a timer interrupt: three +* match interrupts, an overflow interrupt, an interval interrupt and an event +* timer interrupt. Note that the overflow interrupt and the interval interrupt +* are mutually exclusive. +* +* Initialization & Configuration +* +* An XTtcPs_Config structure is used to configure a driver instance. +* Information in the XTtcPs_Config structure is the hardware properties +* about the device. +* +* A driver instance is initialized through +* XTtcPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr). Where CfgPtr +* is a pointer to the XTtcPs_Config structure, it can be looked up statically +* through XTtcPs_LookupConfig(DeviceID), or passed in by the caller. The +* EffectiveAddr can be the static base address of the device or virtual +* mapped address if address translation is supported. +* +* Interrupts +* +* Interrupt handler is not provided by the driver, as handling of interrupt +* is application specific. +* +* @note +* The default setting for a timer/counter is: +* - Overflow Mode +* - Internal clock (pclk) selected +* - Counter disabled +* - All Interrupts disabled +* - Output waveforms disabled +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- -----------------------------------------------------
    +* 1.00a drg/jz 01/20/10 First release..
    +* 2.0   adk    12/10/13 Updated as per the New Tcl API's
    +* 3.0	pkp    12/09/14 Added support for Zynq Ultrascale Mp.Also code
    +*			modified for MISRA-C:2012 compliance.
    +* 3.2   mus    10/28/16 Modified XTtcPs_GetCounterValue and XTtcPs_SetInterval
    +*                       macros to return 32 bit values for zynq ultrascale+mpsoc
    +*       ms   01/23/17 Modified xil_printf statement in main function for all
    +*                     examples to ensure that "Successfully ran" and "Failed"
    +*                     strings are available in all examples. This is a fix
    +*                     for CR-965028.
    +*       ms   03/17/17 Added readme.txt file in examples folder for doxygen
    +*                     generation.
    +* 3.4   ms   04/18/17 Modified tcl file to add suffix U for all macros
    +*                     definitions of ttcps in xparameters.h
    +* 3.5   srm  10/06/17 Added new typedef XMatchRegValue for match register width
    +*
    +* 
    +* +******************************************************************************/ + +#ifndef XTTCPS_H /* prevent circular inclusions */ +#define XTTCPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xttcps_hw.h" +#include "xstatus.h" + +/************************** Constant Definitions *****************************/ + + +/* + * Maximum Value for interval counter + */ + #if defined(ARMA9) + #define XTTCPS_MAX_INTERVAL_COUNT 0xFFFFU + #else + #define XTTCPS_MAX_INTERVAL_COUNT 0xFFFFFFFFU + #endif + +/** @name Configuration options + * + * Options for the device. Each of the options is bit field, so more than one + * options can be specified. + * + * @{ + */ +#define XTTCPS_OPTION_EXTERNAL_CLK 0x00000001U /**< External clock source */ +#define XTTCPS_OPTION_CLK_EDGE_NEG 0x00000002U /**< Clock on trailing edge for + external clock*/ +#define XTTCPS_OPTION_INTERVAL_MODE 0x00000004U /**< Interval mode */ +#define XTTCPS_OPTION_DECREMENT 0x00000008U /**< Decrement the counter */ +#define XTTCPS_OPTION_MATCH_MODE 0x00000010U /**< Match mode */ +#define XTTCPS_OPTION_WAVE_DISABLE 0x00000020U /**< No waveform output */ +#define XTTCPS_OPTION_WAVE_POLARITY 0x00000040U /**< Waveform polarity */ +/*@}*/ +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID for device */ + u32 BaseAddress; /**< Base address for device */ + u32 InputClockHz; /**< Input clock frequency */ +} XTtcPs_Config; + +/** + * The XTtcPs driver instance data. The user is required to allocate a + * variable of this type for each PS timer/counter device in the system. A + * pointer to a variable of this type is then passed to various driver API + * functions. + */ +typedef struct { + XTtcPs_Config Config; /**< Configuration structure */ + u32 IsReady; /**< Device is initialized and ready */ +} XTtcPs; + +/** + * This typedef contains interval count and Match register value + */ +#if defined(ARMA9) +typedef u16 XInterval; +typedef u16 XMatchRegValue; +#else +typedef u32 XInterval; +typedef u32 XMatchRegValue; +#endif +/***************** Macros (Inline Functions) Definitions *********************/ + +/* + * Internal helper macros + */ +#define InstReadReg(InstancePtr, RegOffset) \ + (Xil_In32(((InstancePtr)->Config.BaseAddress) + (u32)(RegOffset))) + +#define InstWriteReg(InstancePtr, RegOffset, Data) \ + (Xil_Out32(((InstancePtr)->Config.BaseAddress) + (u32)(RegOffset), (u32)(Data))) + +/*****************************************************************************/ +/** +* +* This function starts the counter/timer without resetting the counter value. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return None +* +* @note C-style signature: +* void XTtcPs_Start(XTtcPs *InstancePtr) +* +****************************************************************************/ +#define XTtcPs_Start(InstancePtr) \ + InstWriteReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) & \ + ~XTTCPS_CNT_CNTRL_DIS_MASK)) + +/*****************************************************************************/ +/** +* +* This function stops the counter/timer. This macro may be called at any time +* to stop the counter. The counter holds the last value until it is reset, +* restarted or enabled. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return None +* +* @note C-style signature: +* void XTtcPs_Stop(XTtcPs *InstancePtr) +* +****************************************************************************/ +#define XTtcPs_Stop(InstancePtr) \ + InstWriteReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) | \ + XTTCPS_CNT_CNTRL_DIS_MASK)) + +/*****************************************************************************/ +/** +* +* This function checks whether the timer counter has already started. +* +* @param InstancePtr is a pointer to the XTtcPs instance +* +* @return Non-zero if the device has started, '0' otherwise. +* +* @note C-style signature: +* int XTtcPs_IsStarted(XTtcPs *InstancePtr) +* +****************************************************************************/ +#define XTtcPs_IsStarted(InstancePtr) \ + ((InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) & \ + XTTCPS_CNT_CNTRL_DIS_MASK) == 0U) + +/*****************************************************************************/ +/** +* +* This function returns the current 16-bit counter value. It may be called at +* any time. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return zynq:16 bit counter value. +* zynq ultrascale+mpsoc:32 bit counter value. +* +* @note C-style signature: +* zynq: u16 XTtcPs_GetCounterValue(XTtcPs *InstancePtr) +* zynq ultrascale+mpsoc: u32 XTtcPs_GetCounterValue(XTtcPs *InstancePtr) +* +****************************************************************************/ +#if defined(ARMA9) +/* + * ttc supports 16 bit counter for zynq + */ +#define XTtcPs_GetCounterValue(InstancePtr) \ + (u16)InstReadReg((InstancePtr), XTTCPS_COUNT_VALUE_OFFSET) +#else +/* + * ttc supports 32 bit counter for zynq ultrascale+mpsoc + */ +#define XTtcPs_GetCounterValue(InstancePtr) \ + InstReadReg((InstancePtr), XTTCPS_COUNT_VALUE_OFFSET) +#endif + +/*****************************************************************************/ +/** +* +* This function sets the interval value to be used in interval mode. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param Value is the 16-bit value to be set in the interval register. +* +* @return None +* +* @note C-style signature: +* void XTtcPs_SetInterval(XTtcPs *InstancePtr, XInterval Value) +* +****************************************************************************/ +#define XTtcPs_SetInterval(InstancePtr, Value) \ + InstWriteReg((InstancePtr), XTTCPS_INTERVAL_VAL_OFFSET, (Value)) + +/*****************************************************************************/ +/** +* +* This function gets the interval value from the interval register. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return zynq:16 bit interval value. +* zynq ultrascale+mpsoc:32 bit interval value. +* +* @note C-style signature: +* zynq: u16 XTtcPs_GetInterval(XTtcPs *InstancePtr) +* zynq ultrascale+mpsoc: u32 XTtcPs_GetInterval(XTtcPs *InstancePtr) +* +****************************************************************************/ +#if defined(ARMA9) +/* + * ttc supports 16 bit interval counter for zynq + */ +#define XTtcPs_GetInterval(InstancePtr) \ + (u16)InstReadReg((InstancePtr), XTTCPS_INTERVAL_VAL_OFFSET) +#else +/* + * ttc supports 32 bit interval counter for zynq ultrascale+mpsoc + */ +#define XTtcPs_GetInterval(InstancePtr) \ + InstReadReg((InstancePtr), XTTCPS_INTERVAL_VAL_OFFSET) +#endif +/*****************************************************************************/ +/** +* +* This macro resets the count register. It may be called at any time. The +* counter is reset to either 0 or 0xFFFF, or the interval value, depending on +* the increment/decrement mode. The state of the counter, as started or +* stopped, is not affected by calling reset. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return None +* +* @note C-style signature: +* void XTtcPs_ResetCounterValue(XTtcPs *InstancePtr) +* +****************************************************************************/ +#define XTtcPs_ResetCounterValue(InstancePtr) \ + InstWriteReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) | \ + (u32)XTTCPS_CNT_CNTRL_RST_MASK)) + +/*****************************************************************************/ +/** +* +* This function enables the interrupts. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param InterruptMask defines which interrupt should be enabled. +* Constants are defined in xttcps_hw.h as XTTCPS_IXR_*. +* This is a bit mask, all set bits will be enabled, cleared bits +* will not be disabled. +* +* @return None. +* +* @note +* C-style signature: +* void XTtcPs_EnableInterrupts(XTtcPs *InstancePtr, u32 InterruptMask) +* +******************************************************************************/ +#define XTtcPs_EnableInterrupts(InstancePtr, InterruptMask) \ + InstWriteReg((InstancePtr), XTTCPS_IER_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_IER_OFFSET) | \ + (InterruptMask))) + +/*****************************************************************************/ +/** +* +* This function disables the interrupts. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param InterruptMask defines which interrupt should be disabled. +* Constants are defined in xttcps_hw.h as XTTCPS_IXR_*. +* This is a bit mask, all set bits will be disabled, cleared bits +* will not be disabled. +* +* @return None. +* +* @note +* C-style signature: +* void XTtcPs_DisableInterrupts(XTtcPs *InstancePtr, u32 InterruptMask) +* +******************************************************************************/ +#define XTtcPs_DisableInterrupts(InstancePtr, InterruptMask) \ + InstWriteReg((InstancePtr), XTTCPS_IER_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_IER_OFFSET) & \ + ~(InterruptMask))) + +/*****************************************************************************/ +/** +* +* This function reads the interrupt status. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return None. +* +* @note C-style signature: +* u32 XTtcPs_GetInterruptStatus(XTtcPs *InstancePtr) +* +******************************************************************************/ +#define XTtcPs_GetInterruptStatus(InstancePtr) \ + InstReadReg((InstancePtr), XTTCPS_ISR_OFFSET) + +/*****************************************************************************/ +/** +* +* This function clears the interrupt status. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param InterruptMask defines which interrupt should be cleared. +* Constants are defined in xttcps_hw.h as XTTCPS_IXR_*. +* This is a bit mask, all set bits will be cleared, cleared bits +* will not be cleared. +* +* @return None. +* +* @note +* C-style signature: +* void XTtcPs_ClearInterruptStatus(XTtcPs *InstancePtr, u32 InterruptMask) +* +******************************************************************************/ +#define XTtcPs_ClearInterruptStatus(InstancePtr, InterruptMask) \ + InstWriteReg((InstancePtr), XTTCPS_ISR_OFFSET, \ + (InterruptMask)) + + +/************************** Function Prototypes ******************************/ + +/* + * Initialization functions in xttcps_sinit.c + */ +XTtcPs_Config *XTtcPs_LookupConfig(u16 DeviceId); + +/* + * Required functions, in xttcps.c + */ +s32 XTtcPs_CfgInitialize(XTtcPs *InstancePtr, + XTtcPs_Config * ConfigPtr, u32 EffectiveAddr); + +void XTtcPs_SetMatchValue(XTtcPs *InstancePtr, u8 MatchIndex, XMatchRegValue Value); +XMatchRegValue XTtcPs_GetMatchValue(XTtcPs *InstancePtr, u8 MatchIndex); + +void XTtcPs_SetPrescaler(XTtcPs *InstancePtr, u8 PrescalerValue); +u8 XTtcPs_GetPrescaler(XTtcPs *InstancePtr); + +void XTtcPs_CalcIntervalFromFreq(XTtcPs *InstancePtr, u32 Freq, + XInterval *Interval, u8 *Prescaler); + +/* + * Functions for options, in file xttcps_options.c + */ +s32 XTtcPs_SetOptions(XTtcPs *InstancePtr, u32 Options); +u32 XTtcPs_GetOptions(XTtcPs *InstancePtr); + +/* + * Function for self-test, in file xttcps_selftest.c + */ +s32 XTtcPs_SelfTest(XTtcPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xttcps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xttcps_hw.h new file mode 100644 index 0000000..b1fa545 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xttcps_hw.h @@ -0,0 +1,233 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xttcps_hw.h +* @addtogroup ttcps_v3_5 +* @{ +* +* This file defines the hardware interface to one of the three timer counters +* in the Ps block. +* +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- -------------------------------------------------
    +* 1.00a drg/jz 01/21/10 First release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.5   srm    10/06/17 Updated XTTCPS_COUNT_VALUE_MASK,
    +*                       XTTCPS_INTERVAL_VAL_MASK, XTTCPS_MATCH_MASK macros to
    +*                       mask 16 bit values for zynq and 32 bit values for
    +*                       zynq ultrascale+mpsoc "
    +* 
    +* +******************************************************************************/ + +#ifndef XTTCPS_HW_H /* prevent circular inclusions */ +#define XTTCPS_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 *****************************/ +/* + * Flag for a9 processor + */ + #if !defined (ARMR5) && !defined (__aarch64__) && !defined (ARMA53_32) + #define ARMA9 + #endif + +/** @name Register Map + * + * Register offsets from the base address of the device. + * + * @{ + */ +#define XTTCPS_CLK_CNTRL_OFFSET 0x00000000U /**< Clock Control Register */ +#define XTTCPS_CNT_CNTRL_OFFSET 0x0000000CU /**< Counter Control Register*/ +#define XTTCPS_COUNT_VALUE_OFFSET 0x00000018U /**< Current Counter Value */ +#define XTTCPS_INTERVAL_VAL_OFFSET 0x00000024U /**< Interval Count Value */ +#define XTTCPS_MATCH_0_OFFSET 0x00000030U /**< Match 1 value */ +#define XTTCPS_MATCH_1_OFFSET 0x0000003CU /**< Match 2 value */ +#define XTTCPS_MATCH_2_OFFSET 0x00000048U /**< Match 3 value */ +#define XTTCPS_ISR_OFFSET 0x00000054U /**< Interrupt Status Register */ +#define XTTCPS_IER_OFFSET 0x00000060U /**< Interrupt Enable Register */ +/* @} */ + +/** @name Clock Control Register + * Clock Control Register definitions + * @{ + */ +#define XTTCPS_CLK_CNTRL_PS_EN_MASK 0x00000001U /**< Prescale enable */ +#define XTTCPS_CLK_CNTRL_PS_VAL_MASK 0x0000001EU /**< Prescale value */ +#define XTTCPS_CLK_CNTRL_PS_VAL_SHIFT 1U /**< Prescale shift */ +#define XTTCPS_CLK_CNTRL_PS_DISABLE 16U /**< Prescale disable */ +#define XTTCPS_CLK_CNTRL_SRC_MASK 0x00000020U /**< Clock source */ +#define XTTCPS_CLK_CNTRL_EXT_EDGE_MASK 0x00000040U /**< External Clock edge */ +/* @} */ + +/** @name Counter Control Register + * Counter Control Register definitions + * @{ + */ +#define XTTCPS_CNT_CNTRL_DIS_MASK 0x00000001U /**< Disable the counter */ +#define XTTCPS_CNT_CNTRL_INT_MASK 0x00000002U /**< Interval mode */ +#define XTTCPS_CNT_CNTRL_DECR_MASK 0x00000004U /**< Decrement mode */ +#define XTTCPS_CNT_CNTRL_MATCH_MASK 0x00000008U /**< Match mode */ +#define XTTCPS_CNT_CNTRL_RST_MASK 0x00000010U /**< Reset counter */ +#define XTTCPS_CNT_CNTRL_EN_WAVE_MASK 0x00000020U /**< Enable waveform */ +#define XTTCPS_CNT_CNTRL_POL_WAVE_MASK 0x00000040U /**< Waveform polarity */ +#define XTTCPS_CNT_CNTRL_RESET_VALUE 0x00000021U /**< Reset value */ +/* @} */ + +/** @name Current Counter Value Register + * Current Counter Value Register definitions + * @{ + */ +#if defined(ARMA9) +#define XTTCPS_COUNT_VALUE_MASK 0x0000FFFFU /**< 16-bit counter value */ +#else +#define XTTCPS_COUNT_VALUE_MASK 0xFFFFFFFFU /**< 32-bit counter value */ +#endif +/* @} */ + +/** @name Interval Value Register + * Interval Value Register is the maximum value the counter will count up or + * down to. + * @{ + */ +#if defined(ARMA9) +#define XTTCPS_INTERVAL_VAL_MASK 0x0000FFFFU /**< 16-bit Interval value*/ +#else +#define XTTCPS_INTERVAL_VAL_MASK 0xFFFFFFFFU /**< 32-bit Interval value*/ +#endif +/* @} */ + +/** @name Match Registers + * Definitions for Match registers, each timer counter has three match + * registers. + * @{ + */ +#if defined(ARMA9) +#define XTTCPS_MATCH_MASK 0x0000FFFFU /**< 16-bit Match value */ +#else +#define XTTCPS_MATCH_MASK 0xFFFFFFFFU /**< 32-bit Match value */ +#endif +#define XTTCPS_NUM_MATCH_REG 3U /**< Num of Match reg */ +/* @} */ + +/** @name Interrupt Registers + * Following register bit mask is for all interrupt registers. + * + * @{ + */ +#define XTTCPS_IXR_INTERVAL_MASK 0x00000001U /**< Interval Interrupt */ +#define XTTCPS_IXR_MATCH_0_MASK 0x00000002U /**< Match 1 Interrupt */ +#define XTTCPS_IXR_MATCH_1_MASK 0x00000004U /**< Match 2 Interrupt */ +#define XTTCPS_IXR_MATCH_2_MASK 0x00000008U /**< Match 3 Interrupt */ +#define XTTCPS_IXR_CNT_OVR_MASK 0x00000010U /**< Counter Overflow */ +#define XTTCPS_IXR_ALL_MASK 0x0000001FU /**< All valid Interrupts */ +/* @} */ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Read the given Timer Counter register. +* +* @param BaseAddress is the base address of the timer counter device. +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note C-style signature: +* u32 XTtcPs_ReadReg(u32 BaseAddress, u32 RegOffset) +* +*****************************************************************************/ +#define XTtcPs_ReadReg(BaseAddress, RegOffset) \ + (Xil_In32((BaseAddress) + (u32)(RegOffset))) + +/****************************************************************************/ +/** +* +* Write the given Timer Counter register. +* +* @param BaseAddress is the base address of the timer counter 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 XTtcPs_WriteReg(XTtcPs BaseAddress, u32 RegOffset, +* u32 Data) +* +*****************************************************************************/ +#define XTtcPs_WriteReg(BaseAddress, RegOffset, Data) \ + (Xil_Out32((BaseAddress) + (u32)(RegOffset), (u32)(Data))) + +/****************************************************************************/ +/** +* +* Calculate a match register offset using the Match Register index. +* +* @param MatchIndex is the 0-2 value of the match register +* +* @return MATCH_N_OFFSET. +* +* @note C-style signature: +* u32 XTtcPs_Match_N_Offset(u8 MatchIndex) +* +*****************************************************************************/ +#define XTtcPs_Match_N_Offset(MatchIndex) \ + ((u32)XTTCPS_MATCH_0_OFFSET + ((u32)(12U) * (u32)(MatchIndex))) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xuartps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xuartps.h new file mode 100644 index 0000000..33758c2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xuartps.h @@ -0,0 +1,520 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps.h +* @addtogroup uartps_v3_5 +* @{ +* @details +* +* 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 +* +* Initialization & Configuration +* +* 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. +* +* Baud Rate +* +* 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: +*
    +*	baud_rate = input_clock / (bgen * (bdiv + 1)
    +* 
    +* where bgen is the value of the baud rate generator, and bdiv is the value of +* baud rate divider. +* +* Interrupts +* +* 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. +* +* Data Transfer +* +* 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) +* +*
    +* 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.
    +* 2.0   hk      03/07/14 Version number revised.
    +* 2.1   hk     04/16/14 Change XUARTPS_MAX_RATE to 921600. CR# 780625.
    +* 2.2   hk     06/23/14 SW reset of RX and TX should be done when changing
    +*                       baud rate. CR# 804281.
    +* 3.0   vm     12/09/14 Modified source code according to misrac guideline.
    +*			Support for Zynq Ultrascale Mp added.
    +* 3.1	kvn    04/10/15 Modified code for latest RTL changes. Also added
    +*						platform variable in driver instance structure.
    +* 3.1   adk   14/03/16  Include interrupt examples in the peripheral test when
    +*			uart is connected to a valid interrupt controller CR#946803.
    +* 3.2   rk     07/20/16 Modified the logic for transmission break bit set
    +* 3.4   ms     01/23/17 Added xil_printf statement in main function for all
    +*                       examples to ensure that "Successfully ran" and "Failed"
    +*                       strings are available in all examples. This is a fix
    +*                       for CR-965028.
    +*       ms     03/17/17 Added readme.txt file in examples folder for doxygen
    +*                       generation.
    +* 3.6   ms     02/16/18 Updates the flow control mode offset value in modem
    +*                       control register.
    +*
    +* 
    +* +*****************************************************************************/ + +#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" +#include "xplatform_info.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 921600U +#define XUARTPS_MIN_RATE 110U + +#define XUARTPS_DFT_BAUDRATE 115200U /* 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 0x0080U /**< Starts break transmission */ +#define XUARTPS_OPTION_STOP_BREAK 0x0040U /**< Stops break transmission */ +#define XUARTPS_OPTION_RESET_TMOUT 0x0020U /**< Reset the receive timeout */ +#define XUARTPS_OPTION_RESET_TX 0x0010U /**< Reset the transmitter */ +#define XUARTPS_OPTION_RESET_RX 0x0008U /**< Reset the receiver */ +#define XUARTPS_OPTION_ASSERT_RTS 0x0004U /**< Assert the RTS bit */ +#define XUARTPS_OPTION_ASSERT_DTR 0x0002U /**< Assert the DTR bit */ +#define XUARTPS_OPTION_SET_FCM 0x0001U /**< 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 (u8)0x00U /**< Normal Mode */ +#define XUARTPS_OPER_MODE_AUTO_ECHO (u8)0x01U /**< Auto Echo Mode */ +#define XUARTPS_OPER_MODE_LOCAL_LOOP (u8)0x02U /**< Local Loopback Mode */ +#define XUARTPS_OPER_MODE_REMOTE_LOOP (u8)0x03U /**< 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 0U /**< 8 data bits */ +#define XUARTPS_FORMAT_7_BITS 2U /**< 7 data bits */ +#define XUARTPS_FORMAT_6_BITS 3U /**< 6 data bits */ + +#define XUARTPS_FORMAT_NO_PARITY 4U /**< No parity */ +#define XUARTPS_FORMAT_MARK_PARITY 3U /**< Mark parity */ +#define XUARTPS_FORMAT_SPACE_PARITY 2U /**< parity */ +#define XUARTPS_FORMAT_ODD_PARITY 1U /**< Odd parity */ +#define XUARTPS_FORMAT_EVEN_PARITY 0U /**< Even parity */ + +#define XUARTPS_FORMAT_2_STOP_BIT 2U /**< 2 stop bits */ +#define XUARTPS_FORMAT_1_5_STOP_BIT 1U /**< 1.5 stop bits */ +#define XUARTPS_FORMAT_1_STOP_BIT 0U /**< 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 1U /**< Data receiving done */ +#define XUARTPS_EVENT_RECV_TOUT 2U /**< A receive timeout occurred */ +#define XUARTPS_EVENT_SENT_DATA 3U /**< Data transmission done */ +#define XUARTPS_EVENT_RECV_ERROR 4U /**< A receive error detected */ +#define XUARTPS_EVENT_MODEM 5U /**< Modem status changed */ +#define XUARTPS_EVENT_PARE_FRAME_BRKE 6U /**< A receive parity, frame, break + * error detected */ +#define XUARTPS_EVENT_RECV_ORERR 7U /**< A receive overrun error detected */ +/*@}*/ + + +/**************************** 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 */ + s32 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; + u32 RequestedBytes; + u32 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, + u32 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 */ + u32 Platform; + u8 is_rxbs_error; +} 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) + (u32)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) + (u32)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) + (u32)XUARTPS_CR_OFFSET, \ + (u32)(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 + (u32)XUARTPS_CR_OFFSET), \ + ((Xil_In32((InstancePtr)->Config.BaseAddress + (u32)XUARTPS_CR_OFFSET) & \ + (u32)(~XUARTPS_CR_EN_DIS_MASK)) | ((u32)XUARTPS_CR_RX_EN | (u32)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 + (u32)XUARTPS_CR_OFFSET), \ + (((Xil_In32((InstancePtr)->Config.BaseAddress + (u32)XUARTPS_CR_OFFSET)) & \ + (u32)(~XUARTPS_CR_EN_DIS_MASK)) | ((u32)XUARTPS_CR_RX_DIS | (u32)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) + (u32)XUARTPS_SR_OFFSET) & \ + (u32)XUARTPS_SR_TXEMPTY) == (u32)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 */ +s32 XUartPs_CfgInitialize(XUartPs *InstancePtr, + XUartPs_Config * Config, u32 EffectiveAddr); + +u32 XUartPs_Send(XUartPs *InstancePtr,u8 *BufferPtr, + u32 NumBytes); + +u32 XUartPs_Recv(XUartPs *InstancePtr,u8 *BufferPtr, + u32 NumBytes); + +s32 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); + +s32 XUartPs_SetDataFormat(XUartPs *InstancePtr, XUartPsFormat * FormatPtr); + +void XUartPs_GetDataFormat(XUartPs *InstancePtr, XUartPsFormat * FormatPtr); + +/* 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 */ +s32 XUartPs_SelfTest(XUartPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xuartps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xuartps_hw.h new file mode 100644 index 0000000..9a2bc43 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xuartps_hw.h @@ -0,0 +1,451 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xuartps_hw.h +* @addtogroup uartps_v3_5 +* @{ +* +* This header file contains the hardware interface of an XUartPs device. +* +*
    +* 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.
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn    04/10/15 Modified code for latest RTL changes.
    +* 3.6   ms     02/16/18 Updates flow control mode offset value in
    +*			modem control register.
    +*
    +* 
    +* +******************************************************************************/ +#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 0x0000U /**< Control Register [8:0] */ +#define XUARTPS_MR_OFFSET 0x0004U /**< Mode Register [9:0] */ +#define XUARTPS_IER_OFFSET 0x0008U /**< Interrupt Enable [12:0] */ +#define XUARTPS_IDR_OFFSET 0x000CU /**< Interrupt Disable [12:0] */ +#define XUARTPS_IMR_OFFSET 0x0010U /**< Interrupt Mask [12:0] */ +#define XUARTPS_ISR_OFFSET 0x0014U /**< Interrupt Status [12:0]*/ +#define XUARTPS_BAUDGEN_OFFSET 0x0018U /**< Baud Rate Generator [15:0] */ +#define XUARTPS_RXTOUT_OFFSET 0x001CU /**< RX Timeout [7:0] */ +#define XUARTPS_RXWM_OFFSET 0x0020U /**< RX FIFO Trigger Level [5:0] */ +#define XUARTPS_MODEMCR_OFFSET 0x0024U /**< Modem Control [5:0] */ +#define XUARTPS_MODEMSR_OFFSET 0x0028U /**< Modem Status [8:0] */ +#define XUARTPS_SR_OFFSET 0x002CU /**< Channel Status [14:0] */ +#define XUARTPS_FIFO_OFFSET 0x0030U /**< FIFO [7:0] */ +#define XUARTPS_BAUDDIV_OFFSET 0x0034U /**< Baud Rate Divider [7:0] */ +#define XUARTPS_FLOWDEL_OFFSET 0x0038U /**< Flow Delay [5:0] */ +#define XUARTPS_TXWM_OFFSET 0x0044U /**< TX FIFO Trigger Level [5:0] */ +#define XUARTPS_RXBS_OFFSET 0x0048U /**< RX FIFO Byte Status [11:0] */ +/* @} */ + +/** @name Control Register + * + * The Control register (CR) controls the major functions of the device. + * + * Control Register Bit Definition + */ + +#define XUARTPS_CR_STOPBRK 0x00000100U /**< Stop transmission of break */ +#define XUARTPS_CR_STARTBRK 0x00000080U /**< Set break */ +#define XUARTPS_CR_TORST 0x00000040U /**< RX timeout counter restart */ +#define XUARTPS_CR_TX_DIS 0x00000020U /**< TX disabled. */ +#define XUARTPS_CR_TX_EN 0x00000010U /**< TX enabled */ +#define XUARTPS_CR_RX_DIS 0x00000008U /**< RX disabled. */ +#define XUARTPS_CR_RX_EN 0x00000004U /**< RX enabled */ +#define XUARTPS_CR_EN_DIS_MASK 0x0000003CU /**< Enable/disable Mask */ +#define XUARTPS_CR_TXRST 0x00000002U /**< TX logic reset */ +#define XUARTPS_CR_RXRST 0x00000001U /**< 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 0x00000400U /**< Input clock selection */ +#define XUARTPS_MR_CHMODE_R_LOOP 0x00000300U /**< Remote loopback mode */ +#define XUARTPS_MR_CHMODE_L_LOOP 0x00000200U /**< Local loopback mode */ +#define XUARTPS_MR_CHMODE_ECHO 0x00000100U /**< Auto echo mode */ +#define XUARTPS_MR_CHMODE_NORM 0x00000000U /**< Normal mode */ +#define XUARTPS_MR_CHMODE_SHIFT 8U /**< Mode shift */ +#define XUARTPS_MR_CHMODE_MASK 0x00000300U /**< Mode mask */ +#define XUARTPS_MR_STOPMODE_2_BIT 0x00000080U /**< 2 stop bits */ +#define XUARTPS_MR_STOPMODE_1_5_BIT 0x00000040U /**< 1.5 stop bits */ +#define XUARTPS_MR_STOPMODE_1_BIT 0x00000000U /**< 1 stop bit */ +#define XUARTPS_MR_STOPMODE_SHIFT 6U /**< Stop bits shift */ +#define XUARTPS_MR_STOPMODE_MASK 0x000000A0U /**< Stop bits mask */ +#define XUARTPS_MR_PARITY_NONE 0x00000020U /**< No parity mode */ +#define XUARTPS_MR_PARITY_MARK 0x00000018U /**< Mark parity mode */ +#define XUARTPS_MR_PARITY_SPACE 0x00000010U /**< Space parity mode */ +#define XUARTPS_MR_PARITY_ODD 0x00000008U /**< Odd parity mode */ +#define XUARTPS_MR_PARITY_EVEN 0x00000000U /**< Even parity mode */ +#define XUARTPS_MR_PARITY_SHIFT 3U /**< Parity setting shift */ +#define XUARTPS_MR_PARITY_MASK 0x00000038U /**< Parity mask */ +#define XUARTPS_MR_CHARLEN_6_BIT 0x00000006U /**< 6 bits data */ +#define XUARTPS_MR_CHARLEN_7_BIT 0x00000004U /**< 7 bits data */ +#define XUARTPS_MR_CHARLEN_8_BIT 0x00000000U /**< 8 bits data */ +#define XUARTPS_MR_CHARLEN_SHIFT 1U /**< Data Length shift */ +#define XUARTPS_MR_CHARLEN_MASK 0x00000006U /**< Data length mask */ +#define XUARTPS_MR_CLKSEL 0x00000001U /**< 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_RBRK 0x00002000U /**< Rx FIFO break detect interrupt */ +#define XUARTPS_IXR_TOVR 0x00001000U /**< Tx FIFO Overflow interrupt */ +#define XUARTPS_IXR_TNFUL 0x00000800U /**< Tx FIFO Nearly Full interrupt */ +#define XUARTPS_IXR_TTRIG 0x00000400U /**< Tx Trig interrupt */ +#define XUARTPS_IXR_DMS 0x00000200U /**< Modem status change interrupt */ +#define XUARTPS_IXR_TOUT 0x00000100U /**< Timeout error interrupt */ +#define XUARTPS_IXR_PARITY 0x00000080U /**< Parity error interrupt */ +#define XUARTPS_IXR_FRAMING 0x00000040U /**< Framing error interrupt */ +#define XUARTPS_IXR_OVER 0x00000020U /**< Overrun error interrupt */ +#define XUARTPS_IXR_TXFULL 0x00000010U /**< TX FIFO full interrupt. */ +#define XUARTPS_IXR_TXEMPTY 0x00000008U /**< TX FIFO empty interrupt. */ +#define XUARTPS_IXR_RXFULL 0x00000004U /**< RX FIFO full interrupt. */ +#define XUARTPS_IXR_RXEMPTY 0x00000002U /**< RX FIFO empty interrupt. */ +#define XUARTPS_IXR_RXOVR 0x00000001U /**< RX FIFO trigger interrupt. */ +#define XUARTPS_IXR_MASK 0x00003FFFU /**< 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 0x00000000U /**< Disable clock */ +#define XUARTPS_BAUDGEN_MASK 0x0000FFFFU /**< Valid bits mask */ +#define XUARTPS_BAUDGEN_RESET_VAL 0x0000028BU /**< 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 0x000000FFU /**< 8 bit baud divider mask */ +#define XUARTPS_BAUDDIV_RESET_VAL 0x0000000FU /**< 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 0x00000000U /**< Disable time out */ +#define XUARTPS_RXTOUT_MASK 0x000000FFU /**< 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 0x00000000U /**< Disable RX trigger interrupt */ +#define XUARTPS_RXWM_MASK 0x0000003FU /**< Valid bits mask */ +#define XUARTPS_RXWM_RESET_VAL 0x00000020U /**< 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 0x0000003FU /**< Valid bits mask */ +#define XUARTPS_TXWM_RESET_VAL 0x00000020U /**< 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 0x00000020U /**< Flow control mode */ +#define XUARTPS_MODEMCR_RTS 0x00000002U /**< Request to send */ +#define XUARTPS_MODEMCR_DTR 0x00000001U /**< 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 0x00000100U /**< Flow control mode (FCMS) */ +#define XUARTPS_MODEMSR_DCD 0x00000080U /**< Complement of DCD input */ +#define XUARTPS_MODEMSR_RI 0x00000040U /**< Complement of RI input */ +#define XUARTPS_MODEMSR_DSR 0x00000020U /**< Complement of DSR input */ +#define XUARTPS_MODEMSR_CTS 0x00000010U /**< Complement of CTS input */ +#define XUARTPS_MODEMSR_DDCD 0x00000008U /**< Delta DCD indicator */ +#define XUARTPS_MODEMSR_TERI 0x00000004U /**< Trailing Edge Ring Indicator */ +#define XUARTPS_MODEMSR_DDSR 0x00000002U /**< Change of DSR */ +#define XUARTPS_MODEMSR_DCTS 0x00000001U /**< 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 0x00004000U /**< TX FIFO Nearly Full Status */ +#define XUARTPS_SR_TTRIG 0x00002000U /**< TX FIFO Trigger Status */ +#define XUARTPS_SR_FLOWDEL 0x00001000U /**< RX FIFO fill over flow delay */ +#define XUARTPS_SR_TACTIVE 0x00000800U /**< TX active */ +#define XUARTPS_SR_RACTIVE 0x00000400U /**< RX active */ +#define XUARTPS_SR_TXFULL 0x00000010U /**< TX FIFO full */ +#define XUARTPS_SR_TXEMPTY 0x00000008U /**< TX FIFO empty */ +#define XUARTPS_SR_RXFULL 0x00000004U /**< RX FIFO full */ +#define XUARTPS_SR_RXEMPTY 0x00000002U /**< RX FIFO empty */ +#define XUARTPS_SR_RXOVR 0x00000001U /**< 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 */ +/* @} */ + +/** @name Receiver FIFO Byte Status Register + * + * The Receiver FIFO Status register is used to have a continuous + * monitoring of the raw unmasked byte status information. The register + * contains frame, parity and break status information for the top + * four bytes in the RX FIFO. + * + * Receiver FIFO Byte Status Register Bit Definition + * @{ + */ +#define XUARTPS_RXBS_BYTE3_BRKE 0x00000800U /**< Byte3 Break Error */ +#define XUARTPS_RXBS_BYTE3_FRME 0x00000400U /**< Byte3 Frame Error */ +#define XUARTPS_RXBS_BYTE3_PARE 0x00000200U /**< Byte3 Parity Error */ +#define XUARTPS_RXBS_BYTE2_BRKE 0x00000100U /**< Byte2 Break Error */ +#define XUARTPS_RXBS_BYTE2_FRME 0x00000080U /**< Byte2 Frame Error */ +#define XUARTPS_RXBS_BYTE2_PARE 0x00000040U /**< Byte2 Parity Error */ +#define XUARTPS_RXBS_BYTE1_BRKE 0x00000020U /**< Byte1 Break Error */ +#define XUARTPS_RXBS_BYTE1_FRME 0x00000010U /**< Byte1 Frame Error */ +#define XUARTPS_RXBS_BYTE1_PARE 0x00000008U /**< Byte1 Parity Error */ +#define XUARTPS_RXBS_BYTE0_BRKE 0x00000004U /**< Byte0 Break Error */ +#define XUARTPS_RXBS_BYTE0_FRME 0x00000002U /**< Byte0 Frame Error */ +#define XUARTPS_RXBS_BYTE0_PARE 0x00000001U /**< Byte0 Parity Error */ +#define XUARTPS_RXBS_MASK 0x00000007U /**< 3 bit RX byte status 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) + (u32)(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) + (u32)(RegOffset), (u32)(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) & \ + (u32)XUARTPS_SR_RXEMPTY) == (u32)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) & \ + (u32)XUARTPS_SR_TXFULL) == (u32)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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps.h new file mode 100644 index 0000000..b5c472e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps.h @@ -0,0 +1,1098 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps.h +* @addtogroup usbps_v2_4 +* @{ +* @details + * + * This file contains the implementation of the XUsbPs driver. It is the + * driver for an USB controller in DEVICE or HOST mode. + * + *

    Introduction

    + * + * 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. + * + *

    USB Controller Features

    + * + * - 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 + * + *

    Initialization & Configuration

    + * + * 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 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. + * + * + *

    USB Device Endpoints

    + * + * 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. + * + * + *

    Interrupt Handling

    + * + * 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. + * + * + *

    Data buffer handling

    + * + * Data buffers are sent to and received from endpoint using the + * XUsbPs_EpBufferSend(), XUsbPs_EpBufferSendWithZLT() + * 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. + * + * From the controller perspective Data buffers can be aligned at any boundary. + * if the buffers are from cache region then the buffer and buffer size should + * be aligned to cache line aligned + * + * + *

    Zero copy

    + * + * 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. + * + * + *

    DMA

    + * + * 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. + * + * + *
    + * 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.
    + * 2.00a kpc 04/03/14 Fixed CR#777763. Corrected the setup tripwire macro val.
    + * 2.1   kpc 04/28/14 Removed unused function prototypes
    + * 2.2   kpc 08/23/14 Exported XUsbPs_DeviceReset API as global for calling in
    + *                    code coverage tests.
    + * 2.3   kpc 02/19/14 Fixed CR#873972, CR#873974. Corrected the logic for proper
    + *                    moving of dTD Head/Tail Pointers. Invalidate the cache
    + *                    after buffer receive in Endpoint Buffer Handler.
    + * 2.4   sg  04/26/16 Fixed CR#949693, Corrected the logic for EP flush
    + *       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    + *                    generation.
    + *       ms  04/10/17 Modified filename tag to include the file in doxygen
    + *                    examples.
    + * 
    + * + ******************************************************************************/ + +#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 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, \ + 1 << (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_SetSetupTripwire(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_CMD_OFFSET, \ + XUSBPS_CMD_SUTW_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_ClrSetupTripwire(InstancePtr) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_CMD_OFFSET, \ + XUSBPS_CMD_SUTW_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_SetupTripwireIsSet(InstancePtr) \ + (XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_CMD_OFFSET) & \ + XUSBPS_CMD_SUTW_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); + +/** + * Common functions used for DEVICE/HOST mode. + */ +int XUsbPs_Reset(XUsbPs *InstancePtr); + +void XUsbPs_DeviceReset(XUsbPs *InstancePtr); + +/** + * DEVICE mode specific functions. + */ +int XUsbPs_BusReset(XUsbPs *InstancePtr); +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_EpBufferSendWithZLT(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps_endpoint.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps_endpoint.h new file mode 100644 index 0000000..1cb0cfc --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps_endpoint.h @@ -0,0 +1,515 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps_endpoint.h +* @addtogroup usbps_v2_4 +* @{ + * + * 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. + * + *
    + * MODIFICATION HISTORY:
    + *
    + * Ver   Who  Date     Changes
    + * ----- ---- -------- --------------------------------------------------------
    + * 1.00a wgr  10/10/10 First release
    + * 
    + * + ******************************************************************************/ +#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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps_hw.h new file mode 100644 index 0000000..69f3ebf --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/include/xusbps_hw.h @@ -0,0 +1,526 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps_hw.h +* @addtogroup usbps_v2_4 +* @{ + * + * 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. + * + *
    + * 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
    + * 2.00a kpc  04/03/14 Fixed CR#777764. Corrected max endpoint vale and masks 
    + * 
    + * + ******************************************************************************/ +#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 12 /**< Number of supported Endpoints in + * this core. */ +#define XUSBPS_EP_OUT_MASK 0x00000FFF /**< OUR (RX) endpoint mask */ +#define XUSBPS_EP_IN_MASK 0x0FFF0000 /**< IN (TX) endpoint mask */ +#define XUSBPS_EP_ALL_MASK 0x0FFF0FFF /**< 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps.c new file mode 100644 index 0000000..f852de4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps.c @@ -0,0 +1,1205 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcanps.c +* @addtogroup canps_v3_2 +* @{ +* +* Functions in this file are the minimum required functions for the XCanPs +* driver. See xcanps.h for a detailed description of the driver. +* +* @note None. +* +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00a xd/sv  01/12/10 First release
    +* 1.01a bss    12/27/11 Added the APIs XCanPs_SetTxIntrWatermark and
    +* 			XCanPs_GetTxIntrWatermark.
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xcanps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +static void StubHandler(void); + +/*****************************************************************************/ +/* +* +* This function initializes a XCanPs instance/driver. +* +* The initialization entails: +* - Initialize all members of the XCanPs structure. +* - Reset the CAN device. The CAN device will enter Configuration Mode +* immediately after the reset is finished. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param ConfigPtr points to the XCanPs 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 always. +* +* @note None. +* +******************************************************************************/ +s32 XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr, + u32 EffectiveAddr) +{ + s32 Status; + 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 = 0U; + InstancePtr->CanConfig.BaseAddr = EffectiveAddr; + InstancePtr->CanConfig.DeviceId = ConfigPtr->DeviceId; + + /* + * Set all handlers to stub values, let user configure this data later. + */ + InstancePtr->SendHandler = (XCanPs_SendRecvHandler) StubHandler; + InstancePtr->RecvHandler = (XCanPs_SendRecvHandler) StubHandler; + InstancePtr->ErrorHandler = (XCanPs_ErrorHandler) StubHandler; + InstancePtr->EventHandler = (XCanPs_EventHandler) StubHandler; + + /* + * Indicate the component is now ready to use. + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + /* + * Reset the device to get it into its initial state. + */ + XCanPs_Reset(InstancePtr); + + Status = XST_SUCCESS; + return Status; +} + +/*****************************************************************************/ +/** +* +* This function resets the CAN device. Calling this function resets the device +* immediately, and any pending transmission or reception is terminated at once. +* Both Object Layer and Transfer Layer are reset. This function does not reset +* the Physical Layer. All registers are reset to the default values, and no +* previous status will be restored. TX FIFO, RX FIFO and TX High Priority +* Buffer are also reset. +* +* When a reset is required due to an internal error, the driver notifies the +* upper layer software of this need through the error status code or interrupts. +* The upper layer software is responsible for calling this Reset function and +* then re-configuring the device. +* +* The CAN device will be in Configuration Mode immediately after this function +* returns. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XCanPs_Reset(XCanPs *InstancePtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_SRR_OFFSET, \ + XCANPS_SRR_SRST_MASK); +} + +/****************************************************************************/ +/** +* +* This routine returns the current operation mode of the CAN device. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - XCANPS_MODE_CONFIG if the device is in Configuration Mode. +* - XCANPS_MODE_SLEEP if the device is in Sleep Mode. +* - XCANPS_MODE_NORMAL if the device is in Normal Mode. +* - XCANPS_MODE_LOOPBACK if the device is in Loop Back Mode. +* - XCANPS_MODE_SNOOP if the device is in Snoop Mode. +* +* @note None. +* +*****************************************************************************/ +u8 XCanPs_GetMode(XCanPs *InstancePtr) +{ + u32 StatusReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + StatusReg = XCanPs_GetStatus(InstancePtr); + + if ((StatusReg & XCANPS_SR_CONFIG_MASK) != (u32)0) { + return (u8)XCANPS_MODE_CONFIG; + + } + else if ((StatusReg & XCANPS_SR_SLEEP_MASK) != (u32)0) { + return (u8)XCANPS_MODE_SLEEP; + + } + else if ((StatusReg & XCANPS_SR_NORMAL_MASK) != (u32)0) { + if ((StatusReg & XCANPS_SR_SNOOP_MASK) != (u32)0) { + return (u8)XCANPS_MODE_SNOOP; + } else { + return (u8)XCANPS_MODE_NORMAL; + } + } + else { + /* + * If this line is reached, the device is in Loop Back Mode. + */ + return (u8)XCANPS_MODE_LOOPBACK; + } +} + +/*****************************************************************************/ +/** +* +* This function allows the CAN device to enter one of the following operation +* modes: +* - Configuration Mode: Pass in parameter XCANPS_MODE_CONFIG +* - Sleep Mode: Pass in parameter XCANPS_MODE_SLEEP +* - Normal Mode: Pass in parameter XCANPS_MODE_NORMAL +* - Loop Back Mode: Pass in parameter XCANPS_MODE_LOOPBACK. +* - Snoop Mode: Pass in parameter XCANPS_MODE_SNOOP. +* +* Read the xcanps.h file and device specification for detailed description of +* each operation mode. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param OperationMode specify which operation mode to enter. Valid value +* is any of XCANPS_MODE_* defined in xcanps.h. Multiple modes +* can not be entered at the same time. +* +* @return None. +* +* @note +* +* This function does NOT ensure CAN device enters the specified operation mode +* before it returns the control to the caller. The caller is responsible for +* checking current operation mode using XCanPs_GetMode(). +* +******************************************************************************/ +void XCanPs_EnterMode(XCanPs *InstancePtr, u8 OperationMode) +{ + u8 CurrentMode; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((OperationMode == (u8)XCANPS_MODE_CONFIG) || + (OperationMode == (u8)XCANPS_MODE_SLEEP) || + (OperationMode == (u8)XCANPS_MODE_NORMAL) || + (OperationMode == (u8)XCANPS_MODE_LOOPBACK) || + (OperationMode == (u8)XCANPS_MODE_SNOOP)); + + CurrentMode = XCanPs_GetMode(InstancePtr); + + /* + * If current mode is Normal Mode and the mode to enter is Sleep Mode, + * or if current mode is Sleep Mode and the mode to enter is Normal + * Mode, no transition through Configuration Mode is needed. + */ + if ((CurrentMode == (u8)XCANPS_MODE_NORMAL) && + (OperationMode == (u8)XCANPS_MODE_SLEEP)) { + /* + * Normal Mode ---> Sleep Mode + */ + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_MSR_OFFSET, XCANPS_MSR_SLEEP_MASK); + return; + + } else if ((CurrentMode == (u8)XCANPS_MODE_SLEEP) && + (OperationMode == (u8)XCANPS_MODE_NORMAL)) { + /* + * Sleep Mode ---> Normal Mode + */ + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_MSR_OFFSET, 0U); + return; + } + else { + /*This else was made for misra-c compliance*/ + ; + } + + /* + * If the mode transition is not any of the two cases above, CAN must + * enter Configuration Mode before switching into the target operation + * mode. + */ + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_SRR_OFFSET, 0U); + + /* + * Check if the device has entered Configuration Mode, if not, return to + * the caller. + */ + if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) { + return; + } + + switch (OperationMode) { + case XCANPS_MODE_CONFIG: + /* + * As CAN is in Configuration Mode already. + * Nothing is needed to be done here. + */ + break; + + case XCANPS_MODE_SLEEP: + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_MSR_OFFSET, XCANPS_MSR_SLEEP_MASK); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_SRR_OFFSET, XCANPS_SRR_CEN_MASK); + break; + + case XCANPS_MODE_NORMAL: + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_MSR_OFFSET, 0U); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_SRR_OFFSET, XCANPS_SRR_CEN_MASK); + break; + + case XCANPS_MODE_LOOPBACK: + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_MSR_OFFSET, XCANPS_MSR_LBACK_MASK); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_SRR_OFFSET, XCANPS_SRR_CEN_MASK); + break; + + case XCANPS_MODE_SNOOP: + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_MSR_OFFSET, XCANPS_MSR_SNOOP_MASK); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_SRR_OFFSET, XCANPS_SRR_CEN_MASK); + break; + + default: + /*This default was made for misra-c compliance*/ + break; + + } +} + +/*****************************************************************************/ +/** +* +* This function returns Status value from Status Register (SR). Use the +* XCANPS_SR_* constants defined in xcanps_hw.h to interpret the returned +* value. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return The 32-bit value read from Status Register. +* +* @note None. +* +******************************************************************************/ +u32 XCanPs_GetStatus(XCanPs *InstancePtr) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + return XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_SR_OFFSET); +} + +/*****************************************************************************/ +/** +* +* This function reads Receive and Transmit error counters. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param RxErrorCount is a pointer to data in which the Receive Error +* counter value is returned. +* @param TxErrorCount is a pointer to data in which the Transmit Error +* counter value is returned. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XCanPs_GetBusErrorCounter(XCanPs *InstancePtr, u8 *RxErrorCount, + u8 *TxErrorCount) +{ + u32 ErrorCount; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(RxErrorCount != NULL); + Xil_AssertVoid(TxErrorCount != NULL); + /* + * Read Error Counter Register and parse it. + */ + ErrorCount = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_ECR_OFFSET); + *RxErrorCount = (u8)((ErrorCount & XCANPS_ECR_REC_MASK) >> + XCANPS_ECR_REC_SHIFT); + *TxErrorCount = (u8)(ErrorCount & XCANPS_ECR_TEC_MASK); +} + +/*****************************************************************************/ +/** +* +* This function reads Error Status value from Error Status Register (ESR). Use +* the XCANPS_ESR_* constants defined in xcanps_hw.h to interpret the +* returned value. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return The 32-bit value read from Error Status Register. +* +* @note None. +* +******************************************************************************/ +u32 XCanPs_GetBusErrorStatus(XCanPs *InstancePtr) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + return XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_ESR_OFFSET); +} + +/*****************************************************************************/ +/** +* +* This function clears Error Status bit(s) previously set in Error +* Status Register (ESR). Use the XCANPS_ESR_* constants defined in xcanps_hw.h +* to create the value to pass in. If a bit was cleared in Error Status Register +* before this function is called, it will not be modified. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @param Mask is he 32-bit mask used to clear bits in Error Status +* Register. Multiple XCANPS_ESR_* values can be 'OR'ed to clear +* multiple bits. +* +* @note None. +* +******************************************************************************/ +void XCanPs_ClearBusErrorStatus(XCanPs *InstancePtr, u32 Mask) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_ESR_OFFSET, Mask); +} + +/*****************************************************************************/ +/** +* +* This function sends a CAN Frame. If the TX FIFO is not full then the given +* frame is written into the the TX FIFO otherwise, it returns an error code +* immediately. +* This function does not wait for the given frame being sent to CAN bus. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param FramePtr is a pointer to a 32-bit aligned buffer containing the +* CAN frame to be sent. +* +* @return +* - XST_SUCCESS if TX FIFO was not full and the given frame was +* written into the FIFO. +* - XST_FIFO_NO_ROOM if there is no room in the TX FIFO for the +* given frame. +* +* @note None. +* +******************************************************************************/ +s32 XCanPs_Send(XCanPs *InstancePtr, u32 *FramePtr) +{ + s32 Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(FramePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + if (XCanPs_IsTxFifoFull(InstancePtr) == TRUE) { + Status = XST_FIFO_NO_ROOM; + } else { + + /* + * Write IDR, DLC, Data Word 1 and Data Word 2 to the CAN device. + */ + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_TXFIFO_ID_OFFSET, FramePtr[0]); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_TXFIFO_DLC_OFFSET, FramePtr[1]); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_TXFIFO_DW1_OFFSET, Xil_EndianSwap32(FramePtr[2])); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_TXFIFO_DW2_OFFSET, Xil_EndianSwap32(FramePtr[3])); + + Status = XST_SUCCESS; + } + return Status; +} + +/*****************************************************************************/ +/** +* +* This function receives a CAN Frame. This function first checks if RX FIFO is +* empty, if not, it then reads a frame from the RX FIFO into the given buffer. +* This function returns error code immediately if there is no frame in the RX +* FIFO. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param FramePtr is a pointer to a 32-bit aligned buffer where the CAN +* frame to be written. +* +* @return +* - XST_SUCCESS if RX FIFO was not empty and a frame was read from +* RX FIFO successfully and written into the given buffer. +* - XST_NO_DATA if there is no frame to be received from the FIFO. +* +* @note None. +* +******************************************************************************/ +s32 XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr) +{ + s32 Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(FramePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + if (XCanPs_IsRxEmpty(InstancePtr) == TRUE) { + Status = XST_NO_DATA; + } else { + + /* + * Read IDR, DLC, Data Word 1 and Data Word 2 from the CAN device. + */ + FramePtr[0] = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_RXFIFO_ID_OFFSET); + FramePtr[1] = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_RXFIFO_DLC_OFFSET); + FramePtr[2] = Xil_EndianSwap32(XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_RXFIFO_DW1_OFFSET)); + FramePtr[3] = Xil_EndianSwap32(XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_RXFIFO_DW2_OFFSET)); + + /* + * Clear RXNEMP bit in ISR. This allows future XCanPs_IsRxEmpty() call + * returns correct RX FIFO occupancy/empty condition. + */ + XCanPs_IntrClear(InstancePtr, XCANPS_IXR_RXNEMP_MASK); + + Status = XST_SUCCESS; + } + return Status; +} + +/*****************************************************************************/ +/** +* +* This routine sends a CAN High Priority frame. This function first checks if +* TX High Priority Buffer is empty. If yes, it then writes the given frame into +* the Buffer. If not, this function returns immediately. This function does not +* wait for the given frame being sent to CAN bus. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param FramePtr is a pointer to a 32-bit aligned buffer containing the +* CAN High Priority frame to be sent. +* +* @return +* - XST_SUCCESS if TX High Priority Buffer was not full and the +* given frame was written into the buffer. +* - XST_FIFO_NO_ROOM if there is no room in the TX High Priority +* Buffer for this frame. +* +* @note +* +* If the frame needs to be sent immediately and not delayed by processor's +* interrupt handling, the caller should disable interrupt at processor +* level before invoking this function. +* +******************************************************************************/ +s32 XCanPs_SendHighPriority(XCanPs *InstancePtr, u32 *FramePtr) +{ + s32 Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(FramePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + if (XCanPs_IsHighPriorityBufFull(InstancePtr) == TRUE) { + Status = XST_FIFO_NO_ROOM; + } else { + + /* + * Write IDR, DLC, Data Word 1 and Data Word 2 to the CAN device. + */ + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_TXHPB_ID_OFFSET, FramePtr[0]); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_TXHPB_DLC_OFFSET, FramePtr[1]); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_TXHPB_DW1_OFFSET, Xil_EndianSwap32(FramePtr[2])); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_TXHPB_DW2_OFFSET, Xil_EndianSwap32(FramePtr[3])); + + Status = XST_SUCCESS; + } + return Status; +} + +/*****************************************************************************/ +/** +* +* This routine enables individual acceptance filters. Up to 4 filters could +* be enabled. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param FilterIndexes specifies which filter(s) to enable. Use +* any XCANPS_AFR_UAF*_MASK to enable one filter, and "Or" +* multiple XCANPS_AFR_UAF*_MASK values if multiple filters need +* to be enabled. Any filter not specified in this parameter will +* keep its previous enable/disable setting. +* +* @return None. +* +* @note None. +* +* +******************************************************************************/ +void XCanPs_AcceptFilterEnable(XCanPs *InstancePtr, u32 FilterIndexes) +{ + u32 EnabledFilters; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Calculate the new value and write to AFR. + */ + EnabledFilters = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFR_OFFSET); + EnabledFilters |= FilterIndexes; + EnabledFilters &= (u32)XCANPS_AFR_UAF_ALL_MASK; + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_AFR_OFFSET, + EnabledFilters); +} + +/*****************************************************************************/ +/** +* +* This routine disables individual acceptance filters. Up to 4 filters could +* be disabled. If all acceptance filters are disabled then all the received +* frames are stored in the RX FIFO. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param FilterIndexes specifies which filter(s) to disable. Use +* any XCANPS_AFR_UAF*_MASK to disable one filter, and "Or" +* multiple XCANPS_AFR_UAF*_MASK values if multiple filters need +* to be disabled. Any filter not specified in this parameter will +* keep its previous enable/disable setting. If all acceptance +* filters are disabled then all received frames are stored in the +* RX FIFO. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XCanPs_AcceptFilterDisable(XCanPs *InstancePtr, u32 FilterIndexes) +{ + u32 EnabledFilters; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Calculate the new value and write to AFR. + */ + EnabledFilters = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFR_OFFSET); + EnabledFilters &= (u32)XCANPS_AFR_UAF_ALL_MASK & (~FilterIndexes); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_AFR_OFFSET, + EnabledFilters); +} + +/*****************************************************************************/ +/** +* +* This function returns enabled acceptance filters. Use XCANPS_AFR_UAF*_MASK +* defined in xcanps_hw.h to interpret the returned value. If no acceptance +* filters are enabled then all received frames are stored in the RX FIFO. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return The value stored in Acceptance Filter Register. +* +* @note None. +* +* +******************************************************************************/ +u32 XCanPs_AcceptFilterGetEnabled(XCanPs *InstancePtr) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + return XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFR_OFFSET); + +} + +/*****************************************************************************/ +/** +* +* This function sets values to the Acceptance Filter Mask Register (AFMR) and +* Acceptance Filter ID Register (AFIR) for the specified Acceptance Filter. +* Use XCANPS_IDR_* defined in xcanps_hw.h to create the values to set the +* filter. Read the xcanps.h file and device specification for details. +* +* This function should be called only after: +* - The given filter is disabled by calling XCanPs_AcceptFilterDisable() +* - And the CAN device is ready to accept writes to AFMR and AFIR, i.e., +* XCanPs_IsAcceptFilterBusy() returns FALSE. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param FilterIndex defines which Acceptance Filter Mask and ID Register +* to set. Use any single XCANPS_AFR_UAF*_MASK value. +* @param MaskValue is the value to write to the chosen Acceptance Filter +* Mask Register. +* @param IdValue is the value to write to the chosen Acceptance Filter +* ID Register. +* +* @return +* - XST_SUCCESS if the values were set successfully. +* - XST_FAILURE if the given filter was not disabled, or the CAN +* device was not ready to accept writes to AFMR and AFIR. +* +* @note None. +* +******************************************************************************/ +s32 XCanPs_AcceptFilterSet(XCanPs *InstancePtr, u32 FilterIndex, + u32 MaskValue, u32 IdValue) +{ + u32 EnabledFilters; + s32 Status; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((FilterIndex == XCANPS_AFR_UAF4_MASK) || + (FilterIndex == XCANPS_AFR_UAF3_MASK) || + (FilterIndex == XCANPS_AFR_UAF2_MASK) || + (FilterIndex == XCANPS_AFR_UAF1_MASK)); + + /* + * Return an error if the given filter is currently enabled. + */ + EnabledFilters = XCanPs_AcceptFilterGetEnabled(InstancePtr); + if ((EnabledFilters & FilterIndex) == FilterIndex) { + Status = XST_FAILURE; + } else { + + /* + * If the CAN device is not ready to accept writes to AFMR and AFIR, + * return error code. + */ + if (XCanPs_IsAcceptFilterBusy(InstancePtr) == TRUE) { + Status = XST_FAILURE; + } else { + + /* + * Write to the AFMR and AFIR of the specified filter. + */ + switch (FilterIndex) { + case XCANPS_AFR_UAF1_MASK: /* Acceptance Filter No. 1 */ + + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFMR1_OFFSET, MaskValue); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFIR1_OFFSET, IdValue); + break; + + case XCANPS_AFR_UAF2_MASK: /* Acceptance Filter No. 2 */ + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFMR2_OFFSET, MaskValue); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFIR2_OFFSET, IdValue); + break; + + case XCANPS_AFR_UAF3_MASK: /* Acceptance Filter No. 3 */ + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFMR3_OFFSET, MaskValue); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFIR3_OFFSET, IdValue); + break; + + case XCANPS_AFR_UAF4_MASK: /* Acceptance Filter No. 4 */ + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFMR4_OFFSET, MaskValue); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFIR4_OFFSET, IdValue); + break; + + default: + /*This default was made for misra-c compliance*/ + break; + } + + Status = XST_SUCCESS; + } + } + return Status; +} + +/*****************************************************************************/ +/** +* +* This function reads the values of the Acceptance Filter Mask and ID Register +* for the specified Acceptance Filter. Use XCANPS_IDR_* defined in xcanps_hw.h +* to interpret the values. Read the xcanps.h file and device specification for +* details. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param FilterIndex defines which Acceptance Filter Mask Register to get +* Mask and ID from. Use any single XCANPS_FILTER_* value. +* @param MaskValue is a pointer to the data in which the Mask value read +* from the chosen Acceptance Filter Mask Register is returned. +* @param IdValue is a pointer to the data in which the ID value read +* from the chosen Acceptance Filter ID Register is returned. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XCanPs_AcceptFilterGet(XCanPs *InstancePtr, u32 FilterIndex, + u32 *MaskValue, u32 *IdValue) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((FilterIndex == XCANPS_AFR_UAF4_MASK) || + (FilterIndex == XCANPS_AFR_UAF3_MASK) || + (FilterIndex == XCANPS_AFR_UAF2_MASK) || + (FilterIndex == XCANPS_AFR_UAF1_MASK)); + Xil_AssertVoid(MaskValue != NULL); + Xil_AssertVoid(IdValue != NULL); + + /* + * Read from the AFMR and AFIR of the specified filter. + */ + switch (FilterIndex) { + case XCANPS_AFR_UAF1_MASK: /* Acceptance Filter No. 1 */ + *MaskValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFMR1_OFFSET); + *IdValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFIR1_OFFSET); + break; + + case XCANPS_AFR_UAF2_MASK: /* Acceptance Filter No. 2 */ + *MaskValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFMR2_OFFSET); + *IdValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFIR2_OFFSET); + break; + + case XCANPS_AFR_UAF3_MASK: /* Acceptance Filter No. 3 */ + *MaskValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFMR3_OFFSET); + *IdValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFIR3_OFFSET); + break; + + case XCANPS_AFR_UAF4_MASK: /* Acceptance Filter No. 4 */ + *MaskValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFMR4_OFFSET); + *IdValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_AFIR4_OFFSET); + break; + + default: + /*This default was made for misra-c compliance*/ + break; + } +} + +/*****************************************************************************/ +/** +* +* This routine sets Baud Rate Prescaler value. The system clock for the CAN +* controller is divided by (Prescaler + 1) to generate the quantum clock +* needed for sampling and synchronization. Read the device specification +* for details. +* +* Baud Rate Prescaler can be set only if the CAN device is in Configuration +* Mode. Call XCanPs_EnterMode() to enter Configuration Mode before using this +* function. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param Prescaler is the value to set. Valid values are from 0 to 255. +* +* @return +* - XST_SUCCESS if the Baud Rate Prescaler value is set +* successfully. +* - XST_FAILURE if CAN device is not in Configuration Mode. +* +* @note None. +* +******************************************************************************/ +s32 XCanPs_SetBaudRatePrescaler(XCanPs *InstancePtr, u8 Prescaler) +{ + s32 Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) { + Status = XST_FAILURE; + } else { + + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_BRPR_OFFSET, + (u32)Prescaler); + + Status = XST_SUCCESS; + } + return Status; +} + +/*****************************************************************************/ +/** +* +* This routine gets Baud Rate Prescaler value. The system clock for the CAN +* controller is divided by (Prescaler + 1) to generate the quantum clock +* needed for sampling and synchronization. Read the device specification for +* details. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return Current used Baud Rate Prescaler value. The value's range is +* from 0 to 255. +* +* @note None. +* +******************************************************************************/ +u8 XCanPs_GetBaudRatePrescaler(XCanPs *InstancePtr) +{ + u32 ReadValue; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + ReadValue = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_BRPR_OFFSET); + return ((u8)ReadValue); +} + +/*****************************************************************************/ +/** +* +* This routine sets Bit time. Time segment 1, Time segment 2 and +* Synchronization Jump Width are set in this function. Device specification +* requires the values passed into this function be one less than the actual +* values of these fields. Read the device specification for details. +* +* Bit time can be set only if the CAN device is in Configuration Mode. +* Call XCanPs_EnterMode() to enter Configuration Mode before using this +* function. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param SyncJumpWidth is the Synchronization Jump Width value to set. +* Valid values are from 0 to 3. +* @param TimeSegment2 is the Time Segment 2 value to set. Valid values +* are from 0 to 7. +* @param TimeSegment1 is the Time Segment 1 value to set. Valid values +* are from 0 to 15. +* +* @return +* - XST_SUCCESS if the Bit time is set successfully. +* - XST_FAILURE if CAN device is not in Configuration Mode. +* +* @note None. +* +******************************************************************************/ +s32 XCanPs_SetBitTiming(XCanPs *InstancePtr, u8 SyncJumpWidth, + u8 TimeSegment2, u8 TimeSegment1) +{ + u32 Value; + s32 Status; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(SyncJumpWidth <= (u8)3U); + Xil_AssertNonvoid(TimeSegment2 <= (u8)7U); + Xil_AssertNonvoid(TimeSegment1 <= (u8)15U ); + + if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) { + Status = XST_FAILURE; + } else { + + Value = ((u32) TimeSegment1) & XCANPS_BTR_TS1_MASK; + Value |= (((u32) TimeSegment2) << XCANPS_BTR_TS2_SHIFT) & + XCANPS_BTR_TS2_MASK; + Value |= (((u32) SyncJumpWidth) << XCANPS_BTR_SJW_SHIFT) & + XCANPS_BTR_SJW_MASK; + + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_BTR_OFFSET, Value); + + Status = XST_SUCCESS; + } + return Status; +} + +/*****************************************************************************/ +/** +* +* This routine gets Bit time. Time segment 1, Time segment 2 and +* Synchronization Jump Width values are read in this function. According to +* device specification, the actual value of each of these fields is one +* more than the value read. Read the device specification for details. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param SyncJumpWidth will store the Synchronization Jump Width value +* after this function returns. Its value ranges from 0 to 3. +* @param TimeSegment2 will store the Time Segment 2 value after this +* function returns. Its value ranges from 0 to 7. +* @param TimeSegment1 will store the Time Segment 1 value after this +* function returns. Its value ranges from 0 to 15. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XCanPs_GetBitTiming(XCanPs *InstancePtr, u8 *SyncJumpWidth, + u8 *TimeSegment2, u8 *TimeSegment1) +{ + u32 Value; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(SyncJumpWidth != NULL); + Xil_AssertVoid(TimeSegment2 != NULL); + Xil_AssertVoid(TimeSegment1 != NULL); + + Value = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_BTR_OFFSET); + + *TimeSegment1 = (u8) (Value & XCANPS_BTR_TS1_MASK); + *TimeSegment2 = + (u8) ((Value & XCANPS_BTR_TS2_MASK) >> XCANPS_BTR_TS2_SHIFT); + *SyncJumpWidth = + (u8) ((Value & XCANPS_BTR_SJW_MASK) >> XCANPS_BTR_SJW_SHIFT); +} + + +/****************************************************************************/ +/** +* +* This routine sets the Rx Full threshold in the Watermark Interrupt Register. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param Threshold is the threshold to be set. The valid values are +* from 1 to 63. +* +* @return +* - XST_FAILURE - If the CAN device is not in Configuration Mode. +* - XST_SUCCESS - If the Rx Full threshold is set in Watermark +* Interrupt Register. +* +* @note The threshold can only be set when the CAN device is in the +* configuration mode. +* +*****************************************************************************/ +s32 XCanPs_SetRxIntrWatermark(XCanPs *InstancePtr, u8 Threshold) +{ + + u32 ThrReg; + s32 Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Threshold <= (u8)63); + + if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) { + Status = XST_FAILURE; + } else { + + ThrReg = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_WIR_OFFSET); + + ThrReg &= XCANPS_WIR_EW_MASK; + ThrReg |= ((u32)Threshold & XCANPS_WIR_FW_MASK); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_WIR_OFFSET, ThrReg); + + Status = XST_SUCCESS; + } + return Status; +} + +/****************************************************************************/ +/** +* +* This routine gets the Rx Full threshold from the Watermark Interrupt Register. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return The Rx FIFO full watermark threshold value. The valid values +* are 1 to 63. +* +* @note None. +* +*****************************************************************************/ +u8 XCanPs_GetRxIntrWatermark(XCanPs *InstancePtr) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + return (u8) (XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_WIR_OFFSET) & + XCANPS_WIR_FW_MASK); +} + + +/****************************************************************************/ +/** +* +* This routine sets the Tx Empty Threshold in the Watermark Interrupt Register. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param Threshold is the threshold to be set. The valid values are +* from 1 to 63. +* +* @return +* - XST_FAILURE - If the CAN device is not in Configuration Mode. +* - XST_SUCCESS - If the threshold is set in Watermark +* Interrupt Register. +* +* @note The threshold can only be set when the CAN device is in the +* configuration mode. +* +*****************************************************************************/ +s32 XCanPs_SetTxIntrWatermark(XCanPs *InstancePtr, u8 Threshold) +{ + u32 ThrReg; + s32 Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Threshold <= (u8)63); + + if (XCanPs_GetMode(InstancePtr) != (u8)XCANPS_MODE_CONFIG) { + Status = XST_FAILURE; + } else { + + ThrReg = XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_WIR_OFFSET); + + ThrReg &= XCANPS_WIR_FW_MASK; + ThrReg |= (((u32)Threshold << XCANPS_WIR_EW_SHIFT) + & XCANPS_WIR_EW_MASK); + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_WIR_OFFSET, ThrReg); + + Status = XST_SUCCESS; + } + return Status; +} + +/****************************************************************************/ +/** +* +* This routine gets the Tx Empty threshold from Watermark Interrupt Register. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return The Tx Empty FIFO threshold value. The valid values are 1 to 63. +* +* @note None. +* +*****************************************************************************/ +u8 XCanPs_GetTxIntrWatermark(XCanPs *InstancePtr) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + return (u8) ((XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_WIR_OFFSET) & XCANPS_WIR_EW_MASK) >> + XCANPS_WIR_EW_SHIFT); +} + + + +/******************************************************************************/ +/* + * This routine 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. + * + ******************************************************************************/ +static void StubHandler(void) +{ + Xil_AssertVoidAlways(); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps.h new file mode 100644 index 0000000..9feb45e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps.h @@ -0,0 +1,577 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcanps.h +* @addtogroup canps_v3_2 +* @{ +* @details +* +* The Xilinx CAN driver component. This component supports the Xilinx +* CAN Controller. +* +* The CAN Controller supports the following features: +* - Confirms to the ISO 11898-1, CAN 2.0A and CAN 2.0B standards. +* - Supports both Standard (11 bit Identifier) and Extended (29 bit +* Identifier) frames. +* - Supports Bit Rates up to 1 Mbps. +* - Transmit message object FIFO with a user configurable depth of +* up to 64 message objects. +* - Transmit prioritization through one TX High Priority Buffer. +* - Receive message object FIFO with a user configurable depth of +* up to 64 message objects. +* - Watermark interrupts for Rx FIFO with configurable Watermark. +* - Acceptance filtering with 4 acceptance filters. +* - Sleep mode with automatic wake up. +* - Loop Back mode for diagnostic applications. +* - Snoop mode for diagnostic applications. +* - Maskable Error and Status Interrupts. +* - Readable Error Counters. +* - External PHY chip required. +* - Receive Timestamp. +* +* The device driver supports all the features listed above, if applicable. +* +* Driver Description +* +* The device driver enables higher layer software (e.g., an application) to +* communicate to the CAN. The driver handles transmission and reception of +* CAN frames, as well as configuration of the controller. The driver is simply a +* pass-through mechanism between a protocol stack and the CAN. A single device +* driver can support multiple CANs. +* +* Since the driver is a simple pass-through mechanism between a protocol stack +* and the CAN, no assembly or disassembly of CAN frames is done at the +* driver-level. This assumes that the protocol stack passes a correctly +* formatted CAN frame to the driver for transmission, and that the driver +* does not validate the contents of an incoming frame +* +* Operation Modes +* +* The CAN controller supports the following modes of operation: +* - Configuration Mode: In this mode the CAN timing parameters and +* Baud Rate Pre-scalar parameters can be changed. In this mode the CAN +* controller loses synchronization with the CAN bus and drives a +* constant recessive bit on the bus line. The Error Counter Register are +* reset. The CAN controller does not receive or transmit any messages +* even if there are pending transmit requests from the TX FIFO or the TX +* High Priority Buffer. The Storage FIFOs and the CAN configuration +* registers are still accessible. +* - Normal Mode:In Normal Mode the CAN controller participates in bus +* communication, by transmitting and receiving messages. +* - Sleep Mode: In Sleep Mode the CAN Controller does not transmit any +* messages. However, if any other node transmits a message, then the CAN +* Controller receives the transmitted message and exits from Sleep Mode. +* If there are new transmission requests from either the TX FIFO or the +* TX High Priority Buffer when the CAN Controller is in Sleep Mode, these +* requests are not serviced, and the CAN Controller continues to remain +* in Sleep Mode. Interrupts are generated when the CAN controller enters +* Sleep mode or Wakes up from Sleep mode. +* - Loop Back Mode: In Loop Back mode, the CAN controller transmits a +* recessive bit stream on to the CAN Bus. Any message that is transmitted +* is looped back to the �Rx� line and acknowledged. The CAN controller +* thus receives any message that it transmits. It does not participate in +* normal bus communication and does not receive any messages that are +* transmitted by other CAN nodes. This mode is used for diagnostic +* purposes. +* - Snoop Mode: In Snoop mode, the CAN controller transmits a +* recessive bit stream on to the CAN Bus and does not participate +* in normal bus communication but receives messages that are transmitted +* by other CAN nodes. This mode is used for diagnostic purposes. +* +* +* Buffer Alignment +* +* It is important to note that frame buffers passed to the driver must be +* 32-bit aligned. +* +* Receive Address Filtering +* +* The device can be set to accept frames whose Identifiers match any of the +* 4 filters set in the Acceptance Filter Mask/ID registers. +* +* The incoming Identifier is masked with the bits in the Acceptance Filter Mask +* Register. This value is compared with the result of masking the bits in the +* Acceptance Filter ID Register with the Acceptance Filter Mask Register. If +* both these values are equal, the message will be stored in the RX FIFO. +* +* Acceptance Filtering is performed by each of the defined acceptance filters. +* If the incoming identifier passes through any acceptance filter then the +* frame is stored in the RX FIFO. +* +* If the Accpetance Filters are not set up then all the received messages are +* stroed in the RX FIFO. +* +* PHY Communication +* +* This driver does not provide any mechanism for directly programming PHY. +* +* Interrupts +* +* The driver has no dependencies on the interrupt controller. The driver +* provides an interrupt handler. User of this driver needs to provide +* callback functions. An interrupt handler example is available with +* the driver. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Device Reset +* +* Bus Off interrupt that can occur in the device requires a device reset. +* The user is responsible for resetting the device and re-configuring it +* based on its needs (the driver does not save the current configuration). +* When integrating into an RTOS, these reset and re-configure obligations are +* taken care of by the OS adapter software if it exists for that RTOS. +* +* Device Configuration +* +* The device can be configured in various ways during the FPGA implementation +* process. Configuration parameters are stored in the xcanps_g.c files. +* A table is defined where each entry contains configuration information +* for a CAN device. This information includes such things as the base address +* of the memory-mapped device. +* +* Asserts +* +* 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. +* +* Building the driver +* +* The XCanPs driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +*

    +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00a xd/sv  01/12/10 First release
    +* 1.01a bss    12/27/11 Added the APIs XCanPs_SetTxIntrWatermark and
    +* 			XCanPs_GetTxIntrWatermark.
    +*			Updated the Register/bit definitions
    +*                       Changed XCANPS_RXFWIR_RXFLL_MASK to XCANPS_WIR_FW_MASK
    +*                       Changed XCANPS_RXWIR_OFFSET to XCANPS_WIR_OFFSET
    +*			Added XCANPS_IXR_TXFEMP_MASK for Tx Fifo Empty
    +*			Changed XCANPS_IXR_RXFLL_MASK to
    +*			XCANPS_IXR_RXFWMFLL_MASK
    +* 			Changed
    +*			XCANPS_TXBUF_ID_OFFSET to XCANPS_TXHPB_ID_OFFSET
    +* 			XCANPS_TXBUF_DLC_OFFSET to XCANPS_TXHPB_DLC_OFFSET
    +*			XCANPS_TXBUF_DW1_OFFSET to XCANPS_TXHPB_DW1_OFFSET
    +*			XCANPS_TXBUF_DW2_OFFSET to XCANPS_TXHPB_DW2_OFFSET
    +* 2.1 adk 		23/08/14 Fixed CR:798792 Peripheral test for CANPS IP in
    +*			SDK claims a 40kbps baud rate but it's not.
    +* 3.0 adk     09/12/14  Added support for Zynq Ultrascale Mp.Also code
    +*			modified for MISRA-C:2012 compliance.
    +* 3.1 adk     10/11/15  Fixed CR#911958 Add support for Tx Watermark example.
    +*			Data mismatch while sending data less than 8 bytes.
    +* 3.1 nsk     12/21/15  Updated XCanPs_IntrHandler in xcanps_intr.c to handle
    +*			error interrupts correctly. CR#925615
    +*     ms      03/17/17  Added readme.txt file in examples folder for doxygen
    +*                       generation.
    +* 
    +* +******************************************************************************/ +#ifndef XCANPS_H /* prevent circular inclusions */ +#define XCANPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xcanps_hw.h" +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + +/** @name CAN operation modes + * @{ + */ +#define XCANPS_MODE_CONFIG 0x00000001U /**< Configuration mode */ +#define XCANPS_MODE_NORMAL 0x00000002U /**< Normal mode */ +#define XCANPS_MODE_LOOPBACK 0x00000004U /**< Loop Back mode */ +#define XCANPS_MODE_SLEEP 0x00000008U /**< Sleep mode */ +#define XCANPS_MODE_SNOOP 0x00000010U /**< Snoop mode */ +/* @} */ + +/** @name Callback identifiers used as parameters to XCanPs_SetHandler() + * @{ + */ +#define XCANPS_HANDLER_SEND 1U /**< Handler type for frame sending interrupt */ +#define XCANPS_HANDLER_RECV 2U /**< Handler type for frame reception interrupt*/ +#define XCANPS_HANDLER_ERROR 3U /**< Handler type for error interrupt */ +#define XCANPS_HANDLER_EVENT 4U /**< Handler type for all other interrupts */ +/* @} */ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for a device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Register base address */ +} XCanPs_Config; + +/******************************************************************************/ +/** + * Callback type for frame sending and reception interrupts. + * + * @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. +*******************************************************************************/ +typedef void (*XCanPs_SendRecvHandler) (void *CallBackRef); + +/******************************************************************************/ +/** + * Callback type for error interrupt. + * + * @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. + * @param ErrorMask is a bit mask indicating the cause of the error. Its + * value equals 'OR'ing one or more XCANPS_ESR_* values defined in + * xcanps_hw.h +*******************************************************************************/ +typedef void (*XCanPs_ErrorHandler) (void *CallBackRef, u32 ErrorMask); + +/******************************************************************************/ +/** + * Callback type for all kinds of interrupts except sending frame interrupt, + * receiving frame interrupt, and error interrupt. + * + * @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. + * @param Mask is a bit mask indicating the pending interrupts. Its value + * equals 'OR'ing one or more XCANPS_IXR_* defined in xcanps_hw.h +*******************************************************************************/ +typedef void (*XCanPs_EventHandler) (void *CallBackRef, u32 Mask); + +/** + * The XCanPs driver instance data. The user is required to allocate a + * variable of this type for every CAN device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XCanPs_Config CanConfig; /**< Device configuration */ + u32 IsReady; /**< Device is initialized and ready */ + + /** + * Callback and callback reference for TXOK interrupt. + */ + XCanPs_SendRecvHandler SendHandler; + void *SendRef; + + /** + * Callback and callback reference for RXOK/RXNEMP/RXFLL interrupts. + */ + XCanPs_SendRecvHandler RecvHandler; + void *RecvRef; + + /** + * Callback and callback reference for ERROR interrupt. + */ + XCanPs_ErrorHandler ErrorHandler; + void *ErrorRef; + + /** + * Callback and callback reference for RXOFLW/RXUFLW/TXBFLL/TXFLL/ + * Wakeup/Sleep/Bus off/ARBLST interrupts. + */ + XCanPs_EventHandler EventHandler; + void *EventRef; + +} XCanPs; + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* This macro checks if the transmission is complete. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if the transmission is done. +* - FALSE if the transmission is not done. +* +* @note C-Style signature: +* int XCanPs_IsTxDone(XCanPs *InstancePtr) +* +*******************************************************************************/ +#define XCanPs_IsTxDone(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_ISR_OFFSET) & XCANPS_IXR_TXOK_MASK) != (u32)0) ? TRUE : FALSE) + + +/****************************************************************************/ +/** +* +* This macro checks if the transmission FIFO is full. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if TX FIFO is full. +* - FALSE if the TX FIFO is NOT full. +* +* @note C-Style signature: +* int XCanPs_IsTxFifoFull(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_IsTxFifoFull(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_SR_OFFSET) & XCANPS_SR_TXFLL_MASK) != (u32)0) ? TRUE : FALSE) + + +/****************************************************************************/ +/** +* +* This macro checks if the Transmission High Priority Buffer is full. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if the TX High Priority Buffer is full. +* - FALSE if the TX High Priority Buffer is NOT full. +* +* @note C-Style signature: +* int XCanPs_IsHighPriorityBufFull(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_IsHighPriorityBufFull(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_SR_OFFSET) & XCANPS_SR_TXBFLL_MASK) != (u32)0) ? TRUE : FALSE) + + +/****************************************************************************/ +/** +* +* This macro checks if the receive FIFO is empty. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if RX FIFO is empty. +* - FALSE if the RX FIFO is NOT empty. +* +* @note C-Style signature: +* int XCanPs_IsRxEmpty(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_IsRxEmpty(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_ISR_OFFSET) & XCANPS_IXR_RXNEMP_MASK) != (u32)0) ? FALSE : TRUE) + + +/****************************************************************************/ +/** +* +* This macro checks if the CAN device is ready for the driver to change +* Acceptance Filter Identifier Registers (AFIR) and Acceptance Filter Mask +* Registers (AFMR). +* +* AFIR and AFMR for a filter are changeable only after the filter is disabled +* and this routine returns FALSE. The filter can be disabled using the +* XCanPs_AcceptFilterDisable function. +* +* Use the XCanPs_Accept_* functions for configuring the acceptance filters. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - TRUE if the device is busy and NOT ready to accept writes to +* AFIR and AFMR. +* - FALSE if the device is ready to accept writes to AFIR and +* AFMR. +* +* @note C-Style signature: +* int XCanPs_IsAcceptFilterBusy(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_IsAcceptFilterBusy(InstancePtr) \ + (((XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), \ + XCANPS_SR_OFFSET) & XCANPS_SR_ACFBSY_MASK) != (u32)0) ? TRUE : FALSE) + + +/****************************************************************************/ +/** +* +* This macro calculates CAN message identifier value given identifier field +* values. +* +* @param StandardId contains Standard Message ID value. +* @param SubRemoteTransReq contains Substitute Remote Transmission +* Request value. +* @param IdExtension contains Identifier Extension value. +* @param ExtendedId contains Extended Message ID value. +* @param RemoteTransReq contains Remote Transmission Request value. +* +* @return Message Identifier value. +* +* @note C-Style signature: +* u32 XCanPs_CreateIdValue(u32 StandardId, +* u32 SubRemoteTransReq, +* u32 IdExtension, u32 ExtendedId, +* u32 RemoteTransReq) +* +* Read the CAN specification for meaning of each parameter. +* +*****************************************************************************/ +#define XCanPs_CreateIdValue(StandardId, SubRemoteTransReq, IdExtension, \ + ExtendedId, RemoteTransReq) \ + ((((StandardId) << XCANPS_IDR_ID1_SHIFT) & XCANPS_IDR_ID1_MASK) | \ + (((SubRemoteTransReq) << XCANPS_IDR_SRR_SHIFT) & XCANPS_IDR_SRR_MASK)|\ + (((IdExtension) << XCANPS_IDR_IDE_SHIFT) & XCANPS_IDR_IDE_MASK) | \ + (((ExtendedId) << XCANPS_IDR_ID2_SHIFT) & XCANPS_IDR_ID2_MASK) | \ + ((RemoteTransReq) & XCANPS_IDR_RTR_MASK)) + + +/****************************************************************************/ +/** +* +* This macro calculates value for Data Length Code register given Data +* Length Code value. +* +* @param DataLengCode indicates Data Length Code value. +* +* @return Value that can be assigned to Data Length Code register. +* +* @note C-Style signature: +* u32 XCanPs_CreateDlcValue(u32 DataLengCode) +* +* Read the CAN specification for meaning of Data Length Code. +* +*****************************************************************************/ +#define XCanPs_CreateDlcValue(DataLengCode) \ + (((DataLengCode) << XCANPS_DLCR_DLC_SHIFT) & XCANPS_DLCR_DLC_MASK) + + +/****************************************************************************/ +/** +* +* This macro clears the timestamp in the Timestamp Control Register. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XCanPs_ClearTimestamp(XCanPs *InstancePtr) +* +*****************************************************************************/ +#define XCanPs_ClearTimestamp(InstancePtr) \ + XCanPs_WriteReg((InstancePtr)->CanConfig.BaseAddr, \ + XCANPS_TCR_OFFSET, XCANPS_TCR_CTS_MASK) + +/************************** Function Prototypes ******************************/ + +/* + * Functions in xcanps.c + */ +s32 XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr, + u32 EffectiveAddr); + +void XCanPs_Reset(XCanPs *InstancePtr); +u8 XCanPs_GetMode(XCanPs *InstancePtr); +void XCanPs_EnterMode(XCanPs *InstancePtr, u8 OperationMode); +u32 XCanPs_GetStatus(XCanPs *InstancePtr); +void XCanPs_GetBusErrorCounter(XCanPs *InstancePtr, u8 *RxErrorCount, + u8 *TxErrorCount); +u32 XCanPs_GetBusErrorStatus(XCanPs *InstancePtr); +void XCanPs_ClearBusErrorStatus(XCanPs *InstancePtr, u32 Mask); +s32 XCanPs_Send(XCanPs *InstancePtr, u32 *FramePtr); +s32 XCanPs_Recv(XCanPs *InstancePtr, u32 *FramePtr); +s32 XCanPs_SendHighPriority(XCanPs *InstancePtr, u32 *FramePtr); +void XCanPs_AcceptFilterEnable(XCanPs *InstancePtr, u32 FilterIndexes); +void XCanPs_AcceptFilterDisable(XCanPs *InstancePtr, u32 FilterIndexes); +u32 XCanPs_AcceptFilterGetEnabled(XCanPs *InstancePtr); +s32 XCanPs_AcceptFilterSet(XCanPs *InstancePtr, u32 FilterIndex, + u32 MaskValue, u32 IdValue); +void XCanPs_AcceptFilterGet(XCanPs *InstancePtr, u32 FilterIndex, + u32 *MaskValue, u32 *IdValue); + +s32 XCanPs_SetBaudRatePrescaler(XCanPs *InstancePtr, u8 Prescaler); +u8 XCanPs_GetBaudRatePrescaler(XCanPs *InstancePtr); +s32 XCanPs_SetBitTiming(XCanPs *InstancePtr, u8 SyncJumpWidth, + u8 TimeSegment2, u8 TimeSegment1); +void XCanPs_GetBitTiming(XCanPs *InstancePtr, u8 *SyncJumpWidth, + u8 *TimeSegment2, u8 *TimeSegment1); + +s32 XCanPs_SetRxIntrWatermark(XCanPs *InstancePtr, u8 Threshold); +u8 XCanPs_GetRxIntrWatermark(XCanPs *InstancePtr); +s32 XCanPs_SetTxIntrWatermark(XCanPs *InstancePtr, u8 Threshold); +u8 XCanPs_GetTxIntrWatermark(XCanPs *InstancePtr); + +/* + * Diagnostic functions in xcanps_selftest.c + */ +s32 XCanPs_SelfTest(XCanPs *InstancePtr); + +/* + * Functions in xcanps_intr.c + */ +void XCanPs_IntrEnable(XCanPs *InstancePtr, u32 Mask); +void XCanPs_IntrDisable(XCanPs *InstancePtr, u32 Mask); +u32 XCanPs_IntrGetEnabled(XCanPs *InstancePtr); +u32 XCanPs_IntrGetStatus(XCanPs *InstancePtr); +void XCanPs_IntrClear(XCanPs *InstancePtr, u32 Mask); +void XCanPs_IntrHandler(void *InstancePtr); +s32 XCanPs_SetHandler(XCanPs *InstancePtr, u32 HandlerType, + void *CallBackFunc, void *CallBackRef); + +/* + * Functions in xcanps_sinit.c + */ +XCanPs_Config *XCanPs_LookupConfig(u16 DeviceId); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_g.c new file mode 100644 index 0000000..bd2b197 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_g.c @@ -0,0 +1,55 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xcanps.h" + +/* +* The configuration table for devices +*/ + +XCanPs_Config XCanPs_ConfigTable[XPAR_XCANPS_NUM_INSTANCES] = +{ + { + XPAR_PS7_CAN_0_DEVICE_ID, + XPAR_PS7_CAN_0_BASEADDR + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_hw.c new file mode 100644 index 0000000..7ca2f81 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_hw.c @@ -0,0 +1,93 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcanps_hw.c +* @addtogroup canps_v3_2 +* @{ +* +* This file contains the implementation of the canps interface reset sequence +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.02a adk  08/08/13 First release
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xcanps_hw.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* +* This function resets the CAN device. Calling this function resets the device +* immediately, and any pending transmission or reception is terminated at once. +* Both Object Layer and Transfer Layer are reset. This function does not reset +* the Physical Layer. All registers are reset to the default values, and no +* previous status will be restored. TX FIFO, RX FIFO and TX High Priority +* Buffer are also reset. +* +* The CAN device will be in Configuration Mode immediately after this function +* returns. +* +* @param BaseAddr is the baseaddress of the interface. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XCanPs_ResetHw(u32 BaseAddr) +{ + XCanPs_WriteReg(BaseAddr, XCANPS_SRR_OFFSET, \ + XCANPS_SRR_SRST_MASK); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_hw.h new file mode 100644 index 0000000..30ec68a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_hw.h @@ -0,0 +1,369 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcanps_hw.h +* @addtogroup canps_v3_2 +* @{ +* +* 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 xcanps.h. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00a xd/sv  01/12/10 First release
    +* 1.01a sbs    12/27/11 Updated the Register/bit definitions
    +*                       Changed XCANPS_RXFWIR_RXFLL_MASK to XCANPS_WIR_FW_MASK
    +*                       Changed XCANPS_RXWIR_OFFSET to XCANPS_WIR_OFFSET
    +*			Added XCANPS_IXR_TXFEMP_MASK for Tx Fifo Empty
    +*			Changed XCANPS_IXR_RXFLL_MASK to
    +*			XCANPS_IXR_RXFWMFLL_MASK
    +* 			Changed
    +*			XCANPS_TXBUF_ID_OFFSET to XCANPS_TXHPB_ID_OFFSET
    +* 			XCANPS_TXBUF_DLC_OFFSET to XCANPS_TXHPB_DLC_OFFSET
    +*			XCANPS_TXBUF_DW1_OFFSET  to XCANPS_TXHPB_DW1_OFFSET
    +*			XCANPS_TXBUF_DW2_OFFSET  to XCANPS_TXHPB_DW2_OFFSET
    +* 1.02a adk   08/08/13  Updated for inclding the function prototype
    +* 3.00  kvn   02/13/15  Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +#ifndef XCANPS_HW_H /* prevent circular inclusions */ +#define XCANPS_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 for the CAN. Each register is 32 bits. + * @{ + */ +#define XCANPS_SRR_OFFSET 0x00000000U /**< Software Reset Register */ +#define XCANPS_MSR_OFFSET 0x00000004U /**< Mode Select Register */ +#define XCANPS_BRPR_OFFSET 0x00000008U /**< Baud Rate Prescaler */ +#define XCANPS_BTR_OFFSET 0x0000000CU /**< Bit Timing Register */ +#define XCANPS_ECR_OFFSET 0x00000010U /**< Error Counter Register */ +#define XCANPS_ESR_OFFSET 0x00000014U /**< Error Status Register */ +#define XCANPS_SR_OFFSET 0x00000018U /**< Status Register */ + +#define XCANPS_ISR_OFFSET 0x0000001CU /**< Interrupt Status Register */ +#define XCANPS_IER_OFFSET 0x00000020U /**< Interrupt Enable Register */ +#define XCANPS_ICR_OFFSET 0x00000024U /**< Interrupt Clear Register */ +#define XCANPS_TCR_OFFSET 0x00000028U /**< Timestamp Control Register */ +#define XCANPS_WIR_OFFSET 0x0000002CU /**< Watermark Interrupt Reg */ + +#define XCANPS_TXFIFO_ID_OFFSET 0x00000030U /**< TX FIFO ID */ +#define XCANPS_TXFIFO_DLC_OFFSET 0x00000034U /**< TX FIFO DLC */ +#define XCANPS_TXFIFO_DW1_OFFSET 0x00000038U /**< TX FIFO Data Word 1 */ +#define XCANPS_TXFIFO_DW2_OFFSET 0x0000003CU /**< TX FIFO Data Word 2 */ + +#define XCANPS_TXHPB_ID_OFFSET 0x00000040U /**< TX High Priority Buffer ID */ +#define XCANPS_TXHPB_DLC_OFFSET 0x00000044U /**< TX High Priority Buffer DLC */ +#define XCANPS_TXHPB_DW1_OFFSET 0x00000048U /**< TX High Priority Buf Data 1 */ +#define XCANPS_TXHPB_DW2_OFFSET 0x0000004CU /**< TX High Priority Buf Data Word 2 */ + +#define XCANPS_RXFIFO_ID_OFFSET 0x00000050U /**< RX FIFO ID */ +#define XCANPS_RXFIFO_DLC_OFFSET 0x00000054U /**< RX FIFO DLC */ +#define XCANPS_RXFIFO_DW1_OFFSET 0x00000058U /**< RX FIFO Data Word 1 */ +#define XCANPS_RXFIFO_DW2_OFFSET 0x0000005CU /**< RX FIFO Data Word 2 */ + +#define XCANPS_AFR_OFFSET 0x00000060U /**< Acceptance Filter Register */ +#define XCANPS_AFMR1_OFFSET 0x00000064U /**< Acceptance Filter Mask 1 */ +#define XCANPS_AFIR1_OFFSET 0x00000068U /**< Acceptance Filter ID 1 */ +#define XCANPS_AFMR2_OFFSET 0x0000006CU /**< Acceptance Filter Mask 2 */ +#define XCANPS_AFIR2_OFFSET 0x00000070U /**< Acceptance Filter ID 2 */ +#define XCANPS_AFMR3_OFFSET 0x00000074U /**< Acceptance Filter Mask 3 */ +#define XCANPS_AFIR3_OFFSET 0x00000078U /**< Acceptance Filter ID 3 */ +#define XCANPS_AFMR4_OFFSET 0x0000007CU /**< Acceptance Filter Mask 4 */ +#define XCANPS_AFIR4_OFFSET 0x00000080U /**< Acceptance Filter ID 4 */ +/* @} */ + +/** @name Software Reset Register (SRR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_SRR_CEN_MASK 0x00000002U /**< Can Enable */ +#define XCANPS_SRR_SRST_MASK 0x00000001U /**< Reset */ +/* @} */ + +/** @name Mode Select Register (MSR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_MSR_SNOOP_MASK 0x00000004U /**< Snoop Mode Select */ +#define XCANPS_MSR_LBACK_MASK 0x00000002U /**< Loop Back Mode Select */ +#define XCANPS_MSR_SLEEP_MASK 0x00000001U /**< Sleep Mode Select */ +/* @} */ + +/** @name Baud Rate Prescaler register (BRPR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_BRPR_BRP_MASK 0x000000FFU /**< Baud Rate Prescaler */ +/* @} */ + +/** @name Bit Timing Register (BTR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_BTR_SJW_MASK 0x00000180U /**< Synchronization Jump Width */ +#define XCANPS_BTR_SJW_SHIFT 7U +#define XCANPS_BTR_TS2_MASK 0x00000070U /**< Time Segment 2 */ +#define XCANPS_BTR_TS2_SHIFT 4U +#define XCANPS_BTR_TS1_MASK 0x0000000FU /**< Time Segment 1 */ +/* @} */ + +/** @name Error Counter Register (ECR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_ECR_REC_MASK 0x0000FF00U /**< Receive Error Counter */ +#define XCANPS_ECR_REC_SHIFT 8U +#define XCANPS_ECR_TEC_MASK 0x000000FFU /**< Transmit Error Counter */ +/* @} */ + +/** @name Error Status Register (ESR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_ESR_ACKER_MASK 0x00000010U /**< ACK Error */ +#define XCANPS_ESR_BERR_MASK 0x00000008U /**< Bit Error */ +#define XCANPS_ESR_STER_MASK 0x00000004U /**< Stuff Error */ +#define XCANPS_ESR_FMER_MASK 0x00000002U /**< Form Error */ +#define XCANPS_ESR_CRCER_MASK 0x00000001U /**< CRC Error */ +/* @} */ + +/** @name Status Register (SR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_SR_SNOOP_MASK 0x00001000U /**< Snoop Mask */ +#define XCANPS_SR_ACFBSY_MASK 0x00000800U /**< Acceptance Filter busy */ +#define XCANPS_SR_TXFLL_MASK 0x00000400U /**< TX FIFO is full */ +#define XCANPS_SR_TXBFLL_MASK 0x00000200U /**< TX High Priority Buffer full */ +#define XCANPS_SR_ESTAT_MASK 0x00000180U /**< Error Status */ +#define XCANPS_SR_ESTAT_SHIFT 7U +#define XCANPS_SR_ERRWRN_MASK 0x00000040U /**< Error Warning */ +#define XCANPS_SR_BBSY_MASK 0x00000020U /**< Bus Busy */ +#define XCANPS_SR_BIDLE_MASK 0x00000010U /**< Bus Idle */ +#define XCANPS_SR_NORMAL_MASK 0x00000008U /**< Normal Mode */ +#define XCANPS_SR_SLEEP_MASK 0x00000004U /**< Sleep Mode */ +#define XCANPS_SR_LBACK_MASK 0x00000002U /**< Loop Back Mode */ +#define XCANPS_SR_CONFIG_MASK 0x00000001U /**< Configuration Mode */ +/* @} */ + +/** @name Interrupt Status/Enable/Clear Register Bit Definitions and Masks + * @{ + */ +#define XCANPS_IXR_TXFEMP_MASK 0x00004000U /**< Tx Fifo Empty Interrupt */ +#define XCANPS_IXR_TXFWMEMP_MASK 0x00002000U /**< Tx Fifo Watermark Empty */ +#define XCANPS_IXR_RXFWMFLL_MASK 0x00001000U /**< Rx FIFO Watermark Full */ +#define XCANPS_IXR_WKUP_MASK 0x00000800U /**< Wake up Interrupt */ +#define XCANPS_IXR_SLP_MASK 0x00000400U /**< Sleep Interrupt */ +#define XCANPS_IXR_BSOFF_MASK 0x00000200U /**< Bus Off Interrupt */ +#define XCANPS_IXR_ERROR_MASK 0x00000100U /**< Error Interrupt */ +#define XCANPS_IXR_RXNEMP_MASK 0x00000080U /**< RX FIFO Not Empty Interrupt */ +#define XCANPS_IXR_RXOFLW_MASK 0x00000040U /**< RX FIFO Overflow Interrupt */ +#define XCANPS_IXR_RXUFLW_MASK 0x00000020U /**< RX FIFO Underflow Interrupt */ +#define XCANPS_IXR_RXOK_MASK 0x00000010U /**< New Message Received Intr */ +#define XCANPS_IXR_TXBFLL_MASK 0x00000008U /**< TX High Priority Buf Full */ +#define XCANPS_IXR_TXFLL_MASK 0x00000004U /**< TX FIFO Full Interrupt */ +#define XCANPS_IXR_TXOK_MASK 0x00000002U /**< TX Successful Interrupt */ +#define XCANPS_IXR_ARBLST_MASK 0x00000001U /**< Arbitration Lost Interrupt */ +#define XCANPS_IXR_ALL ((u32)XCANPS_IXR_RXFWMFLL_MASK | \ + (u32)XCANPS_IXR_WKUP_MASK | \ + (u32)XCANPS_IXR_SLP_MASK | \ + (u32)XCANPS_IXR_BSOFF_MASK | \ + (u32)XCANPS_IXR_ERROR_MASK | \ + (u32)XCANPS_IXR_RXNEMP_MASK | \ + (u32)XCANPS_IXR_RXOFLW_MASK | \ + (u32)XCANPS_IXR_RXUFLW_MASK | \ + (u32)XCANPS_IXR_RXOK_MASK | \ + (u32)XCANPS_IXR_TXBFLL_MASK | \ + (u32)XCANPS_IXR_TXFLL_MASK | \ + (u32)XCANPS_IXR_TXOK_MASK | \ + (u32)XCANPS_IXR_ARBLST_MASK) +/* @} */ + +/** @name CAN Timestamp Control Register (TCR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_TCR_CTS_MASK 0x00000001U /**< Clear Timestamp counter mask */ +/* @} */ + +/** @name CAN Watermark Register (WIR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_WIR_FW_MASK 0x0000003FU /**< Rx Full Threshold mask */ +#define XCANPS_WIR_EW_MASK 0x00003F00U /**< Tx Empty Threshold mask */ +#define XCANPS_WIR_EW_SHIFT 0x00000008U /**< Tx Empty Threshold shift */ + +/* @} */ + +/** @name CAN Frame Identifier (TX High Priority Buffer/TX/RX/Acceptance Filter + Mask/Acceptance Filter ID) + * @{ + */ +#define XCANPS_IDR_ID1_MASK 0xFFE00000U /**< Standard Messg Identifier */ +#define XCANPS_IDR_ID1_SHIFT 21U +#define XCANPS_IDR_SRR_MASK 0x00100000U /**< Substitute Remote TX Req */ +#define XCANPS_IDR_SRR_SHIFT 20U +#define XCANPS_IDR_IDE_MASK 0x00080000U /**< Identifier Extension */ +#define XCANPS_IDR_IDE_SHIFT 19U +#define XCANPS_IDR_ID2_MASK 0x0007FFFEU /**< Extended Message Ident */ +#define XCANPS_IDR_ID2_SHIFT 1U +#define XCANPS_IDR_RTR_MASK 0x00000001U /**< Remote TX Request */ +/* @} */ + +/** @name CAN Frame Data Length Code (TX High Priority Buffer/TX/RX) + * @{ + */ +#define XCANPS_DLCR_DLC_MASK 0xF0000000U /**< Data Length Code */ +#define XCANPS_DLCR_DLC_SHIFT 28U +#define XCANPS_DLCR_TIMESTAMP_MASK 0x0000FFFFU /**< Timestamp Mask (Rx only) */ + +/* @} */ + +/** @name CAN Frame Data Word 1 (TX High Priority Buffer/TX/RX) + * @{ + */ +#define XCANPS_DW1R_DB0_MASK 0xFF000000U /**< Data Byte 0 */ +#define XCANPS_DW1R_DB0_SHIFT 24U +#define XCANPS_DW1R_DB1_MASK 0x00FF0000U /**< Data Byte 1 */ +#define XCANPS_DW1R_DB1_SHIFT 16U +#define XCANPS_DW1R_DB2_MASK 0x0000FF00U /**< Data Byte 2 */ +#define XCANPS_DW1R_DB2_SHIFT 8U +#define XCANPS_DW1R_DB3_MASK 0x000000FFU /**< Data Byte 3 */ +/* @} */ + +/** @name CAN Frame Data Word 2 (TX High Priority Buffer/TX/RX) + * @{ + */ +#define XCANPS_DW2R_DB4_MASK 0xFF000000U /**< Data Byte 4 */ +#define XCANPS_DW2R_DB4_SHIFT 24U +#define XCANPS_DW2R_DB5_MASK 0x00FF0000U /**< Data Byte 5 */ +#define XCANPS_DW2R_DB5_SHIFT 16U +#define XCANPS_DW2R_DB6_MASK 0x0000FF00U /**< Data Byte 6 */ +#define XCANPS_DW2R_DB6_SHIFT 8U +#define XCANPS_DW2R_DB7_MASK 0x000000FFU /**< Data Byte 7 */ +/* @} */ + +/** @name Acceptance Filter Register (AFR) Bit Definitions and Masks + * @{ + */ +#define XCANPS_AFR_UAF4_MASK 0x00000008U /**< Use Acceptance Filter No.4 */ +#define XCANPS_AFR_UAF3_MASK 0x00000004U /**< Use Acceptance Filter No.3 */ +#define XCANPS_AFR_UAF2_MASK 0x00000002U /**< Use Acceptance Filter No.2 */ +#define XCANPS_AFR_UAF1_MASK 0x00000001U /**< Use Acceptance Filter No.1 */ +#define XCANPS_AFR_UAF_ALL_MASK ((u32)XCANPS_AFR_UAF4_MASK | \ + (u32)XCANPS_AFR_UAF3_MASK | \ + (u32)XCANPS_AFR_UAF2_MASK | \ + (u32)XCANPS_AFR_UAF1_MASK) +/* @} */ + +/** @name CAN frame length constants + * @{ + */ +#define XCANPS_MAX_FRAME_SIZE sizeof(u32)*16U /**< Maximum CAN frame length in bytes */ +/* @} */ + +/* For backwards compatibilty */ +#define XCANPS_TXBUF_ID_OFFSET XCANPS_TXHPB_ID_OFFSET +#define XCANPS_TXBUF_DLC_OFFSET XCANPS_TXHPB_DLC_OFFSET +#define XCANPS_TXBUF_DW1_OFFSET XCANPS_TXHPB_DW1_OFFSET +#define XCANPS_TXBUF_DW2_OFFSET XCANPS_TXHPB_DW2_OFFSET + +#define XCANPS_RXFWIR_RXFLL_MASK XCANPS_WIR_FW_MASK +#define XCANPS_RXWIR_OFFSET XCANPS_WIR_OFFSET +#define XCANPS_IXR_RXFLL_MASK XCANPS_IXR_RXFWMFLL_MASK + + + + +/**************************** 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 XCanPs_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (u32)(RegOffset)) + + +/****************************************************************************/ +/** +* +* This macro writes 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 None. +* +*****************************************************************************/ +#define XCanPs_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (u32)(RegOffset), (u32)(Data)) + +/************************** Function Prototypes ******************************/ +/* + * Perform reset operation to the CanPs interface + */ +void XCanPs_ResetHw(u32 BaseAddr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_intr.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_intr.c new file mode 100644 index 0000000..715b35e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_intr.c @@ -0,0 +1,421 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcanps_intr.c +* @addtogroup canps_v3_2 +* @{ +* +* This file contains functions related to CAN interrupt handling. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00a xd/sv  01/12/10 First release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1   nsk    12/21/15 Updated XCanPs_IntrHandler to handle error
    +*			interrupts correctly. CR#925615
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xcanps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +/****************************************************************************/ +/** +* +* This routine enables interrupt(s). Use the XCANPS_IXR_* constants defined in +* xcanps_hw.h to create the bit-mask to enable interrupts. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param Mask is the mask to enable. Bit positions of 1 will be enabled. +* Bit positions of 0 will keep the previous setting. This mask is +* formed by OR'ing XCANPS_IXR_* bits defined in xcanps_hw.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XCanPs_IntrEnable(XCanPs *InstancePtr, u32 Mask) +{ + u32 IntrValue; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Write to the IER to enable the specified interrupts. + */ + IntrValue = XCanPs_IntrGetEnabled(InstancePtr); + IntrValue |= Mask; + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_IER_OFFSET, IntrValue); +} + +/****************************************************************************/ +/** +* +* This routine disables interrupt(s). Use the XCANPS_IXR_* constants defined in +* xcanps_hw.h to create the bit-mask to disable interrupt(s). +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param Mask is the mask to disable. Bit positions of 1 will be +* disabled. Bit positions of 0 will keep the previous setting. +* This mask is formed by OR'ing XCANPS_IXR_* bits defined in +* xcanps_hw.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XCanPs_IntrDisable(XCanPs *InstancePtr, u32 Mask) +{ + u32 IntrValue; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Write to the IER to disable the specified interrupts. + */ + IntrValue = XCanPs_IntrGetEnabled(InstancePtr); + IntrValue &= ~Mask; + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_IER_OFFSET, IntrValue); +} + +/****************************************************************************/ +/** +* +* This routine returns enabled interrupt(s). Use the XCANPS_IXR_* constants +* defined in xcanps_hw.h to interpret the returned value. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return Enabled interrupt(s) in a 32-bit format. +* +* @note None. +* +*****************************************************************************/ +u32 XCanPs_IntrGetEnabled(XCanPs *InstancePtr) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + return XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_IER_OFFSET); +} + + +/****************************************************************************/ +/** +* +* This routine returns interrupt status read from Interrupt Status Register. +* Use the XCANPS_IXR_* constants defined in xcanps_hw.h to interpret the +* returned value. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return The value stored in Interrupt Status Register. +* +* @note None. +* +*****************************************************************************/ +u32 XCanPs_IntrGetStatus(XCanPs *InstancePtr) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + return XCanPs_ReadReg(InstancePtr->CanConfig.BaseAddr, + XCANPS_ISR_OFFSET); +} + +/****************************************************************************/ +/** +* +* This function clears interrupt(s). Every bit set in Interrupt Status +* Register indicates that a specific type of interrupt is occurring, and this +* function clears one or more interrupts by writing a bit mask to Interrupt +* Clear Register. +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param Mask is the mask to clear. 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 XCANPS_IXR_* bits defined +* in xcanps_hw.h. +* +* @note None. +* +*****************************************************************************/ +void XCanPs_IntrClear(XCanPs *InstancePtr, u32 Mask) +{ + u32 IntrValue; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Clear the currently pending interrupts. + */ + IntrValue = XCanPs_IntrGetStatus(InstancePtr); + IntrValue &= Mask; + XCanPs_WriteReg(InstancePtr->CanConfig.BaseAddr, XCANPS_ICR_OFFSET, + IntrValue); +} + +/*****************************************************************************/ +/** +* +* This routine is the interrupt handler for the CAN driver. +* +* This handler reads the interrupt status from the ISR, determines the source of +* the interrupts, calls according callbacks, and finally clears the interrupts. +* +* Application beyond this driver is responsible for providing callbacks to +* handle interrupts and installing the callbacks using XCanPs_SetHandler() +* during initialization phase. An example delivered with this driver +* demonstrates how this could be done. +* +* @param InstancePtr is a pointer to the XCanPs instance that just +* interrupted. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XCanPs_IntrHandler(void *InstancePtr) +{ + u32 PendingIntr; + u32 EventIntr; + u32 ErrorStatus; + XCanPs *CanPtr = (XCanPs *) ((void *)InstancePtr); + + Xil_AssertVoid(CanPtr != NULL); + Xil_AssertVoid(CanPtr->IsReady == XIL_COMPONENT_IS_READY); + + PendingIntr = XCanPs_IntrGetStatus(CanPtr); + PendingIntr &= XCanPs_IntrGetEnabled(CanPtr); + + /* + * Clear all pending interrupts. + * Rising Edge interrupt + */ + XCanPs_IntrClear(CanPtr, PendingIntr); + + /* + * An error interrupt is occurring. + */ + if (((PendingIntr & XCANPS_IXR_ERROR_MASK) != (u32)0) && + (CanPtr->ErrorHandler != NULL)) { + ErrorStatus = XCanPs_GetBusErrorStatus(CanPtr); + CanPtr->ErrorHandler(CanPtr->ErrorRef,ErrorStatus); + /* + * Clear Error Status Register. + */ + XCanPs_ClearBusErrorStatus(CanPtr,ErrorStatus); + } + + /* + * Check if any following event interrupt is pending: + * - RX FIFO Overflow + * - RX FIFO Underflow + * - TX High Priority Buffer full + * - TX FIFO Full + * - Wake up from sleep mode + * - Enter sleep mode + * - Enter Bus off status + * - Arbitration is lost + * + * If so, call event callback provided by upper level. + */ + EventIntr = PendingIntr & ((u32)XCANPS_IXR_RXOFLW_MASK | + (u32)XCANPS_IXR_RXUFLW_MASK | + (u32)XCANPS_IXR_TXBFLL_MASK | + (u32)XCANPS_IXR_TXFLL_MASK | + (u32)XCANPS_IXR_WKUP_MASK | + (u32)XCANPS_IXR_SLP_MASK | + (u32)XCANPS_IXR_BSOFF_MASK | + (u32)XCANPS_IXR_ARBLST_MASK); + if ((EventIntr != (u32)0) && (CanPtr->EventHandler != NULL)) { + CanPtr->EventHandler(CanPtr->EventRef, EventIntr); + + if ((EventIntr & XCANPS_IXR_BSOFF_MASK) != (u32)0) { + /* + * Event callback should reset whole device if "Enter + * Bus Off Status" interrupt occurred. All pending + * interrupts are cleared and no further checking and + * handling of other interrupts is needed any more. + */ + return; + } else { + /*This else was made for misra-c compliance*/ + ; + } + } + + + if (((PendingIntr & (XCANPS_IXR_RXFWMFLL_MASK | + XCANPS_IXR_RXNEMP_MASK)) != (u32)0) && + (CanPtr->RecvHandler != NULL)) { + + /* + * This case happens when + * A number of frames depending on the Rx FIFO Watermark + * threshold are received. + * And also when frame was received and is sitting in RX FIFO. + * + * XCANPS_IXR_RXOK_MASK is not used because the bit is set + * just once even if there are multiple frames sitting + * in the RX FIFO. + * + * XCANPS_IXR_RXNEMP_MASK is used because the bit can be + * set again and again automatically as long as there is + * at least one frame in RX FIFO. + */ + CanPtr->RecvHandler(CanPtr->RecvRef); + } + + /* + * A frame was transmitted successfully. + */ + if (((PendingIntr & (XCANPS_IXR_TXOK_MASK | XCANPS_IXR_TXFWMEMP_MASK)) != (u32)0) && + (CanPtr->SendHandler != NULL)) { + CanPtr->SendHandler(CanPtr->SendRef); + } +} + + +/*****************************************************************************/ +/** +* +* This routine installs an asynchronous callback function for the given +* HandlerType: +* +*
    +* HandlerType			Callback Function Type
    +* -----------------------	------------------------
    +* XCANPS_HANDLER_SEND		XCanPs_SendRecvHandler
    +* XCANPS_HANDLER_RECV		XCanPs_SendRecvHandler
    +* XCANPS_HANDLER_ERROR		XCanPs_ErrorHandler
    +* XCANPS_HANDLER_EVENT		XCanPs_EventHandler
    +*
    +* HandlerType			Invoked by this driver when:
    +* -------------------------------------------------------------------------
    +* XCANPS_HANDLER_SEND		A frame transmitted by a call to
    +*				XCanPs_Send() has been sent successfully.
    +*
    +* XCANPS_HANDLER_RECV		A frame(s) has been received and is sitting in
    +*				the RX FIFO.
    +*
    +* XCANPS_HANDLER_ERROR		An error interrupt is occurring.
    +*
    +* XCANPS_HANDLER_EVENT		Any other kind of interrupt is occurring.
    +* 
    +* +* @param InstancePtr is a pointer to the XCanPs instance. +* @param HandlerType specifies which handler is to be attached. +* @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 +* - XST_SUCCESS when handler is installed. +* - XST_INVALID_PARAM when HandlerType is invalid. +* +* @note +* Invoking this function for a handler that already has been installed replaces +* it with the new handler. +* +******************************************************************************/ +s32 XCanPs_SetHandler(XCanPs *InstancePtr, u32 HandlerType, + void *CallBackFunc, void *CallBackRef) +{ + s32 Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + switch (HandlerType) { + case XCANPS_HANDLER_SEND: + InstancePtr->SendHandler = + (XCanPs_SendRecvHandler) CallBackFunc; + InstancePtr->SendRef = CallBackRef; + Status = XST_SUCCESS; + break; + + case XCANPS_HANDLER_RECV: + InstancePtr->RecvHandler = + (XCanPs_SendRecvHandler) CallBackFunc; + InstancePtr->RecvRef = CallBackRef; + Status = XST_SUCCESS; + break; + + case XCANPS_HANDLER_ERROR: + InstancePtr->ErrorHandler = + (XCanPs_ErrorHandler) CallBackFunc; + InstancePtr->ErrorRef = CallBackRef; + Status = XST_SUCCESS; + break; + + case XCANPS_HANDLER_EVENT: + InstancePtr->EventHandler = + (XCanPs_EventHandler) CallBackFunc; + InstancePtr->EventRef = CallBackRef; + Status = XST_SUCCESS; + break; + + default: + Status = XST_INVALID_PARAM; + break; + } + return Status; +} + +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_selftest.c new file mode 100644 index 0000000..26c9fcb --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_selftest.c @@ -0,0 +1,234 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcanps_selftest.c +* @addtogroup canps_v3_2 +* @{ +* +* This file contains a diagnostic self-test function for the XCanPs driver. +* +* Read xcanps.h file for more information. +* +* @note +* The Baud Rate Prescaler Register (BRPR) and Bit Timing Register(BTR) +* are setup such that CAN baud rate equals 40Kbps, given the CAN clock +* equal to 24MHz. These need to be changed based on the desired baudrate +* and CAN clock frequency. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00a xd/sv  01/12/10 First release
    +* 2.1 adk 		23/08/14 Fixed CR:798792 Peripheral test for CANPS IP in
    +*						 SDK claims a 40kbps baud rate but it's not.
    +* 3.00  kvn    02/13/15 Modified code for MISRA_C:2012 compliance.
    +* 
    +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xstatus.h" +#include "xcanps.h" + +/************************** Constant Definitions ****************************/ + +#define XCANPS_MAX_FRAME_SIZE_IN_WORDS ((XCANPS_MAX_FRAME_SIZE) / (sizeof(u32))) + +#define FRAME_DATA_LENGTH 8U /* Frame Data field length */ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/* + * Buffers to hold frames to send and receive. These are declared as global so + * that they are not on the stack. + */ +static u32 TxFrame[XCANPS_MAX_FRAME_SIZE_IN_WORDS]; +static u32 RxFrame[XCANPS_MAX_FRAME_SIZE_IN_WORDS]; + +/************************** Function Prototypes *****************************/ + +/*****************************************************************************/ +/** +* +* This function runs a self-test on the CAN driver/device. The test resets +* the device, sets up the Loop Back mode, sends a standard frame, receives the +* frame, verifies the contents, and resets the device again. +* +* Note that this is a destructive test in that resets of the device are +* performed. Refer the device specification for the device status after +* the reset operation. +* +* +* @param InstancePtr is a pointer to the XCanPs instance. +* +* @return +* - XST_SUCCESS if the self-test passed. i.e., the frame +* received via the internal loop back has the same contents as +* the frame sent. +* - XST_FAILURE Otherwise. +* +* @note +* +* If the CAN device does not work properly, this function may enter an +* infinite loop and will never return to the caller. +*

    +* If XST_FAILURE is returned, the device is not reset so that the caller could +* have a chance to check reason(s) causing the failure. +* +******************************************************************************/ +s32 XCanPs_SelfTest(XCanPs *InstancePtr) +{ + u8 *FramePtr; + s32 Status; + u32 Index; + u8 GetModeResult; + u32 RxEmptyResult; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XCanPs_Reset(InstancePtr); + + /* + * The device should enter Configuration Mode immediately after + * reset above is finished. Now check the mode and return error code if + * it is not Configuration Mode. + */ + if (XCanPs_GetMode(InstancePtr) != XCANPS_MODE_CONFIG) { + Status = XST_FAILURE; + return Status; + } + + /* + * Setup Baud Rate Prescaler Register (BRPR) and Bit Timing Register + * (BTR) such that CAN baud rate equals 40Kbps, given the CAN clock + * equal to 24MHz. For more information see the CAN 2.0A, CAN 2.0B, + * ISO 11898-1 specifications. + */ + (void)XCanPs_SetBaudRatePrescaler(InstancePtr, (u8)29U); + (void)XCanPs_SetBitTiming(InstancePtr, (u8)3U, (u8)2U, (u8)15U); + + /* + * Enter the loop back mode. + */ + XCanPs_EnterMode(InstancePtr, XCANPS_MODE_LOOPBACK); + GetModeResult = XCanPs_GetMode(InstancePtr); + while (GetModeResult != ((u8)XCANPS_MODE_LOOPBACK)) { + GetModeResult = XCanPs_GetMode(InstancePtr); + } + + /* + * Create a frame to send with known values so we can verify them + * on receive. + */ + TxFrame[0] = (u32)XCanPs_CreateIdValue((u32)2000U, (u32)0U, (u32)0U, (u32)0U, (u32)0U); + TxFrame[1] = (u32)XCanPs_CreateDlcValue((u32)8U); + + FramePtr = (u8 *)((void *)(&TxFrame[2])); + for (Index = 0U; Index < 8U; Index++) { + if(*FramePtr != 0U) { + *FramePtr = (u8)Index; + FramePtr++; + } + } + + /* + * Send the frame. + */ + Status = XCanPs_Send(InstancePtr, TxFrame); + if (Status != (s32)XST_SUCCESS) { + Status = XST_FAILURE; + return Status; + } + + /* + * Wait until the frame arrives RX FIFO via internal loop back. + */ + RxEmptyResult = XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), + XCANPS_ISR_OFFSET) & XCANPS_IXR_RXNEMP_MASK; + + while (RxEmptyResult == (u32)0U) { + RxEmptyResult = XCanPs_ReadReg(((InstancePtr)->CanConfig.BaseAddr), + XCANPS_ISR_OFFSET) & XCANPS_IXR_RXNEMP_MASK; + } + + /* + * Receive the frame. + */ + Status = XCanPs_Recv(InstancePtr, RxFrame); + if (Status != (s32)XST_SUCCESS) { + Status = XST_FAILURE; + return Status; + } + + /* + * Verify Identifier and Data Length Code. + */ + if (RxFrame[0] != + (u32)XCanPs_CreateIdValue((u32)2000U, (u32)0U, (u32)0U, (u32)0U, (u32)0U)) { + Status = XST_FAILURE; + return Status; + } + + if ((RxFrame[1] & ~XCANPS_DLCR_TIMESTAMP_MASK) != TxFrame[1]) { + Status = XST_FAILURE; + return Status; + } + + + for (Index = 2U; Index < (XCANPS_MAX_FRAME_SIZE_IN_WORDS); Index++) { + if (RxFrame[Index] != TxFrame[Index]) { + Status = XST_FAILURE; + return Status; + } + } + + /* + * Reset device again before returning to the caller. + */ + XCanPs_Reset(InstancePtr); + + Status = XST_SUCCESS; + return Status; +} + + +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_sinit.c new file mode 100644 index 0000000..5321669 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/canps_v3_2/src/xcanps_sinit.c @@ -0,0 +1,103 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcanps_sinit.c +* @addtogroup canps_v3_2 +* @{ +* +* This file contains the implementation of the XCanPs driver's static +* initialization functionality. +* +* @note None. +* +*
    +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00a xd/sv  01/12/10 First release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xcanps.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +extern XCanPs_Config XCanPs_ConfigTable[XPAR_XCANPS_NUM_INSTANCES]; + +/*****************************************************************************/ +/** +* +* This function looks for the device configuration based on the unique device +* ID. The table XCanPs_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. +* +******************************************************************************/ +XCanPs_Config *XCanPs_LookupConfig(u16 DeviceId) +{ + XCanPs_Config *CfgPtr = NULL; + u32 Index; + + for (Index = 0U; Index < (u32)XPAR_XCANPS_NUM_INSTANCES; Index++) { + if (XCanPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XCanPs_ConfigTable[Index]; + break; + } + } + + return (XCanPs_Config *)CfgPtr; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src/xcoresightpsdcc.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src/xcoresightpsdcc.c new file mode 100644 index 0000000..fca26ca --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src/xcoresightpsdcc.c @@ -0,0 +1,188 @@ +/****************************************************************************** +* +* Copyright (C) 2015-2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcoresightpsdcc.c +* @addtogroup coresightps_dcc_v1_4 +* @{ +* +* Functions in this file are the minimum required functions for the +* XCoreSightPs driver. +* +* @note None. +* +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date		Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00  kvn    02/14/15 First release
    +* 1.1   kvn    06/12/15 Add support for Zynq Ultrascale+ MP.
    +*       kvn    08/18/15 Modified Makefile according to compiler changes.
    +* 1.2   kvn    10/09/15 Add support for IAR Compiler.
    +* 1.3   asa    07/01/16 Made changes to ensure that the file does not compile
    +*                       for MB BSPs. Instead it throws up a warning. This
    +*                       fixes the CR#953056.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#ifdef __MICROBLAZE__ +#warning "The driver is supported only for ARM architecture" +#else + +#include +#include + +#ifdef __ICCARM__ +#define INLINE +#else +#define INLINE __inline +#endif + +/* DCC Status Bits */ +#define XCORESIGHTPS_DCC_STATUS_RX (1 << 30) +#define XCORESIGHTPS_DCC_STATUS_TX (1 << 29) + +static INLINE u32 XCoresightPs_DccGetStatus(void); + +/****************************************************************************/ +/** +* +* This functions sends a single byte using the DCC. It is blocking in that it +* waits for the transmitter to become non-full before it writes the byte to +* the transmit register. +* +* @param BaseAddress is a dummy parameter to match the function proto +* of functions for other stdio devices. +* @param Data is the byte of data to send +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XCoresightPs_DccSendByte(u32 BaseAddress, u8 Data) +{ + (void) BaseAddress; + while (XCoresightPs_DccGetStatus() & XCORESIGHTPS_DCC_STATUS_TX) + dsb(); +#ifdef __aarch64__ + asm volatile ("msr dbgdtrtx_el0, %0" : : "r" (Data)); +#elif defined (__GNUC__) || defined (__ICCARM__) + asm volatile("mcr p14, 0, %0, c0, c5, 0" + : : "r" (Data)); +#else + { + volatile register u32 Reg __asm("cp14:0:c0:c5:0"); + Reg = Data; + } +#endif + isb(); + +} + +/****************************************************************************/ +/** +* +* This functions receives a single byte using the DCC. It is blocking in that +* it waits for the receiver to become non-empty before it reads from the +* receive register. +* +* @param BaseAddress is a dummy parameter to match the function proto +* of functions for other stdio devices. +* +* @return The byte of data received. +* +* @note None. +* +******************************************************************************/ +u8 XCoresightPs_DccRecvByte(u32 BaseAddress) +{ + u8 Data = 0U; + (void) BaseAddress; + + while (!(XCoresightPs_DccGetStatus() & XCORESIGHTPS_DCC_STATUS_RX)) + dsb(); + +#ifdef __aarch64__ + asm volatile ("mrs %0, dbgdtrrx_el0" : "=r" (Data)); +#elif defined (__GNUC__) || defined (__ICCARM__) + asm volatile("mrc p14, 0, %0, c0, c5, 0" + : "=r" (Data)); +#else + { + volatile register u32 Reg __asm("cp14:0:c0:c5:0"); + Data = Reg; + } +#endif + isb(); + + return Data; +} + + +/****************************************************************************/ +/**INLINE +* +* This functions read the status register of the DCC. +* +* @param BaseAddress is the base address of the device +* +* @return The contents of the Status Register. +* +* @note None. +* +******************************************************************************/ +static INLINE u32 XCoresightPs_DccGetStatus(void) +{ + u32 Status = 0U; + +#ifdef __aarch64__ + asm volatile ("mrs %0, mdccsr_el0" : "=r" (Status)); +#elif defined (__GNUC__) || defined (__ICCARM__) + asm volatile("mrc p14, 0, %0, c0, c1, 0" + : "=r" (Status) : : "cc"); +#else + { + volatile register u32 Reg __asm("cp14:0:c0:c1:0"); + Status = Reg; + } +#endif + return Status; +#endif +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src/xcoresightpsdcc.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src/xcoresightpsdcc.h new file mode 100644 index 0000000..67959e3 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src/xcoresightpsdcc.h @@ -0,0 +1,74 @@ +/****************************************************************************** +* +* Copyright (C) 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcoresightpsdcc.h +* @addtogroup coresightps_dcc_v1_4 +* @{ +* @details +* +* CoreSight driver component. +* +* The coresight is a part of debug communication channel (DCC) group. Jtag UART +* for ARM uses DCC. Each ARM core has its own DCC, so one need to select an +* ARM target in XSDB console before running the jtag terminal command. Using the +* coresight driver component, the output stream can be directed to a log file. +* +* @note None. +* +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date		Changes
    +* ----- -----  -------- -----------------------------------------------
    +* 1.00  kvn    02/14/15 First release
    +* 1.1   kvn    06/12/15 Add support for Zynq Ultrascale+ MP.
    +*       kvn    08/18/15 Modified Makefile according to compiler changes.
    +* 1.3   asa    07/01/16 Made changes to ensure that the file does not compile
    +*                       for MB BSPs. Instead it throws up a warning. This
    +*                       fixes the CR#953056.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#ifndef __MICROBLAZE__ +#include + +void XCoresightPs_DccSendByte(u32 BaseAddress, u8 Data); + +u8 XCoresightPs_DccRecvByte(u32 BaseAddress); +#endif +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v2_6/src/xcpu_cortexa9.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v2_6/src/xcpu_cortexa9.h new file mode 100644 index 0000000..95c8ba5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v2_6/src/xcpu_cortexa9.h @@ -0,0 +1,48 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcpu_cortexa9.h +* @addtogroup cpu_cortexa9_v2_5 +* @{ +* @details +* +* dummy file +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------------- +* 2.5 ms 04/18/17 Modified tcl file to add suffix U for XPAR_CPU_ID +* parameter of cpu_cortexa9 in xparameters.h +******************************************************************************/ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ddrps_v1_0/src/xddrps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ddrps_v1_0/src/xddrps.h new file mode 100644 index 0000000..c8804d2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ddrps_v1_0/src/xddrps.h @@ -0,0 +1,66 @@ +/******************************************************************************* + * + * Copyright (C) 2015 Xilinx, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * Use of the Software is limited solely to applications: + * (a) running on a Xilinx device, or + * (b) that interact with a Xilinx device through a bus or interconnect. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF + * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Except as contained in this notice, the name of the Xilinx shall not be used + * in advertising or otherwise to promote the sale, use or other dealings in + * this Software without prior written authorization from Xilinx. + * +*******************************************************************************/ +/******************************************************************************/ +/** + * + * @file xddrps.h + * @addtogroup ddrps_v1_0 + * @{ + * @details + * + * The Xilinx DdrPs driver. This driver supports the Xilinx ddrps + * IP core. + * + * @note None. + * + *
    + * MODIFICATION HISTORY:
    + *
    + * Ver   Who  Date     Changes
    + * ----- ---- -------- -----------------------------------------------
    + * 1.0	 nsk  08/06/15 First Release
    + * 1.0	 nsk  08/20/15 Updated define_addr_params in ddrps.tcl
    + *		       to support PBD Designs (CR #876857)
    + *
    + * 
    + * +*******************************************************************************/ + +#ifndef XDDRPS_H_ +/* Prevent circular inclusions by using protection macros. */ +#define XDDRPS_H_ + +/******************************* Include Files ********************************/ + + +#endif /* XDDRPS_H_ */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg.c new file mode 100644 index 0000000..e9447e7 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg.c @@ -0,0 +1,945 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg.c +* @addtogroup devcfg_v3_5 +* @{ +* +* This file contains the implementation of the interface functions for XDcfg +* driver. Refer to the header file xdevcfg.h for more detailed information. +* +*
    +* 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.
    +* 3.0   kpc 21/02/14 Implemented new function XDcfg_ClearControlRegister
    +* 3.2   sb  08/25/14 Fixed XDcfg_PcapReadback() function
    +*		     updated driver code with != instead of ==,
    +*		     while checking for Interrupt Status with DMA and
    +*		     PCAP Done Mask
    +*		     ((XDcfg_ReadReg(InstancePtr->Config.BaseAddr,
    +*			XDCFG_INT_STS_OFFSET) &
    +*			XDCFG_IXR_D_P_DONE_MASK) !=
    +*			XDCFG_IXR_D_P_DONE_MASK);
    +*
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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 Clears the specified bit positions of the Control Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Mask is the 32 bit value which holds the bit positions to be cleared. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XDcfg_ClearControlRegister(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg.h new file mode 100644 index 0000000..b9a0111 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg.h @@ -0,0 +1,403 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg.h +* @addtogroup devcfg_v3_5 +* @{ +* @details +* +* 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. +* +* Initialization and Configuration +* +* 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. +* +* Interrupts +* The Driver implements an interrupt handler to support the interrupts provided +* by this interface. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Asserts +* +* 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. +* +* Building the driver +* +* 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. +* +*

    +* +*
    +* 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.
    +* 3.0   adk 10/12/13 Updated as per the New Tcl API's
    +* 3.0   kpc 21/02/14 Added function prototype for XDcfg_ClearControlRegister
    +* 3.2   sb  08/25/14 Fixed XDcfg_PcapReadback() function
    +*		     updated driver code with != instead of ==,
    +*		     while checking for Interrupt Status with DMA and
    +*		     PCAP Done Mask
    +*		     ((XDcfg_ReadReg(InstancePtr->Config.BaseAddr,
    +*			XDCFG_INT_STS_OFFSET) &
    +*			XDCFG_IXR_D_P_DONE_MASK) !=
    +*			XDCFG_IXR_D_P_DONE_MASK);
    +*		     A new example has been added to read back the
    +*		     configuration registers from the PL region.
    +*		     xdevcfg_reg_readback_example.c
    +* 3.3   sk  04/06/15 Modified XDcfg_ReadMultiBootConfig Macro CR# 851335.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +*       ms  04/10/17 Modified filename tag in interrupt and polled examples
    +*                    to include them in doxygen examples.
    +* 3.5   ms  04/18/17 Modified tcl file to add suffix U for all macros
    +*                    definitions of devcfg in xparameters.h
    +*       ms  08/07/17 Fixed compilation warnings in xdevcfg_sinit.c
    +* 
    +* +******************************************************************************/ +#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); + +void XDcfg_ClearControlRegister(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_g.c new file mode 100644 index 0000000..e96911d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_g.c @@ -0,0 +1,55 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_hw.c new file mode 100644 index 0000000..bcb238f --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_hw.c @@ -0,0 +1,113 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_hw.c +* @addtogroup devcfg_v3_5 +* @{ +* +* This file contains the implementation of the interface reset functionality +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- ---------------------------------------------
    +* 2.04a kpc 10/07/13 First release
    +* 
    +* +******************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_hw.h new file mode 100644 index 0000000..c506ca5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_hw.h @@ -0,0 +1,395 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_hw.h +* @addtogroup devcfg_v3_3 +* @{ +* +* This file contains the hardware interface to the Device Config Interface. +* +*
    +* 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.
    +* 3.00a	kpc	25/02/14 Corrected the XDCFG_BASE_ADDRESS macro value.
    +* 
    +* +******************************************************************************/ +#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 0xF8007000 /**< 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_intr.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_intr.c new file mode 100644 index 0000000..b41b7ea --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_intr.c @@ -0,0 +1,310 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_intr.c +* @addtogroup devcfg_v3_5 +* @{ +* +* Contains the implementation of interrupt related functions of the XDcfg +* driver. +* +*
    +* 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
    +* 
    +* +******************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_selftest.c new file mode 100644 index 0000000..40cf1de --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_selftest.c @@ -0,0 +1,114 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_selftest.c +* @addtogroup devcfg_v3_5 +* @{ +* +* Contains diagnostic self-test functions for the XDcfg driver. +* +*
    +* 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.
    +* 
    +* +******************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_sinit.c new file mode 100644 index 0000000..bbc96a0 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/devcfg_v3_5/src/xdevcfg_sinit.c @@ -0,0 +1,94 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xdevcfg_sinit.c +* @addtogroup devcfg_v3_5 +* @{ +* +* This file contains method for static initialization (compile-time) of the +* driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- ---------------------------------------------
    +* 1.00a hvm 02/07/11 First release
    +* 3.5   ms  08/07/17 Fixed compilation warnings.
    +* 
    +* +******************************************************************************/ + +/***************************** 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; + u32 Index; + + for (Index = 0U; Index < XPAR_XDCFG_NUM_INSTANCES; Index++) { + if (XDcfg_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XDcfg_ConfigTable[Index]; + break; + } + } + + return (CfgPtr); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps.c new file mode 100644 index 0000000..9db7692 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps.c @@ -0,0 +1,1982 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps.c +* @addtogroup dmaps_v2_3 +* @{ +* +* This file contains the implementation of the interface functions for XDmaPs +* driver. Refer to the header file xdmaps.h for more detailed information. +* +*
    +* 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.
    +* 1.07a asa    11/02/13. Made changes to fix compilation issues for iarcc.
    +*			   Removed the PDBG prints. By default they were always
    +*			   defined out and never used. The PDBG is non-standard for
    +*			   Xilinx drivers and no other driver does something similar.
    +*			   Since there is no easy way to fix compilation issues with
    +*			   the IARCC compiler around PDBG, it is better to remove it.
    +*			   Users can always use xil_printfs if they want to debug.
    +* 2.01 kpc    08/23/14   Fixed the IAR compiler reported errors
    +* 2.2  mus    12/08/16   Remove definition of INLINE macro to avoid re-definition,
    +*                         since it is being defined in xil_io.h
    +* 2.3 kpc     14/10/16   Fixed the compiler error when optimization O0 is used.
    +* 
    +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include + +#include "xstatus.h" +#include "xdmaps.h" +#include "xil_io.h" +#include "xil_cache.h" + +#include "xil_printf.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. + */ + +/**************************** 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; + + 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)) { + FaultType = + XDmaPs_ReadReg(BaseAddr, + XDmaPs_FTCn_OFFSET(Chan)); + Pc = XDmaPs_ReadReg(BaseAddr, + XDmaPs_CPCn_OFFSET(Chan)); + + /* kill the channel thread */ + /* 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. +* +*****************************************************************************/ +static 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; +} + +static 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 +* +*****************************************************************************/ +static INLINE int XDmaPs_Instr_DMAGO(char *DmaProg, unsigned int Cn, + u32 Imm, unsigned int 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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. +* +*****************************************************************************/ +static 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); + + 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; + + 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; + + 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); + + 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; + + 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) { + DmaProgBuf += XDmaPs_ConstructSingleLoop(DmaProgStart, + CacheLength, + DmaProgBuf, + LoopCount); + } + + if (TailBytes) { + /* handle the tail */ + TailWords = TailBytes / MemBurstSize; + TailBytes = TailBytes % MemBurstSize; + + if (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); + + 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); + + + 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) { + return XST_FAILURE; + } + + + /* + * unaligned fixed address is not supported + */ + if (!ChanCtrl->SrcInc && Cmd->BD.SrcAddr % ChanCtrl->SrcBurstSize) { + return XST_FAILURE; + } + + if (!ChanCtrl->DstInc && Cmd->BD.DstAddr % ChanCtrl->DstBurstSize) { + return XST_FAILURE; + } + + Buf = XDmaPs_BufPool_Allocate(ChanData->ProgBufPool); + if (Buf == NULL) { + return XST_FAILURE; + } + + Cmd->GeneratedDmaProg = Buf; + ProgLen = XDmaPs_BuildDmaProg(Channel, Cmd, + InstPtr->CacheLength); + Cmd->GeneratedDmaProgLength = 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); + + + 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 */ + Inten = XDmaPs_ReadReg(InstPtr->Config.BaseAddress, + XDMAPS_INTEN_OFFSET); + Inten |= 0x01 << Channel; /* set the correpsonding bit */ + XDmaPs_WriteReg(InstPtr->Config.BaseAddress, + XDMAPS_INTEN_OFFSET, + Inten); + Inten = XDmaPs_ReadReg(InstPtr->Config.BaseAddress, + XDMAPS_INTEN_OFFSET); + + InstPtr->Chans[Channel].DmaCmdToHw = Cmd; + + if (Cmd->ChanCtrl.SrcInc) { + Xil_DCacheFlushRange(Cmd->BD.SrcAddr, Cmd->BD.Length); + } + if (Cmd->ChanCtrl.DstInc) { + 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) { + 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; + + DbgInst0 = XDmaPs_DBGINST0(0, 0x01, Channel, Thread); + + /* wait while debug status is busy */ + WaitCount = 0; + 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 */ + XDmaPs_WriteReg(BaseAddr, XDMAPS_DBGINST0_OFFSET, DbgInst0); + + 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; + Xil_AssertVoid(Pool != NULL); + + for (Index = 0; Index < XDMAPS_MAX_CHAN_BUFS; Index++) { + if (Pool[Index].Buf == Buf) { + if (Pool[Index].Allocated) { + Pool[Index].Allocated = 0; + } + } + } +} + +/*****************************************************************************/ +/** +* 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; + + XDmaPs_Instr_DMAGO(DmaGoProg, Channel, DmaProg, 0); + + DbgInst0 = XDmaPs_DBGINST0(*(DmaGoProg + 1), *DmaGoProg, 0, 0); + DbgInst1 = (u32)DmaProg; + + /* wait while debug status is busy */ + WaitCount = 0; + while ((XDmaPs_ReadReg(BaseAddr, XDMAPS_DBGSTATUS_OFFSET) + & XDMAPS_DBGSTATUS_BUSY) + && (WaitCount < XDMAPS_MAX_WAIT)) { + + WaitCount++; + } + + if (WaitCount >= XDMAPS_MAX_WAIT) { + xil_printf("PL330 device at %x debug status busy time out\r\n", + BaseAddr); + return -1; + } + + /* 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) { + 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); + + 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; + + /*Value = XDmaPs_ReadReg(InstPtr->Config.BaseAddress, + XDMAPS_INTSTATUS_OFFSET);*/ + + /* clear the interrupt status */ + XDmaPs_WriteReg(InstPtr->Config.BaseAddress, + XDMAPS_INTCLR_OFFSET, + 1 << ChanData->ChanId); + + /*Value = XDmaPs_ReadReg(InstPtr->Config.BaseAddress, + XDMAPS_INTSTATUS_OFFSET);*/ + + + DmaCmd = ChanData->DmaCmdToHw; + if (DmaCmd) { + 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps.h new file mode 100644 index 0000000..5a0c1a2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps.h @@ -0,0 +1,352 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps.h +* @addtogroup dmaps_v2_3 +* @{ +* @details +* +* +*
    +* 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.
    +* 1.07a asa    11/02/13. Made changes to fix compilation issues for iarcc.
    +*			   Removed the PDBG prints. By default they were always
    +*			   defined out and never used. The PDBG is non-standard for
    +*			   Xilinx drivers and no other driver does something similar.
    +*			   Since there is no easy way to fix compilation issues with
    +*			   the IARCC compiler around PDBG, it is better to remove it.
    +*			   Users can always use xil_printfs if they want to debug.
    +* 2.0   adk    10/12/13  Updated as per the New Tcl API's
    +* 2.01  kpc    08/23/14  Fixed the IAR compiler reported errors
    +* 2.2   mus    08/12/16  Declared all inline functions in xdmaps.c as extern, to avoid
    +*                        linker error for IAR compiler
    +* 2.3   ms     01/23/17 Modified xil_printf statement in main function for all
    +*                       examples to ensure that "Successfully ran" and "Failed"
    +*                       strings are available in all examples. This is a fix
    +*                       for CR-965028.
    +*       ms     03/17/17 Added readme.txt file in examples folder for doxygen
    +*                       generation.
    +* 
    +* +*****************************************************************************/ + +#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); + +/** + * To avoid linking error,Declare all inline functions as extern for + * IAR compiler + */ +#ifdef __ICCARM__ +extern INLINE int XDmaPs_Instr_DMAEND(char *DmaProg); +extern INLINE void XDmaPs_Memcpy4(char *Dst, char *Src); +extern INLINE int XDmaPs_Instr_DMAGO(char *DmaProg, unsigned int Cn, + u32 Imm, unsigned int Ns); +extern INLINE int XDmaPs_Instr_DMALD(char *DmaProg); +extern INLINE int XDmaPs_Instr_DMALP(char *DmaProg, unsigned Lc, + unsigned LoopIterations); +extern INLINE int XDmaPs_Instr_DMALPEND(char *DmaProg, char *BodyStart, unsigned Lc); +extern INLINE int XDmaPs_Instr_DMAMOV(char *DmaProg, unsigned Rd, u32 Imm); +extern INLINE int XDmaPs_Instr_DMANOP(char *DmaProg); +extern INLINE int XDmaPs_Instr_DMARMB(char *DmaProg); +extern INLINE int XDmaPs_Instr_DMASEV(char *DmaProg, unsigned int EventNumber); +extern INLINE int XDmaPs_Instr_DMAST(char *DmaProg); +extern INLINE int XDmaPs_Instr_DMAWMB(char *DmaProg); +extern INLINE unsigned XDmaPs_ToEndianSwapSizeBits(unsigned int EndianSwapSize); +extern INLINE unsigned XDmaPs_ToBurstSizeBits(unsigned BurstSize); +#endif + +/** + * 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_g.c new file mode 100644 index 0000000..bab1556 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_g.c @@ -0,0 +1,59 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xdmaps.h" + +/* +* The configuration table for devices +*/ + +XDmaPs_Config XDmaPs_ConfigTable[XPAR_XDMAPS_NUM_INSTANCES] = +{ + { + 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_hw.c new file mode 100644 index 0000000..4c0cfbf --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_hw.c @@ -0,0 +1,116 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps_hw.c +* @addtogroup dmaps_v2_3 +* @{ +* +* This file contains the implementation of the interface reset functionality +* for XDmaPs driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  	Date     Changes
    +* ----- ------ -------- ----------------------------------------------
    +* 1.06a kpc 10/07/13 First release
    +* 
    +* +*****************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_hw.h new file mode 100644 index 0000000..628f1ec --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_hw.h @@ -0,0 +1,293 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xdmaps_hw.h +* @addtogroup dmaps_v2_3 +* @{ +* +* This header file contains the hardware interface of an XDmaPs device. +* +*
    +* 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
    +* 
    +* +******************************************************************************/ + +#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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_selftest.c new file mode 100644 index 0000000..daebd99 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_selftest.c @@ -0,0 +1,110 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps_selftest.c +* @addtogroup dmaps_v2_3 +* @{ +* +* This file contains the self-test functions for the XDmaPs driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who     Date     Changes
    +* ----- ------ -------- -----------------------------------------------
    +* 1.00	hbm 	03/29/2010 First Release
    +* 
    +* +******************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_sinit.c new file mode 100644 index 0000000..b92ee53 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/dmaps_v2_3/src/xdmaps_sinit.c @@ -0,0 +1,104 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps_sinit.c +* @addtogroup dmaps_v2_3 +* @{ +* +* The implementation of the XDmaPs driver's static initialzation +* functionality. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00  hbm  08/13/10 First Release
    +* 
    +* +*****************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps.c new file mode 100644 index 0000000..c013c49 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps.c @@ -0,0 +1,492 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps.c +* @addtogroup emacps_v3_7 +* @{ +* +* 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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a wsy  01/10/10 First release
    +* 2.1  srt  07/15/14 Add support for Zynq Ultrascale Mp GEM specification and
    +*		      64-bit changes.
    +* 3.00 kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.0  hk   02/20/15 Added support for jumbo frames. Increase AHB burst.
    +*                    Disable extended mode. Perform all 64 bit changes under
    +*                    check for arch64.
    +* 3.1  hk   08/10/15 Update upper 32 bit tx and rx queue ptr registers
    +* 3.5  hk   08/14/17 Update cache coherency information of the interface in
    +*                    its config structure.
    +*
    +* 
    +******************************************************************************/ + +/***************************** 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 +* +******************************************************************************/ +LONG XEmacPs_CfgInitialize(XEmacPs *InstancePtr, XEmacPs_Config * CfgPtr, + UINTPTR 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; + InstancePtr->Config.IsCacheCoherent = CfgPtr->IsCacheCoherent; + + /* Set callbacks to an initial stub routine */ + InstancePtr->SendHandler = ((XEmacPs_Handler)((void*)XEmacPs_StubHandler)); + InstancePtr->RecvHandler = ((XEmacPs_Handler)(void*)XEmacPs_StubHandler); + InstancePtr->ErrorHandler = ((XEmacPs_ErrHandler)(void*)XEmacPs_StubHandler); + + /* Reset the hardware and set default options */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + XEmacPs_Reset(InstancePtr); + + return (LONG)(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 == (u32)XIL_COMPONENT_IS_READY); + + /* Start DMA */ + /* When starting the DMA channels, both transmit and receive sides + * need an initialized BD list. + */ + if (InstancePtr->Version == 2) { + Xil_AssertVoid(InstancePtr->RxBdRing.BaseBdAddr != 0); + Xil_AssertVoid(InstancePtr->TxBdRing.BaseBdAddr != 0); + 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 & (u32)XEMACPS_TRANSMITTER_ENABLE_OPTION)!=0x00000000U) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + if ((!(Reg & XEMACPS_NWCTRL_TXEN_MASK))==TRUE) { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, + Reg | (u32)XEMACPS_NWCTRL_TXEN_MASK); + } + } + + /* Enable receiver if not already enabled */ + if ((InstancePtr->Options & XEMACPS_RECEIVER_ENABLE_OPTION) != 0x00000000U) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + if ((!(Reg & XEMACPS_NWCTRL_RXEN_MASK))==TRUE) { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, + Reg | (u32)XEMACPS_NWCTRL_RXEN_MASK); + } + } + + /* Enable TX and RX interrupts */ + XEmacPs_IntEnable(InstancePtr, (XEMACPS_IXR_TX_ERR_MASK | + XEMACPS_IXR_RX_ERR_MASK | (u32)XEMACPS_IXR_FRAMERX_MASK | + (u32)XEMACPS_IXR_TXCOMPL_MASK)); + + /* Enable TX Q1 Interrupts */ + if (InstancePtr->Version > 2) + XEmacPs_IntQ1Enable(InstancePtr, XEMACPS_INTQ1_IXR_ALL_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 == (u32)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 &= (u32)(~XEMACPS_NWCTRL_RXEN_MASK); + Reg &= (u32)(~XEMACPS_NWCTRL_TXEN_MASK); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, Reg); + + /* Mark as stopped */ + InstancePtr->IsStarted = 0U; +} + + +/*****************************************************************************/ +/** +* 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; + s8 EmacPs_zero_MAC[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + /* Stop the device and reset hardware */ + XEmacPs_Stop(InstancePtr); + InstancePtr->Options = XEMACPS_DEFAULT_OPTIONS; + + InstancePtr->Version = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, 0xFC); + + InstancePtr->Version = (InstancePtr->Version >> 16) & 0xFFF; + + InstancePtr->MaxMtuSize = XEMACPS_MTU; + InstancePtr->MaxFrameSize = XEMACPS_MTU + XEMACPS_HDR_SIZE + + XEMACPS_TRL_SIZE; + InstancePtr->MaxVlanFrameSize = InstancePtr->MaxFrameSize + + XEMACPS_HDR_VLAN_SIZE; + InstancePtr->RxBufMask = XEMACPS_RXBUF_LEN_MASK; + + /* Setup hardware with default values */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, + (XEMACPS_NWCTRL_STATCLR_MASK | + XEMACPS_NWCTRL_MDEN_MASK) & + (u32)(~XEMACPS_NWCTRL_LOOPEN_MASK)); + + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET); + Reg &= XEMACPS_NWCFG_MDCCLKDIV_MASK; + + Reg = Reg | (u32)XEMACPS_NWCFG_100_MASK | + (u32)XEMACPS_NWCFG_FDEN_MASK | + (u32)XEMACPS_NWCFG_UCASTHASHEN_MASK; + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET, Reg); + if (InstancePtr->Version > 2) { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_NWCFG_OFFSET, + (XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, XEMACPS_NWCFG_OFFSET) | + XEMACPS_NWCFG_DWIDTH_64_MASK)); + } + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET, + (((((u32)XEMACPS_RX_BUF_SIZE / (u32)XEMACPS_RX_BUF_UNIT) + + (((((u32)XEMACPS_RX_BUF_SIZE % + (u32)XEMACPS_RX_BUF_UNIT))!=(u32)0) ? 1U : 0U)) << + (u32)(XEMACPS_DMACR_RXBUF_SHIFT)) & + (u32)(XEMACPS_DMACR_RXBUF_MASK)) | + (u32)XEMACPS_DMACR_RXSIZE_MASK | + (u32)XEMACPS_DMACR_TXSIZE_MASK); + + + /* Single bursts */ + /* FIXME: Why Single bursts? */ + if (InstancePtr->Version > 2) { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_DMACR_OFFSET, + (XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, XEMACPS_DMACR_OFFSET) | +#ifdef __aarch64__ + (u32)XEMACPS_DMACR_ADDR_WIDTH_64 | +#endif + (u32)XEMACPS_DMACR_INCR16_AHB_BURST)); + } + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXSR_OFFSET, 0x0U); + + XEmacPs_SetQueuePtr(InstancePtr, 0, 0x00U, (u16)XEMACPS_SEND); + if (InstancePtr->Version > 2) + XEmacPs_SetQueuePtr(InstancePtr, 0, 0x01U, (u16)XEMACPS_SEND); + XEmacPs_SetQueuePtr(InstancePtr, 0, 0x00U, (u16)XEMACPS_RECV); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_RXSR_OFFSET, 0x0U); + + 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_ClearHash(InstancePtr); + + for (i = 1U; i < 5U; i++) { + (void)XEmacPs_SetMacAddress(InstancePtr, EmacPs_zero_MAC, i); + (void)XEmacPs_SetTypeIdCheck(InstancePtr, 0x00000000U, i); + } + + /* clear all counters */ + for (i = 0U; i < (u8)((XEMACPS_LAST_OFFSET - XEMACPS_OCTTXL_OFFSET) / 4U); + i++) { + (void)XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_OCTTXL_OFFSET + (u32)(((u32)i) * ((u32)4))); + } + + /* Disable the receiver */ + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg &= (u32)(~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. + */ + (void)XEmacPs_SetOptions(InstancePtr, InstancePtr->Options & + ~((u32)XEMACPS_TRANSMITTER_ENABLE_OPTION | + (u32)XEMACPS_RECEIVER_ENABLE_OPTION)); + + (void)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(); +} + +/*****************************************************************************/ +/** +* This function sets the start address of the transmit/receive buffer queue. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @QPtr Address of the Queue to be written +* @QueueNum Buffer Queue Index +* @Direction Transmit/Recive +* +* @note +* The buffer queue addresses has to be set before starting the transfer, so +* this function has to be called in prior to XEmacPs_Start() +* +******************************************************************************/ +void XEmacPs_SetQueuePtr(XEmacPs *InstancePtr, UINTPTR QPtr, u8 QueueNum, + u16 Direction) +{ + /* Assert bad arguments and conditions */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + /* If already started, then there is nothing to do */ + if (InstancePtr->IsStarted == (u32)XIL_COMPONENT_IS_STARTED) { + return; + } + + if (QueueNum == 0x00U) { + if (Direction == XEMACPS_SEND) { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXQBASE_OFFSET, + (QPtr & ULONG64_LO_MASK)); + } else { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_RXQBASE_OFFSET, + (QPtr & ULONG64_LO_MASK)); + } + } + else { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXQ1BASE_OFFSET, + (QPtr & ULONG64_LO_MASK)); + } +#ifdef __aarch64__ + if (Direction == XEMACPS_SEND) { + /* Set the MSB of TX Queue start address */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_MSBBUF_TXQBASE_OFFSET, + (u32)((QPtr & ULONG64_HI_MASK) >> 32U)); + } else { + /* Set the MSB of RX Queue start address */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_MSBBUF_RXQBASE_OFFSET, + (u32)((QPtr & ULONG64_HI_MASK) >> 32U)); + } +#endif +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps.h new file mode 100644 index 0000000..6d4b15b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps.h @@ -0,0 +1,809 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** + * + * @file xemacps.h +* @addtogroup emacps_v3_7 +* @{ +* @details + * + * 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 + * + * Driver Description + * + * 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. + * + * Initialization & Configuration + * + * 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. + * + * Interrupts and Asynchronous Callbacks + * + * 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. + * + * Virtual Memory + * + * 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. + * + * DMA + * + * 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. + * + * Alignment & Data Cache Restrictions + * + * 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. + * + * Buffer Copying + * + * 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. + * + * Checksum Offloading + * + * 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. + * + * PHY Interfaces + * + * RGMII 1.3 is the only interface supported. + * + * Asserts + * + * 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. + * + *
    + * 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.
    + * 1.06a asa  11/02/13 Changed the value for XEMACPS_RXBUF_LEN_MASK from 0x3fff
    + *				to 0x1fff. This fixes the CR#744902.
    + *			  Made changes in example file xemacps_example.h to fix compilation
    + *			  issues with iarcc compiler.
    + * 2.0   adk  10/12/13 Updated as per the New Tcl API's
    + * 2.1   adk  11/08/14 Fixed the CR#811288. Changes are made in the driver tcl file.
    + * 2.1   bss  09/08/14 Modified driver tcl to fix CR#820349 to export phy
    + *		       address in xparameters.h when GMII to RGMII converter
    + *		       is present in hw.
    + * 2.1   srt  07/15/14 Add support for Zynq Ultrascale Mp GEM specification and 64-bit
    + *		       changes.
    + * 2.2   adk  29/10/14 Fixed CR#827686 when PCS/PMA core is configured with
    + *                    1000BASE-X mode export proper values to the xparameters.h
    + *                    file. Changes are made in the driver tcl file.
    + * 3.0   adk  08/1/15  Don't include gem in peripheral test when gem is
    + *                    configured with PCS/PMA Core. Changes are made in the
    + *		       test app tcl(CR:827686).
    + * 3.0   kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    + * 3.0   hk   03/18/15 Added support for jumbo frames. Increase AHB burst.
    + *                     Disable extended mode. Perform all 64 bit changes under
    + *                     check for arch64.
    + *                     Remove "used bit set" from TX error interrupt masks.
    + * 3.1   hk   07/27/15 Do not call error handler with '0' error code when
    + *                     there is no error. CR# 869403
    + *            08/10/15 Update upper 32 bit tx and rx queue ptr registers.
    + * 3.2   hk   02/22/16 Added SGMII support for Zynq Ultrascale+ MPSoC.
    + * 3.4   ms   01/23/17 Modified xil_printf statement in main function for all
    + *                     examples to ensure that "Successfully ran" and "Failed"
    + *                     strings are available in all examples. This is a fix
    + *                     for CR-965028.
    + *       ms   03/17/17 Modified text file in examples folder for doxygen
    + *                     generation.
    + *       ms   04/05/17 Added tabspace for return statements in functions of
    + *                     xemacps_ieee1588_example.c for proper documentation
    + *                     while generating doxygen.
    + * 3.5   hk   08/14/17 Update cache coherency information of the interface in
    + *                     its config structure.
    + * 3.6   rb   09/08/17 HwCnt variable (in XEmacPs_BdRing structure) is
    + *		       changed to volatile.
    + *		       Add API XEmacPs_BdRingPtrReset() to reset pointers
    + *
    + * 
    + * + ****************************************************************************/ + +#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 0x00000001U +/**< Accept all incoming packets. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_FRAME1536_OPTION 0x00000002U +/**< Frame larger than 1516 support for Tx & Rx. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_VLAN_OPTION 0x00000004U +/**< VLAN Rx & Tx frame support. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_FLOW_CONTROL_OPTION 0x00000010U +/**< Enable recognition of flow control frames on Rx + * This option defaults to enabled (set) */ + +#define XEMACPS_FCS_STRIP_OPTION 0x00000020U +/**< 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 0x00000040U +/**< Generate FCS field and add PAD automatically for outgoing frames. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_LENTYPE_ERR_OPTION 0x00000080U +/**< 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 0x00000100U +/**< Enable the transmitter. + * This option defaults to enabled (set) */ + +#define XEMACPS_RECEIVER_ENABLE_OPTION 0x00000200U +/**< Enable the receiver + * This option defaults to enabled (set) */ + +#define XEMACPS_BROADCAST_OPTION 0x00000400U +/**< Allow reception of the broadcast address + * This option defaults to enabled (set) */ + +#define XEMACPS_MULTICAST_OPTION 0x00000800U +/**< Allows reception of multicast addresses programmed into hash + * This option defaults to disabled (clear) */ + +#define XEMACPS_RX_CHKSUM_ENABLE_OPTION 0x00001000U +/**< Enable the RX checksum offload + * This option defaults to enabled (set) */ + +#define XEMACPS_TX_CHKSUM_ENABLE_OPTION 0x00002000U +/**< Enable the TX checksum offload + * This option defaults to enabled (set) */ + +#define XEMACPS_JUMBO_ENABLE_OPTION 0x00004000U +#define XEMACPS_SGMII_ENABLE_OPTION 0x00008000U + +#define XEMACPS_DEFAULT_OPTIONS \ + ((u32)XEMACPS_FLOW_CONTROL_OPTION | \ + (u32)XEMACPS_FCS_INSERT_OPTION | \ + (u32)XEMACPS_FCS_STRIP_OPTION | \ + (u32)XEMACPS_BROADCAST_OPTION | \ + (u32)XEMACPS_LENTYPE_ERR_OPTION | \ + (u32)XEMACPS_TRANSMITTER_ENABLE_OPTION | \ + (u32)XEMACPS_RECEIVER_ENABLE_OPTION | \ + (u32)XEMACPS_RX_CHKSUM_ENABLE_OPTION | \ + (u32)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 1U +#define XEMACPS_HANDLER_DMARECV 2U +#define XEMACPS_HANDLER_ERROR 3U +/*@}*/ + +/* 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 6U /* size of Ethernet header */ + +#define XEMACPS_MTU 1500U /* max MTU size of Ethernet frame */ +#define XEMACPS_MTU_JUMBO 10240U /* max MTU size of jumbo frame */ +#define XEMACPS_HDR_SIZE 14U /* size of Ethernet header */ +#define XEMACPS_HDR_VLAN_SIZE 18U /* size of Ethernet header with VLAN */ +#define XEMACPS_TRL_SIZE 4U /* 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) +#define XEMACPS_MAX_VLAN_FRAME_SIZE_JUMBO (XEMACPS_MTU_JUMBO + XEMACPS_HDR_SIZE + \ + XEMACPS_HDR_VLAN_SIZE + XEMACPS_TRL_SIZE) + +/* DMACR Bust length hash defines */ + +#define XEMACPS_SINGLE_BURST 0x00000001 +#define XEMACPS_4BYTE_BURST 0x00000004 +#define XEMACPS_8BYTE_BURST 0x00000008 +#define XEMACPS_16BYTE_BURST 0x00000010 + + +/**************************** 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 */ + UINTPTR BaseAddress;/**< Physical base address of IPIF registers */ + u8 IsCacheCoherent; /**< Applicable only to A53 in EL1 mode; + * describes whether Cache Coherent or not */ +} 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_Instance { + 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; + u32 Version; + u32 RxBufMask; + u32 MaxMtuSize; + u32 MaxFrameSize; + u32 MaxVlanFrameSize; + +} 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 Mask. The corresponding interrupt for +* each bit set to 1 in Mask, 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 Mask. The corresponding interrupt for +* each bit set to 1 in Mask, 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)); + +/****************************************************************************/ +/** +* +* Enable interrupts specified in Mask. The corresponding interrupt for +* each bit set to 1 in Mask, 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_IntQ1Enable(XEmacPs *InstancePtr, u32 Mask) +* +*****************************************************************************/ +#define XEmacPs_IntQ1Enable(InstancePtr, Mask) \ + XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_INTQ1_IER_OFFSET, \ + ((Mask) & XEMACPS_INTQ1_IXR_ALL_MASK)); + +/****************************************************************************/ +/** +* +* Disable interrupts specified in Mask. The corresponding interrupt for +* each bit set to 1 in Mask, 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_IntQ1Disable(InstancePtr, Mask) \ + XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_INTQ1_IDR_OFFSET, \ + ((Mask) & XEMACPS_INTQ1_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) != 0U \ + ? 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) != 0U \ + ? TRUE : FALSE) + +/************************** Function Prototypes *****************************/ + +/* + * Initialization functions in xemacps.c + */ +LONG XEmacPs_CfgInitialize(XEmacPs *InstancePtr, XEmacPs_Config *CfgPtr, + UINTPTR EffectiveAddress); +void XEmacPs_Start(XEmacPs *InstancePtr); +void XEmacPs_Stop(XEmacPs *InstancePtr); +void XEmacPs_Reset(XEmacPs *InstancePtr); +void XEmacPs_SetQueuePtr(XEmacPs *InstancePtr, UINTPTR QPtr, u8 QueueNum, + u16 Direction); + +/* + * 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. + */ +LONG XEmacPs_SetHandler(XEmacPs *InstancePtr, u32 HandlerType, + void *FuncPointer, void *CallBackRef); +void XEmacPs_IntrHandler(void *XEmacPsPtr); + +/* + * MAC configuration/control functions in XEmacPs_control.c + */ +LONG XEmacPs_SetOptions(XEmacPs *InstancePtr, u32 Options); +LONG XEmacPs_ClearOptions(XEmacPs *InstancePtr, u32 Options); +u32 XEmacPs_GetOptions(XEmacPs *InstancePtr); + +LONG XEmacPs_SetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index); +LONG XEmacPs_DeleteHash(XEmacPs *InstancePtr, void *AddressPtr); +void XEmacPs_GetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index); + +LONG 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); +LONG XEmacPs_PhyRead(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 *PhyDataPtr); +LONG XEmacPs_PhyWrite(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 PhyData); +LONG XEmacPs_SetTypeIdCheck(XEmacPs *InstancePtr, u32 Id_Check, u8 Index); + +LONG XEmacPs_SendPausePacket(XEmacPs *InstancePtr); +void XEmacPs_DMABLengthUpdate(XEmacPs *InstancePtr, s32 BLength); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bd.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bd.h new file mode 100644 index 0000000..83f9a87 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bd.h @@ -0,0 +1,804 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xemacps_bd.h +* @addtogroup emacps_v3_7 +* @{ + * + * 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. + * + * Buffer Descriptors + * + * 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. + * + * Performance + * + * Limiting I/O to BDs can improve overall performance of the DMA channel. + * + *
    + * MODIFICATION HISTORY:
    + *
    + * Ver   Who  Date     Changes
    + * ----- ---- -------- -------------------------------------------------------
    + * 1.00a wsy  01/10/10 First release
    + * 2.1   srt  07/15/14 Add support for Zynq Ultrascale MP GEM specification
    + *                     and 64-bit changes.
    + * 3.0   kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    + * 3.0   hk   02/20/15 Added support for jumbo frames.
    + *                     Disable extended mode. Perform all 64 bit changes under
    + *                     check for arch64.
    + * 3.2   hk   11/18/15 Change BD typedef and number of words.
    + *
    + * 
    + * + * *************************************************************************** + */ + +#ifndef XEMACPS_BD_H /* prevent circular inclusions */ +#define XEMACPS_BD_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include +#include "xil_types.h" +#include "xil_assert.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ +#ifdef __aarch64__ +/* Minimum BD alignment */ +#define XEMACPS_DMABD_MINIMUM_ALIGNMENT 64U +#define XEMACPS_BD_NUM_WORDS 4U +#else +/* Minimum BD alignment */ +#define XEMACPS_DMABD_MINIMUM_ALIGNMENT 4U +#define XEMACPS_BD_NUM_WORDS 2U +#endif + +/** + * The XEmacPs_Bd is the type for buffer descriptors (BDs). + */ +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(UINTPTR BaseAddress, UINTPTR Offset) +* +*****************************************************************************/ +#define XEmacPs_BdRead(BaseAddress, Offset) \ + (*(u32 *)((UINTPTR)((void*)(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(UINTPTR BaseAddress, UINTPTR Offset, UINTPTR Data) +* +*****************************************************************************/ +#define XEmacPs_BdWrite(BaseAddress, Offset, Data) \ + (*(u32 *)((UINTPTR)(void*)(BaseAddress) + (u32)(Offset)) = (u32)(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, UINTPTR Addr) + * + *****************************************************************************/ +#ifdef __aarch64__ +#define XEmacPs_BdSetAddressTx(BdPtr, Addr) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + (u32)((Addr) & ULONG64_LO_MASK)); \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_HI_OFFSET, \ + (u32)(((Addr) & ULONG64_HI_MASK) >> 32U)); +#else +#define XEmacPs_BdSetAddressTx(BdPtr, Addr) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, (u32)(Addr)) +#endif + +/*****************************************************************************/ +/** + * 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, UINTPTR Addr) + * + *****************************************************************************/ +#ifdef __aarch64__ +#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) & ULONG64_LO_MASK)))); \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_HI_OFFSET, \ + (u32)(((Addr) & ULONG64_HI_MASK) >> 32U)); +#else +#define XEmacPs_BdSetAddressRx(BdPtr, Addr) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + ~XEMACPS_RXBUF_ADD_MASK) | (UINTPTR)(Addr))) +#endif + +/*****************************************************************************/ +/** + * 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, UINTPTR 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: + * UINTPTR XEmacPs_BdGetBufAddr(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#ifdef __aarch64__ +#define XEmacPs_BdGetBufAddr(BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) | \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_HI_OFFSET)) << 32U) +#else +#define XEmacPs_BdGetBufAddr(BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET)) +#endif + +/*****************************************************************************/ +/** + * 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))) + + + +/*****************************************************************************/ +/** + * 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: + * UINTPTR 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) + +/*****************************************************************************/ +/** + * Retrieve the RX frame size. + * + * The returned value is the size of the received packet. + * This API supports jumbo frame sizes if enabled. + * + * @param BdPtr is the BD pointer to operate on + * + * @return Length field processed by hardware or set by + * XEmacPs_BdSetLength(). + * + * @note + * C-style signature: + * UINTPTR XEmacPs_GetRxFrameSize(XEmacPs* InstancePtr, XEmacPs_Bd* BdPtr) + * RxBufMask is dependent on whether jumbo is enabled or not. + * + *****************************************************************************/ +#define XEmacPs_GetRxFrameSize(InstancePtr, BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + (InstancePtr)->RxBufMask) + +/*****************************************************************************/ +/** + * 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: + * UINTPTR XEmacPs_BdIsLast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsLast(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_EOF_MASK)!=0U ? 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: + * u8 XEmacPs_BdIsRxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxWrap(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + XEMACPS_RXBUF_WRAP_MASK)!=0U ? 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: + * u8 XEmacPs_BdGetTxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxWrap(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_WRAP_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsRxNew(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxNew(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + XEMACPS_RXBUF_NEW_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsTxUsed(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxUsed(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_USED_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsTxRetry(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxRetry(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_RETRY_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsTxUrun(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxUrun(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_URUN_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsTxExh(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxExh(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_EXH_MASK)!=0U ? 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: + * UINTPTR 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: + * UINTPTR 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: + * UINTPTR XEmacPs_BdIsRxBcast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxBcast(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_BCAST_MASK)!=0U ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the multicast hash bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * UINTPTR XEmacPs_BdIsRxMultiHash(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxMultiHash(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_MULTIHASH_MASK)!=0U ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the unicast hash bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * UINTPTR XEmacPs_BdIsRxUniHash(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxUniHash(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_UNIHASH_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsRxVlan(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxVlan(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_VLAN_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsRxPri(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxPri(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_PRI_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdIsRxCFI(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxCFI(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_CFI_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdGetRxEOF(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxEOF(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_EOF_MASK)!=0U ? 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: + * UINTPTR XEmacPs_BdGetRxSOF(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxSOF(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_SOF_MASK)!=0U ? TRUE : FALSE) + + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bdring.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bdring.c new file mode 100644 index 0000000..3536873 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bdring.c @@ -0,0 +1,1102 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_bdring.c +* @addtogroup emacps_v3_7 +* @{ +* +* This file implements buffer descriptor ring related functions. +* +*
    +* 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.
    +* 2.1   srt  07/15/14 Add support for Zynq Ultrascale Mp architecture.
    +* 3.0   kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.6   rb   09/08/17 Add XEmacPs_BdRingPtrReset() API to reset BD ring
    +* 		      pointers
    +*
    +* 
    +******************************************************************************/ + +/***************************** 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) \ + ((UINTPTR)(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) \ + ((UINTPTR)(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) \ + { \ + UINTPTR Addr = (UINTPTR)(void *)(BdPtr); \ + \ + Addr += ((RingPtr)->Separation * (NumBd)); \ + if ((Addr > (RingPtr)->HighBdAddr) || ((UINTPTR)(void *)(BdPtr) > Addr)) \ + { \ + Addr -= (RingPtr)->Length; \ + } \ + \ + (BdPtr) = (XEmacPs_Bd*)(void *)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) \ + { \ + UINTPTR Addr = (UINTPTR)(void *)(BdPtr); \ + \ + Addr -= ((RingPtr)->Separation * (NumBd)); \ + if ((Addr < (RingPtr)->BaseBdAddr) || ((UINTPTR)(void*)(BdPtr) < Addr)) \ + { \ + Addr += (RingPtr)->Length; \ + } \ + \ + (BdPtr) = (XEmacPs_Bd*)(void*)Addr; \ + } + + +/************************** Function Prototypes ******************************/ + +static void XEmacPs_BdSetRxWrap(UINTPTR BdPtr); +static void XEmacPs_BdSetTxWrap(UINTPTR BdPtr); + +/************************** 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. + *****************************************************************************/ +LONG XEmacPs_BdRingCreate(XEmacPs_BdRing * RingPtr, UINTPTR PhysAddr, + UINTPTR VirtAddr, u32 Alignment, u32 BdCount) +{ + u32 i; + UINTPTR BdVirtAddr; + UINTPTR BdPhyAddr; + UINTPTR VirtAddrLoc = VirtAddr; + + /* 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 = 0U; + RingPtr->FreeCnt = 0U; + RingPtr->HwCnt = 0U; + RingPtr->PreCnt = 0U; + RingPtr->PostCnt = 0U; + + /* Make sure Alignment parameter meets minimum requirements */ + if (Alignment < (u32)XEMACPS_DMABD_MINIMUM_ALIGNMENT) { + return (LONG)(XST_INVALID_PARAM); + } + + /* Make sure Alignment is a power of 2 */ + if (((Alignment - 0x00000001U) & Alignment)!=0x00000000U) { + return (LONG)(XST_INVALID_PARAM); + } + + /* Make sure PhysAddr and VirtAddr are on same Alignment */ + if (((PhysAddr % Alignment)!=(u32)0) || ((VirtAddrLoc % Alignment)!=(u32)0)) { + return (LONG)(XST_INVALID_PARAM); + } + + /* Is BdCount reasonable? */ + if (BdCount == 0x00000000U) { + return (LONG)(XST_INVALID_PARAM); + } + + /* Figure out how many bytes will be between the start of adjacent BDs */ + RingPtr->Separation = ((u32)sizeof(XEmacPs_Bd)); + + /* Must make sure the ring doesn't span address 0x00000000. If it does, + * then the next/prev BD traversal macros will fail. + */ + if (VirtAddrLoc > ((VirtAddrLoc + (RingPtr->Separation * BdCount)) - (u32)1)) { + return (LONG)(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 + */ + (void)memset((void *) VirtAddrLoc, 0, (RingPtr->Separation * BdCount)); + + BdVirtAddr = VirtAddrLoc; + BdPhyAddr = PhysAddr + RingPtr->Separation; + for (i = 1U; i < BdCount; i++) { + BdVirtAddr += RingPtr->Separation; + BdPhyAddr += RingPtr->Separation; + } + + /* Setup and initialize pointers and counters */ + RingPtr->RunState = (u32)(XST_DMA_SG_IS_STOPPED); + RingPtr->BaseBdAddr = VirtAddrLoc; + RingPtr->PhysBaseAddr = PhysAddr; + RingPtr->HighBdAddr = BdVirtAddr; + RingPtr->Length = + ((RingPtr->HighBdAddr - RingPtr->BaseBdAddr) + RingPtr->Separation); + RingPtr->AllCnt = (u32)BdCount; + RingPtr->FreeCnt = (u32)BdCount; + RingPtr->FreeHead = (XEmacPs_Bd *)(void *)VirtAddrLoc; + RingPtr->PreHead = (XEmacPs_Bd *)VirtAddrLoc; + RingPtr->HwHead = (XEmacPs_Bd *)VirtAddrLoc; + RingPtr->HwTail = (XEmacPs_Bd *)VirtAddrLoc; + RingPtr->PostHead = (XEmacPs_Bd *)VirtAddrLoc; + RingPtr->BdaRestart = (XEmacPs_Bd *)(void *)PhysAddr; + + return (LONG)(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. + * + *****************************************************************************/ +LONG XEmacPs_BdRingClone(XEmacPs_BdRing * RingPtr, XEmacPs_Bd * SrcBdPtr, + u8 Direction) +{ + u32 i; + UINTPTR CurBd; + + /* Can't do this function if there isn't a ring */ + if (RingPtr->AllCnt == 0x00000000U) { + return (LONG)(XST_DMA_SG_NO_LIST); + } + + /* Can't do this function with the channel running */ + if (RingPtr->RunState == (u32)XST_DMA_SG_IS_STARTED) { + return (LONG)(XST_DEVICE_IS_STARTED); + } + + /* Can't do this function with some of the BDs in use */ + if (RingPtr->FreeCnt != RingPtr->AllCnt) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + + if ((Direction != (u8)XEMACPS_SEND) && (Direction != (u8)XEMACPS_RECV)) { + return (LONG)(XST_INVALID_PARAM); + } + + /* Starting from the top of the ring, save BD.Next, overwrite the entire + * BD with the template, then restore BD.Next + */ + CurBd = RingPtr->BaseBdAddr; + for (i = 0U; i < RingPtr->AllCnt; i++) { + memcpy((void *)CurBd, SrcBdPtr, sizeof(XEmacPs_Bd)); + CurBd += RingPtr->Separation; + } + + CurBd -= RingPtr->Separation; + + if (Direction == XEMACPS_RECV) { + XEmacPs_BdSetRxWrap(CurBd); + } + else { + XEmacPs_BdSetTxWrap(CurBd); + } + + return (LONG)(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: + * + *
    +* +******************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_selftest.c new file mode 100644 index 0000000..7f171b4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_selftest.c @@ -0,0 +1,141 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xadcps_selftest.c +* @addtogroup xadcps_v2_2 +* @{ +* +* 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. +* +*
    +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- -----  -------- -----------------------------------------------------
    +* 1.00a ssb    12/22/11 First release based on the XPS/AXI xadc driver
    +*
    +* 
    +* +*****************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_sinit.c new file mode 100644 index 0000000..5fb7cde --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_sinit.c @@ -0,0 +1,103 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xadcps_sinit.c +* @addtogroup xadcps_v2_2 +* @{ +* +* This file contains the implementation of the XAdcPs driver's static +* initialization functionality. +* +* @note None. +* +*
    +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- -----  -------- -----------------------------------------------------
    +* 1.00a ssb    12/22/11 First release based on the XPS/AXI XADC driver
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/webtalk/sdk_webtalk.tcl b/LED_Blink/LED_Blink.sdk/webtalk/sdk_webtalk.tcl new file mode 100644 index 0000000..cc242e3 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/webtalk/sdk_webtalk.tcl @@ -0,0 +1,71 @@ +webtalk_init -webtalk_dir C:\\Users\\qwpmb\\Documents\\summercamp2018\\LED_Blink\\LED_Blink.sdk\\webtalk +webtalk_register_client -client project +webtalk_add_data -client project -key date_generated -value "2018-08-17 17:53:29" -context "software_version_and_target_device" +webtalk_add_data -client project -key product_version -value "SDK v2018.2" -context "software_version_and_target_device" +webtalk_add_data -client project -key build_version -value "2018.2" -context "software_version_and_target_device" +webtalk_add_data -client project -key os_platform -value "amd64" -context "software_version_and_target_device" +webtalk_add_data -client project -key registration_id -value "" -context "software_version_and_target_device" +webtalk_add_data -client project -key tool_flow -value "SDK" -context "software_version_and_target_device" +webtalk_add_data -client project -key beta -value "false" -context "software_version_and_target_device" +webtalk_add_data -client project -key route_design -value "NA" -context "software_version_and_target_device" +webtalk_add_data -client project -key target_family -value "NA" -context "software_version_and_target_device" +webtalk_add_data -client project -key target_device -value "NA" -context "software_version_and_target_device" +webtalk_add_data -client project -key target_package -value "NA" -context "software_version_and_target_device" +webtalk_add_data -client project -key target_speed -value "NA" -context "software_version_and_target_device" +webtalk_add_data -client project -key random_id -value "v03ogjrqk0aq1qtonnogd2hhn8" -context "software_version_and_target_device" +webtalk_add_data -client project -key project_id -value "2018.2_1" -context "software_version_and_target_device" +webtalk_add_data -client project -key project_iteration -value "1" -context "software_version_and_target_device" +webtalk_add_data -client project -key os_name -value "Microsoft Windows 8 or later , 64-bit" -context "user_environment" +webtalk_add_data -client project -key os_release -value "major release (build 9200)" -context "user_environment" +webtalk_add_data -client project -key cpu_name -value "Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz" -context "user_environment" +webtalk_add_data -client project -key cpu_speed -value "2400 MHz" -context "user_environment" +webtalk_add_data -client project -key total_processors -value "1" -context "user_environment" +webtalk_add_data -client project -key system_ram -value "8.419 GB" -context "user_environment" +webtalk_register_client -client sdk +webtalk_add_data -client sdk -key uid -value "1534495721041" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key isZynq -value "true" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key isZynqMP -value "false" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key Processors -value "2" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key VivadoVersion -value "2018.2" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key Arch -value "zynq" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key Device -value "7z010" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key IsHandoff -value "true" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key os -value "NA" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key apptemplate -value "NA" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key RecordType -value "HWCreation" -context "sdk\\\\hardware/1534495721041" +webtalk_add_data -client sdk -key uid -value "1534495750592" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key isZynq -value "true" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key isZynqMP -value "false" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key Processors -value "2" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key VivadoVersion -value "2016.3.0" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key Arch -value "zynq" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key Device -value "7z020" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key IsHandoff -value "true" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key os -value "NA" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key apptemplate -value "NA" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key RecordType -value "HWCreation" -context "sdk\\\\hardware/1534495750592" +webtalk_add_data -client sdk -key uid -value "1534495751307" -context "sdk\\\\bsp/1534495751307" +webtalk_add_data -client sdk -key hwid -value "1534495750592" -context "sdk\\\\bsp/1534495751307" +webtalk_add_data -client sdk -key os -value "standalone" -context "sdk\\\\bsp/1534495751307" +webtalk_add_data -client sdk -key apptemplate -value "hello_world" -context "sdk\\\\bsp/1534495751307" +webtalk_add_data -client sdk -key RecordType -value "BSPCreation" -context "sdk\\\\bsp/1534495751307" +webtalk_add_data -client sdk -key uid -value "1534495762619" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key hwid -value "1534495750592" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key bspid -value "1534495751307" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key newbsp -value "true" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key os -value "standalone" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key apptemplate -value "hello_world" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key RecordType -value "APPCreation" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key LangUsed -value "C" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key Procused -value "ps7_cortexa9" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key projSize -value "202.0078125" -context "sdk\\\\application/1534495762619" +webtalk_add_data -client sdk -key uid -value "NA" -context "sdk\\\\bsp/1534496009840" +webtalk_add_data -client sdk -key RecordType -value "ToolUsage" -context "sdk\\\\bsp/1534496009840" +webtalk_add_data -client sdk -key BootgenCount -value "0" -context "sdk\\\\bsp/1534496009840" +webtalk_add_data -client sdk -key DebugCount -value "0" -context "sdk\\\\bsp/1534496009840" +webtalk_add_data -client sdk -key PerfCount -value "0" -context "sdk\\\\bsp/1534496009840" +webtalk_add_data -client sdk -key FlashCount -value "0" -context "sdk\\\\bsp/1534496009840" +webtalk_add_data -client sdk -key CrossTriggCount -value "0" -context "sdk\\\\bsp/1534496009840" +webtalk_add_data -client sdk -key QemuDebugCount -value "0" -context "sdk\\\\bsp/1534496009840" +webtalk_transmit -clientid 3983968469 -regid "" -xml C:\\Users\\qwpmb\\Documents\\summercamp2018\\LED_Blink\\LED_Blink.sdk\\webtalk\\usage_statistics_ext_sdk.xml -html C:\\Users\\qwpmb\\Documents\\summercamp2018\\LED_Blink\\LED_Blink.sdk\\webtalk\\usage_statistics_ext_sdk.html -wdm C:\\Users\\qwpmb\\Documents\\summercamp2018\\LED_Blink\\LED_Blink.sdk\\webtalk\\sdk_webtalk.wdm -intro "

    SDK Usage Report


    " +webtalk_terminate diff --git a/LED_Blink/LED_Blink.sdk/webtalk/usage_statistics_ext_sdk.xml b/LED_Blink/LED_Blink.sdk/webtalk/usage_statistics_ext_sdk.xml new file mode 100644 index 0000000..97d8c16 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/webtalk/usage_statistics_ext_sdk.xml @@ -0,0 +1,89 @@ + + +
    +
    + + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    +
    + + + + + + + + + + +
    +
    + + + + + +
    +
    + + + + + + + + +
    +
    + + + + + + + + + + + +
    +
    + + + + + + + + + + + +
    +
    +
    +
    +
    +
    diff --git a/LED_Blink/LED_Blink.sdk/webtalk/webtalk.jou b/LED_Blink/LED_Blink.sdk/webtalk/webtalk.jou new file mode 100644 index 0000000..043089e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/webtalk/webtalk.jou @@ -0,0 +1,12 @@ +#----------------------------------------------------------- +# Webtalk v2018.2 (64-bit) +# SW Build 2258646 on Thu Jun 14 20:03:12 MDT 2018 +# +# Start of session at: Fri Aug 17 17:53:31 2018 +# Process ID: 14020 +# Current directory: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.sdk/webtalk +# Command line: wbtcv.exe -mode batch -source sdk_webtalk.tcl +# Log file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.sdk/webtalk/webtalk.log +# Journal file: C:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.sdk/webtalk\webtalk.jou +#----------------------------------------------------------- +source sdk_webtalk.tcl diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bd b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bd new file mode 100644 index 0000000..d3d427b --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bd @@ -0,0 +1,491 @@ + + + + + xilinx.com + BlockDiagram + design_1 + 1.00.a + + + isTop + true + + + + + DDR + + + + + + CAN_DEBUG + false + + + + + + + + TIMEPERIOD_PS + 1250 + + + + + + + + MEMORY_TYPE + COMPONENTS + + + + + + + + DATA_WIDTH + 8 + + + + + + + + CS_ENABLED + true + + + + + + + + DATA_MASK_ENABLED + true + + + + + + + + SLOT + Single + + + + + + + + MEM_ADDR_MAP + ROW_COLUMN_BANK + + + + + + + + BURST_LENGTH + 8 + + + + + + + + AXI_ARBITRATION_SCHEME + TDM + + + + + + + + CAS_LATENCY + 11 + + + + + + + + CAS_WRITE_LATENCY + 11 + + + + + + + + + + FIXED_IO + + + + + + CAN_DEBUG + false + + + + + + + + + + DATA.LED_OP + Data + Data + + + + + + + DATA + + + led_op + + + + + + LAYERED_METADATA + undef + + + + + + + + + + + + + BlockDiagram + :vivado.xilinx.com: + + + + + + led_op + + out + + + + + + + + xilinx.com + BlockDiagram + design_1_imp + 1.00.a + + + processing_system7_0 + + + design_1_processing_system7_0_0 + 0x1FFFFFFF + TRUE + 200 + 100 + 100 + 166.666666 + 111.111115 + 50 + 100 + 666.666687 + 533.333374 + 10.158730 + 200.000000 + 10.000000 + 125.000000 + 10.000000 + 100.000000 + 100.000000 + 166.666672 + 10.000000 + 111.111115 + 200.000000 + 200.000000 + 50.000000 + 100.000000 + 10.000000 + 10.000000 + 111.111115 + 111.111115 + 111.111115 + 111.111115 + 111.111115 + 111.111115 + 50000000 + 100000000 + 10000000 + 10000000 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 64 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + DDR 3 (Low Voltage) + 8 + MT41J256M16 RE-125 + 1 + MIO 1 .. 6 + 1 + MIO 1 .. 6 + 0 + x4 + 0 + 0 + 1 + EMIO + 0 + 1 + MIO 10 .. 15 + 1 + MIO 0 + 0 + 0 + 1 + EMIO + 0 + 1 + MIO 8 .. 9 + 0 + 1 + EMIO + 1 + EMIO + 1 + EMIO + 1 + EMIO + 1 + MIO 28 .. 39 + 1 + Share reset pin + 1 + MIO 7 + 1 + EMIO + 0 + 1 + MIO 48 .. 49 + 1 + EMIO + 1 + Share reset pin + 1 + MIO + 1 + 64 + 0.251400462962963 + External + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + LVCMOS 3.3V + slow + LVCMOS 3.3V + slow + LVCMOS 3.3V + slow + LVCMOS 3.3V + slow + LVCMOS 3.3V + slow + LVCMOS 3.3V + slow + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + disabled + LVCMOS 3.3V + slow + disabled + LVCMOS 3.3V + slow + disabled + LVCMOS 3.3V + slow + disabled + LVCMOS 3.3V + slow + disabled + LVCMOS 3.3V + slow + disabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + enabled + LVCMOS 3.3V + slow + NONE + SD 1#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#USB Reset#UART 1#UART 1#SD 1#SD 1#SD 1#SD 1#SD 1#SD 1#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#I2C 1#I2C 1#Unbonded#Unbonded#GPIO#GPIO + cd#qspi0_ss_b#qspi0_io[0]#qspi0_io[1]#qspi0_io[2]#qspi0_io[3]/HOLD_B#qspi0_sclk#reset#tx#rx#data[0]#cmd#clk#data[1]#data[2]#data[3]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#data[4]#dir#stp#nxt#data[0]#data[1]#data[2]#data[3]#clk#data[5]#data[6]#data[7]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#scl#sda#Unbonded#Unbonded#gpio[52]#gpio[53] + 1 + 1 + + + + led_0 + + + design_1_led_0_0 + led + + hdl + 0x0 + + + + + + + processing_system7_0_FCLK_CLK0 + + + + + + led_0_led_op + + + + + + + + + + + + + + + + xilinx.com + Addressing/processing_system7_0 + processing_system7 + 5.5 + + + M_AXI_GP0 + + + 0x40000000 + + + + + + + + Data + 4G + 32 + + + + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bxml b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bxml new file mode 100644 index 0000000..61097c8 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1.bxml @@ -0,0 +1,61 @@ + + + + Composite Fileset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1_ooc.xdc b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1_ooc.xdc new file mode 100644 index 0000000..b3f8786 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/design_1_ooc.xdc @@ -0,0 +1,12 @@ +################################################################################ + +# This XDC is used only for OOC mode of synthesis, implementation +# This constraints file contains default clock frequencies to be used during +# out-of-context flows such as OOC Synthesis and Hierarchical Designs. +# This constraints file is not used in normal top-down synthesis (default flow +# of Vivado) +################################################################################ +create_clock -name processing_system7_0_FCLK_CLK0 -period 20 [get_pins processing_system7_0/FCLK_CLK0] +create_clock -name processing_system7_0_FCLK_CLK1 -period 10 [get_pins processing_system7_0/FCLK_CLK1] + +################################################################################ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v new file mode 100644 index 0000000..73827c2 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hdl/design_1_wrapper.v @@ -0,0 +1,104 @@ +//Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +//-------------------------------------------------------------------------------- +//Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +//Date : Fri Aug 17 17:41:43 2018 +//Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +//Command : generate_target design_1_wrapper.bd +//Design : design_1_wrapper +//Purpose : IP block netlist +//-------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +module design_1_wrapper + (DDR_addr, + DDR_ba, + DDR_cas_n, + DDR_ck_n, + DDR_ck_p, + DDR_cke, + DDR_cs_n, + DDR_dm, + DDR_dq, + DDR_dqs_n, + DDR_dqs_p, + DDR_odt, + DDR_ras_n, + DDR_reset_n, + DDR_we_n, + FIXED_IO_ddr_vrn, + FIXED_IO_ddr_vrp, + FIXED_IO_mio, + FIXED_IO_ps_clk, + FIXED_IO_ps_porb, + FIXED_IO_ps_srstb, + led_op); + inout [14:0]DDR_addr; + inout [2:0]DDR_ba; + inout DDR_cas_n; + inout DDR_ck_n; + inout DDR_ck_p; + inout DDR_cke; + inout DDR_cs_n; + inout [1:0]DDR_dm; + inout [15:0]DDR_dq; + inout [1:0]DDR_dqs_n; + inout [1:0]DDR_dqs_p; + inout DDR_odt; + inout DDR_ras_n; + inout DDR_reset_n; + inout DDR_we_n; + inout FIXED_IO_ddr_vrn; + inout FIXED_IO_ddr_vrp; + inout [31:0]FIXED_IO_mio; + inout FIXED_IO_ps_clk; + inout FIXED_IO_ps_porb; + inout FIXED_IO_ps_srstb; + output led_op; + + wire [14:0]DDR_addr; + wire [2:0]DDR_ba; + wire DDR_cas_n; + wire DDR_ck_n; + wire DDR_ck_p; + wire DDR_cke; + wire DDR_cs_n; + wire [1:0]DDR_dm; + wire [15:0]DDR_dq; + wire [1:0]DDR_dqs_n; + wire [1:0]DDR_dqs_p; + wire DDR_odt; + wire DDR_ras_n; + wire DDR_reset_n; + wire DDR_we_n; + wire FIXED_IO_ddr_vrn; + wire FIXED_IO_ddr_vrp; + wire [31:0]FIXED_IO_mio; + wire FIXED_IO_ps_clk; + wire FIXED_IO_ps_porb; + wire FIXED_IO_ps_srstb; + wire led_op; + + design_1 design_1_i + (.DDR_addr(DDR_addr), + .DDR_ba(DDR_ba), + .DDR_cas_n(DDR_cas_n), + .DDR_ck_n(DDR_ck_n), + .DDR_ck_p(DDR_ck_p), + .DDR_cke(DDR_cke), + .DDR_cs_n(DDR_cs_n), + .DDR_dm(DDR_dm), + .DDR_dq(DDR_dq), + .DDR_dqs_n(DDR_dqs_n), + .DDR_dqs_p(DDR_dqs_p), + .DDR_odt(DDR_odt), + .DDR_ras_n(DDR_ras_n), + .DDR_reset_n(DDR_reset_n), + .DDR_we_n(DDR_we_n), + .FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn), + .FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp), + .FIXED_IO_mio(FIXED_IO_mio), + .FIXED_IO_ps_clk(FIXED_IO_ps_clk), + .FIXED_IO_ps_porb(FIXED_IO_ps_porb), + .FIXED_IO_ps_srstb(FIXED_IO_ps_srstb), + .led_op(led_op)); +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hw_handoff/design_1_bd.tcl b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hw_handoff/design_1_bd.tcl new file mode 100644 index 0000000..68fe1fd --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/hw_handoff/design_1_bd.tcl @@ -0,0 +1,562 @@ + +################################################################ +# This is a generated script based on design: design_1 +# +# Though there are limitations about the generated script, +# the main purpose of this utility is to make learning +# IP Integrator Tcl commands easier. +################################################################ + +namespace eval _tcl { +proc get_script_folder {} { + set script_path [file normalize [info script]] + set script_folder [file dirname $script_path] + return $script_folder +} +} +variable script_folder +set script_folder [_tcl::get_script_folder] + +################################################################ +# Check if script is running in correct Vivado version. +################################################################ +set scripts_vivado_version 2018.2 +set current_vivado_version [version -short] + +if { [string first $scripts_vivado_version $current_vivado_version] == -1 } { + puts "" + catch {common::send_msg_id "BD_TCL-109" "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."} + + return 1 +} + +################################################################ +# START +################################################################ + +# To test this script, run the following commands from Vivado Tcl console: +# source design_1_script.tcl + + +# The design that will be created by this Tcl script contains the following +# module references: +# led + +# Please add the sources of those modules before sourcing this Tcl script. + +# If there is no project opened, this script will create a +# project, but make sure you do not have an existing project +# <./myproj/project_1.xpr> in the current working folder. + +set list_projs [get_projects -quiet] +if { $list_projs eq "" } { + create_project project_1 myproj -part xc7z010clg225-1 +} + + +# CHANGE DESIGN NAME HERE +variable design_name +set design_name design_1 + +# If you do not already have an existing IP Integrator design open, +# you can create a design using the following command: +# create_bd_design $design_name + +# Creating design if needed +set errMsg "" +set nRet 0 + +set cur_design [current_bd_design -quiet] +set list_cells [get_bd_cells -quiet] + +if { ${design_name} eq "" } { + # USE CASES: + # 1) Design_name not set + + set errMsg "Please set the variable to a non-empty value." + set nRet 1 + +} elseif { ${cur_design} ne "" && ${list_cells} eq "" } { + # USE CASES: + # 2): Current design opened AND is empty AND names same. + # 3): Current design opened AND is empty AND names diff; design_name NOT in project. + # 4): Current design opened AND is empty AND names diff; design_name exists in project. + + if { $cur_design ne $design_name } { + common::send_msg_id "BD_TCL-001" "INFO" "Changing value of from <$design_name> to <$cur_design> since current design is empty." + set design_name [get_property NAME $cur_design] + } + common::send_msg_id "BD_TCL-002" "INFO" "Constructing design in IPI design <$cur_design>..." + +} elseif { ${cur_design} ne "" && $list_cells ne "" && $cur_design eq $design_name } { + # USE CASES: + # 5) Current design opened AND has components AND same names. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 1 +} elseif { [get_files -quiet ${design_name}.bd] ne "" } { + # USE CASES: + # 6) Current opened design, has components, but diff names, design_name exists in project. + # 7) No opened design, design_name exists in project. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 2 + +} else { + # USE CASES: + # 8) No opened design, design_name not in project. + # 9) Current opened design, has components, but diff names, design_name not in project. + + common::send_msg_id "BD_TCL-003" "INFO" "Currently there is no design <$design_name> in project, so creating one..." + + create_bd_design $design_name + + common::send_msg_id "BD_TCL-004" "INFO" "Making design <$design_name> as current_bd_design." + current_bd_design $design_name + +} + +common::send_msg_id "BD_TCL-005" "INFO" "Currently the variable is equal to \"$design_name\"." + +if { $nRet != 0 } { + catch {common::send_msg_id "BD_TCL-114" "ERROR" $errMsg} + return $nRet +} + +################################################################## +# DESIGN PROCs +################################################################## + + + +# Procedure to create entire design; Provide argument to make +# procedure reusable. If parentCell is "", will use root. +proc create_root_design { parentCell } { + + variable script_folder + variable design_name + + if { $parentCell eq "" } { + set parentCell [get_bd_cells /] + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + + # Create interface ports + set DDR [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:ddrx_rtl:1.0 DDR ] + set FIXED_IO [ create_bd_intf_port -mode Master -vlnv xilinx.com:display_processing_system7:fixedio_rtl:1.0 FIXED_IO ] + + # Create ports + set led_op [ create_bd_port -dir O -type data led_op ] + + # Create instance: led_0, and set properties + set block_name led + set block_cell_name led_0 + if { [catch {set led_0 [create_bd_cell -type module -reference $block_name $block_cell_name] } errmsg] } { + catch {common::send_msg_id "BD_TCL-105" "ERROR" "Unable to add referenced block <$block_name>. Please add the files for ${block_name}'s definition into the project."} + return 1 + } elseif { $led_0 eq "" } { + catch {common::send_msg_id "BD_TCL-106" "ERROR" "Unable to referenced block <$block_name>. Please add the files for ${block_name}'s definition into the project."} + return 1 + } + + # Create instance: processing_system7_0, and set properties + set processing_system7_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 ] + set_property -dict [ list \ + CONFIG.PCW_ACT_APU_PERIPHERAL_FREQMHZ {666.666687} \ + CONFIG.PCW_ACT_CAN_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_DCI_PERIPHERAL_FREQMHZ {10.158730} \ + CONFIG.PCW_ACT_ENET0_PERIPHERAL_FREQMHZ {125.000000} \ + CONFIG.PCW_ACT_ENET1_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {50.000000} \ + CONFIG.PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ {100.000000} \ + CONFIG.PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_PCAP_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_QSPI_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_SDIO_PERIPHERAL_FREQMHZ {100.000000} \ + CONFIG.PCW_ACT_SMC_PERIPHERAL_FREQMHZ {10.000000} \ + CONFIG.PCW_ACT_SPI_PERIPHERAL_FREQMHZ {166.666672} \ + CONFIG.PCW_ACT_TPIU_PERIPHERAL_FREQMHZ {200.000000} \ + CONFIG.PCW_ACT_TTC0_CLK0_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC0_CLK1_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC0_CLK2_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC1_CLK0_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC1_CLK1_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_TTC1_CLK2_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_ACT_UART_PERIPHERAL_FREQMHZ {100.000000} \ + CONFIG.PCW_ACT_WDT_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_APU_CLK_RATIO_ENABLE {0.251400462962963} \ + CONFIG.PCW_ARMPLL_CTRL_FBDIV {40} \ + CONFIG.PCW_CAN_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_CAN_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_CLK0_FREQ {50000000} \ + CONFIG.PCW_CLK1_FREQ {100000000} \ + CONFIG.PCW_CLK2_FREQ {10000000} \ + CONFIG.PCW_CLK3_FREQ {10000000} \ + CONFIG.PCW_CPU_CPU_PLL_FREQMHZ {1333.333} \ + CONFIG.PCW_CPU_PERIPHERAL_DIVISOR0 {2} \ + CONFIG.PCW_DCI_PERIPHERAL_DIVISOR0 {15} \ + CONFIG.PCW_DCI_PERIPHERAL_DIVISOR1 {7} \ + CONFIG.PCW_DDRPLL_CTRL_FBDIV {32} \ + CONFIG.PCW_DDR_DDR_PLL_FREQMHZ {1066.667} \ + CONFIG.PCW_DDR_PERIPHERAL_DIVISOR0 {2} \ + CONFIG.PCW_DDR_RAM_HIGHADDR {0x1FFFFFFF} \ + CONFIG.PCW_ENET0_PERIPHERAL_CLKSRC {External} \ + CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_ENET0_RESET_ENABLE {0} \ + CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_ENET1_RESET_ENABLE {0} \ + CONFIG.PCW_ENET_RESET_ENABLE {0} \ + CONFIG.PCW_EN_CLK1_PORT {1} \ + CONFIG.PCW_EN_EMIO_CD_SDIO0 {1} \ + CONFIG.PCW_EN_EMIO_CD_SDIO1 {0} \ + CONFIG.PCW_EN_EMIO_GPIO {1} \ + CONFIG.PCW_EN_EMIO_I2C0 {1} \ + CONFIG.PCW_EN_EMIO_SDIO0 {1} \ + CONFIG.PCW_EN_EMIO_SDIO1 {0} \ + CONFIG.PCW_EN_EMIO_SPI0 {1} \ + CONFIG.PCW_EN_EMIO_SPI1 {1} \ + CONFIG.PCW_EN_EMIO_TTC0 {1} \ + CONFIG.PCW_EN_EMIO_TTC1 {1} \ + CONFIG.PCW_EN_EMIO_UART0 {1} \ + CONFIG.PCW_EN_EMIO_WP_SDIO0 {1} \ + CONFIG.PCW_EN_GPIO {1} \ + CONFIG.PCW_EN_I2C0 {1} \ + CONFIG.PCW_EN_I2C1 {1} \ + CONFIG.PCW_EN_QSPI {1} \ + CONFIG.PCW_EN_SDIO0 {1} \ + CONFIG.PCW_EN_SDIO1 {1} \ + CONFIG.PCW_EN_SPI0 {1} \ + CONFIG.PCW_EN_SPI1 {1} \ + CONFIG.PCW_EN_TTC0 {1} \ + CONFIG.PCW_EN_TTC1 {1} \ + CONFIG.PCW_EN_UART0 {1} \ + CONFIG.PCW_EN_UART1 {1} \ + CONFIG.PCW_EN_USB0 {1} \ + CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR0 {5} \ + CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR1 {4} \ + CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR0 {5} \ + CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR1 {2} \ + CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR1 {1} \ + CONFIG.PCW_FCLK_CLK1_BUF {TRUE} \ + CONFIG.PCW_FPGA1_PERIPHERAL_FREQMHZ {100} \ + CONFIG.PCW_FPGA_FCLK0_ENABLE {1} \ + CONFIG.PCW_FPGA_FCLK1_ENABLE {1} \ + CONFIG.PCW_FPGA_FCLK2_ENABLE {0} \ + CONFIG.PCW_FPGA_FCLK3_ENABLE {0} \ + CONFIG.PCW_FTM_CTI_IN0 {} \ + CONFIG.PCW_FTM_CTI_IN2 {} \ + CONFIG.PCW_FTM_CTI_OUT0 {} \ + CONFIG.PCW_FTM_CTI_OUT2 {} \ + CONFIG.PCW_GPIO_EMIO_GPIO_ENABLE {1} \ + CONFIG.PCW_GPIO_EMIO_GPIO_IO {64} \ + CONFIG.PCW_GPIO_EMIO_GPIO_WIDTH {64} \ + CONFIG.PCW_GPIO_MIO_GPIO_ENABLE {1} \ + CONFIG.PCW_GPIO_MIO_GPIO_IO {MIO} \ + CONFIG.PCW_I2C0_GRP_INT_ENABLE {1} \ + CONFIG.PCW_I2C0_GRP_INT_IO {EMIO} \ + CONFIG.PCW_I2C0_I2C0_IO {EMIO} \ + CONFIG.PCW_I2C0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_I2C0_RESET_ENABLE {0} \ + CONFIG.PCW_I2C1_GRP_INT_ENABLE {1} \ + CONFIG.PCW_I2C1_GRP_INT_IO {EMIO} \ + CONFIG.PCW_I2C1_I2C1_IO {MIO 48 .. 49} \ + CONFIG.PCW_I2C1_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_I2C1_RESET_ENABLE {0} \ + CONFIG.PCW_I2C_PERIPHERAL_FREQMHZ {111.111115} \ + CONFIG.PCW_I2C_RESET_ENABLE {1} \ + CONFIG.PCW_I2C_RESET_SELECT {Share reset pin} \ + CONFIG.PCW_IOPLL_CTRL_FBDIV {30} \ + CONFIG.PCW_IO_IO_PLL_FREQMHZ {1000.000} \ + CONFIG.PCW_IRQ_F2P_INTR {1} \ + CONFIG.PCW_MIO_0_DIRECTION {in} \ + CONFIG.PCW_MIO_0_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_0_PULLUP {enabled} \ + CONFIG.PCW_MIO_0_SLEW {slow} \ + CONFIG.PCW_MIO_10_DIRECTION {inout} \ + CONFIG.PCW_MIO_10_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_10_PULLUP {disabled} \ + CONFIG.PCW_MIO_10_SLEW {slow} \ + CONFIG.PCW_MIO_11_DIRECTION {inout} \ + CONFIG.PCW_MIO_11_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_11_PULLUP {disabled} \ + CONFIG.PCW_MIO_11_SLEW {slow} \ + CONFIG.PCW_MIO_12_DIRECTION {inout} \ + CONFIG.PCW_MIO_12_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_12_PULLUP {disabled} \ + CONFIG.PCW_MIO_12_SLEW {slow} \ + CONFIG.PCW_MIO_13_DIRECTION {inout} \ + CONFIG.PCW_MIO_13_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_13_PULLUP {disabled} \ + CONFIG.PCW_MIO_13_SLEW {slow} \ + CONFIG.PCW_MIO_14_DIRECTION {inout} \ + CONFIG.PCW_MIO_14_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_14_PULLUP {disabled} \ + CONFIG.PCW_MIO_14_SLEW {slow} \ + CONFIG.PCW_MIO_15_DIRECTION {inout} \ + CONFIG.PCW_MIO_15_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_15_PULLUP {disabled} \ + CONFIG.PCW_MIO_15_SLEW {slow} \ + CONFIG.PCW_MIO_1_DIRECTION {out} \ + CONFIG.PCW_MIO_1_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_1_PULLUP {enabled} \ + CONFIG.PCW_MIO_1_SLEW {slow} \ + CONFIG.PCW_MIO_28_DIRECTION {inout} \ + CONFIG.PCW_MIO_28_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_28_PULLUP {enabled} \ + CONFIG.PCW_MIO_28_SLEW {slow} \ + CONFIG.PCW_MIO_29_DIRECTION {in} \ + CONFIG.PCW_MIO_29_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_29_PULLUP {enabled} \ + CONFIG.PCW_MIO_29_SLEW {slow} \ + CONFIG.PCW_MIO_2_DIRECTION {inout} \ + CONFIG.PCW_MIO_2_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_2_PULLUP {disabled} \ + CONFIG.PCW_MIO_2_SLEW {slow} \ + CONFIG.PCW_MIO_30_DIRECTION {out} \ + CONFIG.PCW_MIO_30_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_30_PULLUP {enabled} \ + CONFIG.PCW_MIO_30_SLEW {slow} \ + CONFIG.PCW_MIO_31_DIRECTION {in} \ + CONFIG.PCW_MIO_31_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_31_PULLUP {enabled} \ + CONFIG.PCW_MIO_31_SLEW {slow} \ + CONFIG.PCW_MIO_32_DIRECTION {inout} \ + CONFIG.PCW_MIO_32_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_32_PULLUP {enabled} \ + CONFIG.PCW_MIO_32_SLEW {slow} \ + CONFIG.PCW_MIO_33_DIRECTION {inout} \ + CONFIG.PCW_MIO_33_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_33_PULLUP {enabled} \ + CONFIG.PCW_MIO_33_SLEW {slow} \ + CONFIG.PCW_MIO_34_DIRECTION {inout} \ + CONFIG.PCW_MIO_34_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_34_PULLUP {enabled} \ + CONFIG.PCW_MIO_34_SLEW {slow} \ + CONFIG.PCW_MIO_35_DIRECTION {inout} \ + CONFIG.PCW_MIO_35_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_35_PULLUP {enabled} \ + CONFIG.PCW_MIO_35_SLEW {slow} \ + CONFIG.PCW_MIO_36_DIRECTION {in} \ + CONFIG.PCW_MIO_36_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_36_PULLUP {enabled} \ + CONFIG.PCW_MIO_36_SLEW {slow} \ + CONFIG.PCW_MIO_37_DIRECTION {inout} \ + CONFIG.PCW_MIO_37_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_37_PULLUP {enabled} \ + CONFIG.PCW_MIO_37_SLEW {slow} \ + CONFIG.PCW_MIO_38_DIRECTION {inout} \ + CONFIG.PCW_MIO_38_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_38_PULLUP {enabled} \ + CONFIG.PCW_MIO_38_SLEW {slow} \ + CONFIG.PCW_MIO_39_DIRECTION {inout} \ + CONFIG.PCW_MIO_39_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_39_PULLUP {enabled} \ + CONFIG.PCW_MIO_39_SLEW {slow} \ + CONFIG.PCW_MIO_3_DIRECTION {inout} \ + CONFIG.PCW_MIO_3_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_3_PULLUP {disabled} \ + CONFIG.PCW_MIO_3_SLEW {slow} \ + CONFIG.PCW_MIO_48_DIRECTION {inout} \ + CONFIG.PCW_MIO_48_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_48_PULLUP {enabled} \ + CONFIG.PCW_MIO_48_SLEW {slow} \ + CONFIG.PCW_MIO_49_DIRECTION {inout} \ + CONFIG.PCW_MIO_49_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_49_PULLUP {enabled} \ + CONFIG.PCW_MIO_49_SLEW {slow} \ + CONFIG.PCW_MIO_4_DIRECTION {inout} \ + CONFIG.PCW_MIO_4_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_4_PULLUP {disabled} \ + CONFIG.PCW_MIO_4_SLEW {slow} \ + CONFIG.PCW_MIO_52_DIRECTION {inout} \ + CONFIG.PCW_MIO_52_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_52_PULLUP {enabled} \ + CONFIG.PCW_MIO_52_SLEW {slow} \ + CONFIG.PCW_MIO_53_DIRECTION {inout} \ + CONFIG.PCW_MIO_53_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_53_PULLUP {enabled} \ + CONFIG.PCW_MIO_53_SLEW {slow} \ + CONFIG.PCW_MIO_5_DIRECTION {inout} \ + CONFIG.PCW_MIO_5_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_5_PULLUP {disabled} \ + CONFIG.PCW_MIO_5_SLEW {slow} \ + CONFIG.PCW_MIO_6_DIRECTION {out} \ + CONFIG.PCW_MIO_6_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_6_PULLUP {disabled} \ + CONFIG.PCW_MIO_6_SLEW {slow} \ + CONFIG.PCW_MIO_7_DIRECTION {out} \ + CONFIG.PCW_MIO_7_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_7_PULLUP {disabled} \ + CONFIG.PCW_MIO_7_SLEW {slow} \ + CONFIG.PCW_MIO_8_DIRECTION {out} \ + CONFIG.PCW_MIO_8_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_8_PULLUP {disabled} \ + CONFIG.PCW_MIO_8_SLEW {slow} \ + CONFIG.PCW_MIO_9_DIRECTION {in} \ + CONFIG.PCW_MIO_9_IOTYPE {LVCMOS 3.3V} \ + CONFIG.PCW_MIO_9_PULLUP {enabled} \ + CONFIG.PCW_MIO_9_SLEW {slow} \ + CONFIG.PCW_MIO_TREE_PERIPHERALS {SD 1#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#USB Reset#UART 1#UART 1#SD 1#SD 1#SD 1#SD 1#SD 1#SD 1#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#I2C 1#I2C 1#Unbonded#Unbonded#GPIO#GPIO} \ + CONFIG.PCW_MIO_TREE_SIGNALS {cd#qspi0_ss_b#qspi0_io[0]#qspi0_io[1]#qspi0_io[2]#qspi0_io[3]/HOLD_B#qspi0_sclk#reset#tx#rx#data[0]#cmd#clk#data[1]#data[2]#data[3]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#data[4]#dir#stp#nxt#data[0]#data[1]#data[2]#data[3]#clk#data[5]#data[6]#data[7]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#scl#sda#Unbonded#Unbonded#gpio[52]#gpio[53]} \ + CONFIG.PCW_NAND_GRP_D8_ENABLE {0} \ + CONFIG.PCW_NAND_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_A25_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_CS0_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_CS1_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_SRAM_CS0_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_SRAM_CS1_ENABLE {0} \ + CONFIG.PCW_NOR_GRP_SRAM_INT_ENABLE {0} \ + CONFIG.PCW_NOR_PERIPHERAL_ENABLE {0} \ + CONFIG.PCW_PCAP_PERIPHERAL_DIVISOR0 {5} \ + CONFIG.PCW_QSPI_GRP_FBCLK_ENABLE {0} \ + CONFIG.PCW_QSPI_GRP_IO1_ENABLE {0} \ + CONFIG.PCW_QSPI_GRP_SINGLE_SS_ENABLE {1} \ + CONFIG.PCW_QSPI_GRP_SINGLE_SS_IO {MIO 1 .. 6} \ + CONFIG.PCW_QSPI_GRP_SS1_ENABLE {0} \ + CONFIG.PCW_QSPI_PERIPHERAL_DIVISOR0 {5} \ + CONFIG.PCW_QSPI_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_QSPI_PERIPHERAL_FREQMHZ {200} \ + CONFIG.PCW_QSPI_QSPI_IO {MIO 1 .. 6} \ + CONFIG.PCW_SD0_GRP_CD_ENABLE {1} \ + CONFIG.PCW_SD0_GRP_CD_IO {EMIO} \ + CONFIG.PCW_SD0_GRP_POW_ENABLE {0} \ + CONFIG.PCW_SD0_GRP_WP_ENABLE {1} \ + CONFIG.PCW_SD0_GRP_WP_IO {EMIO} \ + CONFIG.PCW_SD0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_SD0_SD0_IO {EMIO} \ + CONFIG.PCW_SD1_GRP_CD_ENABLE {1} \ + CONFIG.PCW_SD1_GRP_CD_IO {MIO 0} \ + CONFIG.PCW_SD1_GRP_POW_ENABLE {0} \ + CONFIG.PCW_SD1_GRP_WP_ENABLE {0} \ + CONFIG.PCW_SD1_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_SD1_SD1_IO {MIO 10 .. 15} \ + CONFIG.PCW_SDIO_PERIPHERAL_DIVISOR0 {10} \ + CONFIG.PCW_SDIO_PERIPHERAL_FREQMHZ {100} \ + CONFIG.PCW_SDIO_PERIPHERAL_VALID {1} \ + CONFIG.PCW_SINGLE_QSPI_DATA_MODE {x4} \ + CONFIG.PCW_SMC_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_SPI0_GRP_SS0_ENABLE {1} \ + CONFIG.PCW_SPI0_GRP_SS0_IO {EMIO} \ + CONFIG.PCW_SPI0_GRP_SS1_ENABLE {1} \ + CONFIG.PCW_SPI0_GRP_SS1_IO {EMIO} \ + CONFIG.PCW_SPI0_GRP_SS2_ENABLE {1} \ + CONFIG.PCW_SPI0_GRP_SS2_IO {EMIO} \ + CONFIG.PCW_SPI0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_SPI0_SPI0_IO {EMIO} \ + CONFIG.PCW_SPI1_GRP_SS0_ENABLE {1} \ + CONFIG.PCW_SPI1_GRP_SS0_IO {EMIO} \ + CONFIG.PCW_SPI1_GRP_SS1_ENABLE {1} \ + CONFIG.PCW_SPI1_GRP_SS1_IO {EMIO} \ + CONFIG.PCW_SPI1_GRP_SS2_ENABLE {1} \ + CONFIG.PCW_SPI1_GRP_SS2_IO {EMIO} \ + CONFIG.PCW_SPI1_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_SPI1_SPI1_IO {EMIO} \ + CONFIG.PCW_SPI_PERIPHERAL_DIVISOR0 {6} \ + CONFIG.PCW_SPI_PERIPHERAL_FREQMHZ {166.666666} \ + CONFIG.PCW_SPI_PERIPHERAL_VALID {1} \ + CONFIG.PCW_TPIU_PERIPHERAL_DIVISOR0 {1} \ + CONFIG.PCW_TTC0_CLK0_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC0_CLK1_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC0_CLK2_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_TTC0_TTC0_IO {EMIO} \ + CONFIG.PCW_TTC1_CLK0_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC1_CLK1_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC1_CLK2_PERIPHERAL_FREQMHZ {133.333333} \ + CONFIG.PCW_TTC1_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_TTC1_TTC1_IO {EMIO} \ + CONFIG.PCW_TTC_PERIPHERAL_FREQMHZ {50} \ + CONFIG.PCW_UART0_GRP_FULL_ENABLE {0} \ + CONFIG.PCW_UART0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_UART0_UART0_IO {EMIO} \ + CONFIG.PCW_UART1_GRP_FULL_ENABLE {0} \ + CONFIG.PCW_UART1_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_UART1_UART1_IO {MIO 8 .. 9} \ + CONFIG.PCW_UART_PERIPHERAL_DIVISOR0 {10} \ + CONFIG.PCW_UART_PERIPHERAL_FREQMHZ {100} \ + CONFIG.PCW_UART_PERIPHERAL_VALID {1} \ + CONFIG.PCW_UIPARAM_ACT_DDR_FREQ_MHZ {533.333374} \ + CONFIG.PCW_UIPARAM_DDR_BANK_ADDR_COUNT {3} \ + CONFIG.PCW_UIPARAM_DDR_BL {8} \ + CONFIG.PCW_UIPARAM_DDR_CL {7} \ + CONFIG.PCW_UIPARAM_DDR_COL_ADDR_COUNT {10} \ + CONFIG.PCW_UIPARAM_DDR_CWL {6} \ + CONFIG.PCW_UIPARAM_DDR_DEVICE_CAPACITY {4096 MBits} \ + CONFIG.PCW_UIPARAM_DDR_DRAM_WIDTH {16 Bits} \ + CONFIG.PCW_UIPARAM_DDR_MEMORY_TYPE {DDR 3 (Low Voltage)} \ + CONFIG.PCW_UIPARAM_DDR_PARTNO {MT41J256M16 RE-125} \ + CONFIG.PCW_UIPARAM_DDR_ROW_ADDR_COUNT {15} \ + CONFIG.PCW_UIPARAM_DDR_SPEED_BIN {DDR3_1066F} \ + CONFIG.PCW_UIPARAM_DDR_T_FAW {40.0} \ + CONFIG.PCW_UIPARAM_DDR_T_RAS_MIN {35.0} \ + CONFIG.PCW_UIPARAM_DDR_T_RC {48.91} \ + CONFIG.PCW_UIPARAM_DDR_T_RCD {7} \ + CONFIG.PCW_UIPARAM_DDR_T_RP {7} \ + CONFIG.PCW_UIPARAM_GENERATE_SUMMARY {NONE} \ + CONFIG.PCW_USB0_PERIPHERAL_ENABLE {1} \ + CONFIG.PCW_USB0_PERIPHERAL_FREQMHZ {60} \ + CONFIG.PCW_USB0_RESET_ENABLE {1} \ + CONFIG.PCW_USB0_RESET_IO {MIO 7} \ + CONFIG.PCW_USB0_USB0_IO {MIO 28 .. 39} \ + CONFIG.PCW_USB1_RESET_ENABLE {0} \ + CONFIG.PCW_USB_RESET_ENABLE {1} \ + CONFIG.PCW_USB_RESET_SELECT {Share reset pin} \ + CONFIG.PCW_USE_FABRIC_INTERRUPT {1} \ + ] $processing_system7_0 + + # Create interface connections + connect_bd_intf_net -intf_net processing_system7_0_DDR [get_bd_intf_ports DDR] [get_bd_intf_pins processing_system7_0/DDR] + connect_bd_intf_net -intf_net processing_system7_0_FIXED_IO [get_bd_intf_ports FIXED_IO] [get_bd_intf_pins processing_system7_0/FIXED_IO] + + # Create port connections + connect_bd_net -net led_0_led_op [get_bd_ports led_op] [get_bd_pins led_0/led_op] + connect_bd_net -net processing_system7_0_FCLK_CLK0 [get_bd_pins led_0/m_clock] [get_bd_pins processing_system7_0/FCLK_CLK0] [get_bd_pins processing_system7_0/M_AXI_GP0_ACLK] + + # Create address segments + + + # Restore current instance + current_bd_instance $oldCurInst + + save_bd_design +} +# End of create_root_design() + + +################################################################## +# MAIN FLOW +################################################################## + +create_root_design "" + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.dcp b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.dcp new file mode 100644 index 0000000000000000000000000000000000000000..acbdf8ac61273db8fb2a7366576c20a91e3885a6 GIT binary patch literal 13314 zcmaL819&CPx9GiN+s4H9#F^N(ZQHgc*2K1L+Y?(8+fHuYd+zF2w z)vBu9^;E63T22xK6cqpfKmt^wk)$mn2;FLd000|M0081E*T~S0&du5?I&sn_p8-{5 zDWSMV%^AJ$huCUqyb@4C2ofKXKZ~|HX!;OU?KcK2PFcPJ`{I*;h{DTf_N5eR_nR49 zXggwKVUBdFwlYeD`rd)fgtPk*N))}@Y;))<%DsK1*~FFY;QGtzoykE>TY-~ABw9&)y{S;{Gb z!to@BL$VYmdXFcRLA0VLPw~+Bj9F-dCs z3bfe^l-sCBI?&hQDmkauR`wx&BQ6q8SWkhP^KyzCpmBRfTReziQY!LasdfaF6Qgm^ zBh=Ap+NgFNYRqzbB;PmrpfPco?$k@@`)JB(4*UH#PmqC|-&e+K0T-(xd zmmU2*OE-5cRJ!B@Zkan_b+e2mw!zd)3?=@2vx*V}i1ZrNYACj#Uh{QJwXTLXsv5uP zIJ1cDJ&f^j>`+TwRQ2W*Q#R9+Wl-|4w-L@Wq}XM!3YXAHs@tviVflP$j`2=xJkP=2`nZ1@SsBZKF; z!{unY-=U{aY}U>?vpSd{x|HsYV0*OeowcRk9e9bC!X9@5RTe!D$eNrn?(T0=v4x4E zYk$9(v8Wdi^X7U&YjtCFOs0OItT}NN_G z4F%8Df~CC?wcL9=?eXntkf_bN*){Bl3M6lHvZPi}33$TlMrkTTZauL zT|jna)_N3V6MT<9Q!vj@6EX%*qf#@us&q-qU6fi!EA?8dg=4z3SKXrOp0y_Cz5-JJ zMa600F_4xTa+@l0esmr1rZh6`UcQjmy&^@UMVV$o^b{4eTaOj5G<=IBuy+m=Ji?PZLxSy{ENcT!ndt)X{$`aA^`cx#{B z+T~-aGR~J&#Y1!D=Xjl*vejL#ci7yWL-@ZXDMa^76@HTGa!huXXQ0bgH@e=*xO)_P zipH2W+y0T_#bbMFLE}d!fx_dvjdV>Uvx=THJrIS=b+> zBfw$7m*8;aTyLw~|5)C6s^V3>+AfoHrpTw5vRgdt`JL;4{OkDrfIP+Xd-I>-WY6#Q zR-|`%_bA6;e3T!@hXZFGfHj0N5VF21gHh=M`#Ux3Ce0V4i6Qg)Qo$kA1j-}W)8}XR z$PXyryKwU*1!bv<9F4rAyob!N4}KceIJ6cBE*jvp1Vjo zPS;0kw!VgIzQx#&?T0OHV|Z*WGoin8R4;>TbFu|9jmQ(e=M3?lmOn?_X=WRaZ;vD| z-{UPs%3xker%0$s9$)m$ls!cfS8UV6Hbit&*g$`9Y@p@a z0$=38=WbVNxaV{m?DKz=B|*GUixAvQA6KclgKvKwV%shD{XZg-AfC%r@Q6*_ULhza=t-*5^uayw29#8dsq({bQ@F$x=0-p7wOD|H#ySQNq?mIuFs@_;(gxXzT@0 zxIHWLq(*?rmAb$js2qTWXr^%@=M-wD*Obu=a$pGA(+XcUgeAmK7`oO~DDXma>zbq( znAW3sVyfw>0b={CicnxZZ6Qp~&IOHZz(3HW3e114tvl*M5gcN23LB@0+TNe{gX5Wx=#RxxRa@@I#fivUxuoII+rx)m^ zyXp2kZ&8BuMQ*ir$e*p*4(;5EgSwOYZffUITC5Q-_!rFHq^lwkXJ9}V!eX4%j z7{M_ZZ;-k`0lKKXI#=Jku)qj3J{1w)@{X4bHW+0>JXJSSWQ2t8L=Vi1PH1 zxa22a;5;2fcA5EacF)3{gmxJvqT6-hoNg=GS_?3{eWe})r0HdWDcobmorH856{1>o zqitTScEjh{3HMFsG1rVR^Ty-)5olcP7f?(f;i$Y?k%;?3i z|1KiZy!XGvqw)jyj*t%k_e_mrgHx{p*S$}nSA{W~G5sJhs}cP)n~OD`w%eM?N9t+; z0T>~*EZ4l)g0wsOML!J`~mh9pRyJ(tOzJs z2YN2{5d-Q=s&>I*_N{>htdLF+`^}`bxPv)Z>4IFFqbPKZaClh5P2_h<2Z~#AQuN?T zu@HHhL57^=*233?f}@S#E7*?U$BU2PYv}r)vc~Yc@d`%I(gU%y5&0doS zfGqWZGuHG#GF)kvUwSO*MJD6(R;j8PThUXe@uD9&h)=e~Ig2kAO7pJiG1<=S9 zNEe6|@RcAf?Hp);3VCk;@!w16_L+e@|ImuNy!HkI*IoT65kaJSzTupHvpOP0n+sfLd0a-+M%KNy?o*-j6OZ?syh# z$@Nbs&*fkOr7iYXgKr?D+ipNnPuks&i#puJeqbp0er0$e|5rx%SB6Xr5o>52P!B$I zEO&O0hvz1suwz^dk$l^wJ@;4=UsC!bP>6QRm_nWY5Hqblq|r<0bU?d+jlu)Na+7C$G; zK*kl~;QgY+R6B;)uJ`)=^%^uE(iXAj$!Ti-`r2sUjjrxR^?NNfbF|xvitjw0PDXS4 z!@_gyK%iHI;LYI4AUJ=+;(oUvM*oHB>mHxH_j}R3>(R;HvonUWOaQ|9X0?my)$#ht zaL0%|xmzm<>DqYnKJ;{YVv#q$^(bF2^Cm~4%BKM$$lJvP?&Is|KzjCUV3esTPzUo~ z0djBvDqITee7U;yA`a~o^`?Qn$$JpO?Y0R?Sp9?jZd;byz_K>&UVOfe|B=Ysn>R3( z&x21L$Lto)^sevy8~GK~8{xJ|xy_AV^BqMLYz0Ry*jDqgOB+6ec$4Dh=F&wIC`eE4SRaF6@;8EN4e0GUiraB(&?I-%{ z+TS|LF*Ix$^eCqW}IH9{k)%)p|| zAjbe?K-dQ!E$@c;TP!vO2JoM1DCnnI1%6e(`6d6ly>~Fucl^KABRJSQ{hw+VnHm0n zs|5%Mg26Dr8KqGc6rh_H9S-6Q9TpS~;0&N3Lg?pQC%KbiT_d8IkqP8bX4qQ5lb}lR zYk@H{*8rKI{}>bNoxq(4{9$xX2JQ3gUfQAcm(n3Nm~nPc001{S0PywwpEe0cGkrVb zXjM%+9967EiR8P}F3!4r!$UH1O6fH%nn9ODHtG5{bqgo^Mg@c7u*!t60lnWWY}WmS zsAHswny<@PZpS^6JKwRL2U zPMTsc4IP+-9H|^=_?G*gUw;htx07+>PvbppIgW&O*L^O4J-Ges?k8c8DIhJe0BX6f zR<#v&>H9n*h$fW~8Lp8yUrlqEqe@IM+}6)+nysPJ(%EXs3mnSR&O6n_Sfqb2+&0dQ zZzUdwx~dhcRIah8RA{xS7}O644o8vp(@mOmXjfuGLDY*&9#}4j4Iq?+ZF!RdstM{7 zq-D7)okk6sB@b=%h9#z<3&od^PqfnPY}BGABN{SjicCZu2=y-gz#>ue(vtA!WztqR zj1@}fVI^fuEHPY53PO#f6sM|Z82v5WPlH|PAkI_8Z*EawB%8^r5IYoJg}IzJQ<*ri zFXPM#JqIhMc|o`Xdo^c~o6`>)StfCxTZL$%uB7ikq7T6f&FXnpyBN_cgO02zLIc%a zQ&sdM0=~U=no%Di@+aqRto}~#4GdH&3YJ{C8QN|Q#`rgjlX_ zyLJ%ii3=KqObTMXq9NkFxj5$r96+vP1C&$SJ%mUS6200dSahyaNsg5U!zIPrHp!R@ z9&C&)qTEpWT8uH$ef&iThw5XE(3aG5c437>@g(;wxF%K;TBSMMAfn5Ob23Thsivhn zV>FuC0W^|7Pv^bi+X+s4`b7J;DXJR7#|xZLxz0VX(J`s@t+ix&hCe_Dy8~6X-IzzTVR?Lud8?$?C=g1*epgf8rSRVc~SVftv~aXiOg^|ZuG_fpmxDwnIV{+e{y=<}BFXXMVd$b*Fr>}OY# zibFRGlFi^O>aOXNgFd=x7wSLwjBH7-o)^34CLXD)2*le`s zSda~^Rfb;^cB5u>U!vCM7Y!xDFv~Okao7@gQLg38Ti(o|>d%qyQ`FF=BuEKTJ?c{N zzi4>_Kr8AXi9Lak)C_wy#x=A{cb|E_`@ANm7b0>`yxrRrD?s&%Lb2j--l-+V8oR7E z61%)GqElj@v+?9;FoUAsRyVB;+ z=Q!C`1PQ>?strHdmQN3ZuUaLs4cTEtC;T1O$69E(CBIBu*YE?+76H=b%{={2&GX*8 zmw7IdKe?J*pBHRa!7EStxZy3P76FsjzITY4jXVt}cs3qWh4;^81C^@7TXqG>rpP`; zp^;QS`kF9qcDVfIA((x0=|6&X;!ngr`?2P+_5zsx^yV~#f)m?V)@~7HyUq+Sx{Ftx zrA%8x`D#s^%5Pd#4o?vwwgj*6CCw4VgVw851v}-~l4JTJe>SdIqbGAZL%y|Z25*N9 zk*!jY?3_Lg7WbtI)zK7|bJhO{oyG>wnnq{~5eg-feOG&%kzTK5 z_AbFS<~UeZIupf>{KJS)^}V zeOx2A=sTGO-I8t?`lXj-(=m{jL~js%SlrVPEMBX%S4YbG3yqZ8SyuJ}2xhmvZv&LJ z3xUCa4z~pOPc6Cg-H{Iio|1>T(y>hEGKZMVvUTfXs>h8&1z;^I9?4=V#T^Ao0vTnp z!P2pb7A1)o#Uu`g(&lUs<1gpHnAVB4DOtjy0%f3#a?xy|0$paAREc7ex^o#*BVE$X zsgiNLHkI*e>6jCja++g`hi3Iemt>(LLsf*Y-{U;rW}YfW*Vx1EW$GAbHsUZ*5fh!x zG(-nuBRYPp)X%}d2>E0V!rMWmI(IRqG&6h^R!$=BJj`>Rm@*^^SMDOrbJUn}q$AL) zpfdURmMW2)hU`aI*K}L@UuVRPaP`m9)(a8O-)FPt?o{0%AnWjq7Q^47ZtfLQQ*oASIimYSYTlA@} z__~JQZMVT8whNnepJk(5-in(cC#8c?a8#R`VzgT7-mko-S8LF(H%BLe6q_uxPj%yy za5n{9r$WewsW_;NuN63tsAxwNVhOOZf+be)H&sM4EUH2u7dsSrR{L>iPL&Ql-BR#e z;L|2YiSplU4v}x_koR0$v1vyYGPd@t3RGgZA%5$7cOcR69}a6XO;L~DPOZ>ATqSd# zD5ZF~>C&~dsU7Vsxc8Cfdq!kCJ@_B6Ot(%9d$=|7ZYSE;UnSGF7-@~e(zh9T-PCuS z;aFUxM1frFJaX*g9uW6SPF2~5J9^EU4}l(e zK6lb#k=Mm!JB+q4zCORtGNj_Hy-(ejduzjlg4{JD`-n>heM`qVjC`Mzrh2Xs(#1u0 zq7NdcDs)kQBtrD%K3e?*`p<=>RnL55&DYut2J-*0uyi#t8BFAd1|fnKe&m@no0v{L zouF`<^GEmi_&BaBR}m1#Afuv3&YE`d)rv_khS7@{%3XfztRO2{Zq%%e3L3&Z(z+B= zX<3?est?B6FRi|058^*4QP7%53BK({0~|KB8TG<;T~lmjnbdq&q!yYkxIK5re?NQW z=F~C*-uQ7zQgAvEo|JvGGZizBX!$M%X1^IT^KFvgaJYqUDyG&qgJACy@OcYiChAJn zTE@SG@t-Y(Vu`@qKm-7mzXavqR-tY-K+A~amugmSDva#H0)$_Qg_W7%pEDzaA;S&) z&k(xCWUcXz<|so1mtTM|1+VJ(oPhI~G}(G}Z~8t^EQx+;eJYo#3G9G@XPPmVq$Qk7 zHuU^@5J_JVpY91Qjbl&y*B`-hi#rbciiUY1yflhd*ra^Y!Tj+$de zYocjzqjhjYZMj{Uf}l24$$mYnkaW-H#bXCjFlQzXosu*0VotT%_T1TiOmIo9eExai zlI)SzL$Sjrc^L@G#*@@}ga$s8EJ^^KT+^&CoI!wis1I zYH)hSfF6tC7Y#Aa;Fs(Xh*DwFV%S+fQDY7B&18QA~N!Eyg z30Q%KVUS%Q&5@rY#8`wzmh@uak>U9b!t-HDr&EY;#4Qkbzn<>59Vg!I;cw)xo(oQf>cAw?hu(Dibp#T7yvGGBC;YiBIaC-7F~Sa>#jvDsKq zihrq}uOcP;b**ypAu_)^0B5ij_W8|UU0zD*QrHsbm*Gvl%E>T#vEH}6>ai=(Sh#62 z?PgqKdd!9}w4DwUJpLzJs}x@8RB;iQWky7I&(1B6P$&?ws#gDjx;fxK-CPn+Gm3@= z@!vG56MhIa2r(h2l(}5%2h^Jm<&zL;LbDJOlx;fTiXJZ#Mh#EC#m{%rHj6+<1EcvR zEG^0j>xJLx8Ohw<2vyqyy5?3E^wgTHVB-XmavJJ@E{KQA6-{+=>(mgI+txGp;9Ol9 zxqN@{C1aV<4X&Mrwj1)<9IkFu`RUOjf(X`~3t!*Lawk^qN0W(b5%^l$f$7ss|Ed(o zu3WTOv_E5Z@z!27p-~mkbMNxj&HGgydQSn{O&7FN_{Ulj-7BFq8>mPNHdYZ09Odn@ zvjlc5-c>ec^2E%B?(usy6QMVw8V+J5@6r}c!5gV9v8D2Z2K!DMh}3QiA^1(2krQB? zGC~~I&&*;yx(LTfYO9P&dNS57?#Kd+x^cU9$4(>oylCHgIK><50&;3RS!Ueu?T)fy zytu%vCc%)a`~646ag`x4+BJ?WZYnvPyWj(gOC&hrRMOl{c$JXFkox300x+14^(BXk zzrq6ut8F|8Vix5J{afOsuafO=ngrOLCIiI!^SI}(Jfj@&3btpN@9T$B5ynLac+7G)Mtf5}8P+_#L~#J6c)w8it$tUfi|h z5U+lrJk7ix01#7?f7V!q!=Q~ge1MiF@gMz(6W&NQ`r(X1NxI*JXlT!xqPDb;k=2 zNxwS>?gU2luAz(e-Ll7`NK#Ugp|d%G_F3r|2F!2Pr(->JR-)wW7=_;Ch7e9h_Pw13 z(10RpbBzpp)4K7Md zeb@8#04q(`isLtmEU=$Bvd^ewB_WY~G31gM^ReOg%nq)y{*Z~&lsqZCJ$b<*{+|vEtSGG>;saTo^X9SHI)@zvKdEE?}kNvijGn|KXC_r_m=fm zQ@n=kBb7J5^`pfbH5}-M_f2ipj#DvdIk7?C(1LuKFkVf4Pm&J-M_^|G^wIxN%`WDr zEPwBz?=@(Gm=hMJ)0^+EL%Rxy*@d@rA$47S^7b(F%m7Gd{I#3EyLO9;Cu>|2!G+jS z4>nNkO7Y^pt_Q|q$$f6^Z-h)>Z#~VlH^1dVW`|lrdni)n(R8OkurzpN7D2^NBM)F> zM`Xr>_>f-iisR_^JK|sEl((p1S<;cKoLkG7M$5}yWz4}{AI12xZI_u~anHyu2jtts zcREATZ6(;z@Xz{l+iuMX&B}hXOYxOq-Lp(G!APvBIlb2Y%NBMKaV|Q;z@(8?0UDRB zuB1kgYqKprhvK)^XlI=|dtv!ua4YKGt`;T9)p^#~mZL-^{%V)@Zh{Z(^hCnMH!jzP zbXhpmbWtQ;Tk%=*=13P9bWR?)DptPSt<1V{@@)h2WVe)vNf{aBP09>EIee9SXMn4D zGH&Aeic*f(++KuYZ;O8tG%4xB+!-JPCg!(=;^|5{3?U2uj-9|1lB^}eVAeEa*CH^lDCqtGkP z@DNzo7@;T#kO}AG0wbkdJoP&%CAb`Mx^W8}k_XA(_e<5QnOLNfquH#qg0H3Uts##7(0=kuRzT=Qa9HJQ zL7b_eh`D@1v&kqJRCT9b+8a4d2%7-8+&l$|E06?STY2 z{6o){oN1Fsbc6c>;1Z;8g$*f~uy}sTzN!+dBR&Y(ukrnA!2#sa(g}sRV4qA!Xw}mN z_eN+iQebh8^UeI{@wWpg)EV^aBMPMk1r%~C3C2>lkjx>C9wp~d{#Vjs79;#-Z+#J= zrg~1ZSZfNYq7Jb$KH2rb7&aa6LyqZjl&bq^mKwwY#WhKbxaF)|R}n!sOUjBG9i2zj zWAuU>sO$@LDuFhBE-f6uF|tDPCK+OY1-@U*;&oc0C&BYBiHaeMbN??4Jbu0s-TGwM zG(p)*C4^Qyh}Y`%B?#S~$L}x0T01Q*h1G6PG?VPVG)(FcJ)(9Y!y0~Hu6WTsNuu~c z+qJ?S;vCYMR@^JV@R$i2FcDUM%a4;Fz>~x5hCXr!aV5dLBh`SrHFBBi3xc z&#$I#EdsGBjbGx33Tj3pr*w&ZDl3ghGq4-3+{3M~0lmPi%Qyf(cl(C3YoH~v9`bwI z(rEcc+Rel1MGGVUnKd;f@@2D>H%q}%zG@{~CF+=ac``T#9HI%wd<$oh%m%v6?tnj$ z@L_?_xSGeTg%H_m+3fTJtL!NRBaQaD<3YYyHMY++j=rMQ&1!v zYp9Zd_5W*PW?2o!U$>c2C{Y91%NSZ5@j9Y65F^7@ zxzZdK?lT<^(PHOp=jD4OW^aOUgyZXB)fnJ8sf#;K8?I2@{qxY5TVxL8ld@jqiis|c zbsmy`puW&Vb&dQInKlr|V@L(Z&e2rn(m@!Ac~zgLM1+_XzC)1gnhw<@2>1CI#+{(C z{}BPnx}{i~C5gsw=}t~Mp*IBx2}=3N!gl3pW8e9BaARx3AiUfouvOyE2H<+JZN+e| zCIDNu#Ag2k=odwMvnfKqu-0vQ`>3>_@jn(hf7?uh6gka6o10KILVzAz(Ka#+P$0Y% zsRVl?jVz(6b=FIJ2tcYoUN7kTL8}2?xZ6XaW`%N*h|t|VQuV`XR)?=$r$CQK45r!| zzM?leQUfip%pHAUYREK<9aGHO(_joi1_<&%)y;LspC_X4ToTbwOgPz>lZZ<_H_hwP z3T}n(xKG?)-O3S)8uon3vG_5i4plR{xC^U2N=j389}Jt{o1WT$nb8l#leYU2|5-0du$D8J;lJJJtQdqRgZ9ly5zTnK)$azrN6RIj zeT-I)5;;&4s2B!KmWRCP%Y-*Cqo&AAkNp;T$CXkBEzzjYsPW`Cbx8H; zB7s~W5h;~3WN5WSFa4o@&@bcW8T^4D&*NzUT8N|YKmku1mL8pigyPs@^y3c$e4|;R z&k5LlB1k`LUI!~+2oePP7?4ao;64C6j+eN`CVTbHpXgDs`3bS-Vu)BIZvYwPXhDDK zy9Vxur61>_7m`^8j2T&2S?m#fr$?+^h*g$xjBdHUm|P|;DxbxxnMDI1nH=omh<0<{ zCB%%!a^OF+F@sZo2E2Qo%cYCbJgxHI`>tk?s;}}v(YC3kR5eCW&uk%pQeb+qCKw>A z{8S`KD~i+v{P6(=-MrfX4T6&;rjIimNiNI4nWJW6n`|97owY^ipSsc41dfK3P<)r= zgH}nzWDoy95oQG;%b#ces3g~HX;wnm+BEUV3frSFDxxNZl(nc%F0r*Z>EMZ6;W;3+ ztU;IF9H2>L_6q|$k>DqR2QQv-&C=0mPs(Ny%?wsKUuu(*ArjLC!AtgwB+z8z#cC;o zg{pcEzo_lO-H|W+p+-Lq6<;$_pcLf#eQ4+pVkmC9p((>FDr=Nmk|7mHAL6k zM%U2R#>v>tiO$W)kXnW|oStHgUW}HiRB48mW>Sh){tEWzBW&2?qw7ysm-}mZNGND$ z3s=V-9zX1y=R&>!oE7bZMelVx?&cjutOB{bfQ{vu3bHdIQj5ha0n zRv&B}{zJA6JCiw%zG`VW4S1-K21S0-aeRn$Ne$;X;@!#O5Cd?OdTRO#J~_X>O-k>+ ztZH_<9tZ6td`nR(WDPVFqJ+vLM+ zABbG7YSz5_H?Nk#u6MX;vx_>3`iX{0bNC@3*XuKXR$_Eyj9f-*aUZ7@xE70%B6`mC z=wc5o+Jj6BA=eA@xM>{uH@SBQ2>x?GKZ2ewvA??R=}WNx-`!_sWaS(uZ`sFy8oYH& zO~-4UGdPC0#2bDp!hdiybafuzpx&8EN-941@mlC@ht}LIIn}zwA#TFFoLW?`M8G`| zQ@(G-7^7N4F8snBtd)XPkra^kot>f};en()j1oC{4gQ8^Tw#%uLu&SQ7{$hw{uzAF z?HRGMc`cE#l;;_q>bPVPGd~_}${zj?W>0!8{so~FU`vfk5uXU?w;g|B;39n*nOM<% zw?^zmXwV5b!OvD&gg?f|n$*3|Dt^yx*Y~U~kI6!(f#q`)sPr)u6C4FlhKYYT@zm*< z*gE>il%#>zYE{{)YVhp#C>xn*RR@`Fd>SB*DP{xflBDllk>GC1L~s=m5gZ xg03o-7Lta}f`Sh6V$MSD66~@bj)ua{l4gq5R(8tvVn(WpCZfhB?k1Kz{|odLohJYQ literal 0 HcmV?d00001 diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xci b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xci new file mode 100644 index 0000000..215f9f1 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xci @@ -0,0 +1,48 @@ + + + xilinx.com + xci + unknown + 1.0 + + + design_1_led_0_0 + + + + + design_1_processing_system7_0_0_FCLK_CLK0 + 50000000 + 0.000 + design_1_led_0_0 + zynq + + xc7z010 + clg225 + VERILOG + + MIXED + -1 + + TRUE + TRUE + IP_Integrator + 1 + TRUE + . + + ../../ipshared + 2018.2 + OOC_HIERARCHICAL + + + + + + + + + + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xml b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xml new file mode 100644 index 0000000..bead073 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0.xml @@ -0,0 +1,261 @@ + + + xilinx.com + customized_ip + design_1_led_0_0 + 1.0 + + + m_clock + + + + + + + CLK + + + m_clock + + + + + + FREQ_HZ + 50000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + design_1_processing_system7_0_0_FCLK_CLK0 + + + none + + + + + ASSOCIATED_BUSIF + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + led + + + outputProductCRC + 8:bbe84eb5 + + + + + xilinx_verilogsynthesiswrapper + Verilog Synthesis Wrapper + verilogSource:vivado.xilinx.com:synthesis.wrapper + verilog + design_1_led_0_0 + + xilinx_verilogsynthesiswrapper_view_fileset + + + + GENtimestamp + Fri Aug 17 08:41:43 UTC 2018 + + + outputProductCRC + 8:bbe84eb5 + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + led + + + outputProductCRC + 8:e2721815 + + + + + xilinx_verilogsimulationwrapper + Verilog Simulation Wrapper + verilogSource:vivado.xilinx.com:simulation.wrapper + verilog + design_1_led_0_0 + + xilinx_verilogsimulationwrapper_view_fileset + + + + GENtimestamp + Fri Aug 17 08:41:43 UTC 2018 + + + outputProductCRC + 8:e2721815 + + + + + xilinx_externalfiles + External Files + :vivado.xilinx.com:external.files + + xilinx_externalfiles_view_fileset + + + + GENtimestamp + Fri Aug 17 08:42:47 UTC 2018 + + + outputProductCRC + 8:bbe84eb5 + + + + + + + m_clock + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + led_op + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + + + xilinx_verilogsynthesiswrapper_view_fileset + + synth/design_1_led_0_0.v + verilogSource + xil_defaultlib + + + + xilinx_verilogsimulationwrapper_view_fileset + + sim/design_1_led_0_0.v + verilogSource + xil_defaultlib + + + + xilinx_externalfiles_view_fileset + + design_1_led_0_0.dcp + dcp + USED_IN_implementation + USED_IN_synthesis + xil_defaultlib + + + design_1_led_0_0_stub.v + verilogSource + USED_IN_synth_blackbox_stub + xil_defaultlib + + + design_1_led_0_0_stub.vhdl + vhdlSource + USED_IN_synth_blackbox_stub + xil_defaultlib + + + design_1_led_0_0_sim_netlist.v + verilogSource + USED_IN_simulation + USED_IN_single_language + xil_defaultlib + + + design_1_led_0_0_sim_netlist.vhdl + vhdlSource + USED_IN_simulation + USED_IN_single_language + xil_defaultlib + + + + xilinx.com:module_ref:led:1.0 + + + Component_Name + design_1_led_0_0 + + + + + led_v1_0 + module_ref + 1 + + + + + + + 2018.2 + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_sim_netlist.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_sim_netlist.v new file mode 100644 index 0000000..320c7ca --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_sim_netlist.v @@ -0,0 +1,504 @@ +// Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +// Date : Fri Aug 17 17:42:47 2018 +// Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +// Command : write_verilog -force -mode funcsim +// c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_sim_netlist.v +// Design : design_1_led_0_0 +// Purpose : This verilog netlist is a functional simulation representation of the design and should not be modified +// or synthesized. This netlist cannot be used for SDF annotated simulation. +// Device : xc7z010clg225-1 +// -------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +(* CHECK_LICENSE_TYPE = "design_1_led_0_0,led,{}" *) (* DowngradeIPIdentifiedWarnings = "yes" *) (* IP_DEFINITION_SOURCE = "module_ref" *) +(* X_CORE_INFO = "led,Vivado 2018.2" *) +(* NotValidForBitStream *) +module design_1_led_0_0 + (m_clock, + led_op); + (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 m_clock CLK" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME m_clock, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) input m_clock; + output led_op; + + wire led_op; + wire m_clock; + + design_1_led_0_0_led inst + (.led_op(led_op), + .m_clock(m_clock)); +endmodule + +(* ORIG_REF_NAME = "led" *) +module design_1_led_0_0_led + (led_op, + m_clock); + output led_op; + input m_clock; + + wire clear; + wire \cnt[0]_i_3_n_0 ; + wire \cnt[0]_i_4_n_0 ; + wire \cnt[0]_i_5_n_0 ; + wire [24:6]cnt_reg; + wire \cnt_reg[0]_i_2_n_0 ; + wire \cnt_reg[0]_i_2_n_1 ; + wire \cnt_reg[0]_i_2_n_2 ; + wire \cnt_reg[0]_i_2_n_3 ; + wire \cnt_reg[0]_i_2_n_4 ; + wire \cnt_reg[0]_i_2_n_5 ; + wire \cnt_reg[0]_i_2_n_6 ; + wire \cnt_reg[0]_i_2_n_7 ; + wire \cnt_reg[12]_i_1_n_0 ; + wire \cnt_reg[12]_i_1_n_1 ; + wire \cnt_reg[12]_i_1_n_2 ; + wire \cnt_reg[12]_i_1_n_3 ; + wire \cnt_reg[12]_i_1_n_4 ; + wire \cnt_reg[12]_i_1_n_5 ; + wire \cnt_reg[12]_i_1_n_6 ; + wire \cnt_reg[12]_i_1_n_7 ; + wire \cnt_reg[16]_i_1_n_0 ; + wire \cnt_reg[16]_i_1_n_1 ; + wire \cnt_reg[16]_i_1_n_2 ; + wire \cnt_reg[16]_i_1_n_3 ; + wire \cnt_reg[16]_i_1_n_4 ; + wire \cnt_reg[16]_i_1_n_5 ; + wire \cnt_reg[16]_i_1_n_6 ; + wire \cnt_reg[16]_i_1_n_7 ; + wire \cnt_reg[20]_i_1_n_0 ; + wire \cnt_reg[20]_i_1_n_1 ; + wire \cnt_reg[20]_i_1_n_2 ; + wire \cnt_reg[20]_i_1_n_3 ; + wire \cnt_reg[20]_i_1_n_4 ; + wire \cnt_reg[20]_i_1_n_5 ; + wire \cnt_reg[20]_i_1_n_6 ; + wire \cnt_reg[20]_i_1_n_7 ; + wire \cnt_reg[24]_i_1_n_7 ; + wire \cnt_reg[4]_i_1_n_0 ; + wire \cnt_reg[4]_i_1_n_1 ; + wire \cnt_reg[4]_i_1_n_2 ; + wire \cnt_reg[4]_i_1_n_3 ; + wire \cnt_reg[4]_i_1_n_4 ; + wire \cnt_reg[4]_i_1_n_5 ; + wire \cnt_reg[4]_i_1_n_6 ; + wire \cnt_reg[4]_i_1_n_7 ; + wire \cnt_reg[8]_i_1_n_0 ; + wire \cnt_reg[8]_i_1_n_1 ; + wire \cnt_reg[8]_i_1_n_2 ; + wire \cnt_reg[8]_i_1_n_3 ; + wire \cnt_reg[8]_i_1_n_4 ; + wire \cnt_reg[8]_i_1_n_5 ; + wire \cnt_reg[8]_i_1_n_6 ; + wire \cnt_reg[8]_i_1_n_7 ; + wire \cnt_reg_n_0_[0] ; + wire \cnt_reg_n_0_[1] ; + wire \cnt_reg_n_0_[2] ; + wire \cnt_reg_n_0_[3] ; + wire \cnt_reg_n_0_[4] ; + wire \cnt_reg_n_0_[5] ; + wire led_op; + wire led_op_r_i_1_n_0; + wire led_op_r_i_2_n_0; + wire led_op_r_i_3_n_0; + wire led_op_r_i_4_n_0; + wire m_clock; + wire [3:0]\NLW_cnt_reg[24]_i_1_CO_UNCONNECTED ; + wire [3:1]\NLW_cnt_reg[24]_i_1_O_UNCONNECTED ; + + LUT6 #( + .INIT(64'hFFFF0000A8880000)) + \cnt[0]_i_1 + (.I0(\cnt[0]_i_3_n_0 ), + .I1(cnt_reg[17]), + .I2(\cnt[0]_i_4_n_0 ), + .I3(cnt_reg[16]), + .I4(cnt_reg[24]), + .I5(cnt_reg[23]), + .O(clear)); + LUT5 #( + .INIT(32'h80000000)) + \cnt[0]_i_3 + (.I0(cnt_reg[18]), + .I1(cnt_reg[19]), + .I2(cnt_reg[20]), + .I3(cnt_reg[22]), + .I4(cnt_reg[21]), + .O(\cnt[0]_i_3_n_0 )); + LUT6 #( + .INIT(64'hFFFFFFFF80000000)) + \cnt[0]_i_4 + (.I0(led_op_r_i_4_n_0), + .I1(cnt_reg[12]), + .I2(cnt_reg[11]), + .I3(cnt_reg[14]), + .I4(cnt_reg[13]), + .I5(cnt_reg[15]), + .O(\cnt[0]_i_4_n_0 )); + LUT1 #( + .INIT(2'h1)) + \cnt[0]_i_5 + (.I0(\cnt_reg_n_0_[0] ), + .O(\cnt[0]_i_5_n_0 )); + FDRE #( + .INIT(1'b0)) + \cnt_reg[0] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[0]_i_2_n_7 ), + .Q(\cnt_reg_n_0_[0] ), + .R(clear)); + CARRY4 \cnt_reg[0]_i_2 + (.CI(1'b0), + .CO({\cnt_reg[0]_i_2_n_0 ,\cnt_reg[0]_i_2_n_1 ,\cnt_reg[0]_i_2_n_2 ,\cnt_reg[0]_i_2_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b1}), + .O({\cnt_reg[0]_i_2_n_4 ,\cnt_reg[0]_i_2_n_5 ,\cnt_reg[0]_i_2_n_6 ,\cnt_reg[0]_i_2_n_7 }), + .S({\cnt_reg_n_0_[3] ,\cnt_reg_n_0_[2] ,\cnt_reg_n_0_[1] ,\cnt[0]_i_5_n_0 })); + FDRE #( + .INIT(1'b0)) + \cnt_reg[10] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[8]_i_1_n_5 ), + .Q(cnt_reg[10]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[11] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[8]_i_1_n_4 ), + .Q(cnt_reg[11]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[12] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[12]_i_1_n_7 ), + .Q(cnt_reg[12]), + .R(clear)); + CARRY4 \cnt_reg[12]_i_1 + (.CI(\cnt_reg[8]_i_1_n_0 ), + .CO({\cnt_reg[12]_i_1_n_0 ,\cnt_reg[12]_i_1_n_1 ,\cnt_reg[12]_i_1_n_2 ,\cnt_reg[12]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[12]_i_1_n_4 ,\cnt_reg[12]_i_1_n_5 ,\cnt_reg[12]_i_1_n_6 ,\cnt_reg[12]_i_1_n_7 }), + .S(cnt_reg[15:12])); + FDRE #( + .INIT(1'b0)) + \cnt_reg[13] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[12]_i_1_n_6 ), + .Q(cnt_reg[13]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[14] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[12]_i_1_n_5 ), + .Q(cnt_reg[14]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[15] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[12]_i_1_n_4 ), + .Q(cnt_reg[15]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[16] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[16]_i_1_n_7 ), + .Q(cnt_reg[16]), + .R(clear)); + CARRY4 \cnt_reg[16]_i_1 + (.CI(\cnt_reg[12]_i_1_n_0 ), + .CO({\cnt_reg[16]_i_1_n_0 ,\cnt_reg[16]_i_1_n_1 ,\cnt_reg[16]_i_1_n_2 ,\cnt_reg[16]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[16]_i_1_n_4 ,\cnt_reg[16]_i_1_n_5 ,\cnt_reg[16]_i_1_n_6 ,\cnt_reg[16]_i_1_n_7 }), + .S(cnt_reg[19:16])); + FDRE #( + .INIT(1'b0)) + \cnt_reg[17] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[16]_i_1_n_6 ), + .Q(cnt_reg[17]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[18] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[16]_i_1_n_5 ), + .Q(cnt_reg[18]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[19] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[16]_i_1_n_4 ), + .Q(cnt_reg[19]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[1] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[0]_i_2_n_6 ), + .Q(\cnt_reg_n_0_[1] ), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[20] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[20]_i_1_n_7 ), + .Q(cnt_reg[20]), + .R(clear)); + CARRY4 \cnt_reg[20]_i_1 + (.CI(\cnt_reg[16]_i_1_n_0 ), + .CO({\cnt_reg[20]_i_1_n_0 ,\cnt_reg[20]_i_1_n_1 ,\cnt_reg[20]_i_1_n_2 ,\cnt_reg[20]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[20]_i_1_n_4 ,\cnt_reg[20]_i_1_n_5 ,\cnt_reg[20]_i_1_n_6 ,\cnt_reg[20]_i_1_n_7 }), + .S(cnt_reg[23:20])); + FDRE #( + .INIT(1'b0)) + \cnt_reg[21] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[20]_i_1_n_6 ), + .Q(cnt_reg[21]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[22] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[20]_i_1_n_5 ), + .Q(cnt_reg[22]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[23] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[20]_i_1_n_4 ), + .Q(cnt_reg[23]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[24] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[24]_i_1_n_7 ), + .Q(cnt_reg[24]), + .R(clear)); + CARRY4 \cnt_reg[24]_i_1 + (.CI(\cnt_reg[20]_i_1_n_0 ), + .CO(\NLW_cnt_reg[24]_i_1_CO_UNCONNECTED [3:0]), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\NLW_cnt_reg[24]_i_1_O_UNCONNECTED [3:1],\cnt_reg[24]_i_1_n_7 }), + .S({1'b0,1'b0,1'b0,cnt_reg[24]})); + FDRE #( + .INIT(1'b0)) + \cnt_reg[2] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[0]_i_2_n_5 ), + .Q(\cnt_reg_n_0_[2] ), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[3] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[0]_i_2_n_4 ), + .Q(\cnt_reg_n_0_[3] ), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[4] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[4]_i_1_n_7 ), + .Q(\cnt_reg_n_0_[4] ), + .R(clear)); + CARRY4 \cnt_reg[4]_i_1 + (.CI(\cnt_reg[0]_i_2_n_0 ), + .CO({\cnt_reg[4]_i_1_n_0 ,\cnt_reg[4]_i_1_n_1 ,\cnt_reg[4]_i_1_n_2 ,\cnt_reg[4]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[4]_i_1_n_4 ,\cnt_reg[4]_i_1_n_5 ,\cnt_reg[4]_i_1_n_6 ,\cnt_reg[4]_i_1_n_7 }), + .S({cnt_reg[7:6],\cnt_reg_n_0_[5] ,\cnt_reg_n_0_[4] })); + FDRE #( + .INIT(1'b0)) + \cnt_reg[5] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[4]_i_1_n_6 ), + .Q(\cnt_reg_n_0_[5] ), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[6] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[4]_i_1_n_5 ), + .Q(cnt_reg[6]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[7] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[4]_i_1_n_4 ), + .Q(cnt_reg[7]), + .R(clear)); + FDRE #( + .INIT(1'b0)) + \cnt_reg[8] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[8]_i_1_n_7 ), + .Q(cnt_reg[8]), + .R(clear)); + CARRY4 \cnt_reg[8]_i_1 + (.CI(\cnt_reg[4]_i_1_n_0 ), + .CO({\cnt_reg[8]_i_1_n_0 ,\cnt_reg[8]_i_1_n_1 ,\cnt_reg[8]_i_1_n_2 ,\cnt_reg[8]_i_1_n_3 }), + .CYINIT(1'b0), + .DI({1'b0,1'b0,1'b0,1'b0}), + .O({\cnt_reg[8]_i_1_n_4 ,\cnt_reg[8]_i_1_n_5 ,\cnt_reg[8]_i_1_n_6 ,\cnt_reg[8]_i_1_n_7 }), + .S(cnt_reg[11:8])); + FDRE #( + .INIT(1'b0)) + \cnt_reg[9] + (.C(m_clock), + .CE(1'b1), + .D(\cnt_reg[8]_i_1_n_6 ), + .Q(cnt_reg[9]), + .R(clear)); + LUT4 #( + .INIT(16'h37C8)) + led_op_r_i_1 + (.I0(cnt_reg[23]), + .I1(cnt_reg[24]), + .I2(led_op_r_i_2_n_0), + .I3(led_op), + .O(led_op_r_i_1_n_0)); + LUT6 #( + .INIT(64'hAAA8A8A888888888)) + led_op_r_i_2 + (.I0(\cnt[0]_i_3_n_0 ), + .I1(cnt_reg[17]), + .I2(cnt_reg[15]), + .I3(led_op_r_i_3_n_0), + .I4(led_op_r_i_4_n_0), + .I5(cnt_reg[16]), + .O(led_op_r_i_2_n_0)); + LUT4 #( + .INIT(16'h8000)) + led_op_r_i_3 + (.I0(cnt_reg[12]), + .I1(cnt_reg[11]), + .I2(cnt_reg[14]), + .I3(cnt_reg[13]), + .O(led_op_r_i_3_n_0)); + LUT5 #( + .INIT(32'hFFFFFFFE)) + led_op_r_i_4 + (.I0(cnt_reg[6]), + .I1(cnt_reg[9]), + .I2(cnt_reg[10]), + .I3(cnt_reg[8]), + .I4(cnt_reg[7]), + .O(led_op_r_i_4_n_0)); + FDRE #( + .INIT(1'b0)) + led_op_r_reg + (.C(m_clock), + .CE(1'b1), + .D(led_op_r_i_1_n_0), + .Q(led_op), + .R(1'b0)); +endmodule +`ifndef GLBL +`define GLBL +`timescale 1 ps / 1 ps + +module glbl (); + + parameter ROC_WIDTH = 100000; + parameter TOC_WIDTH = 0; + +//-------- STARTUP Globals -------------- + wire GSR; + wire GTS; + wire GWE; + wire PRLD; + tri1 p_up_tmp; + tri (weak1, strong0) PLL_LOCKG = p_up_tmp; + + wire PROGB_GLBL; + wire CCLKO_GLBL; + wire FCSBO_GLBL; + wire [3:0] DO_GLBL; + wire [3:0] DI_GLBL; + + reg GSR_int; + reg GTS_int; + reg PRLD_int; + +//-------- JTAG Globals -------------- + wire JTAG_TDO_GLBL; + wire JTAG_TCK_GLBL; + wire JTAG_TDI_GLBL; + wire JTAG_TMS_GLBL; + wire JTAG_TRST_GLBL; + + reg JTAG_CAPTURE_GLBL; + reg JTAG_RESET_GLBL; + reg JTAG_SHIFT_GLBL; + reg JTAG_UPDATE_GLBL; + reg JTAG_RUNTEST_GLBL; + + reg JTAG_SEL1_GLBL = 0; + reg JTAG_SEL2_GLBL = 0 ; + reg JTAG_SEL3_GLBL = 0; + reg JTAG_SEL4_GLBL = 0; + + reg JTAG_USER_TDO1_GLBL = 1'bz; + reg JTAG_USER_TDO2_GLBL = 1'bz; + reg JTAG_USER_TDO3_GLBL = 1'bz; + reg JTAG_USER_TDO4_GLBL = 1'bz; + + assign (strong1, weak0) GSR = GSR_int; + assign (strong1, weak0) GTS = GTS_int; + assign (weak1, weak0) PRLD = PRLD_int; + + initial begin + GSR_int = 1'b1; + PRLD_int = 1'b1; + #(ROC_WIDTH) + GSR_int = 1'b0; + PRLD_int = 1'b0; + end + + initial begin + GTS_int = 1'b1; + #(TOC_WIDTH) + GTS_int = 1'b0; + end + +endmodule +`endif diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.v new file mode 100644 index 0000000..81f63f1 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.v @@ -0,0 +1,21 @@ +// Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +// Date : Fri Aug 17 17:42:47 2018 +// Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +// Command : write_verilog -force -mode synth_stub +// c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/design_1_led_0_0_stub.v +// Design : design_1_led_0_0 +// Purpose : Stub declaration of top-level module interface +// Device : xc7z010clg225-1 +// -------------------------------------------------------------------------------- + +// This empty module with port declaration file causes synthesis tools to infer a black box for IP. +// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion. +// Please paste the declaration into a Verilog source file or add the file as an additional source. +(* X_CORE_INFO = "led,Vivado 2018.2" *) +module design_1_led_0_0(m_clock, led_op) +/* synthesis syn_black_box black_box_pad_pin="m_clock,led_op" */; + input m_clock; + output led_op; +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/sim/design_1_led_0_0.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/sim/design_1_led_0_0.v new file mode 100644 index 0000000..26f79de --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/sim/design_1_led_0_0.v @@ -0,0 +1,71 @@ +// (c) Copyright 1995-2018 Xilinx, Inc. All rights reserved. +// +// This file contains confidential and proprietary 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. +// +// DO NOT MODIFY THIS FILE. + + +// IP VLNV: xilinx.com:module_ref:led:1.0 +// IP Revision: 1 + +`timescale 1ns/1ps + +(* IP_DEFINITION_SOURCE = "module_ref" *) +(* DowngradeIPIdentifiedWarnings = "yes" *) +module design_1_led_0_0 ( + m_clock, + led_op +); + +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME m_clock, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) +(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 m_clock CLK" *) +input wire m_clock; +output wire led_op; + + led inst ( + .m_clock(m_clock), + .led_op(led_op) + ); +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/synth/design_1_led_0_0.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/synth/design_1_led_0_0.v new file mode 100644 index 0000000..860b81e --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_led_0_0/synth/design_1_led_0_0.v @@ -0,0 +1,72 @@ +// (c) Copyright 1995-2018 Xilinx, Inc. All rights reserved. +// +// This file contains confidential and proprietary 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. +// +// DO NOT MODIFY THIS FILE. + + +// IP VLNV: xilinx.com:module_ref:led:1.0 +// IP Revision: 1 + +(* X_CORE_INFO = "led,Vivado 2018.2" *) +(* CHECK_LICENSE_TYPE = "design_1_led_0_0,led,{}" *) +(* CORE_GENERATION_INFO = "design_1_led_0_0,led,{x_ipProduct=Vivado 2018.2,x_ipVendor=xilinx.com,x_ipLibrary=module_ref,x_ipName=led,x_ipVersion=1.0,x_ipCoreRevision=1,x_ipLanguage=VERILOG,x_ipSimLanguage=MIXED}" *) +(* IP_DEFINITION_SOURCE = "module_ref" *) +(* DowngradeIPIdentifiedWarnings = "yes" *) +module design_1_led_0_0 ( + m_clock, + led_op +); + +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME m_clock, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) +(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 m_clock CLK" *) +input wire m_clock; +output wire led_op; + + led inst ( + .m_clock(m_clock), + .led_op(led_op) + ); +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.dcp b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.dcp new file mode 100644 index 0000000000000000000000000000000000000000..55b8336e3f59ba2180926c25bb9427fd6e5e61fd GIT binary patch literal 217020 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%0DOxg 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%0DKKDJLr75>=b4|6vx4-%-j04;6 z;Otk7pInQW3rK5KP!^+%xjOvr%h3160?TM_lQ|~8)Tj{QYeB6a;biP?%%m+)3s`Op z={TEQImJCbC$IOv@{BVJCZ_6KTqj~;g4mrtl%l4di~gz$E8e!!`bM|>mG{4#RLuk3 z>=OspOYpab4G#epP5Urdq}&i+d7G86B%GYj^uNAkFayNyBu?xg1H@~U%#g{vpDFbe z9yR5mWTV`f765=%$j(FZzCbtgs%?<{0@4okOfl#5lqWLpFw`e;oL0gb2Q`9Ec=%aJ zyfT=45n@}dVgS8W4Z|nfGR1KNdYC@8I%**Y!ke7s(2C^tXGFM`FgMrWnj5|%p@IkG z*}k67BRh&)SwDxH9m|0yz?s;AOD=tiz`o1VmEPF!NRYZ^z=L?b4J|4$9_i|n#SX_e z2Rt@S>$m5CP#B&Ry<_=`v$3{xN6$MAXQf!q^U`cv7eW5zvO;u=nl#hW;Itc~*vPCq ze>a3>3BqPW^?2%zLBm2Or>ceTb(WmzG7b7)T@d2TrLvMS+7!=GlrN87H*s$LNpK8v z2WuHsQ5zN0ls7n+R|8<4miH`wgrYG1gBJ1$-BGstn4(l-r!qC?`wrZR?ZUIBFGv{C z;0eZ4%yA5o$(1!tZd%+n&Tz`^c?`F?atLfqhmHJ+Zl48VF91xm$xa<+ZN_$0oApzwq^jcPp^0kiDI=ZtQ)gg1I zK|B;b{B=qIW$wThx~mKLs?J)u%*sHiiuN%iO$np4M-SHoF8D2EvzQ;NG~fjgR({=C z8Gq?NsHH|g+Ud5I|F(o_`(a+z)H|M$quG8f)#Q6;my~>P__I=NSG$U|OX?M+^4e>pUEK8w;==?&(D#`fNIx6sw|dJUqV?5;i7C#V$Xo$~+Y0mN zuAYgp$Ysx*QN4BnWWa@EF56M3jng1(@4z3ywIYwWgM5uO{hC$Lh=}lOIO@+0AQ^a` z=U9*%ZP6zlos%u1<3@@41IBfk$N$57mLsfAoYb+m0+bxmvXs;AWmh`H5;pk-&PXHd z`8ks1pXgw$QpdEpx7DvFXW;-|K%u|yGlZ!$H~15}`A$ijiW|SOH?Vw1E7~~+5*}2t z(?-L)ZmC@lxkclmch+s(KF7!c%16VZY;%+q2Z-tGB9qQxtaW1aZFu9n>Q)=@P9C<~ zM{y0%qL>exZDkM5HG#!JK^iiSLrhsp`>y1KYn*Yi2eeqd70yB4wjSF(NWWaq)Mkdc z%)gM{gZ~i`e*kG$P3HW$mdFBWh`DpM=VT9L{DXp9V+_f9+$z;&Nty;}2lf4%TzD^b z8mr|mPwdJ8WqB-9rC-{hA?5(u5zQOO=h+-$gipxoSW-#{U1KlZubDcOxhO zbwA#e4;FgAOaF9(ASFwul8W7ynITP&rR|A_5XE$ypM6;A%|6tg??JZp294w^LgiJk zHb@tc33KrhS0YK^nFQ7m4FXK4Wy!3?Ikl>(*kq7-yiJ_B9fIWpTVeEp+ubqqdITLk zI%Z5wR^Z#sNNg>8Mbuw|vU-pX>r- z<13|Rrr8>IOppZ7bpUl@95RIpv}pH6yqe$qEp&g#eg}+fh&BoE7h1TE1#h+O9fY^< z=S%S9y+ZF`tETJ)u0A@lz9*b@7xacggpVgN2sDd4Z$U+F`4oW=^E$!>_7?J<`uTB* z!c*-ogS9iSJMTQchb9*E?D&XIEgXjcDygnd2ru5SuM=M9#32XS#tkXJ_e|YNVubAH z#vyy1zr>qk!*)&G9EFYkFN1SB0p~;7UB7cqR$pPZBOaZxm+0%FhOUE=$dR|lZ0v*{ z&Cqq-(|`nZ-Uj&Q$`6p1Zb^hfJvHL&+edOUz@)Ib)q{s$(5dLN`N!h$&$8;a(;!OW zh}tH`9zx-$27@MTzYFT2smAff#C^BZL}QnUSodM-=x!1Fkc%VQP|6AtgvZL`b*=u> zSSQ~C#(YNRtT;U-`d9ai2SYi38Qa0P2~##HBAhCGCEdu)6-{sq?%rDr8}3@4y$QKL zd44mMXrq5!Qt5ZONhHm*kXIr@DY{r2WSrEZG>Lu20sT_j2Zf*U`P~wjWoE+KIjdk5 zH+N(eoo0L9%2TL!X2DKWwu@$ zVw*envcUDUd_F;jf$(1BRXPq0NJPLv+=iUJdbfb+1XmAA!@!PtA?3`gYYk^qgDc=Z9QckV@0brRaUF>2)EO}s`q}!V z2Xb8`>gl@d41T1?{bHgr$Mv|xQt!lPh>QTH1j(?7S$B{qOc> zB*r13z~j51o50f}A~GTjNryWRr8H!F91vT@YyLe3g6k+ESAPsrfVH?wGMHNY0pfxv^qSEVRt|eS zC0rR^MBe*gzETO>#V9_12kO_k1Dw5HWbZH%qz~`6=piKmyZrJew+jm7 zp(6NkcP-l6$M%Q6C#qE--}4=Yi^SWEN1;fZ;^}Ml8!jsR|U( ziIUCYJQ%f$p4Jbq$YT9}TNHFd4dPK)%TuH$q2w7w7W=WMDKipdK3VR%d5HiFXE$rr z@SZ>7&mDPR1VG>rKmJJynnPn~t#@ng*hwoVE>8C^&C78M^C3)f28PU%Qt)tV@5Th3 zLp8R?AkRpP)Zg!N)|>bIrre7YLCga*0C%Z(5UENdeQaH%9tzTb%;nuNnIZ|Js=ab{ zpFOP})v~ujg>R*X8;tZ>4ZB@`d4xZ)g-N{0+?<-uRKGCW!AHXH=M;``7=9;mn6=>g zoa`biebMg1u>;yA(VcU<2$9z}1O%S^559os4CPH zaBF3)xa>WnGMu;W#2YCD-yQWEkWhCls(*4ZY1YN!Ut#Q@`kG5P0&JnV;-u8Fb7>&o zP6iKb6L=yaHaEro1mzJ4z}wJjeS7Bn*AX!t9Y8v6`wq9Di@kb_#~h*1%cE#VjMk%q zT!tn7CVu=5B}%*90jAK8D?Z{gj?>}a#&uz8MRq z7@*@2B#Bkppf<4Miu)1gcnpp^^kKnIkrgY!4|jpSUR1H=$y#@GS?l|^0on#shG>qH zcnqy!f4DqERxQXTq%|njTM?GGF25mlLf1P#Vs(YP)^d2%G1vnHE8^uTWPMK9E;L#O zE7@-pie{b6m7AfdlxC$jl*ot}$>14Hv;B8&Y{i{U3CFhQwziBV#)%ydhGb#%)A zoDyC{nn0mUlNa3>f%sHSqu^2#wCKr`H=T$C@|L8El)gm(wd#R9-ru|$J=thVMR1y@ z&1=EK_uGe)AuDmp@1nyOZeQP4;nw0mHM&T{_KpkKSJ7`NQtGv!S-%qLpNHmt_XCcN z+M%^aV}l8c3O*Hqm)&^7-#l_q00&YpuRcWIO?0R)Rg$X~pZyr&FVe$dpcI(D@hZ_7 z>%J(jMfBVH%>7gt5EZ-qAC+{r_3U{}+iIh4 z%O{w~nwD9R%es|Y`zoa=3i_Q-c=z(E7f;oLNQsumSVX=+27h1a{F1Ln{J|Myq;o~R z@A5E${;s||O@M|bFN{m>h4Xxa*|p{Lqyekh2j+-_J>*V`yrj5^&Oe_%%?l(J5skh; z@7S#*1D_tJ`}-sq#qvtRrNaBhN+uutwGfV>T*$l+RUW zoQc7@Yy|=U-N1}Z6rzCF6!-10WukUG!3z(A66r*1OK;%=z_;)E(Pv;~x)e_)G5I-C zjl;=5#0<@mTzwwUtI?;@d@7+7-z!Bv@QiN1ok_%w5y4enEv+lvrN?t2MI+Q7t!_G| zMByeodBbU=q^GR+V6{dbOVl{&oVjgqc)aCsf$9%e6{UW^Ah@$K9%Brb99~GD;uqnx zFK>N5|AH;R?)*Xf2o=BV@)cjFc14RR+9MF+yD1}vaBpgi{3I8hjM_yM&;U=jO{@>u zA{`<ARshkIWV8^JY4kszQ}S!?}Y^vByyVD`dcfJ1D#um z3!4oj42ztrsYne7fbNE%KD2^M?34WMXg?RO6MYJHtY+N~Je{S&dnlM&>3>$nLrG9a zpWv&C%kWr%IzXwM`T13_VH(kyVL+|&g9Ue_jeiKi|4wD#L;+Y3I^UJD`iMhlJS9#* zhg-BVRrW|HWfj?En#}t9qoA@2UovsI860Qe`dEZo1HqnI@8 z(tdNk@{I}THiQy5GP3}0`Xlg(#bfJ4Qg`CQYa?p6MyWI#{*b1F-GN<+JS`PtEhcJpHDu3yChc5v~aP zkir4iXXZl)*Dwk2GMGcUgrnlG0iyU(gfwanllNtas8tUk^ zI;u>RHdJvRK=}8@BUt|y7;|ktL#|owneRz%11wKqs43RMbics|4lprGD`#*IZW?){ zlV|(xmvpwX8R9_Syt&XGXDu4f6NFm20(miO$^7q~iD0Ic z1}7OiFZapkrx#0~iQUyTenXw_Pbs8loilss%aiOBlK^weCK^c~+xET9Ik0+rinF?D zzV#>itWS1urj!Hid6VIF0#oo^63~VX$E(KX2JI0EhQNoXI^5L*fvUZ8>;8$pmZ86# zQ&#jlj8!#lo*6ZJy9(%tde7LGoUM%QREPI`1t&L?LdogXHi-P__h)n%FL|FppdrJM z+|GPj3OgoN<*FL~Vm9%?haasZJ&Z-8+x@P%r5?Q661rM3fL#?2)resOPR z2g_pEUg^-Orz7ocA#>g398@P;aa-=r=Ny;BNi(8>7YV_OaNJBB5ACe(JhNv~t_=2C z5`vmJMMDlslR2Cwf~!O5SAZ8q&QPH!Z~T!HV<^A zpxga|8=!hKpmh4<-X*TJDzv;F>gmh^0eXV>cQkfPTM^k@^*_W>&iI%>gY-r2$rn16 z6`-+^JPA^)@74%)bLN}nlHc?rxCL=UK>jSP+e@+Q1Www&`laCiTt~@cyz=3Ycquy7 zx*IBU%RszrRpHtR^z7(qWL4qY`^v7dOf-gF+0NN82M{kkk(RVCnI*+QV#{tMh?3z@ z^XEx50P1*dSoO;Kx?OSyd3Oe2xwG+74#LS5VXGfBi7Z8e?T%>>)Z z-5LFM*M1^Q`U5h?sn33D3S%a3#+nc&QA>y!CZ9)7ooD5^zpZG-V#imzUlAvTCB%F6&_in`VKECO@d7=pmgWnPe%V_HL8rvC5~(F&8J&nzzmF(lA!(4v;>q z=m*2j!BqCawPtm>_{INi0M-f(MlM;rvrG#QnCfZ*=l9%0Md);vgWfsvXV1k6g0!?Y zw`n>+Tn zzLYuI^EGF}6Mm;tl8RV5+pUM}B?#)=4G9Xw2GHCf5Io;rLNycoitSvaL8vmk>RV4y zxKyYAhtfQjSU^l^rlN$wQ`oHh=SF$;;+cSLox?v_YN+^2=#_r;#G1g}qq#S^-uzg1 zW!<4DJ-=z}XH7zGI*d-j$eGUM&TTjyF1h$VYOU+E7~&SQKc+%6oXm*n%Vx(qEbp5f zZjVJ5=1Qp1_^$iyZklK_PMNvLb{Kk$d!B3q%vYG>O6Tfgn7RWlz7q?g#itY5l=}(nj%IEZg)21aj$ZLPv4S_@Fy)^QZCm%!o2cc}@q)fHhylHf83>Iq zic(#P;2_xX&L{B!&ba5dD;*4lX8(LZ1d!%W6<)nK`b2EWcx5l_HT88|owY-8sSLF9 ztYep|cp3B1L59%+Hlglib5n>E67Gf0E*STBszBi+wCZ^MBh!yn zPP07wuLYj%Y~t7fAC^ryMuJkWa`3&wNcEHfBc(H;hez45hC*t4Mn?~6u54h%S}$mT zx*~RQhbqrN$c$ztr1(K zi@Cr*V)P^WLC6g@EkwZY+7O+iHx9J`RCq;$#0Hlh#_$t#4|!p_QTsfKzx;mraI$!% zjg6qT$VxIIMJ8VKUg(Hj>NM4B8s~1w5>S38neScTHAm6{Lbpwz?2#Y96;a49%~iAk zIc;taqjdSu0ZBnUcZA7XLcVw@Xvo=2R?wrJa!ELz@Ts3NjDf3_R>%1whm_VVvFi{Q z!glRKDaw{DQpz84D`8~F0Fdv6xwU!IICgyRQ8KG=psB85mT|66k_Gjz7fIcNk8Eio zibshBuj~B_RsB0U!vj_N0+!c^8O?Q{WA-A2OO9+?mqy#yuH z$WEi8cfx;Qk;%rd@Qb6?DX4YTS_|xnt7+3k(U-PcL<>8gj=iK7Pf>3^SIlc#*m&(D z3_ilDlq3=s=P2nq<$H6@qEp84QE3&KJ5GmcVIiS2HBl36_6V(uTXg0jj3`+{|0qOp zm^q@1l2{7u05|5iSsw@7Iqd96D+2hHd`Ua-@69D+^{AXs!K57WoY1K%E3w41(VB_B zkYb*zDkfnIUibrC=bQAiFgwdmcGgJW<6b*^GF*9c%xkBN5ykOB^BXrcD##S>5=X2; zfPHiaPf&$hZ#~}93*@kUPUou0wE0-E=Ag|ljY9g;pwOj)$c^XE_c5Ap`Sdzqrrkwun6@y3%6X$TwxjG>4Y>4fG*10DUqsa3jz9tq!?rb?v(Xr3I zfT`U6Q92^cG%Bo4Db>xeTv_(LVHt=w(93pyDIEWf)))~@K@$P><5 z;SmH#8niA8*HoO_4{0W2I#C_ z=6-khO&;T394_StRWF;YGPn%@Vab0H%c<^Wj+tutv19c~lHW;>X-@5d%>}Ciymp)l zoQz-Zf)5NIBd}wgwG-gwC7z>IZH6EZ1^5{u(?}?81TG&Bi zV-B#QxByN@7mOioz>F&XbLB+Gla-6q-ZyY@o)f*u=uku;e?Lc>IWhwv$2HwhJ$Y1wcU&(E zB_}JbEJuE2J9XF(pHb}QNp^sjdfc2pXyjkOEt#Xi5~LO#ujEWqmW~Mr2boO{LqD0~ zuKUpTT(8smJh~0I@J`+7fM-3Mu zZql`MwGzXkRaB6GQ`+wvm4OxRZ4k*57;U{9ys;f;rM@F@zw{js@&jsqmDi(csTB3j zy2W^TMzmq&!W0SiPdFfe1TXx67Eh(7>VezpO?sB9o6@TFArKjT+8tl_~N-$?GnmUab0f+!mrri5kIbhnb6 z1TIiMssLCH+3OeIehwYEUL}NdhhE0<*AU48`-QPX|S<0xZ_*DtS8bd3`=nhr1qD-T1@X*M9B z_QYpQAgfKutxOXCaszxE16mHWE&`i@E@<3l(K#JCeUm~STpAAk(|+rh8TH};t`)7) zj(Crd(33k@t-@nx-{v1WquG?2L}3@dTeC~#p5eMMYWBl6qU_cV{fRB5SX@UBpu_IC zIArI_5>`V(Kw*EqFM*nosAC;EShnJ#S+=*oCoSGbCvv_%X+LvGr6sPcTm5bElJIp! z3*)bq@EqdQWuk<{Lf@B}+G{zxon~hN_yjzE(ykNAB10~fT#Nqohr-V|j{_VNvWiOl zCAbBt&SE0K^_P?c|E}h1s$&Z5(8A*5)BP1%q0{Yn>TXy>nIRIl1`})5@=Zy0f!Zh| zmXu!k{Puh>9~X-njf|kMlIugTJ_@svcbr}w?rq18QJovsMj-mYdHOcVC}=6ldeYC; z(=dNVG(0&bXk?5l2KiV5^m$CQeUC5jPx~|WV+z&-aL54h?1pkJ2r&S+_7j@}FJL&j zR;9fQ_SJH0AaQ7RsFVqgYOQEBV`-S6%paj~2<9I1wETN?Y=IZGhFmuawx(yGUV&!G zG@Q8G%h!eeD#Bc;YERWB4K}=aPP9g0i5G&5Cl;ZSH0QX`sR}bG6!O{W ze-8E*qo&@>Z4%vF)f(nCY8t1?1#Cp3K#K0gDbaie5-Xz|9q#f&OKFT&2AvWvL_m7H za+00}Ul>S(m7p~aKg7%utZAinC0syrj+)b56Uf(V?1!Edl7wy@fbA+$0&Y$1z5(Ga zFf@c;j(SXP7gy&-|E~i>Gi~!q;-PaxAKvghntf;QjF23?3!*EaT6ouec8YVi$JQcG z7}r3Zv^~3#ZQ02T6Qs|1mmoAgK%6SOh``S`&qlON-0wK|P}_|5zv61RDSfN5OJHtK zKEk~B%r#cg^CyfS8!zEFh+)=hX#%XM9xs@cX)l%?y?hO>HDp!aWr z?E4INy%XTJEbp1nc~5jhApvbswL{md!g~||xM}ansn1Lz#pyt1*=u6#JgEO;Eq>M4 zbxTa15T3Pw=sw<1s$Jf9B+zUEd~Go6r)knJC5pEf>H`gO)p@v_gZdEFgtjDuPMIJY;w>uVt5vbN+%9`ypyTr3jz(19g25w zB|0RZyAlFCE3#q9Zfon~+6{B%m_nKMH-LGo?GMpk2Z(L`}1TCeEy+4 zL77%~F7!op*ic&Jx#;xZOIUi#&MJ=i~j6dir!4BM5pYF|KWwhQ-FWfA$Ld z^gacsc!Q8aBNRPtmt;ctYvv7qYXA-z90KJ`FPVAOTwz0P6fEHo4r6tLeJyZuPY^3Pdp`G-_aPaaFm-_*-7q6DC4NF{5Xcp@f6Y) z(oBgmyfHN_qIuMllz*t)=5|X=m84jOgDEML&-vNA)|hFe_$(4Fv&%nK-|F^d=8)s zbkINfJzl7KFL<9A3$ATl0aH?ve1yIKN=+y4#tS!(g`X5;TAVDwSCgA64oaT!+>q)1 za|AI$+Oc3|tj*XVwQ5~hv@N+AE%=DGxcaoBIO$D<0Ttag-%CmSA0Mx6W;&fYVcRIBlFc~`TuzF={83_wh#%CszE}R}Ao6O!;p2)e zun2~P6uYj_mXF_xMqg=~v3Oa?zyVLl7koV+ZG5c#x+*MKLH^SKBdNy&b5l-@mgDq9 zmc+ml;jnr6*YnyqS|XSBnEn5Flj(15W|#cz!2Q$%f0WJDnpszEDvz%w!8`tc?%?Zr zB<3H6%pwf39}oc6ey-9!MOxf*!=pK`%Pe(lzvBTT6CcfTh9$`gm>Hbxx*ZZKl>nC^d=7HA{WAbWZ zas^=CN`G5Rs$}0pww$=?9{Zr;D|XuAy#;HP8uO#TKztwH2#6Cac8mg@Yi~b?gu4KOGTjDPGTwYWWZx^oKX#5P5@~1cTi(dDb0t@xoM71<7 zsPEVW%W`tljmS1KZy^BOxF&%lFSM<^X_f6?AWj+Z*mCN8DL&ImJg${x6%yFRHFSuJWj&M6jI~E%dlT>VJS&0jL-3zO&&N-r%>G2ZRU}~%4I}uILW^v?X;~Q|K&zqVLzI#+%eX5U!ExD z%}MX#^aE;g-N`z*i+c2Py7=-{$bP8l-#FlWjq`ywlCnz5^z-U&zqzpBKoy^bbmk zz&U6FYbi0y7xHs>2}H4h7yIm{>|B6-{@^5{TfY5XybtFKfg?ekLr3J{-=9o9Wl7Z; zHdlT}ywpoc)(^`VRmz`WGU+k&Y9#-GE~QEnBvs2Fq6l=ql=DjFheCkESp<(zRC}f0 z*Eu*Geag13;2-gwg--Q)eD!ilfdqAA)MvEIr++_~8_N?Js7o^SFCsws>hyiO+u}9* zYCV}CqQMxYjenY&{(919TsGij zdcO=z$T68o-mNkp6SxXBenenS^Zpb*V6Bo{TOm#z8RMWD{G52g4$+S-`Nm1|m+B+| zQ3+H_$<~+>`DXa-Q9_~6fzM{Oq>)5``7?va&xTK-Gj*K>KE3fvn8q(FuT5KG=T2D) z*1Dj@f<`2ZYSX1u%*{NkJGMjMZjW z8cOqj1D03o9vGSBFzlqIK(1PTh;0ldN)y*0T^8L8Hg0}wWC^Osa6izJGXlh2xA4{F z+fbHNlhynnjTJ6GowiGe!;v7=V=IoFG7$^@B)qbqZRaDvzq#taw{)N1$oaK0nVKR= z)^ufE^=itD#^u8z8rywK;dw?ue*3?BNTOiMUC+la%p?!vnM{cm`U&oQugq2!>(A@= z2`}gP-$+%j`Qs>+LTAZ;>lzd8V0DtX%Rn&$uL^Ct9GDdedDS@aS(H{9Ds4(ckGOLVYB;|%8I2tx`|RZ12lf4|EX14;HzV-0Itzd zDb={qr)%^lXG$arjzBJI6i-FnvGA;5K4)nJ z`th5#QAqTfT7$YYk&@L#R!4uJGq{}}efYEnRL_~WO9e#>uq`Aw=DUsJcQ+i_iA4+x_@}K_%(9Mn$5#`77gU~K(%$I*(Mg0 z7WBqd>P)_+t=t1>W$XWjhMhz=8_n|rAb``O$!X``T;trq?kriGy2Gx++EEy$6W_Ka zc^$1QuD$W$8&9bk149*yI`gZC_Bn$mh*YRGw`82uQwd|3^$QxPbfZnVb2V1?Ee14& zcULpa|2%`$834}+jvi98_RrSw#^Ap$Woo$qQOyLU=2MHjx-Vu)0~sp`Rdu*RQ7LlD z{Sm@IvOYy#K(agX`bWrabhAR)8Elumpi5-cYYBe^xV%gnW?j^=Xg0%ktx)iX@5CSM5*;WCJjvG77FsxIG9`uo z6~XbW_McyMFOOH=TKiOTU3lu3K?*f5?Ci6u=6@25<@Ed1h&hnxbt`lg*>Ktr?Hy!B zHG4DAkH%hY3YJDKM)&^0Zi-QHlH@;}!Y4iI>467$+25~Dzn&-)HQ;GtbTx;8Fi zCT_twtWBV-IY*%UJ#507Ns@ttbSob$UGu+p@XcK{5cOuK=p;`{Db~&PLD75tPU?u~ z7`;xRJ%)vY!!y1G*?>xX27_{>wn9C?QE(;bk}0%0_1Do6xCkiKt2(6xtW77cRJ_Vb z8!JZ41SX!``A+EHJUdy~j)>tPbCu)FF}MObyT2!xJ1Dd$W*1_YVHLP*Tvw#81wPIa zr!&RruYBsroaeYtb0J9EXai_ElDK)oRaXZH;K9)nDp-E5k4R(^Ev<~ zB^~|^jB8AkxYs3(ghDGl%%J})b#Bh|`BaR&8ed@3tR3(4{gP?NH?4T)j zBhmJVqj!w2OM;w@c_wbE?nbd|YRyokk|qDxMpbEy-eH>A>Op(oq$amnsMkTeZUL?y z%0{(!oec2Vtd25I&`%{q61TJC5#FO}@p_6b6lp!E9f6~PlUz}vt%qc5?bEh=zSF>-3!H2v*;0GPeGH?(&d0Wqg}p+sdc9zn_r*6& z(j`N5`^7*jGti@|1cRSaYfP(h1G$dnPZB5Rj~?-=pcbwjTg;pumc$5`UPuprOCE(; zMg>F9CwY64p>#dp>6zUTh5Pf%$4zF{oJKJo+vuD*RciB*eb|Ivi=nc3=MM0+ zJtJRR0fpnaZTrbJ$$bcDL%?4cjr5?Ah{jt+g7alDTp6GAOT>I5w={Z@?G5hkh$Zu-cvsRZT<9nnq(q+xJV7xZhf?W zjhA1I>FzD;R?XJR+kMmTxMKf>5C5VJO7L8m0{KJY#tQbzd83WRv3c7QiO;J(TE2yv zJMCvocHp;|UVeBFpI>6R(YQEIJ9G_% z*76~n%+DR8<35*o2#){ahD7aL!NqezXbTC^_jwxDdW&#@#$P@kQXbYl4KAyV7%nT{ ztm5Qx%%nQYW@-81CNC(3hsaL3Ho+&gl*~G6Q$z^GsPU-=n+HplmAoY6tbR9ZDM9JJfZtBcB&WhL;WK9`eDa=k_6sKG)j_5v~kA!C)Ql7nDpWBBP0R zG@kXZ!JTVjo9i3)v5?fFm^-;@AT0R4`u+vT>DrFlolVlh&Fo&6O2@C-;21g2mgXH$ zgv_5_;k*_sFi&m`$#aNLhiyNNtkZ2;Ha<~nuQd3u+&h|5K1h=65p`>(A9ImsD?GZR5OK5v{>$G`R$1S)g2wY z4AWwU9${>E2EPR{7nVrs;T27AkGe?*!`2AUu*c?FStfmyex@3f-_rJ$-o-*GYgi|$ z5MrkSE$Y-5;M}f57x_wbSfnv07(D6pm|!TD8njKIMsj2IU|=ySoHo>Kdi3}fmDfc8~8900QuU@N|^I~Cns zV9^ZQmlb-)dwosH1K*ywBZLHBZ041HkG!>)8n(-KRu@7?Qq*^hw)E9WCFahWWO)5Y zDhjhYh=G;zg`E=D>M2qMLkwH}Dl2rIXU!;lH*`7>bw5Pv2E}XSyr*$ocrnnTk@a7X zCJrHCh+|#EKws9cbm3tbM$l$m6cm1HGoNPJzO%FSGzMQ)2#x| z{{c7;1xHs8qa)u-Ma|1aNa}iXUG40(5u<15d*vInA*@DQ{liaaptaz*J@zgAVhlwd z?VEEIF;R#Unx3#)8_~HX*-<2m|JKEI!!k=45w{nj~tNGuR@!fz{=3Ib;?Q!pi1fe#}u|3z*TGh%I|t@%uXd z|6rV)G!s0nUQNZaZ2PZ5i;<0jXj9x__;XLvv^Bw(ZOZ4a*<3l07ERv`h>qrX*{Tlg zhXhMw0o1rbK|nz&@T+d{f^^N6>c3Yj8>AuTd5Y?D@>*c=&Ngtmt4(Am#y!bPK>_8G zP*|}G!;sQ?vRG8HG6@phR45urXQtk7?uOV;p66tQKivdl?Frd}6wlh|?1Ob?(g4!V zpRY(*+}6{s__sG{lokVhj7gCh57fs-VwL3DR5(kMac*SzGsae&_nM5`%rZu%eY!_T z@^_d~l+Eb!cMDz{42HlnD`%MtqO~{!13%TADHHR5JKFST!SG z+*)8SK%{6*;yd49lTWE__G`nEmQ;^zuqM^V+oU)(17SJ1T3^?R`JcnM zHpz@j1YDWaz^^)v;M^z#Le>fLnh0mK|MjuvRzk6hmC05~8llg!5k#C+8~Qm*eM0`Gf}tgCdfV@i4DfvT|-vt<_{;q6i>?4bZp z3jWc z7s3~O%Om@J+I)&@%uzR~8H;-6F7l~;PeL59GC50s4(3GM3eITD|B}`jVd|DahDh8R zd0|&c%{7=IKkekWl1*6MY05)@|DJE!A|a`RhJ$kmhBW?RtBSc{=g3Lg1}#>2a2E_F zE`rD{hv4jR@4I*U>pVRkuRY!^^Kq9BBsnj-0V3{Xk|A+_s_L0m7IY3Y>tH>zmy77Q_dfL}S2f&&J5sJ;=v^xGb-0@{Pbw!m^ZqM4(fO<+xo zS>&mUmdJ(wgv}QXNldZHXINk^B0pN2j}lW z0t}^1T1;O+Z%P)k*$szI@C}E|l0B#*E)bm2tk&$|C&PvgG{}Vm577y9`Ciej_@`>V zsUiN_Ep}%>>$#lTs2Jt0<@%?{(42RxKO6OVL2pX2lP6_T4J#MRvfwQ%HYsZ1T`=NFZDB5)?HG6o=xn@~iUiY7{xH!SAkkL5$~M zr^p~MpI3DzRI6uJMJY8z$i9ZvDPuLlC&Cx>rU5~U zV9PJK$=M!0?|ejF6AaqI{JC;h{O6C_v?+0`!>M?qtBUTP5U%ID#SxD*6|;gG`@j|v z()xpDCYdK5^#m5=SIj=eP2BD?5q6HY$P@SqUH2bP7{ox>!4d}VbU?Wc(Vq@$e*+(n zI4M$ury=Fn=^M%^hUj^|=T+wvz*@H8NKzL>9LL}D(%3C}-pJofg=?=-Zd-gfixC5dzCA>eFlf3bw>T_xj}IjOL2N>>PQ76 z3*SlvQ74(oHn-0|bi^Nd4-A1(&YzMiP8}nZ1@e2Q=lQ^9j}Bimmc1GE9ZYw3=##G| zg7SISuq`kYK7Bql9Ie}e*ZjEi!PzhZ;Z6J`T7~-cG51PMpUSARe#cO1otcHU%h{-n zl!ev113EL$0p|_xhZW7G1M{lKfx#eHj`=q=5b`7J-u z{WUcLKFl_hYqk)_AE9+){2WrTj>XD~xg1F6CI(~VtMI=U=nppbz9zWD<=wl6q|=`7 zl@Ae;?6{Uvq-I~8jt@wo?wN&f)8jrt>4`9o6tqf!_iDNk&@7tNC`b5Ja0N!wV_o>y zG|FML9@Hp5zuRzspIE~a!=|>X<}}RC8TM6+%A22ZiW!Pg7$0??A-*=F_!QPje4cQu zXVyC-+cOBQeO}N-pZSa#3&rm=#AlBrhVD>JppvsFC{kGhec#>6#%q5BZ~QiA1i@T^ zl$}LF8~}f4oY1ArrB{@uc!3l@VW2L%Y-~EBzld}1ei8QRLBtSND9UlreDtI*FOuYu zX<`8{%$|s`%CRVJI;M2=)FE2YFqwgv&t4pzN^aq{!66UMk278|Ril{95k(*VM$S19 zlbj`kcTY8>D2~}LN(Cs=#mY^VKHCKvYccZL=(o+Tm_Q=}B0sp@jHhK)4%@(GJ*ttC z=yS5J^L66C!5~6tvXWBi0G2QPER_!u&1@T|*<@yNkx16D3k71gQ4@ds@qT=Jp=c#r z$$|4$8{FxYPb)MR++@bS#YD%)>2LNFAOIB_EH%|mV!OGiCMpBa&-HAY_ zq-)B zB-scaOv*RZJzQn4t|_O;26EU-M$&>yjWXt|pS_pxm0dfN5p5uOy$)yW!Enw@s@|(e zlT!nlczRo*Xt^VWqobq2KX+$B;9S_c0yPwT`&`47sSUfL%r;B2Uz{ghCN z8POIT7O}<=5Efp;33w#%Xc$;1`{h`2c`jKB`9uj^zXM*gJA3cXAY6L@) z1?2ulg~~00qp;8G4VMO@e%lG?NxJaJbN96qK}jh0ro}1x2Cpq1x~?akz1MhI_F+l5 zp1{`*B-7?m$t3@Y{{lpz2reWab0T+ux1jrHl!o1;)oXtuG8byN2&IwFQ_Vg_An&CN( zsO7(4X7wgoj~G6TB7;;ITdnR!&wv9&=p7*7I#8A=lapsl zEdq%unH+JlEJ!sx*mDd=8&cpU5+?QS8qWtHXR2k7RMI?~x5K#vV0X6sMs?aokbOmh zTytNSs#b6XV+C{U*L|bukVqx-57(j{sCk8%iOHzBoHmkzZJMM1hV;F{yLimQ#9 zM2rMt)l6K?stwBsncYp8f(XK+P?6B}yPJkBA1F4T@@JCM(3EmW@*qt6I&jWfJO@^7 zp#&I2#vEO{0LNquPVId0FWbOxQ53kWX4NWgiXASjtDN*W@lnlHgwoYGYmkHtE{yov z=CE^4!pS1{N!6%N*sP3&pom}PF2C->2&BN>;{7Z#kfk8y4;^kysk{9Gxp-Y+KRz>RCsei z*q2$m%9@Jf?P!=GIzk+w6V6${EWH0Vo~(W!b}@?x4mD0sHxBrK8M_*R_5*q3XeFrX5#24&yNbT2bzS8JVE(H#+Wc z?`V8;f7;{v4gio7)GjdLZAK?Joh9@oMI5RdV08zMDApeTlgnnzasP{i~W6JrY1qpiZ4E@qvmX9L6C^!ZkXs1s~VZE2I z@=r|kTRz*17Q{A|!e$3)d$t-t<(1&Na6u|zorrH5KAQgS~#z{T}V(Ng_< zcZWf%Zv9<1?u-<+E;z(??2FyHi>j2peY621%?b`>zMTwHc;c}&;@l`|_FOI3t(#s} zmHYbA%*bjk%3TwJ91@pR!woB?t;;v1wBE&E$pQQ9Gcf4hf5D z^Lk$9Tq0=)*J5jNN1Z$)T3_YdOJ^Vw^BaR4ml`HjNYT`Od+C7?(~}))L;u0WSwXTSG^Q}% z=Pp>OX7HqGThdI$pEK8CU}oQsi=iU#9Z|3Ebj+kj%YqtT(BM2hUGk%o2qP5$wp}?{ z0^KxcQ!5inDQLd$vRW9Cdx~jYHvkK?^duA&H;B{y#)>&}5cp=%{pTlP5P-6id^Ez~ zkl5LoL2rG>6@oX*)DpExZ3nHBHN7#sapS1Mm0zjxZdOw6MP)X=?$td1TYBL&;~s*0 zw>@EKE*j?~TydlnXCKEyV0VMQ zDsHgdWo>|#eoc3*=}8nHq~+bs{{J@1v$ORm;z;d-{AQ^I->tOBlHV3}9rT$n$7Ev8 zAsf1(s|lLELv{9jLjJc!k=DbeE$xa%lg!^UQ(z^Bib=%ko*o7hwQzJr+6&U_U+=JO zWP0Ivxu;(LgcnH2>$;exUFv;qpmz#RJm>W4{m=4Nm+FWcjbnFc~oawbH)Zdh@RGqi4S#Sch=MV$IOBGCi^ig z2KN2wwqj}~l?zLi@niOTP_SV-+i@@ff0{3RoeypN zrU89X^ec=i5QZVm6EVmp`V9Qc3pfn={XL~l@AmD~18O>Yfx+gEFFPqh1Jo*!Q9xc# zDf-R8iyskq&sMqwn{(DXTOEuLn<|8op0oUM%9FK5=CZ}6R>!^6Y0gl_7p8EAtF=JG z;W#N&X?Z*G9V_EXq8G2JDTSuFwh{TgsdK3!HCEaKlT;%bl1chGE!M)?)b}L$+D&a) zbirWZkYON}B!W8AG?s{kRcPejKV9-{7y=vU@m{5lI>9wVg0)z|k$n3yNWWFC!rXN0 zce}u?MJtlZ4(p}HvPv>spQSz0D<+B6@o;1@bJQ;zZiXc2gU+P4y&xmTgl{eH=Jx5F z-6FoP$AX3hta-__1`Q^X@vCMejZjO{elFtYw+)KkXh18;8r+3czFAL`5 zJ_C)yK0Ol7X1Gy&*$-^^N?zv2$Ly%duzKc#3r_MU+>weCKrBQWFYtauPHcPa+9L~v z^xC*VPGU;v#yt3?dCG8~_-Sjv48jJ&4F56gf8#(VVdxa&4okG6rnVmhUdzzR#G9!Z z!xLyK++Y3AEwj#@X^qB%Y89J1@HG2`bD9o72~V9h+BUQ;lCjga{Pxr+oTE}G)$Bpv zq!CcbmUy;>2CF=oPu3p%=bmBrt($`&|LR!4KtUmRk0=Uz7y2x*2-*_<3-4UkYXYpF zKhP94?Ut+ZE)t~q-*k4m8Iys@gM{52UQ&koLV7N($p~`nJ2TlII_WBl5=-ZE{N7q)>0w=Bia+)u ziia_BxmIOkY9^MpfULvP+M3^(0LfxH8qm)oQFU=Q>u&(7{n10}ZRt}3K(YcK7d|w^ zN#VGSwZNtqAF@&!q~gp*2_01PAz%tE+@G4T@|~C_sVLyIIk8XcZzjb|!{f8vmbitf zLB0=)n>&TP0Fzqa%b36|F=;OilS|B<%Xt`3I8?yAhD6d?83Ud=H8fvW+%qz4{c2bzesWYQGd|I0r?gN?MWTj|Mn^22|v9urSz_Z$?xGa5Jz|bUki>_`zH*p?Znwk zfLZPn2CLgpEl=~5-?*julL_glv;PitygU$d%EC-RRR?!q2^R5T%HoVrmO|9d!a*Q z)BB=Q^R@e8Z<0aOGx{H&Nwcw0Vz-2MN!gJCQS2n9oOOFZ{(Hem=rDB$oB{;={;Vb1 zURB(m%hFMMcJWHJ=d4PR6uB*zt+d>hLN$V4SWDb}pysgSbB?i=&;MiKnZ1ufcNlTm z@ol9?Lc4URU4qPk^;9Q9dntZ%CMBOw`e=I$l7NNh+JJm{{7BwKBvwR<>kQy}g0Kal%_f{*qG=C3wVGE1-zq;7r*vx??3|B z2cQ#4_unkHIA60kYRVpF%L(6%2ea&C^-n*J8eG2{R;73HPToWIRQn%WHeNYgo%T*p zGGTID955FafZ9B4q2YLIM%M#((2c2y+Y|j0i6FsdVfKLG{p#!N0HnJFV$Ja54R?D= z5X#K%gIj*$DY~_U=9vLzN%ireJyhh=G4?A8p}JhTAKJM7m4MyfmzcB|pNuUQHcodT zx88dsDM~kh4;i7W`K$r9dT)zJ-D%({i8RsX@|uENPj8;UY0?~>C@Pw<7q5(zj8W$R~JccjXWUkU&*E4OUWP#=>v0!`I z5)WzKNCn!yQGn&$PxGt4K8h%5+poUff<4nTg-T=gR{~mmpPC4I5KHgigxmoRhLzc( zP}|Ka!gL~mm(pVL-6ah((JK5Ey)*-%;pvmS0LF~GdDQl&<{(02lC*(jLj&~Vepo<7 z$@j6MofCY?QHq-n3KY0HMP##I24B{OD$ShR;N6|%*qu*qCU+^`_F}%g zgAJ_Wf!s(RrR(?1asTl->@{#of74{^3BM_f{ft1vY}dQd{mMdjs_iH83ADe|o+x8FJR#Eyk$9 zhxh~m0smAC6AEbk5Km#(%uLp4c39K)k2ZrlUL3$Jl&hl!09*Y*q62Z{v*Q}OhT|ep zKAU@f=}e&!cAJ7|Lh6LXtc=eWY5BHogKdnd^byre)pxBk7_uF;+Zp3xT6d95z{aiH zz!k3HVRT1D+)x(&?|XR5F})!O*jGL^Z36^)Sxzs#S-Xg%cmB#CpOF1i%Yc|E&~aNt zZH8L_T`Pf0nE?JMBnkFcEo@{%@=-T)3^>)n4di@lXFnM7+H0rd zk%N#%pqt_}+B49v-K+YS;u`sNLndQ9=kxybLkxk1Sh+!kORt#m<_*bPL}|e<>g-em zeVrO)UYQ$`@SiveSL>1d=s+lf8}Vdmd|Rv1vgBV%jJ%RpyTPO>-jBPV@|N3x8wc=9 zpUFRtAtSRagPs&$hb%DNJ&_byTb7K(Z=R-a&U&~e-G>{Ic9#OO*-RzPZa`E>jU0kF zrp{vWCnv%95((a@nwe)$t+dmJs(8#F_3|-XuB(6;E_hF%d*2M&X02EJ){WOhYpKIY zPEG{Zhq(WdfSzT8dG4G%Ru?8NHkZS_ne%dVZb{34&tHiy3o*nd2r!L|^1y&Tu-(dC zpUlFzEcvuGOBO8T_9CO)k-?S-K|3rEQ!ud4bpt;A`x%^GH)@un!P~3#?|XEPj=fbA z#RHq;qbi70oj`E5Jsc7Vb`a`6l{`sKqzcR;Ys>ZUy5d1t9?;rf9YV4cs7n3zc7eoC zd2w_r<1+1)m>klEWeG{>^HLJk27;d zQ^Yhoam^AFLU!IFqU0SjPfU^{Od4C@Sz-PMRXu?kP}dC3Gl|nPZclx0H2w3C1&?&g z>U3*sOkN~by+jBicK>oztENU&h;Ar`daZ|ui(xTtkW?F{&!oWrL^Wmq;3riQ~ilfoZ6yORO^ zHJn0Cz8l1g8#Son4JOHus?Qib?+2R2o)2&83H!9Xd4CCB>2~6@$Y|Brao5u$)%HsC zgI8fm318rGE;xV4+jw@sKYOEc6V^y(oUzGfJsLHswiW$*cS}#ygNudlFiq za_U#yA^?1b`xZ}^oQ9+Ji)IW3*mF*?{OQLl4 zj+MlD6qFSpPaPXnT>ndQ*;lrfN>ZL;JPz4kn(5JhyzNiRl@uQc!z_6BF;?oihMpDm zrZ?1{NI*Plck9$*!9-HFJDC>xiIkL!ZLn$4#u}15P0l|acLEVeJSCIi3nL?ZWNW;5 z7hr(;ayKVN=vc7L4Ll(;V6L)0mAxvgKUOt*|K_! zj?oR7L~xkaGlu)!GzW2FZuJH4zskz2L8}g?O0Cahg>yz!rUt>zj@R*WOMyo}Y|&Fz zahsNr6f$UKOZ(hagY{YZON}Y>oh+j5;EkE)Yo?OJ7@5&C#;DnE`;+rrSBogm6ZY{@ zIZYM*YvC)48G{?MqkE`=b2rnPrD_6OJ?y9a$+dOcfajb~Z^Jg4^b3N{72()0Th^u2 zL7>_Wz}=&&Yp`LdP_N}npg78lpqc4dReOf)^LA=hyh8re#CdeUx<|FgOX?HD-<>np z#fZ>}H5Yi7p&RJDIlgKpL!y~1Qr)#sP7GiK<_RTyy!%Pehd_jeg~k?>ny zyJEj4#3S&iF~NZ^?hZ--3)$@#W6+r}Djl#;>rL;4YK&;oqB~AxY41sgkm{PPY~tU$ ziK*|viecqCp=z48DY=r-uu2o;eqdkrCpy-qukVARs{>X;8QKje_EK^2ew(g(oP-_q9GLMwu= zPYaq}v(QWqT%KP7T@gSwE4Q{-p0*OJthScU$(HQa#Fy=ktgBl6Lfh_Wv+dZZ1*tHJ z?ztRFt;N3WR<`XX-$%3K-R$?)O!;ZIek}9_MGvTazZtxSY{QHQW?L<2$jr&+P|ttAezS z;j%Bf_=_e}dt8*XI75UjILlhCENq%0ToPQ2_{+HPw==)&-?34=>i!CL874c97GjXx zqajJ>Hebz}8UMxR17;Wh;ZfbQ?@X#G=*&}&v3_~}l}p5sdO->7Ac*0cuN&{lh~yU$ z0NKDiL+hzA$+i;10`7x;ljR_@^*(A~VkQ>qLGtkSD~FB>2lc*7JA6bL1(G!{#UjaTo!TL0O}2B%G5=1tLD&8^^DEl#a=$zWpD1SUDX=0uX&<*s|L zA7T;|Kor#b`Vc0-0t@B&!gLLn?EmKYp~KMM%<}@XGBrp0PQUHriNPcI-OW5urEeiq zc53c8oUs|Qg$n`2qUo4Jq z^u0K?a26RfO+Tlqw~{BzD4v>pFW?ffY;=?l;{R1HS1eVS+QFvpYAgnn?4;g6omOhp zQ_yp?eV@?a#6#D?#Dht@cE{Zc?$)6Xm}4#{|3v{aNOfiWWI-MhkgUPDI3;|5RUa<4 zjn@iG7^$CZ$^4^|OlO%AST>Qko!;w?=()F zR^E#}iNeEGeng~>V4gzNq)+y8B?$%u_D7CnQ8v(xNrWTQ3zhajcs+j|3O%9ffop#H zZa5E@XK|a2`U^|c2z`Y#mq+=bmUS_OM;r`-GaJ_(1o6eLqG5-4FFdzQ5{!OSOY#mZ zr6PsBTvBFQoe0-V-7`ByD6P`k*qJT!hmXN}a|eZ4M<`PFNOPifvl4|Bss@c?J_=!3 zU@J&LGss^4m)@m0#6zA^S+c)YqK8>s&>r*`><-yb;zig+C1yg|5=DstL)R$(cz-=3+?p|q%X zc>Cb*j8R)^lkFz3cUk&j-r6S1NEXuK)Fc2V>4B|6jH~vjmV+@SB&%Qcj3spcnryrA+VC5kMTLtJ6*^|LJ;=OsFm|!Ri)9@Sg zTB$R^14sEz18w4^beOPxvF+M+`lt4oaC{Rx2H4$CdV-MnXe3Zd|8AOKrLZ#n5>R(d^b4)puT&l1;6eU9NoZ(@MT?cMdGaanDJ(t4;eW*>t z!-YTvnq1*RSBOvfu9P5DNagt*j3LT?a{(`iyL4o$1fx0Jc_HW=a!msk)!Lr4a7)D- zndajSsymg0A$_rbdtj&9lf3Z(sgfPb9pOER0yHrZf6`K!Z%I4Hhm$L2*T+&LPxw&C zbV+nUl3jR{0BjwDDLk7$P zgXi${s)zt0!=o~q_DCz6wvAq#?sHQ+b@JppD!`?|R2!4;|0MwfisKrF8`mh$6mTvQ z@%9(aMn+)gklCg`C8Yp+Gg6xAs@}77@>^d10cXG!tm;3*6ikVTT#QK<4vuBIVM({k z+Fit4GjA8yRegp!q#y|-Ro)YNSD^KeAUW!6GE0MM7lB^u*6CKeS`TxWP;G0^(LC%|j7~n{8V2^TsCLY296rk!oC(H)Wuz;8eOZVjH`2?m)|YW3=%HXh_Z?wxAD@5@ej@e7 zdJ`P$0t8t7c6Q4Rz) zMdf4rLVf{v#3Ad&?Uwk?DII|1WvSM69|cEnmF&S8>?fHZ9V}cExru=32WLD6j| zf9h-`VFFZD$7kalHegD9K zxAmK%?zJm$@j1KT)gwwNC@oj$efJk$M?Rx0;UND$D*D8S&GBQ>3gP2U6@8k+IOFjo1SfXM09@0QhF&o|yc3oVM!KoDLF>3apYNbNj(f z_K>v|=qfM(k4)qxIdW5|sI48P$dPhG(XDReI{Op81t*9NdnW71E$d(*ht9U>RMPwn zd`U6$(Id^KuTh2UfsrBbGnRv(k~H(cTgoMhYVNvn#^4oBE=(Y`5qGcVz+h&)``cLM zh@>@-kBvjI#$3QDsgK-3Y>t|(V+Yl=zwYDWQnNI>_;yGCC{6ovOc)HP=2omk-ec{L zPF{xdp`5=5Znfhwok(nZT)JVQiFE42Aq9@Aew5uSD{5c)s!N+&y46)xP|Xu@EV7O+ zS2bLEWWbIsN?7LeM2KCk)lOuRu49PdpYyqOh_WoX7Tq5 zYW?Eot_$W+GvU|Kb`3rQ#8K)TQJCTYq!2Z`D%lA~JmIM;0y?but0y_cS565 z{en-P&;R`P_Atr;;6CD_KLME5>bdgo*Q`VlWhMM*5ku`nwz~2VMv?KChCnP{by|g0+^Khm`33K1SFh+e{8#PBB@OX#?1#Zv8m0 zINTyskzH#sl1`YicLj&J=C-1h7}{aY^O;-~6H=DKuKI$z#C{(zxbDO9B2{Y1oF<+A zHDK7#&@MhV@nnW#8g>_bGL3ZPb7erY5rUCPH9CnA&-3rbdSz7`fGg|Wl_c3^K05Khbh{(s5$nFsoHi?$j8jV4 zABc&c7KcGcItuZj?m}wtTsKS{t%GF1LBp|F1tmUFk|YEn7J#ah&FvYcPhU_YS0yaj z*jiB+T@O1#ekRWgk3ng?wYIkJzOBkuBXD0M}8>YF2E#zWmSHXIMaO&WkVcEoB3zH@&?yNDtkyxi&LZbJycL#?%jLn~v zT3a(aJWFITtshaRKjp(dgp@+Mgygf5PJKy3D4PV`uI~@>+-ln+21xv4Mx*W75uoq! ztt^Zra&HRoV_8by4q|6J_@|5ZIGCHb8G=Qzw51BmERlLm{QB%~7^AZZ*F2JfTL9DQ zsJ&rC4T2up?qYP;QX>oRMf0K6C7Qw(F_utcNitm=mw4I;-9@!bUTu|bT1W!DbcaBL zK{4ulf^ z1om3?D%?;q+)2PW)-O;Dmxo%V8c@_CV_HQ{j5l{BHZP(WFkTLLiF63Z$PG4X zJ;B+W#3J9XX7KYtCly?spQ2{9_N-!YfZA)UH7+(-6nbmEi+P%inMYx(Ky@Q8yk@#1 z1TFSjvn{=1!X?ucMk5%*X&?1uahFny8|BzLz6)oLtUOfxiwF8bvj4zzBa*kudcliO zD~GO7CLBJX`3ur)EM9brfv!ZmS5c;|2jV}n2|BPi+*2{mo5aeq3-Nu zyfao>y%c3_7?KZ-uww)HVj6BZt2cog?k>y5>;!gmGv>H!qDoZ~#Sh?AVE~aE{)0|q ziq%8~JG~=iB{i$-N~T$k^rD`{klwmO5;`<|CqO@XJ{O*}%Hm;g1E5xS4_bax@av4C zV_4I}@@?Wm$UvG8arW&Va4DRV?E8eu&^keGZ+rElzog=+L)yY;xH^*dW*CGy7f(J< zsAJ83vjRggzTA!kkh}o^&CTjzecm}c6oP|?YrBt32B!e(jz7<%VPH%6UpFBA#LBOgRm-ytqd5V)ajAC6 zCcF>en?8$0RNmR(-0pZ@#7_Ilpt8)OJV}V%Af#@oqwL0Nz%Sd+Wpp-8@Gznm(DTnh z1T8^c#*S^w5+sqaGZra%0kDCPeahpe4LUE?>aBAI`&KPQf?pTJi%#HGjo4+1Q#tnW zuj4ICvR<%qThbhU8<)QPgMA}Er( zGdx|X_kOOf!vY5r5tW?lL$$x3y#0;xmtL5gI zXpp?!mCD?aKnEy(xil{#Rw~_g7?1j=18cx57QBb);zODcN!jj9iLDAe3Najt=h5$A zc}*mu{wsA-JRw6;W+E_S!xNpP*5ro)cZMGIchIs{!=ozrSMW~9*>Db<$yP03n+sb# zup%MnZ2!E4LJLqOq&ZM`7taFa+kqXG&6;~$1f*&LWQ=5cFS=mrGwf5EkD2~qAE=54 zJ=V^fT{kzg>aI`Q? z7bqL5M8>o6w^HF@H$4B5lF`@) zN}yr(Du49V45@neNh9;iw%qe>?q*!UDMxGkZ3eZL1ZVftaaypm#IGfqSc%%^Ja1xm zXlIKksasri7+<`(22%)abySCgBb7S@yN^XOvRo_!aNxOXjpnDKidAxEBr#t`tGoP- zN~?lU(m26q+Ren)Ew=9tA;Cg0dKnz;-|v7%P~Q~wt&0CF%3;A}!}Al8r2LWIWHX|+q-Y06&~iLP$+ z&nErWYVaMYUl%J=F0vwvtl=B8gaiqL+glyy`!$O-G@4l@H{iFxv^Z$9d!QXE%k@J) zYJ=}ux3-o|Z#u81309u|FI^n?GK!_gKd&zNPjQz@UH2x{!|6YyRbdHEMbcU~nZ~)G zTWfHL&V}2B2MU-flp`@6%+uXsjF03NQQ4;gFtMwJyvBB2NBLx#_0nrC2;p_21X4>f zH9ub=_lb+>m%0vBVwP)ix5*3RVOZBl zG}pu<_7snngn(Y^6q?aw+Z)@VWX7D5pj|qa<^sdpSA#bLg%UZvIj@dRw?bZtj~v?! za;~|CM>_?+aJ|xR^@UJXWbH%l4W-_Kel&zDm2lo$Egjr34>N%Io|JN5e$Vk`GXi6Z zR!g!T8rj#@>A1Jn7~mBFBwQR=5IcvLa8aht5C-(tE3+~h@s3Y_`2{7MOK{iv4RSSX zEz(2^kK6phv#AyHKmG7wPZ%&EFgkjM85iX4Y`X0)cu|a}o|#$}inSkFxn~e8bcl@% zRVF0zMlMs?EL)mTyPL+10Yq8;A*Q1|Ojx%ovf=E6xN@AuRD}o;FK=+8Co1 zD0KbOsy1^|XgFF{?XkAY9$2cgA;vgWHOrjKhQ^}@J&RW7$pZ4HCdQSbnkchU3sPa2 zr%R##e(5T=PYk1+L=dmsO!StGC7(YafekZpwA}uYLNDRBNiw&@Es}t`oLOB=n?Fm- zK|S4t+|o7Aa5ByDGc-+apm+SPl;G;$r$u#PjY=h`dG@i_#?oTXMXQ$&zBP?x{sb&YEE=dYTTwZ~(*xu42 zDDkli3!p_C*pKa6L9FLcpPZyo@duDcYY$t^&u-niDaFikw05LB!ExL>FX+QZ-~!(o z6@mZNwR8j&7%?rfT9w4ZT2hkcsa)1XzB2N8C27mrSts=$JRcEv2ooitu@y##cNyQq zNZ@pf^2<$~=%UnQv~o@H*ox17&92hG_ag?oJFH2rVHtLI zTv`2p*726E=(y!2HJat5MRA6cp?uX--lASo+>GEQ1o#rpXUCL3@ry%%d|2xZHX=D> z#cAI^k3FVsSXe?5HFZ6oVp=n#+}sm1wH5_wcuxTDJmjxKD@{f&A7%Xylr4-?^0Du$ zFbJf85t1<~gc1x7pnd4(dTA%jZ?tK{GjEKag>nfS=MrbK*yfa7q0IG23fcRC#!j^8b>}?#(XOlfus--+m-3uiVML?2+;|$si1VtDAFo5 z+24N**rWU{+M;{Zlp@c;m&QX^8XiahwsXPOHc{JXVup&mdLyJOcMjXL3Sm9n?BWLU ztBpP<1gjP2r)Wt$u4^=GK3yu+7-#fK;R|My|3o>hi32yKrljR;Z=)W~ESSx4w;=^g zM|IYQetGd33zA<7SsIA$ZrAIP8dV`yYWv%XvG2EMMOG4A`0tOHB<%x5w}w96cpAFU zpdt|iEZ)R8n3Eu}WyMmTtIbVeT<|pdKh{;rm9tJ;YO!g`4X+n)_N;ZN7=4xP7Cs9X3W~39VxhjG+Q4(2_wc zd^A}RIz>9(OhxR8j?7Q%i){BL7+hg>^1`M5xHh=@nWk6_p<13!PqT2AY-<1YB zTqOCdY2ldc%pWmHR8HY|m8D@X3Lc>i*tHY1zm|E3D)jcsrodUA;ZV$Nb8Z<0m4^fm zb@&u9{Y_y2Z_ck2oE$$a81SM5H%Kw7R`n3MI%t{B(5{DPjBy|Fz_@YRJ&|i|3N^rW zGSD@4kA4NmOlPFab{}p{TwXp(>kBHnaAk`d3tBy-Hh9|E5qdP(Rn2UY`cs4a5u*f~ z2D5}>tnjGAI01;PAz@QW@p~wT0GWcut2Z0H8ot1Qo!wktyzYX)f;YQVd2}>4=E9`A zVa;_$+1g!R`BYO^PrBll+c;y|fk$NKb2WhY_0-p6UDU^8%I5r`iP)Kz_kxivQs~us z*y57dAOKprKmeS?PH8V4OwzKEmSi6wX`ko~QPDE;soG&VPzRCyBg5N>zS{UGTl4I) z{B&(y#7SNmzsjLdaDCE4!WlS#dbxnCWnMT^sCaMN9YPMMh zQEbRZ;1v6X?0tTXGQ8<=F(z0J+xs!sI*Cums^#Dpn`zJaLlqj-o71BB8D1-^5^(&Qo(Kh7~9fE-D&d1Y79FP{}N|_FIXC^mt?`slOwJv zL+c$LA0pC_WPZMKos3ltJtgP@Ux{y`H<~q#Adu}2EJ_d0MotcYiZqR0|HS{EVQzT1 z`S`klcwLH!!4TO|_x(QM<`v<5a-q_06=vDX%`_`OxW=m?L!?o#FKyGC|&==2_b#;}9Z@aZg*Q`zpfHTdD0 z1nVkjQ@E(_8P=x!%5O+3?DNay9J%V}NZ81FP}B$0CH!CTR3ypd4=cz2^P6@Pm@<#S zo!7bsg_GK2jus!CM^Lbl2?DxI9No>SLqJ2MI}n5bCed1Nfy$ZIu@xhB%@e*vnDk|W zF;0*nO3^ZE54$T={2$K~fG#TGfH!nQ7Dnc8v;=L5**X9R!vE0&zk|W^1!Z5D1qQo9 zXQV#PaDoS4@G5?b^*VLA-T8&bZYbWE3RY-mk`zpRX^r7 zM!|j^ZefI>LRqzau%0~)<<$j4EGch7_;4paf}MQ3o`hQR$Ay4!4_HK&B9d+&+*o|w zMh$RSY-;gTDBJcMu@cB!pgTp)XlInr4J6GiN`YCH@u^}uZoQ})YIBTGC7{^j9NtXV znZuB*rFt*I+C}VZ@Xnbg!>&+&#-;2bd%{ET+8d_bs3{TbmB9BN0jlq))AE3%MnBV za>GxA$W0P}Pi>HAQyw>x5V+e66^mcZfq|xC0R4=2!Sf!PWcB;BqeM1OO9;NLCNXIb zEm&^R+ii(3kl=9F|Cm0X`nk06^jRCn0N=UVJ{4N#!i9T6@F|ixhf`CqN~x59hKQ`| zvJQZOa0-GMj~4xdvCHNoORm)up1*KjA#fc)u+~rHP!ZJ!8W|MRDtoD%%`(&0hCb=N zb*l#w_A)erO&{iiWPmsKIw+qX=e`Rdkqinj+JkUB)#qlyc?k*AZ84(sbpH!21$}pp z+I-l~ZJAZ*=HU!jBoa5wtx5N9sSTh>S#2`hP~0Y!D%=L;Q1|ec$RyG3r%({1O5A-x!dYLB4ZsHU6S`%=cjy%80DUcn^ViTXJ`g>JNX%PUq#4X!?%xwPgoYzbvN6JtZacwO9WE zfaE(#>pQzjVz-Iv46OFg#LgZx9?d9_cRZn$Bs3-(nT z-QnYUUNqVc`N&XmJ}O2GU7m1Ge3%I!DzYcU&C~xFYEKf(oQePh z8|Qbsx+m~%=c`b}QI-GkCpDcYmEn2b9!+T2KPF}Gvn{4r2_Vv;;LA84eTa)#utzxr zw}9&31RS7ZsC#(U{L5jqM>Wf-#VC`RHm{ z>%LRlgD;S=a%G5n0ijFQiEf_l`bkXYI+Mz%;tp@=d)2K+mBRNgm43=N3_r_2|Iy9XGwutJHg&T-su_lYbPo*WA#-cu zHyBRN47_-S8c>wB#@E$H$r6$0u=yyh)~B~;j9=(Fxu4Qu-NX7|k3o;0o;iNqI`H%p zeuIeBfT&xg)7=V6crG8a<-wDV$5hM?>0*E-o!WMOf5cS>_=rK!iCm-;rdWEUS4?khrY4V&UioG06 zrxRdLP$WT9ym_173hz`Ju<6n^0kX&k6R&+8zB4nhp*rFqZP&mD`qdY9Ahs&$i$kK zC8luzov@Q(hG*ON4Jo*hD3AjX0(ys&tZu3%)eZLtj~zSaFR7{ITuAK+i>nSM{%v!G zq2F3K6sWt~6N)P-20VY=;d64B!XX1p!2O|rXov&uELbq#PWnXYtLU;x=ZfVv9ip$p zdkUir{-DVqwQYso^I8Y6SL8Br?tK2w@YPAj+LDh;m25~v5iAMFtcI?VtQ8%pM>R;& zdVu2WDj96NnQv)tMj>fKAO=oDJ>pUz575G>5>d-Trrv7l6Qe^~;^tB>#9%d`=W|e1 z4Q4bQkeW>esqiz*R<@$r{M&xqrGg2+qUBs2I<=n<+LH2+)#D4z0LCln#jg*p>k;01 zXQd6wSEk`6@HQe}C;}Jvm6On|CmB5D7Jgn7X@RUi&T4}uQ+4h&bh|AXS=-2BaHBd- zqt*TX5MU%YP>yV@L^zrC`r-9dEx46+?yg9X5u|~(4Gjoef1PuDIJJR8o=6lb6t{ax zf|l$w&aS)#Ov*tYlqIw9a!DrU1ft?+V$hG&HkpJd~WT-!&281Oa z_@JLQ#O;hgxLaa8+%J0h43U)JCwB+MdHLQG3LitKe>(_$GO!|eYG(p3;s;qwm&sjQ zKFt}k{QD%oEkd&`s<}ewrCx{6JXIP~XbGzpg`vM5^el56@$l)rH)DZo5fxn*@Po9A6Y+DFw{g~MMHmz#!^q@j%5kQ6*c?cGJ-$@dR^a@66R8?2#8 z6fuf?ES(suBG62Sz$NGHA(_zg*8LpdiUm=OBCxUti0K`CqqIc0NAYW!`z=VPwu}#h z^1dlR)~f|I0CkIKsrkWTREGFaTnwDR0ZWE({R2dZ5h-N2p(*2c_zT;Pgz0&!vx{M=&6r46iEi;=3RXjq3Z zp4NT;+)!lvU2)N^=BiJvS*HBI@kX7Lw{K2>ZmUW{Yd{h1P<5n{cUa>$;p zBoVYU=e8x^hd#2(Q}4Y|X2~AWkr(Xm;$F|vxu~R-mx74P!OvSZ2Ca8p&}~mR_1jIv!Jy$F~SqpS$i-Hg3Dz$F=tWNa+My;)`aV5J)m)dOaV5qA|h#v!9Jb#IhS`x5ou})DKuwTK0Z*S>jLeSE23R~-5 z5IRK(5(yx8xZM1=5-7a`5}U5?O*aK3Sv0f~)5S?0oy$Y z`OIx$hgU2SQvx2pZbd+?&7piy9u`Hg!l1G0V!RQw+|BeOJi5@hU-NUK z5>LMG>su??AP5w;y-TMJdZxbm9pzVZzC<`8q_jcsz1$x|b@1r*aCJZa?X}=Re6)ql zTmPckm}mY5B3ZXh1rON3)K#jc8dG6Kf9~}D*n@|&?goV}1dAV9QA{nOhtHL3WO1=d zA;%n6czC2I-T3Nm;B)CXUGvNh2nmVeg(_?RuG&Xjk8i%kdwHOClYqCI`s|1)573O! zWpl9T?QOzPNU!S2_eYEV>xHM(!pSt2$zkm$(|43JfWvwb2T?%ELw_)$bnE!%AUk19 z(Ymq5k5p2GnP}&fN9;;XIXGa*6n3^{m*HcTumrD;IJxv04x{9;CZMMJ8e(EEjJh#KD)q8J6*`>1Bde|TX0yrNKIvRPK>jpWO=l7= z^Y(AFi)9vy1Uv!h8oS_$RP4IJH!Pg*lSID|g#;^z3coEB_vc-GUX|((I3zzEmx}kx zi#PYwR9$QZkAiFb52vTi!B**Xye7>sd_<9fsdTylr{Ps~2nx5Ic3g(ZHx#Jazxl$u z$~h58EmpyFY})KT14tt|f1++ou^P8A(3v;>#VsAfk;n`7gCd?id#BHu(DM(mcFT+C zPtrwDlKOIeK=hv)(cZ*0ydK#mL)KS6Gd`UutWgGSZ2+ zMb}PY zLTR=?c2n6d?u;D5clmJ$yTSQ+1+u9T5OpP`%*uVY=4N0KiWrv#ZkozE* z^MS$ED@j#J7L*C%LA7UZI@y^8EN(4(sK(yznn&`0l0g)&X;*SS0eDR}fP%kgGW8t{ zWTk3VQhQwA;Y|3kQzqQPH#^U=?j~s?>w*oS<7tE~c#o43gcwRTyZ>wmVkQKjn-M-w zti4OmGqsU2VX#mW+4Zf z?cY^^7=t8h8B6Vq;V0TWz|M9)F^2co+jn~eSlHn%a9@R!&&S-XGt&dR1(4w?8gc^h zWa{H6`|w}P9}6?}>qM~CHsDhQvUZ^8B@;~_#WX}Ue7WdVHfqZd%BF{Kj3Dz<{~~HD z!;Y2G>}Tok2Um5e`*(p9BU1(GB^pTj4)H1BeHODwbu5<{obPx-;kD8krS?`lABRKM zOb;=XFeAl6Hqwf)qDD0$Pf1AtKUxQpAK1XQH!hFS^^2YF?;#!-Vp@2Gh6PE3B08+1 z?Mmjnx%1ac$DgqcZgv2YV$h_!mf_5m_nJ0{H3{YQX3V$?S<Iq39saiB4$yJXU?|QdtNlmvd)}({}~Hx zrZT~=BhapK4(`FO)rU1s+UdB8@M*X+sbI(6`iY76L-;Sj8WNvVarfm~JXZ(8c0HQz zrN_G*r&S!v5S#1>RH@%9yupXLJ$7(XAjkKuja=ul_|?F@bS_U^%-6fQP1S%tieVkLwQYFRT0U~w;yZ*ajhLu}!t=fQ z=Bus@8rVqquS4^32)wcT)lP*yb~SHf{S$P=MvKUAWB6sR4pd949hYc&@g zIq@{ObPedNTJnA-^m;+p>`WkF4owCFsR? z!3?c&n#C(MfW>|0Iwh-!UQ56d>h?7Hs!P30(gP=2*mjUxh{q5KdCO zgNp?pyFV#xeb`r~>cM8>SB7m24sm-HCvwYg>It-JfhLvPK*=6!+WZ)% znfw#dB6?|Xkc<|#6Wa2YdB=f^XeV*%^a)@~T10Cld4+>p4@xfoOM! z@9Sz916PUb^Aq5x5c_sRSpK3irQi6PC}uQ_u)0R6MlaFGhTVu-+l6{1;YAygw)Z21 zk|!ro?vxRYb6dyM{7~gcmmKaRwrr^i58q<$wb}g$ZYJsfK7pde5tY{DAspFk-EP?> zvh!bvb~Ae9n08h-&3ms*kMUWk zkQ3Pk;Q}(TaFWsvWyfvdfddrXlsqCgqZ>5U88G{-|90?z58J<4P|0ttPJJ3Y$3`kEkoH2+xBHGqQwRbo;@-P28Kd_FtXW_Dsk9Y z9aP>OVU=K%#Mh`A+>%N(F3U!OLU@pTpMY1`A9UerzsA#n*1!b}xu@6>5MXRpolbzI zSNpq%Ee}Zq>h3%_IGQa&$lq^MYts0H|Hl#78H+St9xl|-xW~yfKiv^}i7X|yvg$sJ znUy-Y7RNmm*VIw9JzD%bqGP@ki4rceVH~jSOzDeO4G6W(B-vU^>6<6Nfp0AYLpLxB z;53f)K@Z+Qc|#*QDo$T}|0vAOlIXPyihqVK{Ei!0a!~%-qi~!4tZeXgxGwIqbcP@l zZs{S7(MHySgf4gO)v8X$F|;+jP8ChB9KCVC=w`xd;iByg7qmF?)hc^R`bY=t=vX14 zcW2n=#IO|Vl@e484$5pwF~tAMLn z%eN>~4;d8~h)Iq_GRJ(Eh|4k@^2wG-<%+fzuy_XCS0<$sXGWGZ{6>|Z%g_7(Hkmhv zTQ*~2&tBYC)Z^3-A~96F0oFY%FONyyqYyvyiKV>E`t%E;Lp+GJt(a2(=NestgMXY} zKxr!LP!A{(oZGDky?Kxep$Y27`GG}1K3jEyCijo5G5p>b+gOt--#>rb*poFy>|XsE zZn_Y7oz|az^b|LDu(jg^s0>fLD5906!pdQtVEtlA+M1p6fH^2GFy4m!Vn!Fb*W-ZmqCcNE-aexUa-?IVls5v7j!7r|zQqQ#-IOVdPdF9tY|FKmr*=iluck#RvP%T{ak=GHe+oM%dJd*R7l(gEwWYT5 zHFwOpf+HEWZrlV_nH>haAgS!JgLFsf?ipI-8*rDD0>CDEZg>Rp$9k-XBg{CRH`&3R zMlEZvW+FUsub-cFd2PkfOIa{o%kFKOh-+tP=f7+c@aJu<ytSV{N;eVSNcDQ*IFAlA;I^)R-BK+x%9cJt0z3b;{EL z8UtUhci8=Yi7)MJojfdiNUiY}7y(2~(JHWgt|Gj|aaMObnGeg3-_wD8(&=(ggL%qglqPw{bj%#h*M_ht&AjQ!s)iVS2ENeU$KC@47Jx!^%dcZxC)+ugxg0U*X16u%))@JqAb@`4 zYNM$2hq>#RCf)Tn2wk}gYl|Y-7s4=E79sK6rbDoJAO4I%H6yNlF55VTy{D#M9I}a$ z-TX{~wh-MIZ3f?WjA~o1Ub&~2^GRAlTs3e^UGd=c?pxr=!C=1Tn4bf?e+_fQ8e>ka zHR+Nxn{$&#C`}Ukqx#&>`bF_m1Zt$` zD+%$)U8r2uXR}dGn!cVWxua=+!7491<2{qQW=C%V4@)RWmg|s(6o15kU`f8O#E9og z68^X0v)RR4DYOhy2w6=;h%#!E6mj2N$}t}Fu?!!1KCgq%bNFVNP z@B^8Gq^Z0u9UZuoa$5Ce?=Hmu>5=(wJME#E*Z_)G0Ss$6#)68VQphHc_4NoztJE|S z42qDaMVOu%Fatmkdgp$?-$goPR9cIyb0<7{5s}Utu}B=G^LFPq-LBXPIy&Mkx2 z&o{%UvtjN^zTyT8UYf9gEeO{hQ~dcl_I%i52(-q45&Wsattm+w;(uBW~!*BvnW zY5#6D9OxI05S0|_ffK~ebDu^6Ytm$1=m1%R+2)ARwD%2%0S6S+#B zY~3Gt#OVRCV|gBSBvUNXeoYZEqe>&6S{UD9!kCT4Da?7|2x@GQ9s+W|=NKYXuK4s0 z)UP@F8zPM5|F{&kUJA)FW4TisB!;@&bKMTNnkjX6I+-fpFO=P{_kL1dlQb&xME%;x z_~(t+k{Q&6w6}fqBnPD-Xb}N&ROekudtN`S@D=n4gE!Sy@g{Fji6m$zkl5Th5f5@- zGD*&-$w)TJNmtG0UTk~KFk7bOs)PuBphuh9RKc>>9B$eL^eX3 z`9MqYS`{JHxsL@beC{g~p4F#9;v;k18wWJxK+=J&;!H;B_=B%w zxfxtygmnkPpl}A17z1AW-HwE|G|K}BZfF0M`nM3t<>Hhq?Z3%o;?K4u5O6>LlJKC9 z2wm?)`d0;WY9&s6*Qd9FPiWCu6F)$YoxY4-;Ww2e?%qWhyzL#+?=$VcD{cf#RtG^p zkQ|~6uAbXf6-oAdKg1?1GFGLbRvRpqZ--~?2tQI!1I@-0^#Sh=0Up+%D5MvoS#hy8 zrFS*6e%`6fExObqbzasl`mFKW9Fg*?QcS%A_`A?TccDb~tEByXDO^|(YCh%gYun<(g^6AV7?-_N*GP2K@x{jbV# zEK_w_U(psbpf(;fOSVlxa#Ta^_qET^sAO4g9E7x$&<8?IPpw_4wOoU_+u7y3AV;UI zv(5z7x0_qun^I_uI%|pUWr#U)r3Ed{?TY14xCB+CA_Lb5ZOonD%wm!MYU7aEk*@r+ zjiTGggNzmK{>(0(qW5x*)UI0a;!_FELPn?q?H$Fc|LZMeP2`NezFjY{@ z9C^O_rZ|eTdpxW4YHEs!6_oi|kdL-OCVv# zARsX|WiU8QD*oQY%7PT=_{Zof=cj?pOnL(8YLk~uIVn7qK`BJUlT-mW!1>;)D<{(Q z;kpm4ZS#4hSQw+K-GqukTIsj7d;=w5fH~^OCBLf4_OoAFypJzm?4CH=PuZTW?5t^s zO`tKT-|{bY#5XL_(#HUBk!las_T{aOg;ItdFH5H6eo=*G4nYzk8d1=c-ZQ0jn!;}v zZ;wm6mbvokuftcJ_GlzY{I9SRn1ZF2rdFoiy^YqO9Wcd<-hP*}Obr?guhaqhV3X$m z83Bbe1FI2*=c~iPs@oQ_hyx{0%7CJ}kmcoFx%k2L27=H;sPV&9dKhIx=dHflBPJCe z??0B_DNfyOlEp~fnLKC}u!TN3{N_gC39<-6i_N_k=BR-adBdxmhhgJ9q42`VjBKnQ z@_9dwh7<`EanL`wfRXzs+1)G}kKX3EZZ)JW6qMD+InURRF;0!q_}l}Txm(c;=a8Uo zpP+ALOvqSGRj|k{$)p;&Y=xKO5JV*wjl~o$emhUEja1J^4%>XFs6gzII7j!n_SSdV z*huO#Mpy5_$I}f?i%qr7J;hrs9IFXvInCu#TBs)-wly?(L*{xNSI?X{O(WYLBc;xF zswYkpC#m@8%EN17ii16w0Up)t`Wc%9Lq=k0>jz_+VnU12W{Cx4=>FaT#X=BbuIf|o zwW!lQfE)}%X_BC*==C{l=rKW+{y`S37n=tku?U|WYBOdA%cIsK3I+&Z#2lXtcH@!~ z%dJ9=EZUxU3_e1@eFBH-Y(U@yh_@lh@>&Stw=y{s%u(1d(azxaCX3RSDFF$Pz50Ak zrxaVoBgf%gNg13+^_KTSfx(J&f#E5B@OuU&_|8_$X5>zyDq{FyZwdFMBwmT?)1y+0 zN+_GMt|RrfV9S&!%?W_nf4A1?hTaobF3;H`&f;~)7W7qe^2TqrMZUkI2Id}C&h26qC#iK9pKzG|%OUjGi+P<`c~m-I@NJ< zFe&eRjIRY|2SA}DkHH+o4&IP`drl-_y7G7-Uy_d9Qh|GFDCA3B-wf!GM0e2&(AU;3 z&7l`6PO{1#cgGn^q>qI}zB60HEmVgIE~#c%PcbxZLXu1gImc1A*#XC3uu-^9MBDsK zpP&=Wt~)l^)<~o$d>*)m`z{mYl$ST(OlAeR(V)YFr)4DGr@&YIY@H8_zgV|oqc-qb z>Y6@cWfA#5#NHXY8C<}=z7jl}LfD0U8Oy*8(f=ke3}QqznXOr0HZIKqH=g!0e~dUJ z&{0*RhSX6e^#pkoIjE4XZjEBCIC94y^yQevCA|RFw@6ugzeUeZ9crJY!;Ww!HieNK z<7_S9x^tiZ)9ng}iej3(v57RrUJTUWx9P01$h1xac?!SXS1L4Lv$1IfUglCg7z$cJ zyt}QEPJ3Z=H0cGo&n>#?doiGO;Dxt>=Yol-zhjA9*2`L7P+NGg-FVW+&6}cBSs!c# z8esw@gPI1-!?^l#Y*}qUB;-C$7;zWbxx-Uh#UA9E{g(8%+FTkDl}}D&{GOqSB*kI& z$VIB);P8dQK}nRKPkP>r+GMkp08qA6C#DON@EMZN$liJ>(?b!u>P z#{UbaSkOw79RHud@%Z0ds{EtXMa)0FZu#$z3t@Htgd!t3WfkIVPOv{cKUMI#WA89o zD07h4y!YVWRv#tb@jWfHB-mnWg0d_^j+BuTxsdB&iq!p9Sy)?2n;nJb_}c*3WF}$y zP&#RcPzC?IFY;o48`LYEb%&s7Ecf@+VCc+y+Hj^O2BOHo~UwM@eB>X_23$&9ky&9Hb!mMm7aytYmj{HSyara4ka&2q!} zO41VXe9wYpC&xJZ4xHZ-IShu2+u)TL9pxzY_$-{iUCZtyR>y2=tv<%IPpiC8PMFZS zSU>c3$9R<8DB5i=h(ceT21`NL^-X!Bcft^DWc_u!r`Dq3^b7K+rQeW8GtR%8=*mN% zJSyJ{h4S|Nllu^}F5#hjkXpjD9I&jlrq^o=DK;}C#n#wxWQx8m6Y|BxFkSv2RyLFL zXEfK65m?nYB$1~`Xz$G1fy$+`hh4!#;<|6R-yVPKLVd5+Ci*$9){srfOH$!DWOgx_ zHM%ev^CN^U$MKJkD{KVx-y80bmf!ayz;Go#wFJRRHU`LXF8@n5kl6VDo6^sf4%hx77bd>Qjf02&WqEmCe(M9wO_$lk-s zs#k0h2WZ$Wpa53CeJJaBopS)2b>CU4J+DlbMGy(V?^&`XS4Yn1}W?>(JJqZ*yX+;A@ zr2bXs$O>y@0aw6MkZwDTdSmCKsRCqhZQ&lq?~I;aj~GC3C6}N)C)`D5FWVI@IW-{B zzE*>>Yg&4{)d3Oy*}w}RImZ-lb^6?M!5vW6x-yfsI}=Rk#Mv18RM0~k@A>xMatk56 zzO(JU4Rg$C^1xq7BryG`86tz^sOsKoDPl6~QRS`mo-I<2oNe*J)VSycFVd@BsYiSI z9!c$7SgIu}jdS6ML$z%U)xdPe7ug3y#_e`}st%cZ9Fm+X_vxBnL8VcvOI?5?SH^X? z^-$o`F>4v08J;qQR*G$_j$j)mBv93^B*83 zhTfo7dq>Q$iVrZYD*1=~1{W_Oy}-NG9sd4rFjCm~Gb?8SE3(}HO`K72e(I9gX>G~= zzP~ed{Vzx{{hlg~h7(Hwx`M^I3&rcb^yCjUq2Dn_?&Olo#IBfQ(YwN;w^0S|N;oq7 z;a0hESFB1#iUtFXFiXQ}R}_(1rDb5eD--2yg>wSt<^G*kvfxX8>e<2S`O6kC4S7}2 zq%NM~y@aB}G6olG!!b}Ns0TW3eq!NR^PLfuW4&{p0(ETkT2LLo!+F%iq(G$Tk1|^G z5Ujks%4XGdzVj~e{^Rv>Ig4^pBv0VnFkCKlS8?WR-WwGi(_2$lJY8sLFS=SH=mlq; z0O08xYIk4gtj4F$TbR4hIiLt`u>&uk!NA%is9UWDvI1Zfu04 zCsf@!Sbnszs(E9j&GtzP%!nyif$~!r1G&I<%4GL6xvm)cHPdORc0?NbsF1Ai!G7_6 zJeABn4Fg%DVpfawv+GjmoKqUM&+lllh6f+`pq-E*DZ!@o-=I=mup~;YE%b^C)3a4r zmJY<#K2iDIh}UomEOXwT8@sRt32otEi|eKbIU0}F0KX8M)KTUT`E!6Wou@n`C-O&R z##eeSE@iaR9d9=Mp_`Kb^me}%6(PEjS{?;AS9=fK2DoKB!X@%2)JSmwk8q@KBTvfFwd!6@;x)xus zmG#?ua9)yd@1|=L{)#t=tZRE4++VKR2M1~!l3&!*yzE*4UUmzWu__$Yz1tXC3NrVK zhW%@tnOe)4nZKM@v^O^8%Xz-a=UeE#O%f@QxG!aRpbjg4BU<{5)@}}rFd#vT&TI#N zZZMLd{1rau$S1lgpB)wmdhQ?7T6NmcE0elkjZ9o0NXp(9$Hx)l8intsdQCJ&Pak2Xl;MK@ z;FPP9Gb-NeTAHGD*$pzD)j`5N9Lv^Pj(0Z|n^Bg6UNS3!0-VzidzS^ve`^?C&~s3E z2tS%YXCW#@lNuw{d$iuI>t~t*T+9QVOX{X%(YDwe|2wU##HOX%!G__I1 zx238=1ss= z&!M_ha82CZrpYT4G)U=ui!U4KD8W8&<~vw4B$7m_>%O4x)iIb!yO1GsK3*t6Gc8te9hn-4N%i>koL5#aPD&L_=%4?wMdF=@uro~1(v(QU;%6FuRbwv6wG zJsWx+yDt8bY7nl0*C9*e2u=UQ=M&(?1*r?f9!Z2mLW3NTGMlX^KzO&+?a^@6e2fbqU zR4uPKYLp5SSgWC8vSz&n_{~De>}-8}54T8H5u3>EMZkj;R6rK+{eAMRt4qsE@1Xj? z?jP2xvZVt=*c`3G80N{DY~{}+^@C&F@HYT~3$%f^A`PmYZCpE) zyrwg*7D|N|Fo++5a#I~}&dfvAa;7lln8l-Fab$&n&`){V6q258ucO*Cm<#BH2fK4w zQZ~=T9uOGPt$`;s8Wakr-@-y89OcQ_l>Z|OqsUj_Y^(hkFMvo>*1neF)eif%cBggb zL|=!q7nN>Fh><21JFL#4 z*^DN>1(VZ1x~4E?J>U&D%UtqgtRgb>IQ1UnTRoZ?lP|fT??i`(TSKD-17BES+x=WB z>yMz@PEKC3eY?NwtCzrQ2@nSgI+?56vVXV|MaZlr^opK303x%v9us+ZY18U$(&ZmT zo|ka{LkK_v7(0j#59^I6wva=@37~Glpe=Hg05teMe^g1*W_#-Pdlh};w`?i^rSd0Ufd=U3#YbI}>p~4Q5W((n585l2ZsDPLqP)#RM$uy| zD4rGd8gVZ@NCU5XC1REOf}|3sW0OH0kcld-$H#wol{&yr+g#*LeAIu)KI7=B?~y;X^aAny0Pb2_|`fg0FV z4@EquGh6GAt$UNvy58u=_ zNI%W+)nv+&_-UuW--7Sas47}|O!pRkoxF~uV^6)@u!k7`4|j;qjW$>WxIOTPC7Zx= zp9#T+)=_5@BpAU&$y8U z%Ruw#FCb{x1h`?6X36tSf9Y!I$(eexu|AZ@x<)(pn8b)`3#qLNu@#$Ms}mf97~PQh z=ZR8)Ab2WVaU2{|Q4qm|-B|w;-x zv)ZS+^;BCX(S0>{BqsLWWlzHrA#3-MGz_4WdY+9h;>#rAF>tx@rFC+ zCqfr!$Y^|$hCIF&E;n=oq+sPlN zV%xTDn-yCX+qP}nww>;EM|aSp^9X0{&*K0&X7AVBb+{?@^E+-vZ6GmBIXpG;`K0cI z%CYtVYA*Cd&XF`k0zj1*Y_krEG2%(+WdpT-?A{)a9F-%bnqD>p02FXY+2+LzU?29~ z?6od1+HZSvTv74)JIlIl$MozojfmPBf&ctZ_hw>YTHyGBynh41)7e}QvyK0|`hk2w zsUXa!or^7n^n^AcFnFiDsh@m$1zh2HDJc7|$ZI>a1E|e=UX7d@U z;AV6bMr`xZX8WM~vmU@+tq0ymm)_|rbU4^{m4)7@m#90_d-6d?09X4Ab*whZBT3xC z*aEYtktv;aoa6WVv3%Tvk)vM#-p3?;XWw4om!3LODHTIcO)Z9AA4?*}U4}kv!+p_*n7IiKPbB;AafO za}{6q6ROcNnfS{CJgxz9tl%4$E&T;@OWs$t)YRi4!DrhZninBVc!_~XV1}#V2WCGN zn}J-b(XErS_z%h9B;w)GLZu=F6#>(Ma0omLz_Jrn5QY0)bfc z`6V`sNO3cS9Uplwi_5aO$6s@@x9cvg zEj_kt(GVEW<%iVT!Cxj;gY@y$PljTa%f9Hb8Q-`bEGd5sNfo`a745cidHgn2G4a|# z5$E?M1WF#>wQz=`dxnR0nO-xMRRNbT^%o8IY3v#vx>1@-M0HPJoNIav?Y%h~fWT1=P772Mc?3QD&^|W?HDpd$=vXv6oV6{E$EnttLt$bDxtuvhnOXG* zZr|B$fb7D}SkK!7R@EOd@i~>BIgD~P&vws98<-CR zrVgL+fSJ9$Cy(KUp0Vo@kZ;LiJyxGl>we))>|Iq{xrm6=8qV<1j;8F^c=mw~mU(9-aqDC@&hPy7l8h_#$cPHbk6LwD z2?Zkb7{&^m@x;=CyN|fZkFIE9iVIXCItTt#rEYCEk`l*0{CXj1vkd0I8)hd+kuC9) z0_bn`GqtWZxX+8$J`V;8b@+yyG<-b#5lXgo5Q+eC7zK?`Hd)9BWx$)Om>g68@dJyq zv!c-IM4og}Yaj%M-5(>J=l01aDc|u`BEN5jf-dun4rBn+xOS>70OI5s$m zLG^zX({Y$ZxO%nz=WE1E3*tKKR95K~UBYswJd^bA6!j*80XLp{v`T88BzOwf9!3He@u1D<$b1yo}l9wZL;g4+I~60|3H6K-iRMiX#RX z|1AKsK8HuN<5WFv=}A7VByZe05K4}Au(XecgQ?#m$@5KqBSNDf#KS_Qvn@$Tb zE4#T`JU$w#GG&|(G_skFZR9wx*w?VCgv9YFNyB(JMc9DKZJ(%77Cb$WqW?R|&QELA zG4zUYz5Q@yPa8n}B^>!Wl6F54d|))0G;#7I&6vzP&ZDhh+z_*5=!)Kborxd)v_;wCuitpI_RG zubrKW4kxHkdPsFv&`*+~eP&xunA~Q}m=h#=6P|s~rSI3?Q0wzL7&ag28rH_Ha8GQG z?0PvAr+@}Qx~hgng-w)}<^@Ba(&l$B@?3(@fD_@18F85q0M`$Nzmrav{L0ld)1+6~ ztR96H8a#$EK5W@4N5>`M$Wp;X{#^eF14yp8CiC z@1pF?cQ6lw5KZ`Hg&-rAN6i%~WMF)JqjVi2jiCZaWZA^x*iEO8?2ytrOVL0NVD4N(flHdpLsLOg5T$9>2t)2QNQ9f^Rm9#p zLSVQy`ttt$=cFNA3;r5EJXQaVcP$8E!R!}%BT1ghWEc~+EfOWv}T+URm z+Vi)rDZsqyO<7^Bff-ZgMu5P2^ECfQT#S5NIVtNW{--PNmmP4!+K zjnhhiEWj6evGNT;E%?za)v*X_d=bOT(ut9%T@F1uLwM6Ais2970>@sNCy>9Q{)6C? zX}Ry6eLbTEqij9~qONxI49&gK4V^(_KC|ABx!67TBgj6lMMcE88uB8?lrZ+MrSE%Y z>L&$|OoAS^eL3cjU7|kGQy|PhHe|G4vxrdg<*iJ*g44AG1-u~~DP_Yx;1+}}1@Tei zC4{fb4|{oJgxA{f%u}OKkrOEp-h3}cUvhj%A`%Y3p?NnelO3Kg23A~KaXSsQ2g zcC^f6o!IBhqHl=%Uu2j-E&Yacr_%7AXaDN-mN4Uu8nAPMFrS)2-Y+vrzl8 zi)1$4`OH(G2tygUZoWPQ>DQ4QggEKf>7!WPkLV8uYBU%mj7g8bQ%`m`FI zm9k@#{A@cG60qN#8+7gSOD2^{x10>SSC@7^aXIX&oDPSf{7zrVTIBdz7Csr(ZR_Wx z%bg%#*mrCK3(av1Z!d)zAve{Jv;u8jDdxB>kY2IJi$#t1W(?M_5pBO2rQ`RBJLnAM zjeA&Wegt+0m2k*rao zDs95m+DB%1@VZ}U#!Ub0q%j*q5Vb_lr%4BodgC3Q`f7r1^aKlf0&3`xStW0b`ez;c z!BGw1d7R*-nW`815h$TtskKF50Km7m^=6YT%q|6!jc=wb$TD)*Ge`en98Za9d3IXy z8-;AL{ouvhC+CamuaC{q+oOGH=rrL4KF}lZBNC3H6NYfQ{TF=snT=A&n2~DGJb-7K z;SKA0CsFwj%rI~;E+lby^(J=v#c%hYRQ}G}sw~<=`thcAtm|7cUCBT zTVl$#q}j4xFRnffATm>@WprO9`@OZTnX%`6f$zczMO?7V0IJ5;es%SPwt?rSnJfwD z9b6uHUACXPOFYw;@mX+C@kqO0xy1S79%3CYp$1#-kwKlA&Ndj9(1OMnsANs|!UGBW zSaz_ym_QCn3at~^rsNw}f9k}fI%z4i;jj16m}PS@fiOxVE; z&J!?^bPxfpif(;!8Q+##M-UG zHu3E#M*VB)w*34TA^?1|n=KS6hu0Hm#c^rlZ+&rV3M1Yo9yoI>YfSJ%k1^Brq z3$H}m^#I5}GQ%wXst6&R11 zgpp~T)yxu*ky-x3!?VzL593GpMp#EqVjLO)}9OI#I z-$VZC&*uALDPXiqy5!q85VVD6@w1gh#+T`-k>m9U50TSzTu3LJBa3-*O*_^{dM>|4 z=nquz$q5-uDE{r1qNSW6j8@)6(>4cA%lLOaK(L1rCEAr95hqyaZFgCOhk0X4*FcBu zD)^4_I42LOy$QYtKXN&&+=pl-9 zzneAwEur|#$R9t|MZG?bVYw@ZM2ytlzdolqr5TNCk!q1EqChoSHpI3?m0Gg=5<=P4 zxB2l4U3{ACJ|SPe50%pG2NY~bs?HX1WT1VO3gZ2fI;{?w>8f)ocQ}6QQ77Z=K^`?M zY;ob?RV$;(`QbBRw$M=afWghuG^=Iq>SF2W^+tM}Gtr zbo!@-&xnP2+yfhMB`s7#>bACy1R6FPB{Nb3dn|yLUC?@LB6fP&`ZZO7CfojXNH^=G z3jN9fk%;UgYES-_(){HCW!+#V+06}Q{*3GS<oi=A1^4+(|{u;VQ z$Q=+RVtnc9q{-W9c^1#LUNn<0$x7mS>#`8&&^IYtsj?jI!*o`x-S4pT7=#q^D6c!i zAHM$4C>jP_)%WQ#f@G?u#{rJ9@+73N9YLjGf|GJdnvxBi zBP;W^b>u1Lyst^u9EpxZEO?JwO zSQu1zBKzc@xkYW2G?$^Rr~bqns?3`>TjOQ7pQHAZYA*T04{|EMhxa>sz&O%+gIsrPe~fh^~IaC)-kOk*9h*aQyf~sv&2I*rGs6fUAg6~5a5jzt^$zFd{l%S)qj$3~P z=*|~TnfiNQI@4YpFHBLxK<@b3OYpbP8^oTQ3tD=KXP$9T>>nr_C~^2cK|8uhy6c&G zKI+bB$66krgG*67Qx-2%SlRqObEx>|Epi|`n0>x2pGSp9X1BA>T9^I&%ME}tG|kO= zhs^o0(1V@r5?}gNZ-;VG{%pv97ogF0+PgpL9N5TIt!&|Cc-O}PZApo9^y0BZUb0Ki z=co6ubzvlnB$UNU7ZD;3rq+p=*;vkv5jD2HrzGzSZFSgH->GRqM+Ip*81ZDqFgXrZLjNOKIx9l0vbHtml)Cj~Nd2 zEbrScBOT%N^%m6S&Ri;aw(mNIjlD&WXj))JvEB7~P9B_6ID}Bv#Koi?LlJI}PF7nk zwYvAvAQ~zvTvHDD!l1WrW~#5qpd3Q!Pgs(?*}1WK@iYDQpI&n~s19tgxsXzkJyRYv zK`CO=wn?U!#@r=Z@l?P_)Y7Iv?^-cG316>-KKbTP$&i_^@`z>ORbo44k83=Aa7>SK zVJ>I=V12fvuQ9G_K?#k1JCdzYQA{GuEV2B(XmI!~>Ps}kc2Lu|=#VLj`^ZR%uh+fx zP320X_q31Um#I2vcIs{Tqbz{?#!u#cudL%O4mXe=3Mz3=T=6tTl0J(1 z`j^2$gOE2{lQz;HDjFGfQDttWr`KVvsiZvldwd_E-SK9x1x~Xe`SX8qXu~i)>(!9y zo6I&6m&q&Vf+kQ11PdCR>LhUPmMMQX+4w9!@L*5!X z2b@VA?!GQ=F>pcZPb*-4+LJ@WH`oUrr_Wr{=3JvC6Zq*+oLC2Ur<}ww&@eq`-a;Bm}AHI!r==zOY(en>l%Bo*`r&V3S@={#jusM zKJA!j;?!R`@bzkHMn-EHhM0Or_z%ZU>>bun%A}w<%`9E^@F#smAYSGBz=p;UGR5kB zxr#_@{R(;33V(hTV0Ze$Fu%EQx#4e_>UQ|MQJa>lm!4ERp_CU@oMa-T~TqCbl^u(MYO;ogj z1KXTsC+V7kUeqA;c~XrOtTs^>jGfY0h_X%jg@ZaPHbIIK1^V9nn(NCYO zPeK;U4Xd@J$|spJw`|VMQS_j71nNIkWG;)ZZT+gf=nn_E$oe0u*z`fqJy0}t7`3@} zmIFi=g{8!H$X;H%)04Nc^xq^&Ww8kH-J-w zeG^z;l%NF6xY(mWGY6BydzCIcIeJG0HuTSvpd)*jhW-?H_kVIoPj$-n-t( zmHNupwhqF@JY?i#wDubmu+%V!vYJxmuI|pR&UIajaTGwX+ z$d%nMOf6l{VV_iw;^|%GI;+y?^^bIW8PBNeH`L4kn3>J=5X1EKG~uq~8M#h$)Y8AiTLi)ok zC?p%oJi4ncrEy+^C@NH(5W;L@#*G!M`2?Z(5t#xUr*E@zs#QaNSkfuQ1|BUEd&edu zau7Y#8mmUMNtKg)2st!~SBe?e0pbNHX!tz3E+OGN@r{hp&TdDgSi48xD3W5T0f1Xl zZ7tybIY+XLA?;&f<+jS%y=hE6S>aIX63Kzb?UsJkOS%NL#J#MxhGlYFC|n;yt9 zW*+3ZDBMRZ(}g9A6Q*O98eKvnKuv^AjRp`TD;}C%LV?1OPu+Y_=^h_ z_1#5mm>%cednN5tR(~q7kZS43rYpKrHxd7{$94)kX?lF;y>q*5-5BVCA$0Exg_-l@ z4Oq$pr}{1^Q;dcXN)&QjG!C;V)}fY<+L$As zZN4&A1F3m!+3OR$hXW=ZZIozqgz?uK7)Ds#WNa>An(SiG1@Hb^=ZNAl9w#zZNoUz& z7rPd}K*bn|bfg@QUTs9$#)xIoMyEI*Q1=g<4q}R$oT73!`|Z5X$;*|wISLlju1bH6 zOs~lj9{V_SKVz|Zpdt0;45QAmL!j3sZ_=`>U zvUU3Wpcpd05?WnKM(>|Fi%v1us+%#B{S61IYjnkz$KR)VM+HuQ$5nkqPDx{HreV!# z2fUpd&kyJ875dMo7fH&&fX^8*vIdNvbk(0JY(gR71hc?rmII4T_y>D6dCd~>D^6-GSPS5oQQ+i$397+L*bE}zC{jTnl0w8?@OMj)Xbht?pSEo%{9V`xbvfZsCDj8p(~dG zlFyKfcyOf?q3ce-h{4W}m)7LPYwSg`vpQ173|~G_?4%Ka@ ztM-1{dHx36s&gBIss}^s#=eg9)%)8a@}tULj#ej8gk;$4cPTdU9aUJsd`lCjmNn1Y zy%%|V3>xW)Ybr3hjNC+ggUtDyc@NMbR!YT#mwZOFflICYq>X3qIF1(ASJl0fM?M#| zADVCP1@->E_R_nBPQ4g*fcpt0_81GhIr_Yvn?XO^)mLUP%&^88=M{T?ECH9Y0M$jw zm`HwNDad;s!sX9we^8VzeuySc?D+3j@U7HB<|BE&^pA42G$(6SqZe&Bi)}-hU)a5X zepiHb>IJ?1YP9jBON1|Xj!7%=aK!TKxt?X8S^3(0>+aQrc&6s!K>-VnoaN$Uyxtem zha56Hxp}d8^C6i_W%K(V{k%x}-7iHWnSUG~Etef7Boh7ipm zIH);!r`OFWbRMU@6E*1r%f4i>fn$7C>ZkkLl%7R5X9+A>78KfGmIPov!GRSHzA?B5HO(h(u zlGh_Iw#!!e#*E2tSr3?69=T@sbKxOE3$f3BoMT4L{a#Z_{;i36?rco5yCAG?$Xu{J z(>_2K{J9B!=*=C6(u^hcO%KnWc88*4c+-pwk*eRbo3q2RDDUlzG4d$09BJ7n_{<^<~FdH5NimzDgmBo7;yl$Fx8Ev^%Dic*`Lg@-ajGg70CtWskzg(J%^kg(r2Xl(rejeA?=ZP8>~8f3L@d7 z;83O;*N29Ys|H*zfj1v7e@hIA#0>w+x?17$B#`MblO-;T(lR#3U99rX@8P7%$hxFS zPr^RwL4}>+%;;s1u&NjT+MA7O8Wwq1Ix2=g6;9oF@x2ZzMs10slljU4MUe`JF@HQ9 z_Eku;k58s^KT7;cfLt=8k0|?*BBOzy1&s)X;6~F{B&l^(T2~k6bK9xYiM(2vD$|n* z#v$zrTZ0X5u+`R7Uoo0%5i0(KK5r9mz|kX|s2LCI;UyG?DLRue*zH8?6f=q-KAn2bjWV{8W7?ldN(|80!_d!$86D zZb!}~J~y9IGDW>!fH6>YNpc7*J$F7u)LqH9UNt>pU1ycQdIuEn8%-f}yYv{*F2Qg8 zCrB?Tms~UKZboqn!o#|YaziC~$l>{B&(_S%307}#^I_n#cyYU=C!s#eyJ>W0ryc9g zI&DPSV+=E4!xydbK2P=x(zKI@t%?A#-pF(0gM^M$s!Xx?SkezCgx@=}X`2%HVQY40 zufMq|8nhwRtKK0lSqaPj4(CBmigO!-bO5pdZ-+GT`m(D0A>i_$s-MFF5V%D%=yXkAy^M9D3uCTb(2q)QFWK?&`&wN!JcO#l4&mh*UBYr>!-0`4-3 zJGLN`b)mMsI`bFB@#)Fcaz&@sL|)|Jh^=l;=g!)})S|z4C)u6P+s*U#b3(D8fX6fD zZKq#bdF%`|W7yI!Cve)BQWOW+^7=;R>m$OI?0oi&4t zjy_XCm`;RG@l1aa9*Dr2HhHH&x_vwlG{QvJW3= zv5yA6m#iMnWaR5b_%{)4XL6s@IdUc*jLsWtj8tL-qX!NIIW%$H)4cedEx`t26neBX z(RcpN7U|!D@V|tGkUe8*r;F8IXSPCa510br1mi|A4yx=5d8e-?K*Sa#?Q~>U35?J;?QAD~tS#B7* z!a!ph;=pSaks2(to}=&N+K6FWw(1xa!D5b|7!WjjDY)@*VHi!~C7fRST%=*dbQyc% zB~s@G;u9Lo1L-BkUdn14TxlhEbdq&alVx}_CB~i~De9`++SCePp9>!jgi!c#Cey6r z{O{c!X@wyFb12G%PxdjvLO}4mk51bEVJNzQTuoWrLbMHBG9__*m#UXX)DoR+m5({> ziqWNq>8VzXg?lSY>cyyS*$2O2))BouopHGf$&+E-<+z-!16LLVe$}&coZnT4J-%*- zKW}#WJ#gGUS05JJAKx7yMy{UHBZ1+H)Tav?j?4Sx8u_y2CnuF(mG8fMt&$nds5N=p zGu$}%`UpRrIf}R0tR;tCX}dGGmLoPY=RTE5y?pWZ`RIxcfS!#0Y&hm33KN^>pX&I9$pM-R)MIBbrt9u-2n9l}!P%AGo=(>Hv4X)SjI> zDWF^)*djFsBUf?5U!2Q>v;>*hz@YyS{l?z^@Q23c(y73i(MW?**G`&?PpsXuxms6p z8`_KjUv{S$nUH+HH^rBdP#oBc|u;oc}WE9&E1ty zkQ{xLMGU4~X5uHVcENb!r%l1-(7@W1-maBashzH_&j?H6o*1D)K6r@41#X2BLuTPv z|IlXMSEcWXGFCtzqCvB#d=|KLjJFTez_C%LAXjw~wmhOlcnfTu7md`2w_X6!aOZ09 z06-C#a7VV;$G{*E?o=9YqJ%$dMX#HM2@sDTdr@{a-Jb^Vi#!?DB>lKZzVKUKH#_ih^MFC5N ze2z2yW=_E)$u1Zz=Erf!O@f4r+%q+L_i_0Yjh|35^F|g8OXWtDzk1Il{T%E+Ox;J2 z3yxk+qf&A{u_Wun{9%7TB?WrgyFT9#YJX8_@D?O={QZ8u_~114SI}W9%k*e*#~juy z?J<Ns`@bIW+dirPfcbx!tMYYkV66{8#not`V9ZT1I3&>R)1&Y%a&i%ITQe+O= z1VK@JS+Q;L38*UH_ekFny0FAg)Fk29pOKfJ`a2?Gbe^ayB2jI^w7_X5hSsJ5((ddm zfu1<{J>!vz5NW?CiHicxA^R(p&LWNix5`%x5!#FPB7|veV=D?;c+Tvyi0@?;Bb)T- z27V@Geth2#eYDmW5<52lu&a}_w#XlZnO7Cbc?}fFA*@L7Ih!4Xd1HrkairqEcA?_0 zcZ+|s?WDMMHG{HvmV_CHw`uEdn%wR1aYweu`#WluT;^J}lP)+f_~G->wP{wsfF zN#9PjAOyn4?j6g!`0+-G{5b_H#_P#CTDW>MK ze$C71IWOC0f8ooXMw`j3v^D_gW4&BQ1tjxI1|-Di5j=AUO#+J?*YI>J5@SW(uZj(KiW4UPVmPRs~^Op(&h*Z5o&<8n4qt)ugjQc=c5`RFyQ5{`o=wO!d>) zx36EW$o|vbChs!n?Y=L41o0ps=>KPXYh`X*q;24k$%f-QRbBJgAY%u!vg$gP1YIar z6tYSU@~*w=`81EhKyGk-ZkYt4_+SL^497Xjayf5V+BbD^`Wn6KnJHPm$urw!Xk>uG z@j@sdc>?egkaBB3q-r;$qC_B|G{Gxo-LBizlez|_+9%lQEY>uQ^zIntKGMDi(pfWZ z^}B6}Be7gQ32`Fb(`!Jfx58!57AP5^9Ipcy*4k$7ZRfJen-NCVk%}57?jJ($ykWFn z+NP}>5=EMV5cnHWHfge4ZV{Q2x}0*zQGJO?aagpdGoJ;p-VCt3jjf`=+EBH8XxY1`P6`0!rxi90)o&Kevgp|Rz$Tk(PZpa z6e)h1uW(_iXW(U+YljD8ctCK2m8Vd@ZDoCQCF#Bq<~&^)IBQPP)f*@x)kIX?z}lWH z;!Mu#&O?EP95+_;Sm%7>W`9 zlKIH9N4oj(*{YsM$t+#I){JrAI|8pEKPEh6f=q#FHWHURouP~=L3gEBd_Q@W`Myox z!_wNFhPD7PAu7yGTIY9jDCo+%yy#9zt}?~w$DU%gDKB>q$T84*2NVAS#U=>50Vb1H z<%>`cY%V!kKYdLB9yT=5=2y)zy5Ry}>xdvzx}zXDKG`5OCirz`_-tnQdAc3LS&>M0 zcT$h7E(N1_+y;}Fjbc`D$|oK)=T#UROBp0JLdxlljSfm)ga^Jj&2#QkIQ*lkpF;h& zqhQNrT69}}Wx6@#3;{ek%h$QGwu=vokm+d_m+Uz=H@_Kc2Wme>YUt^+1fcU<7>}Cj zXi@%*gf~E~&LzA#p~JA3cDP#FJPQg8+yb}3i$Eq7KSCj+2!RKbJX+*|lX;C-ax#ES z^~VFKp0p2J=NO*JDptsj&vt@K1n=K#0j`37Ptj&<8pn4Mr(yDxI4xi;Gcx5?ACpfd>C>EdEOGBE*lcf8CjzIkI@z+5WSVLtJtK4iFN8w*ec1>aTL|>F-L{f1&>0 zt`-Z>+~S`=GaB7P^>;|rd#3)2_MZL*N?StySD>}Mne#u1Tk%`XiSLx>_xztt-1r}e z&gLfn1n&0GI0N5d0q^-QtNK^^yNR_{|GkOMKoc2jJd^NEC?^qWr6Gz}bku5A$s0Hs347h*(be;77j&%ROd*{|B|4Fw95<>VrQ~pOA z-(wT~*WU54|7QdL>6`zB{QFTZ2}1uj-akC`f3pASZ2X&TD*E5qf4d(4Wd3tP{Wo(~ z>VIXvPp`^yu + + xilinx.com + xci + unknown + 1.0 + + + design_1_processing_system7_0_0 + + + 1 + LEVEL_HIGH + 1 + LEVEL_HIGH + 1 + LEVEL_HIGH + 1 + LEVEL_HIGH + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + + 100000000 + 0 + 0 + 1 + 0 + undef + 0.000 + 1 + 0 + 0 + 0 + + + 100000000 + 0.000 + + 100000000 + 0 + 0 + 1 + 0 + undef + 0.000 + 1 + 0 + 0 + 0 + + 100000000 + 0 + 0 + 1 + 0 + undef + 0.000 + 1 + 0 + 0 + 0 + + + 100000000 + 0.000 + + 100000000 + 0 + 0 + 1 + 0 + undef + 0.000 + 1 + 0 + 0 + 0 + + 100000000 + 0 + 0 + 1 + 0 + undef + 0.000 + 1 + 0 + 0 + 0 + + + 100000000 + 0.000 + + 100000000 + 0 + 0 + 1 + 0 + undef + 0.000 + 1 + 0 + 0 + 0 + + 100000000 + 0 + 0 + 1 + 0 + undef + 0.000 + 1 + 0 + 0 + 0 + + + 100000000 + 0.000 + + 100000000 + 0 + 0 + 1 + 0 + undef + 0.000 + 1 + 0 + 0 + 0 + 1 + LEVEL_HIGH + 1 + LEVEL_HIGH + + + design_1_processing_system7_0_0_FCLK_CLK0 + 50000000 + 0.000 + + + design_1_processing_system7_0_0_FCLK_CLK1 + 100000000 + 0.000 + + + + 0.000 + + + + 0.000 + ACTIVE_LOW + ACTIVE_LOW + ACTIVE_LOW + ACTIVE_LOW + false + + + 100000000 + 0.000 + + 100000000 + 0 + 0 + 1 + 0 + undef + 0.000 + 1 + 0 + 0 + 0 + 1 + LEVEL_HIGH + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + false + false + 32 + 0 + 0 + 0 + design_1_processing_system7_0_0_FCLK_CLK0 + 32 + 50000000 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 12 + 16 + 4 + 4 + 0.000 + AXI3 + READ_WRITE + 0 + 0 + 0 + 0 + 0 + + design_1_processing_system7_0_0_FCLK_CLK0 + 50000000 + 0.000 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 256 + 1 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 0 + 0 + + + 100000000 + 0.000 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 256 + 1 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + + + 100000000 + 0.000 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 256 + 1 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + + + 100000000 + 0.000 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 256 + 1 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + + + 100000000 + 0.000 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 256 + 1 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + + + 100000000 + 0.000 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 256 + 1 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + + + 100000000 + 0.000 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 256 + 1 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + + + 100000000 + 0.000 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 256 + 1 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + + + 100000000 + 0.000 + design_1_processing_system7_0_0 + 666.666687 + 23.8095 + 23.8095 + 10.000000 + 10.158730 + 125.000000 + 10.000000 + 50.000000 + 100.000000 + 10.000000 + 10.000000 + 50 + 200.000000 + 200.000000 + 100.000000 + 10.000000 + 166.666672 + 200.000000 + 111.111115 + 111.111115 + 111.111115 + 111.111115 + 111.111115 + 111.111115 + 50 + 100.000000 + 60 + 60 + 111.111115 + 0.251400462962963 + 666.666666 + 40 + 0xE0008000 + <Select> + 0 + <Select> + 0xE0008FFF + External + 0 + -1 + 0xE0009000 + <Select> + 0 + <Select> + 0xE0009FFF + External + 0 + -1 + IO PLL + 1 + 1 + 100 + 0 + 50000000 + 100000000 + 10000000 + 10000000 + 0 + 0 + 0 + 0 + 667 + 1333.333 + ARM PLL + 2 + 33.333333 + DDR PLL + 15 + 7 + 10.159 + 32 + 1066.667 + HPR(0)/LPR(32) + 15 + 2 + DDR PLL + 2 + 0 + 0 + 0 + 0 + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + 0x00100000 + 0x1FFFFFFF + 2 + 2 + 2 + 16 + <Select> + <Select> + 0xE000B000 + <Select> + 0 + <Select> + 0xE000BFFF + External + 1 + 1 + 0 + 1000 Mbps + 0 + <Select> + 0xE000C000 + <Select> + 0 + <Select> + 0xE000CFFF + IO PLL + 1 + 1 + 0 + 1000 Mbps + 0 + <Select> + 0 + Active Low + <Select> + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + IO PLL + 5 + 4 + IO PLL + 5 + 2 + IO PLL + 1 + 1 + IO PLL + 1 + 1 + TRUE + TRUE + FALSE + FALSE + 50 + 100 + 50 + 50 + 1 + 1 + 0 + 0 + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + 1 + 4 + 4 + 1 + 4 + 4 + 0xE000A000 + 1 + 64 + 64 + 0xE000AFFF + 1 + MIO + 0 + 0xE0004000 + 1 + EMIO + 0xE0004FFF + EMIO + 1 + 0 + <Select> + 0xE0005000 + 1 + EMIO + 0xE0005FFF + MIO 48 .. 49 + 1 + 0 + <Select> + 111.111115 + 1 + Active Low + Share reset pin + None + 0 + 0 + 30 + 1000.000 + 1 + DIRECT + in + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + inout + LVCMOS 3.3V + disabled + slow + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + out + LVCMOS 3.3V + enabled + slow + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + inout + LVCMOS 3.3V + enabled + slow + in + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + out + LVCMOS 3.3V + enabled + slow + in + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + in + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + <Select> + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + enabled + slow + inout + LVCMOS 3.3V + disabled + slow + out + LVCMOS 3.3V + disabled + slow + out + LVCMOS 3.3V + disabled + slow + out + LVCMOS 3.3V + disabled + slow + in + LVCMOS 3.3V + enabled + slow + 32 + SD 1#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#USB Reset#UART 1#UART 1#SD 1#SD 1#SD 1#SD 1#SD 1#SD 1#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#I2C 1#I2C 1#Unbonded#Unbonded#GPIO#GPIO + cd#qspi0_ss_b#qspi0_io[0]#qspi0_io[1]#qspi0_io[2]#qspi0_io[3]/HOLD_B#qspi0_sclk#reset#tx#rx#data[0]#cmd#clk#data[1]#data[2]#data[3]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#data[4]#dir#stp#nxt#data[0]#data[1]#data[2]#data[3]#clk#data[5]#data[6]#data[7]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#scl#sda#Unbonded#Unbonded#gpio[52]#gpio[53] + 0 + 50 + 12 + 0 + 12 + 0 + 10 + 12 + 0 + 12 + 1 + 1 + 11 + 1 + 1 + 11 + 1 + 0 + <Select> + <Select> + 0 + 1 + 1 + 11 + 1 + 11 + 1 + 0 + 1 + 1 + 11 + 1 + 11 + 1 + 0 + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + <Select> + 0 + 1 + 1 + 11 + 1 + 11 + 1 + 0 + 1 + 1 + 11 + 1 + 11 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0.082 + 0.070 + 0.318 + 0.433 + 0.005 + 0.029 + -0.434 + -0.614 + clg225 + IO PLL + 5 + 200 + None + 0 + <Select> + 0 + LVCMOS 3.3V + LVCMOS 3.3V + PRODUCTION + 0 + <Select> + 0 + <Select> + 1 + MIO 1 .. 6 + 0 + <Select> + 0xFCFFFFFF + IO PLL + 5 + 1 + 200 + MIO 1 .. 6 + 1 + EMIO + 0 + <Select> + 1 + EMIO + 1 + EMIO + 1 + MIO 0 + 0 + <Select> + 0 + <Select> + 1 + MIO 10 .. 15 + 0xE0100000 + 0xE0100FFF + 0xE0101000 + 0xE0101FFF + IO PLL + 10 + 100 + 1 + x4 + NA + NA + NA + NA + NA + NA + NA + IO PLL + 1 + 100 + 0 + 0xE0006000 + 1 + EMIO + 1 + EMIO + 1 + EMIO + 0xE0006FFF + 1 + EMIO + 0xE0007000 + 1 + EMIO + 1 + EMIO + 1 + EMIO + 0xE0007FFF + 1 + EMIO + IO PLL + 6 + 166.666666 + 1 + 31 + 31 + 10 + 3 + 10 + 6 + 10 + 6 + 64 + 10 + 6 + 64 + 10 + 6 + 64 + 10 + 6 + 64 + 10 + 6 + External + 1 + 200 + 12 + 128 + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + 0 + <Select> + 2 + 0 + 8 + <Select> + 0xE0104000 + CPU_1X + 1 + 133.333333 + CPU_1X + 1 + 133.333333 + CPU_1X + 1 + 133.333333 + 0xE0104fff + 1 + EMIO + 0xE0105000 + CPU_1X + 1 + 133.333333 + CPU_1X + 1 + 133.333333 + CPU_1X + 1 + 133.333333 + 0xE0105fff + 1 + EMIO + 50 + 0xE0000000 + 115200 + 0 + <Select> + 0xE0000FFF + 1 + EMIO + 0xE0001000 + 115200 + 0 + <Select> + 0xE0001FFF + 1 + MIO 8 .. 9 + IO PLL + 10 + 100 + 1 + 533.333374 + 0 + 0 + 3 + 8 + 0.25 + 0.25 + 0.25 + 0.25 + 16 Bit + 7 + 0 + 86.1835 + 160 + 0 + 86.1835 + 160 + 0 + 86.1835 + 160 + 0 + 86.1835 + 160 + 0 + 10 + 6 + 4096 MBits + 0 + 81.244 + 160 + 0 + 57.044 + 160 + 0 + 520 + 160 + 0 + 700 + 160 + 0.0 + 0.0 + 0.0 + 0.0 + 0 + 77.166 + 160 + 0 + 53.995 + 160 + 0 + 550 + 160 + 0 + 780 + 160 + 16 Bits + Disabled + 1 + 533.333333 + Normal (0-85) + DDR 3 (Low Voltage) + MT41J256M16 RE-125 + 15 + DDR3_1066F + 1 + 1 + 1 + 40.0 + 35.0 + 48.91 + 7 + 7 + 0 + NONE + 0xE0102000 + 0xE0102fff + 1 + 60 + 1 + MIO 7 + MIO 28 .. 39 + 0xE0103000 + 0xE0103fff + 0 + 60 + 0 + <Select> + <Select> + 1 + Active Low + Share reset pin + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 3 + CPU_1X + 1 + 0 + 133.333333 + <Select> + None + zynq + + xc7z010 + clg225 + VERILOG + + MIXED + -1 + + TRUE + TRUE + IP_Integrator + 6 + TRUE + . + + ../../ipshared + 2018.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xdc b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xdc new file mode 100644 index 0000000..e2ff668 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xdc @@ -0,0 +1,456 @@ +############################################################################ +## +## Xilinx, Inc. 2006 www.xilinx.com +############################################################################ +## File name : ps7_constraints.xdc +## +## Details : Constraints file +## FPGA family: zynq +## FPGA: xc7z010clg225-1 +## Device Size: xc7z010 +## Package: clg225 +## Speedgrade: -1 +## +## +############################################################################ +############################################################################ +############################################################################ +# Clock constraints # +############################################################################ +create_clock -name clk_fpga_0 -period "20" [get_pins "PS7_i/FCLKCLK[0]"] +set_input_jitter clk_fpga_0 0.6 +#The clocks are asynchronous, user should constrain them appropriately.# +create_clock -name clk_fpga_1 -period "10" [get_pins "PS7_i/FCLKCLK[1]"] +set_input_jitter clk_fpga_1 0.3 +#The clocks are asynchronous, user should constrain them appropriately.# + + +############################################################################ +# I/O STANDARDS and Location Constraints # +############################################################################ + +# GPIO / gpio[53] / MIO[53] +set_property iostandard "LVCMOS33" [get_ports "MIO[31]"] +set_property PACKAGE_PIN "C13" [get_ports "MIO[31]"] +set_property slew "slow" [get_ports "MIO[31]"] +set_property drive "8" [get_ports "MIO[31]"] +set_property pullup "TRUE" [get_ports "MIO[31]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[31]"] +# GPIO / gpio[52] / MIO[52] +set_property iostandard "LVCMOS33" [get_ports "MIO[30]"] +set_property PACKAGE_PIN "A12" [get_ports "MIO[30]"] +set_property slew "slow" [get_ports "MIO[30]"] +set_property drive "8" [get_ports "MIO[30]"] +set_property pullup "TRUE" [get_ports "MIO[30]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[30]"] +# I2C 1 / sda / MIO[49] +set_property iostandard "LVCMOS33" [get_ports "MIO[29]"] +set_property PACKAGE_PIN "D13" [get_ports "MIO[29]"] +set_property slew "slow" [get_ports "MIO[29]"] +set_property drive "8" [get_ports "MIO[29]"] +set_property pullup "TRUE" [get_ports "MIO[29]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[29]"] +# I2C 1 / scl / MIO[48] +set_property iostandard "LVCMOS33" [get_ports "MIO[28]"] +set_property PACKAGE_PIN "B12" [get_ports "MIO[28]"] +set_property slew "slow" [get_ports "MIO[28]"] +set_property drive "8" [get_ports "MIO[28]"] +set_property pullup "TRUE" [get_ports "MIO[28]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[28]"] +# USB 0 / data[7] / MIO[39] +set_property iostandard "LVCMOS33" [get_ports "MIO[27]"] +set_property PACKAGE_PIN "D14" [get_ports "MIO[27]"] +set_property slew "slow" [get_ports "MIO[27]"] +set_property drive "8" [get_ports "MIO[27]"] +set_property pullup "TRUE" [get_ports "MIO[27]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[27]"] +# USB 0 / data[6] / MIO[38] +set_property iostandard "LVCMOS33" [get_ports "MIO[26]"] +set_property PACKAGE_PIN "A13" [get_ports "MIO[26]"] +set_property slew "slow" [get_ports "MIO[26]"] +set_property drive "8" [get_ports "MIO[26]"] +set_property pullup "TRUE" [get_ports "MIO[26]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[26]"] +# USB 0 / data[5] / MIO[37] +set_property iostandard "LVCMOS33" [get_ports "MIO[25]"] +set_property PACKAGE_PIN "C14" [get_ports "MIO[25]"] +set_property slew "slow" [get_ports "MIO[25]"] +set_property drive "8" [get_ports "MIO[25]"] +set_property pullup "TRUE" [get_ports "MIO[25]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[25]"] +# USB 0 / clk / MIO[36] +set_property iostandard "LVCMOS33" [get_ports "MIO[24]"] +set_property PACKAGE_PIN "B14" [get_ports "MIO[24]"] +set_property slew "slow" [get_ports "MIO[24]"] +set_property drive "8" [get_ports "MIO[24]"] +set_property pullup "TRUE" [get_ports "MIO[24]"] +set_property PIO_DIRECTION "INPUT" [get_ports "MIO[24]"] +# USB 0 / data[3] / MIO[35] +set_property iostandard "LVCMOS33" [get_ports "MIO[23]"] +set_property PACKAGE_PIN "A14" [get_ports "MIO[23]"] +set_property slew "slow" [get_ports "MIO[23]"] +set_property drive "8" [get_ports "MIO[23]"] +set_property pullup "TRUE" [get_ports "MIO[23]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[23]"] +# USB 0 / data[2] / MIO[34] +set_property iostandard "LVCMOS33" [get_ports "MIO[22]"] +set_property PACKAGE_PIN "D15" [get_ports "MIO[22]"] +set_property slew "slow" [get_ports "MIO[22]"] +set_property drive "8" [get_ports "MIO[22]"] +set_property pullup "TRUE" [get_ports "MIO[22]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[22]"] +# USB 0 / data[1] / MIO[33] +set_property iostandard "LVCMOS33" [get_ports "MIO[21]"] +set_property PACKAGE_PIN "C11" [get_ports "MIO[21]"] +set_property slew "slow" [get_ports "MIO[21]"] +set_property drive "8" [get_ports "MIO[21]"] +set_property pullup "TRUE" [get_ports "MIO[21]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[21]"] +# USB 0 / data[0] / MIO[32] +set_property iostandard "LVCMOS33" [get_ports "MIO[20]"] +set_property PACKAGE_PIN "E15" [get_ports "MIO[20]"] +set_property slew "slow" [get_ports "MIO[20]"] +set_property drive "8" [get_ports "MIO[20]"] +set_property pullup "TRUE" [get_ports "MIO[20]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[20]"] +# USB 0 / nxt / MIO[31] +set_property iostandard "LVCMOS33" [get_ports "MIO[19]"] +set_property PACKAGE_PIN "C12" [get_ports "MIO[19]"] +set_property slew "slow" [get_ports "MIO[19]"] +set_property drive "8" [get_ports "MIO[19]"] +set_property pullup "TRUE" [get_ports "MIO[19]"] +set_property PIO_DIRECTION "INPUT" [get_ports "MIO[19]"] +# USB 0 / stp / MIO[30] +set_property iostandard "LVCMOS33" [get_ports "MIO[18]"] +set_property PACKAGE_PIN "B15" [get_ports "MIO[18]"] +set_property slew "slow" [get_ports "MIO[18]"] +set_property drive "8" [get_ports "MIO[18]"] +set_property pullup "TRUE" [get_ports "MIO[18]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "MIO[18]"] +# USB 0 / dir / MIO[29] +set_property iostandard "LVCMOS33" [get_ports "MIO[17]"] +set_property PACKAGE_PIN "D11" [get_ports "MIO[17]"] +set_property slew "slow" [get_ports "MIO[17]"] +set_property drive "8" [get_ports "MIO[17]"] +set_property pullup "TRUE" [get_ports "MIO[17]"] +set_property PIO_DIRECTION "INPUT" [get_ports "MIO[17]"] +# USB 0 / data[4] / MIO[28] +set_property iostandard "LVCMOS33" [get_ports "MIO[16]"] +set_property PACKAGE_PIN "A15" [get_ports "MIO[16]"] +set_property slew "slow" [get_ports "MIO[16]"] +set_property drive "8" [get_ports "MIO[16]"] +set_property pullup "TRUE" [get_ports "MIO[16]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[16]"] +# SD 1 / data[3] / MIO[15] +set_property iostandard "LVCMOS33" [get_ports "MIO[15]"] +set_property PACKAGE_PIN "D10" [get_ports "MIO[15]"] +set_property slew "slow" [get_ports "MIO[15]"] +set_property drive "8" [get_ports "MIO[15]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[15]"] +# SD 1 / data[2] / MIO[14] +set_property iostandard "LVCMOS33" [get_ports "MIO[14]"] +set_property PACKAGE_PIN "B9" [get_ports "MIO[14]"] +set_property slew "slow" [get_ports "MIO[14]"] +set_property drive "8" [get_ports "MIO[14]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[14]"] +# SD 1 / data[1] / MIO[13] +set_property iostandard "LVCMOS33" [get_ports "MIO[13]"] +set_property PACKAGE_PIN "C6" [get_ports "MIO[13]"] +set_property slew "slow" [get_ports "MIO[13]"] +set_property drive "8" [get_ports "MIO[13]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[13]"] +# SD 1 / clk / MIO[12] +set_property iostandard "LVCMOS33" [get_ports "MIO[12]"] +set_property PACKAGE_PIN "B7" [get_ports "MIO[12]"] +set_property slew "slow" [get_ports "MIO[12]"] +set_property drive "8" [get_ports "MIO[12]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[12]"] +# SD 1 / cmd / MIO[11] +set_property iostandard "LVCMOS33" [get_ports "MIO[11]"] +set_property PACKAGE_PIN "B10" [get_ports "MIO[11]"] +set_property slew "slow" [get_ports "MIO[11]"] +set_property drive "8" [get_ports "MIO[11]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[11]"] +# SD 1 / data[0] / MIO[10] +set_property iostandard "LVCMOS33" [get_ports "MIO[10]"] +set_property PACKAGE_PIN "D6" [get_ports "MIO[10]"] +set_property slew "slow" [get_ports "MIO[10]"] +set_property drive "8" [get_ports "MIO[10]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[10]"] +# UART 1 / rx / MIO[9] +set_property iostandard "LVCMOS33" [get_ports "MIO[9]"] +set_property PACKAGE_PIN "B5" [get_ports "MIO[9]"] +set_property slew "slow" [get_ports "MIO[9]"] +set_property drive "8" [get_ports "MIO[9]"] +set_property pullup "TRUE" [get_ports "MIO[9]"] +set_property PIO_DIRECTION "INPUT" [get_ports "MIO[9]"] +# UART 1 / tx / MIO[8] +set_property iostandard "LVCMOS33" [get_ports "MIO[8]"] +set_property PACKAGE_PIN "B6" [get_ports "MIO[8]"] +set_property slew "slow" [get_ports "MIO[8]"] +set_property drive "8" [get_ports "MIO[8]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "MIO[8]"] +# USB Reset / reset / MIO[7] +set_property iostandard "LVCMOS33" [get_ports "MIO[7]"] +set_property PACKAGE_PIN "D9" [get_ports "MIO[7]"] +set_property slew "slow" [get_ports "MIO[7]"] +set_property drive "8" [get_ports "MIO[7]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "MIO[7]"] +# Quad SPI Flash / qspi0_sclk / MIO[6] +set_property iostandard "LVCMOS33" [get_ports "MIO[6]"] +set_property PACKAGE_PIN "A10" [get_ports "MIO[6]"] +set_property slew "slow" [get_ports "MIO[6]"] +set_property drive "8" [get_ports "MIO[6]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "MIO[6]"] +# Quad SPI Flash / qspi0_io[3]/HOLD_B / MIO[5] +set_property iostandard "LVCMOS33" [get_ports "MIO[5]"] +set_property PACKAGE_PIN "A9" [get_ports "MIO[5]"] +set_property slew "slow" [get_ports "MIO[5]"] +set_property drive "8" [get_ports "MIO[5]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[5]"] +# Quad SPI Flash / qspi0_io[2] / MIO[4] +set_property iostandard "LVCMOS33" [get_ports "MIO[4]"] +set_property PACKAGE_PIN "C8" [get_ports "MIO[4]"] +set_property slew "slow" [get_ports "MIO[4]"] +set_property drive "8" [get_ports "MIO[4]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[4]"] +# Quad SPI Flash / qspi0_io[1] / MIO[3] +set_property iostandard "LVCMOS33" [get_ports "MIO[3]"] +set_property PACKAGE_PIN "A7" [get_ports "MIO[3]"] +set_property slew "slow" [get_ports "MIO[3]"] +set_property drive "8" [get_ports "MIO[3]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[3]"] +# Quad SPI Flash / qspi0_io[0] / MIO[2] +set_property iostandard "LVCMOS33" [get_ports "MIO[2]"] +set_property PACKAGE_PIN "A8" [get_ports "MIO[2]"] +set_property slew "slow" [get_ports "MIO[2]"] +set_property drive "8" [get_ports "MIO[2]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "MIO[2]"] +# Quad SPI Flash / qspi0_ss_b / MIO[1] +set_property iostandard "LVCMOS33" [get_ports "MIO[1]"] +set_property PACKAGE_PIN "A5" [get_ports "MIO[1]"] +set_property slew "slow" [get_ports "MIO[1]"] +set_property drive "8" [get_ports "MIO[1]"] +set_property pullup "TRUE" [get_ports "MIO[1]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "MIO[1]"] +# SD 1 / cd / MIO[0] +set_property iostandard "LVCMOS33" [get_ports "MIO[0]"] +set_property PACKAGE_PIN "D8" [get_ports "MIO[0]"] +set_property slew "slow" [get_ports "MIO[0]"] +set_property drive "8" [get_ports "MIO[0]"] +set_property pullup "TRUE" [get_ports "MIO[0]"] +set_property PIO_DIRECTION "INPUT" [get_ports "MIO[0]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_VRP"] +set_property PACKAGE_PIN "H3" [get_ports "DDR_VRP"] +set_property slew "FAST" [get_ports "DDR_VRP"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_VRP"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_VRN"] +set_property PACKAGE_PIN "J3" [get_ports "DDR_VRN"] +set_property slew "FAST" [get_ports "DDR_VRN"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_VRN"] +set_property iostandard "SSTL135" [get_ports "DDR_WEB"] +set_property PACKAGE_PIN "R3" [get_ports "DDR_WEB"] +set_property slew "SLOW" [get_ports "DDR_WEB"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_WEB"] +set_property iostandard "SSTL135" [get_ports "DDR_RAS_n"] +set_property PACKAGE_PIN "R6" [get_ports "DDR_RAS_n"] +set_property slew "SLOW" [get_ports "DDR_RAS_n"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_RAS_n"] +set_property iostandard "SSTL135" [get_ports "DDR_ODT"] +set_property PACKAGE_PIN "K3" [get_ports "DDR_ODT"] +set_property slew "SLOW" [get_ports "DDR_ODT"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_ODT"] +set_property iostandard "SSTL135" [get_ports "DDR_DRSTB"] +set_property PACKAGE_PIN "L4" [get_ports "DDR_DRSTB"] +set_property slew "FAST" [get_ports "DDR_DRSTB"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DRSTB"] +set_property iostandard "DIFF_SSTL135_T_DCI" [get_ports "DDR_DQS[1]"] +set_property PACKAGE_PIN "G2" [get_ports "DDR_DQS[1]"] +set_property slew "FAST" [get_ports "DDR_DQS[1]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQS[1]"] +set_property iostandard "DIFF_SSTL135_T_DCI" [get_ports "DDR_DQS[0]"] +set_property PACKAGE_PIN "C2" [get_ports "DDR_DQS[0]"] +set_property slew "FAST" [get_ports "DDR_DQS[0]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQS[0]"] +set_property iostandard "DIFF_SSTL135_T_DCI" [get_ports "DDR_DQS_n[1]"] +set_property PACKAGE_PIN "F2" [get_ports "DDR_DQS_n[1]"] +set_property slew "FAST" [get_ports "DDR_DQS_n[1]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQS_n[1]"] +set_property iostandard "DIFF_SSTL135_T_DCI" [get_ports "DDR_DQS_n[0]"] +set_property PACKAGE_PIN "B2" [get_ports "DDR_DQS_n[0]"] +set_property slew "FAST" [get_ports "DDR_DQS_n[0]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQS_n[0]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[9]"] +set_property PACKAGE_PIN "D1" [get_ports "DDR_DQ[9]"] +set_property slew "FAST" [get_ports "DDR_DQ[9]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[9]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[8]"] +set_property PACKAGE_PIN "E1" [get_ports "DDR_DQ[8]"] +set_property slew "FAST" [get_ports "DDR_DQ[8]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[8]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[7]"] +set_property PACKAGE_PIN "A3" [get_ports "DDR_DQ[7]"] +set_property slew "FAST" [get_ports "DDR_DQ[7]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[7]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[6]"] +set_property PACKAGE_PIN "C3" [get_ports "DDR_DQ[6]"] +set_property slew "FAST" [get_ports "DDR_DQ[6]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[6]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[5]"] +set_property PACKAGE_PIN "A4" [get_ports "DDR_DQ[5]"] +set_property slew "FAST" [get_ports "DDR_DQ[5]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[5]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[4]"] +set_property PACKAGE_PIN "B4" [get_ports "DDR_DQ[4]"] +set_property slew "FAST" [get_ports "DDR_DQ[4]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[4]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[3]"] +set_property PACKAGE_PIN "C1" [get_ports "DDR_DQ[3]"] +set_property slew "FAST" [get_ports "DDR_DQ[3]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[3]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[2]"] +set_property PACKAGE_PIN "C4" [get_ports "DDR_DQ[2]"] +set_property slew "FAST" [get_ports "DDR_DQ[2]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[2]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[1]"] +set_property PACKAGE_PIN "A2" [get_ports "DDR_DQ[1]"] +set_property slew "FAST" [get_ports "DDR_DQ[1]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[1]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[15]"] +set_property PACKAGE_PIN "H2" [get_ports "DDR_DQ[15]"] +set_property slew "FAST" [get_ports "DDR_DQ[15]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[15]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[14]"] +set_property PACKAGE_PIN "H1" [get_ports "DDR_DQ[14]"] +set_property slew "FAST" [get_ports "DDR_DQ[14]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[14]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[13]"] +set_property PACKAGE_PIN "G1" [get_ports "DDR_DQ[13]"] +set_property slew "FAST" [get_ports "DDR_DQ[13]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[13]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[12]"] +set_property PACKAGE_PIN "F3" [get_ports "DDR_DQ[12]"] +set_property slew "FAST" [get_ports "DDR_DQ[12]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[12]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[11]"] +set_property PACKAGE_PIN "E3" [get_ports "DDR_DQ[11]"] +set_property slew "FAST" [get_ports "DDR_DQ[11]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[11]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[10]"] +set_property PACKAGE_PIN "E2" [get_ports "DDR_DQ[10]"] +set_property slew "FAST" [get_ports "DDR_DQ[10]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[10]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DQ[0]"] +set_property PACKAGE_PIN "D4" [get_ports "DDR_DQ[0]"] +set_property slew "FAST" [get_ports "DDR_DQ[0]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DQ[0]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DM[1]"] +set_property PACKAGE_PIN "D3" [get_ports "DDR_DM[1]"] +set_property slew "FAST" [get_ports "DDR_DM[1]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DM[1]"] +set_property iostandard "SSTL135_T_DCI" [get_ports "DDR_DM[0]"] +set_property PACKAGE_PIN "B1" [get_ports "DDR_DM[0]"] +set_property slew "FAST" [get_ports "DDR_DM[0]"] +set_property PIO_DIRECTION "BIDIR" [get_ports "DDR_DM[0]"] +set_property iostandard "SSTL135" [get_ports "DDR_CS_n"] +set_property PACKAGE_PIN "R2" [get_ports "DDR_CS_n"] +set_property slew "SLOW" [get_ports "DDR_CS_n"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_CS_n"] +set_property iostandard "SSTL135" [get_ports "DDR_CKE"] +set_property PACKAGE_PIN "L3" [get_ports "DDR_CKE"] +set_property slew "SLOW" [get_ports "DDR_CKE"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_CKE"] +set_property iostandard "DIFF_SSTL135" [get_ports "DDR_Clk"] +set_property PACKAGE_PIN "N3" [get_ports "DDR_Clk"] +set_property slew "FAST" [get_ports "DDR_Clk"] +set_property PIO_DIRECTION "INPUT" [get_ports "DDR_Clk"] +set_property iostandard "DIFF_SSTL135" [get_ports "DDR_Clk_n"] +set_property PACKAGE_PIN "N2" [get_ports "DDR_Clk_n"] +set_property slew "FAST" [get_ports "DDR_Clk_n"] +set_property PIO_DIRECTION "INPUT" [get_ports "DDR_Clk_n"] +set_property iostandard "SSTL135" [get_ports "DDR_CAS_n"] +set_property PACKAGE_PIN "R5" [get_ports "DDR_CAS_n"] +set_property slew "SLOW" [get_ports "DDR_CAS_n"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_CAS_n"] +set_property iostandard "SSTL135" [get_ports "DDR_BankAddr[2]"] +set_property PACKAGE_PIN "N6" [get_ports "DDR_BankAddr[2]"] +set_property slew "SLOW" [get_ports "DDR_BankAddr[2]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_BankAddr[2]"] +set_property iostandard "SSTL135" [get_ports "DDR_BankAddr[1]"] +set_property PACKAGE_PIN "R1" [get_ports "DDR_BankAddr[1]"] +set_property slew "SLOW" [get_ports "DDR_BankAddr[1]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_BankAddr[1]"] +set_property iostandard "SSTL135" [get_ports "DDR_BankAddr[0]"] +set_property PACKAGE_PIN "M6" [get_ports "DDR_BankAddr[0]"] +set_property slew "SLOW" [get_ports "DDR_BankAddr[0]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_BankAddr[0]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[9]"] +set_property PACKAGE_PIN "N4" [get_ports "DDR_Addr[9]"] +set_property slew "SLOW" [get_ports "DDR_Addr[9]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[9]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[8]"] +set_property PACKAGE_PIN "P6" [get_ports "DDR_Addr[8]"] +set_property slew "SLOW" [get_ports "DDR_Addr[8]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[8]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[7]"] +set_property PACKAGE_PIN "M5" [get_ports "DDR_Addr[7]"] +set_property slew "SLOW" [get_ports "DDR_Addr[7]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[7]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[6]"] +set_property PACKAGE_PIN "P5" [get_ports "DDR_Addr[6]"] +set_property slew "SLOW" [get_ports "DDR_Addr[6]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[6]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[5]"] +set_property PACKAGE_PIN "P4" [get_ports "DDR_Addr[5]"] +set_property slew "SLOW" [get_ports "DDR_Addr[5]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[5]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[4]"] +set_property PACKAGE_PIN "P3" [get_ports "DDR_Addr[4]"] +set_property slew "SLOW" [get_ports "DDR_Addr[4]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[4]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[3]"] +set_property PACKAGE_PIN "M4" [get_ports "DDR_Addr[3]"] +set_property slew "SLOW" [get_ports "DDR_Addr[3]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[3]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[2]"] +set_property PACKAGE_PIN "M1" [get_ports "DDR_Addr[2]"] +set_property slew "SLOW" [get_ports "DDR_Addr[2]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[2]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[1]"] +set_property PACKAGE_PIN "N1" [get_ports "DDR_Addr[1]"] +set_property slew "SLOW" [get_ports "DDR_Addr[1]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[1]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[14]"] +set_property PACKAGE_PIN "K1" [get_ports "DDR_Addr[14]"] +set_property slew "SLOW" [get_ports "DDR_Addr[14]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[14]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[13]"] +set_property PACKAGE_PIN "K2" [get_ports "DDR_Addr[13]"] +set_property slew "SLOW" [get_ports "DDR_Addr[13]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[13]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[12]"] +set_property PACKAGE_PIN "M2" [get_ports "DDR_Addr[12]"] +set_property slew "SLOW" [get_ports "DDR_Addr[12]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[12]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[11]"] +set_property PACKAGE_PIN "L2" [get_ports "DDR_Addr[11]"] +set_property slew "SLOW" [get_ports "DDR_Addr[11]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[11]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[10]"] +set_property PACKAGE_PIN "J1" [get_ports "DDR_Addr[10]"] +set_property slew "SLOW" [get_ports "DDR_Addr[10]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[10]"] +set_property iostandard "SSTL135" [get_ports "DDR_Addr[0]"] +set_property PACKAGE_PIN "P1" [get_ports "DDR_Addr[0]"] +set_property slew "SLOW" [get_ports "DDR_Addr[0]"] +set_property PIO_DIRECTION "OUTPUT" [get_ports "DDR_Addr[0]"] +set_property iostandard "LVCMOS33" [get_ports "PS_PORB"] +set_property PACKAGE_PIN "C9" [get_ports "PS_PORB"] +set_property slew "fast" [get_ports "PS_PORB"] +set_property iostandard "LVCMOS33" [get_ports "PS_SRSTB"] +set_property PACKAGE_PIN "B11" [get_ports "PS_SRSTB"] +set_property slew "fast" [get_ports "PS_SRSTB"] +set_property iostandard "LVCMOS33" [get_ports "PS_CLK"] +set_property PACKAGE_PIN "C7" [get_ports "PS_CLK"] +set_property slew "fast" [get_ports "PS_CLK"] + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xml b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xml new file mode 100644 index 0000000..0f78fce --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0.xml @@ -0,0 +1,39167 @@ + + + xilinx.com + customized_ip + design_1_processing_system7_0_0 + 1.0 + + + GMII_ETHERNET_0 + + + + + + + TX_EN + + + ENET0_GMII_TX_EN + + + + + TX_ER + + + ENET0_GMII_TX_ER + + + + + TXD + + + ENET0_GMII_TXD + + + + + COL + + + ENET0_GMII_COL + + + + + CRS + + + ENET0_GMII_CRS + + + + + RX_CLK + + + ENET0_GMII_RX_CLK + + + + + RX_DV + + + ENET0_GMII_RX_DV + + + + + RX_ER + + + ENET0_GMII_RX_ER + + + + + TX_CLK + + + ENET0_GMII_TX_CLK + + + + + RXD + + + ENET0_GMII_RXD + + + + + + + false + + + + + + MDIO_ETHERNET_0 + + + + + + + MDC + + + ENET0_MDIO_MDC + + + + + MDIO_O + + + ENET0_MDIO_O + + + + + MDIO_T + + + ENET0_MDIO_T + + + + + MDIO_I + + + ENET0_MDIO_I + + + + + + CAN_DEBUG + false + + + none + + + + + + + + false + + + + + + PTP_ETHERNET_0 + + + + + + + DELAY_REQ_RX + + + ENET0_PTP_DELAY_REQ_RX + + + + + DELAY_REQ_TX + + + ENET0_PTP_DELAY_REQ_TX + + + + + PDELAY_REQ_RX + + + ENET0_PTP_PDELAY_REQ_RX + + + + + PDELAY_REQ_TX + + + ENET0_PTP_PDELAY_REQ_TX + + + + + PDELAY_RESP_RX + + + ENET0_PTP_PDELAY_RESP_RX + + + + + PDELAY_RESP_TX + + + ENET0_PTP_PDELAY_RESP_TX + + + + + SYNC_FRAME_RX + + + ENET0_PTP_SYNC_FRAME_RX + + + + + SYNC_FRAME_TX + + + ENET0_PTP_SYNC_FRAME_TX + + + + + SOF_RX + + + ENET0_SOF_RX + + + + + SOF_TX + + + ENET0_SOF_TX + + + + + + + false + + + + + + ENET0_EXT_INTIN + + + + + + + INTERRUPT + + + ENET0_EXT_INTIN + + + + + + SENSITIVITY + LEVEL_HIGH + + + none + + + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + GMII_ETHERNET_1 + + + + + + + TX_EN + + + ENET1_GMII_TX_EN + + + + + TX_ER + + + ENET1_GMII_TX_ER + + + + + TXD + + + ENET1_GMII_TXD + + + + + COL + + + ENET1_GMII_COL + + + + + CRS + + + ENET1_GMII_CRS + + + + + RX_CLK + + + ENET1_GMII_RX_CLK + + + + + RX_DV + + + ENET1_GMII_RX_DV + + + + + RX_ER + + + ENET1_GMII_RX_ER + + + + + TX_CLK + + + ENET1_GMII_TX_CLK + + + + + RXD + + + ENET1_GMII_RXD + + + + + + + false + + + + + + MDIO_ETHERNET_1 + + + + + + + MDC + + + ENET1_MDIO_MDC + + + + + MDIO_O + + + ENET1_MDIO_O + + + + + MDIO_T + + + ENET1_MDIO_T + + + + + MDIO_I + + + ENET1_MDIO_I + + + + + + CAN_DEBUG + false + + + none + + + + + + + + false + + + + + + PTP_ETHERNET_1 + + + + + + + DELAY_REQ_RX + + + ENET1_PTP_DELAY_REQ_RX + + + + + DELAY_REQ_TX + + + ENET1_PTP_DELAY_REQ_TX + + + + + PDELAY_REQ_RX + + + ENET1_PTP_PDELAY_REQ_RX + + + + + PDELAY_REQ_TX + + + ENET1_PTP_PDELAY_REQ_TX + + + + + PDELAY_RESP_RX + + + ENET1_PTP_PDELAY_RESP_RX + + + + + PDELAY_RESP_TX + + + ENET1_PTP_PDELAY_RESP_TX + + + + + SYNC_FRAME_RX + + + ENET1_PTP_SYNC_FRAME_RX + + + + + SYNC_FRAME_TX + + + ENET1_PTP_SYNC_FRAME_TX + + + + + SOF_RX + + + ENET1_SOF_RX + + + + + SOF_TX + + + ENET1_SOF_TX + + + + + + + false + + + + + + ENET1_EXT_INTIN + + + + + + + INTERRUPT + + + ENET1_EXT_INTIN + + + + + + SENSITIVITY + LEVEL_HIGH + + + none + + + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + GPIO_0 + + + + + + + TRI_I + + + GPIO_I + + + + + TRI_O + + + GPIO_O + + + + + TRI_T + + + GPIO_T + + + + + + + true + + + + + + DDR + + + + + + + CAS_N + + + DDR_CAS_n + + + + + CKE + + + DDR_CKE + + + + + CK_N + + + DDR_Clk_n + + + + + CK_P + + + DDR_Clk + + + + + CS_N + + + DDR_CS_n + + + + + RESET_N + + + DDR_DRSTB + + + + + ODT + + + DDR_ODT + + + + + RAS_N + + + DDR_RAS_n + + + + + WE_N + + + DDR_WEB + + + + + BA + + + DDR_BankAddr + + + + + ADDR + + + DDR_Addr + + + + + DM + + + DDR_DM + + + + + DQ + + + DDR_DQ + + + + + DQS_N + + + DDR_DQS_n + + + + + DQS_P + + + DDR_DQS + + + + + + CAN_DEBUG + false + + + none + + + + + TIMEPERIOD_PS + 1250 + + + none + + + + + MEMORY_TYPE + COMPONENTS + + + none + + + + + MEMORY_PART + + + + none + + + + + DATA_WIDTH + 8 + + + none + + + + + CS_ENABLED + true + + + none + + + + + DATA_MASK_ENABLED + true + + + none + + + + + SLOT + Single + + + none + + + + + CUSTOM_PARTS + + + + none + + + + + MEM_ADDR_MAP + ROW_COLUMN_BANK + + + none + + + + + BURST_LENGTH + 8 + + + none + + + + + AXI_ARBITRATION_SCHEME + TDM + + + none + + + + + CAS_LATENCY + 11 + + + none + + + + + CAS_WRITE_LATENCY + 11 + + + none + + + + + + + + true + + + + + + FIXED_IO + + + + + + + MIO + + + MIO + + + + + DDR_VRN + + + DDR_VRN + + + + + DDR_VRP + + + DDR_VRP + + + + + PS_SRSTB + + + PS_SRSTB + + + + + PS_CLK + + + PS_CLK + + + + + PS_PORB + + + PS_PORB + + + + + + CAN_DEBUG + false + + + none + + + + + + + UART_0 + + + + + + + DTRn + + + UART0_DTRN + + + + + RTSn + + + UART0_RTSN + + + + + TxD + + + UART0_TX + + + + + CTSn + + + UART0_CTSN + + + + + DCDn + + + UART0_DCDN + + + + + DSRn + + + UART0_DSRN + + + + + RI + + + UART0_RIN + + + + + RxD + + + UART0_RX + + + + + + + true + + + + + + UART_1 + + + + + + + DTRn + + + UART1_DTRN + + + + + RTSn + + + UART1_RTSN + + + + + TxD + + + UART1_TX + + + + + CTSn + + + UART1_CTSN + + + + + DCDn + + + UART1_DCDN + + + + + DSRn + + + UART1_DSRN + + + + + RI + + + UART1_RIN + + + + + RxD + + + UART1_RX + + + + + + + false + + + + + + IIC_0 + + + + + + + SDA_I + + + I2C0_SDA_I + + + + + SDA_O + + + I2C0_SDA_O + + + + + SDA_T + + + I2C0_SDA_T + + + + + SCL_I + + + I2C0_SCL_I + + + + + SCL_O + + + I2C0_SCL_O + + + + + SCL_T + + + I2C0_SCL_T + + + + + + + true + + + + + + IIC_1 + + + + + + + SDA_I + + + I2C1_SDA_I + + + + + SDA_O + + + I2C1_SDA_O + + + + + SDA_T + + + I2C1_SDA_T + + + + + SCL_I + + + I2C1_SCL_I + + + + + SCL_O + + + I2C1_SCL_O + + + + + SCL_T + + + I2C1_SCL_T + + + + + + + false + + + + + + SPI_0 + + + + + + + SCK_I + + + SPI0_SCLK_I + + + + + SCK_O + + + SPI0_SCLK_O + + + + + SCK_T + + + SPI0_SCLK_T + + + + + IO0_I + + + SPI0_MOSI_I + + + + + IO0_O + + + SPI0_MOSI_O + + + + + IO0_T + + + SPI0_MOSI_T + + + + + IO1_I + + + SPI0_MISO_I + + + + + IO1_O + + + SPI0_MISO_O + + + + + IO1_T + + + SPI0_MISO_T + + + + + SS_I + + + SPI0_SS_I + + + + + SS_O + + + SPI0_SS_O + + + + + SS1_O + + + SPI0_SS1_O + + + + + SS2_O + + + SPI0_SS2_O + + + + + SS_T + + + SPI0_SS_T + + + + + + + true + + + + + + SPI_1 + + + + + + + SCK_I + + + SPI1_SCLK_I + + + + + SCK_O + + + SPI1_SCLK_O + + + + + SCK_T + + + SPI1_SCLK_T + + + + + IO0_I + + + SPI1_MOSI_I + + + + + IO0_O + + + SPI1_MOSI_O + + + + + IO0_T + + + SPI1_MOSI_T + + + + + IO1_I + + + SPI1_MISO_I + + + + + IO1_O + + + SPI1_MISO_O + + + + + IO1_T + + + SPI1_MISO_T + + + + + SS_I + + + SPI1_SS_I + + + + + SS_O + + + SPI1_SS_O + + + + + SS1_O + + + SPI1_SS1_O + + + + + SS2_O + + + SPI1_SS2_O + + + + + SS_T + + + SPI1_SS_T + + + + + + + true + + + + + + CAN_0 + + + + + + + TX + + + CAN0_PHY_TX + + + + + RX + + + CAN0_PHY_RX + + + + + + + false + + + + + + CAN_1 + + + + + + + TX + + + CAN1_PHY_TX + + + + + RX + + + CAN1_PHY_RX + + + + + + + false + + + + + + PJTAG + + + + + + + TCK + + + PJTAG_TCK + + + + + TMS + + + PJTAG_TMS + + + + + TDI + + + PJTAG_TDI + + + + + TDO + + + PJTAG_TDO + + + + + + + false + + + + + + SDIO_0 + + + + + + + CLK + + + SDIO0_CLK + + + + + CLK_FB + + + SDIO0_CLK_FB + + + + + CMD_O + + + SDIO0_CMD_O + + + + + CMD_I + + + SDIO0_CMD_I + + + + + CMD_T + + + SDIO0_CMD_T + + + + + DATA_I + + + SDIO0_DATA_I + + + + + DATA_O + + + SDIO0_DATA_O + + + + + DATA_T + + + SDIO0_DATA_T + + + + + LED + + + SDIO0_LED + + + + + CDN + + + SDIO0_CDN + + + + + WP + + + SDIO0_WP + + + + + BUSPOW + + + SDIO0_BUSPOW + + + + + BUSVOLT + + + SDIO0_BUSVOLT + + + + + + + true + + + + + + SDIO_1 + + + + + + + CLK + + + SDIO1_CLK + + + + + CLK_FB + + + SDIO1_CLK_FB + + + + + CMD_O + + + SDIO1_CMD_O + + + + + CMD_I + + + SDIO1_CMD_I + + + + + CMD_T + + + SDIO1_CMD_T + + + + + DATA_I + + + SDIO1_DATA_I + + + + + DATA_O + + + SDIO1_DATA_O + + + + + DATA_T + + + SDIO1_DATA_T + + + + + LED + + + SDIO1_LED + + + + + CDN + + + SDIO1_CDN + + + + + WP + + + SDIO1_WP + + + + + BUSPOW + + + SDIO1_BUSPOW + + + + + BUSVOLT + + + SDIO1_BUSVOLT + + + + + + + false + + + + + + TRACE_0 + + + + + + + CLK_O + + + TRACE_CLK_OUT + + + + + CLK_I + + + TRACE_CLK + + + + + CTL + + + TRACE_CTL + + + + + DATA + + + TRACE_DATA + + + + + + + false + + + + + + USBIND_0 + + + + + + + PORT_INDCTL + + + USB0_PORT_INDCTL + + + + + VBUS_PWRSELECT + + + USB0_VBUS_PWRSELECT + + + + + VBUS_PWRFAULT + + + USB0_VBUS_PWRFAULT + + + + + + + true + + + + + + USBIND_1 + + + + + + + PORT_INDCTL + + + USB1_PORT_INDCTL + + + + + VBUS_PWRSELECT + + + USB1_VBUS_PWRSELECT + + + + + VBUS_PWRFAULT + + + USB1_VBUS_PWRFAULT + + + + + + + false + + + + + + S_AXI_HP0_FIFO_CTRL + + + + + + + RCOUNT + + + S_AXI_HP0_RCOUNT + + + + + WCOUNT + + + S_AXI_HP0_WCOUNT + + + + + RACOUNT + + + S_AXI_HP0_RACOUNT + + + + + WACOUNT + + + S_AXI_HP0_WACOUNT + + + + + RDISSUECAPEN + + + S_AXI_HP0_RDISSUECAP1_EN + + + + + WRISSUECAPEN + + + S_AXI_HP0_WRISSUECAP1_EN + + + + + + + false + + + + + + S_AXI_HP1_FIFO_CTRL + + + + + + + RCOUNT + + + S_AXI_HP1_RCOUNT + + + + + WCOUNT + + + S_AXI_HP1_WCOUNT + + + + + RACOUNT + + + S_AXI_HP1_RACOUNT + + + + + WACOUNT + + + S_AXI_HP1_WACOUNT + + + + + RDISSUECAPEN + + + S_AXI_HP1_RDISSUECAP1_EN + + + + + WRISSUECAPEN + + + S_AXI_HP1_WRISSUECAP1_EN + + + + + + + false + + + + + + S_AXI_HP2_FIFO_CTRL + + + + + + + RCOUNT + + + S_AXI_HP2_RCOUNT + + + + + WCOUNT + + + S_AXI_HP2_WCOUNT + + + + + RACOUNT + + + S_AXI_HP2_RACOUNT + + + + + WACOUNT + + + S_AXI_HP2_WACOUNT + + + + + RDISSUECAPEN + + + S_AXI_HP2_RDISSUECAP1_EN + + + + + WRISSUECAPEN + + + S_AXI_HP2_WRISSUECAP1_EN + + + + + + + false + + + + + + S_AXI_HP3_FIFO_CTRL + + + + + + + RCOUNT + + + S_AXI_HP3_RCOUNT + + + + + WCOUNT + + + S_AXI_HP3_WCOUNT + + + + + RACOUNT + + + S_AXI_HP3_RACOUNT + + + + + WACOUNT + + + S_AXI_HP3_WACOUNT + + + + + RDISSUECAPEN + + + S_AXI_HP3_RDISSUECAP1_EN + + + + + WRISSUECAPEN + + + S_AXI_HP3_WRISSUECAP1_EN + + + + + + + false + + + + + + DMA0_REQ + + + + + + + TREADY + + + DMA0_DRREADY + + + + + TLAST + + + DMA0_DRLAST + + + + + TVALID + + + DMA0_DRVALID + + + + + TUSER + + + DMA0_DRTYPE + + + + + + TDATA_NUM_BYTES + 1 + + + none + + + + + TDEST_WIDTH + 0 + + + none + + + + + TID_WIDTH + 0 + + + none + + + + + TUSER_WIDTH + 0 + + + none + + + + + HAS_TREADY + 1 + + + none + + + + + HAS_TSTRB + 0 + + + none + + + + + HAS_TKEEP + 0 + + + none + + + + + HAS_TLAST + 0 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + LAYERED_METADATA + undef + + + none + + + + + + + + false + + + + + + DMA0_ACK + + + + + + + TUSER + + + DMA0_DATYPE + + + + + TVALID + + + DMA0_DAVALID + + + + + TREADY + + + DMA0_DAREADY + + + + + + TDATA_NUM_BYTES + 1 + + + none + + + + + TDEST_WIDTH + 0 + + + none + + + + + TID_WIDTH + 0 + + + none + + + + + TUSER_WIDTH + 0 + + + none + + + + + HAS_TREADY + 1 + + + none + + + + + HAS_TSTRB + 0 + + + none + + + + + HAS_TKEEP + 0 + + + none + + + + + HAS_TLAST + 0 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + LAYERED_METADATA + undef + + + none + + + + + + + + false + + + + + + DMA1_REQ + + + + + + + TREADY + + + DMA1_DRREADY + + + + + TLAST + + + DMA1_DRLAST + + + + + TVALID + + + DMA1_DRVALID + + + + + TUSER + + + DMA1_DRTYPE + + + + + + TDATA_NUM_BYTES + 1 + + + none + + + + + TDEST_WIDTH + 0 + + + none + + + + + TID_WIDTH + 0 + + + none + + + + + TUSER_WIDTH + 0 + + + none + + + + + HAS_TREADY + 1 + + + none + + + + + HAS_TSTRB + 0 + + + none + + + + + HAS_TKEEP + 0 + + + none + + + + + HAS_TLAST + 0 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + LAYERED_METADATA + undef + + + none + + + + + + + + false + + + + + + DMA1_ACK + + + + + + + TUSER + + + DMA1_DATYPE + + + + + TVALID + + + DMA1_DAVALID + + + + + TREADY + + + DMA1_DAREADY + + + + + + TDATA_NUM_BYTES + 1 + + + none + + + + + TDEST_WIDTH + 0 + + + none + + + + + TID_WIDTH + 0 + + + none + + + + + TUSER_WIDTH + 0 + + + none + + + + + HAS_TREADY + 1 + + + none + + + + + HAS_TSTRB + 0 + + + none + + + + + HAS_TKEEP + 0 + + + none + + + + + HAS_TLAST + 0 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + LAYERED_METADATA + undef + + + none + + + + + + + + false + + + + + + DMA2_REQ + + + + + + + TREADY + + + DMA2_DRREADY + + + + + TLAST + + + DMA2_DRLAST + + + + + TVALID + + + DMA2_DRVALID + + + + + TUSER + + + DMA2_DRTYPE + + + + + + TDATA_NUM_BYTES + 1 + + + none + + + + + TDEST_WIDTH + 0 + + + none + + + + + TID_WIDTH + 0 + + + none + + + + + TUSER_WIDTH + 0 + + + none + + + + + HAS_TREADY + 1 + + + none + + + + + HAS_TSTRB + 0 + + + none + + + + + HAS_TKEEP + 0 + + + none + + + + + HAS_TLAST + 0 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + LAYERED_METADATA + undef + + + none + + + + + + + + false + + + + + + DMA2_ACK + + + + + + + TUSER + + + DMA2_DATYPE + + + + + TVALID + + + DMA2_DAVALID + + + + + TREADY + + + DMA2_DAREADY + + + + + + TDATA_NUM_BYTES + 1 + + + none + + + + + TDEST_WIDTH + 0 + + + none + + + + + TID_WIDTH + 0 + + + none + + + + + TUSER_WIDTH + 0 + + + none + + + + + HAS_TREADY + 1 + + + none + + + + + HAS_TSTRB + 0 + + + none + + + + + HAS_TKEEP + 0 + + + none + + + + + HAS_TLAST + 0 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + LAYERED_METADATA + undef + + + none + + + + + + + + false + + + + + + DMA3_REQ + + + + + + + TREADY + + + DMA3_DRREADY + + + + + TLAST + + + DMA3_DRLAST + + + + + TVALID + + + DMA3_DRVALID + + + + + TUSER + + + DMA3_DRTYPE + + + + + + TDATA_NUM_BYTES + 1 + + + none + + + + + TDEST_WIDTH + 0 + + + none + + + + + TID_WIDTH + 0 + + + none + + + + + TUSER_WIDTH + 0 + + + none + + + + + HAS_TREADY + 1 + + + none + + + + + HAS_TSTRB + 0 + + + none + + + + + HAS_TKEEP + 0 + + + none + + + + + HAS_TLAST + 0 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + LAYERED_METADATA + undef + + + none + + + + + + + + false + + + + + + DMA3_ACK + + + + + + + TUSER + + + DMA3_DATYPE + + + + + TVALID + + + DMA3_DAVALID + + + + + TREADY + + + DMA3_DAREADY + + + + + + TDATA_NUM_BYTES + 1 + + + none + + + + + TDEST_WIDTH + 0 + + + none + + + + + TID_WIDTH + 0 + + + none + + + + + TUSER_WIDTH + 0 + + + none + + + + + HAS_TREADY + 1 + + + none + + + + + HAS_TSTRB + 0 + + + none + + + + + HAS_TKEEP + 0 + + + none + + + + + HAS_TLAST + 0 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + LAYERED_METADATA + undef + + + none + + + + + + + + false + + + + + + FTM_TRACE_DATA + + + + + + + TDATA + + + FTMD_TRACEIN_DATA + + + + + TVALID + + + FTMD_TRACEIN_VALID + + + + + TID + + + FTMD_TRACEIN_ATID + + + + + + TDATA_NUM_BYTES + 1 + + + none + + + + + TDEST_WIDTH + 0 + + + none + + + + + TID_WIDTH + 0 + + + none + + + + + TUSER_WIDTH + 0 + + + none + + + + + HAS_TREADY + 1 + + + none + + + + + HAS_TSTRB + 0 + + + none + + + + + HAS_TKEEP + 0 + + + none + + + + + HAS_TLAST + 0 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + LAYERED_METADATA + undef + + + none + + + + + + + + false + + + + + + PROC_EVENT + + + + + + + EVENTO + + + EVENT_EVENTO + + + + + STANDBYWFE + + + EVENT_STANDBYWFE + + + + + STANDBYWFI + + + EVENT_STANDBYWFI + + + + + EVENTI + + + EVENT_EVENTI + + + + + + + false + + + + + + M_AXI_GP0 + + + + + 0x40000000 + + + + + + ARVALID + + + M_AXI_GP0_ARVALID + + + + + AWVALID + + + M_AXI_GP0_AWVALID + + + + + BREADY + + + M_AXI_GP0_BREADY + + + + + RREADY + + + M_AXI_GP0_RREADY + + + + + WLAST + + + M_AXI_GP0_WLAST + + + + + WVALID + + + M_AXI_GP0_WVALID + + + + + ARID + + + M_AXI_GP0_ARID + + + + + AWID + + + M_AXI_GP0_AWID + + + + + WID + + + M_AXI_GP0_WID + + + + + ARBURST + + + M_AXI_GP0_ARBURST + + + + + ARLOCK + + + M_AXI_GP0_ARLOCK + + + + + ARSIZE + + + M_AXI_GP0_ARSIZE + + + + + AWBURST + + + M_AXI_GP0_AWBURST + + + + + AWLOCK + + + M_AXI_GP0_AWLOCK + + + + + AWSIZE + + + M_AXI_GP0_AWSIZE + + + + + ARPROT + + + M_AXI_GP0_ARPROT + + + + + AWPROT + + + M_AXI_GP0_AWPROT + + + + + ARADDR + + + M_AXI_GP0_ARADDR + + + + + AWADDR + + + M_AXI_GP0_AWADDR + + + + + WDATA + + + M_AXI_GP0_WDATA + + + + + ARCACHE + + + M_AXI_GP0_ARCACHE + + + + + ARLEN + + + M_AXI_GP0_ARLEN + + + + + ARQOS + + + M_AXI_GP0_ARQOS + + + + + AWCACHE + + + M_AXI_GP0_AWCACHE + + + + + AWLEN + + + M_AXI_GP0_AWLEN + + + + + AWQOS + + + M_AXI_GP0_AWQOS + + + + + WSTRB + + + M_AXI_GP0_WSTRB + + + + + ARREADY + + + M_AXI_GP0_ARREADY + + + + + AWREADY + + + M_AXI_GP0_AWREADY + + + + + BVALID + + + M_AXI_GP0_BVALID + + + + + RLAST + + + M_AXI_GP0_RLAST + + + + + RVALID + + + M_AXI_GP0_RVALID + + + + + WREADY + + + M_AXI_GP0_WREADY + + + + + BID + + + M_AXI_GP0_BID + + + + + RID + + + M_AXI_GP0_RID + + + + + BRESP + + + M_AXI_GP0_BRESP + + + + + RRESP + + + M_AXI_GP0_RRESP + + + + + RDATA + + + M_AXI_GP0_RDATA + + + + + + SUPPORTS_NARROW_BURST + 0 + + + + true + + + + + + NUM_WRITE_OUTSTANDING + NUM WRITE OUTSTANDING + 8 + + + NUM_READ_OUTSTANDING + NUM READ OUTSTANDING + 8 + + + DATA_WIDTH + 32 + + + none + + + + + PROTOCOL + AXI3 + + + none + + + + + FREQ_HZ + 50000000 + + + none + + + + + ID_WIDTH + 12 + + + none + + + + + ADDR_WIDTH + 32 + + + none + + + + + AWUSER_WIDTH + 0 + + + none + + + + + ARUSER_WIDTH + 0 + + + none + + + + + WUSER_WIDTH + 0 + + + none + + + + + RUSER_WIDTH + 0 + + + none + + + + + BUSER_WIDTH + 0 + + + none + + + + + READ_WRITE_MODE + READ_WRITE + + + none + + + + + HAS_BURST + 1 + + + none + + + + + HAS_LOCK + 1 + + + none + + + + + HAS_PROT + 1 + + + none + + + + + HAS_CACHE + 1 + + + none + + + + + HAS_QOS + 1 + + + none + + + + + HAS_REGION + 0 + + + none + + + + + HAS_WSTRB + 1 + + + none + + + + + HAS_BRESP + 1 + + + none + + + + + HAS_RRESP + 1 + + + none + + + + + MAX_BURST_LENGTH + 16 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + design_1_processing_system7_0_0_FCLK_CLK0 + + + none + + + + + NUM_READ_THREADS + 4 + + + none + + + + + NUM_WRITE_THREADS + 4 + + + none + + + + + RUSER_BITS_PER_BYTE + 0 + + + none + + + + + WUSER_BITS_PER_BYTE + 0 + + + none + + + + + + + + true + + + + + + M_AXI_GP1 + + + + + 0x80000000 + + + + + + ARVALID + + + M_AXI_GP1_ARVALID + + + + + AWVALID + + + M_AXI_GP1_AWVALID + + + + + BREADY + + + M_AXI_GP1_BREADY + + + + + RREADY + + + M_AXI_GP1_RREADY + + + + + WLAST + + + M_AXI_GP1_WLAST + + + + + WVALID + + + M_AXI_GP1_WVALID + + + + + ARID + + + M_AXI_GP1_ARID + + + + + AWID + + + M_AXI_GP1_AWID + + + + + WID + + + M_AXI_GP1_WID + + + + + ARBURST + + + M_AXI_GP1_ARBURST + + + + + ARLOCK + + + M_AXI_GP1_ARLOCK + + + + + ARSIZE + + + M_AXI_GP1_ARSIZE + + + + + AWBURST + + + M_AXI_GP1_AWBURST + + + + + AWLOCK + + + M_AXI_GP1_AWLOCK + + + + + AWSIZE + + + M_AXI_GP1_AWSIZE + + + + + ARPROT + + + M_AXI_GP1_ARPROT + + + + + AWPROT + + + M_AXI_GP1_AWPROT + + + + + ARADDR + + + M_AXI_GP1_ARADDR + + + + + AWADDR + + + M_AXI_GP1_AWADDR + + + + + WDATA + + + M_AXI_GP1_WDATA + + + + + ARCACHE + + + M_AXI_GP1_ARCACHE + + + + + ARLEN + + + M_AXI_GP1_ARLEN + + + + + ARQOS + + + M_AXI_GP1_ARQOS + + + + + AWCACHE + + + M_AXI_GP1_AWCACHE + + + + + AWLEN + + + M_AXI_GP1_AWLEN + + + + + AWQOS + + + M_AXI_GP1_AWQOS + + + + + WSTRB + + + M_AXI_GP1_WSTRB + + + + + ARREADY + + + M_AXI_GP1_ARREADY + + + + + AWREADY + + + M_AXI_GP1_AWREADY + + + + + BVALID + + + M_AXI_GP1_BVALID + + + + + RLAST + + + M_AXI_GP1_RLAST + + + + + RVALID + + + M_AXI_GP1_RVALID + + + + + WREADY + + + M_AXI_GP1_WREADY + + + + + BID + + + M_AXI_GP1_BID + + + + + RID + + + M_AXI_GP1_RID + + + + + BRESP + + + M_AXI_GP1_BRESP + + + + + RRESP + + + M_AXI_GP1_RRESP + + + + + RDATA + + + M_AXI_GP1_RDATA + + + + + + NUM_WRITE_OUTSTANDING + NUM WRITE OUTSTANDING + 8 + + + NUM_READ_OUTSTANDING + NUM READ OUTSTANDING + 8 + + + SUPPORTS_NARROW_BURST + 0 + + + + false + + + + + + DATA_WIDTH + 32 + + + none + + + + + PROTOCOL + AXI4 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + ID_WIDTH + 0 + + + none + + + + + ADDR_WIDTH + 32 + + + none + + + + + AWUSER_WIDTH + 0 + + + none + + + + + ARUSER_WIDTH + 0 + + + none + + + + + WUSER_WIDTH + 0 + + + none + + + + + RUSER_WIDTH + 0 + + + none + + + + + BUSER_WIDTH + 0 + + + none + + + + + READ_WRITE_MODE + READ_WRITE + + + none + + + + + HAS_BURST + 1 + + + none + + + + + HAS_LOCK + 1 + + + none + + + + + HAS_PROT + 1 + + + none + + + + + HAS_CACHE + 1 + + + none + + + + + HAS_QOS + 1 + + + none + + + + + HAS_REGION + 1 + + + none + + + + + HAS_WSTRB + 1 + + + none + + + + + HAS_BRESP + 1 + + + none + + + + + HAS_RRESP + 1 + + + none + + + + + MAX_BURST_LENGTH + 256 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + NUM_READ_THREADS + 1 + + + none + + + + + NUM_WRITE_THREADS + 1 + + + none + + + + + RUSER_BITS_PER_BYTE + 0 + + + none + + + + + WUSER_BITS_PER_BYTE + 0 + + + none + + + + + + + + false + + + + + + S_AXI_ACP + + + + + + + + + ARREADY + + + S_AXI_ACP_ARREADY + + + + + AWREADY + + + S_AXI_ACP_AWREADY + + + + + BVALID + + + S_AXI_ACP_BVALID + + + + + RLAST + + + S_AXI_ACP_RLAST + + + + + RVALID + + + S_AXI_ACP_RVALID + + + + + WREADY + + + S_AXI_ACP_WREADY + + + + + BRESP + + + S_AXI_ACP_BRESP + + + + + RRESP + + + S_AXI_ACP_RRESP + + + + + BID + + + S_AXI_ACP_BID + + + + + RID + + + S_AXI_ACP_RID + + + + + RDATA + + + S_AXI_ACP_RDATA + + + + + ARVALID + + + S_AXI_ACP_ARVALID + + + + + AWVALID + + + S_AXI_ACP_AWVALID + + + + + BREADY + + + S_AXI_ACP_BREADY + + + + + RREADY + + + S_AXI_ACP_RREADY + + + + + WLAST + + + S_AXI_ACP_WLAST + + + + + WVALID + + + S_AXI_ACP_WVALID + + + + + ARID + + + S_AXI_ACP_ARID + + + + + ARPROT + + + S_AXI_ACP_ARPROT + + + + + AWID + + + S_AXI_ACP_AWID + + + + + AWPROT + + + S_AXI_ACP_AWPROT + + + + + WID + + + S_AXI_ACP_WID + + + + + ARADDR + + + S_AXI_ACP_ARADDR + + + + + AWADDR + + + S_AXI_ACP_AWADDR + + + + + ARCACHE + + + S_AXI_ACP_ARCACHE + + + + + ARLEN + + + S_AXI_ACP_ARLEN + + + + + ARQOS + + + S_AXI_ACP_ARQOS + + + + + AWCACHE + + + S_AXI_ACP_AWCACHE + + + + + AWLEN + + + S_AXI_ACP_AWLEN + + + + + AWQOS + + + S_AXI_ACP_AWQOS + + + + + ARBURST + + + S_AXI_ACP_ARBURST + + + + + ARLOCK + + + S_AXI_ACP_ARLOCK + + + + + ARSIZE + + + S_AXI_ACP_ARSIZE + + + + + AWBURST + + + S_AXI_ACP_AWBURST + + + + + AWLOCK + + + S_AXI_ACP_AWLOCK + + + + + AWSIZE + + + S_AXI_ACP_AWSIZE + + + + + ARUSER + + + S_AXI_ACP_ARUSER + + + + + AWUSER + + + S_AXI_ACP_AWUSER + + + + + WDATA + + + S_AXI_ACP_WDATA + + + + + WSTRB + + + S_AXI_ACP_WSTRB + + + + + + NUM_WRITE_OUTSTANDING + NUM WRITE OUTSTANDING + 8 + + + NUM_READ_OUTSTANDING + NUM READ OUTSTANDING + 8 + + + DATA_WIDTH + 32 + + + none + + + + + PROTOCOL + AXI4 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + ID_WIDTH + 0 + + + none + + + + + ADDR_WIDTH + 32 + + + none + + + + + AWUSER_WIDTH + 0 + + + none + + + + + ARUSER_WIDTH + 0 + + + none + + + + + WUSER_WIDTH + 0 + + + none + + + + + RUSER_WIDTH + 0 + + + none + + + + + BUSER_WIDTH + 0 + + + none + + + + + READ_WRITE_MODE + READ_WRITE + + + none + + + + + HAS_BURST + 1 + + + none + + + + + HAS_LOCK + 1 + + + none + + + + + HAS_PROT + 1 + + + none + + + + + HAS_CACHE + 1 + + + none + + + + + HAS_QOS + 1 + + + none + + + + + HAS_REGION + 1 + + + none + + + + + HAS_WSTRB + 1 + + + none + + + + + HAS_BRESP + 1 + + + none + + + + + HAS_RRESP + 1 + + + none + + + + + SUPPORTS_NARROW_BURST + 1 + + + none + + + + + MAX_BURST_LENGTH + 256 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + NUM_READ_THREADS + 1 + + + none + + + + + NUM_WRITE_THREADS + 1 + + + none + + + + + RUSER_BITS_PER_BYTE + 0 + + + none + + + + + WUSER_BITS_PER_BYTE + 0 + + + none + + + + + + + + false + + + + + + S_AXI_GP0 + + + + + + + + + ARREADY + + + S_AXI_GP0_ARREADY + + + + + AWREADY + + + S_AXI_GP0_AWREADY + + + + + BVALID + + + S_AXI_GP0_BVALID + + + + + RLAST + + + S_AXI_GP0_RLAST + + + + + RVALID + + + S_AXI_GP0_RVALID + + + + + WREADY + + + S_AXI_GP0_WREADY + + + + + BRESP + + + S_AXI_GP0_BRESP + + + + + RRESP + + + S_AXI_GP0_RRESP + + + + + RDATA + + + S_AXI_GP0_RDATA + + + + + BID + + + S_AXI_GP0_BID + + + + + RID + + + S_AXI_GP0_RID + + + + + ARVALID + + + S_AXI_GP0_ARVALID + + + + + AWVALID + + + S_AXI_GP0_AWVALID + + + + + BREADY + + + S_AXI_GP0_BREADY + + + + + RREADY + + + S_AXI_GP0_RREADY + + + + + WLAST + + + S_AXI_GP0_WLAST + + + + + WVALID + + + S_AXI_GP0_WVALID + + + + + ARBURST + + + S_AXI_GP0_ARBURST + + + + + ARLOCK + + + S_AXI_GP0_ARLOCK + + + + + ARSIZE + + + S_AXI_GP0_ARSIZE + + + + + AWBURST + + + S_AXI_GP0_AWBURST + + + + + AWLOCK + + + S_AXI_GP0_AWLOCK + + + + + AWSIZE + + + S_AXI_GP0_AWSIZE + + + + + ARPROT + + + S_AXI_GP0_ARPROT + + + + + AWPROT + + + S_AXI_GP0_AWPROT + + + + + ARADDR + + + S_AXI_GP0_ARADDR + + + + + AWADDR + + + S_AXI_GP0_AWADDR + + + + + WDATA + + + S_AXI_GP0_WDATA + + + + + ARCACHE + + + S_AXI_GP0_ARCACHE + + + + + ARLEN + + + S_AXI_GP0_ARLEN + + + + + ARQOS + + + S_AXI_GP0_ARQOS + + + + + AWCACHE + + + S_AXI_GP0_AWCACHE + + + + + AWLEN + + + S_AXI_GP0_AWLEN + + + + + AWQOS + + + S_AXI_GP0_AWQOS + + + + + WSTRB + + + S_AXI_GP0_WSTRB + + + + + ARID + + + S_AXI_GP0_ARID + + + + + AWID + + + S_AXI_GP0_AWID + + + + + WID + + + S_AXI_GP0_WID + + + + + + NUM_WRITE_OUTSTANDING + NUM WRITE OUTSTANDING + 8 + + + NUM_READ_OUTSTANDING + NUM READ OUTSTANDING + 8 + + + DATA_WIDTH + 32 + + + none + + + + + PROTOCOL + AXI4 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + ID_WIDTH + 0 + + + none + + + + + ADDR_WIDTH + 32 + + + none + + + + + AWUSER_WIDTH + 0 + + + none + + + + + ARUSER_WIDTH + 0 + + + none + + + + + WUSER_WIDTH + 0 + + + none + + + + + RUSER_WIDTH + 0 + + + none + + + + + BUSER_WIDTH + 0 + + + none + + + + + READ_WRITE_MODE + READ_WRITE + + + none + + + + + HAS_BURST + 1 + + + none + + + + + HAS_LOCK + 1 + + + none + + + + + HAS_PROT + 1 + + + none + + + + + HAS_CACHE + 1 + + + none + + + + + HAS_QOS + 1 + + + none + + + + + HAS_REGION + 1 + + + none + + + + + HAS_WSTRB + 1 + + + none + + + + + HAS_BRESP + 1 + + + none + + + + + HAS_RRESP + 1 + + + none + + + + + SUPPORTS_NARROW_BURST + 1 + + + none + + + + + MAX_BURST_LENGTH + 256 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + NUM_READ_THREADS + 1 + + + none + + + + + NUM_WRITE_THREADS + 1 + + + none + + + + + RUSER_BITS_PER_BYTE + 0 + + + none + + + + + WUSER_BITS_PER_BYTE + 0 + + + none + + + + + + + + false + + + + + + S_AXI_GP1 + + + + + + + + + ARREADY + + + S_AXI_GP1_ARREADY + + + + + AWREADY + + + S_AXI_GP1_AWREADY + + + + + BVALID + + + S_AXI_GP1_BVALID + + + + + RLAST + + + S_AXI_GP1_RLAST + + + + + RVALID + + + S_AXI_GP1_RVALID + + + + + WREADY + + + S_AXI_GP1_WREADY + + + + + BRESP + + + S_AXI_GP1_BRESP + + + + + RRESP + + + S_AXI_GP1_RRESP + + + + + RDATA + + + S_AXI_GP1_RDATA + + + + + BID + + + S_AXI_GP1_BID + + + + + RID + + + S_AXI_GP1_RID + + + + + ARVALID + + + S_AXI_GP1_ARVALID + + + + + AWVALID + + + S_AXI_GP1_AWVALID + + + + + BREADY + + + S_AXI_GP1_BREADY + + + + + RREADY + + + S_AXI_GP1_RREADY + + + + + WLAST + + + S_AXI_GP1_WLAST + + + + + WVALID + + + S_AXI_GP1_WVALID + + + + + ARBURST + + + S_AXI_GP1_ARBURST + + + + + ARLOCK + + + S_AXI_GP1_ARLOCK + + + + + ARSIZE + + + S_AXI_GP1_ARSIZE + + + + + AWBURST + + + S_AXI_GP1_AWBURST + + + + + AWLOCK + + + S_AXI_GP1_AWLOCK + + + + + AWSIZE + + + S_AXI_GP1_AWSIZE + + + + + ARPROT + + + S_AXI_GP1_ARPROT + + + + + AWPROT + + + S_AXI_GP1_AWPROT + + + + + ARADDR + + + S_AXI_GP1_ARADDR + + + + + AWADDR + + + S_AXI_GP1_AWADDR + + + + + WDATA + + + S_AXI_GP1_WDATA + + + + + ARCACHE + + + S_AXI_GP1_ARCACHE + + + + + ARLEN + + + S_AXI_GP1_ARLEN + + + + + ARQOS + + + S_AXI_GP1_ARQOS + + + + + AWCACHE + + + S_AXI_GP1_AWCACHE + + + + + AWLEN + + + S_AXI_GP1_AWLEN + + + + + AWQOS + + + S_AXI_GP1_AWQOS + + + + + WSTRB + + + S_AXI_GP1_WSTRB + + + + + ARID + + + S_AXI_GP1_ARID + + + + + AWID + + + S_AXI_GP1_AWID + + + + + WID + + + S_AXI_GP1_WID + + + + + + NUM_WRITE_OUTSTANDING + NUM WRITE OUTSTANDING + 8 + + + NUM_READ_OUTSTANDING + NUM READ OUTSTANDING + 8 + + + DATA_WIDTH + 32 + + + none + + + + + PROTOCOL + AXI4 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + ID_WIDTH + 0 + + + none + + + + + ADDR_WIDTH + 32 + + + none + + + + + AWUSER_WIDTH + 0 + + + none + + + + + ARUSER_WIDTH + 0 + + + none + + + + + WUSER_WIDTH + 0 + + + none + + + + + RUSER_WIDTH + 0 + + + none + + + + + BUSER_WIDTH + 0 + + + none + + + + + READ_WRITE_MODE + READ_WRITE + + + none + + + + + HAS_BURST + 1 + + + none + + + + + HAS_LOCK + 1 + + + none + + + + + HAS_PROT + 1 + + + none + + + + + HAS_CACHE + 1 + + + none + + + + + HAS_QOS + 1 + + + none + + + + + HAS_REGION + 1 + + + none + + + + + HAS_WSTRB + 1 + + + none + + + + + HAS_BRESP + 1 + + + none + + + + + HAS_RRESP + 1 + + + none + + + + + SUPPORTS_NARROW_BURST + 1 + + + none + + + + + MAX_BURST_LENGTH + 256 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + NUM_READ_THREADS + 1 + + + none + + + + + NUM_WRITE_THREADS + 1 + + + none + + + + + RUSER_BITS_PER_BYTE + 0 + + + none + + + + + WUSER_BITS_PER_BYTE + 0 + + + none + + + + + + + + false + + + + + + S_AXI_HP0 + + + + + + + + + ARREADY + + + S_AXI_HP0_ARREADY + + + + + AWREADY + + + S_AXI_HP0_AWREADY + + + + + BVALID + + + S_AXI_HP0_BVALID + + + + + RLAST + + + S_AXI_HP0_RLAST + + + + + RVALID + + + S_AXI_HP0_RVALID + + + + + WREADY + + + S_AXI_HP0_WREADY + + + + + BRESP + + + S_AXI_HP0_BRESP + + + + + RRESP + + + S_AXI_HP0_RRESP + + + + + BID + + + S_AXI_HP0_BID + + + + + RID + + + S_AXI_HP0_RID + + + + + RDATA + + + S_AXI_HP0_RDATA + + + + + ARVALID + + + S_AXI_HP0_ARVALID + + + + + AWVALID + + + S_AXI_HP0_AWVALID + + + + + BREADY + + + S_AXI_HP0_BREADY + + + + + RREADY + + + S_AXI_HP0_RREADY + + + + + WLAST + + + S_AXI_HP0_WLAST + + + + + WVALID + + + S_AXI_HP0_WVALID + + + + + ARBURST + + + S_AXI_HP0_ARBURST + + + + + ARLOCK + + + S_AXI_HP0_ARLOCK + + + + + ARSIZE + + + S_AXI_HP0_ARSIZE + + + + + AWBURST + + + S_AXI_HP0_AWBURST + + + + + AWLOCK + + + S_AXI_HP0_AWLOCK + + + + + AWSIZE + + + S_AXI_HP0_AWSIZE + + + + + ARPROT + + + S_AXI_HP0_ARPROT + + + + + AWPROT + + + S_AXI_HP0_AWPROT + + + + + ARADDR + + + S_AXI_HP0_ARADDR + + + + + AWADDR + + + S_AXI_HP0_AWADDR + + + + + ARCACHE + + + S_AXI_HP0_ARCACHE + + + + + ARLEN + + + S_AXI_HP0_ARLEN + + + + + ARQOS + + + S_AXI_HP0_ARQOS + + + + + AWCACHE + + + S_AXI_HP0_AWCACHE + + + + + AWLEN + + + S_AXI_HP0_AWLEN + + + + + AWQOS + + + S_AXI_HP0_AWQOS + + + + + ARID + + + S_AXI_HP0_ARID + + + + + AWID + + + S_AXI_HP0_AWID + + + + + WID + + + S_AXI_HP0_WID + + + + + WDATA + + + S_AXI_HP0_WDATA + + + + + WSTRB + + + S_AXI_HP0_WSTRB + + + + + + NUM_WRITE_OUTSTANDING + NUM WRITE OUTSTANDING + 8 + + + NUM_READ_OUTSTANDING + NUM READ OUTSTANDING + 8 + + + DATA_WIDTH + 32 + + + none + + + + + PROTOCOL + AXI4 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + ID_WIDTH + 0 + + + none + + + + + ADDR_WIDTH + 32 + + + none + + + + + AWUSER_WIDTH + 0 + + + none + + + + + ARUSER_WIDTH + 0 + + + none + + + + + WUSER_WIDTH + 0 + + + none + + + + + RUSER_WIDTH + 0 + + + none + + + + + BUSER_WIDTH + 0 + + + none + + + + + READ_WRITE_MODE + READ_WRITE + + + none + + + + + HAS_BURST + 1 + + + none + + + + + HAS_LOCK + 1 + + + none + + + + + HAS_PROT + 1 + + + none + + + + + HAS_CACHE + 1 + + + none + + + + + HAS_QOS + 1 + + + none + + + + + HAS_REGION + 1 + + + none + + + + + HAS_WSTRB + 1 + + + none + + + + + HAS_BRESP + 1 + + + none + + + + + HAS_RRESP + 1 + + + none + + + + + SUPPORTS_NARROW_BURST + 1 + + + none + + + + + MAX_BURST_LENGTH + 256 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + NUM_READ_THREADS + 1 + + + none + + + + + NUM_WRITE_THREADS + 1 + + + none + + + + + RUSER_BITS_PER_BYTE + 0 + + + none + + + + + WUSER_BITS_PER_BYTE + 0 + + + none + + + + + + + + false + + + + + + S_AXI_HP1 + + + + + + + + + ARREADY + + + S_AXI_HP1_ARREADY + + + + + AWREADY + + + S_AXI_HP1_AWREADY + + + + + BVALID + + + S_AXI_HP1_BVALID + + + + + RLAST + + + S_AXI_HP1_RLAST + + + + + RVALID + + + S_AXI_HP1_RVALID + + + + + WREADY + + + S_AXI_HP1_WREADY + + + + + BRESP + + + S_AXI_HP1_BRESP + + + + + RRESP + + + S_AXI_HP1_RRESP + + + + + BID + + + S_AXI_HP1_BID + + + + + RID + + + S_AXI_HP1_RID + + + + + RDATA + + + S_AXI_HP1_RDATA + + + + + ARVALID + + + S_AXI_HP1_ARVALID + + + + + AWVALID + + + S_AXI_HP1_AWVALID + + + + + BREADY + + + S_AXI_HP1_BREADY + + + + + RREADY + + + S_AXI_HP1_RREADY + + + + + WLAST + + + S_AXI_HP1_WLAST + + + + + WVALID + + + S_AXI_HP1_WVALID + + + + + ARBURST + + + S_AXI_HP1_ARBURST + + + + + ARLOCK + + + S_AXI_HP1_ARLOCK + + + + + ARSIZE + + + S_AXI_HP1_ARSIZE + + + + + AWBURST + + + S_AXI_HP1_AWBURST + + + + + AWLOCK + + + S_AXI_HP1_AWLOCK + + + + + AWSIZE + + + S_AXI_HP1_AWSIZE + + + + + ARPROT + + + S_AXI_HP1_ARPROT + + + + + AWPROT + + + S_AXI_HP1_AWPROT + + + + + ARADDR + + + S_AXI_HP1_ARADDR + + + + + AWADDR + + + S_AXI_HP1_AWADDR + + + + + ARCACHE + + + S_AXI_HP1_ARCACHE + + + + + ARLEN + + + S_AXI_HP1_ARLEN + + + + + ARQOS + + + S_AXI_HP1_ARQOS + + + + + AWCACHE + + + S_AXI_HP1_AWCACHE + + + + + AWLEN + + + S_AXI_HP1_AWLEN + + + + + AWQOS + + + S_AXI_HP1_AWQOS + + + + + ARID + + + S_AXI_HP1_ARID + + + + + AWID + + + S_AXI_HP1_AWID + + + + + WID + + + S_AXI_HP1_WID + + + + + WDATA + + + S_AXI_HP1_WDATA + + + + + WSTRB + + + S_AXI_HP1_WSTRB + + + + + + NUM_WRITE_OUTSTANDING + NUM WRITE OUTSTANDING + 8 + + + NUM_READ_OUTSTANDING + NUM READ OUTSTANDING + 8 + + + DATA_WIDTH + 32 + + + none + + + + + PROTOCOL + AXI4 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + ID_WIDTH + 0 + + + none + + + + + ADDR_WIDTH + 32 + + + none + + + + + AWUSER_WIDTH + 0 + + + none + + + + + ARUSER_WIDTH + 0 + + + none + + + + + WUSER_WIDTH + 0 + + + none + + + + + RUSER_WIDTH + 0 + + + none + + + + + BUSER_WIDTH + 0 + + + none + + + + + READ_WRITE_MODE + READ_WRITE + + + none + + + + + HAS_BURST + 1 + + + none + + + + + HAS_LOCK + 1 + + + none + + + + + HAS_PROT + 1 + + + none + + + + + HAS_CACHE + 1 + + + none + + + + + HAS_QOS + 1 + + + none + + + + + HAS_REGION + 1 + + + none + + + + + HAS_WSTRB + 1 + + + none + + + + + HAS_BRESP + 1 + + + none + + + + + HAS_RRESP + 1 + + + none + + + + + SUPPORTS_NARROW_BURST + 1 + + + none + + + + + MAX_BURST_LENGTH + 256 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + NUM_READ_THREADS + 1 + + + none + + + + + NUM_WRITE_THREADS + 1 + + + none + + + + + RUSER_BITS_PER_BYTE + 0 + + + none + + + + + WUSER_BITS_PER_BYTE + 0 + + + none + + + + + + + + false + + + + + + S_AXI_HP2 + + + + + + + + + ARREADY + + + S_AXI_HP2_ARREADY + + + + + AWREADY + + + S_AXI_HP2_AWREADY + + + + + BVALID + + + S_AXI_HP2_BVALID + + + + + RLAST + + + S_AXI_HP2_RLAST + + + + + RVALID + + + S_AXI_HP2_RVALID + + + + + WREADY + + + S_AXI_HP2_WREADY + + + + + BRESP + + + S_AXI_HP2_BRESP + + + + + RRESP + + + S_AXI_HP2_RRESP + + + + + BID + + + S_AXI_HP2_BID + + + + + RID + + + S_AXI_HP2_RID + + + + + RDATA + + + S_AXI_HP2_RDATA + + + + + ARVALID + + + S_AXI_HP2_ARVALID + + + + + AWVALID + + + S_AXI_HP2_AWVALID + + + + + BREADY + + + S_AXI_HP2_BREADY + + + + + RREADY + + + S_AXI_HP2_RREADY + + + + + WLAST + + + S_AXI_HP2_WLAST + + + + + WVALID + + + S_AXI_HP2_WVALID + + + + + ARBURST + + + S_AXI_HP2_ARBURST + + + + + ARLOCK + + + S_AXI_HP2_ARLOCK + + + + + ARSIZE + + + S_AXI_HP2_ARSIZE + + + + + AWBURST + + + S_AXI_HP2_AWBURST + + + + + AWLOCK + + + S_AXI_HP2_AWLOCK + + + + + AWSIZE + + + S_AXI_HP2_AWSIZE + + + + + ARPROT + + + S_AXI_HP2_ARPROT + + + + + AWPROT + + + S_AXI_HP2_AWPROT + + + + + ARADDR + + + S_AXI_HP2_ARADDR + + + + + AWADDR + + + S_AXI_HP2_AWADDR + + + + + ARCACHE + + + S_AXI_HP2_ARCACHE + + + + + ARLEN + + + S_AXI_HP2_ARLEN + + + + + ARQOS + + + S_AXI_HP2_ARQOS + + + + + AWCACHE + + + S_AXI_HP2_AWCACHE + + + + + AWLEN + + + S_AXI_HP2_AWLEN + + + + + AWQOS + + + S_AXI_HP2_AWQOS + + + + + ARID + + + S_AXI_HP2_ARID + + + + + AWID + + + S_AXI_HP2_AWID + + + + + WID + + + S_AXI_HP2_WID + + + + + WDATA + + + S_AXI_HP2_WDATA + + + + + WSTRB + + + S_AXI_HP2_WSTRB + + + + + + NUM_WRITE_OUTSTANDING + NUM WRITE OUTSTANDING + 8 + + + NUM_READ_OUTSTANDING + NUM READ OUTSTANDING + 8 + + + DATA_WIDTH + 32 + + + none + + + + + PROTOCOL + AXI4 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + ID_WIDTH + 0 + + + none + + + + + ADDR_WIDTH + 32 + + + none + + + + + AWUSER_WIDTH + 0 + + + none + + + + + ARUSER_WIDTH + 0 + + + none + + + + + WUSER_WIDTH + 0 + + + none + + + + + RUSER_WIDTH + 0 + + + none + + + + + BUSER_WIDTH + 0 + + + none + + + + + READ_WRITE_MODE + READ_WRITE + + + none + + + + + HAS_BURST + 1 + + + none + + + + + HAS_LOCK + 1 + + + none + + + + + HAS_PROT + 1 + + + none + + + + + HAS_CACHE + 1 + + + none + + + + + HAS_QOS + 1 + + + none + + + + + HAS_REGION + 1 + + + none + + + + + HAS_WSTRB + 1 + + + none + + + + + HAS_BRESP + 1 + + + none + + + + + HAS_RRESP + 1 + + + none + + + + + SUPPORTS_NARROW_BURST + 1 + + + none + + + + + MAX_BURST_LENGTH + 256 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + NUM_READ_THREADS + 1 + + + none + + + + + NUM_WRITE_THREADS + 1 + + + none + + + + + RUSER_BITS_PER_BYTE + 0 + + + none + + + + + WUSER_BITS_PER_BYTE + 0 + + + none + + + + + + + + false + + + + + + S_AXI_HP3 + + + + + + + + + ARREADY + + + S_AXI_HP3_ARREADY + + + + + AWREADY + + + S_AXI_HP3_AWREADY + + + + + BVALID + + + S_AXI_HP3_BVALID + + + + + RLAST + + + S_AXI_HP3_RLAST + + + + + RVALID + + + S_AXI_HP3_RVALID + + + + + WREADY + + + S_AXI_HP3_WREADY + + + + + BRESP + + + S_AXI_HP3_BRESP + + + + + RRESP + + + S_AXI_HP3_RRESP + + + + + BID + + + S_AXI_HP3_BID + + + + + RID + + + S_AXI_HP3_RID + + + + + RDATA + + + S_AXI_HP3_RDATA + + + + + ARVALID + + + S_AXI_HP3_ARVALID + + + + + AWVALID + + + S_AXI_HP3_AWVALID + + + + + BREADY + + + S_AXI_HP3_BREADY + + + + + RREADY + + + S_AXI_HP3_RREADY + + + + + WLAST + + + S_AXI_HP3_WLAST + + + + + WVALID + + + S_AXI_HP3_WVALID + + + + + ARBURST + + + S_AXI_HP3_ARBURST + + + + + ARLOCK + + + S_AXI_HP3_ARLOCK + + + + + ARSIZE + + + S_AXI_HP3_ARSIZE + + + + + AWBURST + + + S_AXI_HP3_AWBURST + + + + + AWLOCK + + + S_AXI_HP3_AWLOCK + + + + + AWSIZE + + + S_AXI_HP3_AWSIZE + + + + + ARPROT + + + S_AXI_HP3_ARPROT + + + + + AWPROT + + + S_AXI_HP3_AWPROT + + + + + ARADDR + + + S_AXI_HP3_ARADDR + + + + + AWADDR + + + S_AXI_HP3_AWADDR + + + + + ARCACHE + + + S_AXI_HP3_ARCACHE + + + + + ARLEN + + + S_AXI_HP3_ARLEN + + + + + ARQOS + + + S_AXI_HP3_ARQOS + + + + + AWCACHE + + + S_AXI_HP3_AWCACHE + + + + + AWLEN + + + S_AXI_HP3_AWLEN + + + + + AWQOS + + + S_AXI_HP3_AWQOS + + + + + ARID + + + S_AXI_HP3_ARID + + + + + AWID + + + S_AXI_HP3_AWID + + + + + WID + + + S_AXI_HP3_WID + + + + + WDATA + + + S_AXI_HP3_WDATA + + + + + WSTRB + + + S_AXI_HP3_WSTRB + + + + + + NUM_WRITE_OUTSTANDING + NUM WRITE OUTSTANDING + 8 + + + NUM_READ_OUTSTANDING + NUM READ OUTSTANDING + 8 + + + DATA_WIDTH + 32 + + + none + + + + + PROTOCOL + AXI4 + + + none + + + + + FREQ_HZ + 100000000 + + + none + + + + + ID_WIDTH + 0 + + + none + + + + + ADDR_WIDTH + 32 + + + none + + + + + AWUSER_WIDTH + 0 + + + none + + + + + ARUSER_WIDTH + 0 + + + none + + + + + WUSER_WIDTH + 0 + + + none + + + + + RUSER_WIDTH + 0 + + + none + + + + + BUSER_WIDTH + 0 + + + none + + + + + READ_WRITE_MODE + READ_WRITE + + + none + + + + + HAS_BURST + 1 + + + none + + + + + HAS_LOCK + 1 + + + none + + + + + HAS_PROT + 1 + + + none + + + + + HAS_CACHE + 1 + + + none + + + + + HAS_QOS + 1 + + + none + + + + + HAS_REGION + 1 + + + none + + + + + HAS_WSTRB + 1 + + + none + + + + + HAS_BRESP + 1 + + + none + + + + + HAS_RRESP + 1 + + + none + + + + + SUPPORTS_NARROW_BURST + 1 + + + none + + + + + MAX_BURST_LENGTH + 256 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + NUM_READ_THREADS + 1 + + + none + + + + + NUM_WRITE_THREADS + 1 + + + none + + + + + RUSER_BITS_PER_BYTE + 0 + + + none + + + + + WUSER_BITS_PER_BYTE + 0 + + + none + + + + + + + + false + + + + + + FCLK_CLK0 + + + + + + + CLK + + + FCLK_CLK0 + + + + + + FREQ_HZ + 50000000 + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + design_1_processing_system7_0_0_FCLK_CLK0 + + + none + + + + + ASSOCIATED_BUSIF + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + true + + + + + + FCLK_CLK1 + + + + + + + CLK + + + FCLK_CLK1 + + + + + + FREQ_HZ + 100000000 + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + design_1_processing_system7_0_0_FCLK_CLK1 + + + none + + + + + ASSOCIATED_BUSIF + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + true + + + + + + FCLK_CLK2 + + + + + + + CLK + + + FCLK_CLK2 + + + + + + FREQ_HZ + 1e+07 + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_BUSIF + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + FCLK_CLK3 + + + + + + + CLK + + + FCLK_CLK3 + + + + + + FREQ_HZ + 1e+07 + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_BUSIF + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + FCLK_RESET0_N + + + + + + + RST + + + FCLK_RESET0_N + + + + + + POLARITY + ACTIVE_LOW + + + none + + + + + + + + true + + + + + + FCLK_RESET1_N + + + + + + + RST + + + FCLK_RESET1_N + + + + + + POLARITY + ACTIVE_LOW + + + none + + + + + + + + false + + + + + + FCLK_RESET2_N + + + + + + + RST + + + FCLK_RESET2_N + + + + + + POLARITY + ACTIVE_LOW + + + none + + + + + + + + false + + + + + + FCLK_RESET3_N + + + + + + + RST + + + FCLK_RESET3_N + + + + + + POLARITY + ACTIVE_LOW + + + none + + + + + + + + false + + + + + + IRQ_P2F_DMAC_ABORT + + + + + + + INTERRUPT + + + IRQ_P2F_DMAC_ABORT + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_DMAC0 + + + + + + + INTERRUPT + + + IRQ_P2F_DMAC0 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_DMAC1 + + + + + + + INTERRUPT + + + IRQ_P2F_DMAC1 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_DMAC2 + + + + + + + INTERRUPT + + + IRQ_P2F_DMAC2 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_DMAC3 + + + + + + + INTERRUPT + + + IRQ_P2F_DMAC3 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_DMAC4 + + + + + + + INTERRUPT + + + IRQ_P2F_DMAC4 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_DMAC5 + + + + + + + INTERRUPT + + + IRQ_P2F_DMAC5 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_DMAC6 + + + + + + + INTERRUPT + + + IRQ_P2F_DMAC6 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_DMAC7 + + + + + + + INTERRUPT + + + IRQ_P2F_DMAC7 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_SMC + + + + + + + INTERRUPT + + + IRQ_P2F_SMC + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_QSPI + + + + + + + INTERRUPT + + + IRQ_P2F_QSPI + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_CTI + + + + + + + INTERRUPT + + + IRQ_P2F_CTI + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_GPIO + + + + + + + INTERRUPT + + + IRQ_P2F_GPIO + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_USB0 + + + + + + + INTERRUPT + + + IRQ_P2F_USB0 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_ENET0 + + + + + + + INTERRUPT + + + IRQ_P2F_ENET0 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_ENET_WAKE0 + + + + + + + INTERRUPT + + + IRQ_P2F_ENET_WAKE0 + + + + + + SENSITIVITY + EDGE_RISING + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_SDIO0 + + + + + + + INTERRUPT + + + IRQ_P2F_SDIO0 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_I2C0 + + + + + + + INTERRUPT + + + IRQ_P2F_I2C0 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_SPI0 + + + + + + + INTERRUPT + + + IRQ_P2F_SPI0 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_UART0 + + + + + + + INTERRUPT + + + IRQ_P2F_UART0 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_CAN0 + + + + + + + INTERRUPT + + + IRQ_P2F_CAN0 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_USB1 + + + + + + + INTERRUPT + + + IRQ_P2F_USB1 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_ENET1 + + + + + + + INTERRUPT + + + IRQ_P2F_ENET1 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_ENET_WAKE1 + + + + + + + INTERRUPT + + + IRQ_P2F_ENET_WAKE1 + + + + + + SENSITIVITY + EDGE_RISING + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_SDIO1 + + + + + + + INTERRUPT + + + IRQ_P2F_SDIO1 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_I2C1 + + + + + + + INTERRUPT + + + IRQ_P2F_I2C1 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_SPI1 + + + + + + + INTERRUPT + + + IRQ_P2F_SPI1 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_UART1 + + + + + + + INTERRUPT + + + IRQ_P2F_UART1 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_P2F_CAN1 + + + + + + + INTERRUPT + + + IRQ_P2F_CAN1 + + + + + + SENSITIVITY + LEVEL_HIGH + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + IRQ_F2P + + + + + + + INTERRUPT + + + IRQ_F2P + + + + + + SENSITIVITY + LEVEL_HIGH + + + none + + + + + PortWidth + 1 + + + none + + + + + + + + true + + + + + + Core0_nFIQ + + + + + + + INTERRUPT + + + Core0_nFIQ + + + + + + SENSITIVITY + LEVEL_HIGH + + + none + + + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + Core0_nIRQ + + + + + + + INTERRUPT + + + Core0_nIRQ + + + + + + SENSITIVITY + LEVEL_HIGH + + + none + + + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + Core1_nFIQ + + + + + + + INTERRUPT + + + Core1_nFIQ + + + + + + SENSITIVITY + LEVEL_HIGH + + + none + + + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + Core1_nIRQ + + + + + + + INTERRUPT + + + Core1_nIRQ + + + + + + SENSITIVITY + LEVEL_HIGH + + + none + + + + + PortWidth + 1 + + + none + + + + + + + + false + + + + + + M_AXI_GP0_ACLK + + + + + + + CLK + + + M_AXI_GP0_ACLK + + + + + + ASSOCIATED_BUSIF + M_AXI_GP0 + + + FREQ_HZ + 50000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + design_1_processing_system7_0_0_FCLK_CLK0 + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + true + + + + + + M_AXI_GP1_ACLK + + + + + + + CLK + + + M_AXI_GP1_ACLK + + + + + + ASSOCIATED_BUSIF + M_AXI_GP1 + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + S_AXI_ACP_ACLK + + + + + + + CLK + + + S_AXI_ACP_ACLK + + + + + + ASSOCIATED_BUSIF + S_AXI_ACP + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + S_AXI_GP0_ACLK + + + + + + + CLK + + + S_AXI_GP0_ACLK + + + + + + ASSOCIATED_BUSIF + S_AXI_GP0 + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + S_AXI_GP1_ACLK + + + + + + + CLK + + + S_AXI_GP1_ACLK + + + + + + ASSOCIATED_BUSIF + S_AXI_GP1 + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + S_AXI_HP0_ACLK + + + + + + + CLK + + + S_AXI_HP0_ACLK + + + + + + ASSOCIATED_BUSIF + S_AXI_HP0 + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + S_AXI_HP1_ACLK + + + + + + + CLK + + + S_AXI_HP1_ACLK + + + + + + ASSOCIATED_BUSIF + S_AXI_HP1 + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + S_AXI_HP2_ACLK + + + + + + + CLK + + + S_AXI_HP2_ACLK + + + + + + ASSOCIATED_BUSIF + S_AXI_HP2 + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + S_AXI_HP3_ACLK + + + + + + + CLK + + + S_AXI_HP3_ACLK + + + + + + ASSOCIATED_BUSIF + S_AXI_HP3 + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + FTMD_TRACEIN_CLK + + + + + + + CLK + + + FTMD_TRACEIN_CLK + + + + + + ASSOCIATED_BUSIF + FTM_TRACE_DATA + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + DMA0_ACLK + + + + + + + CLK + + + DMA0_ACLK + + + + + + ASSOCIATED_BUSIF + DMA0_ACK:DMA0_REQ + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + DMA1_ACLK + + + + + + + CLK + + + DMA1_ACLK + + + + + + ASSOCIATED_BUSIF + DMA1_ACK:DMA1_REQ + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + DMA2_ACLK + + + + + + + CLK + + + DMA2_ACLK + + + + + + ASSOCIATED_BUSIF + DMA2_ACK:DMA2_REQ + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + DMA3_ACLK + + + + + + + CLK + + + DMA3_ACLK + + + + + + ASSOCIATED_BUSIF + DMA3_ACK:DMA3_REQ + + + FREQ_HZ + 100000000 + + + none + + + + + PHASE + 0.000 + + + none + + + + + CLK_DOMAIN + + + + none + + + + + ASSOCIATED_RESET + + + + none + + + + + + + + false + + + + + + TRIGGER_IN_0 + + + + + + + TRIG + + + FTMT_F2P_TRIG_0 + + + + + ACK + + + FTMT_F2P_TRIGACK_0 + + + + + + + false + + + + + + TRIGGER_IN_1 + + + + + + + TRIG + + + FTMT_F2P_TRIG_1 + + + + + ACK + + + FTMT_F2P_TRIGACK_1 + + + + + + + false + + + + + + TRIGGER_IN_2 + + + + + + + TRIG + + + FTMT_F2P_TRIG_2 + + + + + ACK + + + FTMT_F2P_TRIGACK_2 + + + + + + + false + + + + + + TRIGGER_IN_3 + + + + + + + TRIG + + + FTMT_F2P_TRIG_3 + + + + + ACK + + + FTMT_F2P_TRIGACK_3 + + + + + + + false + + + + + + TRIGGER_OUT_0 + + + + + + + ACK + + + FTMT_P2F_TRIGACK_0 + + + + + TRIG + + + FTMT_P2F_TRIG_0 + + + + + + + false + + + + + + TRIGGER_OUT_1 + + + + + + + ACK + + + FTMT_P2F_TRIGACK_1 + + + + + TRIG + + + FTMT_P2F_TRIG_1 + + + + + + + false + + + + + + TRIGGER_OUT_2 + + + + + + + ACK + + + FTMT_P2F_TRIGACK_2 + + + + + TRIG + + + FTMT_P2F_TRIG_2 + + + + + + + false + + + + + + TRIGGER_OUT_3 + + + + + + + ACK + + + FTMT_P2F_TRIGACK_3 + + + + + TRIG + + + FTMT_P2F_TRIG_3 + + + + + + + false + + + + + + + + Data + Data + 4G + 32 + + + segment1 + segment1 + 0x00000000 + 0x00040000 + + + segment2 + segment2 + 0x00040000 + 0x00040000 + + + segment3 + segment3 + 0x00080000 + 0x00080000 + + + segment4 + segment4 + 0x00100000 + 0x3ff00000 + + + M_AXI_GP0 + M_AXI_GP0 + 0x40000000 + 0x40000000 + + + M_AXI_GP1 + M_AXI_GP1 + 0x80000000 + 0x40000000 + + + IO_Peripheral_Registers + IO Peripheral Registers + 0xe0000000 + 0x00300000 + + + SMC_Memories + SMC Memories + 0xe1000000 + 0x05000000 + + + SLCR_Registers + SLCR Registers + 0xf8000000 + 0x00000c00 + + + PS_System_Registers + PS System Registers + 0xf8001000 + 0x0080f000 + + + CPU_Private_Registers + CPU Private Registers + 0xf8900000 + 0x00603000 + + + segment5 + segment5 + 0xfc000000 + 0x02000000 + + + segment6 + segment6 + 0xfffc0000 + 0x00040000 + + + + + + + S_AXI_HP0 + + HP0_LOW_OCM + HP0 LOW OCM + 0x00000000 + 0x00040000 + 32 + memory + + + + false + + + + + + HP0_DDR_LOWOCM + HP0 DDR LOWOCM + 0x00000000 + 536870912 + 32 + memory + + + + true + + + + + + HP0_HIGH_OCM + HP0 HIGH OCM + 0xfffc0000 + 0x00040000 + 32 + memory + + + + false + + + + + + + + false + + + + + + S_AXI_HP1 + + HP1_LOW_OCM + HP1 LOW OCM + 0x00000000 + 0x00040000 + 32 + memory + + + + false + + + + + + HP1_DDR_LOWOCM + HP1 DDR LOWOCM + 0x00000000 + 536870912 + 32 + memory + + + + true + + + + + + HP1_HIGH_OCM + HP1 HIGH OCM + 0xfffc0000 + 0x00040000 + 32 + memory + + + + false + + + + + + + + false + + + + + + S_AXI_HP2 + + HP2_LOW_OCM + HP2 LOW OCM + 0x00000000 + 0x00040000 + 32 + memory + + + + false + + + + + + HP2_DDR_LOWOCM + HP2 DDR LOWOCM + 0x00000000 + 536870912 + 32 + memory + + + + true + + + + + + HP2_HIGH_OCM + HP2 HIGH OCM + 0xfffc0000 + 0x00040000 + 32 + memory + + + + false + + + + + + + + false + + + + + + S_AXI_HP3 + + HP3_LOW_OCM + HP3 LOW OCM + 0x00000000 + 0x00040000 + 32 + memory + + + + false + + + + + + HP3_DDR_LOWOCM + HP3 DDR LOWOCM + 0x00000000 + 536870912 + 32 + memory + + + + true + + + + + + HP3_HIGH_OCM + HP3 HIGH OCM + 0xfffc0000 + 0x00040000 + 32 + memory + + + + false + + + + + + + + false + + + + + + S_AXI_GP0 + + GP0_LOW_OCM + GP0 LOW OCM + 0x00000000 + 0x00040000 + 32 + memory + + + + false + + + + + + GP0_DDR_LOWOCM + GP0 DDR LOWOCM + 0x00000000 + 536870912 + 32 + memory + + + + true + + + + + + GP0_HIGH_OCM + GP0 HIGH OCM + 0xfffc0000 + 0x00040000 + 32 + memory + + + + false + + + + + + GP0_QSPI_LINEAR + GP0 QSPI LINEAR + 0xfc000000 + 16777216 + 32 + memory + + + + true + + + + + + GP0_SRAM_NOR0 + GP0 SRAM NOR 0 + 0xe2000000 + 0x02000000 + 32 + memory + + + + false + + + + + + GP0_SRAM_NOR1 + GP0 SRAM NOR 1 + 0xe4000000 + 0x02000000 + 32 + memory + + + + false + + + + + + GP0_NAND + GP0 NAND + 0xe1000000 + 0x01000000 + 32 + memory + + + + false + + + + + + GP0_IOP + GP0 IOP + 0xe0000000 + 0x00400000 + 32 + register + + + + true + + + + + + GP0_UART0 + GP0 UART0 + 0xe0000000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_UART1 + GP0 UART0 + 0xe0001000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_USB0 + GP0 USB0 + 0xe0002000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_USB1 + GP0 USB1 + 0xe0003000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_IIC0 + GP0 IIC0 + 0xe0004000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_IIC1 + GP0 IIC1 + 0xe0005000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_SPI0 + GP0 SPI0 + 0xe0006000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_SPI1 + GP0 SPI1 + 0xe0007000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_CAN0 + GP0 CAN0 + 0xe0008000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_CAN1 + GP0 CAN1 + 0xe0009000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_GPIO + GP0 GPIO + 0xe000A000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_ENET0 + GP0 ENET0 + 0xe000B000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_ENET1 + GP0 ENET1 + 0xe000C000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_QSPI + GP0 QSPI + 0xe000D000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_SMC + GP0 SMC + 0xe000e000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_SDIO0 + GP0 SDIO0 + 0xe0100000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_SDIO1 + GP0 SDIO1 + 0xe0101000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_PS_SLCR_REGS + GP0 PS REG + 0xf8000000 + 0x00010000 + 32 + register + + + + false + + + + + + GP0_SLCR + GP0 SLCR + 0xf8000000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_TTC0 + GP0 TTC0 + 0xf8001000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_TTC1 + GP0 TTC1 + 0xf8002000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_DMAC_S + GP0 DMAC S + 0xf8003000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_DMAC_NS + GP0 DMAC NS + 0xf8004000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_SWDT + GP0 SWDT + 0xf8005000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_DDRC + GP0 DDRC + 0xf8006000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_DEVCFG + GP0 DEVCFG + 0xf8007000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_AFI0 + GP0 AFI0 + 0xf8008000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_AFI1 + GP0 AFI1 + 0xf8009000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_AFI2 + GP0 AFI2 + 0xf800A000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_AFI3 + GP0 AFI3 + 0xf800B000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_OCM_REG + GP0 OCM REG + 0xf800C000 + 0x00001000 + 32 + register + + + + false + + + + + + GP0_CORESIGHT + GP0 CORESIGHT + 0xf8800000 + 0x00100000 + 32 + register + + + + false + + + + + + GP0_M_AXI_GP0 + GP0 M AXI GP0 + 0x40000000 + 0x40000000 + 32 + register + + + + true + + + + + + GP0_M_AXI_GP1 + GP0 M AXI GP1 + 0x80000000 + 0x40000000 + 32 + register + + + + false + + + + + + + + false + + + + + + S_AXI_GP1 + + GP1_LOW_OCM + GP1 LOW OCM + 0x00000000 + 0x00040000 + 32 + memory + + + + false + + + + + + GP1_DDR_LOWOCM + GP1 DDR LOWOCM + 0x00000000 + 536870912 + 32 + memory + + + + true + + + + + + GP1_HIGH_OCM + GP1 HIGH OCM + 0xfffc0000 + 0x00040000 + 32 + memory + + + + false + + + + + + GP1_QSPI_LINEAR + GP1 QSPI LINEAR + 0xfc000000 + 16777216 + 32 + memory + + + + true + + + + + + GP1_SRAM_NOR0 + GP1 SRAM NOR 0 + 0xe2000000 + 0x02000000 + 32 + memory + + + + false + + + + + + GP1_SRAM_NOR1 + GP1 SRAM NOR 1 + 0xe4000000 + 0x02000000 + 32 + memory + + + + false + + + + + + GP1_NAND + GP1 NAND + 0xe1000000 + 0x01000000 + 32 + memory + + + + false + + + + + + GP1_IOP + GP1 IOP + 0xe0000000 + 0x00400000 + 32 + register + + + + true + + + + + + GP1_UART0 + GP1 UART0 + 0xe0000000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_UART1 + GP1 UART0 + 0xe0001000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_USB0 + GP1 USB0 + 0xe0002000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_USB1 + GP1 USB1 + 0xe0003000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_IIC0 + GP1 IIC0 + 0xe0004000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_IIC1 + GP1 IIC1 + 0xe0005000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_SPI0 + GP1 SPI0 + 0xe0006000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_SPI1 + GP1 SPI1 + 0xe0007000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_CAN0 + GP1 CAN0 + 0xe0008000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_CAN1 + GP1 CAN1 + 0xe0009000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_GPIO + GP1 GPIO + 0xe000A000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_ENET0 + GP1 ENET0 + 0xe000B000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_ENET1 + GP1 ENET1 + 0xe000C000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_QSPI + GP1 QSPI + 0xe000D000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_SMC + GP1 SMC + 0xe000e000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_SDIO0 + GP1 SDIO0 + 0xe0100000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_SDIO1 + GP1 SDIO1 + 0xe0101000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_PS_SLCR_REGS + GP1 PS REG + 0xf8000000 + 0x00010000 + 32 + register + + + + false + + + + + + GP1_SLCR + GP1 SLCR + 0xf8000000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_TTC0 + GP1 TTC0 + 0xf8001000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_TTC1 + GP1 TTC1 + 0xf8002000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_DMAC_S + GP1 DMAC S + 0xf8003000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_DMAC_NS + GP1 DMAC NS + 0xf8004000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_SWDT + GP1 SWDT + 0xf8005000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_DDRC + GP1 DDRC + 0xf8006000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_DEVCFG + GP1 DEVCFG + 0xf8007000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_AFI0 + GP1 AFI0 + 0xf8008000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_AFI1 + GP1 AFI1 + 0xf8009000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_AFI2 + GP1 AFI2 + 0xf800A000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_AFI3 + GP1 AFI3 + 0xf800B000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_OCM_REG + GP1 OCM REG + 0xf800C000 + 0x00001000 + 32 + register + + + + false + + + + + + GP1_CORESIGHT + GP1 CORESIGHT + 0xf8800000 + 0x00100000 + 32 + register + + + + false + + + + + + GP1_M_AXI_GP0 + GP1 M AXI GP0 + 0x40000000 + 0x40000000 + 32 + register + + + + true + + + + + + GP1_M_AXI_GP1 + GP1 M AXI GP1 + 0x80000000 + 0x40000000 + 32 + register + + + + false + + + + + + + + false + + + + + + S_AXI_ACP + + ACP_LOW_OCM + ACP LOW OCM + 0x00000000 + 0x00040000 + 32 + memory + + + + false + + + + + + ACP_DDR_LOWOCM + ACP DDR LOWOCM + 0x00000000 + 536870912 + 32 + memory + + + + true + + + + + + ACP_HIGH_OCM + ACP HIGH OCM + 0xfffc0000 + 0x00040000 + 32 + memory + + + + false + + + + + + ACP_QSPI_LINEAR + ACP QSPI LINEAR + 0xfc000000 + 16777216 + 32 + memory + + + + true + + + + + + ACP_SRAM_NOR0 + ACP SRAM NOR 0 + 0xe2000000 + 0x02000000 + 32 + memory + + + + false + + + + + + ACP_SRAM_NOR1 + ACP SRAM NOR 1 + 0xe4000000 + 0x02000000 + 32 + memory + + + + false + + + + + + ACP_NAND + ACP NAND + 0xe1000000 + 0x01000000 + 32 + memory + + + + false + + + + + + ACP_IOP + ACP IOP + 0xe0000000 + 0x00400000 + 32 + register + + + + true + + + + + + ACP_UART0 + ACP UART0 + 0xe0000000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_UART1 + ACP UART0 + 0xe0001000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_USB0 + ACP USB0 + 0xe0002000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_USB1 + ACP USB1 + 0xe0003000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_IIC0 + ACP IIC0 + 0xe0004000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_IIC1 + ACP IIC1 + 0xe0005000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_SPI0 + ACP SPI0 + 0xe0006000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_SPI1 + ACP SPI1 + 0xe0007000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_CAN0 + ACP CAN0 + 0xe0008000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_CAN1 + ACP CAN1 + 0xe0009000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_GPIO + ACP GPIO + 0xe000A000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_ENET0 + ACP ENET0 + 0xe000B000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_ENET1 + ACP ENET1 + 0xe000C000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_QSPI + ACP QSPI + 0xe000D000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_SMC + ACP SMC + 0xe000e000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_SDIO0 + ACP SDIO0 + 0xe0100000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_SDIO1 + ACP SDIO1 + 0xe0101000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_PS_SLCR_REGS + ACP PS REG + 0xf8000000 + 0x00010000 + 32 + register + + + + false + + + + + + ACP_SLCR + ACP SLCR + 0xf8000000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_TTC0 + ACP TTC0 + 0xf8001000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_TTC1 + ACP TTC1 + 0xf8002000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_DMAC_S + ACP DMAC S + 0xf8003000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_DMAC_NS + ACP DMAC NS + 0xf8004000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_SWDT + ACP SWDT + 0xf8005000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_DDRC + ACP DDRC + 0xf8006000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_DEVCFG + ACP DEVCFG + 0xf8007000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_AFI0 + ACP AFI0 + 0xf8008000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_AFI1 + ACP AFI1 + 0xf8009000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_AFI2 + ACP AFI2 + 0xf800A000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_AFI3 + ACP AFI3 + 0xf800B000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_OCM_REG + ACP OCM REG + 0xf800C000 + 0x00001000 + 32 + register + + + + false + + + + + + ACP_CORESIGHT + ACP CORESIGHT + 0xf8800000 + 0x00100000 + 32 + register + + + + false + + + + + + ACP_M_AXI_GP0 + ACP M AXI GP0 + 0x40000000 + 0x40000000 + 32 + register + + + + true + + + + + + ACP_M_AXI_GP1 + ACP M AXI GP1 + 0x80000000 + 0x40000000 + 32 + register + + + + false + + + + + + + + false + + + + + + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + processing_system7_v5_5_processing_system7 + + xilinx_anylanguagesynthesis_view_fileset + + + + GENtimestamp + Fri Aug 17 08:35:17 UTC 2018 + + + outputProductCRC + 8:db12195d + + + + + xilinx_verilogsynthesiswrapper + Verilog Synthesis Wrapper + verilogSource:vivado.xilinx.com:synthesis.wrapper + verilog + design_1_processing_system7_0_0 + + xilinx_verilogsynthesiswrapper_view_fileset + + + + GENtimestamp + Fri Aug 17 08:35:17 UTC 2018 + + + outputProductCRC + 8:db12195d + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + processing_system7_v1_0_processing_system7_vip + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_axi_infrastructure_1_1__ref_view_fileset + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_sc_util_1_0__ref_view_fileset + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_axi_protocol_checker_2_0__ref_view_fileset + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_axi_vip_1_1__ref_view_fileset + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_processing_system7_vip_1_0__ref_view_fileset + + + + outputProductCRC + 8:7af31723 + + + + + xilinx_anylanguagebehavioralsimulation_1 + Simulation + :vivado.xilinx.com:simulation + processing_system7 + + xilinx_anylanguagebehavioralsimulation_1_view_fileset + + + + GENtimestamp + Fri Aug 17 08:35:18 UTC 2018 + + + outputProductCRC + 8:7af31723 + + + sim_type + tlm_dpi + + + sls_compatible + yes + + + + + xilinx_anylanguagesimulationwrapper + Simulation Wrapper + :vivado.xilinx.com:simulation.wrapper + design_1_processing_system7_0_0 + + xilinx_anylanguagesimulationwrapper_view_fileset + + + + GENtimestamp + Fri Aug 17 08:35:19 UTC 2018 + + + outputProductCRC + 8:7af31723 + + + + + xilinx_anylanguagesimulationwrapper_1 + Simulation Wrapper + :vivado.xilinx.com:simulation.wrapper + design_1_processing_system7_0_0 + + xilinx_anylanguagesimulationwrapper_1_view_fileset + + + + GENtimestamp + Fri Aug 17 08:35:25 UTC 2018 + + + outputProductCRC + 8:7af31723 + + + sim_type + tlm_dpi + + + + + xilinx_externalfiles + External Files + :vivado.xilinx.com:external.files + + xilinx_externalfiles_view_fileset + + + + GENtimestamp + Fri Aug 17 08:36:47 UTC 2018 + + + outputProductCRC + 8:db12195d + + + + + + + CAN0_PHY_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + CAN0_PHY_RX + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + CAN1_PHY_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + CAN1_PHY_RX + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET0_GMII_TX_EN + + out + + 0 + 0 + + + + reg + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_GMII_TX_ER + + out + + 0 + 0 + + + + reg + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_MDIO_MDC + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_MDIO_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_MDIO_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_PTP_DELAY_REQ_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_PTP_DELAY_REQ_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_PTP_PDELAY_REQ_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_PTP_PDELAY_REQ_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_PTP_PDELAY_RESP_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_PTP_PDELAY_RESP_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_PTP_SYNC_FRAME_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_PTP_SYNC_FRAME_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_SOF_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_SOF_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_GMII_TXD + + out + + 7 + 0 + + + + reg + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_GMII_COL + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET0_GMII_CRS + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET0_GMII_RX_CLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_GMII_RX_DV + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET0_GMII_RX_ER + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET0_GMII_TX_CLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET0_MDIO_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET0_EXT_INTIN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET0_GMII_RXD + + in + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET1_GMII_TX_EN + + out + + 0 + 0 + + + + reg + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_GMII_TX_ER + + out + + 0 + 0 + + + + reg + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_MDIO_MDC + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_MDIO_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_MDIO_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_PTP_DELAY_REQ_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_PTP_DELAY_REQ_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_PTP_PDELAY_REQ_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_PTP_PDELAY_REQ_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_PTP_PDELAY_RESP_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_PTP_PDELAY_RESP_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_PTP_SYNC_FRAME_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_PTP_SYNC_FRAME_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_SOF_RX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_SOF_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_GMII_TXD + + out + + 7 + 0 + + + + reg + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_GMII_COL + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET1_GMII_CRS + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET1_GMII_RX_CLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_GMII_RX_DV + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET1_GMII_RX_ER + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET1_GMII_TX_CLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + ENET1_MDIO_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET1_EXT_INTIN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + ENET1_GMII_RXD + + in + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + GPIO_I + + in + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + GPIO_O + + out + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + GPIO_T + + out + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + I2C0_SDA_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + I2C0_SDA_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + I2C0_SDA_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + I2C0_SCL_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + I2C0_SCL_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + I2C0_SCL_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + I2C1_SDA_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + I2C1_SDA_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + I2C1_SDA_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + I2C1_SCL_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + I2C1_SCL_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + I2C1_SCL_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + PJTAG_TCK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + PJTAG_TMS + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + PJTAG_TDI + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + PJTAG_TDO + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + SDIO0_CLK + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SDIO0_CLK_FB + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SDIO0_CMD_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SDIO0_CMD_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SDIO0_CMD_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SDIO0_DATA_I + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SDIO0_DATA_O + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SDIO0_DATA_T + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SDIO0_LED + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SDIO0_CDN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SDIO0_WP + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SDIO0_BUSPOW + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SDIO0_BUSVOLT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SDIO1_CLK + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + SDIO1_CLK_FB + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + SDIO1_CMD_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + SDIO1_CMD_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + SDIO1_CMD_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + SDIO1_DATA_I + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + SDIO1_DATA_O + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + SDIO1_DATA_T + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + SDIO1_LED + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + SDIO1_CDN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + SDIO1_WP + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + SDIO1_BUSPOW + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + SDIO1_BUSVOLT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + SPI0_SCLK_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SPI0_SCLK_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI0_SCLK_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI0_MOSI_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SPI0_MOSI_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI0_MOSI_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI0_MISO_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SPI0_MISO_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI0_MISO_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI0_SS_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SPI0_SS_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI0_SS1_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI0_SS2_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI0_SS_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_SCLK_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SPI1_SCLK_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_SCLK_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_MOSI_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SPI1_MOSI_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_MOSI_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_MISO_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SPI1_MISO_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_MISO_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_SS_I + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + SPI1_SS_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_SS1_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_SS2_O + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + SPI1_SS_T + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + UART0_DTRN + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + UART0_RTSN + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + UART0_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + UART0_CTSN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + UART0_DCDN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + UART0_DSRN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + UART0_RIN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + UART0_RX + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + + true + + + + + + UART1_DTRN + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + UART1_RTSN + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + UART1_TX + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + UART1_CTSN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + UART1_DCDN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + UART1_DSRN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + UART1_RIN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + UART1_RX + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + + false + + + + + + TTC0_WAVE0_OUT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + TTC0_WAVE1_OUT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + TTC0_WAVE2_OUT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + TTC0_CLK0_IN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + TTC0_CLK1_IN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + TTC0_CLK2_IN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + TTC1_WAVE0_OUT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + TTC1_WAVE1_OUT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + TTC1_WAVE2_OUT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + TTC1_CLK0_IN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + TTC1_CLK1_IN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + TTC1_CLK2_IN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + WDT_CLK_IN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + WDT_RST_OUT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + TRACE_CLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + TRACE_CLK_OUT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + TRACE_CTL + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + TRACE_DATA + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + USB0_PORT_INDCTL + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + USB0_VBUS_PWRSELECT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + USB0_VBUS_PWRFAULT + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + USB1_PORT_INDCTL + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + USB1_VBUS_PWRSELECT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + USB1_VBUS_PWRFAULT + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + SRAM_INTIN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP0_ARVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_BREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_RREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_WLAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_WVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ARID + + out + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWID + + out + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_WID + + out + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ARBURST + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ARLOCK + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ARSIZE + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWBURST + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWLOCK + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWSIZE + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ARPROT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWPROT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ARADDR + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWADDR + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_WDATA + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ARCACHE + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ARLEN + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ARQOS + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWCACHE + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWLEN + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_AWQOS + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_WSTRB + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + M_AXI_GP0_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_ARREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_AWREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_BVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_RLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_RVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_WREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_BID + + in + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_RID + + in + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_BRESP + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_RRESP + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP0_RDATA + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + M_AXI_GP1_ARVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_BREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_RREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_WLAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_WVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ARID + + out + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWID + + out + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_WID + + out + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ARBURST + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ARLOCK + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ARSIZE + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWBURST + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWLOCK + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWSIZE + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ARPROT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWPROT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ARADDR + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWADDR + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_WDATA + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ARCACHE + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ARLEN + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ARQOS + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWCACHE + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWLEN + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_AWQOS + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_WSTRB + + out + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + M_AXI_GP1_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_ARREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_AWREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_BVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_RLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_RVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_WREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_BID + + in + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_RID + + in + + 11 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_BRESP + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_RRESP + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + M_AXI_GP1_RDATA + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_AWREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_BVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_RLAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_RVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_WREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_BRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_RRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_RDATA + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_BID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_RID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP0_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_BREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_RREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_WLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_WVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_WDATA + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_WSTRB + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_ARID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_AWID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP0_WID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_AWREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_BVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_RLAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_RVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_WREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_BRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_RRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_RDATA + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_BID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_RID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_GP1_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_BREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_RREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_WLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_WVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_WDATA + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_WSTRB + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_ARID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_AWID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_GP1_WID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_AWREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_BVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_RLAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_RVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_WREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_BRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_RRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_BID + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_RID + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_RDATA + + out + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_ACP_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_BREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_RREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_WLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_WVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARID + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWID + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_WID + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_ARUSER + + in + + 4 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_AWUSER + + in + + 4 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_WDATA + + in + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_ACP_WSTRB + + in + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_AWREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_BVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_RLAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_RVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_WREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_BRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_RRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_BID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_RID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_RDATA + + out + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_RCOUNT + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_WCOUNT + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_RACOUNT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_WACOUNT + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP0_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_BREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_RDISSUECAP1_EN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_RREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_WLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_WRISSUECAP1_EN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_WVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_ARID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_AWID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_WID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_WDATA + + in + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP0_WSTRB + + in + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_AWREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_BVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_RLAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_RVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_WREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_BRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_RRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_BID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_RID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_RDATA + + out + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_RCOUNT + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_WCOUNT + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_RACOUNT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_WACOUNT + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP1_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_BREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_RDISSUECAP1_EN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_RREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_WLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_WRISSUECAP1_EN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_WVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_ARID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_AWID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_WID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_WDATA + + in + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP1_WSTRB + + in + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_AWREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_BVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_RLAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_RVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_WREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_BRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_RRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_BID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_RID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_RDATA + + out + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_RCOUNT + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_WCOUNT + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_RACOUNT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_WACOUNT + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP2_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_BREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_RDISSUECAP1_EN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_RREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_WLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_WRISSUECAP1_EN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_WVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_ARID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_AWID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_WID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_WDATA + + in + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP2_WSTRB + + in + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_AWREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_BVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_RLAST + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_RVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_WREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_BRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_RRESP + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_BID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_RID + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_RDATA + + out + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_RCOUNT + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_WCOUNT + + out + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_RACOUNT + + out + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_WACOUNT + + out + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + S_AXI_HP3_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_BREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_RDISSUECAP1_EN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_RREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_WLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_WRISSUECAP1_EN + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_WVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWBURST + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWLOCK + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWSIZE + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWPROT + + in + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWADDR + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWCACHE + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWLEN + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWQOS + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_ARID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_AWID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_WID + + in + + 5 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_WDATA + + in + + 63 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + S_AXI_HP3_WSTRB + + in + + 7 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + IRQ_P2F_DMAC_ABORT + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_DMAC0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_DMAC1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_DMAC2 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_DMAC3 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_DMAC4 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_DMAC5 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_DMAC6 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_DMAC7 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_SMC + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_QSPI + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_CTI + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_GPIO + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_USB0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_ENET0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_ENET_WAKE0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_SDIO0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_I2C0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_SPI0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_UART0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_CAN0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_USB1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_ENET1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_ENET_WAKE1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_SDIO1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_I2C1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_SPI1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_UART1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_P2F_CAN1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + IRQ_F2P + + in + + 0 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + Core0_nFIQ + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + Core0_nIRQ + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + Core1_nFIQ + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + Core1_nIRQ + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA0_DATYPE + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA0_DAVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA0_DRREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA1_DATYPE + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA1_DAVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA1_DRREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA2_DATYPE + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA2_DAVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA2_DRREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA3_DATYPE + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA3_DAVALID + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA3_DRREADY + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + DMA0_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA0_DAREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA0_DRLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA0_DRVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA1_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA1_DAREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA1_DRLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA1_DRVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA2_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA2_DAREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA2_DRLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA2_DRVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA3_ACLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA3_DAREADY + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA3_DRLAST + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA3_DRVALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA0_DRTYPE + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA1_DRTYPE + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA2_DRTYPE + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DMA3_DRTYPE + + in + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FCLK_CLK0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + FCLK_CLK1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + FCLK_CLK2 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FCLK_CLK3 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FCLK_CLKTRIG0_N + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FCLK_CLKTRIG1_N + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FCLK_CLKTRIG2_N + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FCLK_CLKTRIG3_N + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FCLK_RESET0_N + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + FCLK_RESET1_N + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FCLK_RESET2_N + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FCLK_RESET3_N + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FTMD_TRACEIN_DATA + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMD_TRACEIN_VALID + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMD_TRACEIN_CLK + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMD_TRACEIN_ATID + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_F2P_TRIG_0 + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_F2P_TRIGACK_0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FTMT_F2P_TRIG_1 + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_F2P_TRIGACK_1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FTMT_F2P_TRIG_2 + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_F2P_TRIGACK_2 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FTMT_F2P_TRIG_3 + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_F2P_TRIGACK_3 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FTMT_F2P_DEBUG + + in + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_P2F_TRIGACK_0 + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_P2F_TRIG_0 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FTMT_P2F_TRIGACK_1 + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_P2F_TRIG_1 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FTMT_P2F_TRIGACK_2 + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_P2F_TRIG_2 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FTMT_P2F_TRIGACK_3 + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + FTMT_P2F_TRIG_3 + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FTMT_P2F_DEBUG + + out + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + FPGA_IDLE_N + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + EVENT_EVENTO + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + EVENT_STANDBYWFE + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + EVENT_STANDBYWFI + + out + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + false + + + + + + EVENT_EVENTI + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + DDR_ARB + + in + + 3 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + false + + + + + + MIO + + inout + + 31 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + DDR_CAS_n + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_CKE + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_Clk_n + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_Clk + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_CS_n + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_DRSTB + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_ODT + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_RAS_n + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_WEB + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_BankAddr + + inout + + 2 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_Addr + + inout + + 14 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_VRN + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_VRP + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_DM + + inout + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_DQ + + inout + + 15 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_DQS_n + + inout + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + DDR_DQS + + inout + + 1 + 0 + + + + std_logic_vector + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + true + + + + + + PS_SRSTB + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + PS_CLK + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + PS_PORB + + inout + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + + C_EN_EMIO_PJTAG + 0 + + + C_EN_EMIO_ENET0 + 0 + + + C_EN_EMIO_ENET1 + 0 + + + C_EN_EMIO_TRACE + 0 + + + C_INCLUDE_TRACE_BUFFER + 0 + + + C_TRACE_BUFFER_FIFO_SIZE + 128 + + + USE_TRACE_DATA_EDGE_DETECTOR + 0 + + + C_TRACE_PIPELINE_WIDTH + 8 + + + C_TRACE_BUFFER_CLOCK_DELAY + 12 + + + C_EMIO_GPIO_WIDTH + 64 + + + C_INCLUDE_ACP_TRANS_CHECK + 0 + + + C_USE_DEFAULT_ACP_USER_VAL + 0 + + + C_S_AXI_ACP_ARUSER_VAL + 31 + + + C_S_AXI_ACP_AWUSER_VAL + 31 + + + C_M_AXI_GP0_ID_WIDTH + 12 + + + C_M_AXI_GP0_ENABLE_STATIC_REMAP + 0 + + + C_M_AXI_GP1_ID_WIDTH + 12 + + + C_M_AXI_GP1_ENABLE_STATIC_REMAP + 0 + + + C_S_AXI_GP0_ID_WIDTH + 6 + + + C_S_AXI_GP1_ID_WIDTH + 6 + + + C_S_AXI_ACP_ID_WIDTH + 3 + + + C_S_AXI_HP0_ID_WIDTH + 6 + + + C_S_AXI_HP0_DATA_WIDTH + 64 + + + C_S_AXI_HP1_ID_WIDTH + 6 + + + C_S_AXI_HP1_DATA_WIDTH + 64 + + + C_S_AXI_HP2_ID_WIDTH + 6 + + + C_S_AXI_HP2_DATA_WIDTH + 64 + + + C_S_AXI_HP3_ID_WIDTH + 6 + + + C_S_AXI_HP3_DATA_WIDTH + 64 + + + C_M_AXI_GP0_THREAD_ID_WIDTH + 12 + + + C_M_AXI_GP1_THREAD_ID_WIDTH + 12 + + + C_NUM_F2P_INTR_INPUTS + 1 + + + C_IRQ_F2P_MODE + DIRECT + + + C_DQ_WIDTH + 16 + + + C_DQS_WIDTH + 2 + + + C_DM_WIDTH + 2 + + + C_MIO_PRIMITIVE + 32 + + + C_TRACE_INTERNAL_WIDTH + 2 + + + C_USE_AXI_NONSECURE + 0 + + + C_USE_M_AXI_GP0 + 1 + + + C_USE_M_AXI_GP1 + 0 + + + C_USE_S_AXI_GP0 + 0 + + + C_USE_S_AXI_GP1 + 0 + + + C_USE_S_AXI_HP0 + 0 + + + C_USE_S_AXI_HP1 + 0 + + + C_USE_S_AXI_HP2 + 0 + + + C_USE_S_AXI_HP3 + 0 + + + C_USE_S_AXI_ACP + 0 + + + C_PS7_SI_REV + PRODUCTION + + + C_FCLK_CLK0_BUF + TRUE + + + C_FCLK_CLK1_BUF + TRUE + + + C_FCLK_CLK2_BUF + FALSE + + + C_FCLK_CLK3_BUF + FALSE + + + C_PACKAGE_NAME + clg225 + + + C_GP0_EN_MODIFIABLE_TXN + 1 + + + C_GP1_EN_MODIFIABLE_TXN + 1 + + + + + + choice_list_01016e83 + EMIO + MIO 0 + MIO 1 + MIO 2 + MIO 3 + MIO 4 + MIO 5 + MIO 6 + MIO 7 + MIO 8 + MIO 9 + MIO 10 + MIO 11 + MIO 12 + MIO 13 + MIO 14 + MIO 15 + MIO 28 + MIO 29 + MIO 30 + MIO 31 + MIO 32 + MIO 33 + MIO 34 + MIO 35 + MIO 36 + MIO 37 + MIO 38 + MIO 39 + MIO 48 + MIO 49 + MIO 52 + MIO 53 + + + choice_list_010e5fe6 + <Select> + EMIO + MIO 0 + MIO 1 + MIO 2 + MIO 3 + MIO 4 + MIO 5 + MIO 6 + MIO 9 + MIO 10 + MIO 11 + MIO 12 + MIO 13 + MIO 14 + MIO 15 + MIO 28 + MIO 29 + MIO 30 + MIO 31 + MIO 32 + MIO 33 + MIO 34 + MIO 35 + MIO 36 + MIO 37 + MIO 38 + MIO 39 + MIO 48 + MIO 49 + MIO 52 + MIO 53 + + + choice_list_03986362 + MIO 0 + MIO 1 + MIO 2 + MIO 3 + MIO 4 + MIO 5 + MIO 6 + MIO 7 + MIO 8 + MIO 9 + MIO 10 + MIO 11 + MIO 12 + MIO 13 + MIO 14 + MIO 15 + MIO 28 + MIO 29 + MIO 30 + MIO 31 + MIO 32 + MIO 33 + MIO 34 + MIO 35 + MIO 36 + MIO 37 + MIO 38 + MIO 39 + MIO 40 + MIO 41 + MIO 42 + MIO 43 + MIO 44 + MIO 45 + MIO 46 + MIO 47 + MIO 48 + MIO 49 + MIO 50 + MIO 51 + MIO 52 + MIO 53 + + + choice_list_070fff2f + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + + + choice_list_0bab4573 + EMIO + MIO 8 .. 9 + MIO 12 .. 13 + MIO 28 .. 29 + MIO 32 .. 33 + MIO 36 .. 37 + MIO 48 .. 49 + MIO 52 .. 53 + + + choice_list_0c9d0486 + EMIO + MIO 30 + + + choice_list_0d7de060 + ARM PLL + DDR PLL + IO PLL + External + + + choice_list_0daaec2d + EMIO + MIO 15 + MIO 39 + + + choice_list_1075ca33 + 4 + 2 + + + choice_list_11c6207d + EMIO + MIO 12 .. 13 + MIO 28 .. 29 + MIO 32 .. 33 + MIO 36 .. 37 + MIO 48 .. 49 + MIO 52 .. 53 + + + choice_list_13f07802 + DISABLED + + + choice_list_1622b516 + MIO 28 .. 39 + + + choice_list_16b99a53 + EMIO + MIO 28 .. 29 + + + choice_list_18cfbc12 + <Select> + EMIO + MIO 12 .. 13 + + + choice_list_18d4630d + EMIO + MIO 14 + MIO 38 + + + choice_list_1e586bca + EMIO + MIO 13 + MIO 37 + MIO 49 + + + choice_list_2091a159 + <Select> + MIO 0 2.. 14 + + + choice_list_20dc6536 + 32 + 16 + + + choice_list_2328412a + HPR(0)/LPR(32) + HPR(8)/LPR(24) + HPR(16)/LPR(16) + HPR(24)/LPR(8) + HPR(32)/LPR(0) + + + choice_list_27376075 + 12 + + + choice_list_2d7daef4 + disabled + enabled + + + choice_list_2e355d8b + Normal (0-85) + High (95 Max) + + + choice_list_303d848a + <Select> + MIO 1 + + + choice_list_30d18a73 + 0xE0105fff + + + choice_list_319636fe + 0xE0104fff + + + choice_list_32c7371b + 128 MBits + 256 MBits + 512 MBits + 1024 MBits + 2048 MBits + 4096 MBits + 8192 MBits + + + choice_list_35b40bd0 + 6 + + + choice_list_3607bdd0 + 0xE0102fff + + + choice_list_3740015d + 0xE0103fff + + + choice_list_37a9e17a + 16 Bit + + + choice_list_3b9f1944 + <Select> + x8 + + + choice_list_3f5f808e + LVCMOS 3.3V + LVCMOS 2.5V + HSTL 1.8V + LVCMOS 1.8V + + + choice_list_422ff54b + <Select> + fast + slow + + + choice_list_46eb370a + DIRECT + REVERSE + + + choice_list_49727578 + 0x00100000 + 0x00040000 + + + choice_list_4afe7e36 + <Select> + EMIO + MIO 10 .. 11 + + + choice_list_4d36a164 + <Select> + Low + Medium + High + + + choice_list_56c426e3 + <Select> + in + out + inout + + + choice_list_5b7401ad + EMIO + MIO 10 .. 15 + MIO 34 .. 39 + + + choice_list_5beb845c + x1 + x2 + x4 + + + choice_list_606c1634 + <Select> + EMIO + MIO 52 .. 53 + + + choice_list_61e0651c + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + + + choice_list_65fcbd6e + <Select> + MIO 0 + MIO 2 + MIO 4 + MIO 6 + MIO 8 + MIO 10 + MIO 12 + MIO 14 + MIO 28 + MIO 30 + MIO 32 + MIO 34 + MIO 36 + MIO 38 + MIO 48 + MIO 52 + + + choice_list_669c3f0f + EMIO + MIO 10 .. 11 + MIO 14 .. 15 + MIO 30 .. 31 + MIO 34 .. 35 + MIO 38 .. 39 + + + choice_list_6727dfa6 + 1 + 0 + + + choice_list_6885bca1 + Share reset pin + Separate reset pins + + + choice_list_6a48f1e0 + MIO + + + choice_list_6bc4d474 + LVCMOS 3.3V + + + choice_list_6bd7fb73 + Active High + Active Low + + + choice_list_72f3e128 + LVCMOS 1.8V + LVCMOS 2.5V + LVCMOS 3.3V + HSTL 1.8V + + + choice_list_74168eea + <Select> + MIO 0 + MIO 1 + MIO 2 + MIO 3 + MIO 4 + MIO 5 + MIO 6 + MIO 7 + MIO 8 + MIO 9 + MIO 10 + MIO 11 + MIO 12 + MIO 13 + MIO 14 + MIO 15 + MIO 28 + MIO 29 + MIO 30 + MIO 31 + MIO 32 + MIO 33 + MIO 34 + MIO 35 + MIO 36 + MIO 37 + MIO 38 + MIO 39 + MIO 48 + MIO 49 + MIO 52 + MIO 53 + + + choice_list_749bda6d + <Select> + MIO 1 + MIO 3 + MIO 5 + MIO 7 + MIO 9 + MIO 11 + MIO 13 + MIO 15 + MIO 29 + MIO 31 + MIO 33 + MIO 35 + MIO 37 + MIO 39 + MIO 49 + MIO 53 + + + choice_list_767f870c + External + + + choice_list_769ffd2b + EMIO + MIO 30 .. 31 + + + choice_list_7d098ed6 + ARM PLL + IO PLL + DDR PLL + External + + + choice_list_7d6d1b3f + 1 + 2 + 3 + + + choice_list_82c3921b + 0xE0008FFF + + + choice_list_83842e96 + 0xE0009FFF + + + choice_list_84bb437f + EMIO + MIO 28 .. 33 + + + choice_list_86458347 + fast + slow + + + choice_list_88fe7673 + 0xE0000FFF + + + choice_list_89b9cafe + 0xE0001FFF + + + choice_list_8af5a703 + 0 + 1 + + + choice_list_8ca738ca + 0xE0005FFF + + + choice_list_8de08447 + 0xE0004FFF + + + choice_list_8e2841d0 + 0xE0007FFF + + + choice_list_8f6ffd5d + 0xE0006FFF + + + choice_list_92aefd84 + 0xE0104000 + + + choice_list_93e94109 + 0xE0105000 + + + choice_list_9434c73e + <Select> + + + choice_list_9478ca27 + 0xE0103000 + + + choice_list_953f76aa + 0xE0102000 + + + choice_list_95a9da0c + in + out + inout + + + choice_list_96d47805 + 32 + 64 + 128 + 256 + + + choice_list_96f7b33d + 0xE0101000 + + + choice_list_97b00fb0 + 0xE0100000 + + + choice_list_99ba8646 + 32 + 64 + + + choice_list_9e358632 + None + Default + ZC702 + ZC706 + ZedBoard + + + choice_list_a0318123 + 54 + 32 + + + choice_list_a0b662d7 + EMIO + MIO 32 + + + choice_list_a0c775a9 + clg484 + clg225 + clg400 + ffg676 + fbg676 + fbg484 + ffg900 + cl400 + cl484 + rf676 + fb484 + + + choice_list_a841b9a1 + 1000 Mbps + 100 Mbps + 10 Mbps + + + choice_list_ae9f88f6 + 1 + + + choice_list_b4a6147c + 0xE000B000 + + + choice_list_b5e1a8f1 + 0xE000C000 + + + choice_list_b66926f4 + <Select> + EMIO + MIO 28 .. 39 + + + choice_list_b730348e + EMIO + MIO 31 + + + choice_list_b76ed1eb + 0xE000A000 + + + choice_list_ba65fe0e + <Select> + EMIO + MIO 2 .. 9 + + + choice_list_bbba28a6 + DDR3_1066E + DDR3_1066F + DDR3_1066G + DDR3_1333F + DDR3_1333G + DDR3_1333H + DDR3_1333J + DDR3_1600G + DDR3_1600H + DDR3_1600J + DDR3_1600K + + + choice_list_bc805c93 + <Select> + x1 + x2 + x4 + + + choice_list_bd8e4b31 + 6:2:1 + 4:2:1 + + + choice_list_be8ca58c + MT41J128M8 JP-125 + MT41J128M8 JP-15E + MT41J64M16 JT-125G + MT41J64M16 JT-15E + MT41J256M8 DA-107 + MT41K128M16 JT-125 + MT41J256M8 HX-125 + MT41J256M8 HX-15E + MT41J256M8 HX-187E + MT41J128M16 HA-107G + MT41J128M16 HA-125 + MT41J128M16 HA-15E + MT41J128M16 HA-187E + MT41J512M8 RA-15E + MT41K128M16 HA-15E + MT41K256M16 RE-125 + MT41K256M16 RE-15E + MT41K256M8 DA-125 + MT41K256M8 DA-15E + MT41K256M8 HX-15E + MT41J256M16 RE-125 + Custom + + + choice_list_bed41605 + PRODUCTION + + + choice_list_c11320b6 + 0x3FFFFFFF + + + choice_list_c4046e95 + 0xE0100FFF + + + choice_list_c543d218 + 0xE0101FFF + + + choice_list_c5ebb0ea + LPDDR 2 + DDR 2 + DDR 3 + DDR 3 (Low Voltage) + + + choice_list_c86dab60 + <Select> + EMIO + MIO 10 .. 11 + MIO 14 .. 15 + MIO 30 .. 31 + MIO 34 .. 35 + MIO 38 .. 39 + + + choice_list_ca108395 + 2 + 4 + 8 + 16 + 32 + + + choice_list_cbbe7bdf + MIO 1 .. 6 + + + choice_list_ce2e47bd + Share reset pin + + + choice_list_d0304fb3 + 0xE0009000 + + + choice_list_d10f4555 + FALSE + TRUE + + + choice_list_d177f33e + 0xE0008000 + + + choice_list_d2a5f697 + CPU_1X + External + + + choice_list_d2f51b63 + <Select> + MIO 0 9 .. 13 + + + choice_list_d525dd8e + 0xFCFFFFFF + + + choice_list_d88af9c3 + <Select> + Share reset pin + Separate reset pins + + + choice_list_da0dabdb + 0xE0001000 + + + choice_list_db4a1756 + 0xE0000000 + + + choice_list_dc5afbb9 + <Select> + EMIO + MIO 8 .. 9 + MIO 12 .. 13 + MIO 28 .. 29 + MIO 32 .. 33 + MIO 36 .. 37 + MIO 48 .. 49 + MIO 52 .. 53 + + + choice_list_dc7979fd + <Select> + MIO 8 + + + choice_list_dc85a6c5 + ARM PLL + DDR PLL + External + IO PLL + + + choice_list_dcdb9c78 + 0xE0006000 + + + choice_list_dd9c20f5 + 0xE0007000 + + + choice_list_de54e562 + 0xE0004000 + + + choice_list_df1359ef + 0xE0005000 + + + choice_list_e14dbfa8 + <Select> + MIO 0 + + + choice_list_e4dab0ce + 0xE000AFFF + + + choice_list_e655c9d4 + 0xE000CFFF + + + choice_list_e7127559 + 0xE000BFFF + + + choice_list_e743b0fa + DDR PLL + + + choice_list_ea556125 + ARM PLL + DDR PLL + IO PLL + + + choice_list_eaad72ce + 8 Bits + 16 Bits + 32 Bits + + + choice_list_eb70d2b3 + EMIO + MIO 0 + MIO 1 + MIO 2 + MIO 3 + MIO 4 + MIO 5 + MIO 6 + MIO 9 + MIO 10 + MIO 11 + MIO 12 + MIO 13 + MIO 14 + MIO 15 + MIO 28 + MIO 29 + MIO 30 + MIO 31 + MIO 32 + MIO 33 + MIO 34 + MIO 35 + MIO 36 + MIO 37 + MIO 38 + MIO 39 + MIO 48 + MIO 49 + MIO 52 + MIO 53 + + + choice_list_ece7f5f7 + <Select> + EMIO + MIO 14 .. 15 + MIO 38 .. 39 + MIO 52 .. 53 + + + choice_list_ee9dfa7e + <Select> + EMIO + MIO 14 .. 15 + + + choice_list_f585525a + 110 + 300 + 1200 + 2400 + 4800 + 9600 + 19200 + 38400 + 57600 + 115200 + 128000 + 230400 + 460800 + 921600 + + + choice_list_f591e16e + DDR PLL + ARM PLL + IO PLL + + + choice_list_f5e7200e + 6 + 12 + + + choice_list_f7b6ff1b + <Select> + EMIO + + + choice_list_fc3456a9 + Disabled + Enabled + + + choice_list_fd37a6fb + 4 + 8 + + + choice_list_fddce486 + <Select> + EMIO + MIO 10 .. 13 + MIO 34 .. 37 + + + choice_list_ffbc14f6 + <Select> + MIO 0 + MIO 1 + MIO 2 + MIO 3 + MIO 4 + MIO 5 + MIO 6 + MIO 7 + MIO 8 + MIO 9 + MIO 10 + MIO 11 + MIO 12 + MIO 13 + MIO 14 + MIO 15 + MIO 28 + MIO 29 + MIO 30 + MIO 31 + MIO 32 + MIO 33 + MIO 34 + MIO 35 + MIO 36 + MIO 37 + MIO 38 + MIO 39 + MIO 40 + MIO 41 + MIO 42 + MIO 43 + MIO 44 + MIO 45 + MIO 46 + MIO 47 + MIO 48 + MIO 49 + MIO 50 + MIO 51 + MIO 52 + MIO 53 + + + + + xilinx_anylanguagesynthesis_view_fileset + + design_1_processing_system7_0_0.xdc + xdc + + processing_order + early + + + + hdl/verilog/design_1_processing_system7_0_0.hwdef + hwdef + USED_IN_hw_handoff + + + ps7_init.c + cSource + USED_IN_hw_handoff + + + ps7_init.h + cSource + USED_IN_hw_handoff + + + ps7_init_gpl.c + cSource + USED_IN_hw_handoff + + + ps7_init_gpl.h + cSource + USED_IN_hw_handoff + + + ps7_init.tcl + tclSource + USED_IN_hw_handoff + + + ps7_init.html + html + USED_IN_hw_handoff + + + ../../ipshared/8fd3/hdl/verilog/processing_system7_v5_5_aw_atc.v + verilogSource + + + ../../ipshared/8fd3/hdl/verilog/processing_system7_v5_5_b_atc.v + verilogSource + + + ../../ipshared/8fd3/hdl/verilog/processing_system7_v5_5_w_atc.v + verilogSource + + + ../../ipshared/8fd3/hdl/verilog/processing_system7_v5_5_atc.v + verilogSource + + + ../../ipshared/8fd3/hdl/verilog/processing_system7_v5_5_trace_buffer.v + verilogSource + + + hdl/verilog/processing_system7_v5_5_processing_system7.v + verilogSource + + + + xilinx_verilogsynthesiswrapper_view_fileset + + synth/design_1_processing_system7_0_0.v + verilogSource + xil_defaultlib + + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_axi_infrastructure_1_1__ref_view_fileset + + ../../ipshared/ec67/hdl/axi_infrastructure_v1_1_0.vh + verilogSource + USED_IN_ipstatic + true + axi_infrastructure_v1_1_0 + + + ../../ipshared/ec67/hdl/axi_infrastructure_v1_1_vl_rfs.v + verilogSource + USED_IN_ipstatic + axi_infrastructure_v1_1_0 + + + + + + + + + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_sc_util_1_0__ref_view_fileset + + ../../ipshared/5bb9/hdl/verilog/sc_util_v1_0_3_constants.vh + verilogSource + USED_IN_ipstatic + true + smartconnect_v1_0 + + + ../../ipshared/5bb9/hdl/verilog/sc_util_v1_0_3_structs.svh + systemVerilogSource + USED_IN_ipstatic + true + smartconnect_v1_0 + + + ../../ipshared/5bb9/hdl/sc_util_v1_0_vl_rfs.sv + systemVerilogSource + USED_IN_ipstatic + smartconnect_v1_0 + + + + + + + + + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_axi_protocol_checker_2_0__ref_view_fileset + + ../../ipshared/03a9/hdl/axi_protocol_checker_v2_0_vl_rfs.sv + systemVerilogSource + USED_IN_ipstatic + axi_protocol_checker_v2_0_3 + + + + + + + + + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_axi_vip_1_1__ref_view_fileset + + ../../ipshared/b9a8/hdl/axi_vip_v1_1_vl_rfs.sv + systemVerilogSource + USED_IN_ipstatic + axi_vip_v1_1_3 + + + + + + + + + + + xilinx_anylanguagebehavioralsimulation_xilinx_com_ip_processing_system7_vip_1_0__ref_view_fileset + + ../../ipshared/70fd/hdl/processing_system7_vip_v1_0_5_local_params.v + verilogSource + USED_IN_ipstatic + true + processing_system7_vip_v1_0_5 + + + ../../ipshared/70fd/hdl/processing_system7_vip_v1_0_vl_rfs.sv + systemVerilogSource + USED_IN_ipstatic + processing_system7_vip_v1_0_5 + + + ../../ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_params.v + verilogSource + USED_IN_ipstatic + true + processing_system7_vip_v1_0_5 + + + ../../ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_init.v + verilogSource + USED_IN_ipstatic + true + processing_system7_vip_v1_0_5 + + + ../../ipshared/70fd/hdl/processing_system7_vip_v1_0_5_apis.v + verilogSource + USED_IN_ipstatic + true + processing_system7_vip_v1_0_5 + + + ../../ipshared/70fd/hdl/processing_system7_vip_v1_0_5_unused_ports.v + verilogSource + USED_IN_ipstatic + true + processing_system7_vip_v1_0_5 + + + ../../ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_gp.v + verilogSource + USED_IN_ipstatic + true + processing_system7_vip_v1_0_5 + + + ../../ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_acp.v + verilogSource + USED_IN_ipstatic + true + processing_system7_vip_v1_0_5 + + + ../../ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_hp.v + verilogSource + USED_IN_ipstatic + true + processing_system7_vip_v1_0_5 + + + + + + + + + + + xilinx_anylanguagebehavioralsimulation_1_view_fileset + + sim/libps7.so + swObjectLibrary + USED_IN_simulation + + + sim/libps7.dll + swObjectLibrary + USED_IN_simulation + + + sim/libremoteport.so + swObjectLibrary + USED_IN_simulation + + + sim/libremoteport.dll + swObjectLibrary + USED_IN_simulation + + + + xilinx_anylanguagesimulationwrapper_view_fileset + + sim/design_1_processing_system7_0_0.v + verilogSource + + + + xilinx_anylanguagesimulationwrapper_1_view_fileset + + sim/design_1_processing_system7_0_0.sv + systemVerilogSource + + + + xilinx_externalfiles_view_fileset + + design_1_processing_system7_0_0.dcp + dcp + USED_IN_implementation + USED_IN_synthesis + xil_defaultlib + + + design_1_processing_system7_0_0_stub.v + verilogSource + USED_IN_synth_blackbox_stub + xil_defaultlib + + + design_1_processing_system7_0_0_stub.vhdl + vhdlSource + USED_IN_synth_blackbox_stub + xil_defaultlib + + + design_1_processing_system7_0_0_sim_netlist.v + verilogSource + USED_IN_simulation + USED_IN_single_language + xil_defaultlib + + + design_1_processing_system7_0_0_sim_netlist.vhdl + vhdlSource + USED_IN_simulation + USED_IN_single_language + xil_defaultlib + + + + + + CPU0_A9 + + + + is_visible + FALSE + + + processor_type + ARM + + + + + CPU1_A9 + + + + is_visible + FALSE + + + processor_type + ARM + + + + + Arm dual core SOC with Zynq fpga + + + PCW_DDR_RAM_BASEADDR + PCW DDR RAM BASEADDR + 0x00100000 + + + + true + + + + + + PCW_DDR_RAM_HIGHADDR + PCW DDR RAM HIGHADDR + 0x1FFFFFFF + + + + true + + + + + + PCW_UART0_BASEADDR + PCW UART0 BASEADDR + 0xE0000000 + + + + true + + + + + + PCW_UART0_HIGHADDR + PCW UART0 HIGHADDR + 0xE0000FFF + + + + true + + + + + + PCW_UART1_BASEADDR + PCW UART1 BASEADDR + 0xE0001000 + + + + true + + + + + + PCW_UART1_HIGHADDR + PCW UART1 HIGHADDR + 0xE0001FFF + + + + true + + + + + + PCW_I2C0_BASEADDR + PCW I2C0 BASEADDR + 0xE0004000 + + + + true + + + + + + PCW_I2C0_HIGHADDR + PCW I2C0 HIGHADDR + 0xE0004FFF + + + + true + + + + + + PCW_I2C1_BASEADDR + PCW I2C1 BASEADDR + 0xE0005000 + + + + true + + + + + + PCW_I2C1_HIGHADDR + PCW I2C1 HIGHADDR + 0xE0005FFF + + + + true + + + + + + PCW_SPI0_BASEADDR + PCW SPI0 BASEADDR + 0xE0006000 + + + + true + + + + + + PCW_SPI0_HIGHADDR + PCW SPI0 HIGHADDR + 0xE0006FFF + + + + true + + + + + + PCW_SPI1_BASEADDR + PCW SPI1 BASEADDR + 0xE0007000 + + + + true + + + + + + PCW_SPI1_HIGHADDR + PCW SPI1 HIGHADDR + 0xE0007FFF + + + + true + + + + + + PCW_CAN0_BASEADDR + PCW CAN0 BASEADDR + 0xE0008000 + + + + false + + + + + + PCW_CAN0_HIGHADDR + PCW CAN0 HIGHADDR + 0xE0008FFF + + + + false + + + + + + PCW_CAN1_BASEADDR + PCW CAN1 BASEADDR + 0xE0009000 + + + + false + + + + + + PCW_CAN1_HIGHADDR + PCW CAN1 HIGHADDR + 0xE0009FFF + + + + false + + + + + + PCW_GPIO_BASEADDR + PCW GPIO BASEADDR + 0xE000A000 + + + + true + + + + + + PCW_GPIO_HIGHADDR + PCW GPIO HIGHADDR + 0xE000AFFF + + + + true + + + + + + PCW_ENET0_BASEADDR + PCW ENET0 BASEADDR + 0xE000B000 + + + + false + + + + + + PCW_ENET0_HIGHADDR + PCW ENET0 HIGHADDR + 0xE000BFFF + + + + false + + + + + + PCW_ENET1_BASEADDR + PCW ENET1 BASEADDR + 0xE000C000 + + + + false + + + + + + PCW_ENET1_HIGHADDR + PCW ENET1 HIGHADDR + 0xE000CFFF + + + + false + + + + + + PCW_SDIO0_BASEADDR + PCW SDIO0 BASEADDR + 0xE0100000 + + + + true + + + + + + PCW_SDIO0_HIGHADDR + PCW SDIO0 HIGHADDR + 0xE0100FFF + + + + true + + + + + + PCW_SDIO1_BASEADDR + PCW SDIO1 BASEADDR + 0xE0101000 + + + + true + + + + + + PCW_SDIO1_HIGHADDR + PCW SDIO1 HIGHADDR + 0xE0101FFF + + + + true + + + + + + PCW_USB0_BASEADDR + PCW USB0 BASEADDR + 0xE0102000 + + + + true + + + + + + PCW_USB0_HIGHADDR + PCW USB0 HIGHADDR + 0xE0102fff + + + + true + + + + + + PCW_USB1_BASEADDR + PCW USB1 BASEADDR + 0xE0103000 + + + + false + + + + + + PCW_USB1_HIGHADDR + PCW USB1 HIGHADDR + 0xE0103fff + + + + false + + + + + + PCW_TTC0_BASEADDR + PCW TTC0 BASEADDR + 0xE0104000 + + + + true + + + + + + PCW_TTC0_HIGHADDR + PCW TTC0 HIGHADDR + 0xE0104fff + + + + true + + + + + + PCW_TTC1_BASEADDR + PCW TTC1 BASEADDR + 0xE0105000 + + + + true + + + + + + PCW_TTC1_HIGHADDR + PCW TTC1 HIGHADDR + 0xE0105fff + + + + true + + + + + + PCW_FCLK_CLK0_BUF + PCW FCLK CLK0 BUF + TRUE + + + + true + + + + + + PCW_FCLK_CLK1_BUF + PCW FCLK CLK1 BUF + TRUE + + + + true + + + + + + PCW_FCLK_CLK2_BUF + PCW FCLK CLK2 BUF + FALSE + + + + false + + + + + + PCW_FCLK_CLK3_BUF + PCW FCLK CLK3 BUF + FALSE + + + + false + + + + + + PCW_UIPARAM_DDR_FREQ_MHZ + PCW UIPARAM DDR FREQ MHZ + 533.333333 + + + PCW_UIPARAM_DDR_BANK_ADDR_COUNT + PCW UIPARAM DDR BANK ADDR COUNT + 3 + + + + false + + + + + + PCW_UIPARAM_DDR_ROW_ADDR_COUNT + PCW UIPARAM DDR ROW ADDR COUNT + 15 + + + + false + + + + + + PCW_UIPARAM_DDR_COL_ADDR_COUNT + PCW UIPARAM DDR COL ADDR COUNT + 10 + + + + false + + + + + + PCW_UIPARAM_DDR_CL + PCW UIPARAM DDR CL + 7 + + + + false + + + + + + PCW_UIPARAM_DDR_CWL + PCW UIPARAM DDR CWL + 6 + + + + false + + + + + + PCW_UIPARAM_DDR_T_RCD + PCW UIPARAM DDR T RCD + 7 + + + + false + + + + + + PCW_UIPARAM_DDR_T_RP + PCW UIPARAM DDR T RP + 7 + + + + false + + + + + + PCW_UIPARAM_DDR_T_RC + PCW UIPARAM DDR T RC + 48.91 + + + + false + + + + + + PCW_UIPARAM_DDR_T_RAS_MIN + PCW UIPARAM DDR T RAS MIN + 35.0 + + + + false + + + + + + PCW_UIPARAM_DDR_T_FAW + PCW UIPARAM DDR T FAW + 40.0 + + + + false + + + + + + PCW_UIPARAM_DDR_AL + PCW UIPARAM DDR AL + 0 + + + PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_0 + PCW UIPARAM DDR DQS TO CLK DELAY 0 + 0.0 + + + PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_1 + PCW UIPARAM DDR DQS TO CLK DELAY 1 + 0.0 + + + PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_2 + PCW UIPARAM DDR DQS TO CLK DELAY 2 + 0.0 + + + PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_3 + PCW UIPARAM DDR DQS TO CLK DELAY 3 + 0.0 + + + PCW_UIPARAM_DDR_BOARD_DELAY0 + PCW UIPARAM DDR BOARD DELAY0 + 0.25 + + + PCW_UIPARAM_DDR_BOARD_DELAY1 + PCW UIPARAM DDR BOARD DELAY1 + 0.25 + + + PCW_UIPARAM_DDR_BOARD_DELAY2 + PCW UIPARAM DDR BOARD DELAY2 + 0.25 + + + PCW_UIPARAM_DDR_BOARD_DELAY3 + PCW UIPARAM DDR BOARD DELAY3 + 0.25 + + + PCW_UIPARAM_DDR_DQS_0_LENGTH_MM + PCW UIPARAM DDR DQS 0 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_DQS_1_LENGTH_MM + PCW UIPARAM DDR DQS 1 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_DQS_2_LENGTH_MM + PCW UIPARAM DDR DQS 2 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_DQS_3_LENGTH_MM + PCW UIPARAM DDR DQS 3 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_DQ_0_LENGTH_MM + PCW UIPARAM DDR DQ 0 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_DQ_1_LENGTH_MM + PCW UIPARAM DDR DQ 1 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_DQ_2_LENGTH_MM + PCW UIPARAM DDR DQ 2 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_DQ_3_LENGTH_MM + PCW UIPARAM DDR DQ 3 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_CLOCK_0_LENGTH_MM + PCW UIPARAM DDR CLOCK 0 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_CLOCK_1_LENGTH_MM + PCW UIPARAM DDR CLOCK 1 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_CLOCK_2_LENGTH_MM + PCW UIPARAM DDR CLOCK 2 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_CLOCK_3_LENGTH_MM + PCW UIPARAM DDR CLOCK 3 LENGTH MM + 0 + + + PCW_UIPARAM_DDR_DQS_0_PACKAGE_LENGTH + PCW UIPARAM DDR DQS 0 PACKAGE LENGTH + 81.244 + + + PCW_UIPARAM_DDR_DQS_1_PACKAGE_LENGTH + PCW UIPARAM DDR DQS 1 PACKAGE LENGTH + 57.044 + + + PCW_UIPARAM_DDR_DQS_2_PACKAGE_LENGTH + PCW UIPARAM DDR DQS 2 PACKAGE LENGTH + 520 + + + PCW_UIPARAM_DDR_DQS_3_PACKAGE_LENGTH + PCW UIPARAM DDR DQS 3 PACKAGE LENGTH + 700 + + + PCW_UIPARAM_DDR_DQ_0_PACKAGE_LENGTH + PCW UIPARAM DDR DQ 0 PACKAGE LENGTH + 77.166 + + + PCW_UIPARAM_DDR_DQ_1_PACKAGE_LENGTH + PCW UIPARAM DDR DQ 1 PACKAGE LENGTH + 53.995 + + + PCW_UIPARAM_DDR_DQ_2_PACKAGE_LENGTH + PCW UIPARAM DDR DQ 2 PACKAGE LENGTH + 550 + + + PCW_UIPARAM_DDR_DQ_3_PACKAGE_LENGTH + PCW UIPARAM DDR DQ 3 PACKAGE LENGTH + 780 + + + PCW_UIPARAM_DDR_CLOCK_0_PACKAGE_LENGTH + PCW UIPARAM DDR CLOCK 0 PACKAGE LENGTH + 86.1835 + + + PCW_UIPARAM_DDR_CLOCK_1_PACKAGE_LENGTH + PCW UIPARAM DDR CLOCK 1 PACKAGE LENGTH + 86.1835 + + + PCW_UIPARAM_DDR_CLOCK_2_PACKAGE_LENGTH + PCW UIPARAM DDR CLOCK 2 PACKAGE LENGTH + 86.1835 + + + PCW_UIPARAM_DDR_CLOCK_3_PACKAGE_LENGTH + PCW UIPARAM DDR CLOCK 3 PACKAGE LENGTH + 86.1835 + + + PCW_UIPARAM_DDR_DQS_0_PROPOGATION_DELAY + PCW UIPARAM DDR DQS 0 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_DQS_1_PROPOGATION_DELAY + PCW UIPARAM DDR DQS 1 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_DQS_2_PROPOGATION_DELAY + PCW UIPARAM DDR DQS 2 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_DQS_3_PROPOGATION_DELAY + PCW UIPARAM DDR DQS 3 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_DQ_0_PROPOGATION_DELAY + PCW UIPARAM DDR DQ 0 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_DQ_1_PROPOGATION_DELAY + PCW UIPARAM DDR DQ 1 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_DQ_2_PROPOGATION_DELAY + PCW UIPARAM DDR DQ 2 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_DQ_3_PROPOGATION_DELAY + PCW UIPARAM DDR DQ 3 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_CLOCK_0_PROPOGATION_DELAY + PCW UIPARAM DDR CLOCK 0 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_CLOCK_1_PROPOGATION_DELAY + PCW UIPARAM DDR CLOCK 1 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_CLOCK_2_PROPOGATION_DELAY + PCW UIPARAM DDR CLOCK 2 PROPOGATION DELAY + 160 + + + PCW_UIPARAM_DDR_CLOCK_3_PROPOGATION_DELAY + PCW UIPARAM DDR CLOCK 3 PROPOGATION DELAY + 160 + + + PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_0 + PCW PACKAGE DDR DQS TO CLK DELAY 0 + 0.005 + + + PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_1 + PCW PACKAGE DDR DQS TO CLK DELAY 1 + 0.029 + + + PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_2 + PCW PACKAGE DDR DQS TO CLK DELAY 2 + -0.434 + + + PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_3 + PCW PACKAGE DDR DQS TO CLK DELAY 3 + -0.614 + + + PCW_PACKAGE_DDR_BOARD_DELAY0 + PCW PACKAGE DDR BOARD DELAY0 + 0.082 + + + PCW_PACKAGE_DDR_BOARD_DELAY1 + PCW PACKAGE DDR BOARD DELAY1 + 0.070 + + + PCW_PACKAGE_DDR_BOARD_DELAY2 + PCW PACKAGE DDR BOARD DELAY2 + 0.318 + + + PCW_PACKAGE_DDR_BOARD_DELAY3 + PCW PACKAGE DDR BOARD DELAY3 + 0.433 + + + PCW_CPU_CPU_6X4X_MAX_RANGE + PCW CPU CPU 6X4X MAX RANGE + 667 + + + PCW_CRYSTAL_PERIPHERAL_FREQMHZ + PCW CRYSTAL PERIPHERAL FREQMHZ + 33.333333 + + + PCW_APU_PERIPHERAL_FREQMHZ + PCW APU PERIPHERAL FREQMHZ + 666.666666 + + + PCW_DCI_PERIPHERAL_FREQMHZ + PCW DCI PERIPHERAL FREQMHZ + 10.159 + + + PCW_QSPI_PERIPHERAL_FREQMHZ + PCW QSPI PERIPHERAL FREQMHZ + 200 + + + PCW_SMC_PERIPHERAL_FREQMHZ + PCW SMC PERIPHERAL FREQMHZ + 100 + + + + false + + + + + + PCW_USB0_PERIPHERAL_FREQMHZ + PCW USB0 PERIPHERAL FREQMHZ + 60 + + + + false + + + + + + PCW_USB1_PERIPHERAL_FREQMHZ + PCW USB1 PERIPHERAL FREQMHZ + 60 + + + + false + + + + + + PCW_SDIO_PERIPHERAL_FREQMHZ + PCW SDIO PERIPHERAL FREQMHZ + 100 + + + PCW_UART_PERIPHERAL_FREQMHZ + PCW UART PERIPHERAL FREQMHZ + 100 + + + PCW_SPI_PERIPHERAL_FREQMHZ + PCW SPI PERIPHERAL FREQMHZ + 166.666666 + + + PCW_CAN_PERIPHERAL_FREQMHZ + PCW CAN PERIPHERAL FREQMHZ + 100 + + + + false + + + + + + PCW_CAN0_PERIPHERAL_FREQMHZ + PCW CAN0 PERIPHERAL FREQMHZ + -1 + + + + false + + + + + + PCW_CAN1_PERIPHERAL_FREQMHZ + PCW CAN1 PERIPHERAL FREQMHZ + -1 + + + + false + + + + + + PCW_I2C_PERIPHERAL_FREQMHZ + PCW I2C PERIPHERAL FREQMHZ + 111.111115 + + + PCW_WDT_PERIPHERAL_FREQMHZ + PCW WDT PERIPHERAL FREQMHZ + 133.333333 + + + + false + + + + + + PCW_TTC_PERIPHERAL_FREQMHZ + PCW TTC PERIPHERAL FREQMHZ + 50 + + + PCW_TTC0_CLK0_PERIPHERAL_FREQMHZ + PCW TTC0 CLK0 PERIPHERAL FREQMHZ + 133.333333 + + + + false + + + + + + PCW_TTC0_CLK1_PERIPHERAL_FREQMHZ + PCW TTC0 CLK1 PERIPHERAL FREQMHZ + 133.333333 + + + + false + + + + + + PCW_TTC0_CLK2_PERIPHERAL_FREQMHZ + PCW TTC0 CLK2 PERIPHERAL FREQMHZ + 133.333333 + + + + false + + + + + + PCW_TTC1_CLK0_PERIPHERAL_FREQMHZ + PCW TTC1 CLK0 PERIPHERAL FREQMHZ + 133.333333 + + + + false + + + + + + PCW_TTC1_CLK1_PERIPHERAL_FREQMHZ + PCW TTC1 CLK1 PERIPHERAL FREQMHZ + 133.333333 + + + + false + + + + + + PCW_TTC1_CLK2_PERIPHERAL_FREQMHZ + PCW TTC1 CLK2 PERIPHERAL FREQMHZ + 133.333333 + + + + false + + + + + + PCW_PCAP_PERIPHERAL_FREQMHZ + PCW PCAP PERIPHERAL FREQMHZ + 200 + + + PCW_TPIU_PERIPHERAL_FREQMHZ + PCW TPIU PERIPHERAL FREQMHZ + 200 + + + + false + + + + + + PCW_FPGA0_PERIPHERAL_FREQMHZ + PCW FPGA0 PERIPHERAL FREQMHZ + 50 + + + PCW_FPGA1_PERIPHERAL_FREQMHZ + PCW FPGA1 PERIPHERAL FREQMHZ + 100 + + + PCW_FPGA2_PERIPHERAL_FREQMHZ + PCW FPGA2 PERIPHERAL FREQMHZ + 50 + + + PCW_FPGA3_PERIPHERAL_FREQMHZ + PCW FPGA3 PERIPHERAL FREQMHZ + 50 + + + PCW_ACT_APU_PERIPHERAL_FREQMHZ + PCW ACT APU PERIPHERAL FREQMHZ + 666.666687 + + + PCW_UIPARAM_ACT_DDR_FREQ_MHZ + PCW UIPARAM ACT DDR FREQ MHZ + 533.333374 + + + PCW_ACT_DCI_PERIPHERAL_FREQMHZ + PCW ACT DCI PERIPHERAL FREQMHZ + 10.158730 + + + PCW_ACT_QSPI_PERIPHERAL_FREQMHZ + PCW ACT QSPI PERIPHERAL FREQMHZ + 200.000000 + + + PCW_ACT_SMC_PERIPHERAL_FREQMHZ + PCW ACT SMC PERIPHERAL FREQMHZ + 10.000000 + + + PCW_ACT_ENET0_PERIPHERAL_FREQMHZ + PCW ACT ENET0 PERIPHERAL FREQMHZ + 125.000000 + + + PCW_ACT_ENET1_PERIPHERAL_FREQMHZ + PCW ACT ENET1 PERIPHERAL FREQMHZ + 10.000000 + + + PCW_ACT_USB0_PERIPHERAL_FREQMHZ + PCW ACT USB0 PERIPHERAL FREQMHZ + 60 + + + PCW_ACT_USB1_PERIPHERAL_FREQMHZ + PCW ACT USB1 PERIPHERAL FREQMHZ + 60 + + + PCW_ACT_SDIO_PERIPHERAL_FREQMHZ + PCW ACT SDIO PERIPHERAL FREQMHZ + 100.000000 + + + PCW_ACT_UART_PERIPHERAL_FREQMHZ + PCW ACT UART PERIPHERAL FREQMHZ + 100.000000 + + + PCW_ACT_SPI_PERIPHERAL_FREQMHZ + PCW ACT SPI PERIPHERAL FREQMHZ + 166.666672 + + + PCW_ACT_CAN_PERIPHERAL_FREQMHZ + PCW ACT CAN PERIPHERAL FREQMHZ + 10.000000 + + + PCW_ACT_CAN0_PERIPHERAL_FREQMHZ + PCW ACT CAN0 PERIPHERAL FREQMHZ + 23.8095 + + + PCW_ACT_CAN1_PERIPHERAL_FREQMHZ + PCW ACT CAN0 PERIPHERAL FREQMHZ + 23.8095 + + + PCW_ACT_I2C_PERIPHERAL_FREQMHZ + PCW ACT I2C PERIPHERAL FREQMHZ + 50 + + + PCW_ACT_WDT_PERIPHERAL_FREQMHZ + PCW ACT WDT PERIPHERAL FREQMHZ + 111.111115 + + + PCW_ACT_TTC_PERIPHERAL_FREQMHZ + PCW ACT TTC PERIPHERAL FREQMHZ + 50 + + + PCW_ACT_PCAP_PERIPHERAL_FREQMHZ + PCW ACT PCAP PERIPHERAL FREQMHZ + 200.000000 + + + PCW_ACT_TPIU_PERIPHERAL_FREQMHZ + PCW ACT TPIU PERIPHERAL FREQMHZ + 200.000000 + + + PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ + PCW ACT FPGA0 PERIPHERAL FREQMHZ + 50.000000 + + + PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ + PCW ACT FPGA1 PERIPHERAL FREQMHZ + 100.000000 + + + PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ + PCW ACT FPGA2 PERIPHERAL FREQMHZ + 10.000000 + + + PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ + PCW ACT FPGA3 PERIPHERAL FREQMHZ + 10.000000 + + + PCW_ACT_TTC0_CLK0_PERIPHERAL_FREQMHZ + PCW ACT TTC0 CLK0 PERIPHERAL FREQMHZ + 111.111115 + + + PCW_ACT_TTC0_CLK1_PERIPHERAL_FREQMHZ + PCW ACT TTC0 CLK1 PERIPHERAL FREQMHZ + 111.111115 + + + PCW_ACT_TTC0_CLK2_PERIPHERAL_FREQMHZ + PCW ACT TTC0 CLK2 PERIPHERAL FREQMHZ + 111.111115 + + + PCW_ACT_TTC1_CLK0_PERIPHERAL_FREQMHZ + PCW ACT TTC1 CLK0 PERIPHERAL FREQMHZ + 111.111115 + + + PCW_ACT_TTC1_CLK1_PERIPHERAL_FREQMHZ + PCW ACT TTC1 CLK1 PERIPHERAL FREQMHZ + 111.111115 + + + PCW_ACT_TTC1_CLK2_PERIPHERAL_FREQMHZ + PCW ACT TTC1 CLK2 PERIPHERAL FREQMHZ + 111.111115 + + + PCW_CLK0_FREQ + PCW CLK0 FREQ + 50000000 + + + PCW_CLK1_FREQ + PCW CLK1 FREQ + 100000000 + + + PCW_CLK2_FREQ + PCW CLK2 FREQ + 10000000 + + + PCW_CLK3_FREQ + PCW CLK3 FREQ + 10000000 + + + PCW_OVERRIDE_BASIC_CLOCK + PCW OVERRIDE FREQ + 0 + + + PCW_CPU_PERIPHERAL_DIVISOR0 + CLKPARAM + 2 + + + + false + + + + + + PCW_DDR_PERIPHERAL_DIVISOR0 + CLKPARAM + 2 + + + + false + + + + + + PCW_SMC_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + + false + + + + + + PCW_QSPI_PERIPHERAL_DIVISOR0 + CLKPARAM + 5 + + + + false + + + + + + PCW_SDIO_PERIPHERAL_DIVISOR0 + CLKPARAM + 10 + + + + false + + + + + + PCW_UART_PERIPHERAL_DIVISOR0 + CLKPARAM + 10 + + + + false + + + + + + PCW_SPI_PERIPHERAL_DIVISOR0 + CLKPARAM + 6 + + + + false + + + + + + PCW_CAN_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + + false + + + + + + PCW_CAN_PERIPHERAL_DIVISOR1 + CLKPARAM + 1 + + + + false + + + + + + PCW_FCLK0_PERIPHERAL_DIVISOR0 + CLKPARAM + 5 + + + + false + + + + + + PCW_FCLK1_PERIPHERAL_DIVISOR0 + CLKPARAM + 5 + + + + false + + + + + + PCW_FCLK2_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + + false + + + + + + PCW_FCLK3_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + + false + + + + + + PCW_FCLK0_PERIPHERAL_DIVISOR1 + CLKPARAM + 4 + + + + false + + + + + + PCW_FCLK1_PERIPHERAL_DIVISOR1 + CLKPARAM + 2 + + + + false + + + + + + PCW_FCLK2_PERIPHERAL_DIVISOR1 + CLKPARAM + 1 + + + + false + + + + + + PCW_FCLK3_PERIPHERAL_DIVISOR1 + CLKPARAM + 1 + + + + false + + + + + + PCW_ENET0_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + + false + + + + + + PCW_ENET1_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + + false + + + + + + PCW_ENET0_PERIPHERAL_DIVISOR1 + CLKPARAM + 1 + + + + false + + + + + + PCW_ENET1_PERIPHERAL_DIVISOR1 + CLKPARAM + 1 + + + + false + + + + + + PCW_TPIU_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + + false + + + + + + PCW_DCI_PERIPHERAL_DIVISOR0 + CLKPARAM + 15 + + + + false + + + + + + PCW_DCI_PERIPHERAL_DIVISOR1 + CLKPARAM + 7 + + + + false + + + + + + PCW_PCAP_PERIPHERAL_DIVISOR0 + CLKPARAM + 5 + + + + false + + + + + + PCW_TTC0_CLK0_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + PCW_TTC0_CLK1_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + PCW_TTC0_CLK2_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + PCW_TTC1_CLK0_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + PCW_TTC1_CLK1_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + PCW_TTC1_CLK2_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + PCW_WDT_PERIPHERAL_DIVISOR0 + CLKPARAM + 1 + + + PCW_ARMPLL_CTRL_FBDIV + CLKPARAM + 40 + + + + false + + + + + + PCW_IOPLL_CTRL_FBDIV + CLKPARAM + 30 + + + + false + + + + + + PCW_DDRPLL_CTRL_FBDIV + CLKPARAM + 32 + + + + false + + + + + + PCW_CPU_CPU_PLL_FREQMHZ + CLKPARAM + 1333.333 + + + + false + + + + + + PCW_IO_IO_PLL_FREQMHZ + CLKPARAM + 1000.000 + + + + false + + + + + + PCW_DDR_DDR_PLL_FREQMHZ + CLKPARAM + 1066.667 + + + + false + + + + + + PCW_SMC_PERIPHERAL_VALID + PCW SMC PERIPHERAL VALID + 0 + + + PCW_SDIO_PERIPHERAL_VALID + PCW SDIO PERIPHERAL VALID + 1 + + + PCW_SPI_PERIPHERAL_VALID + PCW SPI PERIPHERAL VALID + 1 + + + PCW_CAN_PERIPHERAL_VALID + PCW CAN PERIPHERAL VALID + 0 + + + PCW_UART_PERIPHERAL_VALID + PCW UART PERIPHERAL VALID + 1 + + + PCW_EN_EMIO_CAN0 + PCW EN EMIO CAN0 + 0 + + + PCW_EN_EMIO_CAN1 + PCW EN EMIO CAN1 + 0 + + + PCW_EN_EMIO_ENET0 + PCW EN EMIO ENET0 + 0 + + + PCW_EN_EMIO_ENET1 + PCW EN EMIO ENET1 + 0 + + + PCW_EN_PTP_ENET0 + PCW EN PTP ENET0 + 0 + + + PCW_EN_PTP_ENET1 + PCW EN PTP ENET1 + 0 + + + PCW_EN_EMIO_GPIO + PCW EN EMIO GPIO + 1 + + + PCW_EN_EMIO_I2C0 + PCW EN EMIO I2C0 + 1 + + + PCW_EN_EMIO_I2C1 + PCW EN EMIO I2C1 + 0 + + + PCW_EN_EMIO_PJTAG + PCW EN EMIO PJTAG + 0 + + + PCW_EN_EMIO_SDIO0 + PCW EN EMIO SDIO0 + 1 + + + PCW_EN_EMIO_CD_SDIO0 + PCW EN EMIO CD SDIO0 + 1 + + + PCW_EN_EMIO_WP_SDIO0 + PCW EN EMIO WP SDIO0 + 1 + + + PCW_EN_EMIO_SDIO1 + PCW EN EMIO SDIO1 + 0 + + + PCW_EN_EMIO_CD_SDIO1 + PCW EN EMIO CD SDIO1 + 0 + + + PCW_EN_EMIO_WP_SDIO1 + PCW EN EMIO WP SDIO1 + 0 + + + PCW_EN_EMIO_SPI0 + PCW EN EMIO SPI0 + 1 + + + PCW_EN_EMIO_SPI1 + PCW EN EMIO SPI1 + 1 + + + PCW_EN_EMIO_UART0 + PCW EN EMIO UART0 + 1 + + + PCW_EN_EMIO_UART1 + PCW EN EMIO UART1 + 0 + + + PCW_EN_EMIO_MODEM_UART0 + PCW EN EMIO MODEM UART0 + 0 + + + PCW_EN_EMIO_MODEM_UART1 + PCW EN EMIO MODEM UART1 + 0 + + + PCW_EN_EMIO_TTC0 + PCW EN EMIO TTC0 + 1 + + + PCW_EN_EMIO_TTC1 + PCW EN EMIO TTC1 + 1 + + + PCW_EN_EMIO_WDT + PCW EN EMIO WDT + 0 + + + PCW_EN_EMIO_TRACE + PCW EN EMIO TRACE + 0 + + + PCW_USE_AXI_NONSECURE + PCW USE AXI NON SECURE + 0 + + + PCW_USE_M_AXI_GP0 + PCW USE M AXI GP0 + 1 + + + PCW_USE_M_AXI_GP1 + PCW USE M AXI GP1 + 0 + + + PCW_USE_S_AXI_GP0 + PCW USE S AXI GP0 + 0 + + + PCW_USE_S_AXI_GP1 + PCW USE S AXI GP1 + 0 + + + PCW_USE_S_AXI_ACP + PCW USE S AXI ACP + 0 + + + PCW_USE_S_AXI_HP0 + PCW USE S AXI HP0 + 0 + + + PCW_USE_S_AXI_HP1 + PCW USE S AXI HP1 + 0 + + + PCW_USE_S_AXI_HP2 + PCW USE S AXI HP2 + 0 + + + PCW_USE_S_AXI_HP3 + PCW USE S AXI HP3 + 0 + + + PCW_M_AXI_GP0_FREQMHZ + PCW M AXI GP0 FREQMHZ + 50 + + + + true + + + + + + PCW_M_AXI_GP1_FREQMHZ + PCW M AXI GP1 FREQMHZ + 10 + + + + false + + + + + + PCW_S_AXI_GP0_FREQMHZ + PCW S AXI GP0 FREQMHZ + 10 + + + + false + + + + + + PCW_S_AXI_GP1_FREQMHZ + PCW S AXI GP1 FREQMHZ + 10 + + + + false + + + + + + PCW_S_AXI_ACP_FREQMHZ + PCW S AXI ACP FREQMHZ + 10 + + + + false + + + + + + PCW_S_AXI_HP0_FREQMHZ + PCW S AXI HP0 FREQMHZ + 10 + + + + false + + + + + + PCW_S_AXI_HP1_FREQMHZ + PCW S AXI HP1 FREQMHZ + 10 + + + + false + + + + + + PCW_S_AXI_HP2_FREQMHZ + PCW S AXI HP2 FREQMHZ + 10 + + + + false + + + + + + PCW_S_AXI_HP3_FREQMHZ + PCW S AXI HP3 FREQMHZ + 10 + + + + false + + + + + + PCW_USE_DMA0 + PCW USE DMA0 + 0 + + + PCW_USE_DMA1 + PCW USE DMA1 + 0 + + + PCW_USE_DMA2 + PCW USE DMA2 + 0 + + + PCW_USE_DMA3 + PCW USE DMA3 + 0 + + + PCW_USE_TRACE + PCW USE TRACE + Enable FTM Trace interface used to capture data from PL to PS debug system + 0 + + + PCW_TRACE_PIPELINE_WIDTH + PCW TRACE PIPELINE WIDTH + 8 + + + + false + + + + + + PCW_INCLUDE_TRACE_BUFFER + PCW INCLUDE TRACE BUFFER + 0 + + + + false + + + + + + PCW_TRACE_BUFFER_FIFO_SIZE + PCW TRACE BUFFER FIFO SIZE + 128 + + + + false + + + + + + PCW_USE_TRACE_DATA_EDGE_DETECTOR + PCW USE TRACE DATA EDGE DETECTOR + 0 + + + + false + + + + + + PCW_TRACE_BUFFER_CLOCK_DELAY + PCW TRACE BUFFER CLOCK DELAY + 12 + + + + false + + + + + + PCW_USE_CROSS_TRIGGER + PCW USE CROSS TRIGGER + 0 + + + PCW_FTM_CTI_IN0 + <Select> + + + + false + + + + + + PCW_FTM_CTI_IN1 + <Select> + + + + false + + + + + + PCW_FTM_CTI_IN2 + <Select> + + + + false + + + + + + PCW_FTM_CTI_IN3 + <Select> + + + + false + + + + + + PCW_FTM_CTI_OUT0 + <Select> + + + + false + + + + + + PCW_FTM_CTI_OUT1 + <Select> + + + + false + + + + + + PCW_FTM_CTI_OUT2 + <Select> + + + + false + + + + + + PCW_FTM_CTI_OUT3 + <Select> + + + + false + + + + + + PCW_USE_DEBUG + PCW USE DEBUG + 0 + + + PCW_USE_CR_FABRIC + PCW USE CR FABRIC + 1 + + + PCW_USE_AXI_FABRIC_IDLE + PCW USE AXI FABRIC IDLE + Enables idle AXI signal to the PS used to indicate that there are no outstanding AXI transactions in the PL + 0 + + + PCW_USE_DDR_BYPASS + PCW USE DDR BYPASS + Enables DDR urgent/arb signal used to signal a critical memory starvation situation to the DDR arbitration for the four AXI ports of the PS DDR memory controller + 0 + + + PCW_USE_FABRIC_INTERRUPT + PCW USE FABRIC INTERRUPT + 1 + + + PCW_USE_PROC_EVENT_BUS + PCW USE PROC EVENT BUS + 0 + + + PCW_USE_EXPANDED_IOP + PCW USE EXPANDED IOP + 0 + + + PCW_USE_HIGH_OCM + PCW USE HIGH OCM + 0 + + + PCW_USE_PS_SLCR_REGISTERS + PCW USE PS SLCR REGISTERS + 0 + + + PCW_USE_EXPANDED_PS_SLCR_REGISTERS + PCW USE EXPANDED PS SLCR REGISTERS + 0 + + + + false + + + + + + PCW_USE_CORESIGHT + PCW USE CORESIGHT + 0 + + + PCW_EN_EMIO_SRAM_INT + PCW EN EMIO SRAM INT + 0 + + + PCW_GPIO_EMIO_GPIO_WIDTH + PCW EMIO GPIO WIDTH + 64 + + + + true + + + + + + PCW_GP0_NUM_WRITE_THREADS + GP0 NUM WRITE THREADS + 4 + + + PCW_GP0_NUM_READ_THREADS + GP0 NUM READ THREADS + 4 + + + PCW_GP1_NUM_WRITE_THREADS + GP1 NUM WRITE THREADS + 4 + + + PCW_GP1_NUM_READ_THREADS + GP1 NUM READ THREADS + 4 + + + PCW_UART0_BAUD_RATE + PCW UART0 BAUD RATE + Configure baud rate to determine UART0 operating frequency + 115200 + + + + true + + + + + + PCW_UART1_BAUD_RATE + PCW UART1 BAUD RATE + Configure baud rate to determine UART1 operating frequency + 115200 + + + + true + + + + + + PCW_EN_4K_TIMER + PCW EN 4K TIMER + 0 + + + PCW_M_AXI_GP0_ID_WIDTH + PCW M AXI GP0 ID WIDTH + 12 + + + + true + + + + + + PCW_M_AXI_GP0_ENABLE_STATIC_REMAP + PCW M AXI GP0 ENABLE STATIC REMAP + 0 + + + + true + + + + + + PCW_M_AXI_GP0_SUPPORT_NARROW_BURST + PCW M AXI GP0 SUPPORT NARROW BURST + 0 + + + + true + + + + + + PCW_M_AXI_GP0_THREAD_ID_WIDTH + PCW M AXI GP0 THREAD ID WIDTH + 12 + + + + true + + + + + + PCW_M_AXI_GP1_ID_WIDTH + PCW M AXI GP1 ID WIDTH + 12 + + + + false + + + + + + PCW_M_AXI_GP1_ENABLE_STATIC_REMAP + PCW M AXI GP1 ENABLE STATIC REMAP + 0 + + + + false + + + + + + PCW_M_AXI_GP1_SUPPORT_NARROW_BURST + PCW M AXI GP1 SUPPORT NARROW BURST + 0 + + + + false + + + + + + PCW_M_AXI_GP1_THREAD_ID_WIDTH + PCW M AXI GP1 THREAD ID WIDTH + 12 + + + + false + + + + + + PCW_S_AXI_GP0_ID_WIDTH + PCW S AXI GP0 ID WIDTH + 6 + + + + false + + + + + + PCW_S_AXI_GP1_ID_WIDTH + PCW S AXI GP1 ID WIDTH + 6 + + + + false + + + + + + PCW_S_AXI_ACP_ID_WIDTH + PCW S AXI ACP ID WIDTH + 3 + + + + false + + + + + + PCW_INCLUDE_ACP_TRANS_CHECK + PCW INCLUDE ACP TRANS CHECK + 0 + + + PCW_USE_DEFAULT_ACP_USER_VAL + PCW USE DEFAULT ACP USER VAL + 0 + + + + false + + + + + + PCW_S_AXI_ACP_ARUSER_VAL + PCW S AXI ACP ARUSER VAL + 31 + + + + false + + + + + + PCW_S_AXI_ACP_AWUSER_VAL + PCW S AXI ACP AWUSER VAL + 31 + + + + false + + + + + + PCW_S_AXI_HP0_ID_WIDTH + PCW S AXI HP0 ID WIDTH + 6 + + + + false + + + + + + PCW_S_AXI_HP0_DATA_WIDTH + PCW S AXI HP0 DATA WIDTH + 64 + + + + true + + + + + + PCW_S_AXI_HP1_ID_WIDTH + PCW S AXI HP1 ID WIDTH + 6 + + + + false + + + + + + PCW_S_AXI_HP1_DATA_WIDTH + PCW S AXI HP1 DATA WIDTH + 64 + + + + true + + + + + + PCW_S_AXI_HP2_ID_WIDTH + PCW S AXI HP2 ID WIDTH + 6 + + + + false + + + + + + PCW_S_AXI_HP2_DATA_WIDTH + PCW S AXI HP2 DATA WIDTH + 64 + + + + true + + + + + + PCW_S_AXI_HP3_ID_WIDTH + PCW S AXI HP3 ID WIDTH + 6 + + + + false + + + + + + PCW_S_AXI_HP3_DATA_WIDTH + PCW S AXI HP3 DATA WIDTH + 64 + + + + true + + + + + + PCW_NUM_F2P_INTR_INPUTS + PCW NUM F2P INTR INPUTS + 1 + + + + true + + + + + + PCW_EN_DDR + PCW EN DDR + 1 + + + PCW_EN_SMC + PCW EN SMC + 0 + + + PCW_EN_QSPI + PCW EN QSPI + 1 + + + PCW_EN_CAN0 + PCW EN CAN0 + 0 + + + PCW_EN_CAN1 + PCW EN CAN1 + 0 + + + PCW_EN_ENET0 + PCW EN ENET0 + 0 + + + PCW_EN_ENET1 + PCW EN ENET1 + 0 + + + PCW_EN_GPIO + PCW EN GPIO + 1 + + + PCW_EN_I2C0 + PCW EN I2C0 + 1 + + + PCW_EN_I2C1 + PCW EN I2C1 + 1 + + + PCW_EN_PJTAG + PCW EN PJTAG + 0 + + + PCW_EN_SDIO0 + PCW EN SDIO0 + 1 + + + PCW_EN_SDIO1 + PCW EN SDIO1 + 1 + + + PCW_EN_SPI0 + PCW EN SPI0 + 1 + + + PCW_EN_SPI1 + PCW EN SPI1 + 1 + + + PCW_EN_UART0 + PCW EN UART0 + 1 + + + PCW_EN_UART1 + PCW EN UART1 + 1 + + + PCW_EN_MODEM_UART0 + PCW EN MODEM UART0 + 0 + + + PCW_EN_MODEM_UART1 + PCW EN MODEM UART1 + 0 + + + PCW_EN_TTC0 + PCW EN TTC0 + 1 + + + PCW_EN_TTC1 + PCW EN TTC1 + 1 + + + PCW_EN_WDT + PCW EN WDT + 0 + + + PCW_EN_TRACE + PCW EN TRACE + 0 + + + PCW_EN_USB0 + PCW EN USB0 + 1 + + + PCW_EN_USB1 + PCW EN USB1 + 0 + + + PCW_DQ_WIDTH + PCW DQ WIDTH + 16 + + + PCW_DQS_WIDTH + PCW DQS WIDTH + 2 + + + PCW_DM_WIDTH + PCW DM WIDTH + 2 + + + PCW_MIO_PRIMITIVE + PCW MIO PRIMITIVE + 32 + + + PCW_EN_CLK0_PORT + PCW EN CLK0 PORT + 1 + + + + true + + + + + + PCW_EN_CLK1_PORT + PCW EN CLK1 PORT + 1 + + + + true + + + + + + PCW_EN_CLK2_PORT + PCW EN CLK2 PORT + 0 + + + + true + + + + + + PCW_EN_CLK3_PORT + PCW EN CLK3 PORT + 0 + + + + true + + + + + + PCW_EN_RST0_PORT + PCW EN RST0 PORT + Enables general purpose reset signal 0 for PL logic + 1 + + + + true + + + + + + PCW_EN_RST1_PORT + PCW EN RST1 PORT + Enables general purpose reset signal 1 for PL logic + 0 + + + + true + + + + + + PCW_EN_RST2_PORT + PCW EN RST2 PORT + Enables general purpose reset signal 2 for PL logic + 0 + + + + true + + + + + + PCW_EN_RST3_PORT + PCW EN RST3 PORT + Enables general purpose reset signal 3 for PL logic + 0 + + + + true + + + + + + PCW_EN_CLKTRIG0_PORT + PCW EN CLKTRIG0 PORT + Enables PL clock trigger signal 0 used to halt the PL clock when counting a programmed number of clock pulses + 0 + + + + true + + + + + + PCW_EN_CLKTRIG1_PORT + PCW EN CLKTRIG1 PORT + Enables PL clock trigger signal 1 used to halt the PL clock when counting a programmed number of clock pulses + 0 + + + + true + + + + + + PCW_EN_CLKTRIG2_PORT + PCW EN CLKTRIG2 PORT + Enables PL clock trigger signal 2 used to halt the PL clock when counting a programmed number of clock pulses + 0 + + + + true + + + + + + PCW_EN_CLKTRIG3_PORT + PCW EN CLKTRIG3 PORT + Enables PL clock trigger signal 3 used to halt the PL clock when counting a programmed number of clock pulses + 0 + + + + true + + + + + + PCW_P2F_DMAC_ABORT_INTR + PCW P2F DMAC ABORT INTR + 0 + + + + false + + + + + + PCW_P2F_DMAC0_INTR + PCW P2F DMAC0 INTR + 0 + + + + false + + + + + + PCW_P2F_DMAC1_INTR + PCW P2F DMAC1 INTR + 0 + + + + false + + + + + + PCW_P2F_DMAC2_INTR + PCW P2F DMAC2 INTR + 0 + + + + false + + + + + + PCW_P2F_DMAC3_INTR + PCW P2F DMAC3 INTR + 0 + + + + false + + + + + + PCW_P2F_DMAC4_INTR + PCW P2F DMAC4 INTR + 0 + + + + false + + + + + + PCW_P2F_DMAC5_INTR + PCW P2F DMAC5 INTR + 0 + + + + false + + + + + + PCW_P2F_DMAC6_INTR + PCW P2F DMAC6 INTR + 0 + + + + false + + + + + + PCW_P2F_DMAC7_INTR + PCW P2F DMAC7 INTR + 0 + + + + false + + + + + + PCW_P2F_SMC_INTR + PCW P2F SMC INTR + 0 + + + + false + + + + + + PCW_P2F_QSPI_INTR + PCW P2F QSPI INTR + 0 + + + + true + + + + + + PCW_P2F_CTI_INTR + PCW P2F CTI INTR + 0 + + + + false + + + + + + PCW_P2F_GPIO_INTR + PCW P2F GPIO INTR + 0 + + + + true + + + + + + PCW_P2F_USB0_INTR + PCW P2F USB0 INTR + 0 + + + + true + + + + + + PCW_P2F_ENET0_INTR + PCW P2F ENET0 INTR + 0 + + + + false + + + + + + PCW_P2F_SDIO0_INTR + PCW P2F SDIO0 INTR + 0 + + + + true + + + + + + PCW_P2F_I2C0_INTR + PCW P2F I2C0 INTR + 0 + + + + true + + + + + + PCW_P2F_SPI0_INTR + PCW P2F SPI0 INTR + 0 + + + + true + + + + + + PCW_P2F_UART0_INTR + PCW P2F UART0 INTR + 0 + + + + true + + + + + + PCW_P2F_CAN0_INTR + PCW P2F CAN0 INTR + 0 + + + + false + + + + + + PCW_P2F_USB1_INTR + PCW P2F USB1 INTR + 0 + + + + false + + + + + + PCW_P2F_ENET1_INTR + PCW P2F ENET1 INTR + 0 + + + + false + + + + + + PCW_P2F_SDIO1_INTR + PCW P2F SDIO1 INTR + 0 + + + + true + + + + + + PCW_P2F_I2C1_INTR + PCW P2F I2C1 INTR + 0 + + + + true + + + + + + PCW_P2F_SPI1_INTR + PCW P2F SPI1 INTR + 0 + + + + true + + + + + + PCW_P2F_UART1_INTR + PCW P2F UART1 INTR + 0 + + + + true + + + + + + PCW_P2F_CAN1_INTR + PCW P2F CAN1 INTR + 0 + + + + false + + + + + + PCW_IRQ_F2P_INTR + PCW IRQ F2P INTR + 1 + + + + true + + + + + + PCW_IRQ_F2P_MODE + PCW IRQ F2P MODE + DIRECT + + + + true + + + + + + PCW_CORE0_FIQ_INTR + PCW CORE0 FIQ INTR + 0 + + + + true + + + + + + PCW_CORE0_IRQ_INTR + PCW CORE0 IRQ INTR + 0 + + + + true + + + + + + PCW_CORE1_FIQ_INTR + PCW CORE1 FIQ INTR + 0 + + + + true + + + + + + PCW_CORE1_IRQ_INTR + PCW CORE1 IRQ INTR + 0 + + + + true + + + + + + PCW_VALUE_SILVERSION + PCW VALUE SILVERSION + 3 + + + PCW_GP0_EN_MODIFIABLE_TXN + PCW GP0 EN MODIFIABLE TXN + 1 + + + PCW_GP1_EN_MODIFIABLE_TXN + PCW GP1 EN MODIFIABLE TXN + 1 + + + PCW_IMPORT_BOARD_PRESET + PCW IMPORT BOARD PRESET + None + + + PCW_PERIPHERAL_BOARD_PRESET + PCW PERIPHERAL BOARD PRESET + None + + + PCW_PRESET_BANK0_VOLTAGE + PCW PRESET BANK0 VOLTAGE + LVCMOS 3.3V + + + PCW_PRESET_BANK1_VOLTAGE + PCW PRESET BANK1 VOLTAGE + LVCMOS 3.3V + + + PCW_UIPARAM_DDR_ENABLE + PCW UIPARAM DDR ENABLE + 1 + + + PCW_UIPARAM_DDR_ADV_ENABLE + PCW UIPARAM DDR ADV ENABLE + 0 + + + PCW_UIPARAM_DDR_MEMORY_TYPE + PCW UIPARAM DDR MEMORY TYPE + DDR 3 (Low Voltage) + + + PCW_UIPARAM_DDR_ECC + PCW UIPARAM DDR ECC + Disabled + + + + false + + + + + + PCW_UIPARAM_DDR_BUS_WIDTH + PCW UIPARAM DDR BUS WIDTH + 16 Bit + + + PCW_UIPARAM_DDR_BL + PCW UIPARAM DDR BL + 8 + + + PCW_UIPARAM_DDR_HIGH_TEMP + PCW UIPARAM DDR HIGH TEMP + Normal (0-85) + + + PCW_UIPARAM_DDR_PARTNO + PCW UIPARAM DDR PARTNO + MT41J256M16 RE-125 + + + PCW_UIPARAM_DDR_DRAM_WIDTH + PCW UIPARAM DDR DRAM WIDTH + 16 Bits + + + + false + + + + + + PCW_UIPARAM_DDR_DEVICE_CAPACITY + PCW UIPARAM DDR DEVICE CAPACITY + 4096 MBits + + + + false + + + + + + PCW_UIPARAM_DDR_SPEED_BIN + PCW UIPARAM DDR SPEED BIN + DDR3_1066F + + + + false + + + + + + PCW_UIPARAM_DDR_TRAIN_WRITE_LEVEL + PCW UIPARAM DDR TRAIN WRITE LEVEL + 1 + + + PCW_UIPARAM_DDR_TRAIN_READ_GATE + PCW UIPARAM DDR TRAIN READ GATE + 1 + + + PCW_UIPARAM_DDR_TRAIN_DATA_EYE + PCW UIPARAM DDR TRAIN DATA EYE + 1 + + + PCW_UIPARAM_DDR_CLOCK_STOP_EN + PCW UIPARAM DDR CLOCK STOP EN + 0 + + + PCW_UIPARAM_DDR_USE_INTERNAL_VREF + PCW UIPARAM DDR USE INTERNAL VREF + 0 + + + PCW_DDR_PRIORITY_WRITEPORT_0 + PCW DDR PRIORITY WRITEPORT 0 + <Select> + + + + false + + + + + + PCW_DDR_PRIORITY_WRITEPORT_1 + PCW DDR PRIORITY WRITEPORT 0 + <Select> + + + + false + + + + + + PCW_DDR_PRIORITY_WRITEPORT_2 + PCW DDR PRIORITY WRITEPORT 0 + <Select> + + + + false + + + + + + PCW_DDR_PRIORITY_WRITEPORT_3 + PCW DDR PRIORITY WRITEPORT 0 + <Select> + + + + false + + + + + + PCW_DDR_PRIORITY_READPORT_0 + PCW DDR PRIORITY READPORT 0 + <Select> + + + + false + + + + + + PCW_DDR_PRIORITY_READPORT_1 + PCW DDR PRIORITY READPORT 1 + <Select> + + + + false + + + + + + PCW_DDR_PRIORITY_READPORT_2 + PCW DDR PRIORITY READPORT 2 + <Select> + + + + false + + + + + + PCW_DDR_PRIORITY_READPORT_3 + PCW DDR PRIORITY READPORT 3 + <Select> + + + + false + + + + + + PCW_DDR_PORT0_HPR_ENABLE + PCW DDR PORT0 ENABLE HPR + 0 + + + + false + + + + + + PCW_DDR_PORT1_HPR_ENABLE + PCW DDR PORT1 ENABLE HPR + 0 + + + + false + + + + + + PCW_DDR_PORT2_HPR_ENABLE + PCW DDR PORT2 ENABLE HPR + 0 + + + + false + + + + + + PCW_DDR_PORT3_HPR_ENABLE + PCW DDR PORT3 ENABLE HPR + 0 + + + + false + + + + + + PCW_DDR_HPRLPR_QUEUE_PARTITION + PCW DDR HPRLPR QUEUE PARTITION + HPR(0)/LPR(32) + + + + false + + + + + + PCW_DDR_LPR_TO_CRITICAL_PRIORITY_LEVEL + PCW DDR LPR TO CRITICAL PRIORITY LEVEL + 2 + + + + false + + + + + + PCW_DDR_HPR_TO_CRITICAL_PRIORITY_LEVEL + PCW DDR HPR TO CRITICAL PRIORITY LEVEL + 15 + + + + false + + + + + + PCW_DDR_WRITE_TO_CRITICAL_PRIORITY_LEVEL + PCW DDR WRITE TO CRITICAL PRIORITY LEVEL + 2 + + + + false + + + + + + PCW_NAND_PERIPHERAL_ENABLE + PCW NAND PERIPHERAL ENABLE + 0 + + + + false + + + + + + PCW_NAND_NAND_IO + PCW NAND NAND IO + <Select> + + + + false + + + + + + PCW_NAND_GRP_D8_ENABLE + 0 + + + + false + + + + + + PCW_NAND_GRP_D8_IO + PCW NAND GRP D8 IO + <Select> + + + + false + + + + + + PCW_NOR_PERIPHERAL_ENABLE + PCW NOR PERIPHERAL ENABLE + 0 + + + + false + + + + + + PCW_NOR_NOR_IO + PCW NOR NOR IO + <Select> + + + + false + + + + + + PCW_NOR_GRP_A25_ENABLE + PCW NOR GRP A25 IO + 0 + + + + false + + + + + + PCW_NOR_GRP_A25_IO + PCW NOR GRP CS0 IO + <Select> + + + + false + + + + + + PCW_NOR_GRP_CS0_ENABLE + 0 + + + + false + + + + + + PCW_NOR_GRP_CS0_IO + PCW NOR GRP CS1 IO + <Select> + + + + false + + + + + + PCW_NOR_GRP_SRAM_CS0_ENABLE + PCW NOR GRP SRAM CS0 ENABLE + 0 + + + + false + + + + + + PCW_NOR_GRP_SRAM_CS0_IO + PCW NOR GRP SRAM CS1 IO + <Select> + + + + false + + + + + + PCW_NOR_GRP_CS1_ENABLE + 0 + + + + false + + + + + + PCW_NOR_GRP_CS1_IO + PCW NOR GRP SRAM CS0 IO + <Select> + + + + false + + + + + + PCW_NOR_GRP_SRAM_CS1_ENABLE + PCW NOR GRP SRAM CS1 ENABLE + 0 + + + + false + + + + + + PCW_NOR_GRP_SRAM_CS1_IO + <Select> + + + + false + + + + + + PCW_NOR_GRP_SRAM_INT_ENABLE + 0 + + + + false + + + + + + PCW_NOR_GRP_SRAM_INT_IO + <Select> + + + + false + + + + + + PCW_QSPI_PERIPHERAL_ENABLE + PCW QSPI PERIPHERAL ENABLE + 1 + + + PCW_QSPI_QSPI_IO + PCW QSPI QSPI IO + MIO 1 .. 6 + + + PCW_QSPI_GRP_SINGLE_SS_ENABLE + PCW QSPI GRP SINGLE SS ENABLE + 1 + + + PCW_QSPI_GRP_SINGLE_SS_IO + PCW QSPI GRP SINGLE SS IO + MIO 1 .. 6 + + + PCW_QSPI_GRP_SS1_ENABLE + 0 + + + PCW_QSPI_GRP_SS1_IO + PCW QSPI GRP SS1 IO + <Select> + + + + false + + + + + + PCW_SINGLE_QSPI_DATA_MODE + Single QSPI Data Mode + x4 + + + PCW_DUAL_STACK_QSPI_DATA_MODE + Dual Stack QSPI Data Mode + <Select> + + + + false + + + + + + PCW_DUAL_PARALLEL_QSPI_DATA_MODE + Dual Parallel QSPI Data Mode + <Select> + + + + false + + + + + + PCW_QSPI_GRP_IO1_ENABLE + 0 + + + PCW_QSPI_GRP_IO1_IO + PCW QSPI GRP IO1 IO + <Select> + + + + false + + + + + + PCW_QSPI_GRP_FBCLK_ENABLE + 0 + + + PCW_QSPI_GRP_FBCLK_IO + PCW QSPI GRP FBCLK IO + <Select> + + + + false + + + + + + PCW_QSPI_INTERNAL_HIGHADDRESS + PCW QSPI INTERNAL HIGHADDRESS + 0xFCFFFFFF + + + PCW_ENET0_PERIPHERAL_ENABLE + PCW ENET0 PERIPHERAL ENABLE + 0 + + + PCW_ENET0_ENET0_IO + PCW ENET0 ENET0 IO + <Select> + + + + false + + + + + + PCW_ENET0_GRP_MDIO_ENABLE + 0 + + + + false + + + + + + PCW_ENET0_GRP_MDIO_IO + PCW ENET0 GRP MDIO IO + <Select> + + + + false + + + + + + PCW_ENET_RESET_ENABLE + 0 + + + + false + + + + + + PCW_ENET_RESET_SELECT + <Select> + + + + false + + + + + + PCW_ENET0_RESET_ENABLE + 0 + + + + false + + + + + + PCW_ENET0_RESET_IO + <Select> + + + + false + + + + + + PCW_ENET1_PERIPHERAL_ENABLE + PCW ENET1 PERIPHERAL ENABLE + 0 + + + PCW_ENET1_ENET1_IO + PCW ENET1 ENET1 IO + <Select> + + + + false + + + + + + PCW_ENET1_GRP_MDIO_ENABLE + 0 + + + + false + + + + + + PCW_ENET1_GRP_MDIO_IO + PCW ENET1 GRP MDIO IO + <Select> + + + + false + + + + + + PCW_ENET1_RESET_ENABLE + 0 + + + + false + + + + + + PCW_ENET1_RESET_IO + <Select> + + + + false + + + + + + PCW_SD0_PERIPHERAL_ENABLE + PCW SD0 PERIPHERAL ENABLE + 1 + + + PCW_SD0_SD0_IO + PCW SD0 SD0 IO + EMIO + + + PCW_SD0_GRP_CD_ENABLE + 1 + + + + false + + + + + + PCW_SD0_GRP_CD_IO + PCW SD0 GRP CD IO + EMIO + + + + false + + + + + + PCW_SD0_GRP_WP_ENABLE + 1 + + + + false + + + + + + PCW_SD0_GRP_WP_IO + PCW SD0 GRP WP IO + EMIO + + + + false + + + + + + PCW_SD0_GRP_POW_ENABLE + 0 + + + PCW_SD0_GRP_POW_IO + PCW SD0 GRP POW IO + <Select> + + + + false + + + + + + PCW_SD1_PERIPHERAL_ENABLE + PCW SD1 PERIPHERAL ENABLE + 1 + + + PCW_SD1_SD1_IO + PCW SD1 SD1 IO + MIO 10 .. 15 + + + PCW_SD1_GRP_CD_ENABLE + 1 + + + PCW_SD1_GRP_CD_IO + PCW SD1 GRP CD IO + MIO 0 + + + PCW_SD1_GRP_WP_ENABLE + 0 + + + PCW_SD1_GRP_WP_IO + PCW SD1 GRP WP IO + <Select> + + + + false + + + + + + PCW_SD1_GRP_POW_ENABLE + 0 + + + PCW_SD1_GRP_POW_IO + PCW SD1 GRP POW IO + <Select> + + + + false + + + + + + PCW_UART0_PERIPHERAL_ENABLE + PCW UART0 PERIPHERAL ENABLE + 1 + + + PCW_UART0_UART0_IO + PCW UART0 UART0 IO + EMIO + + + PCW_UART0_GRP_FULL_ENABLE + 0 + + + PCW_UART0_GRP_FULL_IO + <Select> + + + + false + + + + + + PCW_UART1_PERIPHERAL_ENABLE + PCW UART1 PERIPHERAL ENABLE + 1 + + + PCW_UART1_UART1_IO + PCW UART1 UART1 IO + MIO 8 .. 9 + + + PCW_UART1_GRP_FULL_ENABLE + 0 + + + PCW_UART1_GRP_FULL_IO + <Select> + + + + false + + + + + + PCW_SPI0_PERIPHERAL_ENABLE + PCW SPI0 PERIPHERAL ENABLE + 1 + + + PCW_SPI0_SPI0_IO + PCW SPI0 SPI0 IO + EMIO + + + PCW_SPI0_GRP_SS0_ENABLE + 1 + + + + false + + + + + + PCW_SPI0_GRP_SS0_IO + PCW SPI0 GRP SS0 IO + EMIO + + + + false + + + + + + PCW_SPI0_GRP_SS1_ENABLE + 1 + + + + false + + + + + + PCW_SPI0_GRP_SS1_IO + PCW SPI0 GRP SS1 IO + EMIO + + + + false + + + + + + PCW_SPI0_GRP_SS2_ENABLE + 1 + + + + false + + + + + + PCW_SPI0_GRP_SS2_IO + PCW SPI0 GRP SS2 IO + EMIO + + + + false + + + + + + PCW_SPI1_PERIPHERAL_ENABLE + PCW SPI1 PERIPHERAL ENABLE + 1 + + + PCW_SPI1_SPI1_IO + PCW SPI1 SPI1 IO + EMIO + + + PCW_SPI1_GRP_SS0_ENABLE + 1 + + + + false + + + + + + PCW_SPI1_GRP_SS0_IO + PCW SPI1 GRP SS0 IO + EMIO + + + + false + + + + + + PCW_SPI1_GRP_SS1_ENABLE + 1 + + + + false + + + + + + PCW_SPI1_GRP_SS1_IO + PCW SPI1 GRP SS1 IO + EMIO + + + + false + + + + + + PCW_SPI1_GRP_SS2_ENABLE + 1 + + + + false + + + + + + PCW_SPI1_GRP_SS2_IO + PCW SPI1 GRP SS2 IO + EMIO + + + + false + + + + + + PCW_CAN0_PERIPHERAL_ENABLE + PCW CAN0 PERIPHERAL ENABLE + 0 + + + PCW_CAN0_CAN0_IO + PCW CAN0 CAN0 IO + <Select> + + + + false + + + + + + PCW_CAN0_GRP_CLK_ENABLE + 0 + + + + false + + + + + + PCW_CAN0_GRP_CLK_IO + PCW CAN0 GRP CLK IO + <Select> + + + + false + + + + + + PCW_CAN1_PERIPHERAL_ENABLE + PCW CAN1 PERIPHERAL ENABLE + 0 + + + PCW_CAN1_CAN1_IO + PCW CAN1 CAN1 IO + <Select> + + + + false + + + + + + PCW_CAN1_GRP_CLK_ENABLE + 0 + + + + false + + + + + + PCW_CAN1_GRP_CLK_IO + PCW CAN1 GRP CLK IO + <Select> + + + + false + + + + + + PCW_TRACE_PERIPHERAL_ENABLE + PCW TRACE PERIPHERAL ENABLE + 0 + + + PCW_TRACE_TRACE_IO + PCW TRACE TRACE IO + <Select> + + + + false + + + + + + PCW_TRACE_GRP_2BIT_ENABLE + 0 + + + + false + + + + + + PCW_TRACE_GRP_2BIT_IO + PCW TRACE GRP 2BIT IO + <Select> + + + + false + + + + + + PCW_TRACE_GRP_4BIT_ENABLE + 0 + + + + false + + + + + + PCW_TRACE_GRP_4BIT_IO + PCW TRACE GRP 4BIT IO + <Select> + + + + false + + + + + + PCW_TRACE_GRP_8BIT_ENABLE + 0 + + + + false + + + + + + PCW_TRACE_GRP_8BIT_IO + PCW TRACE GRP 8BIT IO + <Select> + + + + false + + + + + + PCW_TRACE_GRP_16BIT_ENABLE + 0 + + + + false + + + + + + PCW_TRACE_GRP_16BIT_IO + PCW TRACE GRP 16BIT IO + <Select> + + + + false + + + + + + PCW_TRACE_GRP_32BIT_ENABLE + 0 + + + + false + + + + + + PCW_TRACE_GRP_32BIT_IO + PCW TRACE GRP 32BIT IO + <Select> + + + + false + + + + + + PCW_TRACE_INTERNAL_WIDTH + PCW TRACE INTERNAL WIDTH + 2 + + + PCW_WDT_PERIPHERAL_ENABLE + PCW WDT PERIPHERAL ENABLE + 0 + + + PCW_WDT_WDT_IO + PCW WDT WDT IO + <Select> + + + + false + + + + + + PCW_TTC0_PERIPHERAL_ENABLE + PCW TTC0 PERIPHERAL ENABLE + 1 + + + PCW_TTC0_TTC0_IO + PCW TTC0 TTC0 IO + EMIO + + + PCW_TTC1_PERIPHERAL_ENABLE + PCW TTC1 PERIPHERAL ENABLE + 1 + + + PCW_TTC1_TTC1_IO + PCW TTC1 TTC1 IO + EMIO + + + PCW_PJTAG_PERIPHERAL_ENABLE + PCW PJTAG PERIPHERAL ENABLE + 0 + + + PCW_PJTAG_PJTAG_IO + PCW PJTAG PJTAG IO + <Select> + + + + false + + + + + + PCW_USB0_PERIPHERAL_ENABLE + PCW USB0 PERIPHERAL ENABLE + 1 + + + PCW_USB0_USB0_IO + PCW USB0 USB0 IO + MIO 28 .. 39 + + + PCW_USB_RESET_ENABLE + 1 + + + PCW_USB_RESET_SELECT + Share reset pin + + + PCW_USB0_RESET_ENABLE + 1 + + + PCW_USB0_RESET_IO + MIO 7 + + + PCW_USB1_PERIPHERAL_ENABLE + PCW USB1 PERIPHERAL ENABLE + 0 + + + + false + + + + + + PCW_USB1_USB1_IO + PCW USB1 USB1 IO + <Select> + + + + false + + + + + + PCW_USB1_RESET_ENABLE + 0 + + + + false + + + + + + PCW_USB1_RESET_IO + <Select> + + + + false + + + + + + PCW_I2C0_PERIPHERAL_ENABLE + PCW I2C0 PERIPHERAL ENABLE + 1 + + + PCW_I2C0_I2C0_IO + PCW I2C0 I2C0 IO + EMIO + + + PCW_I2C0_GRP_INT_ENABLE + 1 + + + + false + + + + + + PCW_I2C0_GRP_INT_IO + PCW I2C0 GRP INT IO + EMIO + + + + false + + + + + + PCW_I2C0_RESET_ENABLE + 0 + + + PCW_I2C0_RESET_IO + <Select> + + + PCW_I2C1_PERIPHERAL_ENABLE + PCW I2C1 PERIPHERAL ENABLE + 1 + + + PCW_I2C1_I2C1_IO + PCW I2C1 I2C1 IO + MIO 48 .. 49 + + + PCW_I2C1_GRP_INT_ENABLE + 1 + + + PCW_I2C1_GRP_INT_IO + PCW I2C1 GRP INT IO + EMIO + + + PCW_I2C_RESET_ENABLE + 1 + + + PCW_I2C_RESET_SELECT + Share reset pin + + + PCW_I2C1_RESET_ENABLE + 0 + + + + false + + + + + + PCW_I2C1_RESET_IO + <Select> + + + + false + + + + + + PCW_GPIO_PERIPHERAL_ENABLE + PCW GPIO PERIPHERAL ENABLE + 0 + + + PCW_GPIO_MIO_GPIO_ENABLE + 1 + + + PCW_GPIO_MIO_GPIO_IO + PCW GPIO MIO GPIO IO + MIO + + + PCW_GPIO_EMIO_GPIO_ENABLE + PCW GPIO EMIO GPIO ENABLE + 1 + + + PCW_GPIO_EMIO_GPIO_IO + PCW GPIO EMIO GPIO IO + 64 + + + PCW_APU_CLK_RATIO_ENABLE + PCW APU CLK RATIO ENABLE + 0.251400462962963 + + + PCW_ENET0_PERIPHERAL_FREQMHZ + PCW ENET0 PERIPHERAL FREQMHZ + 1000 Mbps + + + + false + + + + + + PCW_ENET1_PERIPHERAL_FREQMHZ + PCW ENET1 PERIPHERAL FREQMHZ + 1000 Mbps + + + + false + + + + + + PCW_CPU_PERIPHERAL_CLKSRC + PCW CPU PERIPHERAL CLKSRC + ARM PLL + + + PCW_DDR_PERIPHERAL_CLKSRC + PCW DDR PERIPHERAL CLKSRC + DDR PLL + + + PCW_SMC_PERIPHERAL_CLKSRC + PCW SMC PERIPHERAL CLKSRC + IO PLL + + + PCW_QSPI_PERIPHERAL_CLKSRC + PCW QSPI PERIPHERAL CLKSRC + IO PLL + + + PCW_SDIO_PERIPHERAL_CLKSRC + PCW SDIO PERIPHERAL CLKSRC + IO PLL + + + PCW_UART_PERIPHERAL_CLKSRC + PCW UART PERIPHERAL CLKSRC + IO PLL + + + PCW_SPI_PERIPHERAL_CLKSRC + PCW SPI PERIPHERAL CLKSRC + IO PLL + + + PCW_CAN_PERIPHERAL_CLKSRC + PCW CAN PERIPHERAL CLKSRC + IO PLL + + + PCW_FCLK0_PERIPHERAL_CLKSRC + PCW FCLK0 PERIPHERAL CLKSRC + IO PLL + + + PCW_FCLK1_PERIPHERAL_CLKSRC + PCW FCLK1 PERIPHERAL CLKSRC + IO PLL + + + PCW_FCLK2_PERIPHERAL_CLKSRC + PCW FCLK2 PERIPHERAL CLKSRC + IO PLL + + + PCW_FCLK3_PERIPHERAL_CLKSRC + PCW FCLK3 PERIPHERAL CLKSRC + IO PLL + + + PCW_ENET0_PERIPHERAL_CLKSRC + PCW ENET0 PERIPHERAL CLKSRC + External + + + PCW_ENET1_PERIPHERAL_CLKSRC + PCW ENET1 PERIPHERAL CLKSRC + IO PLL + + + PCW_CAN0_PERIPHERAL_CLKSRC + PCW CAN0 PERIPHERAL CLKSRC + External + + + PCW_CAN1_PERIPHERAL_CLKSRC + PCW CAN1 PERIPHERAL CLKSRC + External + + + PCW_TPIU_PERIPHERAL_CLKSRC + PCW TPIU PERIPHERAL CLKSRC + External + + + PCW_TTC0_CLK0_PERIPHERAL_CLKSRC + PCW TTC0 CLK0 PERIPHERAL CLKSRC + CPU_1X + + + PCW_TTC0_CLK1_PERIPHERAL_CLKSRC + PCW TTC0 CLK1 PERIPHERAL CLKSRC + CPU_1X + + + PCW_TTC0_CLK2_PERIPHERAL_CLKSRC + PCW TTC0 CLK2 PERIPHERAL CLKSRC + CPU_1X + + + PCW_TTC1_CLK0_PERIPHERAL_CLKSRC + PCW TTC1 CLK0 PERIPHERAL CLKSRC + CPU_1X + + + PCW_TTC1_CLK1_PERIPHERAL_CLKSRC + PCW TTC1 CLK1 PERIPHERAL CLKSRC + CPU_1X + + + PCW_TTC1_CLK2_PERIPHERAL_CLKSRC + PCW TTC1 CLK2 PERIPHERAL CLKSRC + CPU_1X + + + PCW_WDT_PERIPHERAL_CLKSRC + PCW WDT PERIPHERAL CLKSRC + CPU_1X + + + PCW_DCI_PERIPHERAL_CLKSRC + PCW DCI PERIPHERAL CLKSRC + DDR PLL + + + PCW_PCAP_PERIPHERAL_CLKSRC + PCW PCAP PERIPHERAL CLKSRC + IO PLL + + + PCW_USB_RESET_POLARITY + PCW USB RESET POLARITY + Active Low + + + PCW_ENET_RESET_POLARITY + PCW USB RESET POLARITY + Active Low + + + PCW_I2C_RESET_POLARITY + PCW USB RESET POLARITY + Active Low + + + PCW_MIO_0_PULLUP + PCW MIO 0 PULLUP + enabled + + + PCW_MIO_0_IOTYPE + PCW MIO 0 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_0_DIRECTION + PCW MIO 0 DIRECTION + in + + + + false + + + + + + PCW_MIO_0_SLEW + PCW MIO 0 SLEW + slow + + + PCW_MIO_1_PULLUP + PCW MIO 1 PULLUP + enabled + + + PCW_MIO_1_IOTYPE + PCW MIO 1 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_1_DIRECTION + PCW MIO 1 DIRECTION + out + + + + false + + + + + + PCW_MIO_1_SLEW + PCW MIO 1 SLEW + slow + + + PCW_MIO_2_PULLUP + PCW MIO 2 PULLUP + disabled + + + + false + + + + + + PCW_MIO_2_IOTYPE + PCW MIO 2 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_2_DIRECTION + PCW MIO 2 DIRECTION + inout + + + + false + + + + + + PCW_MIO_2_SLEW + PCW MIO 2 SLEW + slow + + + PCW_MIO_3_PULLUP + PCW MIO 3 PULLUP + disabled + + + + false + + + + + + PCW_MIO_3_IOTYPE + PCW MIO 3 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_3_DIRECTION + PCW MIO 3 DIRECTION + inout + + + + false + + + + + + PCW_MIO_3_SLEW + PCW MIO 3 SLEW + slow + + + PCW_MIO_4_PULLUP + PCW MIO 4 PULLUP + disabled + + + + false + + + + + + PCW_MIO_4_IOTYPE + PCW MIO 4 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_4_DIRECTION + PCW MIO 4 DIRECTION + inout + + + + false + + + + + + PCW_MIO_4_SLEW + PCW MIO 4 SLEW + slow + + + PCW_MIO_5_PULLUP + PCW MIO 5 PULLUP + disabled + + + + false + + + + + + PCW_MIO_5_IOTYPE + PCW MIO 5 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_5_DIRECTION + PCW MIO 5 DIRECTION + inout + + + + false + + + + + + PCW_MIO_5_SLEW + PCW MIO 5 SLEW + slow + + + PCW_MIO_6_PULLUP + PCW MIO 6 PULLUP + disabled + + + + false + + + + + + PCW_MIO_6_IOTYPE + PCW MIO 6 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_6_DIRECTION + PCW MIO 6 DIRECTION + out + + + + false + + + + + + PCW_MIO_6_SLEW + PCW MIO 6 SLEW + slow + + + PCW_MIO_7_PULLUP + PCW MIO 7 PULLUP + disabled + + + + false + + + + + + PCW_MIO_7_IOTYPE + PCW MIO 7 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_7_DIRECTION + PCW MIO 7 DIRECTION + out + + + + false + + + + + + PCW_MIO_7_SLEW + PCW MIO 7 SLEW + slow + + + PCW_MIO_8_PULLUP + PCW MIO 8 PULLUP + disabled + + + + false + + + + + + PCW_MIO_8_IOTYPE + PCW MIO 8 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_8_DIRECTION + PCW MIO 8 DIRECTION + out + + + + false + + + + + + PCW_MIO_8_SLEW + PCW MIO 8 SLEW + slow + + + PCW_MIO_9_PULLUP + PCW MIO 9 PULLUP + enabled + + + PCW_MIO_9_IOTYPE + PCW MIO 9 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_9_DIRECTION + PCW MIO 9 DIRECTION + in + + + + false + + + + + + PCW_MIO_9_SLEW + PCW MIO 9 SLEW + slow + + + PCW_MIO_10_PULLUP + PCW MIO 10 PULLUP + disabled + + + PCW_MIO_10_IOTYPE + PCW MIO 10 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_10_DIRECTION + PCW MIO 10 DIRECTION + inout + + + + false + + + + + + PCW_MIO_10_SLEW + PCW MIO 10 SLEW + slow + + + PCW_MIO_11_PULLUP + PCW MIO 11 PULLUP + disabled + + + PCW_MIO_11_IOTYPE + PCW MIO 11 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_11_DIRECTION + PCW MIO 11 DIRECTION + inout + + + + false + + + + + + PCW_MIO_11_SLEW + PCW MIO 11 SLEW + slow + + + PCW_MIO_12_PULLUP + PCW MIO 12 PULLUP + disabled + + + PCW_MIO_12_IOTYPE + PCW MIO 12 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_12_DIRECTION + PCW MIO 12 DIRECTION + inout + + + + false + + + + + + PCW_MIO_12_SLEW + PCW MIO 12 SLEW + slow + + + PCW_MIO_13_PULLUP + PCW MIO 13 PULLUP + disabled + + + PCW_MIO_13_IOTYPE + PCW MIO 13 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_13_DIRECTION + PCW MIO 13 DIRECTION + inout + + + + false + + + + + + PCW_MIO_13_SLEW + PCW MIO 13 SLEW + slow + + + PCW_MIO_14_PULLUP + PCW MIO 14 PULLUP + disabled + + + PCW_MIO_14_IOTYPE + PCW MIO 14 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_14_DIRECTION + PCW MIO 14 DIRECTION + inout + + + + false + + + + + + PCW_MIO_14_SLEW + PCW MIO 14 SLEW + slow + + + PCW_MIO_15_PULLUP + PCW MIO 15 PULLUP + disabled + + + PCW_MIO_15_IOTYPE + PCW MIO 15 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_15_DIRECTION + PCW MIO 15 DIRECTION + inout + + + + false + + + + + + PCW_MIO_15_SLEW + PCW MIO 15 SLEW + slow + + + PCW_MIO_16_PULLUP + PCW MIO 16 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_16_IOTYPE + PCW MIO 16 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_16_DIRECTION + PCW MIO 16 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_16_SLEW + PCW MIO 16 SLEW + <Select> + + + + false + + + + + + PCW_MIO_17_PULLUP + PCW MIO 17 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_17_IOTYPE + PCW MIO 17 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_17_DIRECTION + PCW MIO 17 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_17_SLEW + PCW MIO 17 SLEW + <Select> + + + + false + + + + + + PCW_MIO_18_PULLUP + PCW MIO 18 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_18_IOTYPE + PCW MIO 18 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_18_DIRECTION + PCW MIO 18 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_18_SLEW + PCW MIO 18 SLEW + <Select> + + + + false + + + + + + PCW_MIO_19_PULLUP + PCW MIO 19 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_19_IOTYPE + PCW MIO 19 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_19_DIRECTION + PCW MIO 19 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_19_SLEW + PCW MIO 19 SLEW + <Select> + + + + false + + + + + + PCW_MIO_20_PULLUP + PCW MIO 20 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_20_IOTYPE + PCW MIO 20 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_20_DIRECTION + PCW MIO 20 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_20_SLEW + PCW MIO 20 SLEW + <Select> + + + + false + + + + + + PCW_MIO_21_PULLUP + PCW MIO 21 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_21_IOTYPE + PCW MIO 21 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_21_DIRECTION + PCW MIO 21 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_21_SLEW + PCW MIO 21 SLEW + <Select> + + + + false + + + + + + PCW_MIO_22_PULLUP + PCW MIO 22 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_22_IOTYPE + PCW MIO 22 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_22_DIRECTION + PCW MIO 22 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_22_SLEW + PCW MIO 22 SLEW + <Select> + + + + false + + + + + + PCW_MIO_23_PULLUP + PCW MIO 23 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_23_IOTYPE + PCW MIO 23 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_23_DIRECTION + PCW MIO 23 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_23_SLEW + PCW MIO 23 SLEW + <Select> + + + + false + + + + + + PCW_MIO_24_PULLUP + PCW MIO 24 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_24_IOTYPE + PCW MIO 24 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_24_DIRECTION + PCW MIO 24 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_24_SLEW + PCW MIO 24 SLEW + <Select> + + + + false + + + + + + PCW_MIO_25_PULLUP + PCW MIO 25 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_25_IOTYPE + PCW MIO 25 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_25_DIRECTION + PCW MIO 25 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_25_SLEW + PCW MIO 25 SLEW + <Select> + + + + false + + + + + + PCW_MIO_26_PULLUP + PCW MIO 26 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_26_IOTYPE + PCW MIO 26 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_26_DIRECTION + PCW MIO 26 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_26_SLEW + PCW MIO 26 SLEW + <Select> + + + + false + + + + + + PCW_MIO_27_PULLUP + PCW MIO 27 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_27_IOTYPE + PCW MIO 27 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_27_DIRECTION + PCW MIO 27 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_27_SLEW + PCW MIO 27 SLEW + <Select> + + + + false + + + + + + PCW_MIO_28_PULLUP + PCW MIO 28 PULLUP + enabled + + + PCW_MIO_28_IOTYPE + PCW MIO 28 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_28_DIRECTION + PCW MIO 28 DIRECTION + inout + + + + false + + + + + + PCW_MIO_28_SLEW + PCW MIO 28 SLEW + slow + + + PCW_MIO_29_PULLUP + PCW MIO 29 PULLUP + enabled + + + PCW_MIO_29_IOTYPE + PCW MIO 29 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_29_DIRECTION + PCW MIO 29 DIRECTION + in + + + + false + + + + + + PCW_MIO_29_SLEW + PCW MIO 29 SLEW + slow + + + PCW_MIO_30_PULLUP + PCW MIO 30 PULLUP + enabled + + + PCW_MIO_30_IOTYPE + PCW MIO 30 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_30_DIRECTION + PCW MIO 30 DIRECTION + out + + + + false + + + + + + PCW_MIO_30_SLEW + PCW MIO 30 SLEW + slow + + + PCW_MIO_31_PULLUP + PCW MIO 31 PULLUP + enabled + + + PCW_MIO_31_IOTYPE + PCW MIO 31 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_31_DIRECTION + PCW MIO 31 DIRECTION + in + + + + false + + + + + + PCW_MIO_31_SLEW + PCW MIO 31 SLEW + slow + + + PCW_MIO_32_PULLUP + PCW MIO 32 PULLUP + enabled + + + PCW_MIO_32_IOTYPE + PCW MIO 32 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_32_DIRECTION + PCW MIO 32 DIRECTION + inout + + + + false + + + + + + PCW_MIO_32_SLEW + PCW MIO 32 SLEW + slow + + + PCW_MIO_33_PULLUP + PCW MIO 33 PULLUP + enabled + + + PCW_MIO_33_IOTYPE + PCW MIO 33 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_33_DIRECTION + PCW MIO 33 DIRECTION + inout + + + + false + + + + + + PCW_MIO_33_SLEW + PCW MIO 33 SLEW + slow + + + PCW_MIO_34_PULLUP + PCW MIO 34 PULLUP + enabled + + + PCW_MIO_34_IOTYPE + PCW MIO 34 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_34_DIRECTION + PCW MIO 34 DIRECTION + inout + + + + false + + + + + + PCW_MIO_34_SLEW + PCW MIO 34 SLEW + slow + + + PCW_MIO_35_PULLUP + PCW MIO 35 PULLUP + enabled + + + PCW_MIO_35_IOTYPE + PCW MIO 35 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_35_DIRECTION + PCW MIO 35 DIRECTION + inout + + + + false + + + + + + PCW_MIO_35_SLEW + PCW MIO 35 SLEW + slow + + + PCW_MIO_36_PULLUP + PCW MIO 36 PULLUP + enabled + + + PCW_MIO_36_IOTYPE + PCW MIO 36 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_36_DIRECTION + PCW MIO 36 DIRECTION + in + + + + false + + + + + + PCW_MIO_36_SLEW + PCW MIO 36 SLEW + slow + + + PCW_MIO_37_PULLUP + PCW MIO 37 PULLUP + enabled + + + PCW_MIO_37_IOTYPE + PCW MIO 37 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_37_DIRECTION + PCW MIO 37 DIRECTION + inout + + + + false + + + + + + PCW_MIO_37_SLEW + PCW MIO 37 SLEW + slow + + + PCW_MIO_38_PULLUP + PCW MIO 38 PULLUP + enabled + + + PCW_MIO_38_IOTYPE + PCW MIO 38 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_38_DIRECTION + PCW MIO 38 DIRECTION + inout + + + + false + + + + + + PCW_MIO_38_SLEW + PCW MIO 38 SLEW + slow + + + PCW_MIO_39_PULLUP + PCW MIO 39 PULLUP + enabled + + + PCW_MIO_39_IOTYPE + PCW MIO 39 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_39_DIRECTION + PCW MIO 39 DIRECTION + inout + + + + false + + + + + + PCW_MIO_39_SLEW + PCW MIO 39 SLEW + slow + + + PCW_MIO_40_PULLUP + PCW MIO 40 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_40_IOTYPE + PCW MIO 40 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_40_DIRECTION + PCW MIO 40 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_40_SLEW + PCW MIO 40 SLEW + <Select> + + + + false + + + + + + PCW_MIO_41_PULLUP + PCW MIO 41 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_41_IOTYPE + PCW MIO 41 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_41_DIRECTION + PCW MIO 41 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_41_SLEW + PCW MIO 41 SLEW + <Select> + + + + false + + + + + + PCW_MIO_42_PULLUP + PCW MIO 42 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_42_IOTYPE + PCW MIO 42 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_42_DIRECTION + PCW MIO 42 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_42_SLEW + PCW MIO 42 SLEW + <Select> + + + + false + + + + + + PCW_MIO_43_PULLUP + PCW MIO 43 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_43_IOTYPE + PCW MIO 43 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_43_DIRECTION + PCW MIO 43 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_43_SLEW + PCW MIO 43 SLEW + <Select> + + + + false + + + + + + PCW_MIO_44_PULLUP + PCW MIO 44 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_44_IOTYPE + PCW MIO 44 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_44_DIRECTION + PCW MIO 44 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_44_SLEW + PCW MIO 44 SLEW + <Select> + + + + false + + + + + + PCW_MIO_45_PULLUP + PCW MIO 45 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_45_IOTYPE + PCW MIO 45 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_45_DIRECTION + PCW MIO 45 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_45_SLEW + PCW MIO 45 SLEW + <Select> + + + + false + + + + + + PCW_MIO_46_PULLUP + PCW MIO 46 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_46_IOTYPE + PCW MIO 46 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_46_DIRECTION + PCW MIO 46 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_46_SLEW + PCW MIO 46 SLEW + <Select> + + + + false + + + + + + PCW_MIO_47_PULLUP + PCW MIO 47 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_47_IOTYPE + PCW MIO 47 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_47_DIRECTION + PCW MIO 47 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_47_SLEW + PCW MIO 47 SLEW + <Select> + + + + false + + + + + + PCW_MIO_48_PULLUP + PCW MIO 48 PULLUP + enabled + + + PCW_MIO_48_IOTYPE + PCW MIO 48 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_48_DIRECTION + PCW MIO 48 DIRECTION + inout + + + + false + + + + + + PCW_MIO_48_SLEW + PCW MIO 48 SLEW + slow + + + PCW_MIO_49_PULLUP + PCW MIO 49 PULLUP + enabled + + + PCW_MIO_49_IOTYPE + PCW MIO 49 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_49_DIRECTION + PCW MIO 49 DIRECTION + inout + + + + false + + + + + + PCW_MIO_49_SLEW + PCW MIO 49 SLEW + slow + + + PCW_MIO_50_PULLUP + PCW MIO 50 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_50_IOTYPE + PCW MIO 50 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_50_DIRECTION + PCW MIO 50 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_50_SLEW + PCW MIO 50 SLEW + <Select> + + + + false + + + + + + PCW_MIO_51_PULLUP + PCW MIO 51 PULLUP + <Select> + + + + false + + + + + + PCW_MIO_51_IOTYPE + PCW MIO 51 IOTYPE + <Select> + + + + false + + + + + + PCW_MIO_51_DIRECTION + PCW MIO 51 DIRECTION + <Select> + + + + false + + + + + + PCW_MIO_51_SLEW + PCW MIO 51 SLEW + <Select> + + + + false + + + + + + PCW_MIO_52_PULLUP + PCW MIO 52 PULLUP + enabled + + + PCW_MIO_52_IOTYPE + PCW MIO 52 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_52_DIRECTION + PCW MIO 52 DIRECTION + inout + + + + false + + + + + + PCW_MIO_52_SLEW + PCW MIO 52 SLEW + slow + + + PCW_MIO_53_PULLUP + PCW MIO 53 PULLUP + enabled + + + PCW_MIO_53_IOTYPE + PCW MIO 53 IOTYPE + LVCMOS 3.3V + + + PCW_MIO_53_DIRECTION + PCW MIO 53 DIRECTION + inout + + + + false + + + + + + PCW_MIO_53_SLEW + PCW MIO 53 SLEW + slow + + + preset + preset + None + + + PCW_UIPARAM_GENERATE_SUMMARY + PCW UIPARAM GENERATE SUMMARY + NONE + + + PCW_MIO_TREE_PERIPHERALS + PCW MIO TREE PERIPHERALS + SD 1#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#USB Reset#UART 1#UART 1#SD 1#SD 1#SD 1#SD 1#SD 1#SD 1#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#I2C 1#I2C 1#Unbonded#Unbonded#GPIO#GPIO + + + PCW_MIO_TREE_SIGNALS + PCW MIO TREE SIGNALS + cd#qspi0_ss_b#qspi0_io[0]#qspi0_io[1]#qspi0_io[2]#qspi0_io[3]/HOLD_B#qspi0_sclk#reset#tx#rx#data[0]#cmd#clk#data[1]#data[2]#data[3]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#data[4]#dir#stp#nxt#data[0]#data[1]#data[2]#data[3]#clk#data[5]#data[6]#data[7]#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#Unbonded#scl#sda#Unbonded#Unbonded#gpio[52]#gpio[53] + + + PCW_PS7_SI_REV + PCW PS7 SI REV + PRODUCTION + + + PCW_FPGA_FCLK0_ENABLE + PCW FPGA FCLK0 ENABLE + 1 + + + + true + + + + + + PCW_FPGA_FCLK1_ENABLE + PCW FPGA FCLK1 ENABLE + 1 + + + + true + + + + + + PCW_FPGA_FCLK2_ENABLE + PCW FPGA FCLK2 ENABLE + 0 + + + + false + + + + + + PCW_FPGA_FCLK3_ENABLE + PCW FPGA FCLK3 ENABLE + 0 + + + + false + + + + + + PCW_NOR_SRAM_CS0_T_TR + PCW NOR SRAM CS0 T TR + 1 + + + PCW_NOR_SRAM_CS0_T_PC + PCW NOR SRAM CS0 T PC + 1 + + + PCW_NOR_SRAM_CS0_T_WP + PCW NOR SRAM CS0 T WP + 1 + + + PCW_NOR_SRAM_CS0_T_CEOE + PCW NOR SRAM CS0 T CEOE + 1 + + + PCW_NOR_SRAM_CS0_T_WC + PCW NOR SRAM CS0 T WC + 11 + + + PCW_NOR_SRAM_CS0_T_RC + PCW NOR SRAM CS0 T RC + 11 + + + PCW_NOR_SRAM_CS0_WE_TIME + PCW NOR SRAM CS0 WE TIME + 0 + + + PCW_NOR_SRAM_CS1_T_TR + PCW NOR SRAM CS1 T TR + 1 + + + PCW_NOR_SRAM_CS1_T_PC + PCW NOR SRAM CS1 T PC + 1 + + + PCW_NOR_SRAM_CS1_T_WP + PCW NOR SRAM CS1 T WP + 1 + + + PCW_NOR_SRAM_CS1_T_CEOE + PCW NOR SRAM CS1 T CEOE + 1 + + + PCW_NOR_SRAM_CS1_T_WC + PCW NOR SRAM CS1 T WC + 11 + + + PCW_NOR_SRAM_CS1_T_RC + PCW NOR SRAM CS1 T RC + 11 + + + PCW_NOR_SRAM_CS1_WE_TIME + PCW NOR SRAM CS1 WE TIME + 0 + + + PCW_NOR_CS0_T_TR + PCW NOR CS0 T TR + 1 + + + PCW_NOR_CS0_T_PC + PCW NOR CS0 T PC + 1 + + + PCW_NOR_CS0_T_WP + PCW NOR CS0 T WP + 1 + + + PCW_NOR_CS0_T_CEOE + PCW NOR CS0 T CEOE + 1 + + + PCW_NOR_CS0_T_WC + PCW NOR CS0 T WC + 11 + + + PCW_NOR_CS0_T_RC + PCW NOR CS0 T RC + 11 + + + PCW_NOR_CS0_WE_TIME + PCW NOR CS0 WE TIME + 0 + + + PCW_NOR_CS1_T_TR + PCW NOR CS1 T TR + 1 + + + PCW_NOR_CS1_T_PC + PCW NOR CS1 T PC + 1 + + + PCW_NOR_CS1_T_WP + PCW NOR CS1 T WP + 1 + + + PCW_NOR_CS1_T_CEOE + PCW NOR CS1 T CEOE + 1 + + + PCW_NOR_CS1_T_WC + PCW NOR CS1 T WC + 11 + + + PCW_NOR_CS1_T_RC + PCW NOR CS1 T RC + 11 + + + PCW_NOR_CS1_WE_TIME + PCW NOR CS1 WE TIME + 0 + + + PCW_NAND_CYCLES_T_RR + PCW NAND CYCLES T RR + 1 + + + PCW_NAND_CYCLES_T_AR + PCW NAND CYCLES T AR + 1 + + + PCW_NAND_CYCLES_T_CLR + PCW NAND CYCLES T CLR + 1 + + + PCW_NAND_CYCLES_T_WP + PCW NAND CYCLES T WP + 1 + + + PCW_NAND_CYCLES_T_REA + PCW NAND CYCLES T REA + 1 + + + PCW_NAND_CYCLES_T_WC + PCW NAND CYCLES T WC + 11 + + + PCW_NAND_CYCLES_T_RC + PCW NAND CYCLES T RC + 11 + + + PCW_SMC_CYCLE_T0 + PCW SMC CYCLE T0 + NA + + + PCW_SMC_CYCLE_T1 + PCW SMC CYCLE T1 + NA + + + PCW_SMC_CYCLE_T2 + PCW SMC CYCLE T2 + NA + + + PCW_SMC_CYCLE_T3 + PCW SMC CYCLE T3 + NA + + + PCW_SMC_CYCLE_T4 + PCW SMC CYCLE T4 + NA + + + PCW_SMC_CYCLE_T5 + PCW SMC CYCLE T5 + NA + + + PCW_SMC_CYCLE_T6 + PCW SMC CYCLE T6 + NA + + + PCW_PACKAGE_NAME + PCW PACKAGE NAME + clg225 + + + PCW_PLL_BYPASSMODE_ENABLE + PCW PLL BYPASSMODE ENABLE + 0 + + + Component_Name + design_1_processing_system7_0_0 + + + + + ZYNQ7 Processing System + + XPM_MEMORY + XPM_FIFO + + 6 + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2018.2 + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_sim_netlist.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_sim_netlist.v new file mode 100644 index 0000000..5af2606 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_sim_netlist.v @@ -0,0 +1,5171 @@ +// Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +// Date : Fri Aug 17 17:36:46 2018 +// Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +// Command : write_verilog -force -mode funcsim +// c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_sim_netlist.v +// Design : design_1_processing_system7_0_0 +// Purpose : This verilog netlist is a functional simulation representation of the design and should not be modified +// or synthesized. This netlist cannot be used for SDF annotated simulation. +// Device : xc7z010clg225-1 +// -------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +(* CHECK_LICENSE_TYPE = "design_1_processing_system7_0_0,processing_system7_v5_5_processing_system7,{}" *) (* DowngradeIPIdentifiedWarnings = "yes" *) (* X_CORE_INFO = "processing_system7_v5_5_processing_system7,Vivado 2018.2" *) +(* NotValidForBitStream *) +module design_1_processing_system7_0_0 + (GPIO_I, + GPIO_O, + GPIO_T, + I2C0_SDA_I, + I2C0_SDA_O, + I2C0_SDA_T, + I2C0_SCL_I, + I2C0_SCL_O, + I2C0_SCL_T, + SDIO0_CLK, + SDIO0_CLK_FB, + SDIO0_CMD_O, + SDIO0_CMD_I, + SDIO0_CMD_T, + SDIO0_DATA_I, + SDIO0_DATA_O, + SDIO0_DATA_T, + SDIO0_LED, + SDIO0_CDN, + SDIO0_WP, + SDIO0_BUSPOW, + SDIO0_BUSVOLT, + SPI0_SCLK_I, + SPI0_SCLK_O, + SPI0_SCLK_T, + SPI0_MOSI_I, + SPI0_MOSI_O, + SPI0_MOSI_T, + SPI0_MISO_I, + SPI0_MISO_O, + SPI0_MISO_T, + SPI0_SS_I, + SPI0_SS_O, + SPI0_SS1_O, + SPI0_SS2_O, + SPI0_SS_T, + SPI1_SCLK_I, + SPI1_SCLK_O, + SPI1_SCLK_T, + SPI1_MOSI_I, + SPI1_MOSI_O, + SPI1_MOSI_T, + SPI1_MISO_I, + SPI1_MISO_O, + SPI1_MISO_T, + SPI1_SS_I, + SPI1_SS_O, + SPI1_SS1_O, + SPI1_SS2_O, + SPI1_SS_T, + UART0_TX, + UART0_RX, + TTC0_WAVE0_OUT, + TTC0_WAVE1_OUT, + TTC0_WAVE2_OUT, + TTC1_WAVE0_OUT, + TTC1_WAVE1_OUT, + TTC1_WAVE2_OUT, + USB0_PORT_INDCTL, + USB0_VBUS_PWRSELECT, + USB0_VBUS_PWRFAULT, + M_AXI_GP0_ARVALID, + M_AXI_GP0_AWVALID, + M_AXI_GP0_BREADY, + M_AXI_GP0_RREADY, + M_AXI_GP0_WLAST, + M_AXI_GP0_WVALID, + M_AXI_GP0_ARID, + M_AXI_GP0_AWID, + M_AXI_GP0_WID, + M_AXI_GP0_ARBURST, + M_AXI_GP0_ARLOCK, + M_AXI_GP0_ARSIZE, + M_AXI_GP0_AWBURST, + M_AXI_GP0_AWLOCK, + M_AXI_GP0_AWSIZE, + M_AXI_GP0_ARPROT, + M_AXI_GP0_AWPROT, + M_AXI_GP0_ARADDR, + M_AXI_GP0_AWADDR, + M_AXI_GP0_WDATA, + M_AXI_GP0_ARCACHE, + M_AXI_GP0_ARLEN, + M_AXI_GP0_ARQOS, + M_AXI_GP0_AWCACHE, + M_AXI_GP0_AWLEN, + M_AXI_GP0_AWQOS, + M_AXI_GP0_WSTRB, + M_AXI_GP0_ACLK, + M_AXI_GP0_ARREADY, + M_AXI_GP0_AWREADY, + M_AXI_GP0_BVALID, + M_AXI_GP0_RLAST, + M_AXI_GP0_RVALID, + M_AXI_GP0_WREADY, + M_AXI_GP0_BID, + M_AXI_GP0_RID, + M_AXI_GP0_BRESP, + M_AXI_GP0_RRESP, + M_AXI_GP0_RDATA, + IRQ_F2P, + FCLK_CLK0, + FCLK_CLK1, + FCLK_RESET0_N, + MIO, + DDR_CAS_n, + DDR_CKE, + DDR_Clk_n, + DDR_Clk, + DDR_CS_n, + DDR_DRSTB, + DDR_ODT, + DDR_RAS_n, + DDR_WEB, + DDR_BankAddr, + DDR_Addr, + DDR_VRN, + DDR_VRP, + DDR_DM, + DDR_DQ, + DDR_DQS_n, + DDR_DQS, + PS_SRSTB, + PS_CLK, + PS_PORB); + (* X_INTERFACE_INFO = "xilinx.com:interface:gpio:1.0 GPIO_0 TRI_I" *) input [63:0]GPIO_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:gpio:1.0 GPIO_0 TRI_O" *) output [63:0]GPIO_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:gpio:1.0 GPIO_0 TRI_T" *) output [63:0]GPIO_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SDA_I" *) input I2C0_SDA_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SDA_O" *) output I2C0_SDA_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SDA_T" *) output I2C0_SDA_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SCL_I" *) input I2C0_SCL_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SCL_O" *) output I2C0_SCL_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SCL_T" *) output I2C0_SCL_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CLK" *) output SDIO0_CLK; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CLK_FB" *) input SDIO0_CLK_FB; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CMD_O" *) output SDIO0_CMD_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CMD_I" *) input SDIO0_CMD_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CMD_T" *) output SDIO0_CMD_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 DATA_I" *) input [3:0]SDIO0_DATA_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 DATA_O" *) output [3:0]SDIO0_DATA_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 DATA_T" *) output [3:0]SDIO0_DATA_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 LED" *) output SDIO0_LED; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CDN" *) input SDIO0_CDN; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 WP" *) input SDIO0_WP; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 BUSPOW" *) output SDIO0_BUSPOW; + (* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 BUSVOLT" *) output [2:0]SDIO0_BUSVOLT; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SCK_I" *) input SPI0_SCLK_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SCK_O" *) output SPI0_SCLK_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SCK_T" *) output SPI0_SCLK_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO0_I" *) input SPI0_MOSI_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO0_O" *) output SPI0_MOSI_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO0_T" *) output SPI0_MOSI_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO1_I" *) input SPI0_MISO_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO1_O" *) output SPI0_MISO_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO1_T" *) output SPI0_MISO_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS_I" *) input SPI0_SS_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS_O" *) output SPI0_SS_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS1_O" *) output SPI0_SS1_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS2_O" *) output SPI0_SS2_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS_T" *) output SPI0_SS_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SCK_I" *) input SPI1_SCLK_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SCK_O" *) output SPI1_SCLK_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SCK_T" *) output SPI1_SCLK_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO0_I" *) input SPI1_MOSI_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO0_O" *) output SPI1_MOSI_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO0_T" *) output SPI1_MOSI_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO1_I" *) input SPI1_MISO_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO1_O" *) output SPI1_MISO_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO1_T" *) output SPI1_MISO_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS_I" *) input SPI1_SS_I; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS_O" *) output SPI1_SS_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS1_O" *) output SPI1_SS1_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS2_O" *) output SPI1_SS2_O; + (* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS_T" *) output SPI1_SS_T; + (* X_INTERFACE_INFO = "xilinx.com:interface:uart:1.0 UART_0 TxD" *) output UART0_TX; + (* X_INTERFACE_INFO = "xilinx.com:interface:uart:1.0 UART_0 RxD" *) input UART0_RX; + output TTC0_WAVE0_OUT; + output TTC0_WAVE1_OUT; + output TTC0_WAVE2_OUT; + output TTC1_WAVE0_OUT; + output TTC1_WAVE1_OUT; + output TTC1_WAVE2_OUT; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:usbctrl:1.0 USBIND_0 PORT_INDCTL" *) output [1:0]USB0_PORT_INDCTL; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:usbctrl:1.0 USBIND_0 VBUS_PWRSELECT" *) output USB0_VBUS_PWRSELECT; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:usbctrl:1.0 USBIND_0 VBUS_PWRFAULT" *) input USB0_VBUS_PWRFAULT; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARVALID" *) output M_AXI_GP0_ARVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWVALID" *) output M_AXI_GP0_AWVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BREADY" *) output M_AXI_GP0_BREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RREADY" *) output M_AXI_GP0_RREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WLAST" *) output M_AXI_GP0_WLAST; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WVALID" *) output M_AXI_GP0_WVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARID" *) output [11:0]M_AXI_GP0_ARID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWID" *) output [11:0]M_AXI_GP0_AWID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WID" *) output [11:0]M_AXI_GP0_WID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARBURST" *) output [1:0]M_AXI_GP0_ARBURST; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARLOCK" *) output [1:0]M_AXI_GP0_ARLOCK; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARSIZE" *) output [2:0]M_AXI_GP0_ARSIZE; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWBURST" *) output [1:0]M_AXI_GP0_AWBURST; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWLOCK" *) output [1:0]M_AXI_GP0_AWLOCK; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWSIZE" *) output [2:0]M_AXI_GP0_AWSIZE; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARPROT" *) output [2:0]M_AXI_GP0_ARPROT; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWPROT" *) output [2:0]M_AXI_GP0_AWPROT; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARADDR" *) output [31:0]M_AXI_GP0_ARADDR; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWADDR" *) output [31:0]M_AXI_GP0_AWADDR; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WDATA" *) output [31:0]M_AXI_GP0_WDATA; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARCACHE" *) output [3:0]M_AXI_GP0_ARCACHE; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARLEN" *) output [3:0]M_AXI_GP0_ARLEN; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARQOS" *) output [3:0]M_AXI_GP0_ARQOS; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWCACHE" *) output [3:0]M_AXI_GP0_AWCACHE; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWLEN" *) output [3:0]M_AXI_GP0_AWLEN; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWQOS" *) output [3:0]M_AXI_GP0_AWQOS; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WSTRB" *) output [3:0]M_AXI_GP0_WSTRB; + (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 M_AXI_GP0_ACLK CLK" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME M_AXI_GP0_ACLK, ASSOCIATED_BUSIF M_AXI_GP0, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) input M_AXI_GP0_ACLK; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARREADY" *) input M_AXI_GP0_ARREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWREADY" *) input M_AXI_GP0_AWREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BVALID" *) input M_AXI_GP0_BVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RLAST" *) input M_AXI_GP0_RLAST; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RVALID" *) input M_AXI_GP0_RVALID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WREADY" *) input M_AXI_GP0_WREADY; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BID" *) input [11:0]M_AXI_GP0_BID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RID" *) input [11:0]M_AXI_GP0_RID; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BRESP" *) input [1:0]M_AXI_GP0_BRESP; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RRESP" *) input [1:0]M_AXI_GP0_RRESP; + (* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RDATA" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME M_AXI_GP0, SUPPORTS_NARROW_BURST 0, NUM_WRITE_OUTSTANDING 8, NUM_READ_OUTSTANDING 8, DATA_WIDTH 32, PROTOCOL AXI3, FREQ_HZ 50000000, ID_WIDTH 12, ADDR_WIDTH 32, AWUSER_WIDTH 0, ARUSER_WIDTH 0, WUSER_WIDTH 0, RUSER_WIDTH 0, BUSER_WIDTH 0, READ_WRITE_MODE READ_WRITE, HAS_BURST 1, HAS_LOCK 1, HAS_PROT 1, HAS_CACHE 1, HAS_QOS 1, HAS_REGION 0, HAS_WSTRB 1, HAS_BRESP 1, HAS_RRESP 1, MAX_BURST_LENGTH 16, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0, NUM_READ_THREADS 4, NUM_WRITE_THREADS 4, RUSER_BITS_PER_BYTE 0, WUSER_BITS_PER_BYTE 0" *) input [31:0]M_AXI_GP0_RDATA; + (* X_INTERFACE_INFO = "xilinx.com:signal:interrupt:1.0 IRQ_F2P INTERRUPT" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME IRQ_F2P, SENSITIVITY LEVEL_HIGH, PortWidth 1" *) input [0:0]IRQ_F2P; + (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 FCLK_CLK0 CLK" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FCLK_CLK0, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) output FCLK_CLK0; + (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 FCLK_CLK1 CLK" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FCLK_CLK1, FREQ_HZ 100000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK1" *) output FCLK_CLK1; + (* X_INTERFACE_INFO = "xilinx.com:signal:reset:1.0 FCLK_RESET0_N RST" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FCLK_RESET0_N, POLARITY ACTIVE_LOW" *) output FCLK_RESET0_N; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO MIO" *) inout [31:0]MIO; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CAS_N" *) inout DDR_CAS_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CKE" *) inout DDR_CKE; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_N" *) inout DDR_Clk_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_P" *) inout DDR_Clk; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CS_N" *) inout DDR_CS_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RESET_N" *) inout DDR_DRSTB; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ODT" *) inout DDR_ODT; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RAS_N" *) inout DDR_RAS_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR WE_N" *) inout DDR_WEB; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR BA" *) inout [2:0]DDR_BankAddr; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ADDR" *) inout [14:0]DDR_Addr; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRN" *) inout DDR_VRN; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRP" *) inout DDR_VRP; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DM" *) inout [1:0]DDR_DM; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQ" *) inout [15:0]DDR_DQ; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_N" *) inout [1:0]DDR_DQS_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_P" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME DDR, CAN_DEBUG false, TIMEPERIOD_PS 1250, MEMORY_TYPE COMPONENTS, DATA_WIDTH 8, CS_ENABLED true, DATA_MASK_ENABLED true, SLOT Single, MEM_ADDR_MAP ROW_COLUMN_BANK, BURST_LENGTH 8, AXI_ARBITRATION_SCHEME TDM, CAS_LATENCY 11, CAS_WRITE_LATENCY 11" *) inout [1:0]DDR_DQS; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_SRSTB" *) inout PS_SRSTB; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_CLK" *) inout PS_CLK; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_PORB" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FIXED_IO, CAN_DEBUG false" *) inout PS_PORB; + + wire [14:0]DDR_Addr; + wire [2:0]DDR_BankAddr; + wire DDR_CAS_n; + wire DDR_CKE; + wire DDR_CS_n; + wire DDR_Clk; + wire DDR_Clk_n; + wire [1:0]DDR_DM; + wire [15:0]DDR_DQ; + wire [1:0]DDR_DQS; + wire [1:0]DDR_DQS_n; + wire DDR_DRSTB; + wire DDR_ODT; + wire DDR_RAS_n; + wire DDR_VRN; + wire DDR_VRP; + wire DDR_WEB; + wire FCLK_CLK0; + wire FCLK_CLK1; + wire FCLK_RESET0_N; + wire [63:0]GPIO_I; + wire [63:0]GPIO_O; + wire [63:0]GPIO_T; + wire I2C0_SCL_I; + wire I2C0_SCL_O; + wire I2C0_SCL_T; + wire I2C0_SDA_I; + wire I2C0_SDA_O; + wire I2C0_SDA_T; + wire [0:0]IRQ_F2P; + wire [31:0]MIO; + wire M_AXI_GP0_ACLK; + wire [31:0]M_AXI_GP0_ARADDR; + wire [1:0]M_AXI_GP0_ARBURST; + wire [3:0]M_AXI_GP0_ARCACHE; + wire [11:0]M_AXI_GP0_ARID; + wire [3:0]M_AXI_GP0_ARLEN; + wire [1:0]M_AXI_GP0_ARLOCK; + wire [2:0]M_AXI_GP0_ARPROT; + wire [3:0]M_AXI_GP0_ARQOS; + wire M_AXI_GP0_ARREADY; + wire [2:0]M_AXI_GP0_ARSIZE; + wire M_AXI_GP0_ARVALID; + wire [31:0]M_AXI_GP0_AWADDR; + wire [1:0]M_AXI_GP0_AWBURST; + wire [3:0]M_AXI_GP0_AWCACHE; + wire [11:0]M_AXI_GP0_AWID; + wire [3:0]M_AXI_GP0_AWLEN; + wire [1:0]M_AXI_GP0_AWLOCK; + wire [2:0]M_AXI_GP0_AWPROT; + wire [3:0]M_AXI_GP0_AWQOS; + wire M_AXI_GP0_AWREADY; + wire [2:0]M_AXI_GP0_AWSIZE; + wire M_AXI_GP0_AWVALID; + wire [11:0]M_AXI_GP0_BID; + wire M_AXI_GP0_BREADY; + wire [1:0]M_AXI_GP0_BRESP; + wire M_AXI_GP0_BVALID; + wire [31:0]M_AXI_GP0_RDATA; + wire [11:0]M_AXI_GP0_RID; + wire M_AXI_GP0_RLAST; + wire M_AXI_GP0_RREADY; + wire [1:0]M_AXI_GP0_RRESP; + wire M_AXI_GP0_RVALID; + wire [31:0]M_AXI_GP0_WDATA; + wire [11:0]M_AXI_GP0_WID; + wire M_AXI_GP0_WLAST; + wire M_AXI_GP0_WREADY; + wire [3:0]M_AXI_GP0_WSTRB; + wire M_AXI_GP0_WVALID; + wire PS_CLK; + wire PS_PORB; + wire PS_SRSTB; + wire SDIO0_BUSPOW; + wire [2:0]SDIO0_BUSVOLT; + wire SDIO0_CDN; + wire SDIO0_CLK; + wire SDIO0_CLK_FB; + wire SDIO0_CMD_I; + wire SDIO0_CMD_O; + wire SDIO0_CMD_T; + wire [3:0]SDIO0_DATA_I; + wire [3:0]SDIO0_DATA_O; + wire [3:0]SDIO0_DATA_T; + wire SDIO0_LED; + wire SDIO0_WP; + wire SPI0_MISO_I; + wire SPI0_MISO_O; + wire SPI0_MISO_T; + wire SPI0_MOSI_I; + wire SPI0_MOSI_O; + wire SPI0_MOSI_T; + wire SPI0_SCLK_I; + wire SPI0_SCLK_O; + wire SPI0_SCLK_T; + wire SPI0_SS1_O; + wire SPI0_SS2_O; + wire SPI0_SS_I; + wire SPI0_SS_O; + wire SPI0_SS_T; + wire SPI1_MISO_I; + wire SPI1_MISO_O; + wire SPI1_MISO_T; + wire SPI1_MOSI_I; + wire SPI1_MOSI_O; + wire SPI1_MOSI_T; + wire SPI1_SCLK_I; + wire SPI1_SCLK_O; + wire SPI1_SCLK_T; + wire SPI1_SS1_O; + wire SPI1_SS2_O; + wire SPI1_SS_I; + wire SPI1_SS_O; + wire SPI1_SS_T; + wire TTC0_WAVE0_OUT; + wire TTC0_WAVE1_OUT; + wire TTC0_WAVE2_OUT; + wire TTC1_WAVE0_OUT; + wire TTC1_WAVE1_OUT; + wire TTC1_WAVE2_OUT; + wire UART0_RX; + wire UART0_TX; + wire [1:0]USB0_PORT_INDCTL; + wire USB0_VBUS_PWRFAULT; + wire USB0_VBUS_PWRSELECT; + wire NLW_inst_CAN0_PHY_TX_UNCONNECTED; + wire NLW_inst_CAN1_PHY_TX_UNCONNECTED; + wire NLW_inst_DMA0_DAVALID_UNCONNECTED; + wire NLW_inst_DMA0_DRREADY_UNCONNECTED; + wire NLW_inst_DMA0_RSTN_UNCONNECTED; + wire NLW_inst_DMA1_DAVALID_UNCONNECTED; + wire NLW_inst_DMA1_DRREADY_UNCONNECTED; + wire NLW_inst_DMA1_RSTN_UNCONNECTED; + wire NLW_inst_DMA2_DAVALID_UNCONNECTED; + wire NLW_inst_DMA2_DRREADY_UNCONNECTED; + wire NLW_inst_DMA2_RSTN_UNCONNECTED; + wire NLW_inst_DMA3_DAVALID_UNCONNECTED; + wire NLW_inst_DMA3_DRREADY_UNCONNECTED; + wire NLW_inst_DMA3_RSTN_UNCONNECTED; + wire NLW_inst_ENET0_GMII_TX_EN_UNCONNECTED; + wire NLW_inst_ENET0_GMII_TX_ER_UNCONNECTED; + wire NLW_inst_ENET0_MDIO_MDC_UNCONNECTED; + wire NLW_inst_ENET0_MDIO_O_UNCONNECTED; + wire NLW_inst_ENET0_MDIO_T_UNCONNECTED; + wire NLW_inst_ENET0_PTP_DELAY_REQ_RX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_DELAY_REQ_TX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_PDELAY_REQ_RX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_PDELAY_REQ_TX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_PDELAY_RESP_RX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_PDELAY_RESP_TX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_SYNC_FRAME_RX_UNCONNECTED; + wire NLW_inst_ENET0_PTP_SYNC_FRAME_TX_UNCONNECTED; + wire NLW_inst_ENET0_SOF_RX_UNCONNECTED; + wire NLW_inst_ENET0_SOF_TX_UNCONNECTED; + wire NLW_inst_ENET1_GMII_TX_EN_UNCONNECTED; + wire NLW_inst_ENET1_GMII_TX_ER_UNCONNECTED; + wire NLW_inst_ENET1_MDIO_MDC_UNCONNECTED; + wire NLW_inst_ENET1_MDIO_O_UNCONNECTED; + wire NLW_inst_ENET1_MDIO_T_UNCONNECTED; + wire NLW_inst_ENET1_PTP_DELAY_REQ_RX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_DELAY_REQ_TX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_PDELAY_REQ_RX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_PDELAY_REQ_TX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_PDELAY_RESP_RX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_PDELAY_RESP_TX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_SYNC_FRAME_RX_UNCONNECTED; + wire NLW_inst_ENET1_PTP_SYNC_FRAME_TX_UNCONNECTED; + wire NLW_inst_ENET1_SOF_RX_UNCONNECTED; + wire NLW_inst_ENET1_SOF_TX_UNCONNECTED; + wire NLW_inst_EVENT_EVENTO_UNCONNECTED; + wire NLW_inst_FCLK_CLK2_UNCONNECTED; + wire NLW_inst_FCLK_CLK3_UNCONNECTED; + wire NLW_inst_FCLK_RESET1_N_UNCONNECTED; + wire NLW_inst_FCLK_RESET2_N_UNCONNECTED; + wire NLW_inst_FCLK_RESET3_N_UNCONNECTED; + wire NLW_inst_FTMT_F2P_TRIGACK_0_UNCONNECTED; + wire NLW_inst_FTMT_F2P_TRIGACK_1_UNCONNECTED; + wire NLW_inst_FTMT_F2P_TRIGACK_2_UNCONNECTED; + wire NLW_inst_FTMT_F2P_TRIGACK_3_UNCONNECTED; + wire NLW_inst_FTMT_P2F_TRIG_0_UNCONNECTED; + wire NLW_inst_FTMT_P2F_TRIG_1_UNCONNECTED; + wire NLW_inst_FTMT_P2F_TRIG_2_UNCONNECTED; + wire NLW_inst_FTMT_P2F_TRIG_3_UNCONNECTED; + wire NLW_inst_I2C1_SCL_O_UNCONNECTED; + wire NLW_inst_I2C1_SCL_T_UNCONNECTED; + wire NLW_inst_I2C1_SDA_O_UNCONNECTED; + wire NLW_inst_I2C1_SDA_T_UNCONNECTED; + wire NLW_inst_IRQ_P2F_CAN0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_CAN1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_CTI_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC2_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC3_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC4_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC5_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC6_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC7_UNCONNECTED; + wire NLW_inst_IRQ_P2F_DMAC_ABORT_UNCONNECTED; + wire NLW_inst_IRQ_P2F_ENET0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_ENET1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_ENET_WAKE0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_ENET_WAKE1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_GPIO_UNCONNECTED; + wire NLW_inst_IRQ_P2F_I2C0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_I2C1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_QSPI_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SDIO0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SDIO1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SMC_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SPI0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_SPI1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_UART0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_UART1_UNCONNECTED; + wire NLW_inst_IRQ_P2F_USB0_UNCONNECTED; + wire NLW_inst_IRQ_P2F_USB1_UNCONNECTED; + wire NLW_inst_M_AXI_GP0_ARESETN_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_ARESETN_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_ARVALID_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_AWVALID_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_BREADY_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_RREADY_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_WLAST_UNCONNECTED; + wire NLW_inst_M_AXI_GP1_WVALID_UNCONNECTED; + wire NLW_inst_PJTAG_TDO_UNCONNECTED; + wire NLW_inst_SDIO1_BUSPOW_UNCONNECTED; + wire NLW_inst_SDIO1_CLK_UNCONNECTED; + wire NLW_inst_SDIO1_CMD_O_UNCONNECTED; + wire NLW_inst_SDIO1_CMD_T_UNCONNECTED; + wire NLW_inst_SDIO1_LED_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_ACP_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_GP0_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_GP1_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP0_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP1_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP2_WREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_ARESETN_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_ARREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_AWREADY_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_BVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_RLAST_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_RVALID_UNCONNECTED; + wire NLW_inst_S_AXI_HP3_WREADY_UNCONNECTED; + wire NLW_inst_TRACE_CLK_OUT_UNCONNECTED; + wire NLW_inst_TRACE_CTL_UNCONNECTED; + wire NLW_inst_UART0_DTRN_UNCONNECTED; + wire NLW_inst_UART0_RTSN_UNCONNECTED; + wire NLW_inst_UART1_DTRN_UNCONNECTED; + wire NLW_inst_UART1_RTSN_UNCONNECTED; + wire NLW_inst_UART1_TX_UNCONNECTED; + wire NLW_inst_USB1_VBUS_PWRSELECT_UNCONNECTED; + wire NLW_inst_WDT_RST_OUT_UNCONNECTED; + wire [1:0]NLW_inst_DMA0_DATYPE_UNCONNECTED; + wire [1:0]NLW_inst_DMA1_DATYPE_UNCONNECTED; + wire [1:0]NLW_inst_DMA2_DATYPE_UNCONNECTED; + wire [1:0]NLW_inst_DMA3_DATYPE_UNCONNECTED; + wire [7:0]NLW_inst_ENET0_GMII_TXD_UNCONNECTED; + wire [7:0]NLW_inst_ENET1_GMII_TXD_UNCONNECTED; + wire [1:0]NLW_inst_EVENT_STANDBYWFE_UNCONNECTED; + wire [1:0]NLW_inst_EVENT_STANDBYWFI_UNCONNECTED; + wire [31:0]NLW_inst_FTMT_P2F_DEBUG_UNCONNECTED; + wire [31:0]NLW_inst_M_AXI_GP1_ARADDR_UNCONNECTED; + wire [1:0]NLW_inst_M_AXI_GP1_ARBURST_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_ARCACHE_UNCONNECTED; + wire [11:0]NLW_inst_M_AXI_GP1_ARID_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_ARLEN_UNCONNECTED; + wire [1:0]NLW_inst_M_AXI_GP1_ARLOCK_UNCONNECTED; + wire [2:0]NLW_inst_M_AXI_GP1_ARPROT_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_ARQOS_UNCONNECTED; + wire [2:0]NLW_inst_M_AXI_GP1_ARSIZE_UNCONNECTED; + wire [31:0]NLW_inst_M_AXI_GP1_AWADDR_UNCONNECTED; + wire [1:0]NLW_inst_M_AXI_GP1_AWBURST_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_AWCACHE_UNCONNECTED; + wire [11:0]NLW_inst_M_AXI_GP1_AWID_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_AWLEN_UNCONNECTED; + wire [1:0]NLW_inst_M_AXI_GP1_AWLOCK_UNCONNECTED; + wire [2:0]NLW_inst_M_AXI_GP1_AWPROT_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_AWQOS_UNCONNECTED; + wire [2:0]NLW_inst_M_AXI_GP1_AWSIZE_UNCONNECTED; + wire [31:0]NLW_inst_M_AXI_GP1_WDATA_UNCONNECTED; + wire [11:0]NLW_inst_M_AXI_GP1_WID_UNCONNECTED; + wire [3:0]NLW_inst_M_AXI_GP1_WSTRB_UNCONNECTED; + wire [2:0]NLW_inst_SDIO1_BUSVOLT_UNCONNECTED; + wire [3:0]NLW_inst_SDIO1_DATA_O_UNCONNECTED; + wire [3:0]NLW_inst_SDIO1_DATA_T_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_ACP_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_ACP_BRESP_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_ACP_RDATA_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_ACP_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_ACP_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_GP0_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_GP0_BRESP_UNCONNECTED; + wire [31:0]NLW_inst_S_AXI_GP0_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_GP0_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_GP0_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_GP1_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_GP1_BRESP_UNCONNECTED; + wire [31:0]NLW_inst_S_AXI_GP1_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_GP1_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_GP1_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP0_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP0_BRESP_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_HP0_RACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP0_RCOUNT_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_HP0_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP0_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP0_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP0_WACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP0_WCOUNT_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP1_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP1_BRESP_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_HP1_RACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP1_RCOUNT_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_HP1_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP1_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP1_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP1_WACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP1_WCOUNT_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP2_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP2_BRESP_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_HP2_RACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP2_RCOUNT_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_HP2_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP2_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP2_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP2_WACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP2_WCOUNT_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP3_BID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP3_BRESP_UNCONNECTED; + wire [2:0]NLW_inst_S_AXI_HP3_RACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP3_RCOUNT_UNCONNECTED; + wire [63:0]NLW_inst_S_AXI_HP3_RDATA_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP3_RID_UNCONNECTED; + wire [1:0]NLW_inst_S_AXI_HP3_RRESP_UNCONNECTED; + wire [5:0]NLW_inst_S_AXI_HP3_WACOUNT_UNCONNECTED; + wire [7:0]NLW_inst_S_AXI_HP3_WCOUNT_UNCONNECTED; + wire [1:0]NLW_inst_TRACE_DATA_UNCONNECTED; + wire [1:0]NLW_inst_USB1_PORT_INDCTL_UNCONNECTED; + + (* C_DM_WIDTH = "2" *) + (* C_DQS_WIDTH = "2" *) + (* C_DQ_WIDTH = "16" *) + (* C_EMIO_GPIO_WIDTH = "64" *) + (* C_EN_EMIO_ENET0 = "0" *) + (* C_EN_EMIO_ENET1 = "0" *) + (* C_EN_EMIO_PJTAG = "0" *) + (* C_EN_EMIO_TRACE = "0" *) + (* C_FCLK_CLK0_BUF = "TRUE" *) + (* C_FCLK_CLK1_BUF = "TRUE" *) + (* C_FCLK_CLK2_BUF = "FALSE" *) + (* C_FCLK_CLK3_BUF = "FALSE" *) + (* C_GP0_EN_MODIFIABLE_TXN = "1" *) + (* C_GP1_EN_MODIFIABLE_TXN = "1" *) + (* C_INCLUDE_ACP_TRANS_CHECK = "0" *) + (* C_INCLUDE_TRACE_BUFFER = "0" *) + (* C_IRQ_F2P_MODE = "DIRECT" *) + (* C_MIO_PRIMITIVE = "32" *) + (* C_M_AXI_GP0_ENABLE_STATIC_REMAP = "0" *) + (* C_M_AXI_GP0_ID_WIDTH = "12" *) + (* C_M_AXI_GP0_THREAD_ID_WIDTH = "12" *) + (* C_M_AXI_GP1_ENABLE_STATIC_REMAP = "0" *) + (* C_M_AXI_GP1_ID_WIDTH = "12" *) + (* C_M_AXI_GP1_THREAD_ID_WIDTH = "12" *) + (* C_NUM_F2P_INTR_INPUTS = "1" *) + (* C_PACKAGE_NAME = "clg225" *) + (* C_PS7_SI_REV = "PRODUCTION" *) + (* C_S_AXI_ACP_ARUSER_VAL = "31" *) + (* C_S_AXI_ACP_AWUSER_VAL = "31" *) + (* C_S_AXI_ACP_ID_WIDTH = "3" *) + (* C_S_AXI_GP0_ID_WIDTH = "6" *) + (* C_S_AXI_GP1_ID_WIDTH = "6" *) + (* C_S_AXI_HP0_DATA_WIDTH = "64" *) + (* C_S_AXI_HP0_ID_WIDTH = "6" *) + (* C_S_AXI_HP1_DATA_WIDTH = "64" *) + (* C_S_AXI_HP1_ID_WIDTH = "6" *) + (* C_S_AXI_HP2_DATA_WIDTH = "64" *) + (* C_S_AXI_HP2_ID_WIDTH = "6" *) + (* C_S_AXI_HP3_DATA_WIDTH = "64" *) + (* C_S_AXI_HP3_ID_WIDTH = "6" *) + (* C_TRACE_BUFFER_CLOCK_DELAY = "12" *) + (* C_TRACE_BUFFER_FIFO_SIZE = "128" *) + (* C_TRACE_INTERNAL_WIDTH = "2" *) + (* C_TRACE_PIPELINE_WIDTH = "8" *) + (* C_USE_AXI_NONSECURE = "0" *) + (* C_USE_DEFAULT_ACP_USER_VAL = "0" *) + (* C_USE_M_AXI_GP0 = "1" *) + (* C_USE_M_AXI_GP1 = "0" *) + (* C_USE_S_AXI_ACP = "0" *) + (* C_USE_S_AXI_GP0 = "0" *) + (* C_USE_S_AXI_GP1 = "0" *) + (* C_USE_S_AXI_HP0 = "0" *) + (* C_USE_S_AXI_HP1 = "0" *) + (* C_USE_S_AXI_HP2 = "0" *) + (* C_USE_S_AXI_HP3 = "0" *) + (* HW_HANDOFF = "design_1_processing_system7_0_0.hwdef" *) + (* POWER = "/>" *) + (* USE_TRACE_DATA_EDGE_DETECTOR = "0" *) + design_1_processing_system7_0_0_processing_system7_v5_5_processing_system7 inst + (.CAN0_PHY_RX(1'b0), + .CAN0_PHY_TX(NLW_inst_CAN0_PHY_TX_UNCONNECTED), + .CAN1_PHY_RX(1'b0), + .CAN1_PHY_TX(NLW_inst_CAN1_PHY_TX_UNCONNECTED), + .Core0_nFIQ(1'b0), + .Core0_nIRQ(1'b0), + .Core1_nFIQ(1'b0), + .Core1_nIRQ(1'b0), + .DDR_ARB({1'b0,1'b0,1'b0,1'b0}), + .DDR_Addr(DDR_Addr), + .DDR_BankAddr(DDR_BankAddr), + .DDR_CAS_n(DDR_CAS_n), + .DDR_CKE(DDR_CKE), + .DDR_CS_n(DDR_CS_n), + .DDR_Clk(DDR_Clk), + .DDR_Clk_n(DDR_Clk_n), + .DDR_DM(DDR_DM), + .DDR_DQ(DDR_DQ), + .DDR_DQS(DDR_DQS), + .DDR_DQS_n(DDR_DQS_n), + .DDR_DRSTB(DDR_DRSTB), + .DDR_ODT(DDR_ODT), + .DDR_RAS_n(DDR_RAS_n), + .DDR_VRN(DDR_VRN), + .DDR_VRP(DDR_VRP), + .DDR_WEB(DDR_WEB), + .DMA0_ACLK(1'b0), + .DMA0_DAREADY(1'b0), + .DMA0_DATYPE(NLW_inst_DMA0_DATYPE_UNCONNECTED[1:0]), + .DMA0_DAVALID(NLW_inst_DMA0_DAVALID_UNCONNECTED), + .DMA0_DRLAST(1'b0), + .DMA0_DRREADY(NLW_inst_DMA0_DRREADY_UNCONNECTED), + .DMA0_DRTYPE({1'b0,1'b0}), + .DMA0_DRVALID(1'b0), + .DMA0_RSTN(NLW_inst_DMA0_RSTN_UNCONNECTED), + .DMA1_ACLK(1'b0), + .DMA1_DAREADY(1'b0), + .DMA1_DATYPE(NLW_inst_DMA1_DATYPE_UNCONNECTED[1:0]), + .DMA1_DAVALID(NLW_inst_DMA1_DAVALID_UNCONNECTED), + .DMA1_DRLAST(1'b0), + .DMA1_DRREADY(NLW_inst_DMA1_DRREADY_UNCONNECTED), + .DMA1_DRTYPE({1'b0,1'b0}), + .DMA1_DRVALID(1'b0), + .DMA1_RSTN(NLW_inst_DMA1_RSTN_UNCONNECTED), + .DMA2_ACLK(1'b0), + .DMA2_DAREADY(1'b0), + .DMA2_DATYPE(NLW_inst_DMA2_DATYPE_UNCONNECTED[1:0]), + .DMA2_DAVALID(NLW_inst_DMA2_DAVALID_UNCONNECTED), + .DMA2_DRLAST(1'b0), + .DMA2_DRREADY(NLW_inst_DMA2_DRREADY_UNCONNECTED), + .DMA2_DRTYPE({1'b0,1'b0}), + .DMA2_DRVALID(1'b0), + .DMA2_RSTN(NLW_inst_DMA2_RSTN_UNCONNECTED), + .DMA3_ACLK(1'b0), + .DMA3_DAREADY(1'b0), + .DMA3_DATYPE(NLW_inst_DMA3_DATYPE_UNCONNECTED[1:0]), + .DMA3_DAVALID(NLW_inst_DMA3_DAVALID_UNCONNECTED), + .DMA3_DRLAST(1'b0), + .DMA3_DRREADY(NLW_inst_DMA3_DRREADY_UNCONNECTED), + .DMA3_DRTYPE({1'b0,1'b0}), + .DMA3_DRVALID(1'b0), + .DMA3_RSTN(NLW_inst_DMA3_RSTN_UNCONNECTED), + .ENET0_EXT_INTIN(1'b0), + .ENET0_GMII_COL(1'b0), + .ENET0_GMII_CRS(1'b0), + .ENET0_GMII_RXD({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .ENET0_GMII_RX_CLK(1'b0), + .ENET0_GMII_RX_DV(1'b0), + .ENET0_GMII_RX_ER(1'b0), + .ENET0_GMII_TXD(NLW_inst_ENET0_GMII_TXD_UNCONNECTED[7:0]), + .ENET0_GMII_TX_CLK(1'b0), + .ENET0_GMII_TX_EN(NLW_inst_ENET0_GMII_TX_EN_UNCONNECTED), + .ENET0_GMII_TX_ER(NLW_inst_ENET0_GMII_TX_ER_UNCONNECTED), + .ENET0_MDIO_I(1'b0), + .ENET0_MDIO_MDC(NLW_inst_ENET0_MDIO_MDC_UNCONNECTED), + .ENET0_MDIO_O(NLW_inst_ENET0_MDIO_O_UNCONNECTED), + .ENET0_MDIO_T(NLW_inst_ENET0_MDIO_T_UNCONNECTED), + .ENET0_PTP_DELAY_REQ_RX(NLW_inst_ENET0_PTP_DELAY_REQ_RX_UNCONNECTED), + .ENET0_PTP_DELAY_REQ_TX(NLW_inst_ENET0_PTP_DELAY_REQ_TX_UNCONNECTED), + .ENET0_PTP_PDELAY_REQ_RX(NLW_inst_ENET0_PTP_PDELAY_REQ_RX_UNCONNECTED), + .ENET0_PTP_PDELAY_REQ_TX(NLW_inst_ENET0_PTP_PDELAY_REQ_TX_UNCONNECTED), + .ENET0_PTP_PDELAY_RESP_RX(NLW_inst_ENET0_PTP_PDELAY_RESP_RX_UNCONNECTED), + .ENET0_PTP_PDELAY_RESP_TX(NLW_inst_ENET0_PTP_PDELAY_RESP_TX_UNCONNECTED), + .ENET0_PTP_SYNC_FRAME_RX(NLW_inst_ENET0_PTP_SYNC_FRAME_RX_UNCONNECTED), + .ENET0_PTP_SYNC_FRAME_TX(NLW_inst_ENET0_PTP_SYNC_FRAME_TX_UNCONNECTED), + .ENET0_SOF_RX(NLW_inst_ENET0_SOF_RX_UNCONNECTED), + .ENET0_SOF_TX(NLW_inst_ENET0_SOF_TX_UNCONNECTED), + .ENET1_EXT_INTIN(1'b0), + .ENET1_GMII_COL(1'b0), + .ENET1_GMII_CRS(1'b0), + .ENET1_GMII_RXD({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .ENET1_GMII_RX_CLK(1'b0), + .ENET1_GMII_RX_DV(1'b0), + .ENET1_GMII_RX_ER(1'b0), + .ENET1_GMII_TXD(NLW_inst_ENET1_GMII_TXD_UNCONNECTED[7:0]), + .ENET1_GMII_TX_CLK(1'b0), + .ENET1_GMII_TX_EN(NLW_inst_ENET1_GMII_TX_EN_UNCONNECTED), + .ENET1_GMII_TX_ER(NLW_inst_ENET1_GMII_TX_ER_UNCONNECTED), + .ENET1_MDIO_I(1'b0), + .ENET1_MDIO_MDC(NLW_inst_ENET1_MDIO_MDC_UNCONNECTED), + .ENET1_MDIO_O(NLW_inst_ENET1_MDIO_O_UNCONNECTED), + .ENET1_MDIO_T(NLW_inst_ENET1_MDIO_T_UNCONNECTED), + .ENET1_PTP_DELAY_REQ_RX(NLW_inst_ENET1_PTP_DELAY_REQ_RX_UNCONNECTED), + .ENET1_PTP_DELAY_REQ_TX(NLW_inst_ENET1_PTP_DELAY_REQ_TX_UNCONNECTED), + .ENET1_PTP_PDELAY_REQ_RX(NLW_inst_ENET1_PTP_PDELAY_REQ_RX_UNCONNECTED), + .ENET1_PTP_PDELAY_REQ_TX(NLW_inst_ENET1_PTP_PDELAY_REQ_TX_UNCONNECTED), + .ENET1_PTP_PDELAY_RESP_RX(NLW_inst_ENET1_PTP_PDELAY_RESP_RX_UNCONNECTED), + .ENET1_PTP_PDELAY_RESP_TX(NLW_inst_ENET1_PTP_PDELAY_RESP_TX_UNCONNECTED), + .ENET1_PTP_SYNC_FRAME_RX(NLW_inst_ENET1_PTP_SYNC_FRAME_RX_UNCONNECTED), + .ENET1_PTP_SYNC_FRAME_TX(NLW_inst_ENET1_PTP_SYNC_FRAME_TX_UNCONNECTED), + .ENET1_SOF_RX(NLW_inst_ENET1_SOF_RX_UNCONNECTED), + .ENET1_SOF_TX(NLW_inst_ENET1_SOF_TX_UNCONNECTED), + .EVENT_EVENTI(1'b0), + .EVENT_EVENTO(NLW_inst_EVENT_EVENTO_UNCONNECTED), + .EVENT_STANDBYWFE(NLW_inst_EVENT_STANDBYWFE_UNCONNECTED[1:0]), + .EVENT_STANDBYWFI(NLW_inst_EVENT_STANDBYWFI_UNCONNECTED[1:0]), + .FCLK_CLK0(FCLK_CLK0), + .FCLK_CLK1(FCLK_CLK1), + .FCLK_CLK2(NLW_inst_FCLK_CLK2_UNCONNECTED), + .FCLK_CLK3(NLW_inst_FCLK_CLK3_UNCONNECTED), + .FCLK_CLKTRIG0_N(1'b0), + .FCLK_CLKTRIG1_N(1'b0), + .FCLK_CLKTRIG2_N(1'b0), + .FCLK_CLKTRIG3_N(1'b0), + .FCLK_RESET0_N(FCLK_RESET0_N), + .FCLK_RESET1_N(NLW_inst_FCLK_RESET1_N_UNCONNECTED), + .FCLK_RESET2_N(NLW_inst_FCLK_RESET2_N_UNCONNECTED), + .FCLK_RESET3_N(NLW_inst_FCLK_RESET3_N_UNCONNECTED), + .FPGA_IDLE_N(1'b0), + .FTMD_TRACEIN_ATID({1'b0,1'b0,1'b0,1'b0}), + .FTMD_TRACEIN_CLK(1'b0), + .FTMD_TRACEIN_DATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .FTMD_TRACEIN_VALID(1'b0), + .FTMT_F2P_DEBUG({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .FTMT_F2P_TRIGACK_0(NLW_inst_FTMT_F2P_TRIGACK_0_UNCONNECTED), + .FTMT_F2P_TRIGACK_1(NLW_inst_FTMT_F2P_TRIGACK_1_UNCONNECTED), + .FTMT_F2P_TRIGACK_2(NLW_inst_FTMT_F2P_TRIGACK_2_UNCONNECTED), + .FTMT_F2P_TRIGACK_3(NLW_inst_FTMT_F2P_TRIGACK_3_UNCONNECTED), + .FTMT_F2P_TRIG_0(1'b0), + .FTMT_F2P_TRIG_1(1'b0), + .FTMT_F2P_TRIG_2(1'b0), + .FTMT_F2P_TRIG_3(1'b0), + .FTMT_P2F_DEBUG(NLW_inst_FTMT_P2F_DEBUG_UNCONNECTED[31:0]), + .FTMT_P2F_TRIGACK_0(1'b0), + .FTMT_P2F_TRIGACK_1(1'b0), + .FTMT_P2F_TRIGACK_2(1'b0), + .FTMT_P2F_TRIGACK_3(1'b0), + .FTMT_P2F_TRIG_0(NLW_inst_FTMT_P2F_TRIG_0_UNCONNECTED), + .FTMT_P2F_TRIG_1(NLW_inst_FTMT_P2F_TRIG_1_UNCONNECTED), + .FTMT_P2F_TRIG_2(NLW_inst_FTMT_P2F_TRIG_2_UNCONNECTED), + .FTMT_P2F_TRIG_3(NLW_inst_FTMT_P2F_TRIG_3_UNCONNECTED), + .GPIO_I(GPIO_I), + .GPIO_O(GPIO_O), + .GPIO_T(GPIO_T), + .I2C0_SCL_I(I2C0_SCL_I), + .I2C0_SCL_O(I2C0_SCL_O), + .I2C0_SCL_T(I2C0_SCL_T), + .I2C0_SDA_I(I2C0_SDA_I), + .I2C0_SDA_O(I2C0_SDA_O), + .I2C0_SDA_T(I2C0_SDA_T), + .I2C1_SCL_I(1'b0), + .I2C1_SCL_O(NLW_inst_I2C1_SCL_O_UNCONNECTED), + .I2C1_SCL_T(NLW_inst_I2C1_SCL_T_UNCONNECTED), + .I2C1_SDA_I(1'b0), + .I2C1_SDA_O(NLW_inst_I2C1_SDA_O_UNCONNECTED), + .I2C1_SDA_T(NLW_inst_I2C1_SDA_T_UNCONNECTED), + .IRQ_F2P(IRQ_F2P), + .IRQ_P2F_CAN0(NLW_inst_IRQ_P2F_CAN0_UNCONNECTED), + .IRQ_P2F_CAN1(NLW_inst_IRQ_P2F_CAN1_UNCONNECTED), + .IRQ_P2F_CTI(NLW_inst_IRQ_P2F_CTI_UNCONNECTED), + .IRQ_P2F_DMAC0(NLW_inst_IRQ_P2F_DMAC0_UNCONNECTED), + .IRQ_P2F_DMAC1(NLW_inst_IRQ_P2F_DMAC1_UNCONNECTED), + .IRQ_P2F_DMAC2(NLW_inst_IRQ_P2F_DMAC2_UNCONNECTED), + .IRQ_P2F_DMAC3(NLW_inst_IRQ_P2F_DMAC3_UNCONNECTED), + .IRQ_P2F_DMAC4(NLW_inst_IRQ_P2F_DMAC4_UNCONNECTED), + .IRQ_P2F_DMAC5(NLW_inst_IRQ_P2F_DMAC5_UNCONNECTED), + .IRQ_P2F_DMAC6(NLW_inst_IRQ_P2F_DMAC6_UNCONNECTED), + .IRQ_P2F_DMAC7(NLW_inst_IRQ_P2F_DMAC7_UNCONNECTED), + .IRQ_P2F_DMAC_ABORT(NLW_inst_IRQ_P2F_DMAC_ABORT_UNCONNECTED), + .IRQ_P2F_ENET0(NLW_inst_IRQ_P2F_ENET0_UNCONNECTED), + .IRQ_P2F_ENET1(NLW_inst_IRQ_P2F_ENET1_UNCONNECTED), + .IRQ_P2F_ENET_WAKE0(NLW_inst_IRQ_P2F_ENET_WAKE0_UNCONNECTED), + .IRQ_P2F_ENET_WAKE1(NLW_inst_IRQ_P2F_ENET_WAKE1_UNCONNECTED), + .IRQ_P2F_GPIO(NLW_inst_IRQ_P2F_GPIO_UNCONNECTED), + .IRQ_P2F_I2C0(NLW_inst_IRQ_P2F_I2C0_UNCONNECTED), + .IRQ_P2F_I2C1(NLW_inst_IRQ_P2F_I2C1_UNCONNECTED), + .IRQ_P2F_QSPI(NLW_inst_IRQ_P2F_QSPI_UNCONNECTED), + .IRQ_P2F_SDIO0(NLW_inst_IRQ_P2F_SDIO0_UNCONNECTED), + .IRQ_P2F_SDIO1(NLW_inst_IRQ_P2F_SDIO1_UNCONNECTED), + .IRQ_P2F_SMC(NLW_inst_IRQ_P2F_SMC_UNCONNECTED), + .IRQ_P2F_SPI0(NLW_inst_IRQ_P2F_SPI0_UNCONNECTED), + .IRQ_P2F_SPI1(NLW_inst_IRQ_P2F_SPI1_UNCONNECTED), + .IRQ_P2F_UART0(NLW_inst_IRQ_P2F_UART0_UNCONNECTED), + .IRQ_P2F_UART1(NLW_inst_IRQ_P2F_UART1_UNCONNECTED), + .IRQ_P2F_USB0(NLW_inst_IRQ_P2F_USB0_UNCONNECTED), + .IRQ_P2F_USB1(NLW_inst_IRQ_P2F_USB1_UNCONNECTED), + .MIO(MIO), + .M_AXI_GP0_ACLK(M_AXI_GP0_ACLK), + .M_AXI_GP0_ARADDR(M_AXI_GP0_ARADDR), + .M_AXI_GP0_ARBURST(M_AXI_GP0_ARBURST), + .M_AXI_GP0_ARCACHE(M_AXI_GP0_ARCACHE), + .M_AXI_GP0_ARESETN(NLW_inst_M_AXI_GP0_ARESETN_UNCONNECTED), + .M_AXI_GP0_ARID(M_AXI_GP0_ARID), + .M_AXI_GP0_ARLEN(M_AXI_GP0_ARLEN), + .M_AXI_GP0_ARLOCK(M_AXI_GP0_ARLOCK), + .M_AXI_GP0_ARPROT(M_AXI_GP0_ARPROT), + .M_AXI_GP0_ARQOS(M_AXI_GP0_ARQOS), + .M_AXI_GP0_ARREADY(M_AXI_GP0_ARREADY), + .M_AXI_GP0_ARSIZE(M_AXI_GP0_ARSIZE), + .M_AXI_GP0_ARVALID(M_AXI_GP0_ARVALID), + .M_AXI_GP0_AWADDR(M_AXI_GP0_AWADDR), + .M_AXI_GP0_AWBURST(M_AXI_GP0_AWBURST), + .M_AXI_GP0_AWCACHE(M_AXI_GP0_AWCACHE), + .M_AXI_GP0_AWID(M_AXI_GP0_AWID), + .M_AXI_GP0_AWLEN(M_AXI_GP0_AWLEN), + .M_AXI_GP0_AWLOCK(M_AXI_GP0_AWLOCK), + .M_AXI_GP0_AWPROT(M_AXI_GP0_AWPROT), + .M_AXI_GP0_AWQOS(M_AXI_GP0_AWQOS), + .M_AXI_GP0_AWREADY(M_AXI_GP0_AWREADY), + .M_AXI_GP0_AWSIZE(M_AXI_GP0_AWSIZE), + .M_AXI_GP0_AWVALID(M_AXI_GP0_AWVALID), + .M_AXI_GP0_BID(M_AXI_GP0_BID), + .M_AXI_GP0_BREADY(M_AXI_GP0_BREADY), + .M_AXI_GP0_BRESP(M_AXI_GP0_BRESP), + .M_AXI_GP0_BVALID(M_AXI_GP0_BVALID), + .M_AXI_GP0_RDATA(M_AXI_GP0_RDATA), + .M_AXI_GP0_RID(M_AXI_GP0_RID), + .M_AXI_GP0_RLAST(M_AXI_GP0_RLAST), + .M_AXI_GP0_RREADY(M_AXI_GP0_RREADY), + .M_AXI_GP0_RRESP(M_AXI_GP0_RRESP), + .M_AXI_GP0_RVALID(M_AXI_GP0_RVALID), + .M_AXI_GP0_WDATA(M_AXI_GP0_WDATA), + .M_AXI_GP0_WID(M_AXI_GP0_WID), + .M_AXI_GP0_WLAST(M_AXI_GP0_WLAST), + .M_AXI_GP0_WREADY(M_AXI_GP0_WREADY), + .M_AXI_GP0_WSTRB(M_AXI_GP0_WSTRB), + .M_AXI_GP0_WVALID(M_AXI_GP0_WVALID), + .M_AXI_GP1_ACLK(1'b0), + .M_AXI_GP1_ARADDR(NLW_inst_M_AXI_GP1_ARADDR_UNCONNECTED[31:0]), + .M_AXI_GP1_ARBURST(NLW_inst_M_AXI_GP1_ARBURST_UNCONNECTED[1:0]), + .M_AXI_GP1_ARCACHE(NLW_inst_M_AXI_GP1_ARCACHE_UNCONNECTED[3:0]), + .M_AXI_GP1_ARESETN(NLW_inst_M_AXI_GP1_ARESETN_UNCONNECTED), + .M_AXI_GP1_ARID(NLW_inst_M_AXI_GP1_ARID_UNCONNECTED[11:0]), + .M_AXI_GP1_ARLEN(NLW_inst_M_AXI_GP1_ARLEN_UNCONNECTED[3:0]), + .M_AXI_GP1_ARLOCK(NLW_inst_M_AXI_GP1_ARLOCK_UNCONNECTED[1:0]), + .M_AXI_GP1_ARPROT(NLW_inst_M_AXI_GP1_ARPROT_UNCONNECTED[2:0]), + .M_AXI_GP1_ARQOS(NLW_inst_M_AXI_GP1_ARQOS_UNCONNECTED[3:0]), + .M_AXI_GP1_ARREADY(1'b0), + .M_AXI_GP1_ARSIZE(NLW_inst_M_AXI_GP1_ARSIZE_UNCONNECTED[2:0]), + .M_AXI_GP1_ARVALID(NLW_inst_M_AXI_GP1_ARVALID_UNCONNECTED), + .M_AXI_GP1_AWADDR(NLW_inst_M_AXI_GP1_AWADDR_UNCONNECTED[31:0]), + .M_AXI_GP1_AWBURST(NLW_inst_M_AXI_GP1_AWBURST_UNCONNECTED[1:0]), + .M_AXI_GP1_AWCACHE(NLW_inst_M_AXI_GP1_AWCACHE_UNCONNECTED[3:0]), + .M_AXI_GP1_AWID(NLW_inst_M_AXI_GP1_AWID_UNCONNECTED[11:0]), + .M_AXI_GP1_AWLEN(NLW_inst_M_AXI_GP1_AWLEN_UNCONNECTED[3:0]), + .M_AXI_GP1_AWLOCK(NLW_inst_M_AXI_GP1_AWLOCK_UNCONNECTED[1:0]), + .M_AXI_GP1_AWPROT(NLW_inst_M_AXI_GP1_AWPROT_UNCONNECTED[2:0]), + .M_AXI_GP1_AWQOS(NLW_inst_M_AXI_GP1_AWQOS_UNCONNECTED[3:0]), + .M_AXI_GP1_AWREADY(1'b0), + .M_AXI_GP1_AWSIZE(NLW_inst_M_AXI_GP1_AWSIZE_UNCONNECTED[2:0]), + .M_AXI_GP1_AWVALID(NLW_inst_M_AXI_GP1_AWVALID_UNCONNECTED), + .M_AXI_GP1_BID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP1_BREADY(NLW_inst_M_AXI_GP1_BREADY_UNCONNECTED), + .M_AXI_GP1_BRESP({1'b0,1'b0}), + .M_AXI_GP1_BVALID(1'b0), + .M_AXI_GP1_RDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP1_RID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP1_RLAST(1'b0), + .M_AXI_GP1_RREADY(NLW_inst_M_AXI_GP1_RREADY_UNCONNECTED), + .M_AXI_GP1_RRESP({1'b0,1'b0}), + .M_AXI_GP1_RVALID(1'b0), + .M_AXI_GP1_WDATA(NLW_inst_M_AXI_GP1_WDATA_UNCONNECTED[31:0]), + .M_AXI_GP1_WID(NLW_inst_M_AXI_GP1_WID_UNCONNECTED[11:0]), + .M_AXI_GP1_WLAST(NLW_inst_M_AXI_GP1_WLAST_UNCONNECTED), + .M_AXI_GP1_WREADY(1'b0), + .M_AXI_GP1_WSTRB(NLW_inst_M_AXI_GP1_WSTRB_UNCONNECTED[3:0]), + .M_AXI_GP1_WVALID(NLW_inst_M_AXI_GP1_WVALID_UNCONNECTED), + .PJTAG_TCK(1'b0), + .PJTAG_TDI(1'b0), + .PJTAG_TDO(NLW_inst_PJTAG_TDO_UNCONNECTED), + .PJTAG_TMS(1'b0), + .PS_CLK(PS_CLK), + .PS_PORB(PS_PORB), + .PS_SRSTB(PS_SRSTB), + .SDIO0_BUSPOW(SDIO0_BUSPOW), + .SDIO0_BUSVOLT(SDIO0_BUSVOLT), + .SDIO0_CDN(SDIO0_CDN), + .SDIO0_CLK(SDIO0_CLK), + .SDIO0_CLK_FB(SDIO0_CLK_FB), + .SDIO0_CMD_I(SDIO0_CMD_I), + .SDIO0_CMD_O(SDIO0_CMD_O), + .SDIO0_CMD_T(SDIO0_CMD_T), + .SDIO0_DATA_I(SDIO0_DATA_I), + .SDIO0_DATA_O(SDIO0_DATA_O), + .SDIO0_DATA_T(SDIO0_DATA_T), + .SDIO0_LED(SDIO0_LED), + .SDIO0_WP(SDIO0_WP), + .SDIO1_BUSPOW(NLW_inst_SDIO1_BUSPOW_UNCONNECTED), + .SDIO1_BUSVOLT(NLW_inst_SDIO1_BUSVOLT_UNCONNECTED[2:0]), + .SDIO1_CDN(1'b0), + .SDIO1_CLK(NLW_inst_SDIO1_CLK_UNCONNECTED), + .SDIO1_CLK_FB(1'b0), + .SDIO1_CMD_I(1'b0), + .SDIO1_CMD_O(NLW_inst_SDIO1_CMD_O_UNCONNECTED), + .SDIO1_CMD_T(NLW_inst_SDIO1_CMD_T_UNCONNECTED), + .SDIO1_DATA_I({1'b0,1'b0,1'b0,1'b0}), + .SDIO1_DATA_O(NLW_inst_SDIO1_DATA_O_UNCONNECTED[3:0]), + .SDIO1_DATA_T(NLW_inst_SDIO1_DATA_T_UNCONNECTED[3:0]), + .SDIO1_LED(NLW_inst_SDIO1_LED_UNCONNECTED), + .SDIO1_WP(1'b0), + .SPI0_MISO_I(SPI0_MISO_I), + .SPI0_MISO_O(SPI0_MISO_O), + .SPI0_MISO_T(SPI0_MISO_T), + .SPI0_MOSI_I(SPI0_MOSI_I), + .SPI0_MOSI_O(SPI0_MOSI_O), + .SPI0_MOSI_T(SPI0_MOSI_T), + .SPI0_SCLK_I(SPI0_SCLK_I), + .SPI0_SCLK_O(SPI0_SCLK_O), + .SPI0_SCLK_T(SPI0_SCLK_T), + .SPI0_SS1_O(SPI0_SS1_O), + .SPI0_SS2_O(SPI0_SS2_O), + .SPI0_SS_I(SPI0_SS_I), + .SPI0_SS_O(SPI0_SS_O), + .SPI0_SS_T(SPI0_SS_T), + .SPI1_MISO_I(SPI1_MISO_I), + .SPI1_MISO_O(SPI1_MISO_O), + .SPI1_MISO_T(SPI1_MISO_T), + .SPI1_MOSI_I(SPI1_MOSI_I), + .SPI1_MOSI_O(SPI1_MOSI_O), + .SPI1_MOSI_T(SPI1_MOSI_T), + .SPI1_SCLK_I(SPI1_SCLK_I), + .SPI1_SCLK_O(SPI1_SCLK_O), + .SPI1_SCLK_T(SPI1_SCLK_T), + .SPI1_SS1_O(SPI1_SS1_O), + .SPI1_SS2_O(SPI1_SS2_O), + .SPI1_SS_I(SPI1_SS_I), + .SPI1_SS_O(SPI1_SS_O), + .SPI1_SS_T(SPI1_SS_T), + .SRAM_INTIN(1'b0), + .S_AXI_ACP_ACLK(1'b0), + .S_AXI_ACP_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARBURST({1'b0,1'b0}), + .S_AXI_ACP_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARESETN(NLW_inst_S_AXI_ACP_ARESETN_UNCONNECTED), + .S_AXI_ACP_ARID({1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARLOCK({1'b0,1'b0}), + .S_AXI_ACP_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARREADY(NLW_inst_S_AXI_ACP_ARREADY_UNCONNECTED), + .S_AXI_ACP_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARUSER({1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_ARVALID(1'b0), + .S_AXI_ACP_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWBURST({1'b0,1'b0}), + .S_AXI_ACP_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWID({1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWLOCK({1'b0,1'b0}), + .S_AXI_ACP_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWREADY(NLW_inst_S_AXI_ACP_AWREADY_UNCONNECTED), + .S_AXI_ACP_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWUSER({1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_AWVALID(1'b0), + .S_AXI_ACP_BID(NLW_inst_S_AXI_ACP_BID_UNCONNECTED[2:0]), + .S_AXI_ACP_BREADY(1'b0), + .S_AXI_ACP_BRESP(NLW_inst_S_AXI_ACP_BRESP_UNCONNECTED[1:0]), + .S_AXI_ACP_BVALID(NLW_inst_S_AXI_ACP_BVALID_UNCONNECTED), + .S_AXI_ACP_RDATA(NLW_inst_S_AXI_ACP_RDATA_UNCONNECTED[63:0]), + .S_AXI_ACP_RID(NLW_inst_S_AXI_ACP_RID_UNCONNECTED[2:0]), + .S_AXI_ACP_RLAST(NLW_inst_S_AXI_ACP_RLAST_UNCONNECTED), + .S_AXI_ACP_RREADY(1'b0), + .S_AXI_ACP_RRESP(NLW_inst_S_AXI_ACP_RRESP_UNCONNECTED[1:0]), + .S_AXI_ACP_RVALID(NLW_inst_S_AXI_ACP_RVALID_UNCONNECTED), + .S_AXI_ACP_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_WID({1'b0,1'b0,1'b0}), + .S_AXI_ACP_WLAST(1'b0), + .S_AXI_ACP_WREADY(NLW_inst_S_AXI_ACP_WREADY_UNCONNECTED), + .S_AXI_ACP_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_ACP_WVALID(1'b0), + .S_AXI_GP0_ACLK(1'b0), + .S_AXI_GP0_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARBURST({1'b0,1'b0}), + .S_AXI_GP0_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARESETN(NLW_inst_S_AXI_GP0_ARESETN_UNCONNECTED), + .S_AXI_GP0_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARLOCK({1'b0,1'b0}), + .S_AXI_GP0_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARREADY(NLW_inst_S_AXI_GP0_ARREADY_UNCONNECTED), + .S_AXI_GP0_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_GP0_ARVALID(1'b0), + .S_AXI_GP0_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWBURST({1'b0,1'b0}), + .S_AXI_GP0_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWLOCK({1'b0,1'b0}), + .S_AXI_GP0_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWREADY(NLW_inst_S_AXI_GP0_AWREADY_UNCONNECTED), + .S_AXI_GP0_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_GP0_AWVALID(1'b0), + .S_AXI_GP0_BID(NLW_inst_S_AXI_GP0_BID_UNCONNECTED[5:0]), + .S_AXI_GP0_BREADY(1'b0), + .S_AXI_GP0_BRESP(NLW_inst_S_AXI_GP0_BRESP_UNCONNECTED[1:0]), + .S_AXI_GP0_BVALID(NLW_inst_S_AXI_GP0_BVALID_UNCONNECTED), + .S_AXI_GP0_RDATA(NLW_inst_S_AXI_GP0_RDATA_UNCONNECTED[31:0]), + .S_AXI_GP0_RID(NLW_inst_S_AXI_GP0_RID_UNCONNECTED[5:0]), + .S_AXI_GP0_RLAST(NLW_inst_S_AXI_GP0_RLAST_UNCONNECTED), + .S_AXI_GP0_RREADY(1'b0), + .S_AXI_GP0_RRESP(NLW_inst_S_AXI_GP0_RRESP_UNCONNECTED[1:0]), + .S_AXI_GP0_RVALID(NLW_inst_S_AXI_GP0_RVALID_UNCONNECTED), + .S_AXI_GP0_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_WLAST(1'b0), + .S_AXI_GP0_WREADY(NLW_inst_S_AXI_GP0_WREADY_UNCONNECTED), + .S_AXI_GP0_WSTRB({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP0_WVALID(1'b0), + .S_AXI_GP1_ACLK(1'b0), + .S_AXI_GP1_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARBURST({1'b0,1'b0}), + .S_AXI_GP1_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARESETN(NLW_inst_S_AXI_GP1_ARESETN_UNCONNECTED), + .S_AXI_GP1_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARLOCK({1'b0,1'b0}), + .S_AXI_GP1_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARREADY(NLW_inst_S_AXI_GP1_ARREADY_UNCONNECTED), + .S_AXI_GP1_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_GP1_ARVALID(1'b0), + .S_AXI_GP1_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWBURST({1'b0,1'b0}), + .S_AXI_GP1_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWLOCK({1'b0,1'b0}), + .S_AXI_GP1_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWREADY(NLW_inst_S_AXI_GP1_AWREADY_UNCONNECTED), + .S_AXI_GP1_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_GP1_AWVALID(1'b0), + .S_AXI_GP1_BID(NLW_inst_S_AXI_GP1_BID_UNCONNECTED[5:0]), + .S_AXI_GP1_BREADY(1'b0), + .S_AXI_GP1_BRESP(NLW_inst_S_AXI_GP1_BRESP_UNCONNECTED[1:0]), + .S_AXI_GP1_BVALID(NLW_inst_S_AXI_GP1_BVALID_UNCONNECTED), + .S_AXI_GP1_RDATA(NLW_inst_S_AXI_GP1_RDATA_UNCONNECTED[31:0]), + .S_AXI_GP1_RID(NLW_inst_S_AXI_GP1_RID_UNCONNECTED[5:0]), + .S_AXI_GP1_RLAST(NLW_inst_S_AXI_GP1_RLAST_UNCONNECTED), + .S_AXI_GP1_RREADY(1'b0), + .S_AXI_GP1_RRESP(NLW_inst_S_AXI_GP1_RRESP_UNCONNECTED[1:0]), + .S_AXI_GP1_RVALID(NLW_inst_S_AXI_GP1_RVALID_UNCONNECTED), + .S_AXI_GP1_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_WLAST(1'b0), + .S_AXI_GP1_WREADY(NLW_inst_S_AXI_GP1_WREADY_UNCONNECTED), + .S_AXI_GP1_WSTRB({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_GP1_WVALID(1'b0), + .S_AXI_HP0_ACLK(1'b0), + .S_AXI_HP0_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARBURST({1'b0,1'b0}), + .S_AXI_HP0_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARESETN(NLW_inst_S_AXI_HP0_ARESETN_UNCONNECTED), + .S_AXI_HP0_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARLOCK({1'b0,1'b0}), + .S_AXI_HP0_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARREADY(NLW_inst_S_AXI_HP0_ARREADY_UNCONNECTED), + .S_AXI_HP0_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP0_ARVALID(1'b0), + .S_AXI_HP0_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWBURST({1'b0,1'b0}), + .S_AXI_HP0_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWLOCK({1'b0,1'b0}), + .S_AXI_HP0_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWREADY(NLW_inst_S_AXI_HP0_AWREADY_UNCONNECTED), + .S_AXI_HP0_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP0_AWVALID(1'b0), + .S_AXI_HP0_BID(NLW_inst_S_AXI_HP0_BID_UNCONNECTED[5:0]), + .S_AXI_HP0_BREADY(1'b0), + .S_AXI_HP0_BRESP(NLW_inst_S_AXI_HP0_BRESP_UNCONNECTED[1:0]), + .S_AXI_HP0_BVALID(NLW_inst_S_AXI_HP0_BVALID_UNCONNECTED), + .S_AXI_HP0_RACOUNT(NLW_inst_S_AXI_HP0_RACOUNT_UNCONNECTED[2:0]), + .S_AXI_HP0_RCOUNT(NLW_inst_S_AXI_HP0_RCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP0_RDATA(NLW_inst_S_AXI_HP0_RDATA_UNCONNECTED[63:0]), + .S_AXI_HP0_RDISSUECAP1_EN(1'b0), + .S_AXI_HP0_RID(NLW_inst_S_AXI_HP0_RID_UNCONNECTED[5:0]), + .S_AXI_HP0_RLAST(NLW_inst_S_AXI_HP0_RLAST_UNCONNECTED), + .S_AXI_HP0_RREADY(1'b0), + .S_AXI_HP0_RRESP(NLW_inst_S_AXI_HP0_RRESP_UNCONNECTED[1:0]), + .S_AXI_HP0_RVALID(NLW_inst_S_AXI_HP0_RVALID_UNCONNECTED), + .S_AXI_HP0_WACOUNT(NLW_inst_S_AXI_HP0_WACOUNT_UNCONNECTED[5:0]), + .S_AXI_HP0_WCOUNT(NLW_inst_S_AXI_HP0_WCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP0_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_WLAST(1'b0), + .S_AXI_HP0_WREADY(NLW_inst_S_AXI_HP0_WREADY_UNCONNECTED), + .S_AXI_HP0_WRISSUECAP1_EN(1'b0), + .S_AXI_HP0_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP0_WVALID(1'b0), + .S_AXI_HP1_ACLK(1'b0), + .S_AXI_HP1_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARBURST({1'b0,1'b0}), + .S_AXI_HP1_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARESETN(NLW_inst_S_AXI_HP1_ARESETN_UNCONNECTED), + .S_AXI_HP1_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARLOCK({1'b0,1'b0}), + .S_AXI_HP1_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARREADY(NLW_inst_S_AXI_HP1_ARREADY_UNCONNECTED), + .S_AXI_HP1_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP1_ARVALID(1'b0), + .S_AXI_HP1_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWBURST({1'b0,1'b0}), + .S_AXI_HP1_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWLOCK({1'b0,1'b0}), + .S_AXI_HP1_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWREADY(NLW_inst_S_AXI_HP1_AWREADY_UNCONNECTED), + .S_AXI_HP1_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP1_AWVALID(1'b0), + .S_AXI_HP1_BID(NLW_inst_S_AXI_HP1_BID_UNCONNECTED[5:0]), + .S_AXI_HP1_BREADY(1'b0), + .S_AXI_HP1_BRESP(NLW_inst_S_AXI_HP1_BRESP_UNCONNECTED[1:0]), + .S_AXI_HP1_BVALID(NLW_inst_S_AXI_HP1_BVALID_UNCONNECTED), + .S_AXI_HP1_RACOUNT(NLW_inst_S_AXI_HP1_RACOUNT_UNCONNECTED[2:0]), + .S_AXI_HP1_RCOUNT(NLW_inst_S_AXI_HP1_RCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP1_RDATA(NLW_inst_S_AXI_HP1_RDATA_UNCONNECTED[63:0]), + .S_AXI_HP1_RDISSUECAP1_EN(1'b0), + .S_AXI_HP1_RID(NLW_inst_S_AXI_HP1_RID_UNCONNECTED[5:0]), + .S_AXI_HP1_RLAST(NLW_inst_S_AXI_HP1_RLAST_UNCONNECTED), + .S_AXI_HP1_RREADY(1'b0), + .S_AXI_HP1_RRESP(NLW_inst_S_AXI_HP1_RRESP_UNCONNECTED[1:0]), + .S_AXI_HP1_RVALID(NLW_inst_S_AXI_HP1_RVALID_UNCONNECTED), + .S_AXI_HP1_WACOUNT(NLW_inst_S_AXI_HP1_WACOUNT_UNCONNECTED[5:0]), + .S_AXI_HP1_WCOUNT(NLW_inst_S_AXI_HP1_WCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP1_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_WLAST(1'b0), + .S_AXI_HP1_WREADY(NLW_inst_S_AXI_HP1_WREADY_UNCONNECTED), + .S_AXI_HP1_WRISSUECAP1_EN(1'b0), + .S_AXI_HP1_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP1_WVALID(1'b0), + .S_AXI_HP2_ACLK(1'b0), + .S_AXI_HP2_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARBURST({1'b0,1'b0}), + .S_AXI_HP2_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARESETN(NLW_inst_S_AXI_HP2_ARESETN_UNCONNECTED), + .S_AXI_HP2_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARLOCK({1'b0,1'b0}), + .S_AXI_HP2_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARREADY(NLW_inst_S_AXI_HP2_ARREADY_UNCONNECTED), + .S_AXI_HP2_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP2_ARVALID(1'b0), + .S_AXI_HP2_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWBURST({1'b0,1'b0}), + .S_AXI_HP2_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWLOCK({1'b0,1'b0}), + .S_AXI_HP2_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWREADY(NLW_inst_S_AXI_HP2_AWREADY_UNCONNECTED), + .S_AXI_HP2_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP2_AWVALID(1'b0), + .S_AXI_HP2_BID(NLW_inst_S_AXI_HP2_BID_UNCONNECTED[5:0]), + .S_AXI_HP2_BREADY(1'b0), + .S_AXI_HP2_BRESP(NLW_inst_S_AXI_HP2_BRESP_UNCONNECTED[1:0]), + .S_AXI_HP2_BVALID(NLW_inst_S_AXI_HP2_BVALID_UNCONNECTED), + .S_AXI_HP2_RACOUNT(NLW_inst_S_AXI_HP2_RACOUNT_UNCONNECTED[2:0]), + .S_AXI_HP2_RCOUNT(NLW_inst_S_AXI_HP2_RCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP2_RDATA(NLW_inst_S_AXI_HP2_RDATA_UNCONNECTED[63:0]), + .S_AXI_HP2_RDISSUECAP1_EN(1'b0), + .S_AXI_HP2_RID(NLW_inst_S_AXI_HP2_RID_UNCONNECTED[5:0]), + .S_AXI_HP2_RLAST(NLW_inst_S_AXI_HP2_RLAST_UNCONNECTED), + .S_AXI_HP2_RREADY(1'b0), + .S_AXI_HP2_RRESP(NLW_inst_S_AXI_HP2_RRESP_UNCONNECTED[1:0]), + .S_AXI_HP2_RVALID(NLW_inst_S_AXI_HP2_RVALID_UNCONNECTED), + .S_AXI_HP2_WACOUNT(NLW_inst_S_AXI_HP2_WACOUNT_UNCONNECTED[5:0]), + .S_AXI_HP2_WCOUNT(NLW_inst_S_AXI_HP2_WCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP2_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_WLAST(1'b0), + .S_AXI_HP2_WREADY(NLW_inst_S_AXI_HP2_WREADY_UNCONNECTED), + .S_AXI_HP2_WRISSUECAP1_EN(1'b0), + .S_AXI_HP2_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP2_WVALID(1'b0), + .S_AXI_HP3_ACLK(1'b0), + .S_AXI_HP3_ARADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARBURST({1'b0,1'b0}), + .S_AXI_HP3_ARCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARESETN(NLW_inst_S_AXI_HP3_ARESETN_UNCONNECTED), + .S_AXI_HP3_ARID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARLOCK({1'b0,1'b0}), + .S_AXI_HP3_ARPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARREADY(NLW_inst_S_AXI_HP3_ARREADY_UNCONNECTED), + .S_AXI_HP3_ARSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP3_ARVALID(1'b0), + .S_AXI_HP3_AWADDR({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWBURST({1'b0,1'b0}), + .S_AXI_HP3_AWCACHE({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWLEN({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWLOCK({1'b0,1'b0}), + .S_AXI_HP3_AWPROT({1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWQOS({1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWREADY(NLW_inst_S_AXI_HP3_AWREADY_UNCONNECTED), + .S_AXI_HP3_AWSIZE({1'b0,1'b0,1'b0}), + .S_AXI_HP3_AWVALID(1'b0), + .S_AXI_HP3_BID(NLW_inst_S_AXI_HP3_BID_UNCONNECTED[5:0]), + .S_AXI_HP3_BREADY(1'b0), + .S_AXI_HP3_BRESP(NLW_inst_S_AXI_HP3_BRESP_UNCONNECTED[1:0]), + .S_AXI_HP3_BVALID(NLW_inst_S_AXI_HP3_BVALID_UNCONNECTED), + .S_AXI_HP3_RACOUNT(NLW_inst_S_AXI_HP3_RACOUNT_UNCONNECTED[2:0]), + .S_AXI_HP3_RCOUNT(NLW_inst_S_AXI_HP3_RCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP3_RDATA(NLW_inst_S_AXI_HP3_RDATA_UNCONNECTED[63:0]), + .S_AXI_HP3_RDISSUECAP1_EN(1'b0), + .S_AXI_HP3_RID(NLW_inst_S_AXI_HP3_RID_UNCONNECTED[5:0]), + .S_AXI_HP3_RLAST(NLW_inst_S_AXI_HP3_RLAST_UNCONNECTED), + .S_AXI_HP3_RREADY(1'b0), + .S_AXI_HP3_RRESP(NLW_inst_S_AXI_HP3_RRESP_UNCONNECTED[1:0]), + .S_AXI_HP3_RVALID(NLW_inst_S_AXI_HP3_RVALID_UNCONNECTED), + .S_AXI_HP3_WACOUNT(NLW_inst_S_AXI_HP3_WACOUNT_UNCONNECTED[5:0]), + .S_AXI_HP3_WCOUNT(NLW_inst_S_AXI_HP3_WCOUNT_UNCONNECTED[7:0]), + .S_AXI_HP3_WDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_WID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_WLAST(1'b0), + .S_AXI_HP3_WREADY(NLW_inst_S_AXI_HP3_WREADY_UNCONNECTED), + .S_AXI_HP3_WRISSUECAP1_EN(1'b0), + .S_AXI_HP3_WSTRB({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .S_AXI_HP3_WVALID(1'b0), + .TRACE_CLK(1'b0), + .TRACE_CLK_OUT(NLW_inst_TRACE_CLK_OUT_UNCONNECTED), + .TRACE_CTL(NLW_inst_TRACE_CTL_UNCONNECTED), + .TRACE_DATA(NLW_inst_TRACE_DATA_UNCONNECTED[1:0]), + .TTC0_CLK0_IN(1'b0), + .TTC0_CLK1_IN(1'b0), + .TTC0_CLK2_IN(1'b0), + .TTC0_WAVE0_OUT(TTC0_WAVE0_OUT), + .TTC0_WAVE1_OUT(TTC0_WAVE1_OUT), + .TTC0_WAVE2_OUT(TTC0_WAVE2_OUT), + .TTC1_CLK0_IN(1'b0), + .TTC1_CLK1_IN(1'b0), + .TTC1_CLK2_IN(1'b0), + .TTC1_WAVE0_OUT(TTC1_WAVE0_OUT), + .TTC1_WAVE1_OUT(TTC1_WAVE1_OUT), + .TTC1_WAVE2_OUT(TTC1_WAVE2_OUT), + .UART0_CTSN(1'b0), + .UART0_DCDN(1'b0), + .UART0_DSRN(1'b0), + .UART0_DTRN(NLW_inst_UART0_DTRN_UNCONNECTED), + .UART0_RIN(1'b0), + .UART0_RTSN(NLW_inst_UART0_RTSN_UNCONNECTED), + .UART0_RX(UART0_RX), + .UART0_TX(UART0_TX), + .UART1_CTSN(1'b0), + .UART1_DCDN(1'b0), + .UART1_DSRN(1'b0), + .UART1_DTRN(NLW_inst_UART1_DTRN_UNCONNECTED), + .UART1_RIN(1'b0), + .UART1_RTSN(NLW_inst_UART1_RTSN_UNCONNECTED), + .UART1_RX(1'b1), + .UART1_TX(NLW_inst_UART1_TX_UNCONNECTED), + .USB0_PORT_INDCTL(USB0_PORT_INDCTL), + .USB0_VBUS_PWRFAULT(USB0_VBUS_PWRFAULT), + .USB0_VBUS_PWRSELECT(USB0_VBUS_PWRSELECT), + .USB1_PORT_INDCTL(NLW_inst_USB1_PORT_INDCTL_UNCONNECTED[1:0]), + .USB1_VBUS_PWRFAULT(1'b0), + .USB1_VBUS_PWRSELECT(NLW_inst_USB1_VBUS_PWRSELECT_UNCONNECTED), + .WDT_CLK_IN(1'b0), + .WDT_RST_OUT(NLW_inst_WDT_RST_OUT_UNCONNECTED)); +endmodule + +(* C_DM_WIDTH = "2" *) (* C_DQS_WIDTH = "2" *) (* C_DQ_WIDTH = "16" *) +(* C_EMIO_GPIO_WIDTH = "64" *) (* C_EN_EMIO_ENET0 = "0" *) (* C_EN_EMIO_ENET1 = "0" *) +(* C_EN_EMIO_PJTAG = "0" *) (* C_EN_EMIO_TRACE = "0" *) (* C_FCLK_CLK0_BUF = "TRUE" *) +(* C_FCLK_CLK1_BUF = "TRUE" *) (* C_FCLK_CLK2_BUF = "FALSE" *) (* C_FCLK_CLK3_BUF = "FALSE" *) +(* C_GP0_EN_MODIFIABLE_TXN = "1" *) (* C_GP1_EN_MODIFIABLE_TXN = "1" *) (* C_INCLUDE_ACP_TRANS_CHECK = "0" *) +(* C_INCLUDE_TRACE_BUFFER = "0" *) (* C_IRQ_F2P_MODE = "DIRECT" *) (* C_MIO_PRIMITIVE = "32" *) +(* C_M_AXI_GP0_ENABLE_STATIC_REMAP = "0" *) (* C_M_AXI_GP0_ID_WIDTH = "12" *) (* C_M_AXI_GP0_THREAD_ID_WIDTH = "12" *) +(* C_M_AXI_GP1_ENABLE_STATIC_REMAP = "0" *) (* C_M_AXI_GP1_ID_WIDTH = "12" *) (* C_M_AXI_GP1_THREAD_ID_WIDTH = "12" *) +(* C_NUM_F2P_INTR_INPUTS = "1" *) (* C_PACKAGE_NAME = "clg225" *) (* C_PS7_SI_REV = "PRODUCTION" *) +(* C_S_AXI_ACP_ARUSER_VAL = "31" *) (* C_S_AXI_ACP_AWUSER_VAL = "31" *) (* C_S_AXI_ACP_ID_WIDTH = "3" *) +(* C_S_AXI_GP0_ID_WIDTH = "6" *) (* C_S_AXI_GP1_ID_WIDTH = "6" *) (* C_S_AXI_HP0_DATA_WIDTH = "64" *) +(* C_S_AXI_HP0_ID_WIDTH = "6" *) (* C_S_AXI_HP1_DATA_WIDTH = "64" *) (* C_S_AXI_HP1_ID_WIDTH = "6" *) +(* C_S_AXI_HP2_DATA_WIDTH = "64" *) (* C_S_AXI_HP2_ID_WIDTH = "6" *) (* C_S_AXI_HP3_DATA_WIDTH = "64" *) +(* C_S_AXI_HP3_ID_WIDTH = "6" *) (* C_TRACE_BUFFER_CLOCK_DELAY = "12" *) (* C_TRACE_BUFFER_FIFO_SIZE = "128" *) +(* C_TRACE_INTERNAL_WIDTH = "2" *) (* C_TRACE_PIPELINE_WIDTH = "8" *) (* C_USE_AXI_NONSECURE = "0" *) +(* C_USE_DEFAULT_ACP_USER_VAL = "0" *) (* C_USE_M_AXI_GP0 = "1" *) (* C_USE_M_AXI_GP1 = "0" *) +(* C_USE_S_AXI_ACP = "0" *) (* C_USE_S_AXI_GP0 = "0" *) (* C_USE_S_AXI_GP1 = "0" *) +(* C_USE_S_AXI_HP0 = "0" *) (* C_USE_S_AXI_HP1 = "0" *) (* C_USE_S_AXI_HP2 = "0" *) +(* C_USE_S_AXI_HP3 = "0" *) (* HW_HANDOFF = "design_1_processing_system7_0_0.hwdef" *) (* ORIG_REF_NAME = "processing_system7_v5_5_processing_system7" *) +(* POWER = "/>" *) (* USE_TRACE_DATA_EDGE_DETECTOR = "0" *) +module design_1_processing_system7_0_0_processing_system7_v5_5_processing_system7 + (CAN0_PHY_TX, + CAN0_PHY_RX, + CAN1_PHY_TX, + CAN1_PHY_RX, + ENET0_GMII_TX_EN, + ENET0_GMII_TX_ER, + ENET0_MDIO_MDC, + ENET0_MDIO_O, + ENET0_MDIO_T, + ENET0_PTP_DELAY_REQ_RX, + ENET0_PTP_DELAY_REQ_TX, + ENET0_PTP_PDELAY_REQ_RX, + ENET0_PTP_PDELAY_REQ_TX, + ENET0_PTP_PDELAY_RESP_RX, + ENET0_PTP_PDELAY_RESP_TX, + ENET0_PTP_SYNC_FRAME_RX, + ENET0_PTP_SYNC_FRAME_TX, + ENET0_SOF_RX, + ENET0_SOF_TX, + ENET0_GMII_TXD, + ENET0_GMII_COL, + ENET0_GMII_CRS, + ENET0_GMII_RX_CLK, + ENET0_GMII_RX_DV, + ENET0_GMII_RX_ER, + ENET0_GMII_TX_CLK, + ENET0_MDIO_I, + ENET0_EXT_INTIN, + ENET0_GMII_RXD, + ENET1_GMII_TX_EN, + ENET1_GMII_TX_ER, + ENET1_MDIO_MDC, + ENET1_MDIO_O, + ENET1_MDIO_T, + ENET1_PTP_DELAY_REQ_RX, + ENET1_PTP_DELAY_REQ_TX, + ENET1_PTP_PDELAY_REQ_RX, + ENET1_PTP_PDELAY_REQ_TX, + ENET1_PTP_PDELAY_RESP_RX, + ENET1_PTP_PDELAY_RESP_TX, + ENET1_PTP_SYNC_FRAME_RX, + ENET1_PTP_SYNC_FRAME_TX, + ENET1_SOF_RX, + ENET1_SOF_TX, + ENET1_GMII_TXD, + ENET1_GMII_COL, + ENET1_GMII_CRS, + ENET1_GMII_RX_CLK, + ENET1_GMII_RX_DV, + ENET1_GMII_RX_ER, + ENET1_GMII_TX_CLK, + ENET1_MDIO_I, + ENET1_EXT_INTIN, + ENET1_GMII_RXD, + GPIO_I, + GPIO_O, + GPIO_T, + I2C0_SDA_I, + I2C0_SDA_O, + I2C0_SDA_T, + I2C0_SCL_I, + I2C0_SCL_O, + I2C0_SCL_T, + I2C1_SDA_I, + I2C1_SDA_O, + I2C1_SDA_T, + I2C1_SCL_I, + I2C1_SCL_O, + I2C1_SCL_T, + PJTAG_TCK, + PJTAG_TMS, + PJTAG_TDI, + PJTAG_TDO, + SDIO0_CLK, + SDIO0_CLK_FB, + SDIO0_CMD_O, + SDIO0_CMD_I, + SDIO0_CMD_T, + SDIO0_DATA_I, + SDIO0_DATA_O, + SDIO0_DATA_T, + SDIO0_LED, + SDIO0_CDN, + SDIO0_WP, + SDIO0_BUSPOW, + SDIO0_BUSVOLT, + SDIO1_CLK, + SDIO1_CLK_FB, + SDIO1_CMD_O, + SDIO1_CMD_I, + SDIO1_CMD_T, + SDIO1_DATA_I, + SDIO1_DATA_O, + SDIO1_DATA_T, + SDIO1_LED, + SDIO1_CDN, + SDIO1_WP, + SDIO1_BUSPOW, + SDIO1_BUSVOLT, + SPI0_SCLK_I, + SPI0_SCLK_O, + SPI0_SCLK_T, + SPI0_MOSI_I, + SPI0_MOSI_O, + SPI0_MOSI_T, + SPI0_MISO_I, + SPI0_MISO_O, + SPI0_MISO_T, + SPI0_SS_I, + SPI0_SS_O, + SPI0_SS1_O, + SPI0_SS2_O, + SPI0_SS_T, + SPI1_SCLK_I, + SPI1_SCLK_O, + SPI1_SCLK_T, + SPI1_MOSI_I, + SPI1_MOSI_O, + SPI1_MOSI_T, + SPI1_MISO_I, + SPI1_MISO_O, + SPI1_MISO_T, + SPI1_SS_I, + SPI1_SS_O, + SPI1_SS1_O, + SPI1_SS2_O, + SPI1_SS_T, + UART0_DTRN, + UART0_RTSN, + UART0_TX, + UART0_CTSN, + UART0_DCDN, + UART0_DSRN, + UART0_RIN, + UART0_RX, + UART1_DTRN, + UART1_RTSN, + UART1_TX, + UART1_CTSN, + UART1_DCDN, + UART1_DSRN, + UART1_RIN, + UART1_RX, + TTC0_WAVE0_OUT, + TTC0_WAVE1_OUT, + TTC0_WAVE2_OUT, + TTC0_CLK0_IN, + TTC0_CLK1_IN, + TTC0_CLK2_IN, + TTC1_WAVE0_OUT, + TTC1_WAVE1_OUT, + TTC1_WAVE2_OUT, + TTC1_CLK0_IN, + TTC1_CLK1_IN, + TTC1_CLK2_IN, + WDT_CLK_IN, + WDT_RST_OUT, + TRACE_CLK, + TRACE_CTL, + TRACE_DATA, + TRACE_CLK_OUT, + USB0_PORT_INDCTL, + USB0_VBUS_PWRSELECT, + USB0_VBUS_PWRFAULT, + USB1_PORT_INDCTL, + USB1_VBUS_PWRSELECT, + USB1_VBUS_PWRFAULT, + SRAM_INTIN, + M_AXI_GP0_ARESETN, + M_AXI_GP0_ARVALID, + M_AXI_GP0_AWVALID, + M_AXI_GP0_BREADY, + M_AXI_GP0_RREADY, + M_AXI_GP0_WLAST, + M_AXI_GP0_WVALID, + M_AXI_GP0_ARID, + M_AXI_GP0_AWID, + M_AXI_GP0_WID, + M_AXI_GP0_ARBURST, + M_AXI_GP0_ARLOCK, + M_AXI_GP0_ARSIZE, + M_AXI_GP0_AWBURST, + M_AXI_GP0_AWLOCK, + M_AXI_GP0_AWSIZE, + M_AXI_GP0_ARPROT, + M_AXI_GP0_AWPROT, + M_AXI_GP0_ARADDR, + M_AXI_GP0_AWADDR, + M_AXI_GP0_WDATA, + M_AXI_GP0_ARCACHE, + M_AXI_GP0_ARLEN, + M_AXI_GP0_ARQOS, + M_AXI_GP0_AWCACHE, + M_AXI_GP0_AWLEN, + M_AXI_GP0_AWQOS, + M_AXI_GP0_WSTRB, + M_AXI_GP0_ACLK, + M_AXI_GP0_ARREADY, + M_AXI_GP0_AWREADY, + M_AXI_GP0_BVALID, + M_AXI_GP0_RLAST, + M_AXI_GP0_RVALID, + M_AXI_GP0_WREADY, + M_AXI_GP0_BID, + M_AXI_GP0_RID, + M_AXI_GP0_BRESP, + M_AXI_GP0_RRESP, + M_AXI_GP0_RDATA, + M_AXI_GP1_ARESETN, + M_AXI_GP1_ARVALID, + M_AXI_GP1_AWVALID, + M_AXI_GP1_BREADY, + M_AXI_GP1_RREADY, + M_AXI_GP1_WLAST, + M_AXI_GP1_WVALID, + M_AXI_GP1_ARID, + M_AXI_GP1_AWID, + M_AXI_GP1_WID, + M_AXI_GP1_ARBURST, + M_AXI_GP1_ARLOCK, + M_AXI_GP1_ARSIZE, + M_AXI_GP1_AWBURST, + M_AXI_GP1_AWLOCK, + M_AXI_GP1_AWSIZE, + M_AXI_GP1_ARPROT, + M_AXI_GP1_AWPROT, + M_AXI_GP1_ARADDR, + M_AXI_GP1_AWADDR, + M_AXI_GP1_WDATA, + M_AXI_GP1_ARCACHE, + M_AXI_GP1_ARLEN, + M_AXI_GP1_ARQOS, + M_AXI_GP1_AWCACHE, + M_AXI_GP1_AWLEN, + M_AXI_GP1_AWQOS, + M_AXI_GP1_WSTRB, + M_AXI_GP1_ACLK, + M_AXI_GP1_ARREADY, + M_AXI_GP1_AWREADY, + M_AXI_GP1_BVALID, + M_AXI_GP1_RLAST, + M_AXI_GP1_RVALID, + M_AXI_GP1_WREADY, + M_AXI_GP1_BID, + M_AXI_GP1_RID, + M_AXI_GP1_BRESP, + M_AXI_GP1_RRESP, + M_AXI_GP1_RDATA, + S_AXI_GP0_ARESETN, + S_AXI_GP0_ARREADY, + S_AXI_GP0_AWREADY, + S_AXI_GP0_BVALID, + S_AXI_GP0_RLAST, + S_AXI_GP0_RVALID, + S_AXI_GP0_WREADY, + S_AXI_GP0_BRESP, + S_AXI_GP0_RRESP, + S_AXI_GP0_RDATA, + S_AXI_GP0_BID, + S_AXI_GP0_RID, + S_AXI_GP0_ACLK, + S_AXI_GP0_ARVALID, + S_AXI_GP0_AWVALID, + S_AXI_GP0_BREADY, + S_AXI_GP0_RREADY, + S_AXI_GP0_WLAST, + S_AXI_GP0_WVALID, + S_AXI_GP0_ARBURST, + S_AXI_GP0_ARLOCK, + S_AXI_GP0_ARSIZE, + S_AXI_GP0_AWBURST, + S_AXI_GP0_AWLOCK, + S_AXI_GP0_AWSIZE, + S_AXI_GP0_ARPROT, + S_AXI_GP0_AWPROT, + S_AXI_GP0_ARADDR, + S_AXI_GP0_AWADDR, + S_AXI_GP0_WDATA, + S_AXI_GP0_ARCACHE, + S_AXI_GP0_ARLEN, + S_AXI_GP0_ARQOS, + S_AXI_GP0_AWCACHE, + S_AXI_GP0_AWLEN, + S_AXI_GP0_AWQOS, + S_AXI_GP0_WSTRB, + S_AXI_GP0_ARID, + S_AXI_GP0_AWID, + S_AXI_GP0_WID, + S_AXI_GP1_ARESETN, + S_AXI_GP1_ARREADY, + S_AXI_GP1_AWREADY, + S_AXI_GP1_BVALID, + S_AXI_GP1_RLAST, + S_AXI_GP1_RVALID, + S_AXI_GP1_WREADY, + S_AXI_GP1_BRESP, + S_AXI_GP1_RRESP, + S_AXI_GP1_RDATA, + S_AXI_GP1_BID, + S_AXI_GP1_RID, + S_AXI_GP1_ACLK, + S_AXI_GP1_ARVALID, + S_AXI_GP1_AWVALID, + S_AXI_GP1_BREADY, + S_AXI_GP1_RREADY, + S_AXI_GP1_WLAST, + S_AXI_GP1_WVALID, + S_AXI_GP1_ARBURST, + S_AXI_GP1_ARLOCK, + S_AXI_GP1_ARSIZE, + S_AXI_GP1_AWBURST, + S_AXI_GP1_AWLOCK, + S_AXI_GP1_AWSIZE, + S_AXI_GP1_ARPROT, + S_AXI_GP1_AWPROT, + S_AXI_GP1_ARADDR, + S_AXI_GP1_AWADDR, + S_AXI_GP1_WDATA, + S_AXI_GP1_ARCACHE, + S_AXI_GP1_ARLEN, + S_AXI_GP1_ARQOS, + S_AXI_GP1_AWCACHE, + S_AXI_GP1_AWLEN, + S_AXI_GP1_AWQOS, + S_AXI_GP1_WSTRB, + S_AXI_GP1_ARID, + S_AXI_GP1_AWID, + S_AXI_GP1_WID, + S_AXI_ACP_ARESETN, + S_AXI_ACP_ARREADY, + S_AXI_ACP_AWREADY, + S_AXI_ACP_BVALID, + S_AXI_ACP_RLAST, + S_AXI_ACP_RVALID, + S_AXI_ACP_WREADY, + S_AXI_ACP_BRESP, + S_AXI_ACP_RRESP, + S_AXI_ACP_BID, + S_AXI_ACP_RID, + S_AXI_ACP_RDATA, + S_AXI_ACP_ACLK, + S_AXI_ACP_ARVALID, + S_AXI_ACP_AWVALID, + S_AXI_ACP_BREADY, + S_AXI_ACP_RREADY, + S_AXI_ACP_WLAST, + S_AXI_ACP_WVALID, + S_AXI_ACP_ARID, + S_AXI_ACP_ARPROT, + S_AXI_ACP_AWID, + S_AXI_ACP_AWPROT, + S_AXI_ACP_WID, + S_AXI_ACP_ARADDR, + S_AXI_ACP_AWADDR, + S_AXI_ACP_ARCACHE, + S_AXI_ACP_ARLEN, + S_AXI_ACP_ARQOS, + S_AXI_ACP_AWCACHE, + S_AXI_ACP_AWLEN, + S_AXI_ACP_AWQOS, + S_AXI_ACP_ARBURST, + S_AXI_ACP_ARLOCK, + S_AXI_ACP_ARSIZE, + S_AXI_ACP_AWBURST, + S_AXI_ACP_AWLOCK, + S_AXI_ACP_AWSIZE, + S_AXI_ACP_ARUSER, + S_AXI_ACP_AWUSER, + S_AXI_ACP_WDATA, + S_AXI_ACP_WSTRB, + S_AXI_HP0_ARESETN, + S_AXI_HP0_ARREADY, + S_AXI_HP0_AWREADY, + S_AXI_HP0_BVALID, + S_AXI_HP0_RLAST, + S_AXI_HP0_RVALID, + S_AXI_HP0_WREADY, + S_AXI_HP0_BRESP, + S_AXI_HP0_RRESP, + S_AXI_HP0_BID, + S_AXI_HP0_RID, + S_AXI_HP0_RDATA, + S_AXI_HP0_RCOUNT, + S_AXI_HP0_WCOUNT, + S_AXI_HP0_RACOUNT, + S_AXI_HP0_WACOUNT, + S_AXI_HP0_ACLK, + S_AXI_HP0_ARVALID, + S_AXI_HP0_AWVALID, + S_AXI_HP0_BREADY, + S_AXI_HP0_RDISSUECAP1_EN, + S_AXI_HP0_RREADY, + S_AXI_HP0_WLAST, + S_AXI_HP0_WRISSUECAP1_EN, + S_AXI_HP0_WVALID, + S_AXI_HP0_ARBURST, + S_AXI_HP0_ARLOCK, + S_AXI_HP0_ARSIZE, + S_AXI_HP0_AWBURST, + S_AXI_HP0_AWLOCK, + S_AXI_HP0_AWSIZE, + S_AXI_HP0_ARPROT, + S_AXI_HP0_AWPROT, + S_AXI_HP0_ARADDR, + S_AXI_HP0_AWADDR, + S_AXI_HP0_ARCACHE, + S_AXI_HP0_ARLEN, + S_AXI_HP0_ARQOS, + S_AXI_HP0_AWCACHE, + S_AXI_HP0_AWLEN, + S_AXI_HP0_AWQOS, + S_AXI_HP0_ARID, + S_AXI_HP0_AWID, + S_AXI_HP0_WID, + S_AXI_HP0_WDATA, + S_AXI_HP0_WSTRB, + S_AXI_HP1_ARESETN, + S_AXI_HP1_ARREADY, + S_AXI_HP1_AWREADY, + S_AXI_HP1_BVALID, + S_AXI_HP1_RLAST, + S_AXI_HP1_RVALID, + S_AXI_HP1_WREADY, + S_AXI_HP1_BRESP, + S_AXI_HP1_RRESP, + S_AXI_HP1_BID, + S_AXI_HP1_RID, + S_AXI_HP1_RDATA, + S_AXI_HP1_RCOUNT, + S_AXI_HP1_WCOUNT, + S_AXI_HP1_RACOUNT, + S_AXI_HP1_WACOUNT, + S_AXI_HP1_ACLK, + S_AXI_HP1_ARVALID, + S_AXI_HP1_AWVALID, + S_AXI_HP1_BREADY, + S_AXI_HP1_RDISSUECAP1_EN, + S_AXI_HP1_RREADY, + S_AXI_HP1_WLAST, + S_AXI_HP1_WRISSUECAP1_EN, + S_AXI_HP1_WVALID, + S_AXI_HP1_ARBURST, + S_AXI_HP1_ARLOCK, + S_AXI_HP1_ARSIZE, + S_AXI_HP1_AWBURST, + S_AXI_HP1_AWLOCK, + S_AXI_HP1_AWSIZE, + S_AXI_HP1_ARPROT, + S_AXI_HP1_AWPROT, + S_AXI_HP1_ARADDR, + S_AXI_HP1_AWADDR, + S_AXI_HP1_ARCACHE, + S_AXI_HP1_ARLEN, + S_AXI_HP1_ARQOS, + S_AXI_HP1_AWCACHE, + S_AXI_HP1_AWLEN, + S_AXI_HP1_AWQOS, + S_AXI_HP1_ARID, + S_AXI_HP1_AWID, + S_AXI_HP1_WID, + S_AXI_HP1_WDATA, + S_AXI_HP1_WSTRB, + S_AXI_HP2_ARESETN, + S_AXI_HP2_ARREADY, + S_AXI_HP2_AWREADY, + S_AXI_HP2_BVALID, + S_AXI_HP2_RLAST, + S_AXI_HP2_RVALID, + S_AXI_HP2_WREADY, + S_AXI_HP2_BRESP, + S_AXI_HP2_RRESP, + S_AXI_HP2_BID, + S_AXI_HP2_RID, + S_AXI_HP2_RDATA, + S_AXI_HP2_RCOUNT, + S_AXI_HP2_WCOUNT, + S_AXI_HP2_RACOUNT, + S_AXI_HP2_WACOUNT, + S_AXI_HP2_ACLK, + S_AXI_HP2_ARVALID, + S_AXI_HP2_AWVALID, + S_AXI_HP2_BREADY, + S_AXI_HP2_RDISSUECAP1_EN, + S_AXI_HP2_RREADY, + S_AXI_HP2_WLAST, + S_AXI_HP2_WRISSUECAP1_EN, + S_AXI_HP2_WVALID, + S_AXI_HP2_ARBURST, + S_AXI_HP2_ARLOCK, + S_AXI_HP2_ARSIZE, + S_AXI_HP2_AWBURST, + S_AXI_HP2_AWLOCK, + S_AXI_HP2_AWSIZE, + S_AXI_HP2_ARPROT, + S_AXI_HP2_AWPROT, + S_AXI_HP2_ARADDR, + S_AXI_HP2_AWADDR, + S_AXI_HP2_ARCACHE, + S_AXI_HP2_ARLEN, + S_AXI_HP2_ARQOS, + S_AXI_HP2_AWCACHE, + S_AXI_HP2_AWLEN, + S_AXI_HP2_AWQOS, + S_AXI_HP2_ARID, + S_AXI_HP2_AWID, + S_AXI_HP2_WID, + S_AXI_HP2_WDATA, + S_AXI_HP2_WSTRB, + S_AXI_HP3_ARESETN, + S_AXI_HP3_ARREADY, + S_AXI_HP3_AWREADY, + S_AXI_HP3_BVALID, + S_AXI_HP3_RLAST, + S_AXI_HP3_RVALID, + S_AXI_HP3_WREADY, + S_AXI_HP3_BRESP, + S_AXI_HP3_RRESP, + S_AXI_HP3_BID, + S_AXI_HP3_RID, + S_AXI_HP3_RDATA, + S_AXI_HP3_RCOUNT, + S_AXI_HP3_WCOUNT, + S_AXI_HP3_RACOUNT, + S_AXI_HP3_WACOUNT, + S_AXI_HP3_ACLK, + S_AXI_HP3_ARVALID, + S_AXI_HP3_AWVALID, + S_AXI_HP3_BREADY, + S_AXI_HP3_RDISSUECAP1_EN, + S_AXI_HP3_RREADY, + S_AXI_HP3_WLAST, + S_AXI_HP3_WRISSUECAP1_EN, + S_AXI_HP3_WVALID, + S_AXI_HP3_ARBURST, + S_AXI_HP3_ARLOCK, + S_AXI_HP3_ARSIZE, + S_AXI_HP3_AWBURST, + S_AXI_HP3_AWLOCK, + S_AXI_HP3_AWSIZE, + S_AXI_HP3_ARPROT, + S_AXI_HP3_AWPROT, + S_AXI_HP3_ARADDR, + S_AXI_HP3_AWADDR, + S_AXI_HP3_ARCACHE, + S_AXI_HP3_ARLEN, + S_AXI_HP3_ARQOS, + S_AXI_HP3_AWCACHE, + S_AXI_HP3_AWLEN, + S_AXI_HP3_AWQOS, + S_AXI_HP3_ARID, + S_AXI_HP3_AWID, + S_AXI_HP3_WID, + S_AXI_HP3_WDATA, + S_AXI_HP3_WSTRB, + IRQ_P2F_DMAC_ABORT, + IRQ_P2F_DMAC0, + IRQ_P2F_DMAC1, + IRQ_P2F_DMAC2, + IRQ_P2F_DMAC3, + IRQ_P2F_DMAC4, + IRQ_P2F_DMAC5, + IRQ_P2F_DMAC6, + IRQ_P2F_DMAC7, + IRQ_P2F_SMC, + IRQ_P2F_QSPI, + IRQ_P2F_CTI, + IRQ_P2F_GPIO, + IRQ_P2F_USB0, + IRQ_P2F_ENET0, + IRQ_P2F_ENET_WAKE0, + IRQ_P2F_SDIO0, + IRQ_P2F_I2C0, + IRQ_P2F_SPI0, + IRQ_P2F_UART0, + IRQ_P2F_CAN0, + IRQ_P2F_USB1, + IRQ_P2F_ENET1, + IRQ_P2F_ENET_WAKE1, + IRQ_P2F_SDIO1, + IRQ_P2F_I2C1, + IRQ_P2F_SPI1, + IRQ_P2F_UART1, + IRQ_P2F_CAN1, + IRQ_F2P, + Core0_nFIQ, + Core0_nIRQ, + Core1_nFIQ, + Core1_nIRQ, + DMA0_DATYPE, + DMA0_DAVALID, + DMA0_DRREADY, + DMA0_RSTN, + DMA1_DATYPE, + DMA1_DAVALID, + DMA1_DRREADY, + DMA1_RSTN, + DMA2_DATYPE, + DMA2_DAVALID, + DMA2_DRREADY, + DMA2_RSTN, + DMA3_DATYPE, + DMA3_DAVALID, + DMA3_DRREADY, + DMA3_RSTN, + DMA0_ACLK, + DMA0_DAREADY, + DMA0_DRLAST, + DMA0_DRVALID, + DMA1_ACLK, + DMA1_DAREADY, + DMA1_DRLAST, + DMA1_DRVALID, + DMA2_ACLK, + DMA2_DAREADY, + DMA2_DRLAST, + DMA2_DRVALID, + DMA3_ACLK, + DMA3_DAREADY, + DMA3_DRLAST, + DMA3_DRVALID, + DMA0_DRTYPE, + DMA1_DRTYPE, + DMA2_DRTYPE, + DMA3_DRTYPE, + FCLK_CLK3, + FCLK_CLK2, + FCLK_CLK1, + FCLK_CLK0, + FCLK_CLKTRIG3_N, + FCLK_CLKTRIG2_N, + FCLK_CLKTRIG1_N, + FCLK_CLKTRIG0_N, + FCLK_RESET3_N, + FCLK_RESET2_N, + FCLK_RESET1_N, + FCLK_RESET0_N, + FTMD_TRACEIN_DATA, + FTMD_TRACEIN_VALID, + FTMD_TRACEIN_CLK, + FTMD_TRACEIN_ATID, + FTMT_F2P_TRIG_0, + FTMT_F2P_TRIGACK_0, + FTMT_F2P_TRIG_1, + FTMT_F2P_TRIGACK_1, + FTMT_F2P_TRIG_2, + FTMT_F2P_TRIGACK_2, + FTMT_F2P_TRIG_3, + FTMT_F2P_TRIGACK_3, + FTMT_F2P_DEBUG, + FTMT_P2F_TRIGACK_0, + FTMT_P2F_TRIG_0, + FTMT_P2F_TRIGACK_1, + FTMT_P2F_TRIG_1, + FTMT_P2F_TRIGACK_2, + FTMT_P2F_TRIG_2, + FTMT_P2F_TRIGACK_3, + FTMT_P2F_TRIG_3, + FTMT_P2F_DEBUG, + FPGA_IDLE_N, + EVENT_EVENTO, + EVENT_STANDBYWFE, + EVENT_STANDBYWFI, + EVENT_EVENTI, + DDR_ARB, + MIO, + DDR_CAS_n, + DDR_CKE, + DDR_Clk_n, + DDR_Clk, + DDR_CS_n, + DDR_DRSTB, + DDR_ODT, + DDR_RAS_n, + DDR_WEB, + DDR_BankAddr, + DDR_Addr, + DDR_VRN, + DDR_VRP, + DDR_DM, + DDR_DQ, + DDR_DQS_n, + DDR_DQS, + PS_SRSTB, + PS_CLK, + PS_PORB); + output CAN0_PHY_TX; + input CAN0_PHY_RX; + output CAN1_PHY_TX; + input CAN1_PHY_RX; + output ENET0_GMII_TX_EN; + output ENET0_GMII_TX_ER; + output ENET0_MDIO_MDC; + output ENET0_MDIO_O; + output ENET0_MDIO_T; + output ENET0_PTP_DELAY_REQ_RX; + output ENET0_PTP_DELAY_REQ_TX; + output ENET0_PTP_PDELAY_REQ_RX; + output ENET0_PTP_PDELAY_REQ_TX; + output ENET0_PTP_PDELAY_RESP_RX; + output ENET0_PTP_PDELAY_RESP_TX; + output ENET0_PTP_SYNC_FRAME_RX; + output ENET0_PTP_SYNC_FRAME_TX; + output ENET0_SOF_RX; + output ENET0_SOF_TX; + output [7:0]ENET0_GMII_TXD; + input ENET0_GMII_COL; + input ENET0_GMII_CRS; + input ENET0_GMII_RX_CLK; + input ENET0_GMII_RX_DV; + input ENET0_GMII_RX_ER; + input ENET0_GMII_TX_CLK; + input ENET0_MDIO_I; + input ENET0_EXT_INTIN; + input [7:0]ENET0_GMII_RXD; + output ENET1_GMII_TX_EN; + output ENET1_GMII_TX_ER; + output ENET1_MDIO_MDC; + output ENET1_MDIO_O; + output ENET1_MDIO_T; + output ENET1_PTP_DELAY_REQ_RX; + output ENET1_PTP_DELAY_REQ_TX; + output ENET1_PTP_PDELAY_REQ_RX; + output ENET1_PTP_PDELAY_REQ_TX; + output ENET1_PTP_PDELAY_RESP_RX; + output ENET1_PTP_PDELAY_RESP_TX; + output ENET1_PTP_SYNC_FRAME_RX; + output ENET1_PTP_SYNC_FRAME_TX; + output ENET1_SOF_RX; + output ENET1_SOF_TX; + output [7:0]ENET1_GMII_TXD; + input ENET1_GMII_COL; + input ENET1_GMII_CRS; + input ENET1_GMII_RX_CLK; + input ENET1_GMII_RX_DV; + input ENET1_GMII_RX_ER; + input ENET1_GMII_TX_CLK; + input ENET1_MDIO_I; + input ENET1_EXT_INTIN; + input [7:0]ENET1_GMII_RXD; + input [63:0]GPIO_I; + output [63:0]GPIO_O; + output [63:0]GPIO_T; + input I2C0_SDA_I; + output I2C0_SDA_O; + output I2C0_SDA_T; + input I2C0_SCL_I; + output I2C0_SCL_O; + output I2C0_SCL_T; + input I2C1_SDA_I; + output I2C1_SDA_O; + output I2C1_SDA_T; + input I2C1_SCL_I; + output I2C1_SCL_O; + output I2C1_SCL_T; + input PJTAG_TCK; + input PJTAG_TMS; + input PJTAG_TDI; + output PJTAG_TDO; + output SDIO0_CLK; + input SDIO0_CLK_FB; + output SDIO0_CMD_O; + input SDIO0_CMD_I; + output SDIO0_CMD_T; + input [3:0]SDIO0_DATA_I; + output [3:0]SDIO0_DATA_O; + output [3:0]SDIO0_DATA_T; + output SDIO0_LED; + input SDIO0_CDN; + input SDIO0_WP; + output SDIO0_BUSPOW; + output [2:0]SDIO0_BUSVOLT; + output SDIO1_CLK; + input SDIO1_CLK_FB; + output SDIO1_CMD_O; + input SDIO1_CMD_I; + output SDIO1_CMD_T; + input [3:0]SDIO1_DATA_I; + output [3:0]SDIO1_DATA_O; + output [3:0]SDIO1_DATA_T; + output SDIO1_LED; + input SDIO1_CDN; + input SDIO1_WP; + output SDIO1_BUSPOW; + output [2:0]SDIO1_BUSVOLT; + input SPI0_SCLK_I; + output SPI0_SCLK_O; + output SPI0_SCLK_T; + input SPI0_MOSI_I; + output SPI0_MOSI_O; + output SPI0_MOSI_T; + input SPI0_MISO_I; + output SPI0_MISO_O; + output SPI0_MISO_T; + input SPI0_SS_I; + output SPI0_SS_O; + output SPI0_SS1_O; + output SPI0_SS2_O; + output SPI0_SS_T; + input SPI1_SCLK_I; + output SPI1_SCLK_O; + output SPI1_SCLK_T; + input SPI1_MOSI_I; + output SPI1_MOSI_O; + output SPI1_MOSI_T; + input SPI1_MISO_I; + output SPI1_MISO_O; + output SPI1_MISO_T; + input SPI1_SS_I; + output SPI1_SS_O; + output SPI1_SS1_O; + output SPI1_SS2_O; + output SPI1_SS_T; + output UART0_DTRN; + output UART0_RTSN; + output UART0_TX; + input UART0_CTSN; + input UART0_DCDN; + input UART0_DSRN; + input UART0_RIN; + input UART0_RX; + output UART1_DTRN; + output UART1_RTSN; + output UART1_TX; + input UART1_CTSN; + input UART1_DCDN; + input UART1_DSRN; + input UART1_RIN; + input UART1_RX; + output TTC0_WAVE0_OUT; + output TTC0_WAVE1_OUT; + output TTC0_WAVE2_OUT; + input TTC0_CLK0_IN; + input TTC0_CLK1_IN; + input TTC0_CLK2_IN; + output TTC1_WAVE0_OUT; + output TTC1_WAVE1_OUT; + output TTC1_WAVE2_OUT; + input TTC1_CLK0_IN; + input TTC1_CLK1_IN; + input TTC1_CLK2_IN; + input WDT_CLK_IN; + output WDT_RST_OUT; + input TRACE_CLK; + output TRACE_CTL; + output [1:0]TRACE_DATA; + output TRACE_CLK_OUT; + output [1:0]USB0_PORT_INDCTL; + output USB0_VBUS_PWRSELECT; + input USB0_VBUS_PWRFAULT; + output [1:0]USB1_PORT_INDCTL; + output USB1_VBUS_PWRSELECT; + input USB1_VBUS_PWRFAULT; + input SRAM_INTIN; + output M_AXI_GP0_ARESETN; + output M_AXI_GP0_ARVALID; + output M_AXI_GP0_AWVALID; + output M_AXI_GP0_BREADY; + output M_AXI_GP0_RREADY; + output M_AXI_GP0_WLAST; + output M_AXI_GP0_WVALID; + output [11:0]M_AXI_GP0_ARID; + output [11:0]M_AXI_GP0_AWID; + output [11:0]M_AXI_GP0_WID; + output [1:0]M_AXI_GP0_ARBURST; + output [1:0]M_AXI_GP0_ARLOCK; + output [2:0]M_AXI_GP0_ARSIZE; + output [1:0]M_AXI_GP0_AWBURST; + output [1:0]M_AXI_GP0_AWLOCK; + output [2:0]M_AXI_GP0_AWSIZE; + output [2:0]M_AXI_GP0_ARPROT; + output [2:0]M_AXI_GP0_AWPROT; + output [31:0]M_AXI_GP0_ARADDR; + output [31:0]M_AXI_GP0_AWADDR; + output [31:0]M_AXI_GP0_WDATA; + output [3:0]M_AXI_GP0_ARCACHE; + output [3:0]M_AXI_GP0_ARLEN; + output [3:0]M_AXI_GP0_ARQOS; + output [3:0]M_AXI_GP0_AWCACHE; + output [3:0]M_AXI_GP0_AWLEN; + output [3:0]M_AXI_GP0_AWQOS; + output [3:0]M_AXI_GP0_WSTRB; + input M_AXI_GP0_ACLK; + input M_AXI_GP0_ARREADY; + input M_AXI_GP0_AWREADY; + input M_AXI_GP0_BVALID; + input M_AXI_GP0_RLAST; + input M_AXI_GP0_RVALID; + input M_AXI_GP0_WREADY; + input [11:0]M_AXI_GP0_BID; + input [11:0]M_AXI_GP0_RID; + input [1:0]M_AXI_GP0_BRESP; + input [1:0]M_AXI_GP0_RRESP; + input [31:0]M_AXI_GP0_RDATA; + output M_AXI_GP1_ARESETN; + output M_AXI_GP1_ARVALID; + output M_AXI_GP1_AWVALID; + output M_AXI_GP1_BREADY; + output M_AXI_GP1_RREADY; + output M_AXI_GP1_WLAST; + output M_AXI_GP1_WVALID; + output [11:0]M_AXI_GP1_ARID; + output [11:0]M_AXI_GP1_AWID; + output [11:0]M_AXI_GP1_WID; + output [1:0]M_AXI_GP1_ARBURST; + output [1:0]M_AXI_GP1_ARLOCK; + output [2:0]M_AXI_GP1_ARSIZE; + output [1:0]M_AXI_GP1_AWBURST; + output [1:0]M_AXI_GP1_AWLOCK; + output [2:0]M_AXI_GP1_AWSIZE; + output [2:0]M_AXI_GP1_ARPROT; + output [2:0]M_AXI_GP1_AWPROT; + output [31:0]M_AXI_GP1_ARADDR; + output [31:0]M_AXI_GP1_AWADDR; + output [31:0]M_AXI_GP1_WDATA; + output [3:0]M_AXI_GP1_ARCACHE; + output [3:0]M_AXI_GP1_ARLEN; + output [3:0]M_AXI_GP1_ARQOS; + output [3:0]M_AXI_GP1_AWCACHE; + output [3:0]M_AXI_GP1_AWLEN; + output [3:0]M_AXI_GP1_AWQOS; + output [3:0]M_AXI_GP1_WSTRB; + input M_AXI_GP1_ACLK; + input M_AXI_GP1_ARREADY; + input M_AXI_GP1_AWREADY; + input M_AXI_GP1_BVALID; + input M_AXI_GP1_RLAST; + input M_AXI_GP1_RVALID; + input M_AXI_GP1_WREADY; + input [11:0]M_AXI_GP1_BID; + input [11:0]M_AXI_GP1_RID; + input [1:0]M_AXI_GP1_BRESP; + input [1:0]M_AXI_GP1_RRESP; + input [31:0]M_AXI_GP1_RDATA; + output S_AXI_GP0_ARESETN; + output S_AXI_GP0_ARREADY; + output S_AXI_GP0_AWREADY; + output S_AXI_GP0_BVALID; + output S_AXI_GP0_RLAST; + output S_AXI_GP0_RVALID; + output S_AXI_GP0_WREADY; + output [1:0]S_AXI_GP0_BRESP; + output [1:0]S_AXI_GP0_RRESP; + output [31:0]S_AXI_GP0_RDATA; + output [5:0]S_AXI_GP0_BID; + output [5:0]S_AXI_GP0_RID; + input S_AXI_GP0_ACLK; + input S_AXI_GP0_ARVALID; + input S_AXI_GP0_AWVALID; + input S_AXI_GP0_BREADY; + input S_AXI_GP0_RREADY; + input S_AXI_GP0_WLAST; + input S_AXI_GP0_WVALID; + input [1:0]S_AXI_GP0_ARBURST; + input [1:0]S_AXI_GP0_ARLOCK; + input [2:0]S_AXI_GP0_ARSIZE; + input [1:0]S_AXI_GP0_AWBURST; + input [1:0]S_AXI_GP0_AWLOCK; + input [2:0]S_AXI_GP0_AWSIZE; + input [2:0]S_AXI_GP0_ARPROT; + input [2:0]S_AXI_GP0_AWPROT; + input [31:0]S_AXI_GP0_ARADDR; + input [31:0]S_AXI_GP0_AWADDR; + input [31:0]S_AXI_GP0_WDATA; + input [3:0]S_AXI_GP0_ARCACHE; + input [3:0]S_AXI_GP0_ARLEN; + input [3:0]S_AXI_GP0_ARQOS; + input [3:0]S_AXI_GP0_AWCACHE; + input [3:0]S_AXI_GP0_AWLEN; + input [3:0]S_AXI_GP0_AWQOS; + input [3:0]S_AXI_GP0_WSTRB; + input [5:0]S_AXI_GP0_ARID; + input [5:0]S_AXI_GP0_AWID; + input [5:0]S_AXI_GP0_WID; + output S_AXI_GP1_ARESETN; + output S_AXI_GP1_ARREADY; + output S_AXI_GP1_AWREADY; + output S_AXI_GP1_BVALID; + output S_AXI_GP1_RLAST; + output S_AXI_GP1_RVALID; + output S_AXI_GP1_WREADY; + output [1:0]S_AXI_GP1_BRESP; + output [1:0]S_AXI_GP1_RRESP; + output [31:0]S_AXI_GP1_RDATA; + output [5:0]S_AXI_GP1_BID; + output [5:0]S_AXI_GP1_RID; + input S_AXI_GP1_ACLK; + input S_AXI_GP1_ARVALID; + input S_AXI_GP1_AWVALID; + input S_AXI_GP1_BREADY; + input S_AXI_GP1_RREADY; + input S_AXI_GP1_WLAST; + input S_AXI_GP1_WVALID; + input [1:0]S_AXI_GP1_ARBURST; + input [1:0]S_AXI_GP1_ARLOCK; + input [2:0]S_AXI_GP1_ARSIZE; + input [1:0]S_AXI_GP1_AWBURST; + input [1:0]S_AXI_GP1_AWLOCK; + input [2:0]S_AXI_GP1_AWSIZE; + input [2:0]S_AXI_GP1_ARPROT; + input [2:0]S_AXI_GP1_AWPROT; + input [31:0]S_AXI_GP1_ARADDR; + input [31:0]S_AXI_GP1_AWADDR; + input [31:0]S_AXI_GP1_WDATA; + input [3:0]S_AXI_GP1_ARCACHE; + input [3:0]S_AXI_GP1_ARLEN; + input [3:0]S_AXI_GP1_ARQOS; + input [3:0]S_AXI_GP1_AWCACHE; + input [3:0]S_AXI_GP1_AWLEN; + input [3:0]S_AXI_GP1_AWQOS; + input [3:0]S_AXI_GP1_WSTRB; + input [5:0]S_AXI_GP1_ARID; + input [5:0]S_AXI_GP1_AWID; + input [5:0]S_AXI_GP1_WID; + output S_AXI_ACP_ARESETN; + output S_AXI_ACP_ARREADY; + output S_AXI_ACP_AWREADY; + output S_AXI_ACP_BVALID; + output S_AXI_ACP_RLAST; + output S_AXI_ACP_RVALID; + output S_AXI_ACP_WREADY; + output [1:0]S_AXI_ACP_BRESP; + output [1:0]S_AXI_ACP_RRESP; + output [2:0]S_AXI_ACP_BID; + output [2:0]S_AXI_ACP_RID; + output [63:0]S_AXI_ACP_RDATA; + input S_AXI_ACP_ACLK; + input S_AXI_ACP_ARVALID; + input S_AXI_ACP_AWVALID; + input S_AXI_ACP_BREADY; + input S_AXI_ACP_RREADY; + input S_AXI_ACP_WLAST; + input S_AXI_ACP_WVALID; + input [2:0]S_AXI_ACP_ARID; + input [2:0]S_AXI_ACP_ARPROT; + input [2:0]S_AXI_ACP_AWID; + input [2:0]S_AXI_ACP_AWPROT; + input [2:0]S_AXI_ACP_WID; + input [31:0]S_AXI_ACP_ARADDR; + input [31:0]S_AXI_ACP_AWADDR; + input [3:0]S_AXI_ACP_ARCACHE; + input [3:0]S_AXI_ACP_ARLEN; + input [3:0]S_AXI_ACP_ARQOS; + input [3:0]S_AXI_ACP_AWCACHE; + input [3:0]S_AXI_ACP_AWLEN; + input [3:0]S_AXI_ACP_AWQOS; + input [1:0]S_AXI_ACP_ARBURST; + input [1:0]S_AXI_ACP_ARLOCK; + input [2:0]S_AXI_ACP_ARSIZE; + input [1:0]S_AXI_ACP_AWBURST; + input [1:0]S_AXI_ACP_AWLOCK; + input [2:0]S_AXI_ACP_AWSIZE; + input [4:0]S_AXI_ACP_ARUSER; + input [4:0]S_AXI_ACP_AWUSER; + input [63:0]S_AXI_ACP_WDATA; + input [7:0]S_AXI_ACP_WSTRB; + output S_AXI_HP0_ARESETN; + output S_AXI_HP0_ARREADY; + output S_AXI_HP0_AWREADY; + output S_AXI_HP0_BVALID; + output S_AXI_HP0_RLAST; + output S_AXI_HP0_RVALID; + output S_AXI_HP0_WREADY; + output [1:0]S_AXI_HP0_BRESP; + output [1:0]S_AXI_HP0_RRESP; + output [5:0]S_AXI_HP0_BID; + output [5:0]S_AXI_HP0_RID; + output [63:0]S_AXI_HP0_RDATA; + output [7:0]S_AXI_HP0_RCOUNT; + output [7:0]S_AXI_HP0_WCOUNT; + output [2:0]S_AXI_HP0_RACOUNT; + output [5:0]S_AXI_HP0_WACOUNT; + input S_AXI_HP0_ACLK; + input S_AXI_HP0_ARVALID; + input S_AXI_HP0_AWVALID; + input S_AXI_HP0_BREADY; + input S_AXI_HP0_RDISSUECAP1_EN; + input S_AXI_HP0_RREADY; + input S_AXI_HP0_WLAST; + input S_AXI_HP0_WRISSUECAP1_EN; + input S_AXI_HP0_WVALID; + input [1:0]S_AXI_HP0_ARBURST; + input [1:0]S_AXI_HP0_ARLOCK; + input [2:0]S_AXI_HP0_ARSIZE; + input [1:0]S_AXI_HP0_AWBURST; + input [1:0]S_AXI_HP0_AWLOCK; + input [2:0]S_AXI_HP0_AWSIZE; + input [2:0]S_AXI_HP0_ARPROT; + input [2:0]S_AXI_HP0_AWPROT; + input [31:0]S_AXI_HP0_ARADDR; + input [31:0]S_AXI_HP0_AWADDR; + input [3:0]S_AXI_HP0_ARCACHE; + input [3:0]S_AXI_HP0_ARLEN; + input [3:0]S_AXI_HP0_ARQOS; + input [3:0]S_AXI_HP0_AWCACHE; + input [3:0]S_AXI_HP0_AWLEN; + input [3:0]S_AXI_HP0_AWQOS; + input [5:0]S_AXI_HP0_ARID; + input [5:0]S_AXI_HP0_AWID; + input [5:0]S_AXI_HP0_WID; + input [63:0]S_AXI_HP0_WDATA; + input [7:0]S_AXI_HP0_WSTRB; + output S_AXI_HP1_ARESETN; + output S_AXI_HP1_ARREADY; + output S_AXI_HP1_AWREADY; + output S_AXI_HP1_BVALID; + output S_AXI_HP1_RLAST; + output S_AXI_HP1_RVALID; + output S_AXI_HP1_WREADY; + output [1:0]S_AXI_HP1_BRESP; + output [1:0]S_AXI_HP1_RRESP; + output [5:0]S_AXI_HP1_BID; + output [5:0]S_AXI_HP1_RID; + output [63:0]S_AXI_HP1_RDATA; + output [7:0]S_AXI_HP1_RCOUNT; + output [7:0]S_AXI_HP1_WCOUNT; + output [2:0]S_AXI_HP1_RACOUNT; + output [5:0]S_AXI_HP1_WACOUNT; + input S_AXI_HP1_ACLK; + input S_AXI_HP1_ARVALID; + input S_AXI_HP1_AWVALID; + input S_AXI_HP1_BREADY; + input S_AXI_HP1_RDISSUECAP1_EN; + input S_AXI_HP1_RREADY; + input S_AXI_HP1_WLAST; + input S_AXI_HP1_WRISSUECAP1_EN; + input S_AXI_HP1_WVALID; + input [1:0]S_AXI_HP1_ARBURST; + input [1:0]S_AXI_HP1_ARLOCK; + input [2:0]S_AXI_HP1_ARSIZE; + input [1:0]S_AXI_HP1_AWBURST; + input [1:0]S_AXI_HP1_AWLOCK; + input [2:0]S_AXI_HP1_AWSIZE; + input [2:0]S_AXI_HP1_ARPROT; + input [2:0]S_AXI_HP1_AWPROT; + input [31:0]S_AXI_HP1_ARADDR; + input [31:0]S_AXI_HP1_AWADDR; + input [3:0]S_AXI_HP1_ARCACHE; + input [3:0]S_AXI_HP1_ARLEN; + input [3:0]S_AXI_HP1_ARQOS; + input [3:0]S_AXI_HP1_AWCACHE; + input [3:0]S_AXI_HP1_AWLEN; + input [3:0]S_AXI_HP1_AWQOS; + input [5:0]S_AXI_HP1_ARID; + input [5:0]S_AXI_HP1_AWID; + input [5:0]S_AXI_HP1_WID; + input [63:0]S_AXI_HP1_WDATA; + input [7:0]S_AXI_HP1_WSTRB; + output S_AXI_HP2_ARESETN; + output S_AXI_HP2_ARREADY; + output S_AXI_HP2_AWREADY; + output S_AXI_HP2_BVALID; + output S_AXI_HP2_RLAST; + output S_AXI_HP2_RVALID; + output S_AXI_HP2_WREADY; + output [1:0]S_AXI_HP2_BRESP; + output [1:0]S_AXI_HP2_RRESP; + output [5:0]S_AXI_HP2_BID; + output [5:0]S_AXI_HP2_RID; + output [63:0]S_AXI_HP2_RDATA; + output [7:0]S_AXI_HP2_RCOUNT; + output [7:0]S_AXI_HP2_WCOUNT; + output [2:0]S_AXI_HP2_RACOUNT; + output [5:0]S_AXI_HP2_WACOUNT; + input S_AXI_HP2_ACLK; + input S_AXI_HP2_ARVALID; + input S_AXI_HP2_AWVALID; + input S_AXI_HP2_BREADY; + input S_AXI_HP2_RDISSUECAP1_EN; + input S_AXI_HP2_RREADY; + input S_AXI_HP2_WLAST; + input S_AXI_HP2_WRISSUECAP1_EN; + input S_AXI_HP2_WVALID; + input [1:0]S_AXI_HP2_ARBURST; + input [1:0]S_AXI_HP2_ARLOCK; + input [2:0]S_AXI_HP2_ARSIZE; + input [1:0]S_AXI_HP2_AWBURST; + input [1:0]S_AXI_HP2_AWLOCK; + input [2:0]S_AXI_HP2_AWSIZE; + input [2:0]S_AXI_HP2_ARPROT; + input [2:0]S_AXI_HP2_AWPROT; + input [31:0]S_AXI_HP2_ARADDR; + input [31:0]S_AXI_HP2_AWADDR; + input [3:0]S_AXI_HP2_ARCACHE; + input [3:0]S_AXI_HP2_ARLEN; + input [3:0]S_AXI_HP2_ARQOS; + input [3:0]S_AXI_HP2_AWCACHE; + input [3:0]S_AXI_HP2_AWLEN; + input [3:0]S_AXI_HP2_AWQOS; + input [5:0]S_AXI_HP2_ARID; + input [5:0]S_AXI_HP2_AWID; + input [5:0]S_AXI_HP2_WID; + input [63:0]S_AXI_HP2_WDATA; + input [7:0]S_AXI_HP2_WSTRB; + output S_AXI_HP3_ARESETN; + output S_AXI_HP3_ARREADY; + output S_AXI_HP3_AWREADY; + output S_AXI_HP3_BVALID; + output S_AXI_HP3_RLAST; + output S_AXI_HP3_RVALID; + output S_AXI_HP3_WREADY; + output [1:0]S_AXI_HP3_BRESP; + output [1:0]S_AXI_HP3_RRESP; + output [5:0]S_AXI_HP3_BID; + output [5:0]S_AXI_HP3_RID; + output [63:0]S_AXI_HP3_RDATA; + output [7:0]S_AXI_HP3_RCOUNT; + output [7:0]S_AXI_HP3_WCOUNT; + output [2:0]S_AXI_HP3_RACOUNT; + output [5:0]S_AXI_HP3_WACOUNT; + input S_AXI_HP3_ACLK; + input S_AXI_HP3_ARVALID; + input S_AXI_HP3_AWVALID; + input S_AXI_HP3_BREADY; + input S_AXI_HP3_RDISSUECAP1_EN; + input S_AXI_HP3_RREADY; + input S_AXI_HP3_WLAST; + input S_AXI_HP3_WRISSUECAP1_EN; + input S_AXI_HP3_WVALID; + input [1:0]S_AXI_HP3_ARBURST; + input [1:0]S_AXI_HP3_ARLOCK; + input [2:0]S_AXI_HP3_ARSIZE; + input [1:0]S_AXI_HP3_AWBURST; + input [1:0]S_AXI_HP3_AWLOCK; + input [2:0]S_AXI_HP3_AWSIZE; + input [2:0]S_AXI_HP3_ARPROT; + input [2:0]S_AXI_HP3_AWPROT; + input [31:0]S_AXI_HP3_ARADDR; + input [31:0]S_AXI_HP3_AWADDR; + input [3:0]S_AXI_HP3_ARCACHE; + input [3:0]S_AXI_HP3_ARLEN; + input [3:0]S_AXI_HP3_ARQOS; + input [3:0]S_AXI_HP3_AWCACHE; + input [3:0]S_AXI_HP3_AWLEN; + input [3:0]S_AXI_HP3_AWQOS; + input [5:0]S_AXI_HP3_ARID; + input [5:0]S_AXI_HP3_AWID; + input [5:0]S_AXI_HP3_WID; + input [63:0]S_AXI_HP3_WDATA; + input [7:0]S_AXI_HP3_WSTRB; + output IRQ_P2F_DMAC_ABORT; + output IRQ_P2F_DMAC0; + output IRQ_P2F_DMAC1; + output IRQ_P2F_DMAC2; + output IRQ_P2F_DMAC3; + output IRQ_P2F_DMAC4; + output IRQ_P2F_DMAC5; + output IRQ_P2F_DMAC6; + output IRQ_P2F_DMAC7; + output IRQ_P2F_SMC; + output IRQ_P2F_QSPI; + output IRQ_P2F_CTI; + output IRQ_P2F_GPIO; + output IRQ_P2F_USB0; + output IRQ_P2F_ENET0; + output IRQ_P2F_ENET_WAKE0; + output IRQ_P2F_SDIO0; + output IRQ_P2F_I2C0; + output IRQ_P2F_SPI0; + output IRQ_P2F_UART0; + output IRQ_P2F_CAN0; + output IRQ_P2F_USB1; + output IRQ_P2F_ENET1; + output IRQ_P2F_ENET_WAKE1; + output IRQ_P2F_SDIO1; + output IRQ_P2F_I2C1; + output IRQ_P2F_SPI1; + output IRQ_P2F_UART1; + output IRQ_P2F_CAN1; + input [0:0]IRQ_F2P; + input Core0_nFIQ; + input Core0_nIRQ; + input Core1_nFIQ; + input Core1_nIRQ; + output [1:0]DMA0_DATYPE; + output DMA0_DAVALID; + output DMA0_DRREADY; + output DMA0_RSTN; + output [1:0]DMA1_DATYPE; + output DMA1_DAVALID; + output DMA1_DRREADY; + output DMA1_RSTN; + output [1:0]DMA2_DATYPE; + output DMA2_DAVALID; + output DMA2_DRREADY; + output DMA2_RSTN; + output [1:0]DMA3_DATYPE; + output DMA3_DAVALID; + output DMA3_DRREADY; + output DMA3_RSTN; + input DMA0_ACLK; + input DMA0_DAREADY; + input DMA0_DRLAST; + input DMA0_DRVALID; + input DMA1_ACLK; + input DMA1_DAREADY; + input DMA1_DRLAST; + input DMA1_DRVALID; + input DMA2_ACLK; + input DMA2_DAREADY; + input DMA2_DRLAST; + input DMA2_DRVALID; + input DMA3_ACLK; + input DMA3_DAREADY; + input DMA3_DRLAST; + input DMA3_DRVALID; + input [1:0]DMA0_DRTYPE; + input [1:0]DMA1_DRTYPE; + input [1:0]DMA2_DRTYPE; + input [1:0]DMA3_DRTYPE; + output FCLK_CLK3; + output FCLK_CLK2; + output FCLK_CLK1; + output FCLK_CLK0; + input FCLK_CLKTRIG3_N; + input FCLK_CLKTRIG2_N; + input FCLK_CLKTRIG1_N; + input FCLK_CLKTRIG0_N; + output FCLK_RESET3_N; + output FCLK_RESET2_N; + output FCLK_RESET1_N; + output FCLK_RESET0_N; + input [31:0]FTMD_TRACEIN_DATA; + input FTMD_TRACEIN_VALID; + input FTMD_TRACEIN_CLK; + input [3:0]FTMD_TRACEIN_ATID; + input FTMT_F2P_TRIG_0; + output FTMT_F2P_TRIGACK_0; + input FTMT_F2P_TRIG_1; + output FTMT_F2P_TRIGACK_1; + input FTMT_F2P_TRIG_2; + output FTMT_F2P_TRIGACK_2; + input FTMT_F2P_TRIG_3; + output FTMT_F2P_TRIGACK_3; + input [31:0]FTMT_F2P_DEBUG; + input FTMT_P2F_TRIGACK_0; + output FTMT_P2F_TRIG_0; + input FTMT_P2F_TRIGACK_1; + output FTMT_P2F_TRIG_1; + input FTMT_P2F_TRIGACK_2; + output FTMT_P2F_TRIG_2; + input FTMT_P2F_TRIGACK_3; + output FTMT_P2F_TRIG_3; + output [31:0]FTMT_P2F_DEBUG; + input FPGA_IDLE_N; + output EVENT_EVENTO; + output [1:0]EVENT_STANDBYWFE; + output [1:0]EVENT_STANDBYWFI; + input EVENT_EVENTI; + input [3:0]DDR_ARB; + inout [31:0]MIO; + inout DDR_CAS_n; + inout DDR_CKE; + inout DDR_Clk_n; + inout DDR_Clk; + inout DDR_CS_n; + inout DDR_DRSTB; + inout DDR_ODT; + inout DDR_RAS_n; + inout DDR_WEB; + inout [2:0]DDR_BankAddr; + inout [14:0]DDR_Addr; + inout DDR_VRN; + inout DDR_VRP; + inout [1:0]DDR_DM; + inout [15:0]DDR_DQ; + inout [1:0]DDR_DQS_n; + inout [1:0]DDR_DQS; + inout PS_SRSTB; + inout PS_CLK; + inout PS_PORB; + + wire \ ; + wire \ ; + wire CAN0_PHY_RX; + wire CAN0_PHY_TX; + wire CAN1_PHY_RX; + wire CAN1_PHY_TX; + wire Core0_nFIQ; + wire Core0_nIRQ; + wire Core1_nFIQ; + wire Core1_nIRQ; + wire [3:0]DDR_ARB; + wire [14:0]DDR_Addr; + wire [2:0]DDR_BankAddr; + wire DDR_CAS_n; + wire DDR_CKE; + wire DDR_CS_n; + wire DDR_Clk; + wire DDR_Clk_n; + wire [1:0]DDR_DM; + wire [15:0]DDR_DQ; + wire [1:0]DDR_DQS; + wire [1:0]DDR_DQS_n; + wire DDR_DRSTB; + wire DDR_ODT; + wire DDR_RAS_n; + wire DDR_VRN; + wire DDR_VRP; + wire DDR_WEB; + wire DMA0_ACLK; + wire DMA0_DAREADY; + wire [1:0]DMA0_DATYPE; + wire DMA0_DAVALID; + wire DMA0_DRLAST; + wire DMA0_DRREADY; + wire [1:0]DMA0_DRTYPE; + wire DMA0_DRVALID; + wire DMA0_RSTN; + wire DMA1_ACLK; + wire DMA1_DAREADY; + wire [1:0]DMA1_DATYPE; + wire DMA1_DAVALID; + wire DMA1_DRLAST; + wire DMA1_DRREADY; + wire [1:0]DMA1_DRTYPE; + wire DMA1_DRVALID; + wire DMA1_RSTN; + wire DMA2_ACLK; + wire DMA2_DAREADY; + wire [1:0]DMA2_DATYPE; + wire DMA2_DAVALID; + wire DMA2_DRLAST; + wire DMA2_DRREADY; + wire [1:0]DMA2_DRTYPE; + wire DMA2_DRVALID; + wire DMA2_RSTN; + wire DMA3_ACLK; + wire DMA3_DAREADY; + wire [1:0]DMA3_DATYPE; + wire DMA3_DAVALID; + wire DMA3_DRLAST; + wire DMA3_DRREADY; + wire [1:0]DMA3_DRTYPE; + wire DMA3_DRVALID; + wire DMA3_RSTN; + wire ENET0_EXT_INTIN; + wire ENET0_GMII_RX_CLK; + wire ENET0_GMII_TX_CLK; + wire ENET0_MDIO_I; + wire ENET0_MDIO_MDC; + wire ENET0_MDIO_O; + wire ENET0_MDIO_T; + wire ENET0_MDIO_T_n; + wire ENET0_PTP_DELAY_REQ_RX; + wire ENET0_PTP_DELAY_REQ_TX; + wire ENET0_PTP_PDELAY_REQ_RX; + wire ENET0_PTP_PDELAY_REQ_TX; + wire ENET0_PTP_PDELAY_RESP_RX; + wire ENET0_PTP_PDELAY_RESP_TX; + wire ENET0_PTP_SYNC_FRAME_RX; + wire ENET0_PTP_SYNC_FRAME_TX; + wire ENET0_SOF_RX; + wire ENET0_SOF_TX; + wire ENET1_EXT_INTIN; + wire ENET1_GMII_RX_CLK; + wire ENET1_GMII_TX_CLK; + wire ENET1_MDIO_I; + wire ENET1_MDIO_MDC; + wire ENET1_MDIO_O; + wire ENET1_MDIO_T; + wire ENET1_MDIO_T_n; + wire ENET1_PTP_DELAY_REQ_RX; + wire ENET1_PTP_DELAY_REQ_TX; + wire ENET1_PTP_PDELAY_REQ_RX; + wire ENET1_PTP_PDELAY_REQ_TX; + wire ENET1_PTP_PDELAY_RESP_RX; + wire ENET1_PTP_PDELAY_RESP_TX; + wire ENET1_PTP_SYNC_FRAME_RX; + wire ENET1_PTP_SYNC_FRAME_TX; + wire ENET1_SOF_RX; + wire ENET1_SOF_TX; + wire EVENT_EVENTI; + wire EVENT_EVENTO; + wire [1:0]EVENT_STANDBYWFE; + wire [1:0]EVENT_STANDBYWFI; + wire FCLK_CLK0; + wire FCLK_CLK1; + wire FCLK_CLK2; + wire FCLK_CLK3; + wire [1:0]FCLK_CLK_unbuffered; + wire FCLK_RESET0_N; + wire FCLK_RESET1_N; + wire FCLK_RESET2_N; + wire FCLK_RESET3_N; + wire FPGA_IDLE_N; + wire FTMD_TRACEIN_CLK; + wire [31:0]FTMT_F2P_DEBUG; + wire FTMT_F2P_TRIGACK_0; + wire FTMT_F2P_TRIGACK_1; + wire FTMT_F2P_TRIGACK_2; + wire FTMT_F2P_TRIGACK_3; + wire FTMT_F2P_TRIG_0; + wire FTMT_F2P_TRIG_1; + wire FTMT_F2P_TRIG_2; + wire FTMT_F2P_TRIG_3; + wire [31:0]FTMT_P2F_DEBUG; + wire FTMT_P2F_TRIGACK_0; + wire FTMT_P2F_TRIGACK_1; + wire FTMT_P2F_TRIGACK_2; + wire FTMT_P2F_TRIGACK_3; + wire FTMT_P2F_TRIG_0; + wire FTMT_P2F_TRIG_1; + wire FTMT_P2F_TRIG_2; + wire FTMT_P2F_TRIG_3; + wire [63:0]GPIO_I; + wire [63:0]GPIO_O; + wire [63:0]GPIO_T; + wire I2C0_SCL_I; + wire I2C0_SCL_O; + wire I2C0_SCL_T; + wire I2C0_SCL_T_n; + wire I2C0_SDA_I; + wire I2C0_SDA_O; + wire I2C0_SDA_T; + wire I2C0_SDA_T_n; + wire I2C1_SCL_I; + wire I2C1_SCL_O; + wire I2C1_SCL_T; + wire I2C1_SCL_T_n; + wire I2C1_SDA_I; + wire I2C1_SDA_O; + wire I2C1_SDA_T; + wire I2C1_SDA_T_n; + wire [0:0]IRQ_F2P; + wire IRQ_P2F_CAN0; + wire IRQ_P2F_CAN1; + wire IRQ_P2F_CTI; + wire IRQ_P2F_DMAC0; + wire IRQ_P2F_DMAC1; + wire IRQ_P2F_DMAC2; + wire IRQ_P2F_DMAC3; + wire IRQ_P2F_DMAC4; + wire IRQ_P2F_DMAC5; + wire IRQ_P2F_DMAC6; + wire IRQ_P2F_DMAC7; + wire IRQ_P2F_DMAC_ABORT; + wire IRQ_P2F_ENET0; + wire IRQ_P2F_ENET1; + wire IRQ_P2F_ENET_WAKE0; + wire IRQ_P2F_ENET_WAKE1; + wire IRQ_P2F_GPIO; + wire IRQ_P2F_I2C0; + wire IRQ_P2F_I2C1; + wire IRQ_P2F_QSPI; + wire IRQ_P2F_SDIO0; + wire IRQ_P2F_SDIO1; + wire IRQ_P2F_SMC; + wire IRQ_P2F_SPI0; + wire IRQ_P2F_SPI1; + wire IRQ_P2F_UART0; + wire IRQ_P2F_UART1; + wire IRQ_P2F_USB0; + wire IRQ_P2F_USB1; + wire [31:0]MIO; + wire M_AXI_GP0_ACLK; + wire [31:0]M_AXI_GP0_ARADDR; + wire [1:0]M_AXI_GP0_ARBURST; + wire [3:0]\^M_AXI_GP0_ARCACHE ; + wire M_AXI_GP0_ARESETN; + wire [11:0]M_AXI_GP0_ARID; + wire [3:0]M_AXI_GP0_ARLEN; + wire [1:0]M_AXI_GP0_ARLOCK; + wire [2:0]M_AXI_GP0_ARPROT; + wire [3:0]M_AXI_GP0_ARQOS; + wire M_AXI_GP0_ARREADY; + wire [1:0]\^M_AXI_GP0_ARSIZE ; + wire M_AXI_GP0_ARVALID; + wire [31:0]M_AXI_GP0_AWADDR; + wire [1:0]M_AXI_GP0_AWBURST; + wire [3:0]\^M_AXI_GP0_AWCACHE ; + wire [11:0]M_AXI_GP0_AWID; + wire [3:0]M_AXI_GP0_AWLEN; + wire [1:0]M_AXI_GP0_AWLOCK; + wire [2:0]M_AXI_GP0_AWPROT; + wire [3:0]M_AXI_GP0_AWQOS; + wire M_AXI_GP0_AWREADY; + wire [1:0]\^M_AXI_GP0_AWSIZE ; + wire M_AXI_GP0_AWVALID; + wire [11:0]M_AXI_GP0_BID; + wire M_AXI_GP0_BREADY; + wire [1:0]M_AXI_GP0_BRESP; + wire M_AXI_GP0_BVALID; + wire [31:0]M_AXI_GP0_RDATA; + wire [11:0]M_AXI_GP0_RID; + wire M_AXI_GP0_RLAST; + wire M_AXI_GP0_RREADY; + wire [1:0]M_AXI_GP0_RRESP; + wire M_AXI_GP0_RVALID; + wire [31:0]M_AXI_GP0_WDATA; + wire [11:0]M_AXI_GP0_WID; + wire M_AXI_GP0_WLAST; + wire M_AXI_GP0_WREADY; + wire [3:0]M_AXI_GP0_WSTRB; + wire M_AXI_GP0_WVALID; + wire M_AXI_GP1_ACLK; + wire [31:0]M_AXI_GP1_ARADDR; + wire [1:0]M_AXI_GP1_ARBURST; + wire [3:0]\^M_AXI_GP1_ARCACHE ; + wire M_AXI_GP1_ARESETN; + wire [11:0]M_AXI_GP1_ARID; + wire [3:0]M_AXI_GP1_ARLEN; + wire [1:0]M_AXI_GP1_ARLOCK; + wire [2:0]M_AXI_GP1_ARPROT; + wire [3:0]M_AXI_GP1_ARQOS; + wire M_AXI_GP1_ARREADY; + wire [1:0]\^M_AXI_GP1_ARSIZE ; + wire M_AXI_GP1_ARVALID; + wire [31:0]M_AXI_GP1_AWADDR; + wire [1:0]M_AXI_GP1_AWBURST; + wire [3:0]\^M_AXI_GP1_AWCACHE ; + wire [11:0]M_AXI_GP1_AWID; + wire [3:0]M_AXI_GP1_AWLEN; + wire [1:0]M_AXI_GP1_AWLOCK; + wire [2:0]M_AXI_GP1_AWPROT; + wire [3:0]M_AXI_GP1_AWQOS; + wire M_AXI_GP1_AWREADY; + wire [1:0]\^M_AXI_GP1_AWSIZE ; + wire M_AXI_GP1_AWVALID; + wire [11:0]M_AXI_GP1_BID; + wire M_AXI_GP1_BREADY; + wire [1:0]M_AXI_GP1_BRESP; + wire M_AXI_GP1_BVALID; + wire [31:0]M_AXI_GP1_RDATA; + wire [11:0]M_AXI_GP1_RID; + wire M_AXI_GP1_RLAST; + wire M_AXI_GP1_RREADY; + wire [1:0]M_AXI_GP1_RRESP; + wire M_AXI_GP1_RVALID; + wire [31:0]M_AXI_GP1_WDATA; + wire [11:0]M_AXI_GP1_WID; + wire M_AXI_GP1_WLAST; + wire M_AXI_GP1_WREADY; + wire [3:0]M_AXI_GP1_WSTRB; + wire M_AXI_GP1_WVALID; + wire PJTAG_TCK; + wire PJTAG_TDI; + wire PJTAG_TMS; + wire PS_CLK; + wire PS_PORB; + wire PS_SRSTB; + wire SDIO0_BUSPOW; + wire [2:0]SDIO0_BUSVOLT; + wire SDIO0_CDN; + wire SDIO0_CLK; + wire SDIO0_CLK_FB; + wire SDIO0_CMD_I; + wire SDIO0_CMD_O; + wire SDIO0_CMD_T; + wire SDIO0_CMD_T_n; + wire [3:0]SDIO0_DATA_I; + wire [3:0]SDIO0_DATA_O; + wire [3:0]SDIO0_DATA_T; + wire [3:0]SDIO0_DATA_T_n; + wire SDIO0_LED; + wire SDIO0_WP; + wire SDIO1_BUSPOW; + wire [2:0]SDIO1_BUSVOLT; + wire SDIO1_CDN; + wire SDIO1_CLK; + wire SDIO1_CLK_FB; + wire SDIO1_CMD_I; + wire SDIO1_CMD_O; + wire SDIO1_CMD_T; + wire SDIO1_CMD_T_n; + wire [3:0]SDIO1_DATA_I; + wire [3:0]SDIO1_DATA_O; + wire [3:0]SDIO1_DATA_T; + wire [3:0]SDIO1_DATA_T_n; + wire SDIO1_LED; + wire SDIO1_WP; + wire SPI0_MISO_I; + wire SPI0_MISO_O; + wire SPI0_MISO_T; + wire SPI0_MISO_T_n; + wire SPI0_MOSI_I; + wire SPI0_MOSI_O; + wire SPI0_MOSI_T; + wire SPI0_MOSI_T_n; + wire SPI0_SCLK_I; + wire SPI0_SCLK_O; + wire SPI0_SCLK_T; + wire SPI0_SCLK_T_n; + wire SPI0_SS1_O; + wire SPI0_SS2_O; + wire SPI0_SS_I; + wire SPI0_SS_O; + wire SPI0_SS_T; + wire SPI0_SS_T_n; + wire SPI1_MISO_I; + wire SPI1_MISO_O; + wire SPI1_MISO_T; + wire SPI1_MISO_T_n; + wire SPI1_MOSI_I; + wire SPI1_MOSI_O; + wire SPI1_MOSI_T; + wire SPI1_MOSI_T_n; + wire SPI1_SCLK_I; + wire SPI1_SCLK_O; + wire SPI1_SCLK_T; + wire SPI1_SCLK_T_n; + wire SPI1_SS1_O; + wire SPI1_SS2_O; + wire SPI1_SS_I; + wire SPI1_SS_O; + wire SPI1_SS_T; + wire SPI1_SS_T_n; + wire SRAM_INTIN; + wire S_AXI_ACP_ACLK; + wire [31:0]S_AXI_ACP_ARADDR; + wire [1:0]S_AXI_ACP_ARBURST; + wire [3:0]S_AXI_ACP_ARCACHE; + wire S_AXI_ACP_ARESETN; + wire [2:0]S_AXI_ACP_ARID; + wire [3:0]S_AXI_ACP_ARLEN; + wire [1:0]S_AXI_ACP_ARLOCK; + wire [2:0]S_AXI_ACP_ARPROT; + wire [3:0]S_AXI_ACP_ARQOS; + wire S_AXI_ACP_ARREADY; + wire [2:0]S_AXI_ACP_ARSIZE; + wire [4:0]S_AXI_ACP_ARUSER; + wire S_AXI_ACP_ARVALID; + wire [31:0]S_AXI_ACP_AWADDR; + wire [1:0]S_AXI_ACP_AWBURST; + wire [3:0]S_AXI_ACP_AWCACHE; + wire [2:0]S_AXI_ACP_AWID; + wire [3:0]S_AXI_ACP_AWLEN; + wire [1:0]S_AXI_ACP_AWLOCK; + wire [2:0]S_AXI_ACP_AWPROT; + wire [3:0]S_AXI_ACP_AWQOS; + wire S_AXI_ACP_AWREADY; + wire [2:0]S_AXI_ACP_AWSIZE; + wire [4:0]S_AXI_ACP_AWUSER; + wire S_AXI_ACP_AWVALID; + wire [2:0]S_AXI_ACP_BID; + wire S_AXI_ACP_BREADY; + wire [1:0]S_AXI_ACP_BRESP; + wire S_AXI_ACP_BVALID; + wire [63:0]S_AXI_ACP_RDATA; + wire [2:0]S_AXI_ACP_RID; + wire S_AXI_ACP_RLAST; + wire S_AXI_ACP_RREADY; + wire [1:0]S_AXI_ACP_RRESP; + wire S_AXI_ACP_RVALID; + wire [63:0]S_AXI_ACP_WDATA; + wire [2:0]S_AXI_ACP_WID; + wire S_AXI_ACP_WLAST; + wire S_AXI_ACP_WREADY; + wire [7:0]S_AXI_ACP_WSTRB; + wire S_AXI_ACP_WVALID; + wire S_AXI_GP0_ACLK; + wire [31:0]S_AXI_GP0_ARADDR; + wire [1:0]S_AXI_GP0_ARBURST; + wire [3:0]S_AXI_GP0_ARCACHE; + wire S_AXI_GP0_ARESETN; + wire [5:0]S_AXI_GP0_ARID; + wire [3:0]S_AXI_GP0_ARLEN; + wire [1:0]S_AXI_GP0_ARLOCK; + wire [2:0]S_AXI_GP0_ARPROT; + wire [3:0]S_AXI_GP0_ARQOS; + wire S_AXI_GP0_ARREADY; + wire [2:0]S_AXI_GP0_ARSIZE; + wire S_AXI_GP0_ARVALID; + wire [31:0]S_AXI_GP0_AWADDR; + wire [1:0]S_AXI_GP0_AWBURST; + wire [3:0]S_AXI_GP0_AWCACHE; + wire [5:0]S_AXI_GP0_AWID; + wire [3:0]S_AXI_GP0_AWLEN; + wire [1:0]S_AXI_GP0_AWLOCK; + wire [2:0]S_AXI_GP0_AWPROT; + wire [3:0]S_AXI_GP0_AWQOS; + wire S_AXI_GP0_AWREADY; + wire [2:0]S_AXI_GP0_AWSIZE; + wire S_AXI_GP0_AWVALID; + wire [5:0]S_AXI_GP0_BID; + wire S_AXI_GP0_BREADY; + wire [1:0]S_AXI_GP0_BRESP; + wire S_AXI_GP0_BVALID; + wire [31:0]S_AXI_GP0_RDATA; + wire [5:0]S_AXI_GP0_RID; + wire S_AXI_GP0_RLAST; + wire S_AXI_GP0_RREADY; + wire [1:0]S_AXI_GP0_RRESP; + wire S_AXI_GP0_RVALID; + wire [31:0]S_AXI_GP0_WDATA; + wire [5:0]S_AXI_GP0_WID; + wire S_AXI_GP0_WLAST; + wire S_AXI_GP0_WREADY; + wire [3:0]S_AXI_GP0_WSTRB; + wire S_AXI_GP0_WVALID; + wire S_AXI_GP1_ACLK; + wire [31:0]S_AXI_GP1_ARADDR; + wire [1:0]S_AXI_GP1_ARBURST; + wire [3:0]S_AXI_GP1_ARCACHE; + wire S_AXI_GP1_ARESETN; + wire [5:0]S_AXI_GP1_ARID; + wire [3:0]S_AXI_GP1_ARLEN; + wire [1:0]S_AXI_GP1_ARLOCK; + wire [2:0]S_AXI_GP1_ARPROT; + wire [3:0]S_AXI_GP1_ARQOS; + wire S_AXI_GP1_ARREADY; + wire [2:0]S_AXI_GP1_ARSIZE; + wire S_AXI_GP1_ARVALID; + wire [31:0]S_AXI_GP1_AWADDR; + wire [1:0]S_AXI_GP1_AWBURST; + wire [3:0]S_AXI_GP1_AWCACHE; + wire [5:0]S_AXI_GP1_AWID; + wire [3:0]S_AXI_GP1_AWLEN; + wire [1:0]S_AXI_GP1_AWLOCK; + wire [2:0]S_AXI_GP1_AWPROT; + wire [3:0]S_AXI_GP1_AWQOS; + wire S_AXI_GP1_AWREADY; + wire [2:0]S_AXI_GP1_AWSIZE; + wire S_AXI_GP1_AWVALID; + wire [5:0]S_AXI_GP1_BID; + wire S_AXI_GP1_BREADY; + wire [1:0]S_AXI_GP1_BRESP; + wire S_AXI_GP1_BVALID; + wire [31:0]S_AXI_GP1_RDATA; + wire [5:0]S_AXI_GP1_RID; + wire S_AXI_GP1_RLAST; + wire S_AXI_GP1_RREADY; + wire [1:0]S_AXI_GP1_RRESP; + wire S_AXI_GP1_RVALID; + wire [31:0]S_AXI_GP1_WDATA; + wire [5:0]S_AXI_GP1_WID; + wire S_AXI_GP1_WLAST; + wire S_AXI_GP1_WREADY; + wire [3:0]S_AXI_GP1_WSTRB; + wire S_AXI_GP1_WVALID; + wire S_AXI_HP0_ACLK; + wire [31:0]S_AXI_HP0_ARADDR; + wire [1:0]S_AXI_HP0_ARBURST; + wire [3:0]S_AXI_HP0_ARCACHE; + wire S_AXI_HP0_ARESETN; + wire [5:0]S_AXI_HP0_ARID; + wire [3:0]S_AXI_HP0_ARLEN; + wire [1:0]S_AXI_HP0_ARLOCK; + wire [2:0]S_AXI_HP0_ARPROT; + wire [3:0]S_AXI_HP0_ARQOS; + wire S_AXI_HP0_ARREADY; + wire [2:0]S_AXI_HP0_ARSIZE; + wire S_AXI_HP0_ARVALID; + wire [31:0]S_AXI_HP0_AWADDR; + wire [1:0]S_AXI_HP0_AWBURST; + wire [3:0]S_AXI_HP0_AWCACHE; + wire [5:0]S_AXI_HP0_AWID; + wire [3:0]S_AXI_HP0_AWLEN; + wire [1:0]S_AXI_HP0_AWLOCK; + wire [2:0]S_AXI_HP0_AWPROT; + wire [3:0]S_AXI_HP0_AWQOS; + wire S_AXI_HP0_AWREADY; + wire [2:0]S_AXI_HP0_AWSIZE; + wire S_AXI_HP0_AWVALID; + wire [5:0]S_AXI_HP0_BID; + wire S_AXI_HP0_BREADY; + wire [1:0]S_AXI_HP0_BRESP; + wire S_AXI_HP0_BVALID; + wire [2:0]S_AXI_HP0_RACOUNT; + wire [7:0]S_AXI_HP0_RCOUNT; + wire [63:0]S_AXI_HP0_RDATA; + wire S_AXI_HP0_RDISSUECAP1_EN; + wire [5:0]S_AXI_HP0_RID; + wire S_AXI_HP0_RLAST; + wire S_AXI_HP0_RREADY; + wire [1:0]S_AXI_HP0_RRESP; + wire S_AXI_HP0_RVALID; + wire [5:0]S_AXI_HP0_WACOUNT; + wire [7:0]S_AXI_HP0_WCOUNT; + wire [63:0]S_AXI_HP0_WDATA; + wire [5:0]S_AXI_HP0_WID; + wire S_AXI_HP0_WLAST; + wire S_AXI_HP0_WREADY; + wire S_AXI_HP0_WRISSUECAP1_EN; + wire [7:0]S_AXI_HP0_WSTRB; + wire S_AXI_HP0_WVALID; + wire S_AXI_HP1_ACLK; + wire [31:0]S_AXI_HP1_ARADDR; + wire [1:0]S_AXI_HP1_ARBURST; + wire [3:0]S_AXI_HP1_ARCACHE; + wire S_AXI_HP1_ARESETN; + wire [5:0]S_AXI_HP1_ARID; + wire [3:0]S_AXI_HP1_ARLEN; + wire [1:0]S_AXI_HP1_ARLOCK; + wire [2:0]S_AXI_HP1_ARPROT; + wire [3:0]S_AXI_HP1_ARQOS; + wire S_AXI_HP1_ARREADY; + wire [2:0]S_AXI_HP1_ARSIZE; + wire S_AXI_HP1_ARVALID; + wire [31:0]S_AXI_HP1_AWADDR; + wire [1:0]S_AXI_HP1_AWBURST; + wire [3:0]S_AXI_HP1_AWCACHE; + wire [5:0]S_AXI_HP1_AWID; + wire [3:0]S_AXI_HP1_AWLEN; + wire [1:0]S_AXI_HP1_AWLOCK; + wire [2:0]S_AXI_HP1_AWPROT; + wire [3:0]S_AXI_HP1_AWQOS; + wire S_AXI_HP1_AWREADY; + wire [2:0]S_AXI_HP1_AWSIZE; + wire S_AXI_HP1_AWVALID; + wire [5:0]S_AXI_HP1_BID; + wire S_AXI_HP1_BREADY; + wire [1:0]S_AXI_HP1_BRESP; + wire S_AXI_HP1_BVALID; + wire [2:0]S_AXI_HP1_RACOUNT; + wire [7:0]S_AXI_HP1_RCOUNT; + wire [63:0]S_AXI_HP1_RDATA; + wire S_AXI_HP1_RDISSUECAP1_EN; + wire [5:0]S_AXI_HP1_RID; + wire S_AXI_HP1_RLAST; + wire S_AXI_HP1_RREADY; + wire [1:0]S_AXI_HP1_RRESP; + wire S_AXI_HP1_RVALID; + wire [5:0]S_AXI_HP1_WACOUNT; + wire [7:0]S_AXI_HP1_WCOUNT; + wire [63:0]S_AXI_HP1_WDATA; + wire [5:0]S_AXI_HP1_WID; + wire S_AXI_HP1_WLAST; + wire S_AXI_HP1_WREADY; + wire S_AXI_HP1_WRISSUECAP1_EN; + wire [7:0]S_AXI_HP1_WSTRB; + wire S_AXI_HP1_WVALID; + wire S_AXI_HP2_ACLK; + wire [31:0]S_AXI_HP2_ARADDR; + wire [1:0]S_AXI_HP2_ARBURST; + wire [3:0]S_AXI_HP2_ARCACHE; + wire S_AXI_HP2_ARESETN; + wire [5:0]S_AXI_HP2_ARID; + wire [3:0]S_AXI_HP2_ARLEN; + wire [1:0]S_AXI_HP2_ARLOCK; + wire [2:0]S_AXI_HP2_ARPROT; + wire [3:0]S_AXI_HP2_ARQOS; + wire S_AXI_HP2_ARREADY; + wire [2:0]S_AXI_HP2_ARSIZE; + wire S_AXI_HP2_ARVALID; + wire [31:0]S_AXI_HP2_AWADDR; + wire [1:0]S_AXI_HP2_AWBURST; + wire [3:0]S_AXI_HP2_AWCACHE; + wire [5:0]S_AXI_HP2_AWID; + wire [3:0]S_AXI_HP2_AWLEN; + wire [1:0]S_AXI_HP2_AWLOCK; + wire [2:0]S_AXI_HP2_AWPROT; + wire [3:0]S_AXI_HP2_AWQOS; + wire S_AXI_HP2_AWREADY; + wire [2:0]S_AXI_HP2_AWSIZE; + wire S_AXI_HP2_AWVALID; + wire [5:0]S_AXI_HP2_BID; + wire S_AXI_HP2_BREADY; + wire [1:0]S_AXI_HP2_BRESP; + wire S_AXI_HP2_BVALID; + wire [2:0]S_AXI_HP2_RACOUNT; + wire [7:0]S_AXI_HP2_RCOUNT; + wire [63:0]S_AXI_HP2_RDATA; + wire S_AXI_HP2_RDISSUECAP1_EN; + wire [5:0]S_AXI_HP2_RID; + wire S_AXI_HP2_RLAST; + wire S_AXI_HP2_RREADY; + wire [1:0]S_AXI_HP2_RRESP; + wire S_AXI_HP2_RVALID; + wire [5:0]S_AXI_HP2_WACOUNT; + wire [7:0]S_AXI_HP2_WCOUNT; + wire [63:0]S_AXI_HP2_WDATA; + wire [5:0]S_AXI_HP2_WID; + wire S_AXI_HP2_WLAST; + wire S_AXI_HP2_WREADY; + wire S_AXI_HP2_WRISSUECAP1_EN; + wire [7:0]S_AXI_HP2_WSTRB; + wire S_AXI_HP2_WVALID; + wire S_AXI_HP3_ACLK; + wire [31:0]S_AXI_HP3_ARADDR; + wire [1:0]S_AXI_HP3_ARBURST; + wire [3:0]S_AXI_HP3_ARCACHE; + wire S_AXI_HP3_ARESETN; + wire [5:0]S_AXI_HP3_ARID; + wire [3:0]S_AXI_HP3_ARLEN; + wire [1:0]S_AXI_HP3_ARLOCK; + wire [2:0]S_AXI_HP3_ARPROT; + wire [3:0]S_AXI_HP3_ARQOS; + wire S_AXI_HP3_ARREADY; + wire [2:0]S_AXI_HP3_ARSIZE; + wire S_AXI_HP3_ARVALID; + wire [31:0]S_AXI_HP3_AWADDR; + wire [1:0]S_AXI_HP3_AWBURST; + wire [3:0]S_AXI_HP3_AWCACHE; + wire [5:0]S_AXI_HP3_AWID; + wire [3:0]S_AXI_HP3_AWLEN; + wire [1:0]S_AXI_HP3_AWLOCK; + wire [2:0]S_AXI_HP3_AWPROT; + wire [3:0]S_AXI_HP3_AWQOS; + wire S_AXI_HP3_AWREADY; + wire [2:0]S_AXI_HP3_AWSIZE; + wire S_AXI_HP3_AWVALID; + wire [5:0]S_AXI_HP3_BID; + wire S_AXI_HP3_BREADY; + wire [1:0]S_AXI_HP3_BRESP; + wire S_AXI_HP3_BVALID; + wire [2:0]S_AXI_HP3_RACOUNT; + wire [7:0]S_AXI_HP3_RCOUNT; + wire [63:0]S_AXI_HP3_RDATA; + wire S_AXI_HP3_RDISSUECAP1_EN; + wire [5:0]S_AXI_HP3_RID; + wire S_AXI_HP3_RLAST; + wire S_AXI_HP3_RREADY; + wire [1:0]S_AXI_HP3_RRESP; + wire S_AXI_HP3_RVALID; + wire [5:0]S_AXI_HP3_WACOUNT; + wire [7:0]S_AXI_HP3_WCOUNT; + wire [63:0]S_AXI_HP3_WDATA; + wire [5:0]S_AXI_HP3_WID; + wire S_AXI_HP3_WLAST; + wire S_AXI_HP3_WREADY; + wire S_AXI_HP3_WRISSUECAP1_EN; + wire [7:0]S_AXI_HP3_WSTRB; + wire S_AXI_HP3_WVALID; + wire TRACE_CLK; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[0] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[1] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[2] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[3] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[4] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[5] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[6] ; + (* RTL_KEEP = "true" *) wire \TRACE_CTL_PIPE[7] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[0] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[1] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[2] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[3] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[4] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[5] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[6] ; + (* RTL_KEEP = "true" *) wire [1:0]\TRACE_DATA_PIPE[7] ; + wire TTC0_CLK0_IN; + wire TTC0_CLK1_IN; + wire TTC0_CLK2_IN; + wire TTC0_WAVE0_OUT; + wire TTC0_WAVE1_OUT; + wire TTC0_WAVE2_OUT; + wire TTC1_CLK0_IN; + wire TTC1_CLK1_IN; + wire TTC1_CLK2_IN; + wire TTC1_WAVE0_OUT; + wire TTC1_WAVE1_OUT; + wire TTC1_WAVE2_OUT; + wire UART0_CTSN; + wire UART0_DCDN; + wire UART0_DSRN; + wire UART0_DTRN; + wire UART0_RIN; + wire UART0_RTSN; + wire UART0_RX; + wire UART0_TX; + wire UART1_CTSN; + wire UART1_DCDN; + wire UART1_DSRN; + wire UART1_DTRN; + wire UART1_RIN; + wire UART1_RTSN; + wire UART1_RX; + wire UART1_TX; + wire [1:0]USB0_PORT_INDCTL; + wire USB0_VBUS_PWRFAULT; + wire USB0_VBUS_PWRSELECT; + wire [1:0]USB1_PORT_INDCTL; + wire USB1_VBUS_PWRFAULT; + wire USB1_VBUS_PWRSELECT; + wire WDT_CLK_IN; + wire WDT_RST_OUT; + wire [14:0]buffered_DDR_Addr; + wire [2:0]buffered_DDR_BankAddr; + wire buffered_DDR_CAS_n; + wire buffered_DDR_CKE; + wire buffered_DDR_CS_n; + wire buffered_DDR_Clk; + wire buffered_DDR_Clk_n; + wire [1:0]buffered_DDR_DM; + wire [15:0]buffered_DDR_DQ; + wire [1:0]buffered_DDR_DQS; + wire [1:0]buffered_DDR_DQS_n; + wire buffered_DDR_DRSTB; + wire buffered_DDR_ODT; + wire buffered_DDR_RAS_n; + wire buffered_DDR_VRN; + wire buffered_DDR_VRP; + wire buffered_DDR_WEB; + wire [31:0]buffered_MIO; + wire buffered_PS_CLK; + wire buffered_PS_PORB; + wire buffered_PS_SRSTB; + wire [63:0]gpio_out_t_n; + wire NLW_PS7_i_EMIOENET0GMIITXEN_UNCONNECTED; + wire NLW_PS7_i_EMIOENET0GMIITXER_UNCONNECTED; + wire NLW_PS7_i_EMIOENET1GMIITXEN_UNCONNECTED; + wire NLW_PS7_i_EMIOENET1GMIITXER_UNCONNECTED; + wire NLW_PS7_i_EMIOPJTAGTDO_UNCONNECTED; + wire NLW_PS7_i_EMIOPJTAGTDTN_UNCONNECTED; + wire NLW_PS7_i_EMIOTRACECTL_UNCONNECTED; + wire [3:2]NLW_PS7_i_DDRDM_UNCONNECTED; + wire [31:16]NLW_PS7_i_DDRDQ_UNCONNECTED; + wire [3:2]NLW_PS7_i_DDRDQSN_UNCONNECTED; + wire [3:2]NLW_PS7_i_DDRDQSP_UNCONNECTED; + wire [7:0]NLW_PS7_i_EMIOENET0GMIITXD_UNCONNECTED; + wire [7:0]NLW_PS7_i_EMIOENET1GMIITXD_UNCONNECTED; + wire [31:0]NLW_PS7_i_EMIOTRACEDATA_UNCONNECTED; + wire [1:1]NLW_PS7_i_MAXIGP0ARCACHE_UNCONNECTED; + wire [1:1]NLW_PS7_i_MAXIGP0AWCACHE_UNCONNECTED; + wire [1:1]NLW_PS7_i_MAXIGP1ARCACHE_UNCONNECTED; + wire [1:1]NLW_PS7_i_MAXIGP1AWCACHE_UNCONNECTED; + wire [51:16]NLW_PS7_i_MIO_UNCONNECTED; + + assign ENET0_GMII_TXD[7] = \ ; + assign ENET0_GMII_TXD[6] = \ ; + assign ENET0_GMII_TXD[5] = \ ; + assign ENET0_GMII_TXD[4] = \ ; + assign ENET0_GMII_TXD[3] = \ ; + assign ENET0_GMII_TXD[2] = \ ; + assign ENET0_GMII_TXD[1] = \ ; + assign ENET0_GMII_TXD[0] = \ ; + assign ENET0_GMII_TX_EN = \ ; + assign ENET0_GMII_TX_ER = \ ; + assign ENET1_GMII_TXD[7] = \ ; + assign ENET1_GMII_TXD[6] = \ ; + assign ENET1_GMII_TXD[5] = \ ; + assign ENET1_GMII_TXD[4] = \ ; + assign ENET1_GMII_TXD[3] = \ ; + assign ENET1_GMII_TXD[2] = \ ; + assign ENET1_GMII_TXD[1] = \ ; + assign ENET1_GMII_TXD[0] = \ ; + assign ENET1_GMII_TX_EN = \ ; + assign ENET1_GMII_TX_ER = \ ; + assign M_AXI_GP0_ARCACHE[3:2] = \^M_AXI_GP0_ARCACHE [3:2]; + assign M_AXI_GP0_ARCACHE[1] = \ ; + assign M_AXI_GP0_ARCACHE[0] = \^M_AXI_GP0_ARCACHE [0]; + assign M_AXI_GP0_ARSIZE[2] = \ ; + assign M_AXI_GP0_ARSIZE[1:0] = \^M_AXI_GP0_ARSIZE [1:0]; + assign M_AXI_GP0_AWCACHE[3:2] = \^M_AXI_GP0_AWCACHE [3:2]; + assign M_AXI_GP0_AWCACHE[1] = \ ; + assign M_AXI_GP0_AWCACHE[0] = \^M_AXI_GP0_AWCACHE [0]; + assign M_AXI_GP0_AWSIZE[2] = \ ; + assign M_AXI_GP0_AWSIZE[1:0] = \^M_AXI_GP0_AWSIZE [1:0]; + assign M_AXI_GP1_ARCACHE[3:2] = \^M_AXI_GP1_ARCACHE [3:2]; + assign M_AXI_GP1_ARCACHE[1] = \ ; + assign M_AXI_GP1_ARCACHE[0] = \^M_AXI_GP1_ARCACHE [0]; + assign M_AXI_GP1_ARSIZE[2] = \ ; + assign M_AXI_GP1_ARSIZE[1:0] = \^M_AXI_GP1_ARSIZE [1:0]; + assign M_AXI_GP1_AWCACHE[3:2] = \^M_AXI_GP1_AWCACHE [3:2]; + assign M_AXI_GP1_AWCACHE[1] = \ ; + assign M_AXI_GP1_AWCACHE[0] = \^M_AXI_GP1_AWCACHE [0]; + assign M_AXI_GP1_AWSIZE[2] = \ ; + assign M_AXI_GP1_AWSIZE[1:0] = \^M_AXI_GP1_AWSIZE [1:0]; + assign PJTAG_TDO = \ ; + assign TRACE_CLK_OUT = \ ; + assign TRACE_CTL = \TRACE_CTL_PIPE[0] ; + assign TRACE_DATA[1:0] = \TRACE_DATA_PIPE[0] ; + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_CAS_n_BIBUF + (.IO(buffered_DDR_CAS_n), + .PAD(DDR_CAS_n)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_CKE_BIBUF + (.IO(buffered_DDR_CKE), + .PAD(DDR_CKE)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_CS_n_BIBUF + (.IO(buffered_DDR_CS_n), + .PAD(DDR_CS_n)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_Clk_BIBUF + (.IO(buffered_DDR_Clk), + .PAD(DDR_Clk)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_Clk_n_BIBUF + (.IO(buffered_DDR_Clk_n), + .PAD(DDR_Clk_n)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_DRSTB_BIBUF + (.IO(buffered_DDR_DRSTB), + .PAD(DDR_DRSTB)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_ODT_BIBUF + (.IO(buffered_DDR_ODT), + .PAD(DDR_ODT)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_RAS_n_BIBUF + (.IO(buffered_DDR_RAS_n), + .PAD(DDR_RAS_n)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_VRN_BIBUF + (.IO(buffered_DDR_VRN), + .PAD(DDR_VRN)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_VRP_BIBUF + (.IO(buffered_DDR_VRP), + .PAD(DDR_VRP)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF DDR_WEB_BIBUF + (.IO(buffered_DDR_WEB), + .PAD(DDR_WEB)); + LUT1 #( + .INIT(2'h1)) + ENET0_MDIO_T_INST_0 + (.I0(ENET0_MDIO_T_n), + .O(ENET0_MDIO_T)); + LUT1 #( + .INIT(2'h1)) + ENET1_MDIO_T_INST_0 + (.I0(ENET1_MDIO_T_n), + .O(ENET1_MDIO_T)); + GND GND + (.G(\ )); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[0]_INST_0 + (.I0(gpio_out_t_n[0]), + .O(GPIO_T[0])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[10]_INST_0 + (.I0(gpio_out_t_n[10]), + .O(GPIO_T[10])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[11]_INST_0 + (.I0(gpio_out_t_n[11]), + .O(GPIO_T[11])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[12]_INST_0 + (.I0(gpio_out_t_n[12]), + .O(GPIO_T[12])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[13]_INST_0 + (.I0(gpio_out_t_n[13]), + .O(GPIO_T[13])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[14]_INST_0 + (.I0(gpio_out_t_n[14]), + .O(GPIO_T[14])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[15]_INST_0 + (.I0(gpio_out_t_n[15]), + .O(GPIO_T[15])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[16]_INST_0 + (.I0(gpio_out_t_n[16]), + .O(GPIO_T[16])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[17]_INST_0 + (.I0(gpio_out_t_n[17]), + .O(GPIO_T[17])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[18]_INST_0 + (.I0(gpio_out_t_n[18]), + .O(GPIO_T[18])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[19]_INST_0 + (.I0(gpio_out_t_n[19]), + .O(GPIO_T[19])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[1]_INST_0 + (.I0(gpio_out_t_n[1]), + .O(GPIO_T[1])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[20]_INST_0 + (.I0(gpio_out_t_n[20]), + .O(GPIO_T[20])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[21]_INST_0 + (.I0(gpio_out_t_n[21]), + .O(GPIO_T[21])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[22]_INST_0 + (.I0(gpio_out_t_n[22]), + .O(GPIO_T[22])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[23]_INST_0 + (.I0(gpio_out_t_n[23]), + .O(GPIO_T[23])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[24]_INST_0 + (.I0(gpio_out_t_n[24]), + .O(GPIO_T[24])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[25]_INST_0 + (.I0(gpio_out_t_n[25]), + .O(GPIO_T[25])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[26]_INST_0 + (.I0(gpio_out_t_n[26]), + .O(GPIO_T[26])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[27]_INST_0 + (.I0(gpio_out_t_n[27]), + .O(GPIO_T[27])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[28]_INST_0 + (.I0(gpio_out_t_n[28]), + .O(GPIO_T[28])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[29]_INST_0 + (.I0(gpio_out_t_n[29]), + .O(GPIO_T[29])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[2]_INST_0 + (.I0(gpio_out_t_n[2]), + .O(GPIO_T[2])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[30]_INST_0 + (.I0(gpio_out_t_n[30]), + .O(GPIO_T[30])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[31]_INST_0 + (.I0(gpio_out_t_n[31]), + .O(GPIO_T[31])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[32]_INST_0 + (.I0(gpio_out_t_n[32]), + .O(GPIO_T[32])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[33]_INST_0 + (.I0(gpio_out_t_n[33]), + .O(GPIO_T[33])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[34]_INST_0 + (.I0(gpio_out_t_n[34]), + .O(GPIO_T[34])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[35]_INST_0 + (.I0(gpio_out_t_n[35]), + .O(GPIO_T[35])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[36]_INST_0 + (.I0(gpio_out_t_n[36]), + .O(GPIO_T[36])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[37]_INST_0 + (.I0(gpio_out_t_n[37]), + .O(GPIO_T[37])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[38]_INST_0 + (.I0(gpio_out_t_n[38]), + .O(GPIO_T[38])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[39]_INST_0 + (.I0(gpio_out_t_n[39]), + .O(GPIO_T[39])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[3]_INST_0 + (.I0(gpio_out_t_n[3]), + .O(GPIO_T[3])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[40]_INST_0 + (.I0(gpio_out_t_n[40]), + .O(GPIO_T[40])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[41]_INST_0 + (.I0(gpio_out_t_n[41]), + .O(GPIO_T[41])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[42]_INST_0 + (.I0(gpio_out_t_n[42]), + .O(GPIO_T[42])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[43]_INST_0 + (.I0(gpio_out_t_n[43]), + .O(GPIO_T[43])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[44]_INST_0 + (.I0(gpio_out_t_n[44]), + .O(GPIO_T[44])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[45]_INST_0 + (.I0(gpio_out_t_n[45]), + .O(GPIO_T[45])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[46]_INST_0 + (.I0(gpio_out_t_n[46]), + .O(GPIO_T[46])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[47]_INST_0 + (.I0(gpio_out_t_n[47]), + .O(GPIO_T[47])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[48]_INST_0 + (.I0(gpio_out_t_n[48]), + .O(GPIO_T[48])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[49]_INST_0 + (.I0(gpio_out_t_n[49]), + .O(GPIO_T[49])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[4]_INST_0 + (.I0(gpio_out_t_n[4]), + .O(GPIO_T[4])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[50]_INST_0 + (.I0(gpio_out_t_n[50]), + .O(GPIO_T[50])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[51]_INST_0 + (.I0(gpio_out_t_n[51]), + .O(GPIO_T[51])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[52]_INST_0 + (.I0(gpio_out_t_n[52]), + .O(GPIO_T[52])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[53]_INST_0 + (.I0(gpio_out_t_n[53]), + .O(GPIO_T[53])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[54]_INST_0 + (.I0(gpio_out_t_n[54]), + .O(GPIO_T[54])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[55]_INST_0 + (.I0(gpio_out_t_n[55]), + .O(GPIO_T[55])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[56]_INST_0 + (.I0(gpio_out_t_n[56]), + .O(GPIO_T[56])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[57]_INST_0 + (.I0(gpio_out_t_n[57]), + .O(GPIO_T[57])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[58]_INST_0 + (.I0(gpio_out_t_n[58]), + .O(GPIO_T[58])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[59]_INST_0 + (.I0(gpio_out_t_n[59]), + .O(GPIO_T[59])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[5]_INST_0 + (.I0(gpio_out_t_n[5]), + .O(GPIO_T[5])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[60]_INST_0 + (.I0(gpio_out_t_n[60]), + .O(GPIO_T[60])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[61]_INST_0 + (.I0(gpio_out_t_n[61]), + .O(GPIO_T[61])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[62]_INST_0 + (.I0(gpio_out_t_n[62]), + .O(GPIO_T[62])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[63]_INST_0 + (.I0(gpio_out_t_n[63]), + .O(GPIO_T[63])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[6]_INST_0 + (.I0(gpio_out_t_n[6]), + .O(GPIO_T[6])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[7]_INST_0 + (.I0(gpio_out_t_n[7]), + .O(GPIO_T[7])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[8]_INST_0 + (.I0(gpio_out_t_n[8]), + .O(GPIO_T[8])); + LUT1 #( + .INIT(2'h1)) + \GPIO_T[9]_INST_0 + (.I0(gpio_out_t_n[9]), + .O(GPIO_T[9])); + LUT1 #( + .INIT(2'h1)) + I2C0_SCL_T_INST_0 + (.I0(I2C0_SCL_T_n), + .O(I2C0_SCL_T)); + LUT1 #( + .INIT(2'h1)) + I2C0_SDA_T_INST_0 + (.I0(I2C0_SDA_T_n), + .O(I2C0_SDA_T)); + LUT1 #( + .INIT(2'h1)) + I2C1_SCL_T_INST_0 + (.I0(I2C1_SCL_T_n), + .O(I2C1_SCL_T)); + LUT1 #( + .INIT(2'h1)) + I2C1_SDA_T_INST_0 + (.I0(I2C1_SDA_T_n), + .O(I2C1_SDA_T)); + (* BOX_TYPE = "PRIMITIVE" *) + PS7 PS7_i + (.DDRA(buffered_DDR_Addr), + .DDRARB(DDR_ARB), + .DDRBA(buffered_DDR_BankAddr), + .DDRCASB(buffered_DDR_CAS_n), + .DDRCKE(buffered_DDR_CKE), + .DDRCKN(buffered_DDR_Clk_n), + .DDRCKP(buffered_DDR_Clk), + .DDRCSB(buffered_DDR_CS_n), + .DDRDM({NLW_PS7_i_DDRDM_UNCONNECTED[3:2],buffered_DDR_DM}), + .DDRDQ({NLW_PS7_i_DDRDQ_UNCONNECTED[31:16],buffered_DDR_DQ}), + .DDRDQSN({NLW_PS7_i_DDRDQSN_UNCONNECTED[3:2],buffered_DDR_DQS_n}), + .DDRDQSP({NLW_PS7_i_DDRDQSP_UNCONNECTED[3:2],buffered_DDR_DQS}), + .DDRDRSTB(buffered_DDR_DRSTB), + .DDRODT(buffered_DDR_ODT), + .DDRRASB(buffered_DDR_RAS_n), + .DDRVRN(buffered_DDR_VRN), + .DDRVRP(buffered_DDR_VRP), + .DDRWEB(buffered_DDR_WEB), + .DMA0ACLK(DMA0_ACLK), + .DMA0DAREADY(DMA0_DAREADY), + .DMA0DATYPE(DMA0_DATYPE), + .DMA0DAVALID(DMA0_DAVALID), + .DMA0DRLAST(DMA0_DRLAST), + .DMA0DRREADY(DMA0_DRREADY), + .DMA0DRTYPE(DMA0_DRTYPE), + .DMA0DRVALID(DMA0_DRVALID), + .DMA0RSTN(DMA0_RSTN), + .DMA1ACLK(DMA1_ACLK), + .DMA1DAREADY(DMA1_DAREADY), + .DMA1DATYPE(DMA1_DATYPE), + .DMA1DAVALID(DMA1_DAVALID), + .DMA1DRLAST(DMA1_DRLAST), + .DMA1DRREADY(DMA1_DRREADY), + .DMA1DRTYPE(DMA1_DRTYPE), + .DMA1DRVALID(DMA1_DRVALID), + .DMA1RSTN(DMA1_RSTN), + .DMA2ACLK(DMA2_ACLK), + .DMA2DAREADY(DMA2_DAREADY), + .DMA2DATYPE(DMA2_DATYPE), + .DMA2DAVALID(DMA2_DAVALID), + .DMA2DRLAST(DMA2_DRLAST), + .DMA2DRREADY(DMA2_DRREADY), + .DMA2DRTYPE(DMA2_DRTYPE), + .DMA2DRVALID(DMA2_DRVALID), + .DMA2RSTN(DMA2_RSTN), + .DMA3ACLK(DMA3_ACLK), + .DMA3DAREADY(DMA3_DAREADY), + .DMA3DATYPE(DMA3_DATYPE), + .DMA3DAVALID(DMA3_DAVALID), + .DMA3DRLAST(DMA3_DRLAST), + .DMA3DRREADY(DMA3_DRREADY), + .DMA3DRTYPE(DMA3_DRTYPE), + .DMA3DRVALID(DMA3_DRVALID), + .DMA3RSTN(DMA3_RSTN), + .EMIOCAN0PHYRX(CAN0_PHY_RX), + .EMIOCAN0PHYTX(CAN0_PHY_TX), + .EMIOCAN1PHYRX(CAN1_PHY_RX), + .EMIOCAN1PHYTX(CAN1_PHY_TX), + .EMIOENET0EXTINTIN(ENET0_EXT_INTIN), + .EMIOENET0GMIICOL(1'b0), + .EMIOENET0GMIICRS(1'b0), + .EMIOENET0GMIIRXCLK(ENET0_GMII_RX_CLK), + .EMIOENET0GMIIRXD({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .EMIOENET0GMIIRXDV(1'b0), + .EMIOENET0GMIIRXER(1'b0), + .EMIOENET0GMIITXCLK(ENET0_GMII_TX_CLK), + .EMIOENET0GMIITXD(NLW_PS7_i_EMIOENET0GMIITXD_UNCONNECTED[7:0]), + .EMIOENET0GMIITXEN(NLW_PS7_i_EMIOENET0GMIITXEN_UNCONNECTED), + .EMIOENET0GMIITXER(NLW_PS7_i_EMIOENET0GMIITXER_UNCONNECTED), + .EMIOENET0MDIOI(ENET0_MDIO_I), + .EMIOENET0MDIOMDC(ENET0_MDIO_MDC), + .EMIOENET0MDIOO(ENET0_MDIO_O), + .EMIOENET0MDIOTN(ENET0_MDIO_T_n), + .EMIOENET0PTPDELAYREQRX(ENET0_PTP_DELAY_REQ_RX), + .EMIOENET0PTPDELAYREQTX(ENET0_PTP_DELAY_REQ_TX), + .EMIOENET0PTPPDELAYREQRX(ENET0_PTP_PDELAY_REQ_RX), + .EMIOENET0PTPPDELAYREQTX(ENET0_PTP_PDELAY_REQ_TX), + .EMIOENET0PTPPDELAYRESPRX(ENET0_PTP_PDELAY_RESP_RX), + .EMIOENET0PTPPDELAYRESPTX(ENET0_PTP_PDELAY_RESP_TX), + .EMIOENET0PTPSYNCFRAMERX(ENET0_PTP_SYNC_FRAME_RX), + .EMIOENET0PTPSYNCFRAMETX(ENET0_PTP_SYNC_FRAME_TX), + .EMIOENET0SOFRX(ENET0_SOF_RX), + .EMIOENET0SOFTX(ENET0_SOF_TX), + .EMIOENET1EXTINTIN(ENET1_EXT_INTIN), + .EMIOENET1GMIICOL(1'b0), + .EMIOENET1GMIICRS(1'b0), + .EMIOENET1GMIIRXCLK(ENET1_GMII_RX_CLK), + .EMIOENET1GMIIRXD({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .EMIOENET1GMIIRXDV(1'b0), + .EMIOENET1GMIIRXER(1'b0), + .EMIOENET1GMIITXCLK(ENET1_GMII_TX_CLK), + .EMIOENET1GMIITXD(NLW_PS7_i_EMIOENET1GMIITXD_UNCONNECTED[7:0]), + .EMIOENET1GMIITXEN(NLW_PS7_i_EMIOENET1GMIITXEN_UNCONNECTED), + .EMIOENET1GMIITXER(NLW_PS7_i_EMIOENET1GMIITXER_UNCONNECTED), + .EMIOENET1MDIOI(ENET1_MDIO_I), + .EMIOENET1MDIOMDC(ENET1_MDIO_MDC), + .EMIOENET1MDIOO(ENET1_MDIO_O), + .EMIOENET1MDIOTN(ENET1_MDIO_T_n), + .EMIOENET1PTPDELAYREQRX(ENET1_PTP_DELAY_REQ_RX), + .EMIOENET1PTPDELAYREQTX(ENET1_PTP_DELAY_REQ_TX), + .EMIOENET1PTPPDELAYREQRX(ENET1_PTP_PDELAY_REQ_RX), + .EMIOENET1PTPPDELAYREQTX(ENET1_PTP_PDELAY_REQ_TX), + .EMIOENET1PTPPDELAYRESPRX(ENET1_PTP_PDELAY_RESP_RX), + .EMIOENET1PTPPDELAYRESPTX(ENET1_PTP_PDELAY_RESP_TX), + .EMIOENET1PTPSYNCFRAMERX(ENET1_PTP_SYNC_FRAME_RX), + .EMIOENET1PTPSYNCFRAMETX(ENET1_PTP_SYNC_FRAME_TX), + .EMIOENET1SOFRX(ENET1_SOF_RX), + .EMIOENET1SOFTX(ENET1_SOF_TX), + .EMIOGPIOI(GPIO_I), + .EMIOGPIOO(GPIO_O), + .EMIOGPIOTN(gpio_out_t_n), + .EMIOI2C0SCLI(I2C0_SCL_I), + .EMIOI2C0SCLO(I2C0_SCL_O), + .EMIOI2C0SCLTN(I2C0_SCL_T_n), + .EMIOI2C0SDAI(I2C0_SDA_I), + .EMIOI2C0SDAO(I2C0_SDA_O), + .EMIOI2C0SDATN(I2C0_SDA_T_n), + .EMIOI2C1SCLI(I2C1_SCL_I), + .EMIOI2C1SCLO(I2C1_SCL_O), + .EMIOI2C1SCLTN(I2C1_SCL_T_n), + .EMIOI2C1SDAI(I2C1_SDA_I), + .EMIOI2C1SDAO(I2C1_SDA_O), + .EMIOI2C1SDATN(I2C1_SDA_T_n), + .EMIOPJTAGTCK(PJTAG_TCK), + .EMIOPJTAGTDI(PJTAG_TDI), + .EMIOPJTAGTDO(NLW_PS7_i_EMIOPJTAGTDO_UNCONNECTED), + .EMIOPJTAGTDTN(NLW_PS7_i_EMIOPJTAGTDTN_UNCONNECTED), + .EMIOPJTAGTMS(PJTAG_TMS), + .EMIOSDIO0BUSPOW(SDIO0_BUSPOW), + .EMIOSDIO0BUSVOLT(SDIO0_BUSVOLT), + .EMIOSDIO0CDN(SDIO0_CDN), + .EMIOSDIO0CLK(SDIO0_CLK), + .EMIOSDIO0CLKFB(SDIO0_CLK_FB), + .EMIOSDIO0CMDI(SDIO0_CMD_I), + .EMIOSDIO0CMDO(SDIO0_CMD_O), + .EMIOSDIO0CMDTN(SDIO0_CMD_T_n), + .EMIOSDIO0DATAI(SDIO0_DATA_I), + .EMIOSDIO0DATAO(SDIO0_DATA_O), + .EMIOSDIO0DATATN(SDIO0_DATA_T_n), + .EMIOSDIO0LED(SDIO0_LED), + .EMIOSDIO0WP(SDIO0_WP), + .EMIOSDIO1BUSPOW(SDIO1_BUSPOW), + .EMIOSDIO1BUSVOLT(SDIO1_BUSVOLT), + .EMIOSDIO1CDN(SDIO1_CDN), + .EMIOSDIO1CLK(SDIO1_CLK), + .EMIOSDIO1CLKFB(SDIO1_CLK_FB), + .EMIOSDIO1CMDI(SDIO1_CMD_I), + .EMIOSDIO1CMDO(SDIO1_CMD_O), + .EMIOSDIO1CMDTN(SDIO1_CMD_T_n), + .EMIOSDIO1DATAI(SDIO1_DATA_I), + .EMIOSDIO1DATAO(SDIO1_DATA_O), + .EMIOSDIO1DATATN(SDIO1_DATA_T_n), + .EMIOSDIO1LED(SDIO1_LED), + .EMIOSDIO1WP(SDIO1_WP), + .EMIOSPI0MI(SPI0_MISO_I), + .EMIOSPI0MO(SPI0_MOSI_O), + .EMIOSPI0MOTN(SPI0_MOSI_T_n), + .EMIOSPI0SCLKI(SPI0_SCLK_I), + .EMIOSPI0SCLKO(SPI0_SCLK_O), + .EMIOSPI0SCLKTN(SPI0_SCLK_T_n), + .EMIOSPI0SI(SPI0_MOSI_I), + .EMIOSPI0SO(SPI0_MISO_O), + .EMIOSPI0SSIN(SPI0_SS_I), + .EMIOSPI0SSNTN(SPI0_SS_T_n), + .EMIOSPI0SSON({SPI0_SS2_O,SPI0_SS1_O,SPI0_SS_O}), + .EMIOSPI0STN(SPI0_MISO_T_n), + .EMIOSPI1MI(SPI1_MISO_I), + .EMIOSPI1MO(SPI1_MOSI_O), + .EMIOSPI1MOTN(SPI1_MOSI_T_n), + .EMIOSPI1SCLKI(SPI1_SCLK_I), + .EMIOSPI1SCLKO(SPI1_SCLK_O), + .EMIOSPI1SCLKTN(SPI1_SCLK_T_n), + .EMIOSPI1SI(SPI1_MOSI_I), + .EMIOSPI1SO(SPI1_MISO_O), + .EMIOSPI1SSIN(SPI1_SS_I), + .EMIOSPI1SSNTN(SPI1_SS_T_n), + .EMIOSPI1SSON({SPI1_SS2_O,SPI1_SS1_O,SPI1_SS_O}), + .EMIOSPI1STN(SPI1_MISO_T_n), + .EMIOSRAMINTIN(SRAM_INTIN), + .EMIOTRACECLK(TRACE_CLK), + .EMIOTRACECTL(NLW_PS7_i_EMIOTRACECTL_UNCONNECTED), + .EMIOTRACEDATA(NLW_PS7_i_EMIOTRACEDATA_UNCONNECTED[31:0]), + .EMIOTTC0CLKI({TTC0_CLK2_IN,TTC0_CLK1_IN,TTC0_CLK0_IN}), + .EMIOTTC0WAVEO({TTC0_WAVE2_OUT,TTC0_WAVE1_OUT,TTC0_WAVE0_OUT}), + .EMIOTTC1CLKI({TTC1_CLK2_IN,TTC1_CLK1_IN,TTC1_CLK0_IN}), + .EMIOTTC1WAVEO({TTC1_WAVE2_OUT,TTC1_WAVE1_OUT,TTC1_WAVE0_OUT}), + .EMIOUART0CTSN(UART0_CTSN), + .EMIOUART0DCDN(UART0_DCDN), + .EMIOUART0DSRN(UART0_DSRN), + .EMIOUART0DTRN(UART0_DTRN), + .EMIOUART0RIN(UART0_RIN), + .EMIOUART0RTSN(UART0_RTSN), + .EMIOUART0RX(UART0_RX), + .EMIOUART0TX(UART0_TX), + .EMIOUART1CTSN(UART1_CTSN), + .EMIOUART1DCDN(UART1_DCDN), + .EMIOUART1DSRN(UART1_DSRN), + .EMIOUART1DTRN(UART1_DTRN), + .EMIOUART1RIN(UART1_RIN), + .EMIOUART1RTSN(UART1_RTSN), + .EMIOUART1RX(UART1_RX), + .EMIOUART1TX(UART1_TX), + .EMIOUSB0PORTINDCTL(USB0_PORT_INDCTL), + .EMIOUSB0VBUSPWRFAULT(USB0_VBUS_PWRFAULT), + .EMIOUSB0VBUSPWRSELECT(USB0_VBUS_PWRSELECT), + .EMIOUSB1PORTINDCTL(USB1_PORT_INDCTL), + .EMIOUSB1VBUSPWRFAULT(USB1_VBUS_PWRFAULT), + .EMIOUSB1VBUSPWRSELECT(USB1_VBUS_PWRSELECT), + .EMIOWDTCLKI(WDT_CLK_IN), + .EMIOWDTRSTO(WDT_RST_OUT), + .EVENTEVENTI(EVENT_EVENTI), + .EVENTEVENTO(EVENT_EVENTO), + .EVENTSTANDBYWFE(EVENT_STANDBYWFE), + .EVENTSTANDBYWFI(EVENT_STANDBYWFI), + .FCLKCLK({FCLK_CLK3,FCLK_CLK2,FCLK_CLK_unbuffered}), + .FCLKCLKTRIGN({1'b0,1'b0,1'b0,1'b0}), + .FCLKRESETN({FCLK_RESET3_N,FCLK_RESET2_N,FCLK_RESET1_N,FCLK_RESET0_N}), + .FPGAIDLEN(FPGA_IDLE_N), + .FTMDTRACEINATID({1'b0,1'b0,1'b0,1'b0}), + .FTMDTRACEINCLOCK(FTMD_TRACEIN_CLK), + .FTMDTRACEINDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .FTMDTRACEINVALID(1'b0), + .FTMTF2PDEBUG(FTMT_F2P_DEBUG), + .FTMTF2PTRIG({FTMT_F2P_TRIG_3,FTMT_F2P_TRIG_2,FTMT_F2P_TRIG_1,FTMT_F2P_TRIG_0}), + .FTMTF2PTRIGACK({FTMT_F2P_TRIGACK_3,FTMT_F2P_TRIGACK_2,FTMT_F2P_TRIGACK_1,FTMT_F2P_TRIGACK_0}), + .FTMTP2FDEBUG(FTMT_P2F_DEBUG), + .FTMTP2FTRIG({FTMT_P2F_TRIG_3,FTMT_P2F_TRIG_2,FTMT_P2F_TRIG_1,FTMT_P2F_TRIG_0}), + .FTMTP2FTRIGACK({FTMT_P2F_TRIGACK_3,FTMT_P2F_TRIGACK_2,FTMT_P2F_TRIGACK_1,FTMT_P2F_TRIGACK_0}), + .IRQF2P({Core1_nFIQ,Core0_nFIQ,Core1_nIRQ,Core0_nIRQ,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,IRQ_F2P}), + .IRQP2F({IRQ_P2F_DMAC_ABORT,IRQ_P2F_DMAC7,IRQ_P2F_DMAC6,IRQ_P2F_DMAC5,IRQ_P2F_DMAC4,IRQ_P2F_DMAC3,IRQ_P2F_DMAC2,IRQ_P2F_DMAC1,IRQ_P2F_DMAC0,IRQ_P2F_SMC,IRQ_P2F_QSPI,IRQ_P2F_CTI,IRQ_P2F_GPIO,IRQ_P2F_USB0,IRQ_P2F_ENET0,IRQ_P2F_ENET_WAKE0,IRQ_P2F_SDIO0,IRQ_P2F_I2C0,IRQ_P2F_SPI0,IRQ_P2F_UART0,IRQ_P2F_CAN0,IRQ_P2F_USB1,IRQ_P2F_ENET1,IRQ_P2F_ENET_WAKE1,IRQ_P2F_SDIO1,IRQ_P2F_I2C1,IRQ_P2F_SPI1,IRQ_P2F_UART1,IRQ_P2F_CAN1}), + .MAXIGP0ACLK(M_AXI_GP0_ACLK), + .MAXIGP0ARADDR(M_AXI_GP0_ARADDR), + .MAXIGP0ARBURST(M_AXI_GP0_ARBURST), + .MAXIGP0ARCACHE(\^M_AXI_GP0_ARCACHE ), + .MAXIGP0ARESETN(M_AXI_GP0_ARESETN), + .MAXIGP0ARID(M_AXI_GP0_ARID), + .MAXIGP0ARLEN(M_AXI_GP0_ARLEN), + .MAXIGP0ARLOCK(M_AXI_GP0_ARLOCK), + .MAXIGP0ARPROT(M_AXI_GP0_ARPROT), + .MAXIGP0ARQOS(M_AXI_GP0_ARQOS), + .MAXIGP0ARREADY(M_AXI_GP0_ARREADY), + .MAXIGP0ARSIZE(\^M_AXI_GP0_ARSIZE ), + .MAXIGP0ARVALID(M_AXI_GP0_ARVALID), + .MAXIGP0AWADDR(M_AXI_GP0_AWADDR), + .MAXIGP0AWBURST(M_AXI_GP0_AWBURST), + .MAXIGP0AWCACHE(\^M_AXI_GP0_AWCACHE ), + .MAXIGP0AWID(M_AXI_GP0_AWID), + .MAXIGP0AWLEN(M_AXI_GP0_AWLEN), + .MAXIGP0AWLOCK(M_AXI_GP0_AWLOCK), + .MAXIGP0AWPROT(M_AXI_GP0_AWPROT), + .MAXIGP0AWQOS(M_AXI_GP0_AWQOS), + .MAXIGP0AWREADY(M_AXI_GP0_AWREADY), + .MAXIGP0AWSIZE(\^M_AXI_GP0_AWSIZE ), + .MAXIGP0AWVALID(M_AXI_GP0_AWVALID), + .MAXIGP0BID(M_AXI_GP0_BID), + .MAXIGP0BREADY(M_AXI_GP0_BREADY), + .MAXIGP0BRESP(M_AXI_GP0_BRESP), + .MAXIGP0BVALID(M_AXI_GP0_BVALID), + .MAXIGP0RDATA(M_AXI_GP0_RDATA), + .MAXIGP0RID(M_AXI_GP0_RID), + .MAXIGP0RLAST(M_AXI_GP0_RLAST), + .MAXIGP0RREADY(M_AXI_GP0_RREADY), + .MAXIGP0RRESP(M_AXI_GP0_RRESP), + .MAXIGP0RVALID(M_AXI_GP0_RVALID), + .MAXIGP0WDATA(M_AXI_GP0_WDATA), + .MAXIGP0WID(M_AXI_GP0_WID), + .MAXIGP0WLAST(M_AXI_GP0_WLAST), + .MAXIGP0WREADY(M_AXI_GP0_WREADY), + .MAXIGP0WSTRB(M_AXI_GP0_WSTRB), + .MAXIGP0WVALID(M_AXI_GP0_WVALID), + .MAXIGP1ACLK(M_AXI_GP1_ACLK), + .MAXIGP1ARADDR(M_AXI_GP1_ARADDR), + .MAXIGP1ARBURST(M_AXI_GP1_ARBURST), + .MAXIGP1ARCACHE(\^M_AXI_GP1_ARCACHE ), + .MAXIGP1ARESETN(M_AXI_GP1_ARESETN), + .MAXIGP1ARID(M_AXI_GP1_ARID), + .MAXIGP1ARLEN(M_AXI_GP1_ARLEN), + .MAXIGP1ARLOCK(M_AXI_GP1_ARLOCK), + .MAXIGP1ARPROT(M_AXI_GP1_ARPROT), + .MAXIGP1ARQOS(M_AXI_GP1_ARQOS), + .MAXIGP1ARREADY(M_AXI_GP1_ARREADY), + .MAXIGP1ARSIZE(\^M_AXI_GP1_ARSIZE ), + .MAXIGP1ARVALID(M_AXI_GP1_ARVALID), + .MAXIGP1AWADDR(M_AXI_GP1_AWADDR), + .MAXIGP1AWBURST(M_AXI_GP1_AWBURST), + .MAXIGP1AWCACHE(\^M_AXI_GP1_AWCACHE ), + .MAXIGP1AWID(M_AXI_GP1_AWID), + .MAXIGP1AWLEN(M_AXI_GP1_AWLEN), + .MAXIGP1AWLOCK(M_AXI_GP1_AWLOCK), + .MAXIGP1AWPROT(M_AXI_GP1_AWPROT), + .MAXIGP1AWQOS(M_AXI_GP1_AWQOS), + .MAXIGP1AWREADY(M_AXI_GP1_AWREADY), + .MAXIGP1AWSIZE(\^M_AXI_GP1_AWSIZE ), + .MAXIGP1AWVALID(M_AXI_GP1_AWVALID), + .MAXIGP1BID(M_AXI_GP1_BID), + .MAXIGP1BREADY(M_AXI_GP1_BREADY), + .MAXIGP1BRESP(M_AXI_GP1_BRESP), + .MAXIGP1BVALID(M_AXI_GP1_BVALID), + .MAXIGP1RDATA(M_AXI_GP1_RDATA), + .MAXIGP1RID(M_AXI_GP1_RID), + .MAXIGP1RLAST(M_AXI_GP1_RLAST), + .MAXIGP1RREADY(M_AXI_GP1_RREADY), + .MAXIGP1RRESP(M_AXI_GP1_RRESP), + .MAXIGP1RVALID(M_AXI_GP1_RVALID), + .MAXIGP1WDATA(M_AXI_GP1_WDATA), + .MAXIGP1WID(M_AXI_GP1_WID), + .MAXIGP1WLAST(M_AXI_GP1_WLAST), + .MAXIGP1WREADY(M_AXI_GP1_WREADY), + .MAXIGP1WSTRB(M_AXI_GP1_WSTRB), + .MAXIGP1WVALID(M_AXI_GP1_WVALID), + .MIO({buffered_MIO[31:30],NLW_PS7_i_MIO_UNCONNECTED[51:50],buffered_MIO[29:28],NLW_PS7_i_MIO_UNCONNECTED[47:40],buffered_MIO[27:16],NLW_PS7_i_MIO_UNCONNECTED[27:16],buffered_MIO[15:0]}), + .PSCLK(buffered_PS_CLK), + .PSPORB(buffered_PS_PORB), + .PSSRSTB(buffered_PS_SRSTB), + .SAXIACPACLK(S_AXI_ACP_ACLK), + .SAXIACPARADDR(S_AXI_ACP_ARADDR), + .SAXIACPARBURST(S_AXI_ACP_ARBURST), + .SAXIACPARCACHE(S_AXI_ACP_ARCACHE), + .SAXIACPARESETN(S_AXI_ACP_ARESETN), + .SAXIACPARID(S_AXI_ACP_ARID), + .SAXIACPARLEN(S_AXI_ACP_ARLEN), + .SAXIACPARLOCK(S_AXI_ACP_ARLOCK), + .SAXIACPARPROT(S_AXI_ACP_ARPROT), + .SAXIACPARQOS(S_AXI_ACP_ARQOS), + .SAXIACPARREADY(S_AXI_ACP_ARREADY), + .SAXIACPARSIZE(S_AXI_ACP_ARSIZE[1:0]), + .SAXIACPARUSER(S_AXI_ACP_ARUSER), + .SAXIACPARVALID(S_AXI_ACP_ARVALID), + .SAXIACPAWADDR(S_AXI_ACP_AWADDR), + .SAXIACPAWBURST(S_AXI_ACP_AWBURST), + .SAXIACPAWCACHE(S_AXI_ACP_AWCACHE), + .SAXIACPAWID(S_AXI_ACP_AWID), + .SAXIACPAWLEN(S_AXI_ACP_AWLEN), + .SAXIACPAWLOCK(S_AXI_ACP_AWLOCK), + .SAXIACPAWPROT(S_AXI_ACP_AWPROT), + .SAXIACPAWQOS(S_AXI_ACP_AWQOS), + .SAXIACPAWREADY(S_AXI_ACP_AWREADY), + .SAXIACPAWSIZE(S_AXI_ACP_AWSIZE[1:0]), + .SAXIACPAWUSER(S_AXI_ACP_AWUSER), + .SAXIACPAWVALID(S_AXI_ACP_AWVALID), + .SAXIACPBID(S_AXI_ACP_BID), + .SAXIACPBREADY(S_AXI_ACP_BREADY), + .SAXIACPBRESP(S_AXI_ACP_BRESP), + .SAXIACPBVALID(S_AXI_ACP_BVALID), + .SAXIACPRDATA(S_AXI_ACP_RDATA), + .SAXIACPRID(S_AXI_ACP_RID), + .SAXIACPRLAST(S_AXI_ACP_RLAST), + .SAXIACPRREADY(S_AXI_ACP_RREADY), + .SAXIACPRRESP(S_AXI_ACP_RRESP), + .SAXIACPRVALID(S_AXI_ACP_RVALID), + .SAXIACPWDATA(S_AXI_ACP_WDATA), + .SAXIACPWID(S_AXI_ACP_WID), + .SAXIACPWLAST(S_AXI_ACP_WLAST), + .SAXIACPWREADY(S_AXI_ACP_WREADY), + .SAXIACPWSTRB(S_AXI_ACP_WSTRB), + .SAXIACPWVALID(S_AXI_ACP_WVALID), + .SAXIGP0ACLK(S_AXI_GP0_ACLK), + .SAXIGP0ARADDR(S_AXI_GP0_ARADDR), + .SAXIGP0ARBURST(S_AXI_GP0_ARBURST), + .SAXIGP0ARCACHE(S_AXI_GP0_ARCACHE), + .SAXIGP0ARESETN(S_AXI_GP0_ARESETN), + .SAXIGP0ARID(S_AXI_GP0_ARID), + .SAXIGP0ARLEN(S_AXI_GP0_ARLEN), + .SAXIGP0ARLOCK(S_AXI_GP0_ARLOCK), + .SAXIGP0ARPROT(S_AXI_GP0_ARPROT), + .SAXIGP0ARQOS(S_AXI_GP0_ARQOS), + .SAXIGP0ARREADY(S_AXI_GP0_ARREADY), + .SAXIGP0ARSIZE(S_AXI_GP0_ARSIZE[1:0]), + .SAXIGP0ARVALID(S_AXI_GP0_ARVALID), + .SAXIGP0AWADDR(S_AXI_GP0_AWADDR), + .SAXIGP0AWBURST(S_AXI_GP0_AWBURST), + .SAXIGP0AWCACHE(S_AXI_GP0_AWCACHE), + .SAXIGP0AWID(S_AXI_GP0_AWID), + .SAXIGP0AWLEN(S_AXI_GP0_AWLEN), + .SAXIGP0AWLOCK(S_AXI_GP0_AWLOCK), + .SAXIGP0AWPROT(S_AXI_GP0_AWPROT), + .SAXIGP0AWQOS(S_AXI_GP0_AWQOS), + .SAXIGP0AWREADY(S_AXI_GP0_AWREADY), + .SAXIGP0AWSIZE(S_AXI_GP0_AWSIZE[1:0]), + .SAXIGP0AWVALID(S_AXI_GP0_AWVALID), + .SAXIGP0BID(S_AXI_GP0_BID), + .SAXIGP0BREADY(S_AXI_GP0_BREADY), + .SAXIGP0BRESP(S_AXI_GP0_BRESP), + .SAXIGP0BVALID(S_AXI_GP0_BVALID), + .SAXIGP0RDATA(S_AXI_GP0_RDATA), + .SAXIGP0RID(S_AXI_GP0_RID), + .SAXIGP0RLAST(S_AXI_GP0_RLAST), + .SAXIGP0RREADY(S_AXI_GP0_RREADY), + .SAXIGP0RRESP(S_AXI_GP0_RRESP), + .SAXIGP0RVALID(S_AXI_GP0_RVALID), + .SAXIGP0WDATA(S_AXI_GP0_WDATA), + .SAXIGP0WID(S_AXI_GP0_WID), + .SAXIGP0WLAST(S_AXI_GP0_WLAST), + .SAXIGP0WREADY(S_AXI_GP0_WREADY), + .SAXIGP0WSTRB(S_AXI_GP0_WSTRB), + .SAXIGP0WVALID(S_AXI_GP0_WVALID), + .SAXIGP1ACLK(S_AXI_GP1_ACLK), + .SAXIGP1ARADDR(S_AXI_GP1_ARADDR), + .SAXIGP1ARBURST(S_AXI_GP1_ARBURST), + .SAXIGP1ARCACHE(S_AXI_GP1_ARCACHE), + .SAXIGP1ARESETN(S_AXI_GP1_ARESETN), + .SAXIGP1ARID(S_AXI_GP1_ARID), + .SAXIGP1ARLEN(S_AXI_GP1_ARLEN), + .SAXIGP1ARLOCK(S_AXI_GP1_ARLOCK), + .SAXIGP1ARPROT(S_AXI_GP1_ARPROT), + .SAXIGP1ARQOS(S_AXI_GP1_ARQOS), + .SAXIGP1ARREADY(S_AXI_GP1_ARREADY), + .SAXIGP1ARSIZE(S_AXI_GP1_ARSIZE[1:0]), + .SAXIGP1ARVALID(S_AXI_GP1_ARVALID), + .SAXIGP1AWADDR(S_AXI_GP1_AWADDR), + .SAXIGP1AWBURST(S_AXI_GP1_AWBURST), + .SAXIGP1AWCACHE(S_AXI_GP1_AWCACHE), + .SAXIGP1AWID(S_AXI_GP1_AWID), + .SAXIGP1AWLEN(S_AXI_GP1_AWLEN), + .SAXIGP1AWLOCK(S_AXI_GP1_AWLOCK), + .SAXIGP1AWPROT(S_AXI_GP1_AWPROT), + .SAXIGP1AWQOS(S_AXI_GP1_AWQOS), + .SAXIGP1AWREADY(S_AXI_GP1_AWREADY), + .SAXIGP1AWSIZE(S_AXI_GP1_AWSIZE[1:0]), + .SAXIGP1AWVALID(S_AXI_GP1_AWVALID), + .SAXIGP1BID(S_AXI_GP1_BID), + .SAXIGP1BREADY(S_AXI_GP1_BREADY), + .SAXIGP1BRESP(S_AXI_GP1_BRESP), + .SAXIGP1BVALID(S_AXI_GP1_BVALID), + .SAXIGP1RDATA(S_AXI_GP1_RDATA), + .SAXIGP1RID(S_AXI_GP1_RID), + .SAXIGP1RLAST(S_AXI_GP1_RLAST), + .SAXIGP1RREADY(S_AXI_GP1_RREADY), + .SAXIGP1RRESP(S_AXI_GP1_RRESP), + .SAXIGP1RVALID(S_AXI_GP1_RVALID), + .SAXIGP1WDATA(S_AXI_GP1_WDATA), + .SAXIGP1WID(S_AXI_GP1_WID), + .SAXIGP1WLAST(S_AXI_GP1_WLAST), + .SAXIGP1WREADY(S_AXI_GP1_WREADY), + .SAXIGP1WSTRB(S_AXI_GP1_WSTRB), + .SAXIGP1WVALID(S_AXI_GP1_WVALID), + .SAXIHP0ACLK(S_AXI_HP0_ACLK), + .SAXIHP0ARADDR(S_AXI_HP0_ARADDR), + .SAXIHP0ARBURST(S_AXI_HP0_ARBURST), + .SAXIHP0ARCACHE(S_AXI_HP0_ARCACHE), + .SAXIHP0ARESETN(S_AXI_HP0_ARESETN), + .SAXIHP0ARID(S_AXI_HP0_ARID), + .SAXIHP0ARLEN(S_AXI_HP0_ARLEN), + .SAXIHP0ARLOCK(S_AXI_HP0_ARLOCK), + .SAXIHP0ARPROT(S_AXI_HP0_ARPROT), + .SAXIHP0ARQOS(S_AXI_HP0_ARQOS), + .SAXIHP0ARREADY(S_AXI_HP0_ARREADY), + .SAXIHP0ARSIZE(S_AXI_HP0_ARSIZE[1:0]), + .SAXIHP0ARVALID(S_AXI_HP0_ARVALID), + .SAXIHP0AWADDR(S_AXI_HP0_AWADDR), + .SAXIHP0AWBURST(S_AXI_HP0_AWBURST), + .SAXIHP0AWCACHE(S_AXI_HP0_AWCACHE), + .SAXIHP0AWID(S_AXI_HP0_AWID), + .SAXIHP0AWLEN(S_AXI_HP0_AWLEN), + .SAXIHP0AWLOCK(S_AXI_HP0_AWLOCK), + .SAXIHP0AWPROT(S_AXI_HP0_AWPROT), + .SAXIHP0AWQOS(S_AXI_HP0_AWQOS), + .SAXIHP0AWREADY(S_AXI_HP0_AWREADY), + .SAXIHP0AWSIZE(S_AXI_HP0_AWSIZE[1:0]), + .SAXIHP0AWVALID(S_AXI_HP0_AWVALID), + .SAXIHP0BID(S_AXI_HP0_BID), + .SAXIHP0BREADY(S_AXI_HP0_BREADY), + .SAXIHP0BRESP(S_AXI_HP0_BRESP), + .SAXIHP0BVALID(S_AXI_HP0_BVALID), + .SAXIHP0RACOUNT(S_AXI_HP0_RACOUNT), + .SAXIHP0RCOUNT(S_AXI_HP0_RCOUNT), + .SAXIHP0RDATA(S_AXI_HP0_RDATA), + .SAXIHP0RDISSUECAP1EN(S_AXI_HP0_RDISSUECAP1_EN), + .SAXIHP0RID(S_AXI_HP0_RID), + .SAXIHP0RLAST(S_AXI_HP0_RLAST), + .SAXIHP0RREADY(S_AXI_HP0_RREADY), + .SAXIHP0RRESP(S_AXI_HP0_RRESP), + .SAXIHP0RVALID(S_AXI_HP0_RVALID), + .SAXIHP0WACOUNT(S_AXI_HP0_WACOUNT), + .SAXIHP0WCOUNT(S_AXI_HP0_WCOUNT), + .SAXIHP0WDATA(S_AXI_HP0_WDATA), + .SAXIHP0WID(S_AXI_HP0_WID), + .SAXIHP0WLAST(S_AXI_HP0_WLAST), + .SAXIHP0WREADY(S_AXI_HP0_WREADY), + .SAXIHP0WRISSUECAP1EN(S_AXI_HP0_WRISSUECAP1_EN), + .SAXIHP0WSTRB(S_AXI_HP0_WSTRB), + .SAXIHP0WVALID(S_AXI_HP0_WVALID), + .SAXIHP1ACLK(S_AXI_HP1_ACLK), + .SAXIHP1ARADDR(S_AXI_HP1_ARADDR), + .SAXIHP1ARBURST(S_AXI_HP1_ARBURST), + .SAXIHP1ARCACHE(S_AXI_HP1_ARCACHE), + .SAXIHP1ARESETN(S_AXI_HP1_ARESETN), + .SAXIHP1ARID(S_AXI_HP1_ARID), + .SAXIHP1ARLEN(S_AXI_HP1_ARLEN), + .SAXIHP1ARLOCK(S_AXI_HP1_ARLOCK), + .SAXIHP1ARPROT(S_AXI_HP1_ARPROT), + .SAXIHP1ARQOS(S_AXI_HP1_ARQOS), + .SAXIHP1ARREADY(S_AXI_HP1_ARREADY), + .SAXIHP1ARSIZE(S_AXI_HP1_ARSIZE[1:0]), + .SAXIHP1ARVALID(S_AXI_HP1_ARVALID), + .SAXIHP1AWADDR(S_AXI_HP1_AWADDR), + .SAXIHP1AWBURST(S_AXI_HP1_AWBURST), + .SAXIHP1AWCACHE(S_AXI_HP1_AWCACHE), + .SAXIHP1AWID(S_AXI_HP1_AWID), + .SAXIHP1AWLEN(S_AXI_HP1_AWLEN), + .SAXIHP1AWLOCK(S_AXI_HP1_AWLOCK), + .SAXIHP1AWPROT(S_AXI_HP1_AWPROT), + .SAXIHP1AWQOS(S_AXI_HP1_AWQOS), + .SAXIHP1AWREADY(S_AXI_HP1_AWREADY), + .SAXIHP1AWSIZE(S_AXI_HP1_AWSIZE[1:0]), + .SAXIHP1AWVALID(S_AXI_HP1_AWVALID), + .SAXIHP1BID(S_AXI_HP1_BID), + .SAXIHP1BREADY(S_AXI_HP1_BREADY), + .SAXIHP1BRESP(S_AXI_HP1_BRESP), + .SAXIHP1BVALID(S_AXI_HP1_BVALID), + .SAXIHP1RACOUNT(S_AXI_HP1_RACOUNT), + .SAXIHP1RCOUNT(S_AXI_HP1_RCOUNT), + .SAXIHP1RDATA(S_AXI_HP1_RDATA), + .SAXIHP1RDISSUECAP1EN(S_AXI_HP1_RDISSUECAP1_EN), + .SAXIHP1RID(S_AXI_HP1_RID), + .SAXIHP1RLAST(S_AXI_HP1_RLAST), + .SAXIHP1RREADY(S_AXI_HP1_RREADY), + .SAXIHP1RRESP(S_AXI_HP1_RRESP), + .SAXIHP1RVALID(S_AXI_HP1_RVALID), + .SAXIHP1WACOUNT(S_AXI_HP1_WACOUNT), + .SAXIHP1WCOUNT(S_AXI_HP1_WCOUNT), + .SAXIHP1WDATA(S_AXI_HP1_WDATA), + .SAXIHP1WID(S_AXI_HP1_WID), + .SAXIHP1WLAST(S_AXI_HP1_WLAST), + .SAXIHP1WREADY(S_AXI_HP1_WREADY), + .SAXIHP1WRISSUECAP1EN(S_AXI_HP1_WRISSUECAP1_EN), + .SAXIHP1WSTRB(S_AXI_HP1_WSTRB), + .SAXIHP1WVALID(S_AXI_HP1_WVALID), + .SAXIHP2ACLK(S_AXI_HP2_ACLK), + .SAXIHP2ARADDR(S_AXI_HP2_ARADDR), + .SAXIHP2ARBURST(S_AXI_HP2_ARBURST), + .SAXIHP2ARCACHE(S_AXI_HP2_ARCACHE), + .SAXIHP2ARESETN(S_AXI_HP2_ARESETN), + .SAXIHP2ARID(S_AXI_HP2_ARID), + .SAXIHP2ARLEN(S_AXI_HP2_ARLEN), + .SAXIHP2ARLOCK(S_AXI_HP2_ARLOCK), + .SAXIHP2ARPROT(S_AXI_HP2_ARPROT), + .SAXIHP2ARQOS(S_AXI_HP2_ARQOS), + .SAXIHP2ARREADY(S_AXI_HP2_ARREADY), + .SAXIHP2ARSIZE(S_AXI_HP2_ARSIZE[1:0]), + .SAXIHP2ARVALID(S_AXI_HP2_ARVALID), + .SAXIHP2AWADDR(S_AXI_HP2_AWADDR), + .SAXIHP2AWBURST(S_AXI_HP2_AWBURST), + .SAXIHP2AWCACHE(S_AXI_HP2_AWCACHE), + .SAXIHP2AWID(S_AXI_HP2_AWID), + .SAXIHP2AWLEN(S_AXI_HP2_AWLEN), + .SAXIHP2AWLOCK(S_AXI_HP2_AWLOCK), + .SAXIHP2AWPROT(S_AXI_HP2_AWPROT), + .SAXIHP2AWQOS(S_AXI_HP2_AWQOS), + .SAXIHP2AWREADY(S_AXI_HP2_AWREADY), + .SAXIHP2AWSIZE(S_AXI_HP2_AWSIZE[1:0]), + .SAXIHP2AWVALID(S_AXI_HP2_AWVALID), + .SAXIHP2BID(S_AXI_HP2_BID), + .SAXIHP2BREADY(S_AXI_HP2_BREADY), + .SAXIHP2BRESP(S_AXI_HP2_BRESP), + .SAXIHP2BVALID(S_AXI_HP2_BVALID), + .SAXIHP2RACOUNT(S_AXI_HP2_RACOUNT), + .SAXIHP2RCOUNT(S_AXI_HP2_RCOUNT), + .SAXIHP2RDATA(S_AXI_HP2_RDATA), + .SAXIHP2RDISSUECAP1EN(S_AXI_HP2_RDISSUECAP1_EN), + .SAXIHP2RID(S_AXI_HP2_RID), + .SAXIHP2RLAST(S_AXI_HP2_RLAST), + .SAXIHP2RREADY(S_AXI_HP2_RREADY), + .SAXIHP2RRESP(S_AXI_HP2_RRESP), + .SAXIHP2RVALID(S_AXI_HP2_RVALID), + .SAXIHP2WACOUNT(S_AXI_HP2_WACOUNT), + .SAXIHP2WCOUNT(S_AXI_HP2_WCOUNT), + .SAXIHP2WDATA(S_AXI_HP2_WDATA), + .SAXIHP2WID(S_AXI_HP2_WID), + .SAXIHP2WLAST(S_AXI_HP2_WLAST), + .SAXIHP2WREADY(S_AXI_HP2_WREADY), + .SAXIHP2WRISSUECAP1EN(S_AXI_HP2_WRISSUECAP1_EN), + .SAXIHP2WSTRB(S_AXI_HP2_WSTRB), + .SAXIHP2WVALID(S_AXI_HP2_WVALID), + .SAXIHP3ACLK(S_AXI_HP3_ACLK), + .SAXIHP3ARADDR(S_AXI_HP3_ARADDR), + .SAXIHP3ARBURST(S_AXI_HP3_ARBURST), + .SAXIHP3ARCACHE(S_AXI_HP3_ARCACHE), + .SAXIHP3ARESETN(S_AXI_HP3_ARESETN), + .SAXIHP3ARID(S_AXI_HP3_ARID), + .SAXIHP3ARLEN(S_AXI_HP3_ARLEN), + .SAXIHP3ARLOCK(S_AXI_HP3_ARLOCK), + .SAXIHP3ARPROT(S_AXI_HP3_ARPROT), + .SAXIHP3ARQOS(S_AXI_HP3_ARQOS), + .SAXIHP3ARREADY(S_AXI_HP3_ARREADY), + .SAXIHP3ARSIZE(S_AXI_HP3_ARSIZE[1:0]), + .SAXIHP3ARVALID(S_AXI_HP3_ARVALID), + .SAXIHP3AWADDR(S_AXI_HP3_AWADDR), + .SAXIHP3AWBURST(S_AXI_HP3_AWBURST), + .SAXIHP3AWCACHE(S_AXI_HP3_AWCACHE), + .SAXIHP3AWID(S_AXI_HP3_AWID), + .SAXIHP3AWLEN(S_AXI_HP3_AWLEN), + .SAXIHP3AWLOCK(S_AXI_HP3_AWLOCK), + .SAXIHP3AWPROT(S_AXI_HP3_AWPROT), + .SAXIHP3AWQOS(S_AXI_HP3_AWQOS), + .SAXIHP3AWREADY(S_AXI_HP3_AWREADY), + .SAXIHP3AWSIZE(S_AXI_HP3_AWSIZE[1:0]), + .SAXIHP3AWVALID(S_AXI_HP3_AWVALID), + .SAXIHP3BID(S_AXI_HP3_BID), + .SAXIHP3BREADY(S_AXI_HP3_BREADY), + .SAXIHP3BRESP(S_AXI_HP3_BRESP), + .SAXIHP3BVALID(S_AXI_HP3_BVALID), + .SAXIHP3RACOUNT(S_AXI_HP3_RACOUNT), + .SAXIHP3RCOUNT(S_AXI_HP3_RCOUNT), + .SAXIHP3RDATA(S_AXI_HP3_RDATA), + .SAXIHP3RDISSUECAP1EN(S_AXI_HP3_RDISSUECAP1_EN), + .SAXIHP3RID(S_AXI_HP3_RID), + .SAXIHP3RLAST(S_AXI_HP3_RLAST), + .SAXIHP3RREADY(S_AXI_HP3_RREADY), + .SAXIHP3RRESP(S_AXI_HP3_RRESP), + .SAXIHP3RVALID(S_AXI_HP3_RVALID), + .SAXIHP3WACOUNT(S_AXI_HP3_WACOUNT), + .SAXIHP3WCOUNT(S_AXI_HP3_WCOUNT), + .SAXIHP3WDATA(S_AXI_HP3_WDATA), + .SAXIHP3WID(S_AXI_HP3_WID), + .SAXIHP3WLAST(S_AXI_HP3_WLAST), + .SAXIHP3WREADY(S_AXI_HP3_WREADY), + .SAXIHP3WRISSUECAP1EN(S_AXI_HP3_WRISSUECAP1_EN), + .SAXIHP3WSTRB(S_AXI_HP3_WSTRB), + .SAXIHP3WVALID(S_AXI_HP3_WVALID)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF PS_CLK_BIBUF + (.IO(buffered_PS_CLK), + .PAD(PS_CLK)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF PS_PORB_BIBUF + (.IO(buffered_PS_PORB), + .PAD(PS_PORB)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF PS_SRSTB_BIBUF + (.IO(buffered_PS_SRSTB), + .PAD(PS_SRSTB)); + LUT1 #( + .INIT(2'h1)) + SDIO0_CMD_T_INST_0 + (.I0(SDIO0_CMD_T_n), + .O(SDIO0_CMD_T)); + LUT1 #( + .INIT(2'h1)) + \SDIO0_DATA_T[0]_INST_0 + (.I0(SDIO0_DATA_T_n[0]), + .O(SDIO0_DATA_T[0])); + LUT1 #( + .INIT(2'h1)) + \SDIO0_DATA_T[1]_INST_0 + (.I0(SDIO0_DATA_T_n[1]), + .O(SDIO0_DATA_T[1])); + LUT1 #( + .INIT(2'h1)) + \SDIO0_DATA_T[2]_INST_0 + (.I0(SDIO0_DATA_T_n[2]), + .O(SDIO0_DATA_T[2])); + LUT1 #( + .INIT(2'h1)) + \SDIO0_DATA_T[3]_INST_0 + (.I0(SDIO0_DATA_T_n[3]), + .O(SDIO0_DATA_T[3])); + LUT1 #( + .INIT(2'h1)) + SDIO1_CMD_T_INST_0 + (.I0(SDIO1_CMD_T_n), + .O(SDIO1_CMD_T)); + LUT1 #( + .INIT(2'h1)) + \SDIO1_DATA_T[0]_INST_0 + (.I0(SDIO1_DATA_T_n[0]), + .O(SDIO1_DATA_T[0])); + LUT1 #( + .INIT(2'h1)) + \SDIO1_DATA_T[1]_INST_0 + (.I0(SDIO1_DATA_T_n[1]), + .O(SDIO1_DATA_T[1])); + LUT1 #( + .INIT(2'h1)) + \SDIO1_DATA_T[2]_INST_0 + (.I0(SDIO1_DATA_T_n[2]), + .O(SDIO1_DATA_T[2])); + LUT1 #( + .INIT(2'h1)) + \SDIO1_DATA_T[3]_INST_0 + (.I0(SDIO1_DATA_T_n[3]), + .O(SDIO1_DATA_T[3])); + LUT1 #( + .INIT(2'h1)) + SPI0_MISO_T_INST_0 + (.I0(SPI0_MISO_T_n), + .O(SPI0_MISO_T)); + LUT1 #( + .INIT(2'h1)) + SPI0_MOSI_T_INST_0 + (.I0(SPI0_MOSI_T_n), + .O(SPI0_MOSI_T)); + LUT1 #( + .INIT(2'h1)) + SPI0_SCLK_T_INST_0 + (.I0(SPI0_SCLK_T_n), + .O(SPI0_SCLK_T)); + LUT1 #( + .INIT(2'h1)) + SPI0_SS_T_INST_0 + (.I0(SPI0_SS_T_n), + .O(SPI0_SS_T)); + LUT1 #( + .INIT(2'h1)) + SPI1_MISO_T_INST_0 + (.I0(SPI1_MISO_T_n), + .O(SPI1_MISO_T)); + LUT1 #( + .INIT(2'h1)) + SPI1_MOSI_T_INST_0 + (.I0(SPI1_MOSI_T_n), + .O(SPI1_MOSI_T)); + LUT1 #( + .INIT(2'h1)) + SPI1_SCLK_T_INST_0 + (.I0(SPI1_SCLK_T_n), + .O(SPI1_SCLK_T)); + LUT1 #( + .INIT(2'h1)) + SPI1_SS_T_INST_0 + (.I0(SPI1_SS_T_n), + .O(SPI1_SS_T)); + VCC VCC + (.P(\ )); + (* BOX_TYPE = "PRIMITIVE" *) + BUFG \buffer_fclk_clk_0.FCLK_CLK_0_BUFG + (.I(FCLK_CLK_unbuffered[0]), + .O(FCLK_CLK0)); + (* BOX_TYPE = "PRIMITIVE" *) + BUFG \buffer_fclk_clk_1.FCLK_CLK_1_BUFG + (.I(FCLK_CLK_unbuffered[1]), + .O(FCLK_CLK1)); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[0].MIO_BIBUF + (.IO(buffered_MIO[0]), + .PAD(MIO[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[10].MIO_BIBUF + (.IO(buffered_MIO[10]), + .PAD(MIO[10])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[11].MIO_BIBUF + (.IO(buffered_MIO[11]), + .PAD(MIO[11])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[12].MIO_BIBUF + (.IO(buffered_MIO[12]), + .PAD(MIO[12])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[13].MIO_BIBUF + (.IO(buffered_MIO[13]), + .PAD(MIO[13])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[14].MIO_BIBUF + (.IO(buffered_MIO[14]), + .PAD(MIO[14])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[15].MIO_BIBUF + (.IO(buffered_MIO[15]), + .PAD(MIO[15])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[16].MIO_BIBUF + (.IO(buffered_MIO[16]), + .PAD(MIO[16])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[17].MIO_BIBUF + (.IO(buffered_MIO[17]), + .PAD(MIO[17])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[18].MIO_BIBUF + (.IO(buffered_MIO[18]), + .PAD(MIO[18])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[19].MIO_BIBUF + (.IO(buffered_MIO[19]), + .PAD(MIO[19])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[1].MIO_BIBUF + (.IO(buffered_MIO[1]), + .PAD(MIO[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[20].MIO_BIBUF + (.IO(buffered_MIO[20]), + .PAD(MIO[20])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[21].MIO_BIBUF + (.IO(buffered_MIO[21]), + .PAD(MIO[21])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[22].MIO_BIBUF + (.IO(buffered_MIO[22]), + .PAD(MIO[22])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[23].MIO_BIBUF + (.IO(buffered_MIO[23]), + .PAD(MIO[23])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[24].MIO_BIBUF + (.IO(buffered_MIO[24]), + .PAD(MIO[24])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[25].MIO_BIBUF + (.IO(buffered_MIO[25]), + .PAD(MIO[25])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[26].MIO_BIBUF + (.IO(buffered_MIO[26]), + .PAD(MIO[26])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[27].MIO_BIBUF + (.IO(buffered_MIO[27]), + .PAD(MIO[27])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[28].MIO_BIBUF + (.IO(buffered_MIO[28]), + .PAD(MIO[28])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[29].MIO_BIBUF + (.IO(buffered_MIO[29]), + .PAD(MIO[29])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[2].MIO_BIBUF + (.IO(buffered_MIO[2]), + .PAD(MIO[2])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[30].MIO_BIBUF + (.IO(buffered_MIO[30]), + .PAD(MIO[30])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[31].MIO_BIBUF + (.IO(buffered_MIO[31]), + .PAD(MIO[31])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[3].MIO_BIBUF + (.IO(buffered_MIO[3]), + .PAD(MIO[3])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[4].MIO_BIBUF + (.IO(buffered_MIO[4]), + .PAD(MIO[4])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[5].MIO_BIBUF + (.IO(buffered_MIO[5]), + .PAD(MIO[5])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[6].MIO_BIBUF + (.IO(buffered_MIO[6]), + .PAD(MIO[6])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[7].MIO_BIBUF + (.IO(buffered_MIO[7]), + .PAD(MIO[7])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[8].MIO_BIBUF + (.IO(buffered_MIO[8]), + .PAD(MIO[8])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk13[9].MIO_BIBUF + (.IO(buffered_MIO[9]), + .PAD(MIO[9])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk14[0].DDR_BankAddr_BIBUF + (.IO(buffered_DDR_BankAddr[0]), + .PAD(DDR_BankAddr[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk14[1].DDR_BankAddr_BIBUF + (.IO(buffered_DDR_BankAddr[1]), + .PAD(DDR_BankAddr[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk14[2].DDR_BankAddr_BIBUF + (.IO(buffered_DDR_BankAddr[2]), + .PAD(DDR_BankAddr[2])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[0].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[0]), + .PAD(DDR_Addr[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[10].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[10]), + .PAD(DDR_Addr[10])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[11].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[11]), + .PAD(DDR_Addr[11])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[12].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[12]), + .PAD(DDR_Addr[12])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[13].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[13]), + .PAD(DDR_Addr[13])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[14].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[14]), + .PAD(DDR_Addr[14])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[1].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[1]), + .PAD(DDR_Addr[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[2].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[2]), + .PAD(DDR_Addr[2])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[3].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[3]), + .PAD(DDR_Addr[3])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[4].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[4]), + .PAD(DDR_Addr[4])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[5].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[5]), + .PAD(DDR_Addr[5])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[6].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[6]), + .PAD(DDR_Addr[6])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[7].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[7]), + .PAD(DDR_Addr[7])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[8].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[8]), + .PAD(DDR_Addr[8])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk15[9].DDR_Addr_BIBUF + (.IO(buffered_DDR_Addr[9]), + .PAD(DDR_Addr[9])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk16[0].DDR_DM_BIBUF + (.IO(buffered_DDR_DM[0]), + .PAD(DDR_DM[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk16[1].DDR_DM_BIBUF + (.IO(buffered_DDR_DM[1]), + .PAD(DDR_DM[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[0].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[0]), + .PAD(DDR_DQ[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[10].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[10]), + .PAD(DDR_DQ[10])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[11].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[11]), + .PAD(DDR_DQ[11])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[12].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[12]), + .PAD(DDR_DQ[12])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[13].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[13]), + .PAD(DDR_DQ[13])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[14].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[14]), + .PAD(DDR_DQ[14])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[15].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[15]), + .PAD(DDR_DQ[15])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[1].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[1]), + .PAD(DDR_DQ[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[2].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[2]), + .PAD(DDR_DQ[2])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[3].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[3]), + .PAD(DDR_DQ[3])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[4].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[4]), + .PAD(DDR_DQ[4])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[5].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[5]), + .PAD(DDR_DQ[5])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[6].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[6]), + .PAD(DDR_DQ[6])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[7].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[7]), + .PAD(DDR_DQ[7])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[8].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[8]), + .PAD(DDR_DQ[8])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk17[9].DDR_DQ_BIBUF + (.IO(buffered_DDR_DQ[9]), + .PAD(DDR_DQ[9])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk18[0].DDR_DQS_n_BIBUF + (.IO(buffered_DDR_DQS_n[0]), + .PAD(DDR_DQS_n[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk18[1].DDR_DQS_n_BIBUF + (.IO(buffered_DDR_DQS_n[1]), + .PAD(DDR_DQS_n[1])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk19[0].DDR_DQS_BIBUF + (.IO(buffered_DDR_DQS[0]), + .PAD(DDR_DQS[0])); + (* BOX_TYPE = "PRIMITIVE" *) + BIBUF \genblk19[1].DDR_DQS_BIBUF + (.IO(buffered_DDR_DQS[1]), + .PAD(DDR_DQS[1])); + LUT1 #( + .INIT(2'h2)) + i_0 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[0] )); + LUT1 #( + .INIT(2'h2)) + i_1 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[0] [1])); + LUT1 #( + .INIT(2'h2)) + i_10 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[7] [1])); + LUT1 #( + .INIT(2'h2)) + i_11 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[7] [0])); + LUT1 #( + .INIT(2'h2)) + i_12 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[6] [1])); + LUT1 #( + .INIT(2'h2)) + i_13 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[6] [0])); + LUT1 #( + .INIT(2'h2)) + i_14 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[5] [1])); + LUT1 #( + .INIT(2'h2)) + i_15 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[5] [0])); + LUT1 #( + .INIT(2'h2)) + i_16 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[4] [1])); + LUT1 #( + .INIT(2'h2)) + i_17 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[4] [0])); + LUT1 #( + .INIT(2'h2)) + i_18 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[3] [1])); + LUT1 #( + .INIT(2'h2)) + i_19 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[3] [0])); + LUT1 #( + .INIT(2'h2)) + i_2 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[0] [0])); + LUT1 #( + .INIT(2'h2)) + i_20 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[2] [1])); + LUT1 #( + .INIT(2'h2)) + i_21 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[2] [0])); + LUT1 #( + .INIT(2'h2)) + i_22 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[1] [1])); + LUT1 #( + .INIT(2'h2)) + i_23 + (.I0(1'b0), + .O(\TRACE_DATA_PIPE[1] [0])); + LUT1 #( + .INIT(2'h2)) + i_3 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[7] )); + LUT1 #( + .INIT(2'h2)) + i_4 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[6] )); + LUT1 #( + .INIT(2'h2)) + i_5 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[5] )); + LUT1 #( + .INIT(2'h2)) + i_6 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[4] )); + LUT1 #( + .INIT(2'h2)) + i_7 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[3] )); + LUT1 #( + .INIT(2'h2)) + i_8 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[2] )); + LUT1 #( + .INIT(2'h2)) + i_9 + (.I0(1'b0), + .O(\TRACE_CTL_PIPE[1] )); +endmodule +`ifndef GLBL +`define GLBL +`timescale 1 ps / 1 ps + +module glbl (); + + parameter ROC_WIDTH = 100000; + parameter TOC_WIDTH = 0; + +//-------- STARTUP Globals -------------- + wire GSR; + wire GTS; + wire GWE; + wire PRLD; + tri1 p_up_tmp; + tri (weak1, strong0) PLL_LOCKG = p_up_tmp; + + wire PROGB_GLBL; + wire CCLKO_GLBL; + wire FCSBO_GLBL; + wire [3:0] DO_GLBL; + wire [3:0] DI_GLBL; + + reg GSR_int; + reg GTS_int; + reg PRLD_int; + +//-------- JTAG Globals -------------- + wire JTAG_TDO_GLBL; + wire JTAG_TCK_GLBL; + wire JTAG_TDI_GLBL; + wire JTAG_TMS_GLBL; + wire JTAG_TRST_GLBL; + + reg JTAG_CAPTURE_GLBL; + reg JTAG_RESET_GLBL; + reg JTAG_SHIFT_GLBL; + reg JTAG_UPDATE_GLBL; + reg JTAG_RUNTEST_GLBL; + + reg JTAG_SEL1_GLBL = 0; + reg JTAG_SEL2_GLBL = 0 ; + reg JTAG_SEL3_GLBL = 0; + reg JTAG_SEL4_GLBL = 0; + + reg JTAG_USER_TDO1_GLBL = 1'bz; + reg JTAG_USER_TDO2_GLBL = 1'bz; + reg JTAG_USER_TDO3_GLBL = 1'bz; + reg JTAG_USER_TDO4_GLBL = 1'bz; + + assign (strong1, weak0) GSR = GSR_int; + assign (strong1, weak0) GTS = GTS_int; + assign (weak1, weak0) PRLD = PRLD_int; + + initial begin + GSR_int = 1'b1; + PRLD_int = 1'b1; + #(ROC_WIDTH) + GSR_int = 1'b0; + PRLD_int = 1'b0; + end + + initial begin + GTS_int = 1'b1; + #(TOC_WIDTH) + GTS_int = 1'b0; + end + +endmodule +`endif diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_stub.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_stub.v new file mode 100644 index 0000000..146bc3f --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_stub.v @@ -0,0 +1,164 @@ +// Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +// -------------------------------------------------------------------------------- +// Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +// Date : Fri Aug 17 17:36:46 2018 +// Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +// Command : write_verilog -force -mode synth_stub +// c:/Users/qwpmb/Documents/summercamp2018/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/design_1_processing_system7_0_0_stub.v +// Design : design_1_processing_system7_0_0 +// Purpose : Stub declaration of top-level module interface +// Device : xc7z010clg225-1 +// -------------------------------------------------------------------------------- + +// This empty module with port declaration file causes synthesis tools to infer a black box for IP. +// The synthesis directives are for Synopsys Synplify support to prevent IO buffer insertion. +// Please paste the declaration into a Verilog source file or add the file as an additional source. +(* X_CORE_INFO = "processing_system7_v5_5_processing_system7,Vivado 2018.2" *) +module design_1_processing_system7_0_0(GPIO_I, GPIO_O, GPIO_T, I2C0_SDA_I, I2C0_SDA_O, + I2C0_SDA_T, I2C0_SCL_I, I2C0_SCL_O, I2C0_SCL_T, SDIO0_CLK, SDIO0_CLK_FB, SDIO0_CMD_O, + SDIO0_CMD_I, SDIO0_CMD_T, SDIO0_DATA_I, SDIO0_DATA_O, SDIO0_DATA_T, SDIO0_LED, SDIO0_CDN, + SDIO0_WP, SDIO0_BUSPOW, SDIO0_BUSVOLT, SPI0_SCLK_I, SPI0_SCLK_O, SPI0_SCLK_T, SPI0_MOSI_I, + SPI0_MOSI_O, SPI0_MOSI_T, SPI0_MISO_I, SPI0_MISO_O, SPI0_MISO_T, SPI0_SS_I, SPI0_SS_O, + SPI0_SS1_O, SPI0_SS2_O, SPI0_SS_T, SPI1_SCLK_I, SPI1_SCLK_O, SPI1_SCLK_T, SPI1_MOSI_I, + SPI1_MOSI_O, SPI1_MOSI_T, SPI1_MISO_I, SPI1_MISO_O, SPI1_MISO_T, SPI1_SS_I, SPI1_SS_O, + SPI1_SS1_O, SPI1_SS2_O, SPI1_SS_T, UART0_TX, UART0_RX, TTC0_WAVE0_OUT, TTC0_WAVE1_OUT, + TTC0_WAVE2_OUT, TTC1_WAVE0_OUT, TTC1_WAVE1_OUT, TTC1_WAVE2_OUT, USB0_PORT_INDCTL, + USB0_VBUS_PWRSELECT, USB0_VBUS_PWRFAULT, M_AXI_GP0_ARVALID, M_AXI_GP0_AWVALID, + M_AXI_GP0_BREADY, M_AXI_GP0_RREADY, M_AXI_GP0_WLAST, M_AXI_GP0_WVALID, M_AXI_GP0_ARID, + M_AXI_GP0_AWID, M_AXI_GP0_WID, M_AXI_GP0_ARBURST, M_AXI_GP0_ARLOCK, M_AXI_GP0_ARSIZE, + M_AXI_GP0_AWBURST, M_AXI_GP0_AWLOCK, M_AXI_GP0_AWSIZE, M_AXI_GP0_ARPROT, + M_AXI_GP0_AWPROT, M_AXI_GP0_ARADDR, M_AXI_GP0_AWADDR, M_AXI_GP0_WDATA, M_AXI_GP0_ARCACHE, + M_AXI_GP0_ARLEN, M_AXI_GP0_ARQOS, M_AXI_GP0_AWCACHE, M_AXI_GP0_AWLEN, M_AXI_GP0_AWQOS, + M_AXI_GP0_WSTRB, M_AXI_GP0_ACLK, M_AXI_GP0_ARREADY, M_AXI_GP0_AWREADY, M_AXI_GP0_BVALID, + M_AXI_GP0_RLAST, M_AXI_GP0_RVALID, M_AXI_GP0_WREADY, M_AXI_GP0_BID, M_AXI_GP0_RID, + M_AXI_GP0_BRESP, M_AXI_GP0_RRESP, M_AXI_GP0_RDATA, IRQ_F2P, FCLK_CLK0, FCLK_CLK1, + FCLK_RESET0_N, MIO, DDR_CAS_n, DDR_CKE, DDR_Clk_n, DDR_Clk, DDR_CS_n, DDR_DRSTB, DDR_ODT, + DDR_RAS_n, DDR_WEB, DDR_BankAddr, DDR_Addr, DDR_VRN, DDR_VRP, DDR_DM, DDR_DQ, DDR_DQS_n, DDR_DQS, + PS_SRSTB, PS_CLK, PS_PORB) +/* synthesis syn_black_box black_box_pad_pin="GPIO_I[63:0],GPIO_O[63:0],GPIO_T[63:0],I2C0_SDA_I,I2C0_SDA_O,I2C0_SDA_T,I2C0_SCL_I,I2C0_SCL_O,I2C0_SCL_T,SDIO0_CLK,SDIO0_CLK_FB,SDIO0_CMD_O,SDIO0_CMD_I,SDIO0_CMD_T,SDIO0_DATA_I[3:0],SDIO0_DATA_O[3:0],SDIO0_DATA_T[3:0],SDIO0_LED,SDIO0_CDN,SDIO0_WP,SDIO0_BUSPOW,SDIO0_BUSVOLT[2:0],SPI0_SCLK_I,SPI0_SCLK_O,SPI0_SCLK_T,SPI0_MOSI_I,SPI0_MOSI_O,SPI0_MOSI_T,SPI0_MISO_I,SPI0_MISO_O,SPI0_MISO_T,SPI0_SS_I,SPI0_SS_O,SPI0_SS1_O,SPI0_SS2_O,SPI0_SS_T,SPI1_SCLK_I,SPI1_SCLK_O,SPI1_SCLK_T,SPI1_MOSI_I,SPI1_MOSI_O,SPI1_MOSI_T,SPI1_MISO_I,SPI1_MISO_O,SPI1_MISO_T,SPI1_SS_I,SPI1_SS_O,SPI1_SS1_O,SPI1_SS2_O,SPI1_SS_T,UART0_TX,UART0_RX,TTC0_WAVE0_OUT,TTC0_WAVE1_OUT,TTC0_WAVE2_OUT,TTC1_WAVE0_OUT,TTC1_WAVE1_OUT,TTC1_WAVE2_OUT,USB0_PORT_INDCTL[1:0],USB0_VBUS_PWRSELECT,USB0_VBUS_PWRFAULT,M_AXI_GP0_ARVALID,M_AXI_GP0_AWVALID,M_AXI_GP0_BREADY,M_AXI_GP0_RREADY,M_AXI_GP0_WLAST,M_AXI_GP0_WVALID,M_AXI_GP0_ARID[11:0],M_AXI_GP0_AWID[11:0],M_AXI_GP0_WID[11:0],M_AXI_GP0_ARBURST[1:0],M_AXI_GP0_ARLOCK[1:0],M_AXI_GP0_ARSIZE[2:0],M_AXI_GP0_AWBURST[1:0],M_AXI_GP0_AWLOCK[1:0],M_AXI_GP0_AWSIZE[2:0],M_AXI_GP0_ARPROT[2:0],M_AXI_GP0_AWPROT[2:0],M_AXI_GP0_ARADDR[31:0],M_AXI_GP0_AWADDR[31:0],M_AXI_GP0_WDATA[31:0],M_AXI_GP0_ARCACHE[3:0],M_AXI_GP0_ARLEN[3:0],M_AXI_GP0_ARQOS[3:0],M_AXI_GP0_AWCACHE[3:0],M_AXI_GP0_AWLEN[3:0],M_AXI_GP0_AWQOS[3:0],M_AXI_GP0_WSTRB[3:0],M_AXI_GP0_ACLK,M_AXI_GP0_ARREADY,M_AXI_GP0_AWREADY,M_AXI_GP0_BVALID,M_AXI_GP0_RLAST,M_AXI_GP0_RVALID,M_AXI_GP0_WREADY,M_AXI_GP0_BID[11:0],M_AXI_GP0_RID[11:0],M_AXI_GP0_BRESP[1:0],M_AXI_GP0_RRESP[1:0],M_AXI_GP0_RDATA[31:0],IRQ_F2P[0:0],FCLK_CLK0,FCLK_CLK1,FCLK_RESET0_N,MIO[31:0],DDR_CAS_n,DDR_CKE,DDR_Clk_n,DDR_Clk,DDR_CS_n,DDR_DRSTB,DDR_ODT,DDR_RAS_n,DDR_WEB,DDR_BankAddr[2:0],DDR_Addr[14:0],DDR_VRN,DDR_VRP,DDR_DM[1:0],DDR_DQ[15:0],DDR_DQS_n[1:0],DDR_DQS[1:0],PS_SRSTB,PS_CLK,PS_PORB" */; + input [63:0]GPIO_I; + output [63:0]GPIO_O; + output [63:0]GPIO_T; + input I2C0_SDA_I; + output I2C0_SDA_O; + output I2C0_SDA_T; + input I2C0_SCL_I; + output I2C0_SCL_O; + output I2C0_SCL_T; + output SDIO0_CLK; + input SDIO0_CLK_FB; + output SDIO0_CMD_O; + input SDIO0_CMD_I; + output SDIO0_CMD_T; + input [3:0]SDIO0_DATA_I; + output [3:0]SDIO0_DATA_O; + output [3:0]SDIO0_DATA_T; + output SDIO0_LED; + input SDIO0_CDN; + input SDIO0_WP; + output SDIO0_BUSPOW; + output [2:0]SDIO0_BUSVOLT; + input SPI0_SCLK_I; + output SPI0_SCLK_O; + output SPI0_SCLK_T; + input SPI0_MOSI_I; + output SPI0_MOSI_O; + output SPI0_MOSI_T; + input SPI0_MISO_I; + output SPI0_MISO_O; + output SPI0_MISO_T; + input SPI0_SS_I; + output SPI0_SS_O; + output SPI0_SS1_O; + output SPI0_SS2_O; + output SPI0_SS_T; + input SPI1_SCLK_I; + output SPI1_SCLK_O; + output SPI1_SCLK_T; + input SPI1_MOSI_I; + output SPI1_MOSI_O; + output SPI1_MOSI_T; + input SPI1_MISO_I; + output SPI1_MISO_O; + output SPI1_MISO_T; + input SPI1_SS_I; + output SPI1_SS_O; + output SPI1_SS1_O; + output SPI1_SS2_O; + output SPI1_SS_T; + output UART0_TX; + input UART0_RX; + output TTC0_WAVE0_OUT; + output TTC0_WAVE1_OUT; + output TTC0_WAVE2_OUT; + output TTC1_WAVE0_OUT; + output TTC1_WAVE1_OUT; + output TTC1_WAVE2_OUT; + output [1:0]USB0_PORT_INDCTL; + output USB0_VBUS_PWRSELECT; + input USB0_VBUS_PWRFAULT; + output M_AXI_GP0_ARVALID; + output M_AXI_GP0_AWVALID; + output M_AXI_GP0_BREADY; + output M_AXI_GP0_RREADY; + output M_AXI_GP0_WLAST; + output M_AXI_GP0_WVALID; + output [11:0]M_AXI_GP0_ARID; + output [11:0]M_AXI_GP0_AWID; + output [11:0]M_AXI_GP0_WID; + output [1:0]M_AXI_GP0_ARBURST; + output [1:0]M_AXI_GP0_ARLOCK; + output [2:0]M_AXI_GP0_ARSIZE; + output [1:0]M_AXI_GP0_AWBURST; + output [1:0]M_AXI_GP0_AWLOCK; + output [2:0]M_AXI_GP0_AWSIZE; + output [2:0]M_AXI_GP0_ARPROT; + output [2:0]M_AXI_GP0_AWPROT; + output [31:0]M_AXI_GP0_ARADDR; + output [31:0]M_AXI_GP0_AWADDR; + output [31:0]M_AXI_GP0_WDATA; + output [3:0]M_AXI_GP0_ARCACHE; + output [3:0]M_AXI_GP0_ARLEN; + output [3:0]M_AXI_GP0_ARQOS; + output [3:0]M_AXI_GP0_AWCACHE; + output [3:0]M_AXI_GP0_AWLEN; + output [3:0]M_AXI_GP0_AWQOS; + output [3:0]M_AXI_GP0_WSTRB; + input M_AXI_GP0_ACLK; + input M_AXI_GP0_ARREADY; + input M_AXI_GP0_AWREADY; + input M_AXI_GP0_BVALID; + input M_AXI_GP0_RLAST; + input M_AXI_GP0_RVALID; + input M_AXI_GP0_WREADY; + input [11:0]M_AXI_GP0_BID; + input [11:0]M_AXI_GP0_RID; + input [1:0]M_AXI_GP0_BRESP; + input [1:0]M_AXI_GP0_RRESP; + input [31:0]M_AXI_GP0_RDATA; + input [0:0]IRQ_F2P; + output FCLK_CLK0; + output FCLK_CLK1; + output FCLK_RESET0_N; + inout [31:0]MIO; + inout DDR_CAS_n; + inout DDR_CKE; + inout DDR_Clk_n; + inout DDR_Clk; + inout DDR_CS_n; + inout DDR_DRSTB; + inout DDR_ODT; + inout DDR_RAS_n; + inout DDR_WEB; + inout [2:0]DDR_BankAddr; + inout [14:0]DDR_Addr; + inout DDR_VRN; + inout DDR_VRP; + inout [1:0]DDR_DM; + inout [15:0]DDR_DQ; + inout [1:0]DDR_DQS_n; + inout [1:0]DDR_DQS; + inout PS_SRSTB; + inout PS_CLK; + inout PS_PORB; +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/hdl/verilog/processing_system7_v5_5_processing_system7.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/hdl/verilog/processing_system7_v5_5_processing_system7.v new file mode 100644 index 0000000..3f7b3e7 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/hdl/verilog/processing_system7_v5_5_processing_system7.v @@ -0,0 +1,3935 @@ + +//----------------------------------------------------------------------------- +// processing_system7 +// processor sub system wrapper +//----------------------------------------------------------------------------- +// +// ************************************************************************ +// ** DISCLAIMER OF LIABILITY ** +// ** ** +// ** This file contains proprietary and confidential information of ** +// ** Xilinx, Inc. ("Xilinx"), that is distributed under a license ** +// ** from Xilinx, and may be used, copied and/or diSCLosed only ** +// ** pursuant to the terms of a valid license agreement with Xilinx. ** +// ** ** +// ** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION ** +// ** ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER ** +// ** EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT ** +// ** LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT, ** +// ** MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx ** +// ** does not warrant that functions included in the Materials will ** +// ** meet the requirements of Licensee, or that the operation of the ** +// ** Materials will be uninterrupted or error-free, or that defects ** +// ** in the Materials will be corrected. Furthermore, Xilinx does ** +// ** not warrant or make any representations regarding use, or the ** +// ** results of the use, of the Materials in terms of correctness, ** +// ** accuracy, reliability or otherwise. ** +// ** ** +// ** Xilinx products are not designed or intended to be fail-safe, ** +// ** or for use in any application requiring fail-safe performance, ** +// ** such as life-support or safety devices or systems, Class III ** +// ** medical devices, nuclear facilities, applications related to ** +// ** the deployment of airbags, or any other applications that could ** +// ** lead to death, personal injury or severe property or ** +// ** environmental damage (individually and collectively, "critical ** +// ** applications"). Customer assumes the sole risk and liability ** +// ** of any use of Xilinx products in critical applications, ** +// ** subject only to applicable laws and regulations governing ** +// ** limitations on product liability. ** +// ** ** +// ** Copyright 2010 Xilinx, Inc. ** +// ** All rights reserved. ** +// ** ** +// ** This disclaimer and copyright notice must be retained as part ** +// ** of this file at all times. ** +// ************************************************************************ +// +//----------------------------------------------------------------------------- +// Filename: processing_system7_v5_5_processing_system7.v +// Version: v1.00.a +// Description: This is the wrapper file for PSS. +//----------------------------------------------------------------------------- +// Structure: This section shows the hierarchical structure of +// pss_wrapper. +// +// --processing_system7_v5_5_processing_system7.v +// --PS7.v - Unisim component +//----------------------------------------------------------------------------- +// Author: SD +// +// History: +// +// SD 09/20/11 -- First version +// ~~~~~~ +// Created the first version v2.00.a +// ^^^^^^ +//------------------------------------------------------------------------------ +// ^^^^^^ +// SR 11/25/11 -- v3.00.a version +// ~~~~~~~ +// Key changes are +// 1. Changed all clock, reset and clktrig ports to be individual +// signals instead of vectors. This is required for modeling of tools. +// 2. Interrupts are now defined as individual signals as well. +// 3. Added Clk buffer logic for FCLK_CLK +// 4. Includes the ACP related changes done +// +// TODO: +// 1. C_NUM_F2P_INTR_INPUTS needs to have control on the +// number of interrupt ports connected for IRQ_F2P. +// +//------------------------------------------------------------------------------ +// ^^^^^^ +// KP 12/07/11 -- v3.00.a version +// ~~~~~~~ +// Key changes are +// C_NUM_F2P_INTR_INPUTS taken into account for IRQ_F2P +//------------------------------------------------------------------------------ +// ^^^^^^ +// NR 12/09/11 -- v3.00.a version +// ~~~~~~~ +// Key changes are +// C_FCLK_CLK0_BUF to C_FCLK_CLK3_BUF parameters were updated +// to STRING and fix for CR 640523 +//------------------------------------------------------------------------------ +// ^^^^^^ +// NR 12/13/11 -- v3.00.a version +// ~~~~~~~ +// Key changes are +// Updated IRQ_F2P logic to address CR 641523. +//------------------------------------------------------------------------------ +// ^^^^^^ +// NR 02/01/12 -- v3.01.a version +// ~~~~~~~ +// Key changes are +// Updated SDIO logic to address CR 636210. +// | +// Added C_PS7_SI_REV parameter to track SI Rev +// Removed compress/decompress logic to address CR 642527. +//------------------------------------------------------------------------------ +// ^^^^^^ +// NR 02/27/12 -- v3.01.a version +// ~~~~~~~ +// Key changes are +// TTC(0,1)_WAVE_OUT and TTC(0,1)_CLK_IN vector signals are made as individual +// ports as fix for CR 646379 +//------------------------------------------------------------------------------ +// ^^^^^^ +// NR 03/05/12 -- v3.01.a version +// ~~~~~~~ +// Key changes are +// Added/updated compress/decompress logic to address 648393 +//------------------------------------------------------------------------------ +// ^^^^^^ +// NR 03/14/12 -- v4.00.a version +// ~~~~~~~ +// Unused parameters deleted CR 651120 +// Addressed CR 651751 +//------------------------------------------------------------------------------ +// ^^^^^^ +// NR 04/17/12 -- v4.01.a version +// ~~~~~~~ +// Added FTM trace buffer functionality +// Added support for ACP AxUSER ports local update +//------------------------------------------------------------------------------ +// ^^^^^^ +// VR 05/18/12 -- v4.01.a version +// ~~~~~~~ +// Fixed CR#659157 +//------------------------------------------------------------------------------ +// ^^^^^^ +// VR 07/25/12 -- v4.01.a version +// ~~~~~~~ +// Changed S_AXI_HP{1,2}_WACOUNT port's width to 6 from 8 to match unisim model +// Changed fclk_clktrig_gnd width to 4 from 16 to match unisim model +//------------------------------------------------------------------------------ +// ^^^^^^ +// VR 11/06/12 -- v5.00 version +// ~~~~~~~ +// CR #682573 +// Added BIBUF to fixed IO ports and IBUF to fixed input ports +//------------------------------------------------------------------------------ +(*POWER= "/>" *) +(* CORE_GENERATION_INFO = "processing_system7_v5.5 ,processing_system7_v5.5_user_configuration,{ PCW_UIPARAM_DDR_FREQ_MHZ=533.333333, PCW_UIPARAM_DDR_BANK_ADDR_COUNT=3, PCW_UIPARAM_DDR_ROW_ADDR_COUNT=15, PCW_UIPARAM_DDR_COL_ADDR_COUNT=10, PCW_UIPARAM_DDR_CL=7, PCW_UIPARAM_DDR_CWL=6, PCW_UIPARAM_DDR_T_RCD=7, PCW_UIPARAM_DDR_T_RP=7, PCW_UIPARAM_DDR_T_RC=48.91, PCW_UIPARAM_DDR_T_RAS_MIN=35.0, PCW_UIPARAM_DDR_T_FAW=40.0, PCW_UIPARAM_DDR_AL=0, PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_0=0.0, PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_1=0.0, PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_2=0.0, PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_3=0.0, PCW_UIPARAM_DDR_BOARD_DELAY0=0.25, PCW_UIPARAM_DDR_BOARD_DELAY1=0.25, PCW_UIPARAM_DDR_BOARD_DELAY2=0.25, PCW_UIPARAM_DDR_BOARD_DELAY3=0.25, PCW_UIPARAM_DDR_DQS_0_LENGTH_MM=0, PCW_UIPARAM_DDR_DQS_1_LENGTH_MM=0, PCW_UIPARAM_DDR_DQS_2_LENGTH_MM=0, PCW_UIPARAM_DDR_DQS_3_LENGTH_MM=0, PCW_UIPARAM_DDR_DQ_0_LENGTH_MM=0, PCW_UIPARAM_DDR_DQ_1_LENGTH_MM=0, PCW_UIPARAM_DDR_DQ_2_LENGTH_MM=0, PCW_UIPARAM_DDR_DQ_3_LENGTH_MM=0, PCW_UIPARAM_DDR_CLOCK_0_LENGTH_MM=0, PCW_UIPARAM_DDR_CLOCK_1_LENGTH_MM=0, PCW_UIPARAM_DDR_CLOCK_2_LENGTH_MM=0, PCW_UIPARAM_DDR_CLOCK_3_LENGTH_MM=0, PCW_UIPARAM_DDR_DQS_0_PACKAGE_LENGTH=81.244, PCW_UIPARAM_DDR_DQS_1_PACKAGE_LENGTH=57.044, PCW_UIPARAM_DDR_DQS_2_PACKAGE_LENGTH=520, PCW_UIPARAM_DDR_DQS_3_PACKAGE_LENGTH=700, PCW_UIPARAM_DDR_DQ_0_PACKAGE_LENGTH=77.166, PCW_UIPARAM_DDR_DQ_1_PACKAGE_LENGTH=53.995, PCW_UIPARAM_DDR_DQ_2_PACKAGE_LENGTH=550, PCW_UIPARAM_DDR_DQ_3_PACKAGE_LENGTH=780, PCW_UIPARAM_DDR_CLOCK_0_PACKAGE_LENGTH=86.1835, PCW_UIPARAM_DDR_CLOCK_1_PACKAGE_LENGTH=86.1835, PCW_UIPARAM_DDR_CLOCK_2_PACKAGE_LENGTH=86.1835, PCW_UIPARAM_DDR_CLOCK_3_PACKAGE_LENGTH=86.1835, PCW_UIPARAM_DDR_DQS_0_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_DQS_1_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_DQS_2_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_DQS_3_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_DQ_0_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_DQ_1_PROPOGATION_DELAY=160\ +, PCW_UIPARAM_DDR_DQ_2_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_DQ_3_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_CLOCK_0_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_CLOCK_1_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_CLOCK_2_PROPOGATION_DELAY=160, PCW_UIPARAM_DDR_CLOCK_3_PROPOGATION_DELAY=160, PCW_CRYSTAL_PERIPHERAL_FREQMHZ=33.333333, PCW_APU_PERIPHERAL_FREQMHZ=666.666666, PCW_DCI_PERIPHERAL_FREQMHZ=10.159, PCW_QSPI_PERIPHERAL_FREQMHZ=200, PCW_SMC_PERIPHERAL_FREQMHZ=100, PCW_USB0_PERIPHERAL_FREQMHZ=60, PCW_USB1_PERIPHERAL_FREQMHZ=60, PCW_SDIO_PERIPHERAL_FREQMHZ=100, PCW_UART_PERIPHERAL_FREQMHZ=100, PCW_SPI_PERIPHERAL_FREQMHZ=166.666666, PCW_CAN_PERIPHERAL_FREQMHZ=100, PCW_CAN0_PERIPHERAL_FREQMHZ=-1, PCW_CAN1_PERIPHERAL_FREQMHZ=-1, PCW_WDT_PERIPHERAL_FREQMHZ=133.333333, PCW_TTC_PERIPHERAL_FREQMHZ=50, PCW_TTC0_CLK0_PERIPHERAL_FREQMHZ=133.333333, PCW_TTC0_CLK1_PERIPHERAL_FREQMHZ=133.333333, PCW_TTC0_CLK2_PERIPHERAL_FREQMHZ=133.333333, PCW_TTC1_CLK0_PERIPHERAL_FREQMHZ=133.333333, PCW_TTC1_CLK1_PERIPHERAL_FREQMHZ=133.333333, PCW_TTC1_CLK2_PERIPHERAL_FREQMHZ=133.333333, PCW_PCAP_PERIPHERAL_FREQMHZ=200, PCW_TPIU_PERIPHERAL_FREQMHZ=200, PCW_FPGA0_PERIPHERAL_FREQMHZ=50, PCW_FPGA1_PERIPHERAL_FREQMHZ=100, PCW_FPGA2_PERIPHERAL_FREQMHZ=50, PCW_FPGA3_PERIPHERAL_FREQMHZ=50, PCW_OVERRIDE_BASIC_CLOCK=0, PCW_ARMPLL_CTRL_FBDIV=40, PCW_IOPLL_CTRL_FBDIV=30, PCW_DDRPLL_CTRL_FBDIV=32, PCW_CPU_CPU_PLL_FREQMHZ=1333.333, PCW_IO_IO_PLL_FREQMHZ=1000.000, PCW_DDR_DDR_PLL_FREQMHZ=1066.667, PCW_USE_M_AXI_GP0=1, PCW_USE_M_AXI_GP1=0, PCW_USE_S_AXI_GP0=0, PCW_USE_S_AXI_GP1=0, PCW_USE_S_AXI_ACP=0, PCW_USE_S_AXI_HP0=0, PCW_USE_S_AXI_HP1=0, PCW_USE_S_AXI_HP2=0, PCW_USE_S_AXI_HP3=0, PCW_M_AXI_GP0_FREQMHZ=50\ +, PCW_M_AXI_GP1_FREQMHZ=10, PCW_S_AXI_GP0_FREQMHZ=10, PCW_S_AXI_GP1_FREQMHZ=10, PCW_S_AXI_ACP_FREQMHZ=10, PCW_S_AXI_HP0_FREQMHZ=10, PCW_S_AXI_HP1_FREQMHZ=10, PCW_S_AXI_HP2_FREQMHZ=10, PCW_S_AXI_HP3_FREQMHZ=10, PCW_USE_CROSS_TRIGGER=0, PCW_UART0_BAUD_RATE=115200, PCW_UART1_BAUD_RATE=115200, PCW_S_AXI_HP0_DATA_WIDTH=64, PCW_S_AXI_HP1_DATA_WIDTH=64, PCW_S_AXI_HP2_DATA_WIDTH=64, PCW_S_AXI_HP3_DATA_WIDTH=64, PCW_IRQ_F2P_MODE=DIRECT, PCW_PRESET_BANK0_VOLTAGE=LVCMOS 3.3V, PCW_PRESET_BANK1_VOLTAGE=LVCMOS 3.3V, PCW_UIPARAM_DDR_ENABLE=1, PCW_UIPARAM_DDR_ADV_ENABLE=0, PCW_UIPARAM_DDR_MEMORY_TYPE=DDR 3 (Low Voltage), PCW_UIPARAM_DDR_ECC=Disabled, PCW_UIPARAM_DDR_BUS_WIDTH=16 Bit, PCW_UIPARAM_DDR_BL=8, PCW_UIPARAM_DDR_HIGH_TEMP=Normal (0-85), PCW_UIPARAM_DDR_PARTNO=MT41J256M16 RE-125, PCW_UIPARAM_DDR_DRAM_WIDTH=16 Bits, PCW_UIPARAM_DDR_DEVICE_CAPACITY=4096 MBits, PCW_UIPARAM_DDR_SPEED_BIN=DDR3_1066F, PCW_UIPARAM_DDR_TRAIN_WRITE_LEVEL=1, PCW_UIPARAM_DDR_TRAIN_READ_GATE=1, PCW_UIPARAM_DDR_TRAIN_DATA_EYE=1, PCW_UIPARAM_DDR_CLOCK_STOP_EN=0, PCW_UIPARAM_DDR_USE_INTERNAL_VREF=0, PCW_DDR_PORT0_HPR_ENABLE=0, PCW_DDR_PORT1_HPR_ENABLE=0, PCW_DDR_PORT2_HPR_ENABLE=0, PCW_DDR_PORT3_HPR_ENABLE=0, PCW_DDR_HPRLPR_QUEUE_PARTITION=HPR(0)/LPR(32), PCW_DDR_LPR_TO_CRITICAL_PRIORITY_LEVEL=2, PCW_DDR_HPR_TO_CRITICAL_PRIORITY_LEVEL=15, PCW_DDR_WRITE_TO_CRITICAL_PRIORITY_LEVEL=2, PCW_NAND_PERIPHERAL_ENABLE=0, PCW_NAND_GRP_D8_ENABLE=0, PCW_NOR_PERIPHERAL_ENABLE=0, PCW_NOR_GRP_A25_ENABLE=0, PCW_NOR_GRP_CS0_ENABLE=0, PCW_NOR_GRP_SRAM_CS0_ENABLE=0, PCW_NOR_GRP_CS1_ENABLE=0, PCW_NOR_GRP_SRAM_CS1_ENABLE=0\ +, PCW_NOR_GRP_SRAM_INT_ENABLE=0, PCW_QSPI_PERIPHERAL_ENABLE=1, PCW_QSPI_QSPI_IO=MIO 1 .. 6, PCW_QSPI_GRP_SINGLE_SS_ENABLE=1, PCW_QSPI_GRP_SINGLE_SS_IO=MIO 1 .. 6, PCW_QSPI_GRP_SS1_ENABLE=0, PCW_QSPI_GRP_IO1_ENABLE=0, PCW_QSPI_GRP_FBCLK_ENABLE=0, PCW_QSPI_INTERNAL_HIGHADDRESS=0xFCFFFFFF, PCW_SINGLE_QSPI_DATA_MODE=x4, PCW_ENET0_PERIPHERAL_ENABLE=0, PCW_ENET0_GRP_MDIO_ENABLE=0, PCW_ENET0_RESET_ENABLE=0, PCW_ENET1_PERIPHERAL_ENABLE=0, PCW_ENET1_GRP_MDIO_ENABLE=0, PCW_ENET1_RESET_ENABLE=0, PCW_SD0_PERIPHERAL_ENABLE=1, PCW_SD0_SD0_IO=EMIO, PCW_SD0_GRP_CD_ENABLE=1, PCW_SD0_GRP_CD_IO=EMIO, PCW_SD0_GRP_WP_ENABLE=1, PCW_SD0_GRP_WP_IO=EMIO, PCW_SD0_GRP_POW_ENABLE=0, PCW_SD1_PERIPHERAL_ENABLE=1, PCW_SD1_SD1_IO=MIO 10 .. 15, PCW_SD1_GRP_CD_ENABLE=1, PCW_SD1_GRP_CD_IO=MIO 0, PCW_SD1_GRP_WP_ENABLE=0, PCW_SD1_GRP_POW_ENABLE=0, PCW_UART0_PERIPHERAL_ENABLE=1, PCW_UART0_UART0_IO=EMIO, PCW_UART0_GRP_FULL_ENABLE=0, PCW_UART1_PERIPHERAL_ENABLE=1, PCW_UART1_UART1_IO=MIO 8 .. 9, PCW_UART1_GRP_FULL_ENABLE=0, PCW_SPI0_PERIPHERAL_ENABLE=1, PCW_SPI0_SPI0_IO=EMIO, PCW_SPI0_GRP_SS0_ENABLE=1, PCW_SPI0_GRP_SS0_IO=EMIO, PCW_SPI0_GRP_SS1_ENABLE=1, PCW_SPI0_GRP_SS1_IO=EMIO, PCW_SPI0_GRP_SS2_ENABLE=1, PCW_SPI0_GRP_SS2_IO=EMIO, PCW_SPI1_PERIPHERAL_ENABLE=1, PCW_SPI1_SPI1_IO=EMIO, PCW_SPI1_GRP_SS0_ENABLE=1, PCW_SPI1_GRP_SS0_IO=EMIO, PCW_SPI1_GRP_SS1_ENABLE=1, PCW_SPI1_GRP_SS1_IO=EMIO, PCW_SPI1_GRP_SS2_ENABLE=1\ +, PCW_SPI1_GRP_SS2_IO=EMIO, PCW_CAN0_PERIPHERAL_ENABLE=0, PCW_CAN0_GRP_CLK_ENABLE=0, PCW_CAN1_PERIPHERAL_ENABLE=0, PCW_CAN1_GRP_CLK_ENABLE=0, PCW_TRACE_PERIPHERAL_ENABLE=0, PCW_TRACE_GRP_2BIT_ENABLE=0, PCW_TRACE_GRP_4BIT_ENABLE=0, PCW_TRACE_GRP_8BIT_ENABLE=0, PCW_TRACE_GRP_16BIT_ENABLE=0, PCW_TRACE_GRP_32BIT_ENABLE=0, PCW_WDT_PERIPHERAL_ENABLE=0, PCW_TTC0_PERIPHERAL_ENABLE=1, PCW_TTC0_TTC0_IO=EMIO, PCW_TTC1_PERIPHERAL_ENABLE=1, PCW_TTC1_TTC1_IO=EMIO, PCW_PJTAG_PERIPHERAL_ENABLE=0, PCW_USB0_PERIPHERAL_ENABLE=1, PCW_USB0_USB0_IO=MIO 28 .. 39, PCW_USB0_RESET_ENABLE=1, PCW_USB0_RESET_IO=MIO 7, PCW_USB1_PERIPHERAL_ENABLE=0, PCW_USB1_RESET_ENABLE=0, PCW_I2C0_PERIPHERAL_ENABLE=1, PCW_I2C0_I2C0_IO=EMIO, PCW_I2C0_GRP_INT_ENABLE=1, PCW_I2C0_GRP_INT_IO=EMIO, PCW_I2C0_RESET_ENABLE=0, PCW_I2C1_PERIPHERAL_ENABLE=1, PCW_I2C1_I2C1_IO=MIO 48 .. 49, PCW_I2C1_GRP_INT_ENABLE=1, PCW_I2C1_GRP_INT_IO=EMIO, PCW_I2C1_RESET_ENABLE=0, PCW_GPIO_PERIPHERAL_ENABLE=0, PCW_GPIO_MIO_GPIO_ENABLE=1, PCW_GPIO_MIO_GPIO_IO=MIO, PCW_GPIO_EMIO_GPIO_ENABLE=1, PCW_GPIO_EMIO_GPIO_IO=64, PCW_APU_CLK_RATIO_ENABLE=0.251400462962963, PCW_ENET0_PERIPHERAL_FREQMHZ=1000 Mbps, PCW_ENET1_PERIPHERAL_FREQMHZ=1000 Mbps, PCW_CPU_PERIPHERAL_CLKSRC=ARM PLL, PCW_DDR_PERIPHERAL_CLKSRC=DDR PLL, PCW_SMC_PERIPHERAL_CLKSRC=IO PLL, PCW_QSPI_PERIPHERAL_CLKSRC=IO PLL, PCW_SDIO_PERIPHERAL_CLKSRC=IO PLL, PCW_UART_PERIPHERAL_CLKSRC=IO PLL, PCW_SPI_PERIPHERAL_CLKSRC=IO PLL, PCW_CAN_PERIPHERAL_CLKSRC=IO PLL, PCW_FCLK0_PERIPHERAL_CLKSRC=IO PLL\ +, PCW_FCLK1_PERIPHERAL_CLKSRC=IO PLL, PCW_FCLK2_PERIPHERAL_CLKSRC=IO PLL, PCW_FCLK3_PERIPHERAL_CLKSRC=IO PLL, PCW_ENET0_PERIPHERAL_CLKSRC=External, PCW_ENET1_PERIPHERAL_CLKSRC=IO PLL, PCW_CAN0_PERIPHERAL_CLKSRC=External, PCW_CAN1_PERIPHERAL_CLKSRC=External, PCW_TPIU_PERIPHERAL_CLKSRC=External, PCW_TTC0_CLK0_PERIPHERAL_CLKSRC=CPU_1X, PCW_TTC0_CLK1_PERIPHERAL_CLKSRC=CPU_1X, PCW_TTC0_CLK2_PERIPHERAL_CLKSRC=CPU_1X, PCW_TTC1_CLK0_PERIPHERAL_CLKSRC=CPU_1X, PCW_TTC1_CLK1_PERIPHERAL_CLKSRC=CPU_1X, PCW_TTC1_CLK2_PERIPHERAL_CLKSRC=CPU_1X, PCW_WDT_PERIPHERAL_CLKSRC=CPU_1X, PCW_DCI_PERIPHERAL_CLKSRC=DDR PLL, PCW_PCAP_PERIPHERAL_CLKSRC=IO PLL, PCW_USB_RESET_POLARITY=Active Low, PCW_ENET_RESET_POLARITY=Active Low, PCW_I2C_RESET_POLARITY=Active Low, PCW_FPGA_FCLK0_ENABLE=1, PCW_FPGA_FCLK1_ENABLE=1, PCW_FPGA_FCLK2_ENABLE=0, PCW_FPGA_FCLK3_ENABLE=0, PCW_NOR_SRAM_CS0_T_TR=1, PCW_NOR_SRAM_CS0_T_PC=1, PCW_NOR_SRAM_CS0_T_WP=1, PCW_NOR_SRAM_CS0_T_CEOE=1, PCW_NOR_SRAM_CS0_T_WC=11, PCW_NOR_SRAM_CS0_T_RC=11, PCW_NOR_SRAM_CS0_WE_TIME=0, PCW_NOR_SRAM_CS1_T_TR=1, PCW_NOR_SRAM_CS1_T_PC=1, PCW_NOR_SRAM_CS1_T_WP=1, PCW_NOR_SRAM_CS1_T_CEOE=1, PCW_NOR_SRAM_CS1_T_WC=11, PCW_NOR_SRAM_CS1_T_RC=11, PCW_NOR_SRAM_CS1_WE_TIME=0, PCW_NOR_CS0_T_TR=1, PCW_NOR_CS0_T_PC=1, PCW_NOR_CS0_T_WP=1, PCW_NOR_CS0_T_CEOE=1, PCW_NOR_CS0_T_WC=11, PCW_NOR_CS0_T_RC=11, PCW_NOR_CS0_WE_TIME=0, PCW_NOR_CS1_T_TR=1, PCW_NOR_CS1_T_PC=1, PCW_NOR_CS1_T_WP=1, PCW_NOR_CS1_T_CEOE=1, PCW_NOR_CS1_T_WC=11\ +, PCW_NOR_CS1_T_RC=11, PCW_NOR_CS1_WE_TIME=0, PCW_NAND_CYCLES_T_RR=1, PCW_NAND_CYCLES_T_AR=1, PCW_NAND_CYCLES_T_CLR=1, PCW_NAND_CYCLES_T_WP=1, PCW_NAND_CYCLES_T_REA=1, PCW_NAND_CYCLES_T_WC=11, PCW_NAND_CYCLES_T_RC=11 }" *) +(* HW_HANDOFF = "design_1_processing_system7_0_0.hwdef" *) + +module processing_system7_v5_5_processing_system7 + +#( + parameter integer C_USE_DEFAULT_ACP_USER_VAL = 1, + parameter integer C_S_AXI_ACP_ARUSER_VAL = 31, + parameter integer C_S_AXI_ACP_AWUSER_VAL = 31, + parameter integer C_M_AXI_GP0_THREAD_ID_WIDTH = 12, + parameter integer C_M_AXI_GP1_THREAD_ID_WIDTH = 12, + parameter integer C_M_AXI_GP0_ENABLE_STATIC_REMAP = 1, + parameter integer C_M_AXI_GP1_ENABLE_STATIC_REMAP = 1, + parameter integer C_M_AXI_GP0_ID_WIDTH = 12, + parameter integer C_M_AXI_GP1_ID_WIDTH = 12, + parameter integer C_S_AXI_GP0_ID_WIDTH = 6, + parameter integer C_S_AXI_GP1_ID_WIDTH = 6, + parameter integer C_S_AXI_HP0_ID_WIDTH = 6, + parameter integer C_S_AXI_HP1_ID_WIDTH = 6, + parameter integer C_S_AXI_HP2_ID_WIDTH = 6, + parameter integer C_S_AXI_HP3_ID_WIDTH = 6, + parameter integer C_S_AXI_ACP_ID_WIDTH = 3, + parameter integer C_S_AXI_HP0_DATA_WIDTH = 64, + parameter integer C_S_AXI_HP1_DATA_WIDTH = 64, + parameter integer C_S_AXI_HP2_DATA_WIDTH = 64, + parameter integer C_S_AXI_HP3_DATA_WIDTH = 64, + parameter integer C_INCLUDE_ACP_TRANS_CHECK = 0, + parameter integer C_NUM_F2P_INTR_INPUTS = 1, + parameter C_FCLK_CLK0_BUF = "TRUE", + parameter C_FCLK_CLK1_BUF = "TRUE", + parameter C_FCLK_CLK2_BUF = "TRUE", + parameter C_FCLK_CLK3_BUF = "TRUE", + parameter integer C_EMIO_GPIO_WIDTH = 64, + parameter integer C_INCLUDE_TRACE_BUFFER = 0, + parameter integer C_TRACE_BUFFER_FIFO_SIZE = 128, + parameter integer C_TRACE_BUFFER_CLOCK_DELAY = 12, + parameter integer USE_TRACE_DATA_EDGE_DETECTOR = 0, + parameter integer C_TRACE_PIPELINE_WIDTH = 8, + parameter C_PS7_SI_REV = "PRODUCTION", + parameter integer C_EN_EMIO_ENET0 = 0, + parameter integer C_EN_EMIO_ENET1 = 0, + parameter integer C_EN_EMIO_TRACE = 0, + parameter integer C_DQ_WIDTH = 32, + parameter integer C_DQS_WIDTH = 4, + parameter integer C_DM_WIDTH = 4, + parameter integer C_MIO_PRIMITIVE = 54, + parameter C_PACKAGE_NAME = "clg484", + parameter C_IRQ_F2P_MODE = "DIRECT", + parameter C_TRACE_INTERNAL_WIDTH = 32, + parameter integer C_EN_EMIO_PJTAG = 0, + + // Enable and disable AFI Secure transaction + parameter C_USE_AXI_NONSECURE = 0, + + //parameters for HP enable ports + parameter C_USE_S_AXI_HP0 = 0, + parameter C_USE_S_AXI_HP1 = 0, + parameter C_USE_S_AXI_HP2 = 0, + parameter C_USE_S_AXI_HP3 = 0, + + //parameters for GP and ACP enable ports */ + parameter C_USE_M_AXI_GP0 = 0, + parameter C_USE_M_AXI_GP1 = 0, + parameter C_USE_S_AXI_GP0 = 0, + parameter C_USE_S_AXI_GP1 = 0, + parameter C_USE_S_AXI_ACP = 0, + parameter C_GP0_EN_MODIFIABLE_TXN=0, + parameter C_GP1_EN_MODIFIABLE_TXN=0 + +) +( + //FMIO ========================================= + + //FMIO CAN0 + output CAN0_PHY_TX, + input CAN0_PHY_RX, + + //FMIO CAN1 + output CAN1_PHY_TX, + input CAN1_PHY_RX, + + //FMIO ENET0 + output reg ENET0_GMII_TX_EN = 'b0, + output reg ENET0_GMII_TX_ER = 'b0, + output ENET0_MDIO_MDC, + output ENET0_MDIO_O, + output ENET0_MDIO_T, + output ENET0_PTP_DELAY_REQ_RX, + output ENET0_PTP_DELAY_REQ_TX, + output ENET0_PTP_PDELAY_REQ_RX, + output ENET0_PTP_PDELAY_REQ_TX, + output ENET0_PTP_PDELAY_RESP_RX, + output ENET0_PTP_PDELAY_RESP_TX, + output ENET0_PTP_SYNC_FRAME_RX, + output ENET0_PTP_SYNC_FRAME_TX, + output ENET0_SOF_RX, + output ENET0_SOF_TX, + + + output reg [7:0] ENET0_GMII_TXD, + + + input ENET0_GMII_COL, + input ENET0_GMII_CRS, + input ENET0_GMII_RX_CLK, + input ENET0_GMII_RX_DV, + input ENET0_GMII_RX_ER, + input ENET0_GMII_TX_CLK, + input ENET0_MDIO_I, + input ENET0_EXT_INTIN, + input [7:0] ENET0_GMII_RXD, + + //FMIO ENET1 + output reg ENET1_GMII_TX_EN = 'b0, + output reg ENET1_GMII_TX_ER = 'b0, + output ENET1_MDIO_MDC, + output ENET1_MDIO_O, + output ENET1_MDIO_T, + output ENET1_PTP_DELAY_REQ_RX, + output ENET1_PTP_DELAY_REQ_TX, + output ENET1_PTP_PDELAY_REQ_RX, + output ENET1_PTP_PDELAY_REQ_TX, + output ENET1_PTP_PDELAY_RESP_RX, + output ENET1_PTP_PDELAY_RESP_TX, + output ENET1_PTP_SYNC_FRAME_RX, + output ENET1_PTP_SYNC_FRAME_TX, + output ENET1_SOF_RX, + output ENET1_SOF_TX, + output reg [7:0] ENET1_GMII_TXD, + + input ENET1_GMII_COL, + input ENET1_GMII_CRS, + input ENET1_GMII_RX_CLK, + input ENET1_GMII_RX_DV, + input ENET1_GMII_RX_ER, + input ENET1_GMII_TX_CLK, + input ENET1_MDIO_I, + input ENET1_EXT_INTIN, + input [7:0] ENET1_GMII_RXD, + + //FMIO GPIO + input [(C_EMIO_GPIO_WIDTH-1):0] GPIO_I, + output [(C_EMIO_GPIO_WIDTH-1):0] GPIO_O, + output [(C_EMIO_GPIO_WIDTH-1):0] GPIO_T, + + //FMIO I2C0 + input I2C0_SDA_I, + output I2C0_SDA_O, + output I2C0_SDA_T, + input I2C0_SCL_I, + output I2C0_SCL_O, + output I2C0_SCL_T, + + //FMIO I2C1 + input I2C1_SDA_I, + output I2C1_SDA_O, + output I2C1_SDA_T, + input I2C1_SCL_I, + output I2C1_SCL_O, + output I2C1_SCL_T, + + //FMIO PJTAG + input PJTAG_TCK, + input PJTAG_TMS, + input PJTAG_TDI, + output PJTAG_TDO, + + + //FMIO SDIO0 + output SDIO0_CLK, + input SDIO0_CLK_FB, + output SDIO0_CMD_O, + input SDIO0_CMD_I, + output SDIO0_CMD_T, + input [3:0] SDIO0_DATA_I, + output [3:0] SDIO0_DATA_O, + output [3:0] SDIO0_DATA_T, + output SDIO0_LED, + input SDIO0_CDN, + input SDIO0_WP, + output SDIO0_BUSPOW, + output [2:0] SDIO0_BUSVOLT, + + //FMIO SDIO1 + output SDIO1_CLK, + input SDIO1_CLK_FB, + output SDIO1_CMD_O, + input SDIO1_CMD_I, + output SDIO1_CMD_T, + input [3:0] SDIO1_DATA_I, + output [3:0] SDIO1_DATA_O, + output [3:0] SDIO1_DATA_T, + output SDIO1_LED, + input SDIO1_CDN, + input SDIO1_WP, + output SDIO1_BUSPOW, + output [2:0] SDIO1_BUSVOLT, + + //FMIO SPI0 + input SPI0_SCLK_I, + output SPI0_SCLK_O, + output SPI0_SCLK_T, + input SPI0_MOSI_I, + output SPI0_MOSI_O, + output SPI0_MOSI_T, + input SPI0_MISO_I, + output SPI0_MISO_O, + output SPI0_MISO_T, + input SPI0_SS_I, + output SPI0_SS_O, + output SPI0_SS1_O, + output SPI0_SS2_O, + output SPI0_SS_T, + + //FMIO SPI1 + input SPI1_SCLK_I, + output SPI1_SCLK_O, + output SPI1_SCLK_T, + input SPI1_MOSI_I, + output SPI1_MOSI_O, + output SPI1_MOSI_T, + input SPI1_MISO_I, + output SPI1_MISO_O, + output SPI1_MISO_T, + input SPI1_SS_I, + output SPI1_SS_O, + output SPI1_SS1_O, + output SPI1_SS2_O, + output SPI1_SS_T, + + //FMIO UART0 + output UART0_DTRN, + output UART0_RTSN, + output UART0_TX, + input UART0_CTSN, + input UART0_DCDN, + input UART0_DSRN, + input UART0_RIN, + input UART0_RX, + + //FMIO UART1 + output UART1_DTRN, + output UART1_RTSN, + output UART1_TX, + input UART1_CTSN, + input UART1_DCDN, + input UART1_DSRN, + input UART1_RIN, + input UART1_RX, + + //FMIO TTC0 + output TTC0_WAVE0_OUT, + output TTC0_WAVE1_OUT, + output TTC0_WAVE2_OUT, + input TTC0_CLK0_IN, + input TTC0_CLK1_IN, + input TTC0_CLK2_IN, + + //FMIO TTC1 + output TTC1_WAVE0_OUT, + output TTC1_WAVE1_OUT, + output TTC1_WAVE2_OUT, + input TTC1_CLK0_IN, + input TTC1_CLK1_IN, + input TTC1_CLK2_IN, + + //WDT + input WDT_CLK_IN, + output WDT_RST_OUT, + + //FTPORT + input TRACE_CLK, + output TRACE_CTL, + output [(C_TRACE_INTERNAL_WIDTH)-1:0] TRACE_DATA, + output reg TRACE_CLK_OUT, + + // USB + output [1:0] USB0_PORT_INDCTL, + output USB0_VBUS_PWRSELECT, + input USB0_VBUS_PWRFAULT, + + output [1:0] USB1_PORT_INDCTL, + output USB1_VBUS_PWRSELECT, + input USB1_VBUS_PWRFAULT, + + input SRAM_INTIN, + + //AIO =================================================== + + //M_AXI_GP0 + + // -- Output + + output M_AXI_GP0_ARESETN, + output M_AXI_GP0_ARVALID, + output M_AXI_GP0_AWVALID, + output M_AXI_GP0_BREADY, + output M_AXI_GP0_RREADY, + output M_AXI_GP0_WLAST, + output M_AXI_GP0_WVALID, + output [(C_M_AXI_GP0_THREAD_ID_WIDTH - 1):0] M_AXI_GP0_ARID, + output [(C_M_AXI_GP0_THREAD_ID_WIDTH - 1):0] M_AXI_GP0_AWID, + output [(C_M_AXI_GP0_THREAD_ID_WIDTH - 1):0] M_AXI_GP0_WID, + output [1:0] M_AXI_GP0_ARBURST, + output [1:0] M_AXI_GP0_ARLOCK, + output [2:0] M_AXI_GP0_ARSIZE, + output [1:0] M_AXI_GP0_AWBURST, + output [1:0] M_AXI_GP0_AWLOCK, + output [2:0] M_AXI_GP0_AWSIZE, + output [2:0] M_AXI_GP0_ARPROT, + output [2:0] M_AXI_GP0_AWPROT, + output [31:0] M_AXI_GP0_ARADDR, + output [31:0] M_AXI_GP0_AWADDR, + output [31:0] M_AXI_GP0_WDATA, + output [3:0] M_AXI_GP0_ARCACHE, + output [3:0] M_AXI_GP0_ARLEN, + output [3:0] M_AXI_GP0_ARQOS, + output [3:0] M_AXI_GP0_AWCACHE, + output [3:0] M_AXI_GP0_AWLEN, + output [3:0] M_AXI_GP0_AWQOS, + output [3:0] M_AXI_GP0_WSTRB, + + // -- Input + + input M_AXI_GP0_ACLK, + input M_AXI_GP0_ARREADY, + input M_AXI_GP0_AWREADY, + input M_AXI_GP0_BVALID, + input M_AXI_GP0_RLAST, + input M_AXI_GP0_RVALID, + input M_AXI_GP0_WREADY, + input [(C_M_AXI_GP0_THREAD_ID_WIDTH - 1):0] M_AXI_GP0_BID, + input [(C_M_AXI_GP0_THREAD_ID_WIDTH - 1):0] M_AXI_GP0_RID, + input [1:0] M_AXI_GP0_BRESP, + input [1:0] M_AXI_GP0_RRESP, + input [31:0] M_AXI_GP0_RDATA, + + + //M_AXI_GP1 + + // -- Output + + output M_AXI_GP1_ARESETN, + output M_AXI_GP1_ARVALID, + output M_AXI_GP1_AWVALID, + output M_AXI_GP1_BREADY, + output M_AXI_GP1_RREADY, + output M_AXI_GP1_WLAST, + output M_AXI_GP1_WVALID, + output [(C_M_AXI_GP1_THREAD_ID_WIDTH - 1):0] M_AXI_GP1_ARID, + output [(C_M_AXI_GP1_THREAD_ID_WIDTH - 1):0] M_AXI_GP1_AWID, + output [(C_M_AXI_GP1_THREAD_ID_WIDTH - 1):0] M_AXI_GP1_WID, + output [1:0] M_AXI_GP1_ARBURST, + output [1:0] M_AXI_GP1_ARLOCK, + output [2:0] M_AXI_GP1_ARSIZE, + output [1:0] M_AXI_GP1_AWBURST, + output [1:0] M_AXI_GP1_AWLOCK, + output [2:0] M_AXI_GP1_AWSIZE, + output [2:0] M_AXI_GP1_ARPROT, + output [2:0] M_AXI_GP1_AWPROT, + output [31:0] M_AXI_GP1_ARADDR, + output [31:0] M_AXI_GP1_AWADDR, + output [31:0] M_AXI_GP1_WDATA, + output [3:0] M_AXI_GP1_ARCACHE, + output [3:0] M_AXI_GP1_ARLEN, + output [3:0] M_AXI_GP1_ARQOS, + output [3:0] M_AXI_GP1_AWCACHE, + output [3:0] M_AXI_GP1_AWLEN, + output [3:0] M_AXI_GP1_AWQOS, + output [3:0] M_AXI_GP1_WSTRB, + + // -- Input + + input M_AXI_GP1_ACLK, + input M_AXI_GP1_ARREADY, + input M_AXI_GP1_AWREADY, + input M_AXI_GP1_BVALID, + input M_AXI_GP1_RLAST, + input M_AXI_GP1_RVALID, + input M_AXI_GP1_WREADY, + input [(C_M_AXI_GP1_THREAD_ID_WIDTH - 1):0] M_AXI_GP1_BID, + input [(C_M_AXI_GP1_THREAD_ID_WIDTH - 1):0] M_AXI_GP1_RID, + input [1:0] M_AXI_GP1_BRESP, + input [1:0] M_AXI_GP1_RRESP, + input [31:0] M_AXI_GP1_RDATA, + + + // S_AXI_GP0 + + // -- Output + + output S_AXI_GP0_ARESETN, + output S_AXI_GP0_ARREADY, + output S_AXI_GP0_AWREADY, + output S_AXI_GP0_BVALID, + output S_AXI_GP0_RLAST, + output S_AXI_GP0_RVALID, + output S_AXI_GP0_WREADY, + output [1:0] S_AXI_GP0_BRESP, + output [1:0] S_AXI_GP0_RRESP, + output [31:0] S_AXI_GP0_RDATA, + output [(C_S_AXI_GP0_ID_WIDTH - 1) : 0] S_AXI_GP0_BID, + output [(C_S_AXI_GP0_ID_WIDTH - 1) : 0] S_AXI_GP0_RID, + + // -- Input + input S_AXI_GP0_ACLK, + input S_AXI_GP0_ARVALID, + input S_AXI_GP0_AWVALID, + input S_AXI_GP0_BREADY, + input S_AXI_GP0_RREADY, + input S_AXI_GP0_WLAST, + input S_AXI_GP0_WVALID, + input [1:0] S_AXI_GP0_ARBURST, + input [1:0] S_AXI_GP0_ARLOCK, + input [2:0] S_AXI_GP0_ARSIZE, + input [1:0] S_AXI_GP0_AWBURST, + input [1:0] S_AXI_GP0_AWLOCK, + input [2:0] S_AXI_GP0_AWSIZE, + input [2:0] S_AXI_GP0_ARPROT, + input [2:0] S_AXI_GP0_AWPROT, + input [31:0] S_AXI_GP0_ARADDR, + input [31:0] S_AXI_GP0_AWADDR, + input [31:0] S_AXI_GP0_WDATA, + input [3:0] S_AXI_GP0_ARCACHE, + input [3:0] S_AXI_GP0_ARLEN, + input [3:0] S_AXI_GP0_ARQOS, + input [3:0] S_AXI_GP0_AWCACHE, + input [3:0] S_AXI_GP0_AWLEN, + input [3:0] S_AXI_GP0_AWQOS, + input [3:0] S_AXI_GP0_WSTRB, + input [(C_S_AXI_GP0_ID_WIDTH - 1) : 0] S_AXI_GP0_ARID, + input [(C_S_AXI_GP0_ID_WIDTH - 1) : 0] S_AXI_GP0_AWID, + input [(C_S_AXI_GP0_ID_WIDTH - 1) : 0] S_AXI_GP0_WID, + + // S_AXI_GP1 + + // -- Output + output S_AXI_GP1_ARESETN, + output S_AXI_GP1_ARREADY, + output S_AXI_GP1_AWREADY, + output S_AXI_GP1_BVALID, + output S_AXI_GP1_RLAST, + output S_AXI_GP1_RVALID, + output S_AXI_GP1_WREADY, + output [1:0] S_AXI_GP1_BRESP, + output [1:0] S_AXI_GP1_RRESP, + output [31:0] S_AXI_GP1_RDATA, + output [(C_S_AXI_GP1_ID_WIDTH - 1) : 0] S_AXI_GP1_BID, + output [(C_S_AXI_GP1_ID_WIDTH - 1) : 0] S_AXI_GP1_RID, + + // -- Input + input S_AXI_GP1_ACLK, + input S_AXI_GP1_ARVALID, + input S_AXI_GP1_AWVALID, + input S_AXI_GP1_BREADY, + input S_AXI_GP1_RREADY, + input S_AXI_GP1_WLAST, + input S_AXI_GP1_WVALID, + input [1:0] S_AXI_GP1_ARBURST, + input [1:0] S_AXI_GP1_ARLOCK, + input [2:0] S_AXI_GP1_ARSIZE, + input [1:0] S_AXI_GP1_AWBURST, + input [1:0] S_AXI_GP1_AWLOCK, + input [2:0] S_AXI_GP1_AWSIZE, + input [2:0] S_AXI_GP1_ARPROT, + input [2:0] S_AXI_GP1_AWPROT, + input [31:0] S_AXI_GP1_ARADDR, + input [31:0] S_AXI_GP1_AWADDR, + input [31:0] S_AXI_GP1_WDATA, + input [3:0] S_AXI_GP1_ARCACHE, + input [3:0] S_AXI_GP1_ARLEN, + input [3:0] S_AXI_GP1_ARQOS, + input [3:0] S_AXI_GP1_AWCACHE, + input [3:0] S_AXI_GP1_AWLEN, + input [3:0] S_AXI_GP1_AWQOS, + input [3:0] S_AXI_GP1_WSTRB, + input [(C_S_AXI_GP1_ID_WIDTH - 1) : 0] S_AXI_GP1_ARID, + input [(C_S_AXI_GP1_ID_WIDTH - 1) : 0] S_AXI_GP1_AWID, + input [(C_S_AXI_GP1_ID_WIDTH - 1) : 0] S_AXI_GP1_WID, + + //S_AXI_ACP + + // -- Output + + output S_AXI_ACP_ARESETN, + output S_AXI_ACP_ARREADY, + output S_AXI_ACP_AWREADY, + output S_AXI_ACP_BVALID, + output S_AXI_ACP_RLAST, + output S_AXI_ACP_RVALID, + output S_AXI_ACP_WREADY, + output [1:0] S_AXI_ACP_BRESP, + output [1:0] S_AXI_ACP_RRESP, + output [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ACP_BID, + output [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ACP_RID, + output [63:0] S_AXI_ACP_RDATA, + + // -- Input + + input S_AXI_ACP_ACLK, + input S_AXI_ACP_ARVALID, + input S_AXI_ACP_AWVALID, + input S_AXI_ACP_BREADY, + input S_AXI_ACP_RREADY, + input S_AXI_ACP_WLAST, + input S_AXI_ACP_WVALID, + input [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ACP_ARID, + input [2:0] S_AXI_ACP_ARPROT, + input [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ACP_AWID, + input [2:0] S_AXI_ACP_AWPROT, + input [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ACP_WID, + input [31:0] S_AXI_ACP_ARADDR, + input [31:0] S_AXI_ACP_AWADDR, + input [3:0] S_AXI_ACP_ARCACHE, + input [3:0] S_AXI_ACP_ARLEN, + input [3:0] S_AXI_ACP_ARQOS, + input [3:0] S_AXI_ACP_AWCACHE, + input [3:0] S_AXI_ACP_AWLEN, + input [3:0] S_AXI_ACP_AWQOS, + input [1:0] S_AXI_ACP_ARBURST, + input [1:0] S_AXI_ACP_ARLOCK, + input [2:0] S_AXI_ACP_ARSIZE, + input [1:0] S_AXI_ACP_AWBURST, + input [1:0] S_AXI_ACP_AWLOCK, + input [2:0] S_AXI_ACP_AWSIZE, + input [4:0] S_AXI_ACP_ARUSER, + input [4:0] S_AXI_ACP_AWUSER, + input [63:0] S_AXI_ACP_WDATA, + input [7:0] S_AXI_ACP_WSTRB, + + // S_AXI_HP_0 + + // -- Output + output S_AXI_HP0_ARESETN, + output S_AXI_HP0_ARREADY, + output S_AXI_HP0_AWREADY, + output S_AXI_HP0_BVALID, + output S_AXI_HP0_RLAST, + output S_AXI_HP0_RVALID, + output S_AXI_HP0_WREADY, + output [1:0] S_AXI_HP0_BRESP, + output [1:0] S_AXI_HP0_RRESP, + output [(C_S_AXI_HP0_ID_WIDTH - 1) : 0] S_AXI_HP0_BID, + output [(C_S_AXI_HP0_ID_WIDTH - 1) : 0] S_AXI_HP0_RID, + output [(C_S_AXI_HP0_DATA_WIDTH - 1) :0] S_AXI_HP0_RDATA, + output [7:0] S_AXI_HP0_RCOUNT, + output [7:0] S_AXI_HP0_WCOUNT, + output [2:0] S_AXI_HP0_RACOUNT, + output [5:0] S_AXI_HP0_WACOUNT, + + // -- Input + input S_AXI_HP0_ACLK, + input S_AXI_HP0_ARVALID, + input S_AXI_HP0_AWVALID, + input S_AXI_HP0_BREADY, + input S_AXI_HP0_RDISSUECAP1_EN, + input S_AXI_HP0_RREADY, + input S_AXI_HP0_WLAST, + input S_AXI_HP0_WRISSUECAP1_EN, + input S_AXI_HP0_WVALID, + input [1:0] S_AXI_HP0_ARBURST, + input [1:0] S_AXI_HP0_ARLOCK, + input [2:0] S_AXI_HP0_ARSIZE, + input [1:0] S_AXI_HP0_AWBURST, + input [1:0] S_AXI_HP0_AWLOCK, + input [2:0] S_AXI_HP0_AWSIZE, + input [2:0] S_AXI_HP0_ARPROT, + input [2:0] S_AXI_HP0_AWPROT, + input [31:0] S_AXI_HP0_ARADDR, + input [31:0] S_AXI_HP0_AWADDR, + input [3:0] S_AXI_HP0_ARCACHE, + input [3:0] S_AXI_HP0_ARLEN, + input [3:0] S_AXI_HP0_ARQOS, + input [3:0] S_AXI_HP0_AWCACHE, + input [3:0] S_AXI_HP0_AWLEN, + input [3:0] S_AXI_HP0_AWQOS, + input [(C_S_AXI_HP0_ID_WIDTH - 1) : 0] S_AXI_HP0_ARID, + input [(C_S_AXI_HP0_ID_WIDTH - 1) : 0] S_AXI_HP0_AWID, + input [(C_S_AXI_HP0_ID_WIDTH - 1) : 0] S_AXI_HP0_WID, + input [(C_S_AXI_HP0_DATA_WIDTH - 1) :0] S_AXI_HP0_WDATA, + input [((C_S_AXI_HP0_DATA_WIDTH/8)-1):0] S_AXI_HP0_WSTRB, + + // S_AXI_HP1 + // -- Output + output S_AXI_HP1_ARESETN, + output S_AXI_HP1_ARREADY, + output S_AXI_HP1_AWREADY, + output S_AXI_HP1_BVALID, + output S_AXI_HP1_RLAST, + output S_AXI_HP1_RVALID, + output S_AXI_HP1_WREADY, + output [1:0] S_AXI_HP1_BRESP, + output [1:0] S_AXI_HP1_RRESP, + output [(C_S_AXI_HP1_ID_WIDTH - 1) : 0] S_AXI_HP1_BID, + output [(C_S_AXI_HP1_ID_WIDTH - 1) : 0] S_AXI_HP1_RID, + output [(C_S_AXI_HP1_DATA_WIDTH - 1) :0] S_AXI_HP1_RDATA, + output [7:0] S_AXI_HP1_RCOUNT, + output [7:0] S_AXI_HP1_WCOUNT, + output [2:0] S_AXI_HP1_RACOUNT, + output [5:0] S_AXI_HP1_WACOUNT, + + + // -- Input + input S_AXI_HP1_ACLK, + input S_AXI_HP1_ARVALID, + input S_AXI_HP1_AWVALID, + input S_AXI_HP1_BREADY, + input S_AXI_HP1_RDISSUECAP1_EN, + input S_AXI_HP1_RREADY, + input S_AXI_HP1_WLAST, + input S_AXI_HP1_WRISSUECAP1_EN, + input S_AXI_HP1_WVALID, + input [1:0] S_AXI_HP1_ARBURST, + input [1:0] S_AXI_HP1_ARLOCK, + input [2:0] S_AXI_HP1_ARSIZE, + input [1:0] S_AXI_HP1_AWBURST, + input [1:0] S_AXI_HP1_AWLOCK, + input [2:0] S_AXI_HP1_AWSIZE, + input [2:0] S_AXI_HP1_ARPROT, + input [2:0] S_AXI_HP1_AWPROT, + input [31:0] S_AXI_HP1_ARADDR, + input [31:0] S_AXI_HP1_AWADDR, + input [3:0] S_AXI_HP1_ARCACHE, + input [3:0] S_AXI_HP1_ARLEN, + input [3:0] S_AXI_HP1_ARQOS, + input [3:0] S_AXI_HP1_AWCACHE, + input [3:0] S_AXI_HP1_AWLEN, + input [3:0] S_AXI_HP1_AWQOS, + input [(C_S_AXI_HP1_ID_WIDTH - 1) : 0] S_AXI_HP1_ARID, + input [(C_S_AXI_HP1_ID_WIDTH - 1) : 0] S_AXI_HP1_AWID, + input [(C_S_AXI_HP1_ID_WIDTH - 1) : 0] S_AXI_HP1_WID, + input [(C_S_AXI_HP1_DATA_WIDTH - 1) :0] S_AXI_HP1_WDATA, + input [((C_S_AXI_HP1_DATA_WIDTH/8)-1):0] S_AXI_HP1_WSTRB, + + // S_AXI_HP2 + // -- Output + output S_AXI_HP2_ARESETN, + output S_AXI_HP2_ARREADY, + output S_AXI_HP2_AWREADY, + output S_AXI_HP2_BVALID, + output S_AXI_HP2_RLAST, + output S_AXI_HP2_RVALID, + output S_AXI_HP2_WREADY, + output [1:0] S_AXI_HP2_BRESP, + output [1:0] S_AXI_HP2_RRESP, + output [(C_S_AXI_HP2_ID_WIDTH - 1) : 0] S_AXI_HP2_BID, + output [(C_S_AXI_HP2_ID_WIDTH - 1) : 0] S_AXI_HP2_RID, + output [(C_S_AXI_HP2_DATA_WIDTH - 1) :0] S_AXI_HP2_RDATA, + output [7:0] S_AXI_HP2_RCOUNT, + output [7:0] S_AXI_HP2_WCOUNT, + output [2:0] S_AXI_HP2_RACOUNT, + output [5:0] S_AXI_HP2_WACOUNT, + + + // -- Input + input S_AXI_HP2_ACLK, + input S_AXI_HP2_ARVALID, + input S_AXI_HP2_AWVALID, + input S_AXI_HP2_BREADY, + input S_AXI_HP2_RDISSUECAP1_EN, + input S_AXI_HP2_RREADY, + input S_AXI_HP2_WLAST, + input S_AXI_HP2_WRISSUECAP1_EN, + input S_AXI_HP2_WVALID, + input [1:0] S_AXI_HP2_ARBURST, + input [1:0] S_AXI_HP2_ARLOCK, + input [2:0] S_AXI_HP2_ARSIZE, + input [1:0] S_AXI_HP2_AWBURST, + input [1:0] S_AXI_HP2_AWLOCK, + input [2:0] S_AXI_HP2_AWSIZE, + input [2:0] S_AXI_HP2_ARPROT, + input [2:0] S_AXI_HP2_AWPROT, + input [31:0] S_AXI_HP2_ARADDR, + input [31:0] S_AXI_HP2_AWADDR, + input [3:0] S_AXI_HP2_ARCACHE, + input [3:0] S_AXI_HP2_ARLEN, + input [3:0] S_AXI_HP2_ARQOS, + input [3:0] S_AXI_HP2_AWCACHE, + input [3:0] S_AXI_HP2_AWLEN, + input [3:0] S_AXI_HP2_AWQOS, + input [(C_S_AXI_HP2_ID_WIDTH - 1) : 0] S_AXI_HP2_ARID, + input [(C_S_AXI_HP2_ID_WIDTH - 1) : 0] S_AXI_HP2_AWID, + input [(C_S_AXI_HP2_ID_WIDTH - 1) : 0] S_AXI_HP2_WID, + input [(C_S_AXI_HP2_DATA_WIDTH - 1) :0] S_AXI_HP2_WDATA, + input [((C_S_AXI_HP2_DATA_WIDTH/8)-1):0] S_AXI_HP2_WSTRB, + + // S_AXI_HP_3 + + // -- Output + output S_AXI_HP3_ARESETN, + output S_AXI_HP3_ARREADY, + output S_AXI_HP3_AWREADY, + output S_AXI_HP3_BVALID, + output S_AXI_HP3_RLAST, + output S_AXI_HP3_RVALID, + output S_AXI_HP3_WREADY, + output [1:0] S_AXI_HP3_BRESP, + output [1:0] S_AXI_HP3_RRESP, + output [(C_S_AXI_HP3_ID_WIDTH - 1) : 0] S_AXI_HP3_BID, + output [(C_S_AXI_HP3_ID_WIDTH - 1) : 0] S_AXI_HP3_RID, + output [(C_S_AXI_HP3_DATA_WIDTH - 1) :0] S_AXI_HP3_RDATA, + output [7:0] S_AXI_HP3_RCOUNT, + output [7:0] S_AXI_HP3_WCOUNT, + output [2:0] S_AXI_HP3_RACOUNT, + output [5:0] S_AXI_HP3_WACOUNT, + + + // -- Input + input S_AXI_HP3_ACLK, + input S_AXI_HP3_ARVALID, + input S_AXI_HP3_AWVALID, + input S_AXI_HP3_BREADY, + input S_AXI_HP3_RDISSUECAP1_EN, + input S_AXI_HP3_RREADY, + input S_AXI_HP3_WLAST, + input S_AXI_HP3_WRISSUECAP1_EN, + input S_AXI_HP3_WVALID, + input [1:0] S_AXI_HP3_ARBURST, + input [1:0] S_AXI_HP3_ARLOCK, + input [2:0] S_AXI_HP3_ARSIZE, + input [1:0] S_AXI_HP3_AWBURST, + input [1:0] S_AXI_HP3_AWLOCK, + input [2:0] S_AXI_HP3_AWSIZE, + input [2:0] S_AXI_HP3_ARPROT, + input [2:0] S_AXI_HP3_AWPROT, + input [31:0] S_AXI_HP3_ARADDR, + input [31:0] S_AXI_HP3_AWADDR, + input [3:0] S_AXI_HP3_ARCACHE, + input [3:0] S_AXI_HP3_ARLEN, + input [3:0] S_AXI_HP3_ARQOS, + input [3:0] S_AXI_HP3_AWCACHE, + input [3:0] S_AXI_HP3_AWLEN, + input [3:0] S_AXI_HP3_AWQOS, + input [(C_S_AXI_HP3_ID_WIDTH - 1) : 0] S_AXI_HP3_ARID, + input [(C_S_AXI_HP3_ID_WIDTH - 1) : 0] S_AXI_HP3_AWID, + input [(C_S_AXI_HP3_ID_WIDTH - 1) : 0] S_AXI_HP3_WID, + input [(C_S_AXI_HP3_DATA_WIDTH - 1) :0] S_AXI_HP3_WDATA, + input [((C_S_AXI_HP3_DATA_WIDTH/8)-1):0] S_AXI_HP3_WSTRB, + + //FIO ======================================== + + //IRQ + //output [28:0] IRQ_P2F, + output IRQ_P2F_DMAC_ABORT , + output IRQ_P2F_DMAC0, + output IRQ_P2F_DMAC1, + output IRQ_P2F_DMAC2, + output IRQ_P2F_DMAC3, + output IRQ_P2F_DMAC4, + output IRQ_P2F_DMAC5, + output IRQ_P2F_DMAC6, + output IRQ_P2F_DMAC7, + output IRQ_P2F_SMC, + output IRQ_P2F_QSPI, + output IRQ_P2F_CTI, + output IRQ_P2F_GPIO, + output IRQ_P2F_USB0, + output IRQ_P2F_ENET0, + output IRQ_P2F_ENET_WAKE0, + output IRQ_P2F_SDIO0, + output IRQ_P2F_I2C0, + output IRQ_P2F_SPI0, + output IRQ_P2F_UART0, + output IRQ_P2F_CAN0, + output IRQ_P2F_USB1, + output IRQ_P2F_ENET1, + output IRQ_P2F_ENET_WAKE1, + output IRQ_P2F_SDIO1, + output IRQ_P2F_I2C1, + output IRQ_P2F_SPI1, + output IRQ_P2F_UART1, + output IRQ_P2F_CAN1, + input [(C_NUM_F2P_INTR_INPUTS-1):0] IRQ_F2P, + input Core0_nFIQ, + input Core0_nIRQ, + input Core1_nFIQ, + input Core1_nIRQ, + + //DMA + + output [1:0] DMA0_DATYPE, + output DMA0_DAVALID, + output DMA0_DRREADY, + output DMA0_RSTN, + output [1:0] DMA1_DATYPE, + output DMA1_DAVALID, + output DMA1_DRREADY, + output DMA1_RSTN, + output [1:0] DMA2_DATYPE, + output DMA2_DAVALID, + output DMA2_DRREADY, + output DMA2_RSTN, + output [1:0] DMA3_DATYPE, + output DMA3_DAVALID, + output DMA3_DRREADY, + output DMA3_RSTN, + input DMA0_ACLK, + input DMA0_DAREADY, + input DMA0_DRLAST, + input DMA0_DRVALID, + input DMA1_ACLK, + input DMA1_DAREADY, + input DMA1_DRLAST, + input DMA1_DRVALID, + input DMA2_ACLK, + input DMA2_DAREADY, + input DMA2_DRLAST, + input DMA2_DRVALID, + input DMA3_ACLK, + input DMA3_DAREADY, + input DMA3_DRLAST, + input DMA3_DRVALID, + input [1:0] DMA0_DRTYPE, + input [1:0] DMA1_DRTYPE, + input [1:0] DMA2_DRTYPE, + input [1:0] DMA3_DRTYPE, + + //FCLK + output FCLK_CLK3, + output FCLK_CLK2, + output FCLK_CLK1, + output FCLK_CLK0, + + input FCLK_CLKTRIG3_N, + input FCLK_CLKTRIG2_N, + input FCLK_CLKTRIG1_N, + input FCLK_CLKTRIG0_N, + + output FCLK_RESET3_N, + output FCLK_RESET2_N, + output FCLK_RESET1_N, + output FCLK_RESET0_N, + + //FTMD + input [31:0] FTMD_TRACEIN_DATA, + input FTMD_TRACEIN_VALID, + input FTMD_TRACEIN_CLK, + input [3:0] FTMD_TRACEIN_ATID, + + //FTMT + input FTMT_F2P_TRIG_0, + output FTMT_F2P_TRIGACK_0, + input FTMT_F2P_TRIG_1, + output FTMT_F2P_TRIGACK_1, + input FTMT_F2P_TRIG_2, + output FTMT_F2P_TRIGACK_2, + input FTMT_F2P_TRIG_3, + output FTMT_F2P_TRIGACK_3, + input [31:0] FTMT_F2P_DEBUG, + input FTMT_P2F_TRIGACK_0, + output FTMT_P2F_TRIG_0, + input FTMT_P2F_TRIGACK_1, + output FTMT_P2F_TRIG_1, + input FTMT_P2F_TRIGACK_2, + output FTMT_P2F_TRIG_2, + input FTMT_P2F_TRIGACK_3, + output FTMT_P2F_TRIG_3, + output [31:0] FTMT_P2F_DEBUG, + + //FIDLE + input FPGA_IDLE_N, + + //EVENT + + output EVENT_EVENTO, + output [1:0] EVENT_STANDBYWFE, + output [1:0] EVENT_STANDBYWFI, + input EVENT_EVENTI, + + + //DARB + input [3:0] DDR_ARB, + inout [C_MIO_PRIMITIVE - 1:0] MIO, + + //DDR + inout DDR_CAS_n, // CASB + inout DDR_CKE, // CKE + inout DDR_Clk_n, // CKN + inout DDR_Clk, // CKP + inout DDR_CS_n, // CSB + inout DDR_DRSTB, // DDR_DRSTB + inout DDR_ODT, // ODT + inout DDR_RAS_n, // RASB + inout DDR_WEB, + inout [2:0] DDR_BankAddr, // BA + inout [14:0] DDR_Addr, // A + + inout DDR_VRN, + inout DDR_VRP, + inout [C_DM_WIDTH - 1:0] DDR_DM, // DM + inout [C_DQ_WIDTH - 1:0] DDR_DQ, // DQ + inout [C_DQS_WIDTH -1:0] DDR_DQS_n, // DQSN + inout [C_DQS_WIDTH - 1:0] DDR_DQS, // DQSP + + inout PS_SRSTB, // SRSTB + inout PS_CLK, // CLK + inout PS_PORB // PORB + + +); + +wire [11:0] M_AXI_GP0_AWID_FULL; +wire [11:0] M_AXI_GP0_WID_FULL; +wire [11:0] M_AXI_GP0_ARID_FULL; + +wire [11:0] M_AXI_GP0_BID_FULL; +wire [11:0] M_AXI_GP0_RID_FULL; + +wire [11:0] M_AXI_GP1_AWID_FULL; +wire [11:0] M_AXI_GP1_WID_FULL; +wire [11:0] M_AXI_GP1_ARID_FULL; + +wire [11:0] M_AXI_GP1_BID_FULL; +wire [11:0] M_AXI_GP1_RID_FULL; + +wire [3:0] M_AXI_GP0_ARCACHE_t; +wire [3:0] M_AXI_GP1_ARCACHE_t; +wire [3:0] M_AXI_GP0_AWCACHE_t; +wire [3:0] M_AXI_GP1_AWCACHE_t; + + +// Wires for connecting to the PS7 +wire ENET0_GMII_TX_EN_i; +wire ENET0_GMII_TX_ER_i; +reg ENET0_GMII_COL_i; +reg ENET0_GMII_CRS_i; +reg ENET0_GMII_RX_DV_i; +reg ENET0_GMII_RX_ER_i; +reg [7:0] ENET0_GMII_RXD_i; +wire [7:0] ENET0_GMII_TXD_i; + +wire ENET1_GMII_TX_EN_i; +wire ENET1_GMII_TX_ER_i; +reg ENET1_GMII_COL_i; +reg ENET1_GMII_CRS_i; +reg ENET1_GMII_RX_DV_i; +reg ENET1_GMII_RX_ER_i; +reg [7:0] ENET1_GMII_RXD_i; +wire [7:0] ENET1_GMII_TXD_i; + +reg [31:0] FTMD_TRACEIN_DATA_notracebuf; +reg FTMD_TRACEIN_VALID_notracebuf; +reg [3:0] FTMD_TRACEIN_ATID_notracebuf; + +wire [31:0] FTMD_TRACEIN_DATA_i; +wire FTMD_TRACEIN_VALID_i; +wire [3:0] FTMD_TRACEIN_ATID_i; + +wire [31:0] FTMD_TRACEIN_DATA_tracebuf; +wire FTMD_TRACEIN_VALID_tracebuf; +wire [3:0] FTMD_TRACEIN_ATID_tracebuf; + +wire [5:0] S_AXI_GP0_BID_out; +wire [5:0] S_AXI_GP0_RID_out; +wire [5:0] S_AXI_GP0_ARID_in; +wire [5:0] S_AXI_GP0_AWID_in; +wire [5:0] S_AXI_GP0_WID_in; + +wire [5:0] S_AXI_GP1_BID_out; +wire [5:0] S_AXI_GP1_RID_out; +wire [5:0] S_AXI_GP1_ARID_in; +wire [5:0] S_AXI_GP1_AWID_in; +wire [5:0] S_AXI_GP1_WID_in; + +wire [5:0] S_AXI_HP0_BID_out; +wire [5:0] S_AXI_HP0_RID_out; +wire [5:0] S_AXI_HP0_ARID_in; +wire [5:0] S_AXI_HP0_AWID_in; +wire [5:0] S_AXI_HP0_WID_in; + +wire [5:0] S_AXI_HP1_BID_out; +wire [5:0] S_AXI_HP1_RID_out; +wire [5:0] S_AXI_HP1_ARID_in; +wire [5:0] S_AXI_HP1_AWID_in; +wire [5:0] S_AXI_HP1_WID_in; + +wire [5:0] S_AXI_HP2_BID_out; +wire [5:0] S_AXI_HP2_RID_out; +wire [5:0] S_AXI_HP2_ARID_in; +wire [5:0] S_AXI_HP2_AWID_in; +wire [5:0] S_AXI_HP2_WID_in; + +wire [5:0] S_AXI_HP3_BID_out; +wire [5:0] S_AXI_HP3_RID_out; +wire [5:0] S_AXI_HP3_ARID_in; +wire [5:0] S_AXI_HP3_AWID_in; +wire [5:0] S_AXI_HP3_WID_in; + +wire [2:0] S_AXI_ACP_BID_out; +wire [2:0] S_AXI_ACP_RID_out; +wire [2:0] S_AXI_ACP_ARID_in; +wire [2:0] S_AXI_ACP_AWID_in; +wire [2:0] S_AXI_ACP_WID_in; + +wire [63:0] S_AXI_HP0_WDATA_in; +wire [7:0] S_AXI_HP0_WSTRB_in; +wire [63:0] S_AXI_HP0_RDATA_out; + +wire [63:0] S_AXI_HP1_WDATA_in; +wire [7:0] S_AXI_HP1_WSTRB_in; +wire [63:0] S_AXI_HP1_RDATA_out; + +wire [63:0] S_AXI_HP2_WDATA_in; +wire [7:0] S_AXI_HP2_WSTRB_in; +wire [63:0] S_AXI_HP2_RDATA_out; + +wire [63:0] S_AXI_HP3_WDATA_in; +wire [7:0] S_AXI_HP3_WSTRB_in; +wire [63:0] S_AXI_HP3_RDATA_out; + +wire [1:0] M_AXI_GP0_ARSIZE_i; +wire [1:0] M_AXI_GP0_AWSIZE_i; + +wire [1:0] M_AXI_GP1_ARSIZE_i; +wire [1:0] M_AXI_GP1_AWSIZE_i; + +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] SAXIACPBID_W; +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] SAXIACPRID_W; +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] SAXIACPARID_W; +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] SAXIACPAWID_W; +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] SAXIACPWID_W; + + +wire SAXIACPARREADY_W; +wire SAXIACPAWREADY_W; +wire SAXIACPBVALID_W; +wire SAXIACPRLAST_W; +wire SAXIACPRVALID_W; +wire SAXIACPWREADY_W; +wire [1:0] SAXIACPBRESP_W; +wire [1:0] SAXIACPRRESP_W; +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ATC_BID; +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ATC_RID; +wire [63:0] SAXIACPRDATA_W; + +wire S_AXI_ATC_ARVALID; +wire S_AXI_ATC_AWVALID; +wire S_AXI_ATC_BREADY; +wire S_AXI_ATC_RREADY; +wire S_AXI_ATC_WLAST; +wire S_AXI_ATC_WVALID; +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ATC_ARID; +wire [2:0] S_AXI_ATC_ARPROT; +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ATC_AWID; +wire [2:0] S_AXI_ATC_AWPROT; +wire [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] S_AXI_ATC_WID; +wire [31:0] S_AXI_ATC_ARADDR; +wire [31:0] S_AXI_ATC_AWADDR; +wire [3:0] S_AXI_ATC_ARCACHE; +wire [3:0] S_AXI_ATC_ARLEN; +wire [3:0] S_AXI_ATC_ARQOS; +wire [3:0] S_AXI_ATC_AWCACHE; +wire [3:0] S_AXI_ATC_AWLEN; +wire [3:0] S_AXI_ATC_AWQOS; +wire [1:0] S_AXI_ATC_ARBURST; +wire [1:0] S_AXI_ATC_ARLOCK; +wire [2:0] S_AXI_ATC_ARSIZE; +wire [1:0] S_AXI_ATC_AWBURST; +wire [1:0] S_AXI_ATC_AWLOCK; +wire [2:0] S_AXI_ATC_AWSIZE; +wire [4:0] S_AXI_ATC_ARUSER; +wire [4:0] S_AXI_ATC_AWUSER; +wire [63:0] S_AXI_ATC_WDATA; +wire [7:0] S_AXI_ATC_WSTRB; + + +wire SAXIACPARVALID_W; +wire SAXIACPAWVALID_W; +wire SAXIACPBREADY_W; +wire SAXIACPRREADY_W; +wire SAXIACPWLAST_W; +wire SAXIACPWVALID_W; +wire [2:0] SAXIACPARPROT_W; +wire [2:0] SAXIACPAWPROT_W; +wire [31:0] SAXIACPARADDR_W; +wire [31:0] SAXIACPAWADDR_W; +wire [3:0] SAXIACPARCACHE_W; +wire [3:0] SAXIACPARLEN_W; +wire [3:0] SAXIACPARQOS_W; +wire [3:0] SAXIACPAWCACHE_W; +wire [3:0] SAXIACPAWLEN_W; +wire [3:0] SAXIACPAWQOS_W; +wire [1:0] SAXIACPARBURST_W; +wire [1:0] SAXIACPARLOCK_W; +wire [2:0] SAXIACPARSIZE_W; +wire [1:0] SAXIACPAWBURST_W; +wire [1:0] SAXIACPAWLOCK_W; +wire [2:0] SAXIACPAWSIZE_W; +wire [4:0] SAXIACPARUSER_W; +wire [4:0] SAXIACPAWUSER_W; +wire [63:0] SAXIACPWDATA_W; +wire [7:0] SAXIACPWSTRB_W; + +// AxUSER signal update +wire [4:0] param_aruser; +wire [4:0] param_awuser; + +// Added to address CR 651751 +wire [3:0] fclk_clktrig_gnd = 4'h0; + + +wire [19:0] irq_f2p_i; +wire [15:0] irq_f2p_null = 16'h0000; + +// EMIO I2C0 +wire I2C0_SDA_T_n; +wire I2C0_SCL_T_n; +// EMIO I2C1 +wire I2C1_SDA_T_n; +wire I2C1_SCL_T_n; +// EMIO SPI0 +wire SPI0_SCLK_T_n; +wire SPI0_MOSI_T_n; +wire SPI0_MISO_T_n; +wire SPI0_SS_T_n; +// EMIO SPI1 +wire SPI1_SCLK_T_n; +wire SPI1_MOSI_T_n; +wire SPI1_MISO_T_n; +wire SPI1_SS_T_n; + +// EMIO GEM0 +wire ENET0_MDIO_T_n; + +// EMIO GEM1 +wire ENET1_MDIO_T_n; + +// EMIO GPIO +wire [(C_EMIO_GPIO_WIDTH-1):0] GPIO_T_n; + +wire [63:0] gpio_out_t_n; +wire [63:0] gpio_out; +wire [63:0] gpio_in63_0; + +//For Clock buffering +wire [3:0] FCLK_CLK_unbuffered; +wire [3:0] FCLK_CLK_buffered; +wire FCLK_CLK0_temp; + +// EMIO PJTAG +wire PJTAG_TDO_O; +wire PJTAG_TDO_T; +wire PJTAG_TDO_T_n; + +// EMIO SDIO0 +wire SDIO0_CMD_T_n; +wire [3:0] SDIO0_DATA_T_n; + +// EMIO SDIO1 +wire SDIO1_CMD_T_n; +wire [3:0] SDIO1_DATA_T_n; + +// buffered IO +wire [C_MIO_PRIMITIVE - 1:0] buffered_MIO; +wire buffered_DDR_WEB; +wire buffered_DDR_CAS_n; +wire buffered_DDR_CKE; +wire buffered_DDR_Clk_n; +wire buffered_DDR_Clk; +wire buffered_DDR_CS_n; +wire buffered_DDR_DRSTB; +wire buffered_DDR_ODT; +wire buffered_DDR_RAS_n; +wire [2:0] buffered_DDR_BankAddr; +wire [14:0] buffered_DDR_Addr; + +wire buffered_DDR_VRN; +wire buffered_DDR_VRP; +wire [C_DM_WIDTH - 1:0] buffered_DDR_DM; +wire [C_DQ_WIDTH - 1:0] buffered_DDR_DQ; +wire [C_DQS_WIDTH -1:0] buffered_DDR_DQS_n; +wire [C_DQS_WIDTH - 1:0] buffered_DDR_DQS; + +wire buffered_PS_SRSTB; +wire buffered_PS_CLK; +wire buffered_PS_PORB; + +wire S_AXI_HP0_ACLK_temp; +wire S_AXI_HP1_ACLK_temp; +wire S_AXI_HP2_ACLK_temp; +wire S_AXI_HP3_ACLK_temp; +wire M_AXI_GP0_ACLK_temp; +wire M_AXI_GP1_ACLK_temp; +wire S_AXI_GP0_ACLK_temp; +wire S_AXI_GP1_ACLK_temp; +wire S_AXI_ACP_ACLK_temp; + +wire [31:0] TRACE_DATA_i; +wire TRACE_CTL_i; +(* keep = "true" *) reg TRACE_CTL_PIPE [(C_TRACE_PIPELINE_WIDTH - 1):0]; +(* keep = "true" *) reg [(C_TRACE_INTERNAL_WIDTH)-1:0] TRACE_DATA_PIPE [(C_TRACE_PIPELINE_WIDTH - 1):0]; + +// fixed CR #665394 +integer j; +generate + if (C_EN_EMIO_TRACE == 1) begin + always @(posedge TRACE_CLK) + begin + TRACE_CTL_PIPE[C_TRACE_PIPELINE_WIDTH - 1] <= TRACE_CTL_i; + TRACE_DATA_PIPE[C_TRACE_PIPELINE_WIDTH - 1] <= TRACE_DATA_i[(C_TRACE_INTERNAL_WIDTH-1):0]; + for (j=(C_TRACE_PIPELINE_WIDTH-1); j>0; j=j-1) begin + TRACE_CTL_PIPE[j-1] <= TRACE_CTL_PIPE[j]; + TRACE_DATA_PIPE[j-1] <= TRACE_DATA_PIPE[j]; + end + TRACE_CLK_OUT <= ~TRACE_CLK_OUT; + end + end +else +begin +always @* +begin +TRACE_CTL_PIPE[C_TRACE_PIPELINE_WIDTH - 1] <= 1'b0; + TRACE_DATA_PIPE[C_TRACE_PIPELINE_WIDTH - 1] <= 1'b0; + for (j=(C_TRACE_PIPELINE_WIDTH-1); j>0; j=j-1) begin + TRACE_CTL_PIPE[j-1] <= 1'b0; + TRACE_DATA_PIPE[j-1] <= 1'b0; + end + TRACE_CLK_OUT <= 1'b0; + end +end +endgenerate + +assign TRACE_CTL = TRACE_CTL_PIPE[0]; + +assign TRACE_DATA = TRACE_DATA_PIPE[0]; + +//irq_p2f + +// Updated IRQ_F2P logic to address CR 641523 +generate + if(C_NUM_F2P_INTR_INPUTS == 0) begin : irq_f2p_select_null + assign irq_f2p_i[19:0] = {Core1_nFIQ,Core0_nFIQ,Core1_nIRQ,Core0_nIRQ,irq_f2p_null[15:0]}; + end else if(C_NUM_F2P_INTR_INPUTS == 16) begin : irq_f2p_select_all + assign irq_f2p_i[19:0] = {Core1_nFIQ,Core0_nFIQ,Core1_nIRQ,Core0_nIRQ,IRQ_F2P[15:0]}; + end else begin : irq_f2p_select + if (C_IRQ_F2P_MODE == "DIRECT") begin + assign irq_f2p_i[19:0] = {Core1_nFIQ,Core0_nFIQ,Core1_nIRQ,Core0_nIRQ, + irq_f2p_null[(15-C_NUM_F2P_INTR_INPUTS):0], + IRQ_F2P[(C_NUM_F2P_INTR_INPUTS-1):0]}; + end else begin + assign irq_f2p_i[19:0] = {Core1_nFIQ,Core0_nFIQ,Core1_nIRQ,Core0_nIRQ, + IRQ_F2P[(C_NUM_F2P_INTR_INPUTS-1):0], + irq_f2p_null[(15-C_NUM_F2P_INTR_INPUTS):0]}; + end + end +endgenerate + +assign M_AXI_GP0_ARSIZE[2:0] = {1'b0, M_AXI_GP0_ARSIZE_i[1:0]}; +assign M_AXI_GP0_AWSIZE[2:0] = {1'b0, M_AXI_GP0_AWSIZE_i[1:0]}; +assign M_AXI_GP1_ARSIZE[2:0] = {1'b0, M_AXI_GP1_ARSIZE_i[1:0]}; +assign M_AXI_GP1_AWSIZE[2:0] = {1'b0, M_AXI_GP1_AWSIZE_i[1:0]}; + + + +// Compress Function + + +// Modified as per CR 631955 +//function [11:0] uncompress_id; +// input [5:0] id; +// begin +// case (id[5:0]) +// // dmac0 +// 6'd1 : uncompress_id = 12'b010000_1000_00 ; +// 6'd2 : uncompress_id = 12'b010000_0000_00 ; +// 6'd3 : uncompress_id = 12'b010000_0001_00 ; +// 6'd4 : uncompress_id = 12'b010000_0010_00 ; +// 6'd5 : uncompress_id = 12'b010000_0011_00 ; +// 6'd6 : uncompress_id = 12'b010000_0100_00 ; +// 6'd7 : uncompress_id = 12'b010000_0101_00 ; +// 6'd8 : uncompress_id = 12'b010000_0110_00 ; +// 6'd9 : uncompress_id = 12'b010000_0111_00 ; +// // ioum +// 6'd10 : uncompress_id = 12'b0100000_000_01 ; +// 6'd11 : uncompress_id = 12'b0100000_001_01 ; +// 6'd12 : uncompress_id = 12'b0100000_010_01 ; +// 6'd13 : uncompress_id = 12'b0100000_011_01 ; +// 6'd14 : uncompress_id = 12'b0100000_100_01 ; +// 6'd15 : uncompress_id = 12'b0100000_101_01 ; +// // devci +// 6'd16 : uncompress_id = 12'b1000_0000_0000 ; +// // dap +// 6'd17 : uncompress_id = 12'b1000_0000_0001 ; +// // l2m1 (CPU000) +// 6'd18 : uncompress_id = 12'b11_000_000_00_00 ; +// 6'd19 : uncompress_id = 12'b11_010_000_00_00 ; +// 6'd20 : uncompress_id = 12'b11_011_000_00_00 ; +// 6'd21 : uncompress_id = 12'b11_100_000_00_00 ; +// 6'd22 : uncompress_id = 12'b11_101_000_00_00 ; +// 6'd23 : uncompress_id = 12'b11_110_000_00_00 ; +// 6'd24 : uncompress_id = 12'b11_111_000_00_00 ; +// // l2m1 (CPU001) +// 6'd25 : uncompress_id = 12'b11_000_001_00_00 ; +// 6'd26 : uncompress_id = 12'b11_010_001_00_00 ; +// 6'd27 : uncompress_id = 12'b11_011_001_00_00 ; +// 6'd28 : uncompress_id = 12'b11_100_001_00_00 ; +// 6'd29 : uncompress_id = 12'b11_101_001_00_00 ; +// 6'd30 : uncompress_id = 12'b11_110_001_00_00 ; +// 6'd31 : uncompress_id = 12'b11_111_001_00_00 ; +// // l2m1 (L2CC) +// 6'd32 : uncompress_id = 12'b11_000_00101_00 ; +// 6'd33 : uncompress_id = 12'b11_000_01001_00 ; +// 6'd34 : uncompress_id = 12'b11_000_01101_00 ; +// 6'd35 : uncompress_id = 12'b11_000_10011_00 ; +// 6'd36 : uncompress_id = 12'b11_000_10111_00 ; +// 6'd37 : uncompress_id = 12'b11_000_11011_00 ; +// 6'd38 : uncompress_id = 12'b11_000_11111_00 ; +// 6'd39 : uncompress_id = 12'b11_000_00011_00 ; +// 6'd40 : uncompress_id = 12'b11_000_00111_00 ; +// 6'd41 : uncompress_id = 12'b11_000_01011_00 ; +// 6'd42 : uncompress_id = 12'b11_000_01111_00 ; +// 6'd43 : uncompress_id = 12'b11_000_00001_00 ; +// // l2m1 (ACP) +// 6'd44 : uncompress_id = 12'b11_000_10000_00 ; +// 6'd45 : uncompress_id = 12'b11_001_10000_00 ; +// 6'd46 : uncompress_id = 12'b11_010_10000_00 ; +// 6'd47 : uncompress_id = 12'b11_011_10000_00 ; +// 6'd48 : uncompress_id = 12'b11_100_10000_00 ; +// 6'd49 : uncompress_id = 12'b11_101_10000_00 ; +// 6'd50 : uncompress_id = 12'b11_110_10000_00 ; +// 6'd51 : uncompress_id = 12'b11_111_10000_00 ; +// default : uncompress_id = ~0; +// endcase +// end +//endfunction +// +//function [5:0] compress_id; +// input [11:0] id; +// begin +// case (id[11:0]) +// // dmac0 +// 12'b010000_1000_00 : compress_id = 'd1 ; +// 12'b010000_0000_00 : compress_id = 'd2 ; +// 12'b010000_0001_00 : compress_id = 'd3 ; +// 12'b010000_0010_00 : compress_id = 'd4 ; +// 12'b010000_0011_00 : compress_id = 'd5 ; +// 12'b010000_0100_00 : compress_id = 'd6 ; +// 12'b010000_0101_00 : compress_id = 'd7 ; +// 12'b010000_0110_00 : compress_id = 'd8 ; +// 12'b010000_0111_00 : compress_id = 'd9 ; +// // ioum +// 12'b0100000_000_01 : compress_id = 'd10 ; +// 12'b0100000_001_01 : compress_id = 'd11 ; +// 12'b0100000_010_01 : compress_id = 'd12 ; +// 12'b0100000_011_01 : compress_id = 'd13 ; +// 12'b0100000_100_01 : compress_id = 'd14 ; +// 12'b0100000_101_01 : compress_id = 'd15 ; +// // devci +// 12'b1000_0000_0000 : compress_id = 'd16 ; +// // dap +// 12'b1000_0000_0001 : compress_id = 'd17 ; +// // l2m1 (CPU000) +// 12'b11_000_000_00_00 : compress_id = 'd18 ; +// 12'b11_010_000_00_00 : compress_id = 'd19 ; +// 12'b11_011_000_00_00 : compress_id = 'd20 ; +// 12'b11_100_000_00_00 : compress_id = 'd21 ; +// 12'b11_101_000_00_00 : compress_id = 'd22 ; +// 12'b11_110_000_00_00 : compress_id = 'd23 ; +// 12'b11_111_000_00_00 : compress_id = 'd24 ; +// // l2m1 (CPU001) +// 12'b11_000_001_00_00 : compress_id = 'd25 ; +// 12'b11_010_001_00_00 : compress_id = 'd26 ; +// 12'b11_011_001_00_00 : compress_id = 'd27 ; +// 12'b11_100_001_00_00 : compress_id = 'd28 ; +// 12'b11_101_001_00_00 : compress_id = 'd29 ; +// 12'b11_110_001_00_00 : compress_id = 'd30 ; +// 12'b11_111_001_00_00 : compress_id = 'd31 ; +// // l2m1 (L2CC) +// 12'b11_000_00101_00 : compress_id = 'd32 ; +// 12'b11_000_01001_00 : compress_id = 'd33 ; +// 12'b11_000_01101_00 : compress_id = 'd34 ; +// 12'b11_000_10011_00 : compress_id = 'd35 ; +// 12'b11_000_10111_00 : compress_id = 'd36 ; +// 12'b11_000_11011_00 : compress_id = 'd37 ; +// 12'b11_000_11111_00 : compress_id = 'd38 ; +// 12'b11_000_00011_00 : compress_id = 'd39 ; +// 12'b11_000_00111_00 : compress_id = 'd40 ; +// 12'b11_000_01011_00 : compress_id = 'd41 ; +// 12'b11_000_01111_00 : compress_id = 'd42 ; +// 12'b11_000_00001_00 : compress_id = 'd43 ; +// // l2m1 (ACP) +// 12'b11_000_10000_00 : compress_id = 'd44 ; +// 12'b11_001_10000_00 : compress_id = 'd45 ; +// 12'b11_010_10000_00 : compress_id = 'd46 ; +// 12'b11_011_10000_00 : compress_id = 'd47 ; +// 12'b11_100_10000_00 : compress_id = 'd48 ; +// 12'b11_101_10000_00 : compress_id = 'd49 ; +// 12'b11_110_10000_00 : compress_id = 'd50 ; +// 12'b11_111_10000_00 : compress_id = 'd51 ; +// default: compress_id = ~0; +// endcase +// end +//endfunction + +// Modified as per CR 648393 + + function [5:0] compress_id; + input [11:0] id; + begin + compress_id[0] = id[7] | (id[4] & id[2]) | (~id[11] & id[2]) | (id[11] & id[0]); + compress_id[1] = id[8] | id[5] | (~id[11] & id[3]); + compress_id[2] = id[9] | (id[6] & id[3] & id[2]) | (~id[11] & id[4]); + compress_id[3] = (id[11] & id[10] & id[4]) | (id[11] & id[10] & id[2]) | (~id[11] & id[10] & ~id[5] & ~id[0]); + compress_id[4] = (id[11] & id[3]) | (id[10] & id[0]) | (id[11] & id[10] & ~id[2] &~id[6]); + compress_id[5] = id[11] & id[10] & ~id[3]; + end + endfunction + + function [11:0] uncompress_id; + input [5:0] id; + begin + case (id[5:0]) + // dmac0 + 6'b000_010 : uncompress_id = 12'b010000_1000_00 ; + 6'b001_000 : uncompress_id = 12'b010000_0000_00 ; + 6'b001_001 : uncompress_id = 12'b010000_0001_00 ; + 6'b001_010 : uncompress_id = 12'b010000_0010_00 ; + 6'b001_011 : uncompress_id = 12'b010000_0011_00 ; + 6'b001_100 : uncompress_id = 12'b010000_0100_00 ; + 6'b001_101 : uncompress_id = 12'b010000_0101_00 ; + 6'b001_110 : uncompress_id = 12'b010000_0110_00 ; + 6'b001_111 : uncompress_id = 12'b010000_0111_00 ; + // ioum + 6'b010_000 : uncompress_id = 12'b0100000_000_01 ; + 6'b010_001 : uncompress_id = 12'b0100000_001_01 ; + 6'b010_010 : uncompress_id = 12'b0100000_010_01 ; + 6'b010_011 : uncompress_id = 12'b0100000_011_01 ; + 6'b010_100 : uncompress_id = 12'b0100000_100_01 ; + 6'b010_101 : uncompress_id = 12'b0100000_101_01 ; + // devci + 6'b000_000 : uncompress_id = 12'b1000_0000_0000 ; + // dap + 6'b000_001 : uncompress_id = 12'b1000_0000_0001 ; + // l2m1 (CPU000) + 6'b110_000 : uncompress_id = 12'b11_000_000_00_00 ; + 6'b110_010 : uncompress_id = 12'b11_010_000_00_00 ; + 6'b110_011 : uncompress_id = 12'b11_011_000_00_00 ; + 6'b110_100 : uncompress_id = 12'b11_100_000_00_00 ; + 6'b110_101 : uncompress_id = 12'b11_101_000_00_00 ; + 6'b110_110 : uncompress_id = 12'b11_110_000_00_00 ; + 6'b110_111 : uncompress_id = 12'b11_111_000_00_00 ; + // l2m1 (CPU001) + 6'b111_000 : uncompress_id = 12'b11_000_001_00_00 ; + 6'b111_010 : uncompress_id = 12'b11_010_001_00_00 ; + 6'b111_011 : uncompress_id = 12'b11_011_001_00_00 ; + 6'b111_100 : uncompress_id = 12'b11_100_001_00_00 ; + 6'b111_101 : uncompress_id = 12'b11_101_001_00_00 ; + 6'b111_110 : uncompress_id = 12'b11_110_001_00_00 ; + 6'b111_111 : uncompress_id = 12'b11_111_001_00_00 ; + // l2m1 (L2CC) + 6'b101_001 : uncompress_id = 12'b11_000_00101_00 ; + 6'b101_010 : uncompress_id = 12'b11_000_01001_00 ; + 6'b101_011 : uncompress_id = 12'b11_000_01101_00 ; + 6'b011_100 : uncompress_id = 12'b11_000_10011_00 ; + 6'b011_101 : uncompress_id = 12'b11_000_10111_00 ; + 6'b011_110 : uncompress_id = 12'b11_000_11011_00 ; + 6'b011_111 : uncompress_id = 12'b11_000_11111_00 ; + 6'b011_000 : uncompress_id = 12'b11_000_00011_00 ; + 6'b011_001 : uncompress_id = 12'b11_000_00111_00 ; + 6'b011_010 : uncompress_id = 12'b11_000_01011_00 ; + 6'b011_011 : uncompress_id = 12'b11_000_01111_00 ; + 6'b101_000 : uncompress_id = 12'b11_000_00001_00 ; + // l2m1 (ACP) + 6'b100_000 : uncompress_id = 12'b11_000_10000_00 ; + 6'b100_001 : uncompress_id = 12'b11_001_10000_00 ; + 6'b100_010 : uncompress_id = 12'b11_010_10000_00 ; + 6'b100_011 : uncompress_id = 12'b11_011_10000_00 ; + 6'b100_100 : uncompress_id = 12'b11_100_10000_00 ; + 6'b100_101 : uncompress_id = 12'b11_101_10000_00 ; + 6'b100_110 : uncompress_id = 12'b11_110_10000_00 ; + 6'b100_111 : uncompress_id = 12'b11_111_10000_00 ; + default : uncompress_id = 12'hx ; + endcase + end + endfunction + + +// Static Remap logic Enablement and Disablement for C_M_AXI0 port + + assign M_AXI_GP0_AWID = (C_M_AXI_GP0_ENABLE_STATIC_REMAP == 1) ? compress_id(M_AXI_GP0_AWID_FULL) : M_AXI_GP0_AWID_FULL; + assign M_AXI_GP0_WID = (C_M_AXI_GP0_ENABLE_STATIC_REMAP == 1) ? compress_id(M_AXI_GP0_WID_FULL) : M_AXI_GP0_WID_FULL; + assign M_AXI_GP0_ARID = (C_M_AXI_GP0_ENABLE_STATIC_REMAP == 1) ? compress_id(M_AXI_GP0_ARID_FULL) : M_AXI_GP0_ARID_FULL; + assign M_AXI_GP0_BID_FULL = (C_M_AXI_GP0_ENABLE_STATIC_REMAP == 1) ? uncompress_id(M_AXI_GP0_BID) : M_AXI_GP0_BID; + assign M_AXI_GP0_RID_FULL = (C_M_AXI_GP0_ENABLE_STATIC_REMAP == 1) ? uncompress_id(M_AXI_GP0_RID) : M_AXI_GP0_RID; + + // Static Remap logic Enablement and Disablement for C_M_AXI1 port + + assign M_AXI_GP1_AWID = (C_M_AXI_GP1_ENABLE_STATIC_REMAP == 1) ? compress_id(M_AXI_GP1_AWID_FULL) : M_AXI_GP1_AWID_FULL; + assign M_AXI_GP1_WID = (C_M_AXI_GP1_ENABLE_STATIC_REMAP == 1) ? compress_id(M_AXI_GP1_WID_FULL) : M_AXI_GP1_WID_FULL; + assign M_AXI_GP1_ARID = (C_M_AXI_GP1_ENABLE_STATIC_REMAP == 1) ? compress_id(M_AXI_GP1_ARID_FULL) : M_AXI_GP1_ARID_FULL; + assign M_AXI_GP1_BID_FULL = (C_M_AXI_GP1_ENABLE_STATIC_REMAP == 1) ? uncompress_id(M_AXI_GP1_BID) : M_AXI_GP1_BID; + assign M_AXI_GP1_RID_FULL = (C_M_AXI_GP1_ENABLE_STATIC_REMAP == 1) ? uncompress_id(M_AXI_GP1_RID) : M_AXI_GP1_RID; + + +//// Compress_id and uncompress_id has been removed to address CR 642527 +//// AXI interconnect v1.05.a and beyond implements dynamic ID compression/decompression. +// assign M_AXI_GP0_AWID = M_AXI_GP0_AWID_FULL; +// assign M_AXI_GP0_WID = M_AXI_GP0_WID_FULL; +// assign M_AXI_GP0_ARID = M_AXI_GP0_ARID_FULL; +// assign M_AXI_GP0_BID_FULL = M_AXI_GP0_BID; +// assign M_AXI_GP0_RID_FULL = M_AXI_GP0_RID; +// +// assign M_AXI_GP1_AWID = M_AXI_GP1_AWID_FULL; +// assign M_AXI_GP1_WID = M_AXI_GP1_WID_FULL; +// assign M_AXI_GP1_ARID = M_AXI_GP1_ARID_FULL; +// assign M_AXI_GP1_BID_FULL = M_AXI_GP1_BID; +// assign M_AXI_GP1_RID_FULL = M_AXI_GP1_RID; + + +// Pipeline Stage for ENET0 + +generate + if (C_EN_EMIO_ENET0 == 1) begin + always @(posedge ENET0_GMII_TX_CLK) + begin + ENET0_GMII_TXD <= ENET0_GMII_TXD_i; + ENET0_GMII_TX_EN <= ENET0_GMII_TX_EN_i; //1'b0; //ENET0_GMII_TX_EN_i; + ENET0_GMII_TX_ER <= ENET0_GMII_TX_ER_i; //1'b0;//ENET0_GMII_TX_ER_i; + ENET0_GMII_COL_i <= ENET0_GMII_COL; + ENET0_GMII_CRS_i <= ENET0_GMII_CRS; + end + end + else + always@* + begin + ENET0_GMII_TXD <= 'b0;//ENET0_GMII_TXD_i; + ENET0_GMII_TX_EN <= 'b0;//ENET0_GMII_TX_EN_i; //1'b0; //ENET0_GMII_TX_EN_i; + ENET0_GMII_TX_ER <= 'b0;//ENET0_GMII_TX_ER_i; //1'b0;//ENET0_GMII_TX_ER_i; + ENET0_GMII_COL_i <= 'b0; + ENET0_GMII_CRS_i <= 'b0; + end +endgenerate + +generate + if (C_EN_EMIO_ENET0 == 1) begin + always @(posedge ENET0_GMII_RX_CLK) + begin + ENET0_GMII_RXD_i <= ENET0_GMII_RXD; + ENET0_GMII_RX_DV_i <= ENET0_GMII_RX_DV; + ENET0_GMII_RX_ER_i <= ENET0_GMII_RX_ER; + end + end + else + begin + always @* + begin + ENET0_GMII_RXD_i <= 0; + ENET0_GMII_RX_DV_i <= 0; + ENET0_GMII_RX_ER_i <= 0; + end + end +endgenerate + +// Pipeline Stage for ENET1 + +generate + if (C_EN_EMIO_ENET1 == 1) begin + always @(posedge ENET1_GMII_TX_CLK) + begin + ENET1_GMII_TXD <= ENET1_GMII_TXD_i; + ENET1_GMII_TX_EN <= ENET1_GMII_TX_EN_i; + ENET1_GMII_TX_ER <= ENET1_GMII_TX_ER_i; + ENET1_GMII_COL_i <= ENET1_GMII_COL; + ENET1_GMII_CRS_i <= ENET1_GMII_CRS; + end + end + else + begin + always@* + begin + ENET1_GMII_TXD <= 'b0;//ENET0_GMII_TXD_i; + ENET1_GMII_TX_EN <= 'b0;//ENET0_GMII_TX_EN_i; //1'b0; //ENET0_GMII_TX_EN_i; + ENET1_GMII_TX_ER <= 'b0;//ENET0_GMII_TX_ER_i; //1'b0;//ENET0_GMII_TX_ER_i; + ENET1_GMII_COL_i <= 0; + ENET1_GMII_CRS_i <= 0; + end + end +endgenerate + +generate + if (C_EN_EMIO_ENET1 == 1) begin + always @(posedge ENET1_GMII_RX_CLK) + begin + ENET1_GMII_RXD_i <= ENET1_GMII_RXD; + ENET1_GMII_RX_DV_i <= ENET1_GMII_RX_DV; + ENET1_GMII_RX_ER_i <= ENET1_GMII_RX_ER; + end + end +else + begin + always @* + begin + ENET1_GMII_RXD_i <= 'b0; + ENET1_GMII_RX_DV_i <= 'b0; + ENET1_GMII_RX_ER_i <= 'b0; + end + end +endgenerate + +// Trace buffer instantiated when C_INCLUDE_TRACE_BUFFER is 1. + +generate + if (C_EN_EMIO_TRACE == 1) begin + if (C_INCLUDE_TRACE_BUFFER == 0) begin : gen_no_trace_buffer + + // Pipeline Stage for Traceport ATID + always @(posedge FTMD_TRACEIN_CLK) + begin + FTMD_TRACEIN_DATA_notracebuf <= FTMD_TRACEIN_DATA; + FTMD_TRACEIN_VALID_notracebuf <= FTMD_TRACEIN_VALID; + FTMD_TRACEIN_ATID_notracebuf <= FTMD_TRACEIN_ATID; + end + + assign FTMD_TRACEIN_DATA_i = FTMD_TRACEIN_DATA_notracebuf; + assign FTMD_TRACEIN_VALID_i = FTMD_TRACEIN_VALID_notracebuf; + assign FTMD_TRACEIN_ATID_i = FTMD_TRACEIN_ATID_notracebuf; + + end else begin : gen_trace_buffer + + processing_system7_v5_5_trace_buffer #(.FIFO_SIZE (C_TRACE_BUFFER_FIFO_SIZE), + .USE_TRACE_DATA_EDGE_DETECTOR(USE_TRACE_DATA_EDGE_DETECTOR), + .C_DELAY_CLKS(C_TRACE_BUFFER_CLOCK_DELAY) + ) + trace_buffer_i ( + .TRACE_CLK(FTMD_TRACEIN_CLK), + .RST(~FCLK_RESET0_N), + .TRACE_VALID_IN(FTMD_TRACEIN_VALID), + .TRACE_DATA_IN(FTMD_TRACEIN_DATA), + .TRACE_ATID_IN(FTMD_TRACEIN_ATID), + .TRACE_ATID_OUT(FTMD_TRACEIN_ATID_tracebuf), + .TRACE_VALID_OUT(FTMD_TRACEIN_VALID_tracebuf), + .TRACE_DATA_OUT(FTMD_TRACEIN_DATA_tracebuf) + ); + + assign FTMD_TRACEIN_DATA_i = FTMD_TRACEIN_DATA_tracebuf; + assign FTMD_TRACEIN_VALID_i = FTMD_TRACEIN_VALID_tracebuf; + assign FTMD_TRACEIN_ATID_i = FTMD_TRACEIN_ATID_tracebuf; + + end + end + else + begin + assign FTMD_TRACEIN_DATA_i = 1'b0; + assign FTMD_TRACEIN_VALID_i = 1'b0; + assign FTMD_TRACEIN_ATID_i = 1'b0; + end +endgenerate + + + // ID Width Control on AXI Slave ports + // S_AXI_GP0 + + function [5:0] id_in_gp0; + input [(C_S_AXI_GP0_ID_WIDTH - 1) : 0] axi_id_gp0_in; + begin + case (C_S_AXI_GP0_ID_WIDTH) + 1: id_in_gp0 = {5'b0, axi_id_gp0_in}; + 2: id_in_gp0 = {4'b0, axi_id_gp0_in}; + 3: id_in_gp0 = {3'b0, axi_id_gp0_in}; + 4: id_in_gp0 = {2'b0, axi_id_gp0_in}; + 5: id_in_gp0 = {1'b0, axi_id_gp0_in}; + 6: id_in_gp0 = axi_id_gp0_in; + default : id_in_gp0 = axi_id_gp0_in; + endcase + end + endfunction + + assign S_AXI_GP0_ARID_in = id_in_gp0(S_AXI_GP0_ARID); + assign S_AXI_GP0_AWID_in = id_in_gp0(S_AXI_GP0_AWID); + assign S_AXI_GP0_WID_in = id_in_gp0(S_AXI_GP0_WID); + + function [5:0] id_out_gp0; + input [(C_S_AXI_GP0_ID_WIDTH - 1) : 0] axi_id_gp0_out; + begin + case (C_S_AXI_GP0_ID_WIDTH) + 1: id_out_gp0 = axi_id_gp0_out[0]; + 2: id_out_gp0 = axi_id_gp0_out[1:0]; + 3: id_out_gp0 = axi_id_gp0_out[2:0]; + 4: id_out_gp0 = axi_id_gp0_out[3:0]; + 5: id_out_gp0 = axi_id_gp0_out[4:0]; + 6: id_out_gp0 = axi_id_gp0_out; + default : id_out_gp0 = axi_id_gp0_out; + endcase + end + endfunction + + assign S_AXI_GP0_BID = id_out_gp0(S_AXI_GP0_BID_out); + assign S_AXI_GP0_RID = id_out_gp0(S_AXI_GP0_RID_out); + + // S_AXI_GP1 + + function [5:0] id_in_gp1; + input [(C_S_AXI_GP1_ID_WIDTH - 1) : 0] axi_id_gp1_in; + begin + case (C_S_AXI_GP1_ID_WIDTH) + 1: id_in_gp1 = {5'b0, axi_id_gp1_in}; + 2: id_in_gp1 = {4'b0, axi_id_gp1_in}; + 3: id_in_gp1 = {3'b0, axi_id_gp1_in}; + 4: id_in_gp1 = {2'b0, axi_id_gp1_in}; + 5: id_in_gp1 = {1'b0, axi_id_gp1_in}; + 6: id_in_gp1 = axi_id_gp1_in; + default : id_in_gp1 = axi_id_gp1_in; + endcase + end + endfunction + + assign S_AXI_GP1_ARID_in = id_in_gp1(S_AXI_GP1_ARID); + assign S_AXI_GP1_AWID_in = id_in_gp1(S_AXI_GP1_AWID); + assign S_AXI_GP1_WID_in = id_in_gp1(S_AXI_GP1_WID); + + function [5:0] id_out_gp1; + input [(C_S_AXI_GP1_ID_WIDTH - 1) : 0] axi_id_gp1_out; + begin + case (C_S_AXI_GP1_ID_WIDTH) + 1: id_out_gp1 = axi_id_gp1_out[0]; + 2: id_out_gp1 = axi_id_gp1_out[1:0]; + 3: id_out_gp1 = axi_id_gp1_out[2:0]; + 4: id_out_gp1 = axi_id_gp1_out[3:0]; + 5: id_out_gp1 = axi_id_gp1_out[4:0]; + 6: id_out_gp1 = axi_id_gp1_out; + default : id_out_gp1 = axi_id_gp1_out; + endcase + end + endfunction + + assign S_AXI_GP1_BID = id_out_gp1(S_AXI_GP1_BID_out); + assign S_AXI_GP1_RID = id_out_gp1(S_AXI_GP1_RID_out); + +// S_AXI_HP0 + + function [5:0] id_in_hp0; + input [(C_S_AXI_HP0_ID_WIDTH - 1) : 0] axi_id_hp0_in; + begin + case (C_S_AXI_HP0_ID_WIDTH) + 1: id_in_hp0 = {5'b0, axi_id_hp0_in}; + 2: id_in_hp0 = {4'b0, axi_id_hp0_in}; + 3: id_in_hp0 = {3'b0, axi_id_hp0_in}; + 4: id_in_hp0 = {2'b0, axi_id_hp0_in}; + 5: id_in_hp0 = {1'b0, axi_id_hp0_in}; + 6: id_in_hp0 = axi_id_hp0_in; + default : id_in_hp0 = axi_id_hp0_in; + endcase + end + endfunction + + assign S_AXI_HP0_ARID_in = id_in_hp0(S_AXI_HP0_ARID); + assign S_AXI_HP0_AWID_in = id_in_hp0(S_AXI_HP0_AWID); + assign S_AXI_HP0_WID_in = id_in_hp0(S_AXI_HP0_WID); + + function [5:0] id_out_hp0; + input [(C_S_AXI_HP0_ID_WIDTH - 1) : 0] axi_id_hp0_out; + begin + case (C_S_AXI_HP0_ID_WIDTH) + 1: id_out_hp0 = axi_id_hp0_out[0]; + 2: id_out_hp0 = axi_id_hp0_out[1:0]; + 3: id_out_hp0 = axi_id_hp0_out[2:0]; + 4: id_out_hp0 = axi_id_hp0_out[3:0]; + 5: id_out_hp0 = axi_id_hp0_out[4:0]; + 6: id_out_hp0 = axi_id_hp0_out; + default : id_out_hp0 = axi_id_hp0_out; + endcase + end + endfunction + + assign S_AXI_HP0_BID = id_out_hp0(S_AXI_HP0_BID_out); + assign S_AXI_HP0_RID = id_out_hp0(S_AXI_HP0_RID_out); + + assign S_AXI_HP0_WDATA_in = (C_S_AXI_HP0_DATA_WIDTH == 64) ? S_AXI_HP0_WDATA : {32'b0,S_AXI_HP0_WDATA}; + assign S_AXI_HP0_WSTRB_in = (C_S_AXI_HP0_DATA_WIDTH == 64) ? S_AXI_HP0_WSTRB : {4'b0,S_AXI_HP0_WSTRB}; + assign S_AXI_HP0_RDATA = (C_S_AXI_HP0_DATA_WIDTH == 64) ? S_AXI_HP0_RDATA_out : S_AXI_HP0_RDATA_out[31:0]; + +// S_AXI_HP1 + + function [5:0] id_in_hp1; + input [(C_S_AXI_HP1_ID_WIDTH - 1) : 0] axi_id_hp1_in; + begin + case (C_S_AXI_HP1_ID_WIDTH) + 1: id_in_hp1 = {5'b0, axi_id_hp1_in}; + 2: id_in_hp1 = {4'b0, axi_id_hp1_in}; + 3: id_in_hp1 = {3'b0, axi_id_hp1_in}; + 4: id_in_hp1 = {2'b0, axi_id_hp1_in}; + 5: id_in_hp1 = {1'b0, axi_id_hp1_in}; + 6: id_in_hp1 = axi_id_hp1_in; + default : id_in_hp1 = axi_id_hp1_in; + endcase + end + endfunction + + + + assign S_AXI_HP1_ARID_in = id_in_hp1(S_AXI_HP1_ARID); + assign S_AXI_HP1_AWID_in = id_in_hp1(S_AXI_HP1_AWID); + assign S_AXI_HP1_WID_in = id_in_hp1(S_AXI_HP1_WID); + + function [5:0] id_out_hp1; + input [(C_S_AXI_HP1_ID_WIDTH - 1) : 0] axi_id_hp1_out; + begin + case (C_S_AXI_HP1_ID_WIDTH) + 1: id_out_hp1 = axi_id_hp1_out[0]; + 2: id_out_hp1 = axi_id_hp1_out[1:0]; + 3: id_out_hp1 = axi_id_hp1_out[2:0]; + 4: id_out_hp1 = axi_id_hp1_out[3:0]; + 5: id_out_hp1 = axi_id_hp1_out[4:0]; + 6: id_out_hp1 = axi_id_hp1_out; + default : id_out_hp1 = axi_id_hp1_out; + endcase + end + endfunction + + assign S_AXI_HP1_BID = id_out_hp1(S_AXI_HP1_BID_out); + assign S_AXI_HP1_RID = id_out_hp1(S_AXI_HP1_RID_out); + + assign S_AXI_HP1_WDATA_in = (C_S_AXI_HP1_DATA_WIDTH == 64) ? S_AXI_HP1_WDATA : {32'b0,S_AXI_HP1_WDATA}; + assign S_AXI_HP1_WSTRB_in = (C_S_AXI_HP1_DATA_WIDTH == 64) ? S_AXI_HP1_WSTRB : {4'b0,S_AXI_HP1_WSTRB}; + assign S_AXI_HP1_RDATA = (C_S_AXI_HP1_DATA_WIDTH == 64) ? S_AXI_HP1_RDATA_out : S_AXI_HP1_RDATA_out[31:0]; + + +// S_AXI_HP2 + + function [5:0] id_in_hp2; + input [(C_S_AXI_HP2_ID_WIDTH - 1) : 0] axi_id_hp2_in; + begin + case (C_S_AXI_HP2_ID_WIDTH) + 1: id_in_hp2 = {5'b0, axi_id_hp2_in}; + 2: id_in_hp2 = {4'b0, axi_id_hp2_in}; + 3: id_in_hp2 = {3'b0, axi_id_hp2_in}; + 4: id_in_hp2 = {2'b0, axi_id_hp2_in}; + 5: id_in_hp2 = {1'b0, axi_id_hp2_in}; + 6: id_in_hp2 = axi_id_hp2_in; + default : id_in_hp2 = axi_id_hp2_in; + endcase + end + endfunction + + assign S_AXI_HP2_ARID_in = id_in_hp2(S_AXI_HP2_ARID); + assign S_AXI_HP2_AWID_in = id_in_hp2(S_AXI_HP2_AWID); + assign S_AXI_HP2_WID_in = id_in_hp2(S_AXI_HP2_WID); + + + function [5:0] id_out_hp2; + input [(C_S_AXI_HP2_ID_WIDTH - 1) : 0] axi_id_hp2_out; + begin + case (C_S_AXI_HP2_ID_WIDTH) + 1: id_out_hp2 = axi_id_hp2_out[0]; + 2: id_out_hp2 = axi_id_hp2_out[1:0]; + 3: id_out_hp2 = axi_id_hp2_out[2:0]; + 4: id_out_hp2 = axi_id_hp2_out[3:0]; + 5: id_out_hp2 = axi_id_hp2_out[4:0]; + 6: id_out_hp2 = axi_id_hp2_out; + default : id_out_hp2 = axi_id_hp2_out; + endcase + end + endfunction + + assign S_AXI_HP2_BID = id_out_hp2(S_AXI_HP2_BID_out); + assign S_AXI_HP2_RID = id_out_hp2(S_AXI_HP2_RID_out); + + assign S_AXI_HP2_WDATA_in = (C_S_AXI_HP2_DATA_WIDTH == 64) ? S_AXI_HP2_WDATA : {32'b0,S_AXI_HP2_WDATA}; + assign S_AXI_HP2_WSTRB_in = (C_S_AXI_HP2_DATA_WIDTH == 64) ? S_AXI_HP2_WSTRB : {4'b0,S_AXI_HP2_WSTRB}; + assign S_AXI_HP2_RDATA = (C_S_AXI_HP2_DATA_WIDTH == 64) ? S_AXI_HP2_RDATA_out : S_AXI_HP2_RDATA_out[31:0]; + + +// S_AXI_HP3 + + function [5:0] id_in_hp3; + input [(C_S_AXI_HP3_ID_WIDTH - 1) : 0] axi_id_hp3_in; + begin + case (C_S_AXI_HP3_ID_WIDTH) + 1: id_in_hp3 = {5'b0, axi_id_hp3_in}; + 2: id_in_hp3 = {4'b0, axi_id_hp3_in}; + 3: id_in_hp3 = {3'b0, axi_id_hp3_in}; + 4: id_in_hp3 = {2'b0, axi_id_hp3_in}; + 5: id_in_hp3 = {1'b0, axi_id_hp3_in}; + 6: id_in_hp3 = axi_id_hp3_in; + default : id_in_hp3 = axi_id_hp3_in; + endcase + end + endfunction + + assign S_AXI_HP3_ARID_in = id_in_hp3(S_AXI_HP3_ARID); + assign S_AXI_HP3_AWID_in = id_in_hp3(S_AXI_HP3_AWID); + assign S_AXI_HP3_WID_in = id_in_hp3(S_AXI_HP3_WID); + + + + function [5:0] id_out_hp3; + input [(C_S_AXI_HP3_ID_WIDTH - 1) : 0] axi_id_hp3_out; + begin + case (C_S_AXI_HP3_ID_WIDTH) + 1: id_out_hp3 = axi_id_hp3_out[0]; + 2: id_out_hp3 = axi_id_hp3_out[1:0]; + 3: id_out_hp3 = axi_id_hp3_out[2:0]; + 4: id_out_hp3 = axi_id_hp3_out[3:0]; + 5: id_out_hp3 = axi_id_hp3_out[4:0]; + 6: id_out_hp3 = axi_id_hp3_out; + default : id_out_hp3 = axi_id_hp3_out; + endcase + end + endfunction + + assign S_AXI_HP3_BID = id_out_hp3(S_AXI_HP3_BID_out); + assign S_AXI_HP3_RID = id_out_hp3(S_AXI_HP3_RID_out); + + assign S_AXI_HP3_WDATA_in = (C_S_AXI_HP3_DATA_WIDTH == 64) ? S_AXI_HP3_WDATA : {32'b0,S_AXI_HP3_WDATA}; + assign S_AXI_HP3_WSTRB_in = (C_S_AXI_HP3_DATA_WIDTH == 64) ? S_AXI_HP3_WSTRB : {4'b0,S_AXI_HP3_WSTRB}; + assign S_AXI_HP3_RDATA = (C_S_AXI_HP3_DATA_WIDTH == 64) ? S_AXI_HP3_RDATA_out : S_AXI_HP3_RDATA_out[31:0]; + + +// S_AXI_ACP + + function [2:0] id_in_acp; + input [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] axi_id_acp_in; + begin + case (C_S_AXI_ACP_ID_WIDTH) + 1: id_in_acp = {2'b0, axi_id_acp_in}; + 2: id_in_acp = {1'b0, axi_id_acp_in}; + 3: id_in_acp = axi_id_acp_in; + default : id_in_acp = axi_id_acp_in; + endcase + end + endfunction + + assign S_AXI_ACP_ARID_in = id_in_acp(SAXIACPARID_W); + assign S_AXI_ACP_AWID_in = id_in_acp(SAXIACPAWID_W); + assign S_AXI_ACP_WID_in = id_in_acp(SAXIACPWID_W); + + function [2:0] id_out_acp; + input [(C_S_AXI_ACP_ID_WIDTH - 1) : 0] axi_id_acp_out; + begin + case (C_S_AXI_ACP_ID_WIDTH) + 1: id_out_acp = axi_id_acp_out[0]; + 2: id_out_acp = axi_id_acp_out[1:0]; + 3: id_out_acp = axi_id_acp_out; + default : id_out_acp = axi_id_acp_out; + endcase + end + endfunction + + assign SAXIACPBID_W = id_out_acp(S_AXI_ACP_BID_out); + assign SAXIACPRID_W = id_out_acp(S_AXI_ACP_RID_out); + +// FMIO Tristate Inversion logic + +//FMIO I2C0 +assign I2C0_SDA_T = ~ I2C0_SDA_T_n; +assign I2C0_SCL_T = ~ I2C0_SCL_T_n; +//FMIO I2C1 +assign I2C1_SDA_T = ~ I2C1_SDA_T_n; +assign I2C1_SCL_T = ~ I2C1_SCL_T_n; +//FMIO SPI0 +assign SPI0_SCLK_T = ~ SPI0_SCLK_T_n; +assign SPI0_MOSI_T = ~ SPI0_MOSI_T_n; +assign SPI0_MISO_T = ~ SPI0_MISO_T_n; +assign SPI0_SS_T = ~ SPI0_SS_T_n; +//FMIO SPI1 +assign SPI1_SCLK_T = ~ SPI1_SCLK_T_n; +assign SPI1_MOSI_T = ~ SPI1_MOSI_T_n; +assign SPI1_MISO_T = ~ SPI1_MISO_T_n; +assign SPI1_SS_T = ~ SPI1_SS_T_n; + + + +// EMIO GEM0 MDIO +assign ENET0_MDIO_T = ~ ENET0_MDIO_T_n; + +// EMIO GEM1 MDIO +assign ENET1_MDIO_T = ~ ENET1_MDIO_T_n; + +// EMIO GPIO +assign GPIO_T = ~ GPIO_T_n; + +// EMIO GPIO Width Control + + function [63:0] gpio_width_adjust_in; + input [(C_EMIO_GPIO_WIDTH - 1) : 0] gpio_in; + begin + case (C_EMIO_GPIO_WIDTH) + 1: gpio_width_adjust_in = {63'b0, gpio_in}; + 2: gpio_width_adjust_in = {62'b0, gpio_in}; + 3: gpio_width_adjust_in = {61'b0, gpio_in}; + 4: gpio_width_adjust_in = {60'b0, gpio_in}; + 5: gpio_width_adjust_in = {59'b0, gpio_in}; + 6: gpio_width_adjust_in = {58'b0, gpio_in}; + 7: gpio_width_adjust_in = {57'b0, gpio_in}; + 8: gpio_width_adjust_in = {56'b0, gpio_in}; + 9: gpio_width_adjust_in = {55'b0, gpio_in}; + 10: gpio_width_adjust_in = {54'b0, gpio_in}; + 11: gpio_width_adjust_in = {53'b0, gpio_in}; + 12: gpio_width_adjust_in = {52'b0, gpio_in}; + 13: gpio_width_adjust_in = {51'b0, gpio_in}; + 14: gpio_width_adjust_in = {50'b0, gpio_in}; + 15: gpio_width_adjust_in = {49'b0, gpio_in}; + 16: gpio_width_adjust_in = {48'b0, gpio_in}; + 17: gpio_width_adjust_in = {47'b0, gpio_in}; + 18: gpio_width_adjust_in = {46'b0, gpio_in}; + 19: gpio_width_adjust_in = {45'b0, gpio_in}; + 20: gpio_width_adjust_in = {44'b0, gpio_in}; + 21: gpio_width_adjust_in = {43'b0, gpio_in}; + 22: gpio_width_adjust_in = {42'b0, gpio_in}; + 23: gpio_width_adjust_in = {41'b0, gpio_in}; + 24: gpio_width_adjust_in = {40'b0, gpio_in}; + 25: gpio_width_adjust_in = {39'b0, gpio_in}; + 26: gpio_width_adjust_in = {38'b0, gpio_in}; + 27: gpio_width_adjust_in = {37'b0, gpio_in}; + 28: gpio_width_adjust_in = {36'b0, gpio_in}; + 29: gpio_width_adjust_in = {35'b0, gpio_in}; + 30: gpio_width_adjust_in = {34'b0, gpio_in}; + 31: gpio_width_adjust_in = {33'b0, gpio_in}; + 32: gpio_width_adjust_in = {32'b0, gpio_in}; + 33: gpio_width_adjust_in = {31'b0, gpio_in}; + 34: gpio_width_adjust_in = {30'b0, gpio_in}; + 35: gpio_width_adjust_in = {29'b0, gpio_in}; + 36: gpio_width_adjust_in = {28'b0, gpio_in}; + 37: gpio_width_adjust_in = {27'b0, gpio_in}; + 38: gpio_width_adjust_in = {26'b0, gpio_in}; + 39: gpio_width_adjust_in = {25'b0, gpio_in}; + 40: gpio_width_adjust_in = {24'b0, gpio_in}; + 41: gpio_width_adjust_in = {23'b0, gpio_in}; + 42: gpio_width_adjust_in = {22'b0, gpio_in}; + 43: gpio_width_adjust_in = {21'b0, gpio_in}; + 44: gpio_width_adjust_in = {20'b0, gpio_in}; + 45: gpio_width_adjust_in = {19'b0, gpio_in}; + 46: gpio_width_adjust_in = {18'b0, gpio_in}; + 47: gpio_width_adjust_in = {17'b0, gpio_in}; + 48: gpio_width_adjust_in = {16'b0, gpio_in}; + 49: gpio_width_adjust_in = {15'b0, gpio_in}; + 50: gpio_width_adjust_in = {14'b0, gpio_in}; + 51: gpio_width_adjust_in = {13'b0, gpio_in}; + 52: gpio_width_adjust_in = {12'b0, gpio_in}; + 53: gpio_width_adjust_in = {11'b0, gpio_in}; + 54: gpio_width_adjust_in = {10'b0, gpio_in}; + 55: gpio_width_adjust_in = {9'b0, gpio_in}; + 56: gpio_width_adjust_in = {8'b0, gpio_in}; + 57: gpio_width_adjust_in = {7'b0, gpio_in}; + 58: gpio_width_adjust_in = {6'b0, gpio_in}; + 59: gpio_width_adjust_in = {5'b0, gpio_in}; + 60: gpio_width_adjust_in = {4'b0, gpio_in}; + 61: gpio_width_adjust_in = {3'b0, gpio_in}; + 62: gpio_width_adjust_in = {2'b0, gpio_in}; + 63: gpio_width_adjust_in = {1'b0, gpio_in}; + 64: gpio_width_adjust_in = gpio_in; + default : gpio_width_adjust_in = gpio_in; + endcase + end + endfunction + + assign gpio_in63_0 = gpio_width_adjust_in(GPIO_I); + + + function [63:0] gpio_width_adjust_out; + input [(C_EMIO_GPIO_WIDTH - 1) : 0] gpio_o; + begin + case (C_EMIO_GPIO_WIDTH) + 1: gpio_width_adjust_out = gpio_o[0]; + 2: gpio_width_adjust_out = gpio_o[1:0]; + 3: gpio_width_adjust_out = gpio_o[2:0]; + 4: gpio_width_adjust_out = gpio_o[3:0]; + 5: gpio_width_adjust_out = gpio_o[4:0]; + 6: gpio_width_adjust_out = gpio_o[5:0]; + 7: gpio_width_adjust_out = gpio_o[6:0]; + 8: gpio_width_adjust_out = gpio_o[7:0]; + 9: gpio_width_adjust_out = gpio_o[8:0]; + 10: gpio_width_adjust_out = gpio_o[9:0]; + 11: gpio_width_adjust_out = gpio_o[10:0]; + 12: gpio_width_adjust_out = gpio_o[11:0]; + 13: gpio_width_adjust_out = gpio_o[12:0]; + 14: gpio_width_adjust_out = gpio_o[13:0]; + 15: gpio_width_adjust_out = gpio_o[14:0]; + 16: gpio_width_adjust_out = gpio_o[15:0]; + 17: gpio_width_adjust_out = gpio_o[16:0]; + 18: gpio_width_adjust_out = gpio_o[17:0]; + 19: gpio_width_adjust_out = gpio_o[18:0]; + 20: gpio_width_adjust_out = gpio_o[19:0]; + 21: gpio_width_adjust_out = gpio_o[20:0]; + 22: gpio_width_adjust_out = gpio_o[21:0]; + 23: gpio_width_adjust_out = gpio_o[22:0]; + 24: gpio_width_adjust_out = gpio_o[23:0]; + 25: gpio_width_adjust_out = gpio_o[24:0]; + 26: gpio_width_adjust_out = gpio_o[25:0]; + 27: gpio_width_adjust_out = gpio_o[26:0]; + 28: gpio_width_adjust_out = gpio_o[27:0]; + 29: gpio_width_adjust_out = gpio_o[28:0]; + 30: gpio_width_adjust_out = gpio_o[29:0]; + 31: gpio_width_adjust_out = gpio_o[30:0]; + 32: gpio_width_adjust_out = gpio_o[31:0]; + 33: gpio_width_adjust_out = gpio_o[32:0]; + 34: gpio_width_adjust_out = gpio_o[33:0]; + 35: gpio_width_adjust_out = gpio_o[34:0]; + 36: gpio_width_adjust_out = gpio_o[35:0]; + 37: gpio_width_adjust_out = gpio_o[36:0]; + 38: gpio_width_adjust_out = gpio_o[37:0]; + 39: gpio_width_adjust_out = gpio_o[38:0]; + 40: gpio_width_adjust_out = gpio_o[39:0]; + 41: gpio_width_adjust_out = gpio_o[40:0]; + 42: gpio_width_adjust_out = gpio_o[41:0]; + 43: gpio_width_adjust_out = gpio_o[42:0]; + 44: gpio_width_adjust_out = gpio_o[43:0]; + 45: gpio_width_adjust_out = gpio_o[44:0]; + 46: gpio_width_adjust_out = gpio_o[45:0]; + 47: gpio_width_adjust_out = gpio_o[46:0]; + 48: gpio_width_adjust_out = gpio_o[47:0]; + 49: gpio_width_adjust_out = gpio_o[48:0]; + 50: gpio_width_adjust_out = gpio_o[49:0]; + 51: gpio_width_adjust_out = gpio_o[50:0]; + 52: gpio_width_adjust_out = gpio_o[51:0]; + 53: gpio_width_adjust_out = gpio_o[52:0]; + 54: gpio_width_adjust_out = gpio_o[53:0]; + 55: gpio_width_adjust_out = gpio_o[54:0]; + 56: gpio_width_adjust_out = gpio_o[55:0]; + 57: gpio_width_adjust_out = gpio_o[56:0]; + 58: gpio_width_adjust_out = gpio_o[57:0]; + 59: gpio_width_adjust_out = gpio_o[58:0]; + 60: gpio_width_adjust_out = gpio_o[59:0]; + 61: gpio_width_adjust_out = gpio_o[60:0]; + 62: gpio_width_adjust_out = gpio_o[61:0]; + 63: gpio_width_adjust_out = gpio_o[62:0]; + 64: gpio_width_adjust_out = gpio_o; + default : gpio_width_adjust_out = gpio_o; + endcase + end + endfunction + + assign GPIO_O[(C_EMIO_GPIO_WIDTH - 1) : 0] = gpio_width_adjust_out(gpio_out); + assign GPIO_T_n[(C_EMIO_GPIO_WIDTH - 1) : 0] = gpio_width_adjust_out(gpio_out_t_n); + +// Adding OBUFT to JTAG out port +generate + if ( C_EN_EMIO_PJTAG == 1 ) begin : PJTAG_OBUFT_TRUE + OBUFT jtag_obuft_inst ( + .O(PJTAG_TDO), + .I(PJTAG_TDO_O), + .T(PJTAG_TDO_T) + ); + end + else + begin + assign PJTAG_TDO = 1'b0; + end +endgenerate +// ------- +// EMIO PJTAG +assign PJTAG_TDO_T = ~ PJTAG_TDO_T_n; + +// EMIO SDIO0 : No negation required as per CR#636210 for 1.0 version of Silicon, +// FOR Other SI REV, inversion is required + +assign SDIO0_CMD_T = (C_PS7_SI_REV == "1.0") ? (SDIO0_CMD_T_n) : (~ SDIO0_CMD_T_n); +assign SDIO0_DATA_T[3:0] = (C_PS7_SI_REV == "1.0") ? (SDIO0_DATA_T_n[3:0]) : (~ SDIO0_DATA_T_n[3:0]); + +// EMIO SDIO1 : No negation required as per CR#636210 for 1.0 version of Silicon, +// FOR Other SI REV, inversion is required +assign SDIO1_CMD_T = (C_PS7_SI_REV == "1.0") ? (SDIO1_CMD_T_n) : (~ SDIO1_CMD_T_n); +assign SDIO1_DATA_T[3:0] = (C_PS7_SI_REV == "1.0") ? (SDIO1_DATA_T_n[3:0]) : (~ SDIO1_DATA_T_n[3:0]); + +// FCLK_CLK optional clock buffers + +generate + if (C_FCLK_CLK0_BUF == "TRUE" | C_FCLK_CLK0_BUF == "true") begin : buffer_fclk_clk_0 + BUFG FCLK_CLK_0_BUFG (.I(FCLK_CLK_unbuffered[0]), .O(FCLK_CLK_buffered[0])); + end + if (C_FCLK_CLK1_BUF == "TRUE" | C_FCLK_CLK1_BUF == "true") begin : buffer_fclk_clk_1 + BUFG FCLK_CLK_1_BUFG (.I(FCLK_CLK_unbuffered[1]), .O(FCLK_CLK_buffered[1])); + end + if (C_FCLK_CLK2_BUF == "TRUE" | C_FCLK_CLK2_BUF == "true") begin : buffer_fclk_clk_2 + BUFG FCLK_CLK_2_BUFG (.I(FCLK_CLK_unbuffered[2]), .O(FCLK_CLK_buffered[2])); + end + if (C_FCLK_CLK3_BUF == "TRUE" | C_FCLK_CLK3_BUF == "true") begin : buffer_fclk_clk_3 + BUFG FCLK_CLK_3_BUFG (.I(FCLK_CLK_unbuffered[3]), .O(FCLK_CLK_buffered[3])); + end +endgenerate + +assign FCLK_CLK0_temp = (C_FCLK_CLK0_BUF == "TRUE" | C_FCLK_CLK0_BUF == "true") ? FCLK_CLK_buffered[0] : FCLK_CLK_unbuffered[0]; +assign FCLK_CLK1 = (C_FCLK_CLK1_BUF == "TRUE" | C_FCLK_CLK1_BUF == "true") ? FCLK_CLK_buffered[1] : FCLK_CLK_unbuffered[1]; +assign FCLK_CLK2 = (C_FCLK_CLK2_BUF == "TRUE" | C_FCLK_CLK2_BUF == "true") ? FCLK_CLK_buffered[2] : FCLK_CLK_unbuffered[2]; +assign FCLK_CLK3 = (C_FCLK_CLK3_BUF == "TRUE" | C_FCLK_CLK3_BUF == "true") ? FCLK_CLK_buffered[3] : FCLK_CLK_unbuffered[3]; + +assign FCLK_CLK0 = FCLK_CLK0_temp; + +// Adding BIBUF for fixed IO Ports and IBUF for fixed Input Ports + +BIBUF DDR_CAS_n_BIBUF (.PAD(DDR_CAS_n), .IO(buffered_DDR_CAS_n)); +BIBUF DDR_CKE_BIBUF (.PAD(DDR_CKE), .IO(buffered_DDR_CKE)); +BIBUF DDR_Clk_n_BIBUF (.PAD(DDR_Clk_n), .IO(buffered_DDR_Clk_n)); +BIBUF DDR_Clk_BIBUF (.PAD(DDR_Clk), .IO(buffered_DDR_Clk)); +BIBUF DDR_CS_n_BIBUF (.PAD(DDR_CS_n), .IO(buffered_DDR_CS_n)); +BIBUF DDR_DRSTB_BIBUF (.PAD(DDR_DRSTB), .IO(buffered_DDR_DRSTB)); +BIBUF DDR_ODT_BIBUF (.PAD(DDR_ODT), .IO(buffered_DDR_ODT)); +BIBUF DDR_RAS_n_BIBUF (.PAD(DDR_RAS_n), .IO(buffered_DDR_RAS_n)); +BIBUF DDR_WEB_BIBUF (.PAD(DDR_WEB), .IO(buffered_DDR_WEB)); +BIBUF DDR_VRN_BIBUF (.PAD(DDR_VRN), .IO(buffered_DDR_VRN)); +BIBUF DDR_VRP_BIBUF (.PAD(DDR_VRP), .IO(buffered_DDR_VRP)); +BIBUF PS_SRSTB_BIBUF (.PAD(PS_SRSTB), .IO(buffered_PS_SRSTB)); +BIBUF PS_CLK_BIBUF (.PAD(PS_CLK), .IO(buffered_PS_CLK)); +BIBUF PS_PORB_BIBUF (.PAD(PS_PORB), .IO(buffered_PS_PORB)); + +genvar i; +generate + for (i=0; i < C_MIO_PRIMITIVE; i=i+1) begin + BIBUF MIO_BIBUF (.PAD(MIO[i]), .IO(buffered_MIO[i])); + end +endgenerate + +generate + for (i=0; i < 3; i=i+1) begin + BIBUF DDR_BankAddr_BIBUF (.PAD(DDR_BankAddr[i]), .IO(buffered_DDR_BankAddr[i])); + end +endgenerate + +generate + for (i=0; i < 15; i=i+1) begin + BIBUF DDR_Addr_BIBUF (.PAD(DDR_Addr[i]), .IO(buffered_DDR_Addr[i])); + end +endgenerate + +generate + for (i=0; i < C_DM_WIDTH; i=i+1) begin + BIBUF DDR_DM_BIBUF (.PAD(DDR_DM[i]), .IO(buffered_DDR_DM[i])); + end +endgenerate + +generate + for (i=0; i < C_DQ_WIDTH; i=i+1) begin + BIBUF DDR_DQ_BIBUF (.PAD(DDR_DQ[i]), .IO(buffered_DDR_DQ[i])); + end +endgenerate + +generate + for (i=0; i < C_DQS_WIDTH; i=i+1) begin + BIBUF DDR_DQS_n_BIBUF (.PAD(DDR_DQS_n[i]), .IO(buffered_DDR_DQS_n[i])); + end +endgenerate + +generate + for (i=0; i < C_DQS_WIDTH; i=i+1) begin + BIBUF DDR_DQS_BIBUF (.PAD(DDR_DQS[i]), .IO(buffered_DDR_DQS[i])); + end +endgenerate + +// Connect FCLK in case of disable the AXI port for non Secure Transaction +//Start + + +generate + if ( C_USE_AXI_NONSECURE == 1 && C_USE_S_AXI_HP0 == 0) begin + assign S_AXI_HP0_ACLK_temp = FCLK_CLK0_temp; + end + else begin + assign S_AXI_HP0_ACLK_temp = S_AXI_HP0_ACLK; + end +endgenerate + +generate + if ( C_USE_AXI_NONSECURE == 1 && C_USE_S_AXI_HP1 == 0) begin + assign S_AXI_HP1_ACLK_temp = FCLK_CLK0_temp; + end + else begin + assign S_AXI_HP1_ACLK_temp = S_AXI_HP1_ACLK; + end +endgenerate + +generate + if ( C_USE_AXI_NONSECURE == 1 && C_USE_S_AXI_HP2 == 0) begin + assign S_AXI_HP2_ACLK_temp = FCLK_CLK0_temp; + end + else begin + assign S_AXI_HP2_ACLK_temp = S_AXI_HP2_ACLK; + end +endgenerate + +generate + if ( C_USE_AXI_NONSECURE == 1 && C_USE_S_AXI_HP3 == 0) begin + assign S_AXI_HP3_ACLK_temp = FCLK_CLK0_temp; + end + else begin + assign S_AXI_HP3_ACLK_temp = S_AXI_HP3_ACLK; + end +endgenerate + +//Start + + +generate + if ( C_USE_AXI_NONSECURE == 1 && C_USE_M_AXI_GP0 == 0) begin + assign M_AXI_GP0_ACLK_temp = FCLK_CLK0_temp; + end + else begin + assign M_AXI_GP0_ACLK_temp = M_AXI_GP0_ACLK; + end +endgenerate + +generate + if ( C_USE_AXI_NONSECURE == 1 && C_USE_M_AXI_GP1 == 0) begin + assign M_AXI_GP1_ACLK_temp = FCLK_CLK0_temp; + end + else begin + assign M_AXI_GP1_ACLK_temp = M_AXI_GP1_ACLK; + end +endgenerate + +generate + if ( C_USE_AXI_NONSECURE == 1 && C_USE_S_AXI_GP0 == 0) begin + assign S_AXI_GP0_ACLK_temp = FCLK_CLK0_temp; + end + else begin + assign S_AXI_GP0_ACLK_temp = S_AXI_GP0_ACLK; + end +endgenerate + +generate + if ( C_USE_AXI_NONSECURE == 1 && C_USE_S_AXI_GP1 == 0) begin + assign S_AXI_GP1_ACLK_temp = FCLK_CLK0_temp; + end + else begin + assign S_AXI_GP1_ACLK_temp = S_AXI_GP1_ACLK; + end +endgenerate + +generate + if ( C_USE_AXI_NONSECURE == 1 && C_USE_S_AXI_ACP == 0) begin + assign S_AXI_ACP_ACLK_temp = FCLK_CLK0_temp; + end + else begin + assign S_AXI_ACP_ACLK_temp = S_AXI_ACP_ACLK; + end +endgenerate + +assign M_AXI_GP0_ARCACHE=(C_GP0_EN_MODIFIABLE_TXN==1)?{{M_AXI_GP0_ARCACHE_t[3:2]},{1'b1},{M_AXI_GP0_ARCACHE_t[0]}}:M_AXI_GP0_ARCACHE_t ; +assign M_AXI_GP1_ARCACHE=(C_GP1_EN_MODIFIABLE_TXN==1)?{{M_AXI_GP1_ARCACHE_t[3:2]},{1'b1},{M_AXI_GP1_ARCACHE_t[0]}}:M_AXI_GP1_ARCACHE_t ; +assign M_AXI_GP0_AWCACHE=(C_GP0_EN_MODIFIABLE_TXN==1)?{{M_AXI_GP0_AWCACHE_t[3:2]},{1'b1},{M_AXI_GP0_AWCACHE_t[0]}}:M_AXI_GP0_AWCACHE_t ; +assign M_AXI_GP1_AWCACHE=(C_GP1_EN_MODIFIABLE_TXN==1)?{{M_AXI_GP1_AWCACHE_t[3:2]},{1'b1},{M_AXI_GP1_AWCACHE_t[0]}}:M_AXI_GP1_AWCACHE_t ; + + +//END +//==================== +//PSS TOP +//==================== +generate +if (C_PACKAGE_NAME == "clg225" ) begin + wire [21:0] dummy; + PS7 PS7_i ( + .DMA0DATYPE (DMA0_DATYPE ), + .DMA0DAVALID (DMA0_DAVALID), + .DMA0DRREADY (DMA0_DRREADY), + .DMA0RSTN (DMA0_RSTN ), + .DMA1DATYPE (DMA1_DATYPE ), + .DMA1DAVALID (DMA1_DAVALID), + .DMA1DRREADY (DMA1_DRREADY), + .DMA1RSTN (DMA1_RSTN ), + .DMA2DATYPE (DMA2_DATYPE ), + .DMA2DAVALID (DMA2_DAVALID), + .DMA2DRREADY (DMA2_DRREADY), + .DMA2RSTN (DMA2_RSTN ), + .DMA3DATYPE (DMA3_DATYPE ), + .DMA3DAVALID (DMA3_DAVALID), + .DMA3DRREADY (DMA3_DRREADY), + .DMA3RSTN (DMA3_RSTN ), + .EMIOCAN0PHYTX (CAN0_PHY_TX ), + .EMIOCAN1PHYTX (CAN1_PHY_TX ), + .EMIOENET0GMIITXD (ENET0_GMII_TXD_i), // (ENET0_GMII_TXD_i ), + .EMIOENET0GMIITXEN (ENET0_GMII_TX_EN_i), // (ENET0_GMII_TX_EN_i), + .EMIOENET0GMIITXER (ENET0_GMII_TX_ER_i), // (ENET0_GMII_TX_ER_i), + .EMIOENET0MDIOMDC (ENET0_MDIO_MDC), + .EMIOENET0MDIOO (ENET0_MDIO_O ), + .EMIOENET0MDIOTN (ENET0_MDIO_T_n ), + .EMIOENET0PTPDELAYREQRX (ENET0_PTP_DELAY_REQ_RX), + .EMIOENET0PTPDELAYREQTX (ENET0_PTP_DELAY_REQ_TX), + .EMIOENET0PTPPDELAYREQRX (ENET0_PTP_PDELAY_REQ_RX), + .EMIOENET0PTPPDELAYREQTX (ENET0_PTP_PDELAY_REQ_TX), + .EMIOENET0PTPPDELAYRESPRX(ENET0_PTP_PDELAY_RESP_RX), + .EMIOENET0PTPPDELAYRESPTX(ENET0_PTP_PDELAY_RESP_TX), + .EMIOENET0PTPSYNCFRAMERX (ENET0_PTP_SYNC_FRAME_RX), + .EMIOENET0PTPSYNCFRAMETX (ENET0_PTP_SYNC_FRAME_TX), + .EMIOENET0SOFRX (ENET0_SOF_RX), + .EMIOENET0SOFTX (ENET0_SOF_TX), + .EMIOENET1GMIITXD (ENET1_GMII_TXD_i), //(ENET1_GMII_TXD_i), + .EMIOENET1GMIITXEN (ENET1_GMII_TX_EN_i), // (ENET1_GMII_TX_EN_i), + .EMIOENET1GMIITXER (ENET1_GMII_TX_ER_i), // (ENET1_GMII_TX_ER_i), + .EMIOENET1MDIOMDC (ENET1_MDIO_MDC), + .EMIOENET1MDIOO (ENET1_MDIO_O), + .EMIOENET1MDIOTN (ENET1_MDIO_T_n), + .EMIOENET1PTPDELAYREQRX (ENET1_PTP_DELAY_REQ_RX), + .EMIOENET1PTPDELAYREQTX (ENET1_PTP_DELAY_REQ_TX), + .EMIOENET1PTPPDELAYREQRX (ENET1_PTP_PDELAY_REQ_RX), + .EMIOENET1PTPPDELAYREQTX (ENET1_PTP_PDELAY_REQ_TX), + .EMIOENET1PTPPDELAYRESPRX(ENET1_PTP_PDELAY_RESP_RX), + .EMIOENET1PTPPDELAYRESPTX(ENET1_PTP_PDELAY_RESP_TX), + .EMIOENET1PTPSYNCFRAMERX (ENET1_PTP_SYNC_FRAME_RX), + .EMIOENET1PTPSYNCFRAMETX (ENET1_PTP_SYNC_FRAME_TX), + .EMIOENET1SOFRX (ENET1_SOF_RX), + .EMIOENET1SOFTX (ENET1_SOF_TX), + .EMIOGPIOO (gpio_out), + .EMIOGPIOTN (gpio_out_t_n), + .EMIOI2C0SCLO (I2C0_SCL_O), + .EMIOI2C0SCLTN (I2C0_SCL_T_n), + .EMIOI2C0SDAO (I2C0_SDA_O), + .EMIOI2C0SDATN (I2C0_SDA_T_n), + .EMIOI2C1SCLO (I2C1_SCL_O), + .EMIOI2C1SCLTN (I2C1_SCL_T_n), + .EMIOI2C1SDAO (I2C1_SDA_O), + .EMIOI2C1SDATN (I2C1_SDA_T_n), + .EMIOPJTAGTDO (PJTAG_TDO_O), + .EMIOPJTAGTDTN (PJTAG_TDO_T_n), + .EMIOSDIO0BUSPOW (SDIO0_BUSPOW), + .EMIOSDIO0CLK (SDIO0_CLK ), + .EMIOSDIO0CMDO (SDIO0_CMD_O ), + .EMIOSDIO0CMDTN (SDIO0_CMD_T_n ), + .EMIOSDIO0DATAO (SDIO0_DATA_O), + .EMIOSDIO0DATATN (SDIO0_DATA_T_n), + .EMIOSDIO0LED (SDIO0_LED), + .EMIOSDIO1BUSPOW (SDIO1_BUSPOW), + .EMIOSDIO1CLK (SDIO1_CLK ), + .EMIOSDIO1CMDO (SDIO1_CMD_O ), + .EMIOSDIO1CMDTN (SDIO1_CMD_T_n ), + .EMIOSDIO1DATAO (SDIO1_DATA_O), + .EMIOSDIO1DATATN (SDIO1_DATA_T_n), + .EMIOSDIO1LED (SDIO1_LED), + .EMIOSPI0MO (SPI0_MOSI_O), + .EMIOSPI0MOTN (SPI0_MOSI_T_n), + .EMIOSPI0SCLKO (SPI0_SCLK_O), + .EMIOSPI0SCLKTN (SPI0_SCLK_T_n), + .EMIOSPI0SO (SPI0_MISO_O), + .EMIOSPI0STN (SPI0_MISO_T_n), + .EMIOSPI0SSON ({SPI0_SS2_O,SPI0_SS1_O,SPI0_SS_O}), + .EMIOSPI0SSNTN (SPI0_SS_T_n), + .EMIOSPI1MO (SPI1_MOSI_O), + .EMIOSPI1MOTN (SPI1_MOSI_T_n), + .EMIOSPI1SCLKO (SPI1_SCLK_O), + .EMIOSPI1SCLKTN (SPI1_SCLK_T_n), + .EMIOSPI1SO (SPI1_MISO_O), + .EMIOSPI1STN (SPI1_MISO_T_n), + .EMIOSPI1SSON ({SPI1_SS2_O,SPI1_SS1_O,SPI1_SS_O}), + .EMIOSPI1SSNTN (SPI1_SS_T_n), + .EMIOTRACECTL (TRACE_CTL_i), + .EMIOTRACEDATA (TRACE_DATA_i), + .EMIOTTC0WAVEO ({TTC0_WAVE2_OUT,TTC0_WAVE1_OUT,TTC0_WAVE0_OUT}), + .EMIOTTC1WAVEO ({TTC1_WAVE2_OUT,TTC1_WAVE1_OUT,TTC1_WAVE0_OUT}), + .EMIOUART0DTRN (UART0_DTRN), + .EMIOUART0RTSN (UART0_RTSN), + .EMIOUART0TX (UART0_TX ), + .EMIOUART1DTRN (UART1_DTRN), + .EMIOUART1RTSN (UART1_RTSN), + .EMIOUART1TX (UART1_TX ), + .EMIOUSB0PORTINDCTL (USB0_PORT_INDCTL), + .EMIOUSB0VBUSPWRSELECT (USB0_VBUS_PWRSELECT), + .EMIOUSB1PORTINDCTL (USB1_PORT_INDCTL), + .EMIOUSB1VBUSPWRSELECT (USB1_VBUS_PWRSELECT), + .EMIOWDTRSTO (WDT_RST_OUT), + .EVENTEVENTO (EVENT_EVENTO), + .EVENTSTANDBYWFE (EVENT_STANDBYWFE), + .EVENTSTANDBYWFI (EVENT_STANDBYWFI), + .FCLKCLK (FCLK_CLK_unbuffered), + .FCLKRESETN ({FCLK_RESET3_N,FCLK_RESET2_N,FCLK_RESET1_N,FCLK_RESET0_N}), + .EMIOSDIO0BUSVOLT (SDIO0_BUSVOLT), + .EMIOSDIO1BUSVOLT (SDIO1_BUSVOLT), + .FTMTF2PTRIGACK ({FTMT_F2P_TRIGACK_3,FTMT_F2P_TRIGACK_2,FTMT_F2P_TRIGACK_1,FTMT_F2P_TRIGACK_0}), + .FTMTP2FDEBUG (FTMT_P2F_DEBUG ), + .FTMTP2FTRIG ({FTMT_P2F_TRIG_3,FTMT_P2F_TRIG_2,FTMT_P2F_TRIG_1,FTMT_P2F_TRIG_0}), + .IRQP2F ({IRQ_P2F_DMAC_ABORT, IRQ_P2F_DMAC7, IRQ_P2F_DMAC6, IRQ_P2F_DMAC5, IRQ_P2F_DMAC4, IRQ_P2F_DMAC3, IRQ_P2F_DMAC2, IRQ_P2F_DMAC1, IRQ_P2F_DMAC0, IRQ_P2F_SMC, IRQ_P2F_QSPI, IRQ_P2F_CTI, IRQ_P2F_GPIO, IRQ_P2F_USB0, IRQ_P2F_ENET0, IRQ_P2F_ENET_WAKE0, IRQ_P2F_SDIO0, IRQ_P2F_I2C0, IRQ_P2F_SPI0, IRQ_P2F_UART0, IRQ_P2F_CAN0, IRQ_P2F_USB1, IRQ_P2F_ENET1, IRQ_P2F_ENET_WAKE1, IRQ_P2F_SDIO1, IRQ_P2F_I2C1, IRQ_P2F_SPI1, IRQ_P2F_UART1, IRQ_P2F_CAN1}), + .MAXIGP0ARADDR (M_AXI_GP0_ARADDR), + .MAXIGP0ARBURST (M_AXI_GP0_ARBURST), + .MAXIGP0ARCACHE (M_AXI_GP0_ARCACHE_t), + .MAXIGP0ARESETN (M_AXI_GP0_ARESETN), + .MAXIGP0ARID (M_AXI_GP0_ARID_FULL ), + .MAXIGP0ARLEN (M_AXI_GP0_ARLEN ), + .MAXIGP0ARLOCK (M_AXI_GP0_ARLOCK ), + .MAXIGP0ARPROT (M_AXI_GP0_ARPROT ), + .MAXIGP0ARQOS (M_AXI_GP0_ARQOS ), + .MAXIGP0ARSIZE (M_AXI_GP0_ARSIZE_i ), + .MAXIGP0ARVALID (M_AXI_GP0_ARVALID), + .MAXIGP0AWADDR (M_AXI_GP0_AWADDR ), + .MAXIGP0AWBURST (M_AXI_GP0_AWBURST), + .MAXIGP0AWCACHE (M_AXI_GP0_AWCACHE_t), + .MAXIGP0AWID (M_AXI_GP0_AWID_FULL ), + .MAXIGP0AWLEN (M_AXI_GP0_AWLEN ), + .MAXIGP0AWLOCK (M_AXI_GP0_AWLOCK ), + .MAXIGP0AWPROT (M_AXI_GP0_AWPROT ), + .MAXIGP0AWQOS (M_AXI_GP0_AWQOS ), + .MAXIGP0AWSIZE (M_AXI_GP0_AWSIZE_i ), + .MAXIGP0AWVALID (M_AXI_GP0_AWVALID), + .MAXIGP0BREADY (M_AXI_GP0_BREADY ), + .MAXIGP0RREADY (M_AXI_GP0_RREADY ), + .MAXIGP0WDATA (M_AXI_GP0_WDATA ), + .MAXIGP0WID (M_AXI_GP0_WID_FULL ), + .MAXIGP0WLAST (M_AXI_GP0_WLAST ), + .MAXIGP0WSTRB (M_AXI_GP0_WSTRB ), + .MAXIGP0WVALID (M_AXI_GP0_WVALID ), + .MAXIGP1ARADDR (M_AXI_GP1_ARADDR ), + .MAXIGP1ARBURST (M_AXI_GP1_ARBURST), + .MAXIGP1ARCACHE (M_AXI_GP1_ARCACHE_t), + .MAXIGP1ARESETN (M_AXI_GP1_ARESETN), + .MAXIGP1ARID (M_AXI_GP1_ARID_FULL ), + .MAXIGP1ARLEN (M_AXI_GP1_ARLEN ), + .MAXIGP1ARLOCK (M_AXI_GP1_ARLOCK ), + .MAXIGP1ARPROT (M_AXI_GP1_ARPROT ), + .MAXIGP1ARQOS (M_AXI_GP1_ARQOS ), + .MAXIGP1ARSIZE (M_AXI_GP1_ARSIZE_i ), + .MAXIGP1ARVALID (M_AXI_GP1_ARVALID), + .MAXIGP1AWADDR (M_AXI_GP1_AWADDR ), + .MAXIGP1AWBURST (M_AXI_GP1_AWBURST), + .MAXIGP1AWCACHE (M_AXI_GP1_AWCACHE_t), + .MAXIGP1AWID (M_AXI_GP1_AWID_FULL ), + .MAXIGP1AWLEN (M_AXI_GP1_AWLEN ), + .MAXIGP1AWLOCK (M_AXI_GP1_AWLOCK ), + .MAXIGP1AWPROT (M_AXI_GP1_AWPROT ), + .MAXIGP1AWQOS (M_AXI_GP1_AWQOS ), + .MAXIGP1AWSIZE (M_AXI_GP1_AWSIZE_i ), + .MAXIGP1AWVALID (M_AXI_GP1_AWVALID), + .MAXIGP1BREADY (M_AXI_GP1_BREADY ), + .MAXIGP1RREADY (M_AXI_GP1_RREADY ), + .MAXIGP1WDATA (M_AXI_GP1_WDATA ), + .MAXIGP1WID (M_AXI_GP1_WID_FULL ), + .MAXIGP1WLAST (M_AXI_GP1_WLAST ), + .MAXIGP1WSTRB (M_AXI_GP1_WSTRB ), + .MAXIGP1WVALID (M_AXI_GP1_WVALID ), + .SAXIACPARESETN (S_AXI_ACP_ARESETN), + .SAXIACPARREADY (SAXIACPARREADY_W), + .SAXIACPAWREADY (SAXIACPAWREADY_W), + .SAXIACPBID (S_AXI_ACP_BID_out ), + .SAXIACPBRESP (SAXIACPBRESP_W ), + .SAXIACPBVALID (SAXIACPBVALID_W ), + .SAXIACPRDATA (SAXIACPRDATA_W ), + .SAXIACPRID (S_AXI_ACP_RID_out), + .SAXIACPRLAST (SAXIACPRLAST_W ), + .SAXIACPRRESP (SAXIACPRRESP_W ), + .SAXIACPRVALID (SAXIACPRVALID_W ), + .SAXIACPWREADY (SAXIACPWREADY_W ), + .SAXIGP0ARESETN (S_AXI_GP0_ARESETN), + .SAXIGP0ARREADY (S_AXI_GP0_ARREADY), + .SAXIGP0AWREADY (S_AXI_GP0_AWREADY), + .SAXIGP0BID (S_AXI_GP0_BID_out), + .SAXIGP0BRESP (S_AXI_GP0_BRESP ), + .SAXIGP0BVALID (S_AXI_GP0_BVALID ), + .SAXIGP0RDATA (S_AXI_GP0_RDATA ), + .SAXIGP0RID (S_AXI_GP0_RID_out ), + .SAXIGP0RLAST (S_AXI_GP0_RLAST ), + .SAXIGP0RRESP (S_AXI_GP0_RRESP ), + .SAXIGP0RVALID (S_AXI_GP0_RVALID ), + .SAXIGP0WREADY (S_AXI_GP0_WREADY ), + .SAXIGP1ARESETN (S_AXI_GP1_ARESETN), + .SAXIGP1ARREADY (S_AXI_GP1_ARREADY), + .SAXIGP1AWREADY (S_AXI_GP1_AWREADY), + .SAXIGP1BID (S_AXI_GP1_BID_out ), + .SAXIGP1BRESP (S_AXI_GP1_BRESP ), + .SAXIGP1BVALID (S_AXI_GP1_BVALID ), + .SAXIGP1RDATA (S_AXI_GP1_RDATA ), + .SAXIGP1RID (S_AXI_GP1_RID_out ), + .SAXIGP1RLAST (S_AXI_GP1_RLAST ), + .SAXIGP1RRESP (S_AXI_GP1_RRESP ), + .SAXIGP1RVALID (S_AXI_GP1_RVALID ), + .SAXIGP1WREADY (S_AXI_GP1_WREADY ), + .SAXIHP0ARESETN (S_AXI_HP0_ARESETN), + .SAXIHP0ARREADY (S_AXI_HP0_ARREADY), + .SAXIHP0AWREADY (S_AXI_HP0_AWREADY), + .SAXIHP0BID (S_AXI_HP0_BID_out ), + .SAXIHP0BRESP (S_AXI_HP0_BRESP ), + .SAXIHP0BVALID (S_AXI_HP0_BVALID ), + .SAXIHP0RACOUNT (S_AXI_HP0_RACOUNT), + .SAXIHP0RCOUNT (S_AXI_HP0_RCOUNT), + .SAXIHP0RDATA (S_AXI_HP0_RDATA_out), + .SAXIHP0RID (S_AXI_HP0_RID_out ), + .SAXIHP0RLAST (S_AXI_HP0_RLAST), + .SAXIHP0RRESP (S_AXI_HP0_RRESP), + .SAXIHP0RVALID (S_AXI_HP0_RVALID), + .SAXIHP0WCOUNT (S_AXI_HP0_WCOUNT), + .SAXIHP0WACOUNT (S_AXI_HP0_WACOUNT), + .SAXIHP0WREADY (S_AXI_HP0_WREADY), + .SAXIHP1ARESETN (S_AXI_HP1_ARESETN), + .SAXIHP1ARREADY (S_AXI_HP1_ARREADY), + .SAXIHP1AWREADY (S_AXI_HP1_AWREADY), + .SAXIHP1BID (S_AXI_HP1_BID_out ), + .SAXIHP1BRESP (S_AXI_HP1_BRESP ), + .SAXIHP1BVALID (S_AXI_HP1_BVALID ), + .SAXIHP1RACOUNT (S_AXI_HP1_RACOUNT ), + .SAXIHP1RCOUNT (S_AXI_HP1_RCOUNT ), + .SAXIHP1RDATA (S_AXI_HP1_RDATA_out), + .SAXIHP1RID (S_AXI_HP1_RID_out ), + .SAXIHP1RLAST (S_AXI_HP1_RLAST ), + .SAXIHP1RRESP (S_AXI_HP1_RRESP ), + .SAXIHP1RVALID (S_AXI_HP1_RVALID), + .SAXIHP1WACOUNT (S_AXI_HP1_WACOUNT), + .SAXIHP1WCOUNT (S_AXI_HP1_WCOUNT), + .SAXIHP1WREADY (S_AXI_HP1_WREADY), + .SAXIHP2ARESETN (S_AXI_HP2_ARESETN), + .SAXIHP2ARREADY (S_AXI_HP2_ARREADY), + .SAXIHP2AWREADY (S_AXI_HP2_AWREADY), + .SAXIHP2BID (S_AXI_HP2_BID_out ), + .SAXIHP2BRESP (S_AXI_HP2_BRESP), + .SAXIHP2BVALID (S_AXI_HP2_BVALID), + .SAXIHP2RACOUNT (S_AXI_HP2_RACOUNT), + .SAXIHP2RCOUNT (S_AXI_HP2_RCOUNT), + .SAXIHP2RDATA (S_AXI_HP2_RDATA_out), + .SAXIHP2RID (S_AXI_HP2_RID_out ), + .SAXIHP2RLAST (S_AXI_HP2_RLAST), + .SAXIHP2RRESP (S_AXI_HP2_RRESP), + .SAXIHP2RVALID (S_AXI_HP2_RVALID), + .SAXIHP2WACOUNT (S_AXI_HP2_WACOUNT), + .SAXIHP2WCOUNT (S_AXI_HP2_WCOUNT), + .SAXIHP2WREADY (S_AXI_HP2_WREADY), + .SAXIHP3ARESETN (S_AXI_HP3_ARESETN), + .SAXIHP3ARREADY (S_AXI_HP3_ARREADY), + .SAXIHP3AWREADY (S_AXI_HP3_AWREADY), + .SAXIHP3BID (S_AXI_HP3_BID_out), + .SAXIHP3BRESP (S_AXI_HP3_BRESP), + .SAXIHP3BVALID (S_AXI_HP3_BVALID), + .SAXIHP3RACOUNT (S_AXI_HP3_RACOUNT), + .SAXIHP3RCOUNT (S_AXI_HP3_RCOUNT), + .SAXIHP3RDATA (S_AXI_HP3_RDATA_out), + .SAXIHP3RID (S_AXI_HP3_RID_out), + .SAXIHP3RLAST (S_AXI_HP3_RLAST), + .SAXIHP3RRESP (S_AXI_HP3_RRESP), + .SAXIHP3RVALID (S_AXI_HP3_RVALID), + .SAXIHP3WCOUNT (S_AXI_HP3_WCOUNT), + .SAXIHP3WACOUNT (S_AXI_HP3_WACOUNT), + .SAXIHP3WREADY (S_AXI_HP3_WREADY), + .DDRARB (DDR_ARB), + .DMA0ACLK (DMA0_ACLK ), + .DMA0DAREADY (DMA0_DAREADY), + .DMA0DRLAST (DMA0_DRLAST ), + .DMA0DRTYPE (DMA0_DRTYPE), + .DMA0DRVALID (DMA0_DRVALID), + .DMA1ACLK (DMA1_ACLK ), + .DMA1DAREADY (DMA1_DAREADY), + .DMA1DRLAST (DMA1_DRLAST ), + .DMA1DRTYPE (DMA1_DRTYPE), + .DMA1DRVALID (DMA1_DRVALID), + .DMA2ACLK (DMA2_ACLK ), + .DMA2DAREADY (DMA2_DAREADY), + .DMA2DRLAST (DMA2_DRLAST ), + .DMA2DRTYPE (DMA2_DRTYPE), + .DMA2DRVALID (DMA2_DRVALID), + .DMA3ACLK (DMA3_ACLK ), + .DMA3DAREADY (DMA3_DAREADY), + .DMA3DRLAST (DMA3_DRLAST ), + .DMA3DRTYPE (DMA3_DRTYPE), + .DMA3DRVALID (DMA3_DRVALID), + .EMIOCAN0PHYRX (CAN0_PHY_RX), + .EMIOCAN1PHYRX (CAN1_PHY_RX), + .EMIOENET0EXTINTIN (ENET0_EXT_INTIN), + .EMIOENET0GMIICOL (ENET0_GMII_COL_i), + .EMIOENET0GMIICRS (ENET0_GMII_CRS_i), + .EMIOENET0GMIIRXCLK (ENET0_GMII_RX_CLK), + .EMIOENET0GMIIRXD (ENET0_GMII_RXD_i), + .EMIOENET0GMIIRXDV (ENET0_GMII_RX_DV_i), + .EMIOENET0GMIIRXER (ENET0_GMII_RX_ER_i), + .EMIOENET0GMIITXCLK (ENET0_GMII_TX_CLK), + .EMIOENET0MDIOI (ENET0_MDIO_I), + .EMIOENET1EXTINTIN (ENET1_EXT_INTIN), + .EMIOENET1GMIICOL (ENET1_GMII_COL_i), + .EMIOENET1GMIICRS (ENET1_GMII_CRS_i), + .EMIOENET1GMIIRXCLK (ENET1_GMII_RX_CLK), + .EMIOENET1GMIIRXD (ENET1_GMII_RXD_i), + .EMIOENET1GMIIRXDV (ENET1_GMII_RX_DV_i), + .EMIOENET1GMIIRXER (ENET1_GMII_RX_ER_i), + .EMIOENET1GMIITXCLK (ENET1_GMII_TX_CLK), + .EMIOENET1MDIOI (ENET1_MDIO_I), + .EMIOGPIOI (gpio_in63_0 ), + .EMIOI2C0SCLI (I2C0_SCL_I), + .EMIOI2C0SDAI (I2C0_SDA_I), + .EMIOI2C1SCLI (I2C1_SCL_I), + .EMIOI2C1SDAI (I2C1_SDA_I), + .EMIOPJTAGTCK (PJTAG_TCK), + .EMIOPJTAGTDI (PJTAG_TDI), + .EMIOPJTAGTMS (PJTAG_TMS), + .EMIOSDIO0CDN (SDIO0_CDN), + .EMIOSDIO0CLKFB (SDIO0_CLK_FB ), + .EMIOSDIO0CMDI (SDIO0_CMD_I ), + .EMIOSDIO0DATAI (SDIO0_DATA_I ), + .EMIOSDIO0WP (SDIO0_WP), + .EMIOSDIO1CDN (SDIO1_CDN), + .EMIOSDIO1CLKFB (SDIO1_CLK_FB ), + .EMIOSDIO1CMDI (SDIO1_CMD_I ), + .EMIOSDIO1DATAI (SDIO1_DATA_I ), + .EMIOSDIO1WP (SDIO1_WP), + .EMIOSPI0MI (SPI0_MISO_I), + .EMIOSPI0SCLKI (SPI0_SCLK_I), + .EMIOSPI0SI (SPI0_MOSI_I), + .EMIOSPI0SSIN (SPI0_SS_I), + .EMIOSPI1MI (SPI1_MISO_I), + .EMIOSPI1SCLKI (SPI1_SCLK_I), + .EMIOSPI1SI (SPI1_MOSI_I), + .EMIOSPI1SSIN (SPI1_SS_I), + .EMIOSRAMINTIN (SRAM_INTIN), + .EMIOTRACECLK (TRACE_CLK), + .EMIOTTC0CLKI ({TTC0_CLK2_IN, TTC0_CLK1_IN, TTC0_CLK0_IN}), + .EMIOTTC1CLKI ({TTC1_CLK2_IN, TTC1_CLK1_IN, TTC1_CLK0_IN}), + .EMIOUART0CTSN (UART0_CTSN), + .EMIOUART0DCDN (UART0_DCDN), + .EMIOUART0DSRN (UART0_DSRN), + .EMIOUART0RIN (UART0_RIN ), + .EMIOUART0RX (UART0_RX ), + .EMIOUART1CTSN (UART1_CTSN), + .EMIOUART1DCDN (UART1_DCDN), + .EMIOUART1DSRN (UART1_DSRN), + .EMIOUART1RIN (UART1_RIN ), + .EMIOUART1RX (UART1_RX ), + .EMIOUSB0VBUSPWRFAULT (USB0_VBUS_PWRFAULT), + .EMIOUSB1VBUSPWRFAULT (USB1_VBUS_PWRFAULT), + .EMIOWDTCLKI (WDT_CLK_IN), + .EVENTEVENTI (EVENT_EVENTI), + .FCLKCLKTRIGN (fclk_clktrig_gnd), + .FPGAIDLEN (FPGA_IDLE_N), + .FTMDTRACEINATID (FTMD_TRACEIN_ATID_i), + .FTMDTRACEINCLOCK (FTMD_TRACEIN_CLK), + .FTMDTRACEINDATA (FTMD_TRACEIN_DATA_i), + .FTMDTRACEINVALID (FTMD_TRACEIN_VALID_i), + .FTMTF2PDEBUG (FTMT_F2P_DEBUG ), + .FTMTF2PTRIG ({FTMT_F2P_TRIG_3,FTMT_F2P_TRIG_2,FTMT_F2P_TRIG_1,FTMT_F2P_TRIG_0}), + .FTMTP2FTRIGACK ({FTMT_P2F_TRIGACK_3,FTMT_P2F_TRIGACK_2,FTMT_P2F_TRIGACK_1,FTMT_P2F_TRIGACK_0}), + .IRQF2P (irq_f2p_i), + .MAXIGP0ACLK (M_AXI_GP0_ACLK_temp), + .MAXIGP0ARREADY (M_AXI_GP0_ARREADY), + .MAXIGP0AWREADY (M_AXI_GP0_AWREADY), + .MAXIGP0BID (M_AXI_GP0_BID_FULL ), + .MAXIGP0BRESP (M_AXI_GP0_BRESP ), + .MAXIGP0BVALID (M_AXI_GP0_BVALID ), + .MAXIGP0RDATA (M_AXI_GP0_RDATA ), + .MAXIGP0RID (M_AXI_GP0_RID_FULL ), + .MAXIGP0RLAST (M_AXI_GP0_RLAST ), + .MAXIGP0RRESP (M_AXI_GP0_RRESP ), + .MAXIGP0RVALID (M_AXI_GP0_RVALID ), + .MAXIGP0WREADY (M_AXI_GP0_WREADY ), + .MAXIGP1ACLK (M_AXI_GP1_ACLK_temp ), + .MAXIGP1ARREADY (M_AXI_GP1_ARREADY), + .MAXIGP1AWREADY (M_AXI_GP1_AWREADY), + .MAXIGP1BID (M_AXI_GP1_BID_FULL ), + .MAXIGP1BRESP (M_AXI_GP1_BRESP ), + .MAXIGP1BVALID (M_AXI_GP1_BVALID ), + .MAXIGP1RDATA (M_AXI_GP1_RDATA ), + .MAXIGP1RID (M_AXI_GP1_RID_FULL ), + .MAXIGP1RLAST (M_AXI_GP1_RLAST ), + .MAXIGP1RRESP (M_AXI_GP1_RRESP ), + .MAXIGP1RVALID (M_AXI_GP1_RVALID ), + .MAXIGP1WREADY (M_AXI_GP1_WREADY ), + .SAXIACPACLK (S_AXI_ACP_ACLK_temp ), + .SAXIACPARADDR (SAXIACPARADDR_W ), + .SAXIACPARBURST (SAXIACPARBURST_W), + .SAXIACPARCACHE (SAXIACPARCACHE_W), + .SAXIACPARID (S_AXI_ACP_ARID_in ), + .SAXIACPARLEN (SAXIACPARLEN_W ), + .SAXIACPARLOCK (SAXIACPARLOCK_W ), + .SAXIACPARPROT (SAXIACPARPROT_W ), + .SAXIACPARQOS (S_AXI_ACP_ARQOS ), + .SAXIACPARSIZE (SAXIACPARSIZE_W[1:0] ), + .SAXIACPARUSER (SAXIACPARUSER_W ), + .SAXIACPARVALID (SAXIACPARVALID_W), + .SAXIACPAWADDR (SAXIACPAWADDR_W ), + .SAXIACPAWBURST (SAXIACPAWBURST_W), + .SAXIACPAWCACHE (SAXIACPAWCACHE_W), + .SAXIACPAWID (S_AXI_ACP_AWID_in ), + .SAXIACPAWLEN (SAXIACPAWLEN_W ), + .SAXIACPAWLOCK (SAXIACPAWLOCK_W ), + .SAXIACPAWPROT (SAXIACPAWPROT_W ), + .SAXIACPAWQOS (S_AXI_ACP_AWQOS ), + .SAXIACPAWSIZE (SAXIACPAWSIZE_W[1:0] ), + .SAXIACPAWUSER (SAXIACPAWUSER_W ), + .SAXIACPAWVALID (SAXIACPAWVALID_W), + .SAXIACPBREADY (SAXIACPBREADY_W ), + .SAXIACPRREADY (SAXIACPRREADY_W ), + .SAXIACPWDATA (SAXIACPWDATA_W ), + .SAXIACPWID (S_AXI_ACP_WID_in ), + .SAXIACPWLAST (SAXIACPWLAST_W ), + .SAXIACPWSTRB (SAXIACPWSTRB_W ), + .SAXIACPWVALID (SAXIACPWVALID_W ), + .SAXIGP0ACLK (S_AXI_GP0_ACLK_temp ), + .SAXIGP0ARADDR (S_AXI_GP0_ARADDR ), + .SAXIGP0ARBURST (S_AXI_GP0_ARBURST), + .SAXIGP0ARCACHE (S_AXI_GP0_ARCACHE), + .SAXIGP0ARID (S_AXI_GP0_ARID_in ), + .SAXIGP0ARLEN (S_AXI_GP0_ARLEN ), + .SAXIGP0ARLOCK (S_AXI_GP0_ARLOCK ), + .SAXIGP0ARPROT (S_AXI_GP0_ARPROT ), + .SAXIGP0ARQOS (S_AXI_GP0_ARQOS ), + .SAXIGP0ARSIZE (S_AXI_GP0_ARSIZE[1:0] ), + .SAXIGP0ARVALID (S_AXI_GP0_ARVALID), + .SAXIGP0AWADDR (S_AXI_GP0_AWADDR ), + .SAXIGP0AWBURST (S_AXI_GP0_AWBURST), + .SAXIGP0AWCACHE (S_AXI_GP0_AWCACHE), + .SAXIGP0AWID (S_AXI_GP0_AWID_in ), + .SAXIGP0AWLEN (S_AXI_GP0_AWLEN ), + .SAXIGP0AWLOCK (S_AXI_GP0_AWLOCK ), + .SAXIGP0AWPROT (S_AXI_GP0_AWPROT ), + .SAXIGP0AWQOS (S_AXI_GP0_AWQOS ), + .SAXIGP0AWSIZE (S_AXI_GP0_AWSIZE[1:0] ), + .SAXIGP0AWVALID (S_AXI_GP0_AWVALID), + .SAXIGP0BREADY (S_AXI_GP0_BREADY ), + .SAXIGP0RREADY (S_AXI_GP0_RREADY ), + .SAXIGP0WDATA (S_AXI_GP0_WDATA ), + .SAXIGP0WID (S_AXI_GP0_WID_in ), + .SAXIGP0WLAST (S_AXI_GP0_WLAST ), + .SAXIGP0WSTRB (S_AXI_GP0_WSTRB ), + .SAXIGP0WVALID (S_AXI_GP0_WVALID ), + .SAXIGP1ACLK (S_AXI_GP1_ACLK_temp ), + .SAXIGP1ARADDR (S_AXI_GP1_ARADDR ), + .SAXIGP1ARBURST (S_AXI_GP1_ARBURST), + .SAXIGP1ARCACHE (S_AXI_GP1_ARCACHE), + .SAXIGP1ARID (S_AXI_GP1_ARID_in ), + .SAXIGP1ARLEN (S_AXI_GP1_ARLEN ), + .SAXIGP1ARLOCK (S_AXI_GP1_ARLOCK ), + .SAXIGP1ARPROT (S_AXI_GP1_ARPROT ), + .SAXIGP1ARQOS (S_AXI_GP1_ARQOS ), + .SAXIGP1ARSIZE (S_AXI_GP1_ARSIZE[1:0] ), + .SAXIGP1ARVALID (S_AXI_GP1_ARVALID), + .SAXIGP1AWADDR (S_AXI_GP1_AWADDR ), + .SAXIGP1AWBURST (S_AXI_GP1_AWBURST), + .SAXIGP1AWCACHE (S_AXI_GP1_AWCACHE), + .SAXIGP1AWID (S_AXI_GP1_AWID_in ), + .SAXIGP1AWLEN (S_AXI_GP1_AWLEN ), + .SAXIGP1AWLOCK (S_AXI_GP1_AWLOCK ), + .SAXIGP1AWPROT (S_AXI_GP1_AWPROT ), + .SAXIGP1AWQOS (S_AXI_GP1_AWQOS ), + .SAXIGP1AWSIZE (S_AXI_GP1_AWSIZE[1:0] ), + .SAXIGP1AWVALID (S_AXI_GP1_AWVALID), + .SAXIGP1BREADY (S_AXI_GP1_BREADY ), + .SAXIGP1RREADY (S_AXI_GP1_RREADY ), + .SAXIGP1WDATA (S_AXI_GP1_WDATA ), + .SAXIGP1WID (S_AXI_GP1_WID_in ), + .SAXIGP1WLAST (S_AXI_GP1_WLAST ), + .SAXIGP1WSTRB (S_AXI_GP1_WSTRB ), + .SAXIGP1WVALID (S_AXI_GP1_WVALID ), + .SAXIHP0ACLK (S_AXI_HP0_ACLK_temp ), + .SAXIHP0ARADDR (S_AXI_HP0_ARADDR), + .SAXIHP0ARBURST (S_AXI_HP0_ARBURST), + .SAXIHP0ARCACHE (S_AXI_HP0_ARCACHE), + .SAXIHP0ARID (S_AXI_HP0_ARID_in), + .SAXIHP0ARLEN (S_AXI_HP0_ARLEN), + .SAXIHP0ARLOCK (S_AXI_HP0_ARLOCK), + .SAXIHP0ARPROT (S_AXI_HP0_ARPROT), + .SAXIHP0ARQOS (S_AXI_HP0_ARQOS), + .SAXIHP0ARSIZE (S_AXI_HP0_ARSIZE[1:0]), + .SAXIHP0ARVALID (S_AXI_HP0_ARVALID), + .SAXIHP0AWADDR (S_AXI_HP0_AWADDR), + .SAXIHP0AWBURST (S_AXI_HP0_AWBURST), + .SAXIHP0AWCACHE (S_AXI_HP0_AWCACHE), + .SAXIHP0AWID (S_AXI_HP0_AWID_in), + .SAXIHP0AWLEN (S_AXI_HP0_AWLEN), + .SAXIHP0AWLOCK (S_AXI_HP0_AWLOCK), + .SAXIHP0AWPROT (S_AXI_HP0_AWPROT), + .SAXIHP0AWQOS (S_AXI_HP0_AWQOS), + .SAXIHP0AWSIZE (S_AXI_HP0_AWSIZE[1:0]), + .SAXIHP0AWVALID (S_AXI_HP0_AWVALID), + .SAXIHP0BREADY (S_AXI_HP0_BREADY), + .SAXIHP0RDISSUECAP1EN (S_AXI_HP0_RDISSUECAP1_EN), + .SAXIHP0RREADY (S_AXI_HP0_RREADY), + .SAXIHP0WDATA (S_AXI_HP0_WDATA_in), + .SAXIHP0WID (S_AXI_HP0_WID_in), + .SAXIHP0WLAST (S_AXI_HP0_WLAST), + .SAXIHP0WRISSUECAP1EN (S_AXI_HP0_WRISSUECAP1_EN), + .SAXIHP0WSTRB (S_AXI_HP0_WSTRB_in), + .SAXIHP0WVALID (S_AXI_HP0_WVALID), + .SAXIHP1ACLK (S_AXI_HP1_ACLK_temp), + .SAXIHP1ARADDR (S_AXI_HP1_ARADDR), + .SAXIHP1ARBURST (S_AXI_HP1_ARBURST), + .SAXIHP1ARCACHE (S_AXI_HP1_ARCACHE), + .SAXIHP1ARID (S_AXI_HP1_ARID_in), + .SAXIHP1ARLEN (S_AXI_HP1_ARLEN), + .SAXIHP1ARLOCK (S_AXI_HP1_ARLOCK), + .SAXIHP1ARPROT (S_AXI_HP1_ARPROT), + .SAXIHP1ARQOS (S_AXI_HP1_ARQOS), + .SAXIHP1ARSIZE (S_AXI_HP1_ARSIZE[1:0]), + .SAXIHP1ARVALID (S_AXI_HP1_ARVALID), + .SAXIHP1AWADDR (S_AXI_HP1_AWADDR), + .SAXIHP1AWBURST (S_AXI_HP1_AWBURST), + .SAXIHP1AWCACHE (S_AXI_HP1_AWCACHE), + .SAXIHP1AWID (S_AXI_HP1_AWID_in), + .SAXIHP1AWLEN (S_AXI_HP1_AWLEN), + .SAXIHP1AWLOCK (S_AXI_HP1_AWLOCK), + .SAXIHP1AWPROT (S_AXI_HP1_AWPROT), + .SAXIHP1AWQOS (S_AXI_HP1_AWQOS), + .SAXIHP1AWSIZE (S_AXI_HP1_AWSIZE[1:0]), + .SAXIHP1AWVALID (S_AXI_HP1_AWVALID), + .SAXIHP1BREADY (S_AXI_HP1_BREADY), + .SAXIHP1RDISSUECAP1EN (S_AXI_HP1_RDISSUECAP1_EN), + .SAXIHP1RREADY (S_AXI_HP1_RREADY), + .SAXIHP1WDATA (S_AXI_HP1_WDATA_in), + .SAXIHP1WID (S_AXI_HP1_WID_in), + .SAXIHP1WLAST (S_AXI_HP1_WLAST), + .SAXIHP1WRISSUECAP1EN (S_AXI_HP1_WRISSUECAP1_EN), + .SAXIHP1WSTRB (S_AXI_HP1_WSTRB_in), + .SAXIHP1WVALID (S_AXI_HP1_WVALID), + .SAXIHP2ACLK (S_AXI_HP2_ACLK_temp), + .SAXIHP2ARADDR (S_AXI_HP2_ARADDR), + .SAXIHP2ARBURST (S_AXI_HP2_ARBURST), + .SAXIHP2ARCACHE (S_AXI_HP2_ARCACHE), + .SAXIHP2ARID (S_AXI_HP2_ARID_in), + .SAXIHP2ARLEN (S_AXI_HP2_ARLEN), + .SAXIHP2ARLOCK (S_AXI_HP2_ARLOCK), + .SAXIHP2ARPROT (S_AXI_HP2_ARPROT), + .SAXIHP2ARQOS (S_AXI_HP2_ARQOS), + .SAXIHP2ARSIZE (S_AXI_HP2_ARSIZE[1:0]), + .SAXIHP2ARVALID (S_AXI_HP2_ARVALID), + .SAXIHP2AWADDR (S_AXI_HP2_AWADDR), + .SAXIHP2AWBURST (S_AXI_HP2_AWBURST), + .SAXIHP2AWCACHE (S_AXI_HP2_AWCACHE), + .SAXIHP2AWID (S_AXI_HP2_AWID_in), + .SAXIHP2AWLEN (S_AXI_HP2_AWLEN), + .SAXIHP2AWLOCK (S_AXI_HP2_AWLOCK), + .SAXIHP2AWPROT (S_AXI_HP2_AWPROT), + .SAXIHP2AWQOS (S_AXI_HP2_AWQOS), + .SAXIHP2AWSIZE (S_AXI_HP2_AWSIZE[1:0]), + .SAXIHP2AWVALID (S_AXI_HP2_AWVALID), + .SAXIHP2BREADY (S_AXI_HP2_BREADY), + .SAXIHP2RDISSUECAP1EN (S_AXI_HP2_RDISSUECAP1_EN), + .SAXIHP2RREADY (S_AXI_HP2_RREADY), + .SAXIHP2WDATA (S_AXI_HP2_WDATA_in), + .SAXIHP2WID (S_AXI_HP2_WID_in), + .SAXIHP2WLAST (S_AXI_HP2_WLAST), + .SAXIHP2WRISSUECAP1EN (S_AXI_HP2_WRISSUECAP1_EN), + .SAXIHP2WSTRB (S_AXI_HP2_WSTRB_in), + .SAXIHP2WVALID (S_AXI_HP2_WVALID), + .SAXIHP3ACLK (S_AXI_HP3_ACLK_temp), + .SAXIHP3ARADDR (S_AXI_HP3_ARADDR ), + .SAXIHP3ARBURST (S_AXI_HP3_ARBURST), + .SAXIHP3ARCACHE (S_AXI_HP3_ARCACHE), + .SAXIHP3ARID (S_AXI_HP3_ARID_in ), + .SAXIHP3ARLEN (S_AXI_HP3_ARLEN), + .SAXIHP3ARLOCK (S_AXI_HP3_ARLOCK), + .SAXIHP3ARPROT (S_AXI_HP3_ARPROT), + .SAXIHP3ARQOS (S_AXI_HP3_ARQOS), + .SAXIHP3ARSIZE (S_AXI_HP3_ARSIZE[1:0]), + .SAXIHP3ARVALID (S_AXI_HP3_ARVALID), + .SAXIHP3AWADDR (S_AXI_HP3_AWADDR), + .SAXIHP3AWBURST (S_AXI_HP3_AWBURST), + .SAXIHP3AWCACHE (S_AXI_HP3_AWCACHE), + .SAXIHP3AWID (S_AXI_HP3_AWID_in), + .SAXIHP3AWLEN (S_AXI_HP3_AWLEN), + .SAXIHP3AWLOCK (S_AXI_HP3_AWLOCK), + .SAXIHP3AWPROT (S_AXI_HP3_AWPROT), + .SAXIHP3AWQOS (S_AXI_HP3_AWQOS), + .SAXIHP3AWSIZE (S_AXI_HP3_AWSIZE[1:0]), + .SAXIHP3AWVALID (S_AXI_HP3_AWVALID), + .SAXIHP3BREADY (S_AXI_HP3_BREADY), + .SAXIHP3RDISSUECAP1EN (S_AXI_HP3_RDISSUECAP1_EN), + .SAXIHP3RREADY (S_AXI_HP3_RREADY), + .SAXIHP3WDATA (S_AXI_HP3_WDATA_in), + .SAXIHP3WID (S_AXI_HP3_WID_in), + .SAXIHP3WLAST (S_AXI_HP3_WLAST), + .SAXIHP3WRISSUECAP1EN (S_AXI_HP3_WRISSUECAP1_EN), + .SAXIHP3WSTRB (S_AXI_HP3_WSTRB_in), + .SAXIHP3WVALID (S_AXI_HP3_WVALID), + .DDRA (buffered_DDR_Addr), + .DDRBA (buffered_DDR_BankAddr), + .DDRCASB (buffered_DDR_CAS_n), + .DDRCKE (buffered_DDR_CKE), + .DDRCKN (buffered_DDR_Clk_n), + .DDRCKP (buffered_DDR_Clk), + .DDRCSB (buffered_DDR_CS_n), + .DDRDM (buffered_DDR_DM), + .DDRDQ (buffered_DDR_DQ), + .DDRDQSN (buffered_DDR_DQS_n), + .DDRDQSP (buffered_DDR_DQS), + .DDRDRSTB (buffered_DDR_DRSTB), + .DDRODT (buffered_DDR_ODT), + .DDRRASB (buffered_DDR_RAS_n), + .DDRVRN (buffered_DDR_VRN), + .DDRVRP (buffered_DDR_VRP), + .DDRWEB (buffered_DDR_WEB), + .MIO ({buffered_MIO[31:30],dummy[21:20],buffered_MIO[29:28],dummy[19:12],buffered_MIO[27:16],dummy[11:0],buffered_MIO[15:0]}), + .PSCLK (buffered_PS_CLK), + .PSPORB (buffered_PS_PORB), + .PSSRSTB (buffered_PS_SRSTB) + + +); + end + else begin + PS7 PS7_i ( + .DMA0DATYPE (DMA0_DATYPE ), + .DMA0DAVALID (DMA0_DAVALID), + .DMA0DRREADY (DMA0_DRREADY), + .DMA0RSTN (DMA0_RSTN ), + .DMA1DATYPE (DMA1_DATYPE ), + .DMA1DAVALID (DMA1_DAVALID), + .DMA1DRREADY (DMA1_DRREADY), + .DMA1RSTN (DMA1_RSTN ), + .DMA2DATYPE (DMA2_DATYPE ), + .DMA2DAVALID (DMA2_DAVALID), + .DMA2DRREADY (DMA2_DRREADY), + .DMA2RSTN (DMA2_RSTN ), + .DMA3DATYPE (DMA3_DATYPE ), + .DMA3DAVALID (DMA3_DAVALID), + .DMA3DRREADY (DMA3_DRREADY), + .DMA3RSTN (DMA3_RSTN ), + .EMIOCAN0PHYTX (CAN0_PHY_TX ), + .EMIOCAN1PHYTX (CAN1_PHY_TX ), + .EMIOENET0GMIITXD (ENET0_GMII_TXD_i), // (ENET0_GMII_TXD_i ), + .EMIOENET0GMIITXEN (ENET0_GMII_TX_EN_i), // (ENET0_GMII_TX_EN_i), + .EMIOENET0GMIITXER (ENET0_GMII_TX_ER_i), // (ENET0_GMII_TX_ER_i), + .EMIOENET0MDIOMDC (ENET0_MDIO_MDC), + .EMIOENET0MDIOO (ENET0_MDIO_O ), + .EMIOENET0MDIOTN (ENET0_MDIO_T_n ), + .EMIOENET0PTPDELAYREQRX (ENET0_PTP_DELAY_REQ_RX), + .EMIOENET0PTPDELAYREQTX (ENET0_PTP_DELAY_REQ_TX), + .EMIOENET0PTPPDELAYREQRX (ENET0_PTP_PDELAY_REQ_RX), + .EMIOENET0PTPPDELAYREQTX (ENET0_PTP_PDELAY_REQ_TX), + .EMIOENET0PTPPDELAYRESPRX(ENET0_PTP_PDELAY_RESP_RX), + .EMIOENET0PTPPDELAYRESPTX(ENET0_PTP_PDELAY_RESP_TX), + .EMIOENET0PTPSYNCFRAMERX (ENET0_PTP_SYNC_FRAME_RX), + .EMIOENET0PTPSYNCFRAMETX (ENET0_PTP_SYNC_FRAME_TX), + .EMIOENET0SOFRX (ENET0_SOF_RX), + .EMIOENET0SOFTX (ENET0_SOF_TX), + .EMIOENET1GMIITXD (ENET1_GMII_TXD_i), // (ENET1_GMII_TXD_i), + .EMIOENET1GMIITXEN (ENET1_GMII_TX_EN_i), // (ENET1_GMII_TX_EN_i), + .EMIOENET1GMIITXER (ENET1_GMII_TX_ER_i), // (ENET1_GMII_TX_ER_i), + .EMIOENET1MDIOMDC (ENET1_MDIO_MDC), + .EMIOENET1MDIOO (ENET1_MDIO_O ), + .EMIOENET1MDIOTN (ENET1_MDIO_T_n), + .EMIOENET1PTPDELAYREQRX (ENET1_PTP_DELAY_REQ_RX), + .EMIOENET1PTPDELAYREQTX (ENET1_PTP_DELAY_REQ_TX), + .EMIOENET1PTPPDELAYREQRX (ENET1_PTP_PDELAY_REQ_RX), + .EMIOENET1PTPPDELAYREQTX (ENET1_PTP_PDELAY_REQ_TX), + .EMIOENET1PTPPDELAYRESPRX(ENET1_PTP_PDELAY_RESP_RX), + .EMIOENET1PTPPDELAYRESPTX(ENET1_PTP_PDELAY_RESP_TX), + .EMIOENET1PTPSYNCFRAMERX (ENET1_PTP_SYNC_FRAME_RX), + .EMIOENET1PTPSYNCFRAMETX (ENET1_PTP_SYNC_FRAME_TX), + .EMIOENET1SOFRX (ENET1_SOF_RX), + .EMIOENET1SOFTX (ENET1_SOF_TX), + .EMIOGPIOO (gpio_out), + .EMIOGPIOTN (gpio_out_t_n), + .EMIOI2C0SCLO (I2C0_SCL_O), + .EMIOI2C0SCLTN (I2C0_SCL_T_n), + .EMIOI2C0SDAO (I2C0_SDA_O), + .EMIOI2C0SDATN (I2C0_SDA_T_n), + .EMIOI2C1SCLO (I2C1_SCL_O), + .EMIOI2C1SCLTN (I2C1_SCL_T_n), + .EMIOI2C1SDAO (I2C1_SDA_O), + .EMIOI2C1SDATN (I2C1_SDA_T_n), + .EMIOPJTAGTDO (PJTAG_TDO_O), + .EMIOPJTAGTDTN (PJTAG_TDO_T_n), + .EMIOSDIO0BUSPOW (SDIO0_BUSPOW), + .EMIOSDIO0CLK (SDIO0_CLK ), + .EMIOSDIO0CMDO (SDIO0_CMD_O ), + .EMIOSDIO0CMDTN (SDIO0_CMD_T_n ), + .EMIOSDIO0DATAO (SDIO0_DATA_O), + .EMIOSDIO0DATATN (SDIO0_DATA_T_n), + .EMIOSDIO0LED (SDIO0_LED), + .EMIOSDIO1BUSPOW (SDIO1_BUSPOW), + .EMIOSDIO1CLK (SDIO1_CLK ), + .EMIOSDIO1CMDO (SDIO1_CMD_O ), + .EMIOSDIO1CMDTN (SDIO1_CMD_T_n ), + .EMIOSDIO1DATAO (SDIO1_DATA_O), + .EMIOSDIO1DATATN (SDIO1_DATA_T_n), + .EMIOSDIO1LED (SDIO1_LED), + .EMIOSPI0MO (SPI0_MOSI_O), + .EMIOSPI0MOTN (SPI0_MOSI_T_n), + .EMIOSPI0SCLKO (SPI0_SCLK_O), + .EMIOSPI0SCLKTN (SPI0_SCLK_T_n), + .EMIOSPI0SO (SPI0_MISO_O), + .EMIOSPI0STN (SPI0_MISO_T_n), + .EMIOSPI0SSON ({SPI0_SS2_O,SPI0_SS1_O,SPI0_SS_O}), + .EMIOSPI0SSNTN (SPI0_SS_T_n), + .EMIOSPI1MO (SPI1_MOSI_O), + .EMIOSPI1MOTN (SPI1_MOSI_T_n), + .EMIOSPI1SCLKO (SPI1_SCLK_O), + .EMIOSPI1SCLKTN (SPI1_SCLK_T_n), + .EMIOSPI1SO (SPI1_MISO_O), + .EMIOSPI1STN (SPI1_MISO_T_n), + .EMIOSPI1SSON ({SPI1_SS2_O,SPI1_SS1_O,SPI1_SS_O}), + .EMIOSPI1SSNTN (SPI1_SS_T_n), + .EMIOTRACECTL (TRACE_CTL_i), + .EMIOTRACEDATA (TRACE_DATA_i), + .EMIOTTC0WAVEO ({TTC0_WAVE2_OUT,TTC0_WAVE1_OUT,TTC0_WAVE0_OUT}), + .EMIOTTC1WAVEO ({TTC1_WAVE2_OUT,TTC1_WAVE1_OUT,TTC1_WAVE0_OUT}), + .EMIOUART0DTRN (UART0_DTRN), + .EMIOUART0RTSN (UART0_RTSN), + .EMIOUART0TX (UART0_TX ), + .EMIOUART1DTRN (UART1_DTRN), + .EMIOUART1RTSN (UART1_RTSN), + .EMIOUART1TX (UART1_TX ), + .EMIOUSB0PORTINDCTL (USB0_PORT_INDCTL), + .EMIOUSB0VBUSPWRSELECT (USB0_VBUS_PWRSELECT), + .EMIOUSB1PORTINDCTL (USB1_PORT_INDCTL), + .EMIOUSB1VBUSPWRSELECT (USB1_VBUS_PWRSELECT), + .EMIOWDTRSTO (WDT_RST_OUT), + .EVENTEVENTO (EVENT_EVENTO), + .EVENTSTANDBYWFE (EVENT_STANDBYWFE), + .EVENTSTANDBYWFI (EVENT_STANDBYWFI), + .FCLKCLK (FCLK_CLK_unbuffered), + .FCLKRESETN ({FCLK_RESET3_N,FCLK_RESET2_N,FCLK_RESET1_N,FCLK_RESET0_N}), + .EMIOSDIO0BUSVOLT (SDIO0_BUSVOLT), + .EMIOSDIO1BUSVOLT (SDIO1_BUSVOLT), + .FTMTF2PTRIGACK ({FTMT_F2P_TRIGACK_3,FTMT_F2P_TRIGACK_2,FTMT_F2P_TRIGACK_1,FTMT_F2P_TRIGACK_0}), + .FTMTP2FDEBUG (FTMT_P2F_DEBUG ), + .FTMTP2FTRIG ({FTMT_P2F_TRIG_3,FTMT_P2F_TRIG_2,FTMT_P2F_TRIG_1,FTMT_P2F_TRIG_0}), + .IRQP2F ({IRQ_P2F_DMAC_ABORT, IRQ_P2F_DMAC7, IRQ_P2F_DMAC6, IRQ_P2F_DMAC5, IRQ_P2F_DMAC4, IRQ_P2F_DMAC3, IRQ_P2F_DMAC2, IRQ_P2F_DMAC1, IRQ_P2F_DMAC0, IRQ_P2F_SMC, IRQ_P2F_QSPI, IRQ_P2F_CTI, IRQ_P2F_GPIO, IRQ_P2F_USB0, IRQ_P2F_ENET0, IRQ_P2F_ENET_WAKE0, IRQ_P2F_SDIO0, IRQ_P2F_I2C0, IRQ_P2F_SPI0, IRQ_P2F_UART0, IRQ_P2F_CAN0, IRQ_P2F_USB1, IRQ_P2F_ENET1, IRQ_P2F_ENET_WAKE1, IRQ_P2F_SDIO1, IRQ_P2F_I2C1, IRQ_P2F_SPI1, IRQ_P2F_UART1, IRQ_P2F_CAN1}), + .MAXIGP0ARADDR (M_AXI_GP0_ARADDR), + .MAXIGP0ARBURST (M_AXI_GP0_ARBURST), + .MAXIGP0ARCACHE (M_AXI_GP0_ARCACHE_t), + .MAXIGP0ARESETN (M_AXI_GP0_ARESETN), + .MAXIGP0ARID (M_AXI_GP0_ARID_FULL ), + .MAXIGP0ARLEN (M_AXI_GP0_ARLEN ), + .MAXIGP0ARLOCK (M_AXI_GP0_ARLOCK ), + .MAXIGP0ARPROT (M_AXI_GP0_ARPROT ), + .MAXIGP0ARQOS (M_AXI_GP0_ARQOS ), + .MAXIGP0ARSIZE (M_AXI_GP0_ARSIZE_i ), + .MAXIGP0ARVALID (M_AXI_GP0_ARVALID), + .MAXIGP0AWADDR (M_AXI_GP0_AWADDR ), + .MAXIGP0AWBURST (M_AXI_GP0_AWBURST), + .MAXIGP0AWCACHE (M_AXI_GP0_AWCACHE_t), + .MAXIGP0AWID (M_AXI_GP0_AWID_FULL ), + .MAXIGP0AWLEN (M_AXI_GP0_AWLEN ), + .MAXIGP0AWLOCK (M_AXI_GP0_AWLOCK ), + .MAXIGP0AWPROT (M_AXI_GP0_AWPROT ), + .MAXIGP0AWQOS (M_AXI_GP0_AWQOS ), + .MAXIGP0AWSIZE (M_AXI_GP0_AWSIZE_i ), + .MAXIGP0AWVALID (M_AXI_GP0_AWVALID), + .MAXIGP0BREADY (M_AXI_GP0_BREADY ), + .MAXIGP0RREADY (M_AXI_GP0_RREADY ), + .MAXIGP0WDATA (M_AXI_GP0_WDATA ), + .MAXIGP0WID (M_AXI_GP0_WID_FULL ), + .MAXIGP0WLAST (M_AXI_GP0_WLAST ), + .MAXIGP0WSTRB (M_AXI_GP0_WSTRB ), + .MAXIGP0WVALID (M_AXI_GP0_WVALID ), + .MAXIGP1ARADDR (M_AXI_GP1_ARADDR ), + .MAXIGP1ARBURST (M_AXI_GP1_ARBURST), + .MAXIGP1ARCACHE (M_AXI_GP1_ARCACHE_t), + .MAXIGP1ARESETN (M_AXI_GP1_ARESETN), + .MAXIGP1ARID (M_AXI_GP1_ARID_FULL ), + .MAXIGP1ARLEN (M_AXI_GP1_ARLEN ), + .MAXIGP1ARLOCK (M_AXI_GP1_ARLOCK ), + .MAXIGP1ARPROT (M_AXI_GP1_ARPROT ), + .MAXIGP1ARQOS (M_AXI_GP1_ARQOS ), + .MAXIGP1ARSIZE (M_AXI_GP1_ARSIZE_i ), + .MAXIGP1ARVALID (M_AXI_GP1_ARVALID), + .MAXIGP1AWADDR (M_AXI_GP1_AWADDR ), + .MAXIGP1AWBURST (M_AXI_GP1_AWBURST), + .MAXIGP1AWCACHE (M_AXI_GP1_AWCACHE_t), + .MAXIGP1AWID (M_AXI_GP1_AWID_FULL ), + .MAXIGP1AWLEN (M_AXI_GP1_AWLEN ), + .MAXIGP1AWLOCK (M_AXI_GP1_AWLOCK ), + .MAXIGP1AWPROT (M_AXI_GP1_AWPROT ), + .MAXIGP1AWQOS (M_AXI_GP1_AWQOS ), + .MAXIGP1AWSIZE (M_AXI_GP1_AWSIZE_i ), + .MAXIGP1AWVALID (M_AXI_GP1_AWVALID), + .MAXIGP1BREADY (M_AXI_GP1_BREADY ), + .MAXIGP1RREADY (M_AXI_GP1_RREADY ), + .MAXIGP1WDATA (M_AXI_GP1_WDATA ), + .MAXIGP1WID (M_AXI_GP1_WID_FULL ), + .MAXIGP1WLAST (M_AXI_GP1_WLAST ), + .MAXIGP1WSTRB (M_AXI_GP1_WSTRB ), + .MAXIGP1WVALID (M_AXI_GP1_WVALID ), + .SAXIACPARESETN (S_AXI_ACP_ARESETN), + .SAXIACPARREADY (SAXIACPARREADY_W), + .SAXIACPAWREADY (SAXIACPAWREADY_W), + .SAXIACPBID (S_AXI_ACP_BID_out ), + .SAXIACPBRESP (SAXIACPBRESP_W ), + .SAXIACPBVALID (SAXIACPBVALID_W ), + .SAXIACPRDATA (SAXIACPRDATA_W ), + .SAXIACPRID (S_AXI_ACP_RID_out), + .SAXIACPRLAST (SAXIACPRLAST_W ), + .SAXIACPRRESP (SAXIACPRRESP_W ), + .SAXIACPRVALID (SAXIACPRVALID_W ), + .SAXIACPWREADY (SAXIACPWREADY_W ), + .SAXIGP0ARESETN (S_AXI_GP0_ARESETN), + .SAXIGP0ARREADY (S_AXI_GP0_ARREADY), + .SAXIGP0AWREADY (S_AXI_GP0_AWREADY), + .SAXIGP0BID (S_AXI_GP0_BID_out), + .SAXIGP0BRESP (S_AXI_GP0_BRESP ), + .SAXIGP0BVALID (S_AXI_GP0_BVALID ), + .SAXIGP0RDATA (S_AXI_GP0_RDATA ), + .SAXIGP0RID (S_AXI_GP0_RID_out ), + .SAXIGP0RLAST (S_AXI_GP0_RLAST ), + .SAXIGP0RRESP (S_AXI_GP0_RRESP ), + .SAXIGP0RVALID (S_AXI_GP0_RVALID ), + .SAXIGP0WREADY (S_AXI_GP0_WREADY ), + .SAXIGP1ARESETN (S_AXI_GP1_ARESETN), + .SAXIGP1ARREADY (S_AXI_GP1_ARREADY), + .SAXIGP1AWREADY (S_AXI_GP1_AWREADY), + .SAXIGP1BID (S_AXI_GP1_BID_out ), + .SAXIGP1BRESP (S_AXI_GP1_BRESP ), + .SAXIGP1BVALID (S_AXI_GP1_BVALID ), + .SAXIGP1RDATA (S_AXI_GP1_RDATA ), + .SAXIGP1RID (S_AXI_GP1_RID_out ), + .SAXIGP1RLAST (S_AXI_GP1_RLAST ), + .SAXIGP1RRESP (S_AXI_GP1_RRESP ), + .SAXIGP1RVALID (S_AXI_GP1_RVALID ), + .SAXIGP1WREADY (S_AXI_GP1_WREADY ), + .SAXIHP0ARESETN (S_AXI_HP0_ARESETN), + .SAXIHP0ARREADY (S_AXI_HP0_ARREADY), + .SAXIHP0AWREADY (S_AXI_HP0_AWREADY), + .SAXIHP0BID (S_AXI_HP0_BID_out ), + .SAXIHP0BRESP (S_AXI_HP0_BRESP ), + .SAXIHP0BVALID (S_AXI_HP0_BVALID ), + .SAXIHP0RACOUNT (S_AXI_HP0_RACOUNT), + .SAXIHP0RCOUNT (S_AXI_HP0_RCOUNT), + .SAXIHP0RDATA (S_AXI_HP0_RDATA_out), + .SAXIHP0RID (S_AXI_HP0_RID_out ), + .SAXIHP0RLAST (S_AXI_HP0_RLAST), + .SAXIHP0RRESP (S_AXI_HP0_RRESP), + .SAXIHP0RVALID (S_AXI_HP0_RVALID), + .SAXIHP0WCOUNT (S_AXI_HP0_WCOUNT), + .SAXIHP0WACOUNT (S_AXI_HP0_WACOUNT), + .SAXIHP0WREADY (S_AXI_HP0_WREADY), + .SAXIHP1ARESETN (S_AXI_HP1_ARESETN), + .SAXIHP1ARREADY (S_AXI_HP1_ARREADY), + .SAXIHP1AWREADY (S_AXI_HP1_AWREADY), + .SAXIHP1BID (S_AXI_HP1_BID_out ), + .SAXIHP1BRESP (S_AXI_HP1_BRESP ), + .SAXIHP1BVALID (S_AXI_HP1_BVALID ), + .SAXIHP1RACOUNT (S_AXI_HP1_RACOUNT ), + .SAXIHP1RCOUNT (S_AXI_HP1_RCOUNT ), + .SAXIHP1RDATA (S_AXI_HP1_RDATA_out), + .SAXIHP1RID (S_AXI_HP1_RID_out ), + .SAXIHP1RLAST (S_AXI_HP1_RLAST ), + .SAXIHP1RRESP (S_AXI_HP1_RRESP ), + .SAXIHP1RVALID (S_AXI_HP1_RVALID), + .SAXIHP1WACOUNT (S_AXI_HP1_WACOUNT), + .SAXIHP1WCOUNT (S_AXI_HP1_WCOUNT), + .SAXIHP1WREADY (S_AXI_HP1_WREADY), + .SAXIHP2ARESETN (S_AXI_HP2_ARESETN), + .SAXIHP2ARREADY (S_AXI_HP2_ARREADY), + .SAXIHP2AWREADY (S_AXI_HP2_AWREADY), + .SAXIHP2BID (S_AXI_HP2_BID_out ), + .SAXIHP2BRESP (S_AXI_HP2_BRESP), + .SAXIHP2BVALID (S_AXI_HP2_BVALID), + .SAXIHP2RACOUNT (S_AXI_HP2_RACOUNT), + .SAXIHP2RCOUNT (S_AXI_HP2_RCOUNT), + .SAXIHP2RDATA (S_AXI_HP2_RDATA_out), + .SAXIHP2RID (S_AXI_HP2_RID_out ), + .SAXIHP2RLAST (S_AXI_HP2_RLAST), + .SAXIHP2RRESP (S_AXI_HP2_RRESP), + .SAXIHP2RVALID (S_AXI_HP2_RVALID), + .SAXIHP2WACOUNT (S_AXI_HP2_WACOUNT), + .SAXIHP2WCOUNT (S_AXI_HP2_WCOUNT), + .SAXIHP2WREADY (S_AXI_HP2_WREADY), + .SAXIHP3ARESETN (S_AXI_HP3_ARESETN), + .SAXIHP3ARREADY (S_AXI_HP3_ARREADY), + .SAXIHP3AWREADY (S_AXI_HP3_AWREADY), + .SAXIHP3BID (S_AXI_HP3_BID_out), + .SAXIHP3BRESP (S_AXI_HP3_BRESP), + .SAXIHP3BVALID (S_AXI_HP3_BVALID), + .SAXIHP3RACOUNT (S_AXI_HP3_RACOUNT), + .SAXIHP3RCOUNT (S_AXI_HP3_RCOUNT), + .SAXIHP3RDATA (S_AXI_HP3_RDATA_out), + .SAXIHP3RID (S_AXI_HP3_RID_out), + .SAXIHP3RLAST (S_AXI_HP3_RLAST), + .SAXIHP3RRESP (S_AXI_HP3_RRESP), + .SAXIHP3RVALID (S_AXI_HP3_RVALID), + .SAXIHP3WCOUNT (S_AXI_HP3_WCOUNT), + .SAXIHP3WACOUNT (S_AXI_HP3_WACOUNT), + .SAXIHP3WREADY (S_AXI_HP3_WREADY), + .DDRARB (DDR_ARB), + .DMA0ACLK (DMA0_ACLK ), + .DMA0DAREADY (DMA0_DAREADY), + .DMA0DRLAST (DMA0_DRLAST ), + .DMA0DRTYPE (DMA0_DRTYPE), + .DMA0DRVALID (DMA0_DRVALID), + .DMA1ACLK (DMA1_ACLK ), + .DMA1DAREADY (DMA1_DAREADY), + .DMA1DRLAST (DMA1_DRLAST ), + .DMA1DRTYPE (DMA1_DRTYPE), + .DMA1DRVALID (DMA1_DRVALID), + .DMA2ACLK (DMA2_ACLK ), + .DMA2DAREADY (DMA2_DAREADY), + .DMA2DRLAST (DMA2_DRLAST ), + .DMA2DRTYPE (DMA2_DRTYPE), + .DMA2DRVALID (DMA2_DRVALID), + .DMA3ACLK (DMA3_ACLK ), + .DMA3DAREADY (DMA3_DAREADY), + .DMA3DRLAST (DMA3_DRLAST ), + .DMA3DRTYPE (DMA3_DRTYPE), + .DMA3DRVALID (DMA3_DRVALID), + .EMIOCAN0PHYRX (CAN0_PHY_RX), + .EMIOCAN1PHYRX (CAN1_PHY_RX), + .EMIOENET0EXTINTIN (ENET0_EXT_INTIN), + .EMIOENET0GMIICOL (ENET0_GMII_COL_i), + .EMIOENET0GMIICRS (ENET0_GMII_CRS_i), + .EMIOENET0GMIIRXCLK (ENET0_GMII_RX_CLK), + .EMIOENET0GMIIRXD (ENET0_GMII_RXD_i), + .EMIOENET0GMIIRXDV (ENET0_GMII_RX_DV_i), + .EMIOENET0GMIIRXER (ENET0_GMII_RX_ER_i), + .EMIOENET0GMIITXCLK (ENET0_GMII_TX_CLK), + .EMIOENET0MDIOI (ENET0_MDIO_I), + .EMIOENET1EXTINTIN (ENET1_EXT_INTIN), + .EMIOENET1GMIICOL (ENET1_GMII_COL_i), + .EMIOENET1GMIICRS (ENET1_GMII_CRS_i), + .EMIOENET1GMIIRXCLK (ENET1_GMII_RX_CLK), + .EMIOENET1GMIIRXD (ENET1_GMII_RXD_i), + .EMIOENET1GMIIRXDV (ENET1_GMII_RX_DV_i), + .EMIOENET1GMIIRXER (ENET1_GMII_RX_ER_i), + .EMIOENET1GMIITXCLK (ENET1_GMII_TX_CLK), + .EMIOENET1MDIOI (ENET1_MDIO_I), + .EMIOGPIOI (gpio_in63_0 ), + .EMIOI2C0SCLI (I2C0_SCL_I), + .EMIOI2C0SDAI (I2C0_SDA_I), + .EMIOI2C1SCLI (I2C1_SCL_I), + .EMIOI2C1SDAI (I2C1_SDA_I), + .EMIOPJTAGTCK (PJTAG_TCK), + .EMIOPJTAGTDI (PJTAG_TDI), + .EMIOPJTAGTMS (PJTAG_TMS), + .EMIOSDIO0CDN (SDIO0_CDN), + .EMIOSDIO0CLKFB (SDIO0_CLK_FB ), + .EMIOSDIO0CMDI (SDIO0_CMD_I ), + .EMIOSDIO0DATAI (SDIO0_DATA_I ), + .EMIOSDIO0WP (SDIO0_WP), + .EMIOSDIO1CDN (SDIO1_CDN), + .EMIOSDIO1CLKFB (SDIO1_CLK_FB ), + .EMIOSDIO1CMDI (SDIO1_CMD_I ), + .EMIOSDIO1DATAI (SDIO1_DATA_I ), + .EMIOSDIO1WP (SDIO1_WP), + .EMIOSPI0MI (SPI0_MISO_I), + .EMIOSPI0SCLKI (SPI0_SCLK_I), + .EMIOSPI0SI (SPI0_MOSI_I), + .EMIOSPI0SSIN (SPI0_SS_I), + .EMIOSPI1MI (SPI1_MISO_I), + .EMIOSPI1SCLKI (SPI1_SCLK_I), + .EMIOSPI1SI (SPI1_MOSI_I), + .EMIOSPI1SSIN (SPI1_SS_I), + .EMIOSRAMINTIN (SRAM_INTIN), + .EMIOTRACECLK (TRACE_CLK), + .EMIOTTC0CLKI ({TTC0_CLK2_IN, TTC0_CLK1_IN, TTC0_CLK0_IN}), + .EMIOTTC1CLKI ({TTC1_CLK2_IN, TTC1_CLK1_IN, TTC1_CLK0_IN}), + .EMIOUART0CTSN (UART0_CTSN), + .EMIOUART0DCDN (UART0_DCDN), + .EMIOUART0DSRN (UART0_DSRN), + .EMIOUART0RIN (UART0_RIN ), + .EMIOUART0RX (UART0_RX ), + .EMIOUART1CTSN (UART1_CTSN), + .EMIOUART1DCDN (UART1_DCDN), + .EMIOUART1DSRN (UART1_DSRN), + .EMIOUART1RIN (UART1_RIN ), + .EMIOUART1RX (UART1_RX ), + .EMIOUSB0VBUSPWRFAULT (USB0_VBUS_PWRFAULT), + .EMIOUSB1VBUSPWRFAULT (USB1_VBUS_PWRFAULT), + .EMIOWDTCLKI (WDT_CLK_IN), + .EVENTEVENTI (EVENT_EVENTI), + .FCLKCLKTRIGN (fclk_clktrig_gnd), + .FPGAIDLEN (FPGA_IDLE_N), + .FTMDTRACEINATID (FTMD_TRACEIN_ATID_i), + .FTMDTRACEINCLOCK (FTMD_TRACEIN_CLK), + .FTMDTRACEINDATA (FTMD_TRACEIN_DATA_i), + .FTMDTRACEINVALID (FTMD_TRACEIN_VALID_i), + .FTMTF2PDEBUG (FTMT_F2P_DEBUG ), + .FTMTF2PTRIG ({FTMT_F2P_TRIG_3,FTMT_F2P_TRIG_2,FTMT_F2P_TRIG_1,FTMT_F2P_TRIG_0}), + .FTMTP2FTRIGACK ({FTMT_P2F_TRIGACK_3,FTMT_P2F_TRIGACK_2,FTMT_P2F_TRIGACK_1,FTMT_P2F_TRIGACK_0}), + .IRQF2P (irq_f2p_i), + .MAXIGP0ACLK (M_AXI_GP0_ACLK_temp), + .MAXIGP0ARREADY (M_AXI_GP0_ARREADY), + .MAXIGP0AWREADY (M_AXI_GP0_AWREADY), + .MAXIGP0BID (M_AXI_GP0_BID_FULL ), + .MAXIGP0BRESP (M_AXI_GP0_BRESP ), + .MAXIGP0BVALID (M_AXI_GP0_BVALID ), + .MAXIGP0RDATA (M_AXI_GP0_RDATA ), + .MAXIGP0RID (M_AXI_GP0_RID_FULL ), + .MAXIGP0RLAST (M_AXI_GP0_RLAST ), + .MAXIGP0RRESP (M_AXI_GP0_RRESP ), + .MAXIGP0RVALID (M_AXI_GP0_RVALID ), + .MAXIGP0WREADY (M_AXI_GP0_WREADY ), + .MAXIGP1ACLK (M_AXI_GP1_ACLK_temp ), + .MAXIGP1ARREADY (M_AXI_GP1_ARREADY), + .MAXIGP1AWREADY (M_AXI_GP1_AWREADY), + .MAXIGP1BID (M_AXI_GP1_BID_FULL ), + .MAXIGP1BRESP (M_AXI_GP1_BRESP ), + .MAXIGP1BVALID (M_AXI_GP1_BVALID ), + .MAXIGP1RDATA (M_AXI_GP1_RDATA ), + .MAXIGP1RID (M_AXI_GP1_RID_FULL ), + .MAXIGP1RLAST (M_AXI_GP1_RLAST ), + .MAXIGP1RRESP (M_AXI_GP1_RRESP ), + .MAXIGP1RVALID (M_AXI_GP1_RVALID ), + .MAXIGP1WREADY (M_AXI_GP1_WREADY ), + .SAXIACPACLK (S_AXI_ACP_ACLK_temp), + .SAXIACPARADDR (SAXIACPARADDR_W ), + .SAXIACPARBURST (SAXIACPARBURST_W), + .SAXIACPARCACHE (SAXIACPARCACHE_W), + .SAXIACPARID (S_AXI_ACP_ARID_in ), + .SAXIACPARLEN (SAXIACPARLEN_W ), + .SAXIACPARLOCK (SAXIACPARLOCK_W ), + .SAXIACPARPROT (SAXIACPARPROT_W ), + .SAXIACPARQOS (S_AXI_ACP_ARQOS ), + .SAXIACPARSIZE (SAXIACPARSIZE_W[1:0] ), + .SAXIACPARUSER (SAXIACPARUSER_W ), + .SAXIACPARVALID (SAXIACPARVALID_W), + .SAXIACPAWADDR (SAXIACPAWADDR_W ), + .SAXIACPAWBURST (SAXIACPAWBURST_W), + .SAXIACPAWCACHE (SAXIACPAWCACHE_W), + .SAXIACPAWID (S_AXI_ACP_AWID_in ), + .SAXIACPAWLEN (SAXIACPAWLEN_W ), + .SAXIACPAWLOCK (SAXIACPAWLOCK_W ), + .SAXIACPAWPROT (SAXIACPAWPROT_W ), + .SAXIACPAWQOS (S_AXI_ACP_AWQOS ), + .SAXIACPAWSIZE (SAXIACPAWSIZE_W[1:0] ), + .SAXIACPAWUSER (SAXIACPAWUSER_W ), + .SAXIACPAWVALID (SAXIACPAWVALID_W), + .SAXIACPBREADY (SAXIACPBREADY_W ), + .SAXIACPRREADY (SAXIACPRREADY_W ), + .SAXIACPWDATA (SAXIACPWDATA_W ), + .SAXIACPWID (S_AXI_ACP_WID_in ), + .SAXIACPWLAST (SAXIACPWLAST_W ), + .SAXIACPWSTRB (SAXIACPWSTRB_W ), + .SAXIACPWVALID (SAXIACPWVALID_W ), + .SAXIGP0ACLK (S_AXI_GP0_ACLK_temp ), + .SAXIGP0ARADDR (S_AXI_GP0_ARADDR ), + .SAXIGP0ARBURST (S_AXI_GP0_ARBURST), + .SAXIGP0ARCACHE (S_AXI_GP0_ARCACHE), + .SAXIGP0ARID (S_AXI_GP0_ARID_in ), + .SAXIGP0ARLEN (S_AXI_GP0_ARLEN ), + .SAXIGP0ARLOCK (S_AXI_GP0_ARLOCK ), + .SAXIGP0ARPROT (S_AXI_GP0_ARPROT ), + .SAXIGP0ARQOS (S_AXI_GP0_ARQOS ), + .SAXIGP0ARSIZE (S_AXI_GP0_ARSIZE[1:0] ), + .SAXIGP0ARVALID (S_AXI_GP0_ARVALID), + .SAXIGP0AWADDR (S_AXI_GP0_AWADDR ), + .SAXIGP0AWBURST (S_AXI_GP0_AWBURST), + .SAXIGP0AWCACHE (S_AXI_GP0_AWCACHE), + .SAXIGP0AWID (S_AXI_GP0_AWID_in ), + .SAXIGP0AWLEN (S_AXI_GP0_AWLEN ), + .SAXIGP0AWLOCK (S_AXI_GP0_AWLOCK ), + .SAXIGP0AWPROT (S_AXI_GP0_AWPROT ), + .SAXIGP0AWQOS (S_AXI_GP0_AWQOS ), + .SAXIGP0AWSIZE (S_AXI_GP0_AWSIZE[1:0] ), + .SAXIGP0AWVALID (S_AXI_GP0_AWVALID), + .SAXIGP0BREADY (S_AXI_GP0_BREADY ), + .SAXIGP0RREADY (S_AXI_GP0_RREADY ), + .SAXIGP0WDATA (S_AXI_GP0_WDATA ), + .SAXIGP0WID (S_AXI_GP0_WID_in ), + .SAXIGP0WLAST (S_AXI_GP0_WLAST ), + .SAXIGP0WSTRB (S_AXI_GP0_WSTRB ), + .SAXIGP0WVALID (S_AXI_GP0_WVALID ), + .SAXIGP1ACLK (S_AXI_GP1_ACLK_temp ), + .SAXIGP1ARADDR (S_AXI_GP1_ARADDR ), + .SAXIGP1ARBURST (S_AXI_GP1_ARBURST), + .SAXIGP1ARCACHE (S_AXI_GP1_ARCACHE), + .SAXIGP1ARID (S_AXI_GP1_ARID_in ), + .SAXIGP1ARLEN (S_AXI_GP1_ARLEN ), + .SAXIGP1ARLOCK (S_AXI_GP1_ARLOCK ), + .SAXIGP1ARPROT (S_AXI_GP1_ARPROT ), + .SAXIGP1ARQOS (S_AXI_GP1_ARQOS ), + .SAXIGP1ARSIZE (S_AXI_GP1_ARSIZE[1:0] ), + .SAXIGP1ARVALID (S_AXI_GP1_ARVALID), + .SAXIGP1AWADDR (S_AXI_GP1_AWADDR ), + .SAXIGP1AWBURST (S_AXI_GP1_AWBURST), + .SAXIGP1AWCACHE (S_AXI_GP1_AWCACHE), + .SAXIGP1AWID (S_AXI_GP1_AWID_in ), + .SAXIGP1AWLEN (S_AXI_GP1_AWLEN ), + .SAXIGP1AWLOCK (S_AXI_GP1_AWLOCK ), + .SAXIGP1AWPROT (S_AXI_GP1_AWPROT ), + .SAXIGP1AWQOS (S_AXI_GP1_AWQOS ), + .SAXIGP1AWSIZE (S_AXI_GP1_AWSIZE[1:0] ), + .SAXIGP1AWVALID (S_AXI_GP1_AWVALID), + .SAXIGP1BREADY (S_AXI_GP1_BREADY ), + .SAXIGP1RREADY (S_AXI_GP1_RREADY ), + .SAXIGP1WDATA (S_AXI_GP1_WDATA ), + .SAXIGP1WID (S_AXI_GP1_WID_in ), + .SAXIGP1WLAST (S_AXI_GP1_WLAST ), + .SAXIGP1WSTRB (S_AXI_GP1_WSTRB ), + .SAXIGP1WVALID (S_AXI_GP1_WVALID ), + .SAXIHP0ACLK (S_AXI_HP0_ACLK_temp ), + .SAXIHP0ARADDR (S_AXI_HP0_ARADDR), + .SAXIHP0ARBURST (S_AXI_HP0_ARBURST), + .SAXIHP0ARCACHE (S_AXI_HP0_ARCACHE), + .SAXIHP0ARID (S_AXI_HP0_ARID_in), + .SAXIHP0ARLEN (S_AXI_HP0_ARLEN), + .SAXIHP0ARLOCK (S_AXI_HP0_ARLOCK), + .SAXIHP0ARPROT (S_AXI_HP0_ARPROT), + .SAXIHP0ARQOS (S_AXI_HP0_ARQOS), + .SAXIHP0ARSIZE (S_AXI_HP0_ARSIZE[1:0]), + .SAXIHP0ARVALID (S_AXI_HP0_ARVALID), + .SAXIHP0AWADDR (S_AXI_HP0_AWADDR), + .SAXIHP0AWBURST (S_AXI_HP0_AWBURST), + .SAXIHP0AWCACHE (S_AXI_HP0_AWCACHE), + .SAXIHP0AWID (S_AXI_HP0_AWID_in), + .SAXIHP0AWLEN (S_AXI_HP0_AWLEN), + .SAXIHP0AWLOCK (S_AXI_HP0_AWLOCK), + .SAXIHP0AWPROT (S_AXI_HP0_AWPROT), + .SAXIHP0AWQOS (S_AXI_HP0_AWQOS), + .SAXIHP0AWSIZE (S_AXI_HP0_AWSIZE[1:0]), + .SAXIHP0AWVALID (S_AXI_HP0_AWVALID), + .SAXIHP0BREADY (S_AXI_HP0_BREADY), + .SAXIHP0RDISSUECAP1EN (S_AXI_HP0_RDISSUECAP1_EN), + .SAXIHP0RREADY (S_AXI_HP0_RREADY), + .SAXIHP0WDATA (S_AXI_HP0_WDATA_in), + .SAXIHP0WID (S_AXI_HP0_WID_in), + .SAXIHP0WLAST (S_AXI_HP0_WLAST), + .SAXIHP0WRISSUECAP1EN (S_AXI_HP0_WRISSUECAP1_EN), + .SAXIHP0WSTRB (S_AXI_HP0_WSTRB_in), + .SAXIHP0WVALID (S_AXI_HP0_WVALID), + .SAXIHP1ACLK (S_AXI_HP1_ACLK_temp), + .SAXIHP1ARADDR (S_AXI_HP1_ARADDR), + .SAXIHP1ARBURST (S_AXI_HP1_ARBURST), + .SAXIHP1ARCACHE (S_AXI_HP1_ARCACHE), + .SAXIHP1ARID (S_AXI_HP1_ARID_in), + .SAXIHP1ARLEN (S_AXI_HP1_ARLEN), + .SAXIHP1ARLOCK (S_AXI_HP1_ARLOCK), + .SAXIHP1ARPROT (S_AXI_HP1_ARPROT), + .SAXIHP1ARQOS (S_AXI_HP1_ARQOS), + .SAXIHP1ARSIZE (S_AXI_HP1_ARSIZE[1:0]), + .SAXIHP1ARVALID (S_AXI_HP1_ARVALID), + .SAXIHP1AWADDR (S_AXI_HP1_AWADDR), + .SAXIHP1AWBURST (S_AXI_HP1_AWBURST), + .SAXIHP1AWCACHE (S_AXI_HP1_AWCACHE), + .SAXIHP1AWID (S_AXI_HP1_AWID_in), + .SAXIHP1AWLEN (S_AXI_HP1_AWLEN), + .SAXIHP1AWLOCK (S_AXI_HP1_AWLOCK), + .SAXIHP1AWPROT (S_AXI_HP1_AWPROT), + .SAXIHP1AWQOS (S_AXI_HP1_AWQOS), + .SAXIHP1AWSIZE (S_AXI_HP1_AWSIZE[1:0]), + .SAXIHP1AWVALID (S_AXI_HP1_AWVALID), + .SAXIHP1BREADY (S_AXI_HP1_BREADY), + .SAXIHP1RDISSUECAP1EN (S_AXI_HP1_RDISSUECAP1_EN), + .SAXIHP1RREADY (S_AXI_HP1_RREADY), + .SAXIHP1WDATA (S_AXI_HP1_WDATA_in), + .SAXIHP1WID (S_AXI_HP1_WID_in), + .SAXIHP1WLAST (S_AXI_HP1_WLAST), + .SAXIHP1WRISSUECAP1EN (S_AXI_HP1_WRISSUECAP1_EN), + .SAXIHP1WSTRB (S_AXI_HP1_WSTRB_in), + .SAXIHP1WVALID (S_AXI_HP1_WVALID), + .SAXIHP2ACLK (S_AXI_HP2_ACLK_temp), + .SAXIHP2ARADDR (S_AXI_HP2_ARADDR), + .SAXIHP2ARBURST (S_AXI_HP2_ARBURST), + .SAXIHP2ARCACHE (S_AXI_HP2_ARCACHE), + .SAXIHP2ARID (S_AXI_HP2_ARID_in), + .SAXIHP2ARLEN (S_AXI_HP2_ARLEN), + .SAXIHP2ARLOCK (S_AXI_HP2_ARLOCK), + .SAXIHP2ARPROT (S_AXI_HP2_ARPROT), + .SAXIHP2ARQOS (S_AXI_HP2_ARQOS), + .SAXIHP2ARSIZE (S_AXI_HP2_ARSIZE[1:0]), + .SAXIHP2ARVALID (S_AXI_HP2_ARVALID), + .SAXIHP2AWADDR (S_AXI_HP2_AWADDR), + .SAXIHP2AWBURST (S_AXI_HP2_AWBURST), + .SAXIHP2AWCACHE (S_AXI_HP2_AWCACHE), + .SAXIHP2AWID (S_AXI_HP2_AWID_in), + .SAXIHP2AWLEN (S_AXI_HP2_AWLEN), + .SAXIHP2AWLOCK (S_AXI_HP2_AWLOCK), + .SAXIHP2AWPROT (S_AXI_HP2_AWPROT), + .SAXIHP2AWQOS (S_AXI_HP2_AWQOS), + .SAXIHP2AWSIZE (S_AXI_HP2_AWSIZE[1:0]), + .SAXIHP2AWVALID (S_AXI_HP2_AWVALID), + .SAXIHP2BREADY (S_AXI_HP2_BREADY), + .SAXIHP2RDISSUECAP1EN (S_AXI_HP2_RDISSUECAP1_EN), + .SAXIHP2RREADY (S_AXI_HP2_RREADY), + .SAXIHP2WDATA (S_AXI_HP2_WDATA_in), + .SAXIHP2WID (S_AXI_HP2_WID_in), + .SAXIHP2WLAST (S_AXI_HP2_WLAST), + .SAXIHP2WRISSUECAP1EN (S_AXI_HP2_WRISSUECAP1_EN), + .SAXIHP2WSTRB (S_AXI_HP2_WSTRB_in), + .SAXIHP2WVALID (S_AXI_HP2_WVALID), + .SAXIHP3ACLK (S_AXI_HP3_ACLK_temp), + .SAXIHP3ARADDR (S_AXI_HP3_ARADDR ), + .SAXIHP3ARBURST (S_AXI_HP3_ARBURST), + .SAXIHP3ARCACHE (S_AXI_HP3_ARCACHE), + .SAXIHP3ARID (S_AXI_HP3_ARID_in ), + .SAXIHP3ARLEN (S_AXI_HP3_ARLEN), + .SAXIHP3ARLOCK (S_AXI_HP3_ARLOCK), + .SAXIHP3ARPROT (S_AXI_HP3_ARPROT), + .SAXIHP3ARQOS (S_AXI_HP3_ARQOS), + .SAXIHP3ARSIZE (S_AXI_HP3_ARSIZE[1:0]), + .SAXIHP3ARVALID (S_AXI_HP3_ARVALID), + .SAXIHP3AWADDR (S_AXI_HP3_AWADDR), + .SAXIHP3AWBURST (S_AXI_HP3_AWBURST), + .SAXIHP3AWCACHE (S_AXI_HP3_AWCACHE), + .SAXIHP3AWID (S_AXI_HP3_AWID_in), + .SAXIHP3AWLEN (S_AXI_HP3_AWLEN), + .SAXIHP3AWLOCK (S_AXI_HP3_AWLOCK), + .SAXIHP3AWPROT (S_AXI_HP3_AWPROT), + .SAXIHP3AWQOS (S_AXI_HP3_AWQOS), + .SAXIHP3AWSIZE (S_AXI_HP3_AWSIZE[1:0]), + .SAXIHP3AWVALID (S_AXI_HP3_AWVALID), + .SAXIHP3BREADY (S_AXI_HP3_BREADY), + .SAXIHP3RDISSUECAP1EN (S_AXI_HP3_RDISSUECAP1_EN), + .SAXIHP3RREADY (S_AXI_HP3_RREADY), + .SAXIHP3WDATA (S_AXI_HP3_WDATA_in), + .SAXIHP3WID (S_AXI_HP3_WID_in), + .SAXIHP3WLAST (S_AXI_HP3_WLAST), + .SAXIHP3WRISSUECAP1EN (S_AXI_HP3_WRISSUECAP1_EN), + .SAXIHP3WSTRB (S_AXI_HP3_WSTRB_in), + .SAXIHP3WVALID (S_AXI_HP3_WVALID), + .DDRA (buffered_DDR_Addr), + .DDRBA (buffered_DDR_BankAddr), + .DDRCASB (buffered_DDR_CAS_n), + .DDRCKE (buffered_DDR_CKE), + .DDRCKN (buffered_DDR_Clk_n), + .DDRCKP (buffered_DDR_Clk), + .DDRCSB (buffered_DDR_CS_n), + .DDRDM (buffered_DDR_DM), + .DDRDQ (buffered_DDR_DQ), + .DDRDQSN (buffered_DDR_DQS_n), + .DDRDQSP (buffered_DDR_DQS), + .DDRDRSTB (buffered_DDR_DRSTB), + .DDRODT (buffered_DDR_ODT), + .DDRRASB (buffered_DDR_RAS_n), + .DDRVRN (buffered_DDR_VRN), + .DDRVRP (buffered_DDR_VRP), + .DDRWEB (buffered_DDR_WEB), + .MIO (buffered_MIO), + .PSCLK (buffered_PS_CLK), + .PSPORB (buffered_PS_PORB), + .PSSRSTB (buffered_PS_SRSTB) + + + ); + + end + endgenerate + + +// Generating the AxUSER Values locally when the C_USE_DEFAULT_ACP_USER_VAL is enabled. +// Otherwise a master connected to the ACP port will drive the AxUSER Ports +assign param_aruser = C_USE_DEFAULT_ACP_USER_VAL? C_S_AXI_ACP_ARUSER_VAL : S_AXI_ACP_ARUSER; +assign param_awuser = C_USE_DEFAULT_ACP_USER_VAL? C_S_AXI_ACP_AWUSER_VAL : S_AXI_ACP_AWUSER; + + assign SAXIACPARADDR_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARADDR : S_AXI_ACP_ARADDR; + assign SAXIACPARBURST_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARBURST : S_AXI_ACP_ARBURST; + assign SAXIACPARCACHE_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARCACHE : S_AXI_ACP_ARCACHE; + assign SAXIACPARLEN_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARLEN : S_AXI_ACP_ARLEN; + assign SAXIACPARLOCK_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARLOCK : S_AXI_ACP_ARLOCK; + assign SAXIACPARPROT_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARPROT : S_AXI_ACP_ARPROT; + assign SAXIACPARSIZE_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARSIZE : S_AXI_ACP_ARSIZE; + //assign SAXIACPARUSER_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARUSER : S_AXI_ACP_ARUSER; + assign SAXIACPARUSER_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARUSER : param_aruser; + + assign SAXIACPARVALID_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARVALID : S_AXI_ACP_ARVALID ; + assign SAXIACPAWADDR_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWADDR : S_AXI_ACP_AWADDR; + assign SAXIACPAWBURST_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWBURST : S_AXI_ACP_AWBURST; + + + assign SAXIACPAWCACHE_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWCACHE : S_AXI_ACP_AWCACHE; + assign SAXIACPAWLEN_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWLEN : S_AXI_ACP_AWLEN; + assign SAXIACPAWLOCK_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWLOCK : S_AXI_ACP_AWLOCK; + assign SAXIACPAWPROT_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWPROT : S_AXI_ACP_AWPROT; + assign SAXIACPAWSIZE_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWSIZE : S_AXI_ACP_AWSIZE; + //assign SAXIACPAWUSER_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWUSER : S_AXI_ACP_AWUSER; + assign SAXIACPAWUSER_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWUSER : param_awuser; + assign SAXIACPAWVALID_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWVALID : S_AXI_ACP_AWVALID; + assign SAXIACPBREADY_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_BREADY : S_AXI_ACP_BREADY; + assign SAXIACPRREADY_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_RREADY : S_AXI_ACP_RREADY; + assign SAXIACPWDATA_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_WDATA : S_AXI_ACP_WDATA; + assign SAXIACPWLAST_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_WLAST : S_AXI_ACP_WLAST; + assign SAXIACPWSTRB_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_WSTRB : S_AXI_ACP_WSTRB; + assign SAXIACPWVALID_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_WVALID : S_AXI_ACP_WVALID; + + assign SAXIACPARID_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_ARID : S_AXI_ACP_ARID; + assign SAXIACPAWID_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_AWID : S_AXI_ACP_AWID; + assign SAXIACPWID_W = (C_INCLUDE_ACP_TRANS_CHECK == 1) ? S_AXI_ATC_WID : S_AXI_ACP_WID; + + + generate + if (C_INCLUDE_ACP_TRANS_CHECK == 0) begin : gen_no_atc + + assign S_AXI_ACP_AWREADY = SAXIACPAWREADY_W; + assign S_AXI_ACP_WREADY = SAXIACPWREADY_W; + assign S_AXI_ACP_BID = SAXIACPBID_W; + assign S_AXI_ACP_BRESP = SAXIACPBRESP_W; + assign S_AXI_ACP_BVALID = SAXIACPBVALID_W; + assign S_AXI_ACP_RDATA = SAXIACPRDATA_W; + assign S_AXI_ACP_RID = SAXIACPRID_W; + assign S_AXI_ACP_RLAST = SAXIACPRLAST_W; + assign S_AXI_ACP_RRESP = SAXIACPRRESP_W; + assign S_AXI_ACP_RVALID = SAXIACPRVALID_W; + assign S_AXI_ACP_ARREADY = SAXIACPARREADY_W; + + + end else begin : gen_atc + + processing_system7_v5_5_atc #( + .C_AXI_ID_WIDTH (C_S_AXI_ACP_ID_WIDTH), + .C_AXI_AWUSER_WIDTH (5), + .C_AXI_ARUSER_WIDTH (5) + ) + + atc_i ( + + // Global Signals + .ACLK (S_AXI_ACP_ACLK_temp), + .ARESETN (S_AXI_ACP_ARESETN), + + // Slave Interface Write Address Ports + .S_AXI_AWID (S_AXI_ACP_AWID), + .S_AXI_AWADDR (S_AXI_ACP_AWADDR), + .S_AXI_AWLEN (S_AXI_ACP_AWLEN), + .S_AXI_AWSIZE (S_AXI_ACP_AWSIZE), + .S_AXI_AWBURST (S_AXI_ACP_AWBURST), + .S_AXI_AWLOCK (S_AXI_ACP_AWLOCK), + .S_AXI_AWCACHE (S_AXI_ACP_AWCACHE), + .S_AXI_AWPROT (S_AXI_ACP_AWPROT), + //.S_AXI_AWUSER (S_AXI_ACP_AWUSER), + .S_AXI_AWUSER (param_awuser), + .S_AXI_AWVALID (S_AXI_ACP_AWVALID), + .S_AXI_AWREADY (S_AXI_ACP_AWREADY), + // Slave Interface Write Data Ports + .S_AXI_WID (S_AXI_ACP_WID), + .S_AXI_WDATA (S_AXI_ACP_WDATA), + .S_AXI_WSTRB (S_AXI_ACP_WSTRB), + .S_AXI_WLAST (S_AXI_ACP_WLAST), + .S_AXI_WUSER (), + .S_AXI_WVALID (S_AXI_ACP_WVALID), + .S_AXI_WREADY (S_AXI_ACP_WREADY), + // Slave Interface Write Response Ports + .S_AXI_BID (S_AXI_ACP_BID), + .S_AXI_BRESP (S_AXI_ACP_BRESP), + .S_AXI_BUSER (), + .S_AXI_BVALID (S_AXI_ACP_BVALID), + .S_AXI_BREADY (S_AXI_ACP_BREADY), + // Slave Interface Read Address Ports + .S_AXI_ARID (S_AXI_ACP_ARID), + .S_AXI_ARADDR (S_AXI_ACP_ARADDR), + .S_AXI_ARLEN (S_AXI_ACP_ARLEN), + .S_AXI_ARSIZE (S_AXI_ACP_ARSIZE), + .S_AXI_ARBURST (S_AXI_ACP_ARBURST), + .S_AXI_ARLOCK (S_AXI_ACP_ARLOCK), + .S_AXI_ARCACHE (S_AXI_ACP_ARCACHE), + .S_AXI_ARPROT (S_AXI_ACP_ARPROT), + //.S_AXI_ARUSER (S_AXI_ACP_ARUSER), + .S_AXI_ARUSER (param_aruser), + .S_AXI_ARVALID (S_AXI_ACP_ARVALID), + .S_AXI_ARREADY (S_AXI_ACP_ARREADY), + // Slave Interface Read Data Ports + .S_AXI_RID (S_AXI_ACP_RID), + .S_AXI_RDATA (S_AXI_ACP_RDATA), + .S_AXI_RRESP (S_AXI_ACP_RRESP), + .S_AXI_RLAST (S_AXI_ACP_RLAST), + .S_AXI_RUSER (), + .S_AXI_RVALID (S_AXI_ACP_RVALID), + .S_AXI_RREADY (S_AXI_ACP_RREADY), + + // Slave Interface Write Address Ports + .M_AXI_AWID (S_AXI_ATC_AWID), + .M_AXI_AWADDR (S_AXI_ATC_AWADDR), + .M_AXI_AWLEN (S_AXI_ATC_AWLEN), + .M_AXI_AWSIZE (S_AXI_ATC_AWSIZE), + .M_AXI_AWBURST (S_AXI_ATC_AWBURST), + .M_AXI_AWLOCK (S_AXI_ATC_AWLOCK), + .M_AXI_AWCACHE (S_AXI_ATC_AWCACHE), + .M_AXI_AWPROT (S_AXI_ATC_AWPROT), + .M_AXI_AWUSER (S_AXI_ATC_AWUSER), + .M_AXI_AWVALID (S_AXI_ATC_AWVALID), + .M_AXI_AWREADY (SAXIACPAWREADY_W), + // Slave Interface Write Data Ports + .M_AXI_WID (S_AXI_ATC_WID), + .M_AXI_WDATA (S_AXI_ATC_WDATA), + .M_AXI_WSTRB (S_AXI_ATC_WSTRB), + .M_AXI_WLAST (S_AXI_ATC_WLAST), + .M_AXI_WUSER (), + .M_AXI_WVALID (S_AXI_ATC_WVALID), + .M_AXI_WREADY (SAXIACPWREADY_W), + // Slave Interface Write Response Ports + .M_AXI_BID (SAXIACPBID_W), + .M_AXI_BRESP (SAXIACPBRESP_W), + .M_AXI_BUSER (), + .M_AXI_BVALID (SAXIACPBVALID_W), + .M_AXI_BREADY (S_AXI_ATC_BREADY), + // Slave Interface Read Address Ports + .M_AXI_ARID (S_AXI_ATC_ARID), + .M_AXI_ARADDR (S_AXI_ATC_ARADDR), + .M_AXI_ARLEN (S_AXI_ATC_ARLEN), + .M_AXI_ARSIZE (S_AXI_ATC_ARSIZE), + .M_AXI_ARBURST (S_AXI_ATC_ARBURST), + .M_AXI_ARLOCK (S_AXI_ATC_ARLOCK), + .M_AXI_ARCACHE (S_AXI_ATC_ARCACHE), + .M_AXI_ARPROT (S_AXI_ATC_ARPROT), + .M_AXI_ARUSER (S_AXI_ATC_ARUSER), + .M_AXI_ARVALID (S_AXI_ATC_ARVALID), + .M_AXI_ARREADY (SAXIACPARREADY_W), + // Slave Interface Read Data Ports + .M_AXI_RID (SAXIACPRID_W), + .M_AXI_RDATA (SAXIACPRDATA_W), + .M_AXI_RRESP (SAXIACPRRESP_W), + .M_AXI_RLAST (SAXIACPRLAST_W), + .M_AXI_RUSER (), + .M_AXI_RVALID (SAXIACPRVALID_W), + .M_AXI_RREADY (S_AXI_ATC_RREADY), + + + .ERROR_TRIGGER(), + .ERROR_TRANSACTION_ID() + ); + + + + end + endgenerate + + + + +endmodule + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.c b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.c new file mode 100644 index 0000000..3bcce86 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.c @@ -0,0 +1,10638 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the "Software"), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit +* persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* Use of the Software is limited solely to applications: (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used in advertising or +* otherwise to promote the sale, use or other dealings in this Software without prior written +* authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file ps7_init.c +* +* This file is automatically generated +* +*****************************************************************************/ + +#include "ps7_init.h" + +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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00001081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 + // .. .. reserved_reg_ddrc_rank0_wr_odt = 0x1 + // .. .. ==> 0XF8006048[5:3] = 0x00000001U + // .. .. ==> MASK : 0x00000038U VAL : 0x00000008U + // .. .. reserved_reg_ddrc_rank0_rd_odt = 0x0 + // .. .. ==> 0XF8006048[2:0] = 0x00000000U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006048, 0x0003F03FU ,0x0003C008U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. FINISH: OCM REMAPPING + // .. START: DDRIOB SETTINGS + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. reserved_SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F98068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F98068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. reserved_VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. reserved_REFIO_TEST = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. reserved_REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. reserved_DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. reserved_CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x00007FFFU ,0x00000220U), + // .. .. 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 + // .. .. reserved_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 + // .. .. reserved_VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reserved_VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reserved_VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. reserved_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[15:14] = 0x00000000U + // .. .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. reserved_INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reserved_TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reserved_TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reserved_TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. reserved_TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reserved_INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FEFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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 + // .. .. START: AFI2 SECURE REGISTER + // .. .. FINISH: AFI2 SECURE REGISTER + // .. FINISH: AFI REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_3_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_2_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. 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 = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. 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 ,0x00000220U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_2_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_1_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. 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 ,0x00000220U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_1_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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; + case OPCODE_MASKDELAY: + addr = (unsigned long*) args[0]; + mask = args[1]; + int delay = get_number_of_cycles_for_delay(mask); + perf_reset_and_start_timer(); + while ((*addr < delay)) { + } + 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_debug() +{ + // 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_debug_1_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else if (si_ver == PCW_SILICON_VERSION_2) { + ret = ps7_config (ps7_debug_2_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else { + ret = ps7_config (ps7_debug_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 ret; + //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 + 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; +} + + + + +/* For delay calculation using global timer */ + +/* start timer */ + void perf_start_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = ((1 << 0) | // Timer Enable + (1 << 3) | // Auto-increment + (0 << 8) // Pre-scale + ); +} + +/* stop timer and reset timer count regs */ + void perf_reset_clock(void) +{ + perf_disable_clock(); + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_L32 = 0; + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_U32 = 0; +} + +/* Compute mask for given delay in miliseconds*/ +int get_number_of_cycles_for_delay(unsigned int delay) +{ + // GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + return (APU_FREQ*delay/(2*1000)); + +} + +/* stop timer */ + void perf_disable_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = 0; +} + +void perf_reset_and_start_timer() +{ + perf_reset_clock(); + perf_start_clock(); +} + + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.h b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.h new file mode 100644 index 0000000..bb95e06 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.h @@ -0,0 +1,137 @@ + +/****************************************************************************** +* +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the "Software"), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit +* persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* Use of the Software is limited solely to applications: (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used in advertising or +* otherwise to promote the sale, use or other dealings in this Software without prior written +* authorization from Xilinx. +* +*******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 OPCODE_MASKDELAY 5U +#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 +#define EMIT_MASKDELAY(addr,mask) ( (OPCODE_MASKDELAY << 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 666666687 +#define DDR_FREQ 533333374 +#define DCI_FREQ 10158730 +#define QSPI_FREQ 200000000 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 125000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 100000000 +#define UART_FREQ 100000000 +#define SPI_FREQ 166666672 +#define I2C_FREQ 111111115 +#define WDT_FREQ 111111115 +#define TTC_FREQ 50000000 +#define CAN_FREQ 10000000 +#define PCAP_FREQ 200000000 +#define TPIU_FREQ 200000000 +#define FPGA0_FREQ 50000000 +#define FPGA1_FREQ 100000000 +#define FPGA2_FREQ 10000000 +#define FPGA3_FREQ 10000000 + + +/* For delay calculation using global registers*/ +#define SCU_GLOBAL_TIMER_COUNT_L32 0xF8F00200 +#define SCU_GLOBAL_TIMER_COUNT_U32 0xF8F00204 +#define SCU_GLOBAL_TIMER_CONTROL 0xF8F00208 +#define SCU_GLOBAL_TIMER_AUTO_INC 0xF8F00218 + +int ps7_config( unsigned long*); +int ps7_init(); +int ps7_post_config(); +int ps7_debug(); +char* getPS7MessageInfo(unsigned key); + +void perf_start_clock(void); +void perf_disable_clock(void); +void perf_reset_clock(void); +void perf_reset_and_start_timer(); +int get_number_of_cycles_for_delay(unsigned int delay); +#ifdef __cplusplus +} +#endif + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.tcl b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.tcl new file mode 100644 index 0000000..d0f4463 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init.tcl @@ -0,0 +1,781 @@ +proc ps7_pll_init_data_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000110 0x003FFFF0 0x000FA220 + mask_write 0XF8000100 0x0007F000 0x00028000 + mask_write 0XF8000100 0x00000010 0x00000010 + mask_write 0XF8000100 0x00000001 0x00000001 + mask_write 0XF8000100 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000001 + mask_write 0XF8000100 0x00000010 0x00000000 + mask_write 0XF8000120 0x1F003F30 0x1F000200 + mask_write 0XF8000114 0x003FFFF0 0x0012C220 + mask_write 0XF8000104 0x0007F000 0x00020000 + mask_write 0XF8000104 0x00000010 0x00000010 + mask_write 0XF8000104 0x00000001 0x00000001 + mask_write 0XF8000104 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000002 + mask_write 0XF8000104 0x00000010 0x00000000 + mask_write 0XF8000124 0xFFF00003 0x0C200003 + mask_write 0XF8000118 0x003FFFF0 0x001452C0 + mask_write 0XF8000108 0x0007F000 0x0001E000 + mask_write 0XF8000108 0x00000010 0x00000010 + mask_write 0XF8000108 0x00000001 0x00000001 + mask_write 0XF8000108 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000004 + mask_write 0XF8000108 0x00000010 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_clock_init_data_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000128 0x03F03F01 0x00700F01 + mask_write 0XF800014C 0x00003F31 0x00000501 + mask_write 0XF8000150 0x00003F33 0x00000A03 + mask_write 0XF8000154 0x00003F33 0x00000A03 + mask_write 0XF8000158 0x00003F33 0x00000603 + mask_write 0XF8000168 0x00003F31 0x00000501 + mask_write 0XF8000170 0x03F03F30 0x00400500 + mask_write 0XF8000180 0x03F03F30 0x00200500 + mask_write 0XF80001C4 0x00000001 0x00000001 + mask_write 0XF800012C 0x01FFCCCD 0x01FCCC0D + mwr -force 0XF8000004 0x0000767B +} +proc ps7_ddr_init_data_3_0 {} { + mask_write 0XF8006000 0x0001FFFF 0x00000084 + mask_write 0XF8006004 0x0007FFFF 0x00001081 + mask_write 0XF8006008 0x03FFFFFF 0x03C0780F + mask_write 0XF800600C 0x03FFFFFF 0x02001001 + mask_write 0XF8006010 0x03FFFFFF 0x00014001 + mask_write 0XF8006014 0x001FFFFF 0x0004281B + mask_write 0XF8006018 0xF7FFFFFF 0x44E458D2 + mask_write 0XF800601C 0xFFFFFFFF 0x720238E5 + mask_write 0XF8006020 0x7FDFFFFC 0x270872D0 + mask_write 0XF8006024 0x0FFFFFC3 0x00000000 + mask_write 0XF8006028 0x00003FFF 0x00002007 + mask_write 0XF800602C 0xFFFFFFFF 0x00000008 + mask_write 0XF8006030 0xFFFFFFFF 0x00040930 + mask_write 0XF8006034 0x13FF3FFF 0x000116D4 + mask_write 0XF8006038 0x00000003 0x00000000 + mask_write 0XF800603C 0x000FFFFF 0x00000666 + mask_write 0XF8006040 0xFFFFFFFF 0xFFFF0000 + mask_write 0XF8006044 0x0FFFFFFF 0x0F555555 + mask_write 0XF8006048 0x0003F03F 0x0003C008 + mask_write 0XF8006050 0xFF0F8FFF 0x77010800 + mask_write 0XF8006058 0x00010000 0x00000000 + mask_write 0XF800605C 0x0000FFFF 0x00005003 + mask_write 0XF8006060 0x000017FF 0x0000003E + mask_write 0XF8006064 0x00021FE0 0x00020000 + mask_write 0XF8006068 0x03FFFFFF 0x00284141 + mask_write 0XF800606C 0x0000FFFF 0x00001610 + mask_write 0XF8006078 0x03FFFFFF 0x00466111 + mask_write 0XF800607C 0x000FFFFF 0x00032222 + mask_write 0XF80060A4 0xFFFFFFFF 0x10200802 + mask_write 0XF80060A8 0x0FFFFFFF 0x0690CB73 + mask_write 0XF80060AC 0x000001FF 0x000001FE + mask_write 0XF80060B0 0x1FFFFFFF 0x1CFFFFFF + mask_write 0XF80060B4 0x00000200 0x00000200 + mask_write 0XF80060B8 0x01FFFFFF 0x00200066 + mask_write 0XF80060C4 0x00000003 0x00000000 + mask_write 0XF80060C8 0x000000FF 0x00000000 + mask_write 0XF80060DC 0x00000001 0x00000000 + mask_write 0XF80060F0 0x0000FFFF 0x00000000 + mask_write 0XF80060F4 0x0000000F 0x00000008 + mask_write 0XF8006114 0x000000FF 0x00000000 + mask_write 0XF8006118 0x7FFFFFCF 0x40000001 + mask_write 0XF800611C 0x7FFFFFCF 0x40000001 + mask_write 0XF8006120 0x7FFFFFCF 0x40000000 + mask_write 0XF8006124 0x7FFFFFCF 0x40000000 + mask_write 0XF800612C 0x000FFFFF 0x00029000 + mask_write 0XF8006130 0x000FFFFF 0x00029000 + mask_write 0XF8006134 0x000FFFFF 0x00029000 + mask_write 0XF8006138 0x000FFFFF 0x00029000 + mask_write 0XF8006140 0x000FFFFF 0x00000035 + mask_write 0XF8006144 0x000FFFFF 0x00000035 + mask_write 0XF8006148 0x000FFFFF 0x00000035 + mask_write 0XF800614C 0x000FFFFF 0x00000035 + mask_write 0XF8006154 0x000FFFFF 0x00000080 + mask_write 0XF8006158 0x000FFFFF 0x00000080 + mask_write 0XF800615C 0x000FFFFF 0x00000080 + mask_write 0XF8006160 0x000FFFFF 0x00000080 + mask_write 0XF8006168 0x001FFFFF 0x000000F9 + mask_write 0XF800616C 0x001FFFFF 0x000000F9 + mask_write 0XF8006170 0x001FFFFF 0x000000F9 + mask_write 0XF8006174 0x001FFFFF 0x000000F9 + mask_write 0XF800617C 0x000FFFFF 0x000000C0 + mask_write 0XF8006180 0x000FFFFF 0x000000C0 + mask_write 0XF8006184 0x000FFFFF 0x000000C0 + mask_write 0XF8006188 0x000FFFFF 0x000000C0 + mask_write 0XF8006190 0x6FFFFEFE 0x00040080 + mask_write 0XF8006194 0x000FFFFF 0x0001FC82 + mask_write 0XF8006204 0xFFFFFFFF 0x00000000 + mask_write 0XF8006208 0x000703FF 0x000003FF + mask_write 0XF800620C 0x000703FF 0x000003FF + mask_write 0XF8006210 0x000703FF 0x000003FF + mask_write 0XF8006214 0x000703FF 0x000003FF + mask_write 0XF8006218 0x000F03FF 0x000003FF + mask_write 0XF800621C 0x000F03FF 0x000003FF + mask_write 0XF8006220 0x000F03FF 0x000003FF + mask_write 0XF8006224 0x000F03FF 0x000003FF + mask_write 0XF80062A8 0x00000FF5 0x00000000 + mask_write 0XF80062AC 0xFFFFFFFF 0x00000000 + mask_write 0XF80062B0 0x003FFFFF 0x00005125 + mask_write 0XF80062B4 0x0003FFFF 0x000012A8 + mask_poll 0XF8000B74 0x00002000 + mask_write 0XF8006000 0x0001FFFF 0x00000085 + mask_poll 0XF8006054 0x00000007 +} +proc ps7_mio_init_data_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B40 0x00000FFF 0x00000600 + mask_write 0XF8000B44 0x00000FFF 0x00000600 + mask_write 0XF8000B48 0x00000FFF 0x00000672 + mask_write 0XF8000B4C 0x00000FFF 0x00000800 + mask_write 0XF8000B50 0x00000FFF 0x00000674 + mask_write 0XF8000B54 0x00000FFF 0x00000800 + mask_write 0XF8000B58 0x00000FFF 0x00000600 + mask_write 0XF8000B5C 0xFFFFFFFF 0x0018C068 + mask_write 0XF8000B60 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B64 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B68 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B6C 0x00007FFF 0x00000220 + mask_write 0XF8000B70 0x00000001 0x00000001 + mask_write 0XF8000B70 0x00000021 0x00000020 + mask_write 0XF8000B70 0x07FEFFFF 0x00000823 + mask_write 0XF8000700 0x00003F01 0x00001601 + mask_write 0XF8000704 0x00003FFF 0x00001602 + mask_write 0XF8000708 0x00003FFF 0x00000602 + mask_write 0XF800070C 0x00003FFF 0x00000602 + mask_write 0XF8000710 0x00003FFF 0x00000602 + mask_write 0XF8000714 0x00003FFF 0x00000602 + mask_write 0XF8000718 0x00003FFF 0x00000602 + mask_write 0XF800071C 0x00003FFF 0x00000600 + mask_write 0XF8000720 0x00003FFF 0x000006E0 + mask_write 0XF8000724 0x00003FFF 0x000016E1 + mask_write 0XF8000728 0x00003FFF 0x00000680 + mask_write 0XF800072C 0x00003FFF 0x00000680 + mask_write 0XF8000730 0x00003FFF 0x00000680 + mask_write 0XF8000734 0x00003FFF 0x00000680 + mask_write 0XF8000738 0x00003FFF 0x00000680 + mask_write 0XF800073C 0x00003FFF 0x00000680 + mask_write 0XF8000770 0x00003FFF 0x00001604 + mask_write 0XF8000774 0x00003FFF 0x00001605 + mask_write 0XF8000778 0x00003FFF 0x00001604 + mask_write 0XF800077C 0x00003FFF 0x00001605 + mask_write 0XF8000780 0x00003FFF 0x00001604 + mask_write 0XF8000784 0x00003FFF 0x00001604 + mask_write 0XF8000788 0x00003FFF 0x00001604 + mask_write 0XF800078C 0x00003FFF 0x00001604 + mask_write 0XF8000790 0x00003FFF 0x00001605 + mask_write 0XF8000794 0x00003FFF 0x00001604 + mask_write 0XF8000798 0x00003FFF 0x00001604 + mask_write 0XF800079C 0x00003FFF 0x00001604 + mask_write 0XF80007C0 0x00003FFF 0x00001640 + mask_write 0XF80007C4 0x00003FFF 0x00001640 + mask_write 0XF80007D0 0x00003FFF 0x00001600 + mask_write 0XF80007D4 0x00003FFF 0x00001600 + mask_write 0XF8000830 0x003F003F 0x00380037 + mask_write 0XF8000834 0x003F003F 0x00000039 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_peripherals_init_data_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B48 0x00000180 0x00000180 + mask_write 0XF8000B4C 0x00000180 0x00000000 + mask_write 0XF8000B50 0x00000180 0x00000180 + mask_write 0XF8000B54 0x00000180 0x00000000 + mwr -force 0XF8000004 0x0000767B + mask_write 0XE0001034 0x000000FF 0x00000006 + mask_write 0XE0001018 0x0000FFFF 0x0000007C + mask_write 0XE0001000 0x000001FF 0x00000017 + mask_write 0XE0001004 0x000003FF 0x00000020 + mask_write 0XE0000034 0x000000FF 0x00000006 + mask_write 0XE0000018 0x0000FFFF 0x0000007C + mask_write 0XE0000000 0x000001FF 0x00000017 + mask_write 0XE0000004 0x000003FF 0x00000020 + mask_write 0XE000D000 0x00080000 0x00080000 + mask_write 0XF8007000 0x20000000 0x00000000 + mask_write 0XE000A204 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_write 0XE000A208 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 +} +proc ps7_post_config_3_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000900 0x0000000F 0x0000000F + mask_write 0XF8000240 0xFFFFFFFF 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_debug_3_0 {} { + mwr -force 0XF8898FB0 0xC5ACCE55 + mwr -force 0XF8899FB0 0xC5ACCE55 + mwr -force 0XF8809FB0 0xC5ACCE55 +} +proc ps7_pll_init_data_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000110 0x003FFFF0 0x000FA220 + mask_write 0XF8000100 0x0007F000 0x00028000 + mask_write 0XF8000100 0x00000010 0x00000010 + mask_write 0XF8000100 0x00000001 0x00000001 + mask_write 0XF8000100 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000001 + mask_write 0XF8000100 0x00000010 0x00000000 + mask_write 0XF8000120 0x1F003F30 0x1F000200 + mask_write 0XF8000114 0x003FFFF0 0x0012C220 + mask_write 0XF8000104 0x0007F000 0x00020000 + mask_write 0XF8000104 0x00000010 0x00000010 + mask_write 0XF8000104 0x00000001 0x00000001 + mask_write 0XF8000104 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000002 + mask_write 0XF8000104 0x00000010 0x00000000 + mask_write 0XF8000124 0xFFF00003 0x0C200003 + mask_write 0XF8000118 0x003FFFF0 0x001452C0 + mask_write 0XF8000108 0x0007F000 0x0001E000 + mask_write 0XF8000108 0x00000010 0x00000010 + mask_write 0XF8000108 0x00000001 0x00000001 + mask_write 0XF8000108 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000004 + mask_write 0XF8000108 0x00000010 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_clock_init_data_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000128 0x03F03F01 0x00700F01 + mask_write 0XF800014C 0x00003F31 0x00000501 + mask_write 0XF8000150 0x00003F33 0x00000A03 + mask_write 0XF8000154 0x00003F33 0x00000A03 + mask_write 0XF8000158 0x00003F33 0x00000603 + mask_write 0XF8000168 0x00003F31 0x00000501 + mask_write 0XF8000170 0x03F03F30 0x00400500 + mask_write 0XF8000180 0x03F03F30 0x00200500 + mask_write 0XF80001C4 0x00000001 0x00000001 + mask_write 0XF800012C 0x01FFCCCD 0x01FCCC0D + mwr -force 0XF8000004 0x0000767B +} +proc ps7_ddr_init_data_2_0 {} { + mask_write 0XF8006000 0x0001FFFF 0x00000084 + mask_write 0XF8006004 0x1FFFFFFF 0x00081081 + mask_write 0XF8006008 0x03FFFFFF 0x03C0780F + mask_write 0XF800600C 0x03FFFFFF 0x02001001 + mask_write 0XF8006010 0x03FFFFFF 0x00014001 + mask_write 0XF8006014 0x001FFFFF 0x0004281B + mask_write 0XF8006018 0xF7FFFFFF 0x44E458D2 + mask_write 0XF800601C 0xFFFFFFFF 0x720238E5 + mask_write 0XF8006020 0xFFFFFFFC 0x272872D0 + mask_write 0XF8006024 0x0FFFFFFF 0x0000003C + mask_write 0XF8006028 0x00003FFF 0x00002007 + mask_write 0XF800602C 0xFFFFFFFF 0x00000008 + mask_write 0XF8006030 0xFFFFFFFF 0x00040930 + mask_write 0XF8006034 0x13FF3FFF 0x000116D4 + mask_write 0XF8006038 0x00001FC3 0x00000000 + mask_write 0XF800603C 0x000FFFFF 0x00000666 + mask_write 0XF8006040 0xFFFFFFFF 0xFFFF0000 + mask_write 0XF8006044 0x0FFFFFFF 0x0F555555 + mask_write 0XF8006048 0x3FFFFFFF 0x0003C248 + mask_write 0XF8006050 0xFF0F8FFF 0x77010800 + mask_write 0XF8006058 0x0001FFFF 0x00000101 + mask_write 0XF800605C 0x0000FFFF 0x00005003 + mask_write 0XF8006060 0x000017FF 0x0000003E + mask_write 0XF8006064 0x00021FE0 0x00020000 + mask_write 0XF8006068 0x03FFFFFF 0x00284141 + mask_write 0XF800606C 0x0000FFFF 0x00001610 + mask_write 0XF8006078 0x03FFFFFF 0x00466111 + mask_write 0XF800607C 0x000FFFFF 0x00032222 + mask_write 0XF80060A0 0x00FFFFFF 0x00008000 + mask_write 0XF80060A4 0xFFFFFFFF 0x10200802 + mask_write 0XF80060A8 0x0FFFFFFF 0x0690CB73 + mask_write 0XF80060AC 0x000001FF 0x000001FE + mask_write 0XF80060B0 0x1FFFFFFF 0x1CFFFFFF + mask_write 0XF80060B4 0x000007FF 0x00000200 + mask_write 0XF80060B8 0x01FFFFFF 0x00200066 + mask_write 0XF80060C4 0x00000003 0x00000000 + mask_write 0XF80060C8 0x000000FF 0x00000000 + mask_write 0XF80060DC 0x00000001 0x00000000 + mask_write 0XF80060F0 0x0000FFFF 0x00000000 + mask_write 0XF80060F4 0x0000000F 0x00000008 + mask_write 0XF8006114 0x000000FF 0x00000000 + mask_write 0XF8006118 0x7FFFFFFF 0x40000001 + mask_write 0XF800611C 0x7FFFFFFF 0x40000001 + mask_write 0XF8006120 0x7FFFFFFF 0x40000000 + mask_write 0XF8006124 0x7FFFFFFF 0x40000000 + mask_write 0XF800612C 0x000FFFFF 0x00029000 + mask_write 0XF8006130 0x000FFFFF 0x00029000 + mask_write 0XF8006134 0x000FFFFF 0x00029000 + mask_write 0XF8006138 0x000FFFFF 0x00029000 + mask_write 0XF8006140 0x000FFFFF 0x00000035 + mask_write 0XF8006144 0x000FFFFF 0x00000035 + mask_write 0XF8006148 0x000FFFFF 0x00000035 + mask_write 0XF800614C 0x000FFFFF 0x00000035 + mask_write 0XF8006154 0x000FFFFF 0x00000080 + mask_write 0XF8006158 0x000FFFFF 0x00000080 + mask_write 0XF800615C 0x000FFFFF 0x00000080 + mask_write 0XF8006160 0x000FFFFF 0x00000080 + mask_write 0XF8006168 0x001FFFFF 0x000000F9 + mask_write 0XF800616C 0x001FFFFF 0x000000F9 + mask_write 0XF8006170 0x001FFFFF 0x000000F9 + mask_write 0XF8006174 0x001FFFFF 0x000000F9 + mask_write 0XF800617C 0x000FFFFF 0x000000C0 + mask_write 0XF8006180 0x000FFFFF 0x000000C0 + mask_write 0XF8006184 0x000FFFFF 0x000000C0 + mask_write 0XF8006188 0x000FFFFF 0x000000C0 + mask_write 0XF8006190 0xFFFFFFFF 0x10040080 + mask_write 0XF8006194 0x000FFFFF 0x0001FC82 + mask_write 0XF8006204 0xFFFFFFFF 0x00000000 + mask_write 0XF8006208 0x000F03FF 0x000803FF + mask_write 0XF800620C 0x000F03FF 0x000803FF + mask_write 0XF8006210 0x000F03FF 0x000803FF + mask_write 0XF8006214 0x000F03FF 0x000803FF + mask_write 0XF8006218 0x000F03FF 0x000003FF + mask_write 0XF800621C 0x000F03FF 0x000003FF + mask_write 0XF8006220 0x000F03FF 0x000003FF + mask_write 0XF8006224 0x000F03FF 0x000003FF + mask_write 0XF80062A8 0x00000FF7 0x00000000 + mask_write 0XF80062AC 0xFFFFFFFF 0x00000000 + mask_write 0XF80062B0 0x003FFFFF 0x00005125 + mask_write 0XF80062B4 0x0003FFFF 0x000012A8 + mask_poll 0XF8000B74 0x00002000 + mask_write 0XF8006000 0x0001FFFF 0x00000085 + mask_poll 0XF8006054 0x00000007 +} +proc ps7_mio_init_data_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B40 0x00000FFF 0x00000600 + mask_write 0XF8000B44 0x00000FFF 0x00000600 + mask_write 0XF8000B48 0x00000FFF 0x00000672 + mask_write 0XF8000B4C 0x00000FFF 0x00000800 + mask_write 0XF8000B50 0x00000FFF 0x00000674 + mask_write 0XF8000B54 0x00000FFF 0x00000800 + mask_write 0XF8000B58 0x00000FFF 0x00000600 + mask_write 0XF8000B5C 0xFFFFFFFF 0x0018C068 + mask_write 0XF8000B60 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B64 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B68 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B6C 0x00007FFF 0x00000220 + mask_write 0XF8000B70 0x00000021 0x00000021 + mask_write 0XF8000B70 0x00000021 0x00000020 + mask_write 0XF8000B70 0x07FFFFFF 0x00000823 + mask_write 0XF8000700 0x00003F01 0x00001601 + mask_write 0XF8000704 0x00003FFF 0x00001602 + mask_write 0XF8000708 0x00003FFF 0x00000602 + mask_write 0XF800070C 0x00003FFF 0x00000602 + mask_write 0XF8000710 0x00003FFF 0x00000602 + mask_write 0XF8000714 0x00003FFF 0x00000602 + mask_write 0XF8000718 0x00003FFF 0x00000602 + mask_write 0XF800071C 0x00003FFF 0x00000600 + mask_write 0XF8000720 0x00003FFF 0x000006E0 + mask_write 0XF8000724 0x00003FFF 0x000016E1 + mask_write 0XF8000728 0x00003FFF 0x00000680 + mask_write 0XF800072C 0x00003FFF 0x00000680 + mask_write 0XF8000730 0x00003FFF 0x00000680 + mask_write 0XF8000734 0x00003FFF 0x00000680 + mask_write 0XF8000738 0x00003FFF 0x00000680 + mask_write 0XF800073C 0x00003FFF 0x00000680 + mask_write 0XF8000770 0x00003FFF 0x00001604 + mask_write 0XF8000774 0x00003FFF 0x00001605 + mask_write 0XF8000778 0x00003FFF 0x00001604 + mask_write 0XF800077C 0x00003FFF 0x00001605 + mask_write 0XF8000780 0x00003FFF 0x00001604 + mask_write 0XF8000784 0x00003FFF 0x00001604 + mask_write 0XF8000788 0x00003FFF 0x00001604 + mask_write 0XF800078C 0x00003FFF 0x00001604 + mask_write 0XF8000790 0x00003FFF 0x00001605 + mask_write 0XF8000794 0x00003FFF 0x00001604 + mask_write 0XF8000798 0x00003FFF 0x00001604 + mask_write 0XF800079C 0x00003FFF 0x00001604 + mask_write 0XF80007C0 0x00003FFF 0x00001640 + mask_write 0XF80007C4 0x00003FFF 0x00001640 + mask_write 0XF80007D0 0x00003FFF 0x00001600 + mask_write 0XF80007D4 0x00003FFF 0x00001600 + mask_write 0XF8000830 0x003F003F 0x00380037 + mask_write 0XF8000834 0x003F003F 0x00000039 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_peripherals_init_data_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B48 0x00000180 0x00000180 + mask_write 0XF8000B4C 0x00000180 0x00000000 + mask_write 0XF8000B50 0x00000180 0x00000180 + mask_write 0XF8000B54 0x00000180 0x00000000 + mwr -force 0XF8000004 0x0000767B + mask_write 0XE0001034 0x000000FF 0x00000006 + mask_write 0XE0001018 0x0000FFFF 0x0000007C + mask_write 0XE0001000 0x000001FF 0x00000017 + mask_write 0XE0001004 0x00000FFF 0x00000020 + mask_write 0XE0000034 0x000000FF 0x00000006 + mask_write 0XE0000018 0x0000FFFF 0x0000007C + mask_write 0XE0000000 0x000001FF 0x00000017 + mask_write 0XE0000004 0x00000FFF 0x00000020 + mask_write 0XE000D000 0x00080000 0x00080000 + mask_write 0XF8007000 0x20000000 0x00000000 + mask_write 0XE000A204 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_write 0XE000A208 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 +} +proc ps7_post_config_2_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000900 0x0000000F 0x0000000F + mask_write 0XF8000240 0xFFFFFFFF 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_debug_2_0 {} { + mwr -force 0XF8898FB0 0xC5ACCE55 + mwr -force 0XF8899FB0 0xC5ACCE55 + mwr -force 0XF8809FB0 0xC5ACCE55 +} +proc ps7_pll_init_data_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000110 0x003FFFF0 0x000FA220 + mask_write 0XF8000100 0x0007F000 0x00028000 + mask_write 0XF8000100 0x00000010 0x00000010 + mask_write 0XF8000100 0x00000001 0x00000001 + mask_write 0XF8000100 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000001 + mask_write 0XF8000100 0x00000010 0x00000000 + mask_write 0XF8000120 0x1F003F30 0x1F000200 + mask_write 0XF8000114 0x003FFFF0 0x0012C220 + mask_write 0XF8000104 0x0007F000 0x00020000 + mask_write 0XF8000104 0x00000010 0x00000010 + mask_write 0XF8000104 0x00000001 0x00000001 + mask_write 0XF8000104 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000002 + mask_write 0XF8000104 0x00000010 0x00000000 + mask_write 0XF8000124 0xFFF00003 0x0C200003 + mask_write 0XF8000118 0x003FFFF0 0x001452C0 + mask_write 0XF8000108 0x0007F000 0x0001E000 + mask_write 0XF8000108 0x00000010 0x00000010 + mask_write 0XF8000108 0x00000001 0x00000001 + mask_write 0XF8000108 0x00000001 0x00000000 + mask_poll 0XF800010C 0x00000004 + mask_write 0XF8000108 0x00000010 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_clock_init_data_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000128 0x03F03F01 0x00700F01 + mask_write 0XF800014C 0x00003F31 0x00000501 + mask_write 0XF8000150 0x00003F33 0x00000A03 + mask_write 0XF8000154 0x00003F33 0x00000A03 + mask_write 0XF8000158 0x00003F33 0x00000603 + mask_write 0XF8000168 0x00003F31 0x00000501 + mask_write 0XF8000170 0x03F03F30 0x00400500 + mask_write 0XF8000180 0x03F03F30 0x00200500 + mask_write 0XF80001C4 0x00000001 0x00000001 + mask_write 0XF800012C 0x01FFCCCD 0x01FCCC0D + mwr -force 0XF8000004 0x0000767B +} +proc ps7_ddr_init_data_1_0 {} { + mask_write 0XF8006000 0x0001FFFF 0x00000084 + mask_write 0XF8006004 0x1FFFFFFF 0x00081081 + mask_write 0XF8006008 0x03FFFFFF 0x03C0780F + mask_write 0XF800600C 0x03FFFFFF 0x02001001 + mask_write 0XF8006010 0x03FFFFFF 0x00014001 + mask_write 0XF8006014 0x001FFFFF 0x0004281B + mask_write 0XF8006018 0xF7FFFFFF 0x44E458D2 + mask_write 0XF800601C 0xFFFFFFFF 0x720238E5 + mask_write 0XF8006020 0xFFFFFFFC 0x272872D0 + mask_write 0XF8006024 0x0FFFFFFF 0x0000003C + mask_write 0XF8006028 0x00003FFF 0x00002007 + mask_write 0XF800602C 0xFFFFFFFF 0x00000008 + mask_write 0XF8006030 0xFFFFFFFF 0x00040930 + mask_write 0XF8006034 0x13FF3FFF 0x000116D4 + mask_write 0XF8006038 0x00001FC3 0x00000000 + mask_write 0XF800603C 0x000FFFFF 0x00000666 + mask_write 0XF8006040 0xFFFFFFFF 0xFFFF0000 + mask_write 0XF8006044 0x0FFFFFFF 0x0F555555 + mask_write 0XF8006048 0x3FFFFFFF 0x0003C248 + mask_write 0XF8006050 0xFF0F8FFF 0x77010800 + mask_write 0XF8006058 0x0001FFFF 0x00000101 + mask_write 0XF800605C 0x0000FFFF 0x00005003 + mask_write 0XF8006060 0x000017FF 0x0000003E + mask_write 0XF8006064 0x00021FE0 0x00020000 + mask_write 0XF8006068 0x03FFFFFF 0x00284141 + mask_write 0XF800606C 0x0000FFFF 0x00001610 + mask_write 0XF80060A0 0x00FFFFFF 0x00008000 + mask_write 0XF80060A4 0xFFFFFFFF 0x10200802 + mask_write 0XF80060A8 0x0FFFFFFF 0x0690CB73 + mask_write 0XF80060AC 0x000001FF 0x000001FE + mask_write 0XF80060B0 0x1FFFFFFF 0x1CFFFFFF + mask_write 0XF80060B4 0x000007FF 0x00000200 + mask_write 0XF80060B8 0x01FFFFFF 0x00200066 + mask_write 0XF80060C4 0x00000003 0x00000000 + mask_write 0XF80060C8 0x000000FF 0x00000000 + mask_write 0XF80060DC 0x00000001 0x00000000 + mask_write 0XF80060F0 0x0000FFFF 0x00000000 + mask_write 0XF80060F4 0x0000000F 0x00000008 + mask_write 0XF8006114 0x000000FF 0x00000000 + mask_write 0XF8006118 0x7FFFFFFF 0x40000001 + mask_write 0XF800611C 0x7FFFFFFF 0x40000001 + mask_write 0XF8006120 0x7FFFFFFF 0x40000000 + mask_write 0XF8006124 0x7FFFFFFF 0x40000000 + mask_write 0XF800612C 0x000FFFFF 0x00029000 + mask_write 0XF8006130 0x000FFFFF 0x00029000 + mask_write 0XF8006134 0x000FFFFF 0x00029000 + mask_write 0XF8006138 0x000FFFFF 0x00029000 + mask_write 0XF8006140 0x000FFFFF 0x00000035 + mask_write 0XF8006144 0x000FFFFF 0x00000035 + mask_write 0XF8006148 0x000FFFFF 0x00000035 + mask_write 0XF800614C 0x000FFFFF 0x00000035 + mask_write 0XF8006154 0x000FFFFF 0x00000080 + mask_write 0XF8006158 0x000FFFFF 0x00000080 + mask_write 0XF800615C 0x000FFFFF 0x00000080 + mask_write 0XF8006160 0x000FFFFF 0x00000080 + mask_write 0XF8006168 0x001FFFFF 0x000000F9 + mask_write 0XF800616C 0x001FFFFF 0x000000F9 + mask_write 0XF8006170 0x001FFFFF 0x000000F9 + mask_write 0XF8006174 0x001FFFFF 0x000000F9 + mask_write 0XF800617C 0x000FFFFF 0x000000C0 + mask_write 0XF8006180 0x000FFFFF 0x000000C0 + mask_write 0XF8006184 0x000FFFFF 0x000000C0 + mask_write 0XF8006188 0x000FFFFF 0x000000C0 + mask_write 0XF8006190 0xFFFFFFFF 0x10040080 + mask_write 0XF8006194 0x000FFFFF 0x0001FC82 + mask_write 0XF8006204 0xFFFFFFFF 0x00000000 + mask_write 0XF8006208 0x000F03FF 0x000803FF + mask_write 0XF800620C 0x000F03FF 0x000803FF + mask_write 0XF8006210 0x000F03FF 0x000803FF + mask_write 0XF8006214 0x000F03FF 0x000803FF + mask_write 0XF8006218 0x000F03FF 0x000003FF + mask_write 0XF800621C 0x000F03FF 0x000003FF + mask_write 0XF8006220 0x000F03FF 0x000003FF + mask_write 0XF8006224 0x000F03FF 0x000003FF + mask_write 0XF80062A8 0x00000FF7 0x00000000 + mask_write 0XF80062AC 0xFFFFFFFF 0x00000000 + mask_write 0XF80062B0 0x003FFFFF 0x00005125 + mask_write 0XF80062B4 0x0003FFFF 0x000012A8 + mask_poll 0XF8000B74 0x00002000 + mask_write 0XF8006000 0x0001FFFF 0x00000085 + mask_poll 0XF8006054 0x00000007 +} +proc ps7_mio_init_data_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B40 0x00000FFF 0x00000600 + mask_write 0XF8000B44 0x00000FFF 0x00000600 + mask_write 0XF8000B48 0x00000FFF 0x00000672 + mask_write 0XF8000B4C 0x00000FFF 0x00000800 + mask_write 0XF8000B50 0x00000FFF 0x00000674 + mask_write 0XF8000B54 0x00000FFF 0x00000800 + mask_write 0XF8000B58 0x00000FFF 0x00000600 + mask_write 0XF8000B5C 0xFFFFFFFF 0x0018C068 + mask_write 0XF8000B60 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B64 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B68 0xFFFFFFFF 0x00F98068 + mask_write 0XF8000B6C 0x000073FF 0x00000220 + mask_write 0XF8000B70 0x00000021 0x00000021 + mask_write 0XF8000B70 0x00000021 0x00000020 + mask_write 0XF8000B70 0x07FFFFFF 0x00000823 + mask_write 0XF8000700 0x00003F01 0x00001601 + mask_write 0XF8000704 0x00003FFF 0x00001602 + mask_write 0XF8000708 0x00003FFF 0x00000602 + mask_write 0XF800070C 0x00003FFF 0x00000602 + mask_write 0XF8000710 0x00003FFF 0x00000602 + mask_write 0XF8000714 0x00003FFF 0x00000602 + mask_write 0XF8000718 0x00003FFF 0x00000602 + mask_write 0XF800071C 0x00003FFF 0x00000600 + mask_write 0XF8000720 0x00003FFF 0x000006E0 + mask_write 0XF8000724 0x00003FFF 0x000016E1 + mask_write 0XF8000728 0x00003FFF 0x00000680 + mask_write 0XF800072C 0x00003FFF 0x00000680 + mask_write 0XF8000730 0x00003FFF 0x00000680 + mask_write 0XF8000734 0x00003FFF 0x00000680 + mask_write 0XF8000738 0x00003FFF 0x00000680 + mask_write 0XF800073C 0x00003FFF 0x00000680 + mask_write 0XF8000770 0x00003FFF 0x00001604 + mask_write 0XF8000774 0x00003FFF 0x00001605 + mask_write 0XF8000778 0x00003FFF 0x00001604 + mask_write 0XF800077C 0x00003FFF 0x00001605 + mask_write 0XF8000780 0x00003FFF 0x00001604 + mask_write 0XF8000784 0x00003FFF 0x00001604 + mask_write 0XF8000788 0x00003FFF 0x00001604 + mask_write 0XF800078C 0x00003FFF 0x00001604 + mask_write 0XF8000790 0x00003FFF 0x00001605 + mask_write 0XF8000794 0x00003FFF 0x00001604 + mask_write 0XF8000798 0x00003FFF 0x00001604 + mask_write 0XF800079C 0x00003FFF 0x00001604 + mask_write 0XF80007C0 0x00003FFF 0x00001640 + mask_write 0XF80007C4 0x00003FFF 0x00001640 + mask_write 0XF80007D0 0x00003FFF 0x00001600 + mask_write 0XF80007D4 0x00003FFF 0x00001600 + mask_write 0XF8000830 0x003F003F 0x00380037 + mask_write 0XF8000834 0x003F003F 0x00000039 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_peripherals_init_data_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000B48 0x00000180 0x00000180 + mask_write 0XF8000B4C 0x00000180 0x00000000 + mask_write 0XF8000B50 0x00000180 0x00000180 + mask_write 0XF8000B54 0x00000180 0x00000000 + mwr -force 0XF8000004 0x0000767B + mask_write 0XE0001034 0x000000FF 0x00000006 + mask_write 0XE0001018 0x0000FFFF 0x0000007C + mask_write 0XE0001000 0x000001FF 0x00000017 + mask_write 0XE0001004 0x00000FFF 0x00000020 + mask_write 0XE0000034 0x000000FF 0x00000006 + mask_write 0XE0000018 0x0000FFFF 0x0000007C + mask_write 0XE0000000 0x000001FF 0x00000017 + mask_write 0XE0000004 0x00000FFF 0x00000020 + mask_write 0XE000D000 0x00080000 0x00080000 + mask_write 0XF8007000 0x20000000 0x00000000 + mask_write 0XE000A204 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 + mask_write 0XE000A208 0xFFFFFFFF 0x00000080 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0000 + mask_delay 0XF8F00200 1 + mask_write 0XE000A000 0xFFFFFFFF 0xFF7F0080 +} +proc ps7_post_config_1_0 {} { + mwr -force 0XF8000008 0x0000DF0D + mask_write 0XF8000900 0x0000000F 0x0000000F + mask_write 0XF8000240 0xFFFFFFFF 0x00000000 + mwr -force 0XF8000004 0x0000767B +} +proc ps7_debug_1_0 {} { + mwr -force 0XF8898FB0 0xC5ACCE55 + mwr -force 0XF8899FB0 0xC5ACCE55 + mwr -force 0XF8809FB0 0xC5ACCE55 +} +set PCW_SILICON_VER_1_0 "0x0" +set PCW_SILICON_VER_2_0 "0x1" +set PCW_SILICON_VER_3_0 "0x2" +set APU_FREQ 666666666 + + + +proc mask_poll { addr mask } { + set count 1 + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval & $mask}] + while { $maskedval == 0 } { + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval & $mask}] + set count [ expr { $count + 1 } ] + if { $count == 100000000 } { + puts "Timeout Reached. Mask poll failed at ADDRESS: $addr MASK: $mask" + break + } + } +} + + + +proc mask_delay { addr val } { + set delay [ get_number_of_cycles_for_delay $val ] + perf_reset_and_start_timer + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval < $delay}] + while { $maskedval == 1 } { + set curval "0x[string range [mrd $addr] end-8 end]" + set maskedval [expr {$curval < $delay}] + } + perf_reset_clock +} + +proc ps_version { } { + set si_ver "0x[string range [mrd 0xF8007080] end-8 end]" + set mask_sil_ver "0x[expr {$si_ver >> 28}]" + return $mask_sil_ver; +} + +proc ps7_post_config {} { + set saved_mode [configparams force-mem-accesses] + configparams force-mem-accesses 1 + + variable PCW_SILICON_VER_1_0 + variable PCW_SILICON_VER_2_0 + variable PCW_SILICON_VER_3_0 + set sil_ver [ps_version] + + if { $sil_ver == $PCW_SILICON_VER_1_0} { + ps7_post_config_1_0 + } elseif { $sil_ver == $PCW_SILICON_VER_2_0 } { + ps7_post_config_2_0 + } else { + ps7_post_config_3_0 + } + configparams force-mem-accesses $saved_mode +} + +proc ps7_debug {} { + variable PCW_SILICON_VER_1_0 + variable PCW_SILICON_VER_2_0 + variable PCW_SILICON_VER_3_0 + set sil_ver [ps_version] + + if { $sil_ver == $PCW_SILICON_VER_1_0} { + ps7_debug_1_0 + } elseif { $sil_ver == $PCW_SILICON_VER_2_0 } { + ps7_debug_2_0 + } else { + ps7_debug_3_0 + } +} +proc ps7_init {} { + variable PCW_SILICON_VER_1_0 + variable PCW_SILICON_VER_2_0 + variable PCW_SILICON_VER_3_0 + set sil_ver [ps_version] + if { $sil_ver == $PCW_SILICON_VER_1_0} { + ps7_mio_init_data_1_0 + ps7_pll_init_data_1_0 + ps7_clock_init_data_1_0 + ps7_ddr_init_data_1_0 + ps7_peripherals_init_data_1_0 + #puts "PCW Silicon Version : 1.0" + } elseif { $sil_ver == $PCW_SILICON_VER_2_0 } { + ps7_mio_init_data_2_0 + ps7_pll_init_data_2_0 + ps7_clock_init_data_2_0 + ps7_ddr_init_data_2_0 + ps7_peripherals_init_data_2_0 + #puts "PCW Silicon Version : 2.0" + } else { + ps7_mio_init_data_3_0 + ps7_pll_init_data_3_0 + ps7_clock_init_data_3_0 + ps7_ddr_init_data_3_0 + ps7_peripherals_init_data_3_0 + #puts "PCW Silicon Version : 3.0" + } +} + + +# For delay calculation using global timer + +# start timer + proc perf_start_clock { } { + + #writing SCU_GLOBAL_TIMER_CONTROL register + + mask_write 0xF8F00208 0x00000109 0x00000009 +} + +# stop timer and reset timer count regs + proc perf_reset_clock { } { + perf_disable_clock + mask_write 0xF8F00200 0xFFFFFFFF 0x00000000 + mask_write 0xF8F00204 0xFFFFFFFF 0x00000000 +} + +# Compute mask for given delay in miliseconds +proc get_number_of_cycles_for_delay { delay } { + + # GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + variable APU_FREQ + return [ expr ($delay * $APU_FREQ /(2 * 1000))] +} + + +# stop timer +proc perf_disable_clock {} { + mask_write 0xF8F00208 0xFFFFFFFF 0x00000000 +} + +proc perf_reset_and_start_timer {} { + perf_reset_clock + perf_start_clock +} + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.c b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.c new file mode 100644 index 0000000..52d7d38 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.c @@ -0,0 +1,10629 @@ +/****************************************************************************** +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along +* with this program; if not, see +* +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file ps7_init_gpl.c +* +* This file is automatically generated +* +*****************************************************************************/ + +#include "ps7_init_gpl.h" + +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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00001081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 + // .. .. reserved_reg_ddrc_rank0_wr_odt = 0x1 + // .. .. ==> 0XF8006048[5:3] = 0x00000001U + // .. .. ==> MASK : 0x00000038U VAL : 0x00000008U + // .. .. reserved_reg_ddrc_rank0_rd_odt = 0x0 + // .. .. ==> 0XF8006048[2:0] = 0x00000000U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006048, 0x0003F03FU ,0x0003C008U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. FINISH: OCM REMAPPING + // .. START: DDRIOB SETTINGS + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. reserved_SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F98068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F98068U), + // .. reserved_DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. reserved_DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. reserved_VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. reserved_REFIO_TEST = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. reserved_REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. reserved_DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. reserved_CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x00007FFFU ,0x00000220U), + // .. .. 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 + // .. .. reserved_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 + // .. .. reserved_VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reserved_VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reserved_VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. reserved_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[15:14] = 0x00000000U + // .. .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. reserved_INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reserved_TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reserved_TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reserved_TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. reserved_TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reserved_INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FEFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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 + // .. .. START: AFI2 SECURE REGISTER + // .. .. FINISH: AFI2 SECURE REGISTER + // .. FINISH: AFI REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_3_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_2_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. 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 = 0x0 + // .. ==> 0XF8000B6C[11:10] = 0x00000000U + // .. ==> MASK : 0x00000C00U VAL : 0x00000000U + // .. 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 ,0x00000220U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_2_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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_WRITE(0XF8000004, 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_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0xf + // .. ==> 0XF8000128[13:8] = 0x0000000FU + // .. ==> MASK : 0x00003F00U VAL : 0x00000F00U + // .. DIVISOR1 = 0x7 + // .. ==> 0XF8000128[25:20] = 0x00000007U + // .. ==> MASK : 0x03F00000U VAL : 0x00700000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00700F01U), + // .. 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 = 0x1 + // .. ==> 0XF8000150[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0xa + // .. ==> 0XF8000150[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00000A03U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A03U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000158[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000158[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000158[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x6 + // .. ==> 0XF8000158[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. + EMIT_MASKWRITE(0XF8000158, 0x00003F33U ,0x00000603U), + // .. .. START: TRACE CLOCK + // .. .. FINISH: TRACE CLOCK + // .. .. 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 = 0x5 + // .. .. ==> 0XF8000170[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x4 + // .. .. ==> 0XF8000170[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00400500U), + // .. .. SRCSEL = 0x0 + // .. .. ==> 0XF8000180[5:4] = 0x00000000U + // .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. DIVISOR0 = 0x5 + // .. .. ==> 0XF8000180[13:8] = 0x00000005U + // .. .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. .. DIVISOR1 = 0x2 + // .. .. ==> 0XF8000180[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00200500U), + // .. .. 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 = 0x0 + // .. .. ==> 0XF800012C[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. 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 = 0x1 + // .. .. ==> 0XF800012C[11:11] = 0x00000001U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. .. SPI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. SPI1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. 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 ,0x01FCCC0DU), + // .. 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_WRITE(0XF8000004, 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000084U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0xa0 + // .. .. ==> 0XF8006014[13:6] = 0x000000A0U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002800U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004281BU), + // .. .. 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 = 0x16 + // .. .. ==> 0XF8006018[15:10] = 0x00000016U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005800U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. 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 ,0x44E458D2U), + // .. .. 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 = 0x16d + // .. .. ==> 0XF8006034[13:4] = 0x0000016DU + // .. .. ==> MASK : 0x00003FF0U VAL : 0x000016D0U + // .. .. 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 ,0x000116D4U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF800603C[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x6 + // .. .. ==> 0XF800603C[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x6 + // .. .. ==> 0XF800603C[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. 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 ,0x00000666U), + // .. .. 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 = 0xf + // .. .. ==> 0XF8006040[19:16] = 0x0000000FU + // .. .. ==> MASK : 0x000F0000U VAL : 0x000F0000U + // .. .. 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 ,0xFFFF0000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x5 + // .. .. ==> 0XF8006044[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_addrmap_row_b1 = 0x5 + // .. .. ==> 0XF8006044[7:4] = 0x00000005U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000050U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x5 + // .. .. ==> 0XF8006044[11:8] = 0x00000005U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000500U + // .. .. reg_ddrc_addrmap_row_b12 = 0x5 + // .. .. ==> 0XF8006044[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x5 + // .. .. ==> 0XF8006044[19:16] = 0x00000005U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00050000U + // .. .. reg_ddrc_addrmap_row_b14 = 0x5 + // .. .. ==> 0XF8006044[23:20] = 0x00000005U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00500000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F555555U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 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 = 0x0 + // .. .. ==> 0XF8006120[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_data_slice_in_use = 0x0 + // .. .. ==> 0XF8006124[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 ,0x40000000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF800612C[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006130[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006134[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00029000U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0xa4 + // .. .. ==> 0XF8006138[19:10] = 0x000000A4U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00029000U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00029000U), + // .. .. 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 = 0x80 + // .. .. ==> 0XF8006154[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006158[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF800615C[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x80 + // .. .. ==> 0XF8006160[9:0] = 0x00000080U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000080U + // .. .. 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 ,0x00000080U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006168[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF800616C[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006170[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xf9 + // .. .. ==> 0XF8006174[10:0] = 0x000000F9U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000F9U + // .. .. 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 ,0x000000F9U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF800617C[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006180[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006184[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. reg_phy_wr_data_slave_ratio = 0xc0 + // .. .. ==> 0XF8006188[9:0] = 0x000000C0U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000C0U + // .. .. 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 ,0x000000C0U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 = 0x1 + // .. .. ==> 0XF8006000[3:2] = 0x00000001U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000004U + // .. .. 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 ,0x00000085U), + // .. .. 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_1_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_WRITE(0XF8000008, 0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B4C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B4C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B4C[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B4C[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B54[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B54[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 = 0x0 + // .. ==> 0XF8000B54[10:9] = 0x00000000U + // .. ==> MASK : 0x00000600U VAL : 0x00000000U + // .. PULLUP_EN = 0x1 + // .. ==> 0XF8000B54[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000800U), + // .. 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 = 0x68 + // .. ==> 0XF8000B5C[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B5C[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B60[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B60[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B64[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B64[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. 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 ,0x00F98068U), + // .. DRIVE_P = 0x68 + // .. ==> 0XF8000B68[6:0] = 0x00000068U + // .. ==> MASK : 0x0000007FU VAL : 0x00000068U + // .. DRIVE_N = 0x0 + // .. ==> 0XF8000B68[13:7] = 0x00000000U + // .. ==> MASK : 0x00003F80U VAL : 0x00000000U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F98068U), + // .. 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 = 0x1 + // .. ==> 0XF8000B6C[6:5] = 0x00000001U + // .. ==> MASK : 0x00000060U VAL : 0x00000020U + // .. 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 ,0x00000220U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001601U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001602U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000602U), + // .. 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 = 0 + // .. ==> 0XF8000720[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF8000720[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x000006E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000724[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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 = 7 + // .. ==> 0XF8000724[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x000016E1U), + // .. 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 = 4 + // .. ==> 0XF8000728[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000728[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800072C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800072C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000730[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000734[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF8000738[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 4 + // .. ==> 0XF800073C[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. 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 ,0x00000680U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000770[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000770[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000774[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000774[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000778[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000778[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800077C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800077C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000780[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000780[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000784[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000784[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000788[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000788[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800078C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800078C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000790[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000790[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00001605U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000794[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000794[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000798[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000798[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00001604U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800079C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800079C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00001604U), + // .. 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 = 2 + // .. ==> 0XF80007C0[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C4[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007C4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x00001640U), + // .. 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 = 0 + // .. ==> 0XF80007D0[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D0[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001600U), + // .. 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 = 0 + // .. ==> 0XF80007D4[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF80007D4[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001600U), + // .. SDIO0_WP_SEL = 55 + // .. ==> 0XF8000830[5:0] = 0x00000037U + // .. ==> MASK : 0x0000003FU VAL : 0x00000037U + // .. SDIO0_CD_SEL = 56 + // .. ==> 0XF8000830[21:16] = 0x00000038U + // .. ==> MASK : 0x003F0000U VAL : 0x00380000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x00380037U), + // .. SDIO1_WP_SEL = 57 + // .. ==> 0XF8000834[5:0] = 0x00000039U + // .. ==> MASK : 0x0000003FU VAL : 0x00000039U + // .. SDIO1_CD_SEL = 0 + // .. ==> 0XF8000834[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000834, 0x003F003FU ,0x00000039U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 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_WRITE(0XF8000008, 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 = 0x0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000000U), + // .. 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 = 0x0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000000U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0001018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000007CU), + // .. 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 = 0x6 + // .. ==> 0XE0000034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000006U), + // .. CD = 0x7c + // .. ==> 0XE0000018[15:0] = 0x0000007CU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000007CU + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x0000007CU), + // .. 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: USB0 RESET + // .. .. .. .. START: DIR MODE BANK 0 + // .. .. .. .. DIRECTION_0 = 0x80 + // .. .. .. .. ==> 0XE000A204[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. .. START: DIR MODE BANK 1 + // .. .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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 + // .. .. .. .. OP_ENABLE_0 = 0x80 + // .. .. .. .. ==> 0XE000A208[31:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00000080U), + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x0 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. .. 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: ADD 1 MS DELAY + // .. .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. .. DATA_0_LSW = 0x80 + // .. .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. .. 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: USB0 RESET + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. FINISH: I2C RESET + // .. .. START: NOR CHIP SELECT + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. FINISH: NOR CHIP SELECT + // .. 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_WRITE(0XF8000008, 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 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_WRITE(0XF8000004, 0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_debug_1_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8898FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8899FB0, 0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_WRITE(0XF8809FB0, 0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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 ) { + volatile unsigned long *addr = (volatile 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; + case OPCODE_MASKDELAY: + addr = (unsigned long*) args[0]; + mask = args[1]; + int delay = get_number_of_cycles_for_delay(mask); + perf_reset_and_start_timer(); + while ((*addr < delay)) { + } + 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_debug() +{ + // 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_debug_1_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else if (si_ver == PCW_SILICON_VERSION_2) { + ret = ps7_config (ps7_debug_2_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else { + ret = ps7_config (ps7_debug_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 ret; + //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 + 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; +} + + + + +/* For delay calculation using global timer */ + +/* start timer */ + void perf_start_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = ((1 << 0) | // Timer Enable + (1 << 3) | // Auto-increment + (0 << 8) // Pre-scale + ); +} + +/* stop timer and reset timer count regs */ + void perf_reset_clock(void) +{ + perf_disable_clock(); + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_L32 = 0; + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_U32 = 0; +} + +/* Compute mask for given delay in miliseconds*/ +int get_number_of_cycles_for_delay(unsigned int delay) +{ + // GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + return (APU_FREQ*delay/(2*1000)); + +} + +/* stop timer */ + void perf_disable_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = 0; +} + +void perf_reset_and_start_timer() +{ + perf_reset_clock(); + perf_start_clock(); +} + + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.h b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.h new file mode 100644 index 0000000..bb95e06 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_init_gpl.h @@ -0,0 +1,137 @@ + +/****************************************************************************** +* +* (c) Copyright 2010-2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this +* software and associated documentation files (the "Software"), to deal in the Software +* without restriction, including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, and to permit +* persons to whom the Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* Use of the Software is limited solely to applications: (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used in advertising or +* otherwise to promote the sale, use or other dealings in this Software without prior written +* authorization from Xilinx. +* +*******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 OPCODE_MASKDELAY 5U +#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 +#define EMIT_MASKDELAY(addr,mask) ( (OPCODE_MASKDELAY << 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 666666687 +#define DDR_FREQ 533333374 +#define DCI_FREQ 10158730 +#define QSPI_FREQ 200000000 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 125000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 100000000 +#define UART_FREQ 100000000 +#define SPI_FREQ 166666672 +#define I2C_FREQ 111111115 +#define WDT_FREQ 111111115 +#define TTC_FREQ 50000000 +#define CAN_FREQ 10000000 +#define PCAP_FREQ 200000000 +#define TPIU_FREQ 200000000 +#define FPGA0_FREQ 50000000 +#define FPGA1_FREQ 100000000 +#define FPGA2_FREQ 10000000 +#define FPGA3_FREQ 10000000 + + +/* For delay calculation using global registers*/ +#define SCU_GLOBAL_TIMER_COUNT_L32 0xF8F00200 +#define SCU_GLOBAL_TIMER_COUNT_U32 0xF8F00204 +#define SCU_GLOBAL_TIMER_CONTROL 0xF8F00208 +#define SCU_GLOBAL_TIMER_AUTO_INC 0xF8F00218 + +int ps7_config( unsigned long*); +int ps7_init(); +int ps7_post_config(); +int ps7_debug(); +char* getPS7MessageInfo(unsigned key); + +void perf_start_clock(void); +void perf_disable_clock(void); +void perf_reset_clock(void); +void perf_reset_and_start_timer(); +int get_number_of_cycles_for_delay(unsigned int delay); +#ifdef __cplusplus +} +#endif + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_parameters.xml b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_parameters.xml new file mode 100644 index 0000000..d2f7bcd --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/ps7_parameters.xml @@ -0,0 +1,643 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/sim/design_1_processing_system7_0_0.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/sim/design_1_processing_system7_0_0.v new file mode 100644 index 0000000..65b0825 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/sim/design_1_processing_system7_0_0.v @@ -0,0 +1,704 @@ + + + +// (c) Copyright 1995-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. +// +// DO NOT MODIFY THIS FILE. + + +// IP VLNV: xilinx.com:ip:processing_system7_vip:1.0 +// IP Revision: 1 + +`timescale 1ns/1ps + +module design_1_processing_system7_0_0 ( +GPIO_I, +GPIO_O, +GPIO_T, +I2C0_SDA_I, +I2C0_SDA_O, +I2C0_SDA_T, +I2C0_SCL_I, +I2C0_SCL_O, +I2C0_SCL_T, +SDIO0_CLK, +SDIO0_CLK_FB, +SDIO0_CMD_O, +SDIO0_CMD_I, +SDIO0_CMD_T, +SDIO0_DATA_I, +SDIO0_DATA_O, +SDIO0_DATA_T, +SDIO0_LED, +SDIO0_CDN, +SDIO0_WP, +SDIO0_BUSPOW, +SDIO0_BUSVOLT, +SPI0_SCLK_I, +SPI0_SCLK_O, +SPI0_SCLK_T, +SPI0_MOSI_I, +SPI0_MOSI_O, +SPI0_MOSI_T, +SPI0_MISO_I, +SPI0_MISO_O, +SPI0_MISO_T, +SPI0_SS_I, +SPI0_SS_O, +SPI0_SS1_O, +SPI0_SS2_O, +SPI0_SS_T, +SPI1_SCLK_I, +SPI1_SCLK_O, +SPI1_SCLK_T, +SPI1_MOSI_I, +SPI1_MOSI_O, +SPI1_MOSI_T, +SPI1_MISO_I, +SPI1_MISO_O, +SPI1_MISO_T, +SPI1_SS_I, +SPI1_SS_O, +SPI1_SS1_O, +SPI1_SS2_O, +SPI1_SS_T, +UART0_TX, +UART0_RX, +TTC0_WAVE0_OUT, +TTC0_WAVE1_OUT, +TTC0_WAVE2_OUT, +TTC1_WAVE0_OUT, +TTC1_WAVE1_OUT, +TTC1_WAVE2_OUT, +USB0_PORT_INDCTL, +USB0_VBUS_PWRSELECT, +USB0_VBUS_PWRFAULT, +M_AXI_GP0_ARVALID, +M_AXI_GP0_AWVALID, +M_AXI_GP0_BREADY, +M_AXI_GP0_RREADY, +M_AXI_GP0_WLAST, +M_AXI_GP0_WVALID, +M_AXI_GP0_ARID, +M_AXI_GP0_AWID, +M_AXI_GP0_WID, +M_AXI_GP0_ARBURST, +M_AXI_GP0_ARLOCK, +M_AXI_GP0_ARSIZE, +M_AXI_GP0_AWBURST, +M_AXI_GP0_AWLOCK, +M_AXI_GP0_AWSIZE, +M_AXI_GP0_ARPROT, +M_AXI_GP0_AWPROT, +M_AXI_GP0_ARADDR, +M_AXI_GP0_AWADDR, +M_AXI_GP0_WDATA, +M_AXI_GP0_ARCACHE, +M_AXI_GP0_ARLEN, +M_AXI_GP0_ARQOS, +M_AXI_GP0_AWCACHE, +M_AXI_GP0_AWLEN, +M_AXI_GP0_AWQOS, +M_AXI_GP0_WSTRB, +M_AXI_GP0_ACLK, +M_AXI_GP0_ARREADY, +M_AXI_GP0_AWREADY, +M_AXI_GP0_BVALID, +M_AXI_GP0_RLAST, +M_AXI_GP0_RVALID, +M_AXI_GP0_WREADY, +M_AXI_GP0_BID, +M_AXI_GP0_RID, +M_AXI_GP0_BRESP, +M_AXI_GP0_RRESP, +M_AXI_GP0_RDATA, +IRQ_F2P, +FCLK_CLK0, +FCLK_CLK1, +FCLK_RESET0_N, +MIO, +DDR_CAS_n, +DDR_CKE, +DDR_Clk_n, +DDR_Clk, +DDR_CS_n, +DDR_DRSTB, +DDR_ODT, +DDR_RAS_n, +DDR_WEB, +DDR_BankAddr, +DDR_Addr, +DDR_VRN, +DDR_VRP, +DDR_DM, +DDR_DQ, +DDR_DQS_n, +DDR_DQS, +PS_SRSTB, +PS_CLK, +PS_PORB +); +input [63 : 0] GPIO_I; +output [63 : 0] GPIO_O; +output [63 : 0] GPIO_T; +input I2C0_SDA_I; +output I2C0_SDA_O; +output I2C0_SDA_T; +input I2C0_SCL_I; +output I2C0_SCL_O; +output I2C0_SCL_T; +output SDIO0_CLK; +input SDIO0_CLK_FB; +output SDIO0_CMD_O; +input SDIO0_CMD_I; +output SDIO0_CMD_T; +input [3 : 0] SDIO0_DATA_I; +output [3 : 0] SDIO0_DATA_O; +output [3 : 0] SDIO0_DATA_T; +output SDIO0_LED; +input SDIO0_CDN; +input SDIO0_WP; +output SDIO0_BUSPOW; +output [2 : 0] SDIO0_BUSVOLT; +input SPI0_SCLK_I; +output SPI0_SCLK_O; +output SPI0_SCLK_T; +input SPI0_MOSI_I; +output SPI0_MOSI_O; +output SPI0_MOSI_T; +input SPI0_MISO_I; +output SPI0_MISO_O; +output SPI0_MISO_T; +input SPI0_SS_I; +output SPI0_SS_O; +output SPI0_SS1_O; +output SPI0_SS2_O; +output SPI0_SS_T; +input SPI1_SCLK_I; +output SPI1_SCLK_O; +output SPI1_SCLK_T; +input SPI1_MOSI_I; +output SPI1_MOSI_O; +output SPI1_MOSI_T; +input SPI1_MISO_I; +output SPI1_MISO_O; +output SPI1_MISO_T; +input SPI1_SS_I; +output SPI1_SS_O; +output SPI1_SS1_O; +output SPI1_SS2_O; +output SPI1_SS_T; +output UART0_TX; +input UART0_RX; +output TTC0_WAVE0_OUT; +output TTC0_WAVE1_OUT; +output TTC0_WAVE2_OUT; +output TTC1_WAVE0_OUT; +output TTC1_WAVE1_OUT; +output TTC1_WAVE2_OUT; +output [1 : 0] USB0_PORT_INDCTL; +output USB0_VBUS_PWRSELECT; +input USB0_VBUS_PWRFAULT; +output M_AXI_GP0_ARVALID; +output M_AXI_GP0_AWVALID; +output M_AXI_GP0_BREADY; +output M_AXI_GP0_RREADY; +output M_AXI_GP0_WLAST; +output M_AXI_GP0_WVALID; +output [11 : 0] M_AXI_GP0_ARID; +output [11 : 0] M_AXI_GP0_AWID; +output [11 : 0] M_AXI_GP0_WID; +output [1 : 0] M_AXI_GP0_ARBURST; +output [1 : 0] M_AXI_GP0_ARLOCK; +output [2 : 0] M_AXI_GP0_ARSIZE; +output [1 : 0] M_AXI_GP0_AWBURST; +output [1 : 0] M_AXI_GP0_AWLOCK; +output [2 : 0] M_AXI_GP0_AWSIZE; +output [2 : 0] M_AXI_GP0_ARPROT; +output [2 : 0] M_AXI_GP0_AWPROT; +output [31 : 0] M_AXI_GP0_ARADDR; +output [31 : 0] M_AXI_GP0_AWADDR; +output [31 : 0] M_AXI_GP0_WDATA; +output [3 : 0] M_AXI_GP0_ARCACHE; +output [3 : 0] M_AXI_GP0_ARLEN; +output [3 : 0] M_AXI_GP0_ARQOS; +output [3 : 0] M_AXI_GP0_AWCACHE; +output [3 : 0] M_AXI_GP0_AWLEN; +output [3 : 0] M_AXI_GP0_AWQOS; +output [3 : 0] M_AXI_GP0_WSTRB; +input M_AXI_GP0_ACLK; +input M_AXI_GP0_ARREADY; +input M_AXI_GP0_AWREADY; +input M_AXI_GP0_BVALID; +input M_AXI_GP0_RLAST; +input M_AXI_GP0_RVALID; +input M_AXI_GP0_WREADY; +input [11 : 0] M_AXI_GP0_BID; +input [11 : 0] M_AXI_GP0_RID; +input [1 : 0] M_AXI_GP0_BRESP; +input [1 : 0] M_AXI_GP0_RRESP; +input [31 : 0] M_AXI_GP0_RDATA; +input [0 : 0] IRQ_F2P; +output FCLK_CLK0; +output FCLK_CLK1; +output FCLK_RESET0_N; +input [31 : 0] MIO; +input DDR_CAS_n; +input DDR_CKE; +input DDR_Clk_n; +input DDR_Clk; +input DDR_CS_n; +input DDR_DRSTB; +input DDR_ODT; +input DDR_RAS_n; +input DDR_WEB; +input [2 : 0] DDR_BankAddr; +input [14 : 0] DDR_Addr; +input DDR_VRN; +input DDR_VRP; +input [1 : 0] DDR_DM; +input [15 : 0] DDR_DQ; +input [1 : 0] DDR_DQS_n; +input [1 : 0] DDR_DQS; +input PS_SRSTB; +input PS_CLK; +input PS_PORB; + + processing_system7_vip_v1_0_5 #( + .C_USE_M_AXI_GP0(1), + .C_USE_M_AXI_GP1(0), + .C_USE_S_AXI_ACP(0), + .C_USE_S_AXI_GP0(0), + .C_USE_S_AXI_GP1(0), + .C_USE_S_AXI_HP0(0), + .C_USE_S_AXI_HP1(0), + .C_USE_S_AXI_HP2(0), + .C_USE_S_AXI_HP3(0), + .C_S_AXI_HP0_DATA_WIDTH(64), + .C_S_AXI_HP1_DATA_WIDTH(64), + .C_S_AXI_HP2_DATA_WIDTH(64), + .C_S_AXI_HP3_DATA_WIDTH(64), + .C_HIGH_OCM_EN(0), + .C_FCLK_CLK0_FREQ(50.0), + .C_FCLK_CLK1_FREQ(100.0), + .C_FCLK_CLK2_FREQ(10.0), + .C_FCLK_CLK3_FREQ(10.0), + .C_M_AXI_GP0_ENABLE_STATIC_REMAP(0), + .C_M_AXI_GP1_ENABLE_STATIC_REMAP(0), + .C_M_AXI_GP0_THREAD_ID_WIDTH (12), + .C_M_AXI_GP1_THREAD_ID_WIDTH (12) + ) inst ( + .M_AXI_GP0_ARVALID(M_AXI_GP0_ARVALID), + .M_AXI_GP0_AWVALID(M_AXI_GP0_AWVALID), + .M_AXI_GP0_BREADY(M_AXI_GP0_BREADY), + .M_AXI_GP0_RREADY(M_AXI_GP0_RREADY), + .M_AXI_GP0_WLAST(M_AXI_GP0_WLAST), + .M_AXI_GP0_WVALID(M_AXI_GP0_WVALID), + .M_AXI_GP0_ARID(M_AXI_GP0_ARID), + .M_AXI_GP0_AWID(M_AXI_GP0_AWID), + .M_AXI_GP0_WID(M_AXI_GP0_WID), + .M_AXI_GP0_ARBURST(M_AXI_GP0_ARBURST), + .M_AXI_GP0_ARLOCK(M_AXI_GP0_ARLOCK), + .M_AXI_GP0_ARSIZE(M_AXI_GP0_ARSIZE), + .M_AXI_GP0_AWBURST(M_AXI_GP0_AWBURST), + .M_AXI_GP0_AWLOCK(M_AXI_GP0_AWLOCK), + .M_AXI_GP0_AWSIZE(M_AXI_GP0_AWSIZE), + .M_AXI_GP0_ARPROT(M_AXI_GP0_ARPROT), + .M_AXI_GP0_AWPROT(M_AXI_GP0_AWPROT), + .M_AXI_GP0_ARADDR(M_AXI_GP0_ARADDR), + .M_AXI_GP0_AWADDR(M_AXI_GP0_AWADDR), + .M_AXI_GP0_WDATA(M_AXI_GP0_WDATA), + .M_AXI_GP0_ARCACHE(M_AXI_GP0_ARCACHE), + .M_AXI_GP0_ARLEN(M_AXI_GP0_ARLEN), + .M_AXI_GP0_ARQOS(M_AXI_GP0_ARQOS), + .M_AXI_GP0_AWCACHE(M_AXI_GP0_AWCACHE), + .M_AXI_GP0_AWLEN(M_AXI_GP0_AWLEN), + .M_AXI_GP0_AWQOS(M_AXI_GP0_AWQOS), + .M_AXI_GP0_WSTRB(M_AXI_GP0_WSTRB), + .M_AXI_GP0_ACLK(M_AXI_GP0_ACLK), + .M_AXI_GP0_ARREADY(M_AXI_GP0_ARREADY), + .M_AXI_GP0_AWREADY(M_AXI_GP0_AWREADY), + .M_AXI_GP0_BVALID(M_AXI_GP0_BVALID), + .M_AXI_GP0_RLAST(M_AXI_GP0_RLAST), + .M_AXI_GP0_RVALID(M_AXI_GP0_RVALID), + .M_AXI_GP0_WREADY(M_AXI_GP0_WREADY), + .M_AXI_GP0_BID(M_AXI_GP0_BID), + .M_AXI_GP0_RID(M_AXI_GP0_RID), + .M_AXI_GP0_BRESP(M_AXI_GP0_BRESP), + .M_AXI_GP0_RRESP(M_AXI_GP0_RRESP), + .M_AXI_GP0_RDATA(M_AXI_GP0_RDATA), + .M_AXI_GP1_ARVALID(), + .M_AXI_GP1_AWVALID(), + .M_AXI_GP1_BREADY(), + .M_AXI_GP1_RREADY(), + .M_AXI_GP1_WLAST(), + .M_AXI_GP1_WVALID(), + .M_AXI_GP1_ARID(), + .M_AXI_GP1_AWID(), + .M_AXI_GP1_WID(), + .M_AXI_GP1_ARBURST(), + .M_AXI_GP1_ARLOCK(), + .M_AXI_GP1_ARSIZE(), + .M_AXI_GP1_AWBURST(), + .M_AXI_GP1_AWLOCK(), + .M_AXI_GP1_AWSIZE(), + .M_AXI_GP1_ARPROT(), + .M_AXI_GP1_AWPROT(), + .M_AXI_GP1_ARADDR(), + .M_AXI_GP1_AWADDR(), + .M_AXI_GP1_WDATA(), + .M_AXI_GP1_ARCACHE(), + .M_AXI_GP1_ARLEN(), + .M_AXI_GP1_ARQOS(), + .M_AXI_GP1_AWCACHE(), + .M_AXI_GP1_AWLEN(), + .M_AXI_GP1_AWQOS(), + .M_AXI_GP1_WSTRB(), + .M_AXI_GP1_ACLK(1'B0), + .M_AXI_GP1_ARREADY(1'B0), + .M_AXI_GP1_AWREADY(1'B0), + .M_AXI_GP1_BVALID(1'B0), + .M_AXI_GP1_RLAST(1'B0), + .M_AXI_GP1_RVALID(1'B0), + .M_AXI_GP1_WREADY(1'B0), + .M_AXI_GP1_BID(12'B0), + .M_AXI_GP1_RID(12'B0), + .M_AXI_GP1_BRESP(2'B0), + .M_AXI_GP1_RRESP(2'B0), + .M_AXI_GP1_RDATA(32'B0), + .S_AXI_GP0_ARREADY(), + .S_AXI_GP0_AWREADY(), + .S_AXI_GP0_BVALID(), + .S_AXI_GP0_RLAST(), + .S_AXI_GP0_RVALID(), + .S_AXI_GP0_WREADY(), + .S_AXI_GP0_BRESP(), + .S_AXI_GP0_RRESP(), + .S_AXI_GP0_RDATA(), + .S_AXI_GP0_BID(), + .S_AXI_GP0_RID(), + .S_AXI_GP0_ACLK(1'B0), + .S_AXI_GP0_ARVALID(1'B0), + .S_AXI_GP0_AWVALID(1'B0), + .S_AXI_GP0_BREADY(1'B0), + .S_AXI_GP0_RREADY(1'B0), + .S_AXI_GP0_WLAST(1'B0), + .S_AXI_GP0_WVALID(1'B0), + .S_AXI_GP0_ARBURST(2'B0), + .S_AXI_GP0_ARLOCK(2'B0), + .S_AXI_GP0_ARSIZE(3'B0), + .S_AXI_GP0_AWBURST(2'B0), + .S_AXI_GP0_AWLOCK(2'B0), + .S_AXI_GP0_AWSIZE(3'B0), + .S_AXI_GP0_ARPROT(3'B0), + .S_AXI_GP0_AWPROT(3'B0), + .S_AXI_GP0_ARADDR(32'B0), + .S_AXI_GP0_AWADDR(32'B0), + .S_AXI_GP0_WDATA(32'B0), + .S_AXI_GP0_ARCACHE(4'B0), + .S_AXI_GP0_ARLEN(4'B0), + .S_AXI_GP0_ARQOS(4'B0), + .S_AXI_GP0_AWCACHE(4'B0), + .S_AXI_GP0_AWLEN(4'B0), + .S_AXI_GP0_AWQOS(4'B0), + .S_AXI_GP0_WSTRB(4'B0), + .S_AXI_GP0_ARID(6'B0), + .S_AXI_GP0_AWID(6'B0), + .S_AXI_GP0_WID(6'B0), + .S_AXI_GP1_ARREADY(), + .S_AXI_GP1_AWREADY(), + .S_AXI_GP1_BVALID(), + .S_AXI_GP1_RLAST(), + .S_AXI_GP1_RVALID(), + .S_AXI_GP1_WREADY(), + .S_AXI_GP1_BRESP(), + .S_AXI_GP1_RRESP(), + .S_AXI_GP1_RDATA(), + .S_AXI_GP1_BID(), + .S_AXI_GP1_RID(), + .S_AXI_GP1_ACLK(1'B0), + .S_AXI_GP1_ARVALID(1'B0), + .S_AXI_GP1_AWVALID(1'B0), + .S_AXI_GP1_BREADY(1'B0), + .S_AXI_GP1_RREADY(1'B0), + .S_AXI_GP1_WLAST(1'B0), + .S_AXI_GP1_WVALID(1'B0), + .S_AXI_GP1_ARBURST(2'B0), + .S_AXI_GP1_ARLOCK(2'B0), + .S_AXI_GP1_ARSIZE(3'B0), + .S_AXI_GP1_AWBURST(2'B0), + .S_AXI_GP1_AWLOCK(2'B0), + .S_AXI_GP1_AWSIZE(3'B0), + .S_AXI_GP1_ARPROT(3'B0), + .S_AXI_GP1_AWPROT(3'B0), + .S_AXI_GP1_ARADDR(32'B0), + .S_AXI_GP1_AWADDR(32'B0), + .S_AXI_GP1_WDATA(32'B0), + .S_AXI_GP1_ARCACHE(4'B0), + .S_AXI_GP1_ARLEN(4'B0), + .S_AXI_GP1_ARQOS(4'B0), + .S_AXI_GP1_AWCACHE(4'B0), + .S_AXI_GP1_AWLEN(4'B0), + .S_AXI_GP1_AWQOS(4'B0), + .S_AXI_GP1_WSTRB(4'B0), + .S_AXI_GP1_ARID(6'B0), + .S_AXI_GP1_AWID(6'B0), + .S_AXI_GP1_WID(6'B0), + .S_AXI_ACP_ARREADY(), + .S_AXI_ACP_AWREADY(), + .S_AXI_ACP_BVALID(), + .S_AXI_ACP_RLAST(), + .S_AXI_ACP_RVALID(), + .S_AXI_ACP_WREADY(), + .S_AXI_ACP_BRESP(), + .S_AXI_ACP_RRESP(), + .S_AXI_ACP_BID(), + .S_AXI_ACP_RID(), + .S_AXI_ACP_RDATA(), + .S_AXI_ACP_ACLK(1'B0), + .S_AXI_ACP_ARVALID(1'B0), + .S_AXI_ACP_AWVALID(1'B0), + .S_AXI_ACP_BREADY(1'B0), + .S_AXI_ACP_RREADY(1'B0), + .S_AXI_ACP_WLAST(1'B0), + .S_AXI_ACP_WVALID(1'B0), + .S_AXI_ACP_ARID(3'B0), + .S_AXI_ACP_ARPROT(3'B0), + .S_AXI_ACP_AWID(3'B0), + .S_AXI_ACP_AWPROT(3'B0), + .S_AXI_ACP_WID(3'B0), + .S_AXI_ACP_ARADDR(32'B0), + .S_AXI_ACP_AWADDR(32'B0), + .S_AXI_ACP_ARCACHE(4'B0), + .S_AXI_ACP_ARLEN(4'B0), + .S_AXI_ACP_ARQOS(4'B0), + .S_AXI_ACP_AWCACHE(4'B0), + .S_AXI_ACP_AWLEN(4'B0), + .S_AXI_ACP_AWQOS(4'B0), + .S_AXI_ACP_ARBURST(2'B0), + .S_AXI_ACP_ARLOCK(2'B0), + .S_AXI_ACP_ARSIZE(3'B0), + .S_AXI_ACP_AWBURST(2'B0), + .S_AXI_ACP_AWLOCK(2'B0), + .S_AXI_ACP_AWSIZE(3'B0), + .S_AXI_ACP_ARUSER(5'B0), + .S_AXI_ACP_AWUSER(5'B0), + .S_AXI_ACP_WDATA(64'B0), + .S_AXI_ACP_WSTRB(8'B0), + .S_AXI_HP0_ARREADY(), + .S_AXI_HP0_AWREADY(), + .S_AXI_HP0_BVALID(), + .S_AXI_HP0_RLAST(), + .S_AXI_HP0_RVALID(), + .S_AXI_HP0_WREADY(), + .S_AXI_HP0_BRESP(), + .S_AXI_HP0_RRESP(), + .S_AXI_HP0_BID(), + .S_AXI_HP0_RID(), + .S_AXI_HP0_RDATA(), + .S_AXI_HP0_ACLK(1'B0), + .S_AXI_HP0_ARVALID(1'B0), + .S_AXI_HP0_AWVALID(1'B0), + .S_AXI_HP0_BREADY(1'B0), + .S_AXI_HP0_RREADY(1'B0), + .S_AXI_HP0_WLAST(1'B0), + .S_AXI_HP0_WVALID(1'B0), + .S_AXI_HP0_ARBURST(2'B0), + .S_AXI_HP0_ARLOCK(2'B0), + .S_AXI_HP0_ARSIZE(3'B0), + .S_AXI_HP0_AWBURST(2'B0), + .S_AXI_HP0_AWLOCK(2'B0), + .S_AXI_HP0_AWSIZE(3'B0), + .S_AXI_HP0_ARPROT(3'B0), + .S_AXI_HP0_AWPROT(3'B0), + .S_AXI_HP0_ARADDR(32'B0), + .S_AXI_HP0_AWADDR(32'B0), + .S_AXI_HP0_ARCACHE(4'B0), + .S_AXI_HP0_ARLEN(4'B0), + .S_AXI_HP0_ARQOS(4'B0), + .S_AXI_HP0_AWCACHE(4'B0), + .S_AXI_HP0_AWLEN(4'B0), + .S_AXI_HP0_AWQOS(4'B0), + .S_AXI_HP0_ARID(6'B0), + .S_AXI_HP0_AWID(6'B0), + .S_AXI_HP0_WID(6'B0), + .S_AXI_HP0_WDATA(64'B0), + .S_AXI_HP0_WSTRB(8'B0), + .S_AXI_HP1_ARREADY(), + .S_AXI_HP1_AWREADY(), + .S_AXI_HP1_BVALID(), + .S_AXI_HP1_RLAST(), + .S_AXI_HP1_RVALID(), + .S_AXI_HP1_WREADY(), + .S_AXI_HP1_BRESP(), + .S_AXI_HP1_RRESP(), + .S_AXI_HP1_BID(), + .S_AXI_HP1_RID(), + .S_AXI_HP1_RDATA(), + .S_AXI_HP1_ACLK(1'B0), + .S_AXI_HP1_ARVALID(1'B0), + .S_AXI_HP1_AWVALID(1'B0), + .S_AXI_HP1_BREADY(1'B0), + .S_AXI_HP1_RREADY(1'B0), + .S_AXI_HP1_WLAST(1'B0), + .S_AXI_HP1_WVALID(1'B0), + .S_AXI_HP1_ARBURST(2'B0), + .S_AXI_HP1_ARLOCK(2'B0), + .S_AXI_HP1_ARSIZE(3'B0), + .S_AXI_HP1_AWBURST(2'B0), + .S_AXI_HP1_AWLOCK(2'B0), + .S_AXI_HP1_AWSIZE(3'B0), + .S_AXI_HP1_ARPROT(3'B0), + .S_AXI_HP1_AWPROT(3'B0), + .S_AXI_HP1_ARADDR(32'B0), + .S_AXI_HP1_AWADDR(32'B0), + .S_AXI_HP1_ARCACHE(4'B0), + .S_AXI_HP1_ARLEN(4'B0), + .S_AXI_HP1_ARQOS(4'B0), + .S_AXI_HP1_AWCACHE(4'B0), + .S_AXI_HP1_AWLEN(4'B0), + .S_AXI_HP1_AWQOS(4'B0), + .S_AXI_HP1_ARID(6'B0), + .S_AXI_HP1_AWID(6'B0), + .S_AXI_HP1_WID(6'B0), + .S_AXI_HP1_WDATA(64'B0), + .S_AXI_HP1_WSTRB(8'B0), + .S_AXI_HP2_ARREADY(), + .S_AXI_HP2_AWREADY(), + .S_AXI_HP2_BVALID(), + .S_AXI_HP2_RLAST(), + .S_AXI_HP2_RVALID(), + .S_AXI_HP2_WREADY(), + .S_AXI_HP2_BRESP(), + .S_AXI_HP2_RRESP(), + .S_AXI_HP2_BID(), + .S_AXI_HP2_RID(), + .S_AXI_HP2_RDATA(), + .S_AXI_HP2_ACLK(1'B0), + .S_AXI_HP2_ARVALID(1'B0), + .S_AXI_HP2_AWVALID(1'B0), + .S_AXI_HP2_BREADY(1'B0), + .S_AXI_HP2_RREADY(1'B0), + .S_AXI_HP2_WLAST(1'B0), + .S_AXI_HP2_WVALID(1'B0), + .S_AXI_HP2_ARBURST(2'B0), + .S_AXI_HP2_ARLOCK(2'B0), + .S_AXI_HP2_ARSIZE(3'B0), + .S_AXI_HP2_AWBURST(2'B0), + .S_AXI_HP2_AWLOCK(2'B0), + .S_AXI_HP2_AWSIZE(3'B0), + .S_AXI_HP2_ARPROT(3'B0), + .S_AXI_HP2_AWPROT(3'B0), + .S_AXI_HP2_ARADDR(32'B0), + .S_AXI_HP2_AWADDR(32'B0), + .S_AXI_HP2_ARCACHE(4'B0), + .S_AXI_HP2_ARLEN(4'B0), + .S_AXI_HP2_ARQOS(4'B0), + .S_AXI_HP2_AWCACHE(4'B0), + .S_AXI_HP2_AWLEN(4'B0), + .S_AXI_HP2_AWQOS(4'B0), + .S_AXI_HP2_ARID(6'B0), + .S_AXI_HP2_AWID(6'B0), + .S_AXI_HP2_WID(6'B0), + .S_AXI_HP2_WDATA(64'B0), + .S_AXI_HP2_WSTRB(8'B0), + .S_AXI_HP3_ARREADY(), + .S_AXI_HP3_AWREADY(), + .S_AXI_HP3_BVALID(), + .S_AXI_HP3_RLAST(), + .S_AXI_HP3_RVALID(), + .S_AXI_HP3_WREADY(), + .S_AXI_HP3_BRESP(), + .S_AXI_HP3_RRESP(), + .S_AXI_HP3_BID(), + .S_AXI_HP3_RID(), + .S_AXI_HP3_RDATA(), + .S_AXI_HP3_ACLK(1'B0), + .S_AXI_HP3_ARVALID(1'B0), + .S_AXI_HP3_AWVALID(1'B0), + .S_AXI_HP3_BREADY(1'B0), + .S_AXI_HP3_RREADY(1'B0), + .S_AXI_HP3_WLAST(1'B0), + .S_AXI_HP3_WVALID(1'B0), + .S_AXI_HP3_ARBURST(2'B0), + .S_AXI_HP3_ARLOCK(2'B0), + .S_AXI_HP3_ARSIZE(3'B0), + .S_AXI_HP3_AWBURST(2'B0), + .S_AXI_HP3_AWLOCK(2'B0), + .S_AXI_HP3_AWSIZE(3'B0), + .S_AXI_HP3_ARPROT(3'B0), + .S_AXI_HP3_AWPROT(3'B0), + .S_AXI_HP3_ARADDR(32'B0), + .S_AXI_HP3_AWADDR(32'B0), + .S_AXI_HP3_ARCACHE(4'B0), + .S_AXI_HP3_ARLEN(4'B0), + .S_AXI_HP3_ARQOS(4'B0), + .S_AXI_HP3_AWCACHE(4'B0), + .S_AXI_HP3_AWLEN(4'B0), + .S_AXI_HP3_AWQOS(4'B0), + .S_AXI_HP3_ARID(6'B0), + .S_AXI_HP3_AWID(6'B0), + .S_AXI_HP3_WID(6'B0), + .S_AXI_HP3_WDATA(64'B0), + .S_AXI_HP3_WSTRB(8'B0), + .FCLK_CLK0(FCLK_CLK0), + + .FCLK_CLK1(FCLK_CLK1), + + .FCLK_CLK2(), + + .FCLK_CLK3(), + .FCLK_RESET0_N(FCLK_RESET0_N), + .FCLK_RESET1_N(), + .FCLK_RESET2_N(), + .FCLK_RESET3_N(), + .IRQ_F2P(IRQ_F2P), + .PS_SRSTB(PS_SRSTB), + .PS_CLK(PS_CLK), + .PS_PORB(PS_PORB) + ); +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/synth/design_1_processing_system7_0_0.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/synth/design_1_processing_system7_0_0.v new file mode 100644 index 0000000..5813335 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ip/design_1_processing_system7_0_0/synth/design_1_processing_system7_0_0.v @@ -0,0 +1,1173 @@ +// (c) Copyright 1995-2018 Xilinx, Inc. All rights reserved. +// +// This file contains confidential and proprietary 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. +// +// DO NOT MODIFY THIS FILE. + + +// IP VLNV: xilinx.com:ip:processing_system7:5.5 +// IP Revision: 6 + +(* X_CORE_INFO = "processing_system7_v5_5_processing_system7,Vivado 2018.2" *) +(* CHECK_LICENSE_TYPE = "design_1_processing_system7_0_0,processing_system7_v5_5_processing_system7,{}" *) +(* CORE_GENERATION_INFO = "design_1_processing_system7_0_0,processing_system7_v5_5_processing_system7,{x_ipProduct=Vivado 2018.2,x_ipVendor=xilinx.com,x_ipLibrary=ip,x_ipName=processing_system7,x_ipVersion=5.5,x_ipCoreRevision=6,x_ipLanguage=VERILOG,x_ipSimLanguage=MIXED,C_EN_EMIO_PJTAG=0,C_EN_EMIO_ENET0=0,C_EN_EMIO_ENET1=0,C_EN_EMIO_TRACE=0,C_INCLUDE_TRACE_BUFFER=0,C_TRACE_BUFFER_FIFO_SIZE=128,USE_TRACE_DATA_EDGE_DETECTOR=0,C_TRACE_PIPELINE_WIDTH=8,C_TRACE_BUFFER_CLOCK_DELAY=12,C_EMIO_GPIO_WIDTH=64,C_INCLUDE_ACP_TRANS_CH\ +ECK=0,C_USE_DEFAULT_ACP_USER_VAL=0,C_S_AXI_ACP_ARUSER_VAL=31,C_S_AXI_ACP_AWUSER_VAL=31,C_M_AXI_GP0_ID_WIDTH=12,C_M_AXI_GP0_ENABLE_STATIC_REMAP=0,C_M_AXI_GP1_ID_WIDTH=12,C_M_AXI_GP1_ENABLE_STATIC_REMAP=0,C_S_AXI_GP0_ID_WIDTH=6,C_S_AXI_GP1_ID_WIDTH=6,C_S_AXI_ACP_ID_WIDTH=3,C_S_AXI_HP0_ID_WIDTH=6,C_S_AXI_HP0_DATA_WIDTH=64,C_S_AXI_HP1_ID_WIDTH=6,C_S_AXI_HP1_DATA_WIDTH=64,C_S_AXI_HP2_ID_WIDTH=6,C_S_AXI_HP2_DATA_WIDTH=64,C_S_AXI_HP3_ID_WIDTH=6,C_S_AXI_HP3_DATA_WIDTH=64,C_M_AXI_GP0_THREAD_ID_WIDTH=12,C\ +_M_AXI_GP1_THREAD_ID_WIDTH=12,C_NUM_F2P_INTR_INPUTS=1,C_IRQ_F2P_MODE=DIRECT,C_DQ_WIDTH=16,C_DQS_WIDTH=2,C_DM_WIDTH=2,C_MIO_PRIMITIVE=32,C_TRACE_INTERNAL_WIDTH=2,C_USE_AXI_NONSECURE=0,C_USE_M_AXI_GP0=1,C_USE_M_AXI_GP1=0,C_USE_S_AXI_GP0=0,C_USE_S_AXI_GP1=0,C_USE_S_AXI_HP0=0,C_USE_S_AXI_HP1=0,C_USE_S_AXI_HP2=0,C_USE_S_AXI_HP3=0,C_USE_S_AXI_ACP=0,C_PS7_SI_REV=PRODUCTION,C_FCLK_CLK0_BUF=TRUE,C_FCLK_CLK1_BUF=TRUE,C_FCLK_CLK2_BUF=FALSE,C_FCLK_CLK3_BUF=FALSE,C_PACKAGE_NAME=clg225,C_GP0_EN_MODIFIABLE_TXN\ +=1,C_GP1_EN_MODIFIABLE_TXN=1}" *) +(* DowngradeIPIdentifiedWarnings = "yes" *) +module design_1_processing_system7_0_0 ( + GPIO_I, + GPIO_O, + GPIO_T, + I2C0_SDA_I, + I2C0_SDA_O, + I2C0_SDA_T, + I2C0_SCL_I, + I2C0_SCL_O, + I2C0_SCL_T, + SDIO0_CLK, + SDIO0_CLK_FB, + SDIO0_CMD_O, + SDIO0_CMD_I, + SDIO0_CMD_T, + SDIO0_DATA_I, + SDIO0_DATA_O, + SDIO0_DATA_T, + SDIO0_LED, + SDIO0_CDN, + SDIO0_WP, + SDIO0_BUSPOW, + SDIO0_BUSVOLT, + SPI0_SCLK_I, + SPI0_SCLK_O, + SPI0_SCLK_T, + SPI0_MOSI_I, + SPI0_MOSI_O, + SPI0_MOSI_T, + SPI0_MISO_I, + SPI0_MISO_O, + SPI0_MISO_T, + SPI0_SS_I, + SPI0_SS_O, + SPI0_SS1_O, + SPI0_SS2_O, + SPI0_SS_T, + SPI1_SCLK_I, + SPI1_SCLK_O, + SPI1_SCLK_T, + SPI1_MOSI_I, + SPI1_MOSI_O, + SPI1_MOSI_T, + SPI1_MISO_I, + SPI1_MISO_O, + SPI1_MISO_T, + SPI1_SS_I, + SPI1_SS_O, + SPI1_SS1_O, + SPI1_SS2_O, + SPI1_SS_T, + UART0_TX, + UART0_RX, + TTC0_WAVE0_OUT, + TTC0_WAVE1_OUT, + TTC0_WAVE2_OUT, + TTC1_WAVE0_OUT, + TTC1_WAVE1_OUT, + TTC1_WAVE2_OUT, + USB0_PORT_INDCTL, + USB0_VBUS_PWRSELECT, + USB0_VBUS_PWRFAULT, + M_AXI_GP0_ARVALID, + M_AXI_GP0_AWVALID, + M_AXI_GP0_BREADY, + M_AXI_GP0_RREADY, + M_AXI_GP0_WLAST, + M_AXI_GP0_WVALID, + M_AXI_GP0_ARID, + M_AXI_GP0_AWID, + M_AXI_GP0_WID, + M_AXI_GP0_ARBURST, + M_AXI_GP0_ARLOCK, + M_AXI_GP0_ARSIZE, + M_AXI_GP0_AWBURST, + M_AXI_GP0_AWLOCK, + M_AXI_GP0_AWSIZE, + M_AXI_GP0_ARPROT, + M_AXI_GP0_AWPROT, + M_AXI_GP0_ARADDR, + M_AXI_GP0_AWADDR, + M_AXI_GP0_WDATA, + M_AXI_GP0_ARCACHE, + M_AXI_GP0_ARLEN, + M_AXI_GP0_ARQOS, + M_AXI_GP0_AWCACHE, + M_AXI_GP0_AWLEN, + M_AXI_GP0_AWQOS, + M_AXI_GP0_WSTRB, + M_AXI_GP0_ACLK, + M_AXI_GP0_ARREADY, + M_AXI_GP0_AWREADY, + M_AXI_GP0_BVALID, + M_AXI_GP0_RLAST, + M_AXI_GP0_RVALID, + M_AXI_GP0_WREADY, + M_AXI_GP0_BID, + M_AXI_GP0_RID, + M_AXI_GP0_BRESP, + M_AXI_GP0_RRESP, + M_AXI_GP0_RDATA, + IRQ_F2P, + FCLK_CLK0, + FCLK_CLK1, + FCLK_RESET0_N, + MIO, + DDR_CAS_n, + DDR_CKE, + DDR_Clk_n, + DDR_Clk, + DDR_CS_n, + DDR_DRSTB, + DDR_ODT, + DDR_RAS_n, + DDR_WEB, + DDR_BankAddr, + DDR_Addr, + DDR_VRN, + DDR_VRP, + DDR_DM, + DDR_DQ, + DDR_DQS_n, + DDR_DQS, + PS_SRSTB, + PS_CLK, + PS_PORB +); + +(* X_INTERFACE_INFO = "xilinx.com:interface:gpio:1.0 GPIO_0 TRI_I" *) +input wire [63 : 0] GPIO_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:gpio:1.0 GPIO_0 TRI_O" *) +output wire [63 : 0] GPIO_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:gpio:1.0 GPIO_0 TRI_T" *) +output wire [63 : 0] GPIO_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SDA_I" *) +input wire I2C0_SDA_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SDA_O" *) +output wire I2C0_SDA_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SDA_T" *) +output wire I2C0_SDA_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SCL_I" *) +input wire I2C0_SCL_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SCL_O" *) +output wire I2C0_SCL_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:iic:1.0 IIC_0 SCL_T" *) +output wire I2C0_SCL_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CLK" *) +output wire SDIO0_CLK; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CLK_FB" *) +input wire SDIO0_CLK_FB; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CMD_O" *) +output wire SDIO0_CMD_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CMD_I" *) +input wire SDIO0_CMD_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CMD_T" *) +output wire SDIO0_CMD_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 DATA_I" *) +input wire [3 : 0] SDIO0_DATA_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 DATA_O" *) +output wire [3 : 0] SDIO0_DATA_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 DATA_T" *) +output wire [3 : 0] SDIO0_DATA_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 LED" *) +output wire SDIO0_LED; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 CDN" *) +input wire SDIO0_CDN; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 WP" *) +input wire SDIO0_WP; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 BUSPOW" *) +output wire SDIO0_BUSPOW; +(* X_INTERFACE_INFO = "xilinx.com:interface:sdio:1.0 SDIO_0 BUSVOLT" *) +output wire [2 : 0] SDIO0_BUSVOLT; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SCK_I" *) +input wire SPI0_SCLK_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SCK_O" *) +output wire SPI0_SCLK_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SCK_T" *) +output wire SPI0_SCLK_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO0_I" *) +input wire SPI0_MOSI_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO0_O" *) +output wire SPI0_MOSI_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO0_T" *) +output wire SPI0_MOSI_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO1_I" *) +input wire SPI0_MISO_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO1_O" *) +output wire SPI0_MISO_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 IO1_T" *) +output wire SPI0_MISO_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS_I" *) +input wire SPI0_SS_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS_O" *) +output wire SPI0_SS_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS1_O" *) +output wire SPI0_SS1_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS2_O" *) +output wire SPI0_SS2_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_0 SS_T" *) +output wire SPI0_SS_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SCK_I" *) +input wire SPI1_SCLK_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SCK_O" *) +output wire SPI1_SCLK_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SCK_T" *) +output wire SPI1_SCLK_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO0_I" *) +input wire SPI1_MOSI_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO0_O" *) +output wire SPI1_MOSI_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO0_T" *) +output wire SPI1_MOSI_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO1_I" *) +input wire SPI1_MISO_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO1_O" *) +output wire SPI1_MISO_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 IO1_T" *) +output wire SPI1_MISO_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS_I" *) +input wire SPI1_SS_I; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS_O" *) +output wire SPI1_SS_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS1_O" *) +output wire SPI1_SS1_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS2_O" *) +output wire SPI1_SS2_O; +(* X_INTERFACE_INFO = "xilinx.com:interface:spi:1.0 SPI_1 SS_T" *) +output wire SPI1_SS_T; +(* X_INTERFACE_INFO = "xilinx.com:interface:uart:1.0 UART_0 TxD" *) +output wire UART0_TX; +(* X_INTERFACE_INFO = "xilinx.com:interface:uart:1.0 UART_0 RxD" *) +input wire UART0_RX; +output wire TTC0_WAVE0_OUT; +output wire TTC0_WAVE1_OUT; +output wire TTC0_WAVE2_OUT; +output wire TTC1_WAVE0_OUT; +output wire TTC1_WAVE1_OUT; +output wire TTC1_WAVE2_OUT; +(* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:usbctrl:1.0 USBIND_0 PORT_INDCTL" *) +output wire [1 : 0] USB0_PORT_INDCTL; +(* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:usbctrl:1.0 USBIND_0 VBUS_PWRSELECT" *) +output wire USB0_VBUS_PWRSELECT; +(* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:usbctrl:1.0 USBIND_0 VBUS_PWRFAULT" *) +input wire USB0_VBUS_PWRFAULT; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARVALID" *) +output wire M_AXI_GP0_ARVALID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWVALID" *) +output wire M_AXI_GP0_AWVALID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BREADY" *) +output wire M_AXI_GP0_BREADY; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RREADY" *) +output wire M_AXI_GP0_RREADY; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WLAST" *) +output wire M_AXI_GP0_WLAST; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WVALID" *) +output wire M_AXI_GP0_WVALID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARID" *) +output wire [11 : 0] M_AXI_GP0_ARID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWID" *) +output wire [11 : 0] M_AXI_GP0_AWID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WID" *) +output wire [11 : 0] M_AXI_GP0_WID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARBURST" *) +output wire [1 : 0] M_AXI_GP0_ARBURST; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARLOCK" *) +output wire [1 : 0] M_AXI_GP0_ARLOCK; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARSIZE" *) +output wire [2 : 0] M_AXI_GP0_ARSIZE; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWBURST" *) +output wire [1 : 0] M_AXI_GP0_AWBURST; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWLOCK" *) +output wire [1 : 0] M_AXI_GP0_AWLOCK; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWSIZE" *) +output wire [2 : 0] M_AXI_GP0_AWSIZE; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARPROT" *) +output wire [2 : 0] M_AXI_GP0_ARPROT; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWPROT" *) +output wire [2 : 0] M_AXI_GP0_AWPROT; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARADDR" *) +output wire [31 : 0] M_AXI_GP0_ARADDR; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWADDR" *) +output wire [31 : 0] M_AXI_GP0_AWADDR; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WDATA" *) +output wire [31 : 0] M_AXI_GP0_WDATA; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARCACHE" *) +output wire [3 : 0] M_AXI_GP0_ARCACHE; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARLEN" *) +output wire [3 : 0] M_AXI_GP0_ARLEN; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARQOS" *) +output wire [3 : 0] M_AXI_GP0_ARQOS; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWCACHE" *) +output wire [3 : 0] M_AXI_GP0_AWCACHE; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWLEN" *) +output wire [3 : 0] M_AXI_GP0_AWLEN; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWQOS" *) +output wire [3 : 0] M_AXI_GP0_AWQOS; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WSTRB" *) +output wire [3 : 0] M_AXI_GP0_WSTRB; +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME M_AXI_GP0_ACLK, ASSOCIATED_BUSIF M_AXI_GP0, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) +(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 M_AXI_GP0_ACLK CLK" *) +input wire M_AXI_GP0_ACLK; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 ARREADY" *) +input wire M_AXI_GP0_ARREADY; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 AWREADY" *) +input wire M_AXI_GP0_AWREADY; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BVALID" *) +input wire M_AXI_GP0_BVALID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RLAST" *) +input wire M_AXI_GP0_RLAST; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RVALID" *) +input wire M_AXI_GP0_RVALID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 WREADY" *) +input wire M_AXI_GP0_WREADY; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BID" *) +input wire [11 : 0] M_AXI_GP0_BID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RID" *) +input wire [11 : 0] M_AXI_GP0_RID; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 BRESP" *) +input wire [1 : 0] M_AXI_GP0_BRESP; +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RRESP" *) +input wire [1 : 0] M_AXI_GP0_RRESP; +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME M_AXI_GP0, SUPPORTS_NARROW_BURST 0, NUM_WRITE_OUTSTANDING 8, NUM_READ_OUTSTANDING 8, DATA_WIDTH 32, PROTOCOL AXI3, FREQ_HZ 50000000, ID_WIDTH 12, ADDR_WIDTH 32, AWUSER_WIDTH 0, ARUSER_WIDTH 0, WUSER_WIDTH 0, RUSER_WIDTH 0, BUSER_WIDTH 0, READ_WRITE_MODE READ_WRITE, HAS_BURST 1, HAS_LOCK 1, HAS_PROT 1, HAS_CACHE 1, HAS_QOS 1, HAS_REGION 0, HAS_WSTRB 1, HAS_BRESP 1, HAS_RRESP 1, MAX_BURST_LENGTH 16, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0, NUM_READ_THREA\ +DS 4, NUM_WRITE_THREADS 4, RUSER_BITS_PER_BYTE 0, WUSER_BITS_PER_BYTE 0" *) +(* X_INTERFACE_INFO = "xilinx.com:interface:aximm:1.0 M_AXI_GP0 RDATA" *) +input wire [31 : 0] M_AXI_GP0_RDATA; +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME IRQ_F2P, SENSITIVITY LEVEL_HIGH, PortWidth 1" *) +(* X_INTERFACE_INFO = "xilinx.com:signal:interrupt:1.0 IRQ_F2P INTERRUPT" *) +input wire [0 : 0] IRQ_F2P; +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FCLK_CLK0, FREQ_HZ 50000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *) +(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 FCLK_CLK0 CLK" *) +output wire FCLK_CLK0; +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FCLK_CLK1, FREQ_HZ 100000000, PHASE 0.000, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK1" *) +(* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 FCLK_CLK1 CLK" *) +output wire FCLK_CLK1; +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FCLK_RESET0_N, POLARITY ACTIVE_LOW" *) +(* X_INTERFACE_INFO = "xilinx.com:signal:reset:1.0 FCLK_RESET0_N RST" *) +output wire FCLK_RESET0_N; +(* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO MIO" *) +inout wire [31 : 0] MIO; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CAS_N" *) +inout wire DDR_CAS_n; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CKE" *) +inout wire DDR_CKE; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_N" *) +inout wire DDR_Clk_n; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_P" *) +inout wire DDR_Clk; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CS_N" *) +inout wire DDR_CS_n; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RESET_N" *) +inout wire DDR_DRSTB; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ODT" *) +inout wire DDR_ODT; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RAS_N" *) +inout wire DDR_RAS_n; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR WE_N" *) +inout wire DDR_WEB; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR BA" *) +inout wire [2 : 0] DDR_BankAddr; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ADDR" *) +inout wire [14 : 0] DDR_Addr; +(* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRN" *) +inout wire DDR_VRN; +(* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRP" *) +inout wire DDR_VRP; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DM" *) +inout wire [1 : 0] DDR_DM; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQ" *) +inout wire [15 : 0] DDR_DQ; +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_N" *) +inout wire [1 : 0] DDR_DQS_n; +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME DDR, CAN_DEBUG false, TIMEPERIOD_PS 1250, MEMORY_TYPE COMPONENTS, DATA_WIDTH 8, CS_ENABLED true, DATA_MASK_ENABLED true, SLOT Single, MEM_ADDR_MAP ROW_COLUMN_BANK, BURST_LENGTH 8, AXI_ARBITRATION_SCHEME TDM, CAS_LATENCY 11, CAS_WRITE_LATENCY 11" *) +(* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_P" *) +inout wire [1 : 0] DDR_DQS; +(* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_SRSTB" *) +inout wire PS_SRSTB; +(* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_CLK" *) +inout wire PS_CLK; +(* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FIXED_IO, CAN_DEBUG false" *) +(* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_PORB" *) +inout wire PS_PORB; + + processing_system7_v5_5_processing_system7 #( + .C_EN_EMIO_PJTAG(0), + .C_EN_EMIO_ENET0(0), + .C_EN_EMIO_ENET1(0), + .C_EN_EMIO_TRACE(0), + .C_INCLUDE_TRACE_BUFFER(0), + .C_TRACE_BUFFER_FIFO_SIZE(128), + .USE_TRACE_DATA_EDGE_DETECTOR(0), + .C_TRACE_PIPELINE_WIDTH(8), + .C_TRACE_BUFFER_CLOCK_DELAY(12), + .C_EMIO_GPIO_WIDTH(64), + .C_INCLUDE_ACP_TRANS_CHECK(0), + .C_USE_DEFAULT_ACP_USER_VAL(0), + .C_S_AXI_ACP_ARUSER_VAL(31), + .C_S_AXI_ACP_AWUSER_VAL(31), + .C_M_AXI_GP0_ID_WIDTH(12), + .C_M_AXI_GP0_ENABLE_STATIC_REMAP(0), + .C_M_AXI_GP1_ID_WIDTH(12), + .C_M_AXI_GP1_ENABLE_STATIC_REMAP(0), + .C_S_AXI_GP0_ID_WIDTH(6), + .C_S_AXI_GP1_ID_WIDTH(6), + .C_S_AXI_ACP_ID_WIDTH(3), + .C_S_AXI_HP0_ID_WIDTH(6), + .C_S_AXI_HP0_DATA_WIDTH(64), + .C_S_AXI_HP1_ID_WIDTH(6), + .C_S_AXI_HP1_DATA_WIDTH(64), + .C_S_AXI_HP2_ID_WIDTH(6), + .C_S_AXI_HP2_DATA_WIDTH(64), + .C_S_AXI_HP3_ID_WIDTH(6), + .C_S_AXI_HP3_DATA_WIDTH(64), + .C_M_AXI_GP0_THREAD_ID_WIDTH(12), + .C_M_AXI_GP1_THREAD_ID_WIDTH(12), + .C_NUM_F2P_INTR_INPUTS(1), + .C_IRQ_F2P_MODE("DIRECT"), + .C_DQ_WIDTH(16), + .C_DQS_WIDTH(2), + .C_DM_WIDTH(2), + .C_MIO_PRIMITIVE(32), + .C_TRACE_INTERNAL_WIDTH(2), + .C_USE_AXI_NONSECURE(0), + .C_USE_M_AXI_GP0(1), + .C_USE_M_AXI_GP1(0), + .C_USE_S_AXI_GP0(0), + .C_USE_S_AXI_GP1(0), + .C_USE_S_AXI_HP0(0), + .C_USE_S_AXI_HP1(0), + .C_USE_S_AXI_HP2(0), + .C_USE_S_AXI_HP3(0), + .C_USE_S_AXI_ACP(0), + .C_PS7_SI_REV("PRODUCTION"), + .C_FCLK_CLK0_BUF("TRUE"), + .C_FCLK_CLK1_BUF("TRUE"), + .C_FCLK_CLK2_BUF("FALSE"), + .C_FCLK_CLK3_BUF("FALSE"), + .C_PACKAGE_NAME("clg225"), + .C_GP0_EN_MODIFIABLE_TXN(1), + .C_GP1_EN_MODIFIABLE_TXN(1) + ) inst ( + .CAN0_PHY_TX(), + .CAN0_PHY_RX(1'B0), + .CAN1_PHY_TX(), + .CAN1_PHY_RX(1'B0), + .ENET0_GMII_TX_EN(), + .ENET0_GMII_TX_ER(), + .ENET0_MDIO_MDC(), + .ENET0_MDIO_O(), + .ENET0_MDIO_T(), + .ENET0_PTP_DELAY_REQ_RX(), + .ENET0_PTP_DELAY_REQ_TX(), + .ENET0_PTP_PDELAY_REQ_RX(), + .ENET0_PTP_PDELAY_REQ_TX(), + .ENET0_PTP_PDELAY_RESP_RX(), + .ENET0_PTP_PDELAY_RESP_TX(), + .ENET0_PTP_SYNC_FRAME_RX(), + .ENET0_PTP_SYNC_FRAME_TX(), + .ENET0_SOF_RX(), + .ENET0_SOF_TX(), + .ENET0_GMII_TXD(), + .ENET0_GMII_COL(1'B0), + .ENET0_GMII_CRS(1'B0), + .ENET0_GMII_RX_CLK(1'B0), + .ENET0_GMII_RX_DV(1'B0), + .ENET0_GMII_RX_ER(1'B0), + .ENET0_GMII_TX_CLK(1'B0), + .ENET0_MDIO_I(1'B0), + .ENET0_EXT_INTIN(1'B0), + .ENET0_GMII_RXD(8'B0), + .ENET1_GMII_TX_EN(), + .ENET1_GMII_TX_ER(), + .ENET1_MDIO_MDC(), + .ENET1_MDIO_O(), + .ENET1_MDIO_T(), + .ENET1_PTP_DELAY_REQ_RX(), + .ENET1_PTP_DELAY_REQ_TX(), + .ENET1_PTP_PDELAY_REQ_RX(), + .ENET1_PTP_PDELAY_REQ_TX(), + .ENET1_PTP_PDELAY_RESP_RX(), + .ENET1_PTP_PDELAY_RESP_TX(), + .ENET1_PTP_SYNC_FRAME_RX(), + .ENET1_PTP_SYNC_FRAME_TX(), + .ENET1_SOF_RX(), + .ENET1_SOF_TX(), + .ENET1_GMII_TXD(), + .ENET1_GMII_COL(1'B0), + .ENET1_GMII_CRS(1'B0), + .ENET1_GMII_RX_CLK(1'B0), + .ENET1_GMII_RX_DV(1'B0), + .ENET1_GMII_RX_ER(1'B0), + .ENET1_GMII_TX_CLK(1'B0), + .ENET1_MDIO_I(1'B0), + .ENET1_EXT_INTIN(1'B0), + .ENET1_GMII_RXD(8'B0), + .GPIO_I(GPIO_I), + .GPIO_O(GPIO_O), + .GPIO_T(GPIO_T), + .I2C0_SDA_I(I2C0_SDA_I), + .I2C0_SDA_O(I2C0_SDA_O), + .I2C0_SDA_T(I2C0_SDA_T), + .I2C0_SCL_I(I2C0_SCL_I), + .I2C0_SCL_O(I2C0_SCL_O), + .I2C0_SCL_T(I2C0_SCL_T), + .I2C1_SDA_I(1'B0), + .I2C1_SDA_O(), + .I2C1_SDA_T(), + .I2C1_SCL_I(1'B0), + .I2C1_SCL_O(), + .I2C1_SCL_T(), + .PJTAG_TCK(1'B0), + .PJTAG_TMS(1'B0), + .PJTAG_TDI(1'B0), + .PJTAG_TDO(), + .SDIO0_CLK(SDIO0_CLK), + .SDIO0_CLK_FB(SDIO0_CLK_FB), + .SDIO0_CMD_O(SDIO0_CMD_O), + .SDIO0_CMD_I(SDIO0_CMD_I), + .SDIO0_CMD_T(SDIO0_CMD_T), + .SDIO0_DATA_I(SDIO0_DATA_I), + .SDIO0_DATA_O(SDIO0_DATA_O), + .SDIO0_DATA_T(SDIO0_DATA_T), + .SDIO0_LED(SDIO0_LED), + .SDIO0_CDN(SDIO0_CDN), + .SDIO0_WP(SDIO0_WP), + .SDIO0_BUSPOW(SDIO0_BUSPOW), + .SDIO0_BUSVOLT(SDIO0_BUSVOLT), + .SDIO1_CLK(), + .SDIO1_CLK_FB(1'B0), + .SDIO1_CMD_O(), + .SDIO1_CMD_I(1'B0), + .SDIO1_CMD_T(), + .SDIO1_DATA_I(4'B0), + .SDIO1_DATA_O(), + .SDIO1_DATA_T(), + .SDIO1_LED(), + .SDIO1_CDN(1'B0), + .SDIO1_WP(1'B0), + .SDIO1_BUSPOW(), + .SDIO1_BUSVOLT(), + .SPI0_SCLK_I(SPI0_SCLK_I), + .SPI0_SCLK_O(SPI0_SCLK_O), + .SPI0_SCLK_T(SPI0_SCLK_T), + .SPI0_MOSI_I(SPI0_MOSI_I), + .SPI0_MOSI_O(SPI0_MOSI_O), + .SPI0_MOSI_T(SPI0_MOSI_T), + .SPI0_MISO_I(SPI0_MISO_I), + .SPI0_MISO_O(SPI0_MISO_O), + .SPI0_MISO_T(SPI0_MISO_T), + .SPI0_SS_I(SPI0_SS_I), + .SPI0_SS_O(SPI0_SS_O), + .SPI0_SS1_O(SPI0_SS1_O), + .SPI0_SS2_O(SPI0_SS2_O), + .SPI0_SS_T(SPI0_SS_T), + .SPI1_SCLK_I(SPI1_SCLK_I), + .SPI1_SCLK_O(SPI1_SCLK_O), + .SPI1_SCLK_T(SPI1_SCLK_T), + .SPI1_MOSI_I(SPI1_MOSI_I), + .SPI1_MOSI_O(SPI1_MOSI_O), + .SPI1_MOSI_T(SPI1_MOSI_T), + .SPI1_MISO_I(SPI1_MISO_I), + .SPI1_MISO_O(SPI1_MISO_O), + .SPI1_MISO_T(SPI1_MISO_T), + .SPI1_SS_I(SPI1_SS_I), + .SPI1_SS_O(SPI1_SS_O), + .SPI1_SS1_O(SPI1_SS1_O), + .SPI1_SS2_O(SPI1_SS2_O), + .SPI1_SS_T(SPI1_SS_T), + .UART0_DTRN(), + .UART0_RTSN(), + .UART0_TX(UART0_TX), + .UART0_CTSN(1'B0), + .UART0_DCDN(1'B0), + .UART0_DSRN(1'B0), + .UART0_RIN(1'B0), + .UART0_RX(UART0_RX), + .UART1_DTRN(), + .UART1_RTSN(), + .UART1_TX(), + .UART1_CTSN(1'B0), + .UART1_DCDN(1'B0), + .UART1_DSRN(1'B0), + .UART1_RIN(1'B0), + .UART1_RX(1'B1), + .TTC0_WAVE0_OUT(TTC0_WAVE0_OUT), + .TTC0_WAVE1_OUT(TTC0_WAVE1_OUT), + .TTC0_WAVE2_OUT(TTC0_WAVE2_OUT), + .TTC0_CLK0_IN(1'B0), + .TTC0_CLK1_IN(1'B0), + .TTC0_CLK2_IN(1'B0), + .TTC1_WAVE0_OUT(TTC1_WAVE0_OUT), + .TTC1_WAVE1_OUT(TTC1_WAVE1_OUT), + .TTC1_WAVE2_OUT(TTC1_WAVE2_OUT), + .TTC1_CLK0_IN(1'B0), + .TTC1_CLK1_IN(1'B0), + .TTC1_CLK2_IN(1'B0), + .WDT_CLK_IN(1'B0), + .WDT_RST_OUT(), + .TRACE_CLK(1'B0), + .TRACE_CLK_OUT(), + .TRACE_CTL(), + .TRACE_DATA(), + .USB0_PORT_INDCTL(USB0_PORT_INDCTL), + .USB0_VBUS_PWRSELECT(USB0_VBUS_PWRSELECT), + .USB0_VBUS_PWRFAULT(USB0_VBUS_PWRFAULT), + .USB1_PORT_INDCTL(), + .USB1_VBUS_PWRSELECT(), + .USB1_VBUS_PWRFAULT(1'B0), + .SRAM_INTIN(1'B0), + .M_AXI_GP0_ARVALID(M_AXI_GP0_ARVALID), + .M_AXI_GP0_AWVALID(M_AXI_GP0_AWVALID), + .M_AXI_GP0_BREADY(M_AXI_GP0_BREADY), + .M_AXI_GP0_RREADY(M_AXI_GP0_RREADY), + .M_AXI_GP0_WLAST(M_AXI_GP0_WLAST), + .M_AXI_GP0_WVALID(M_AXI_GP0_WVALID), + .M_AXI_GP0_ARID(M_AXI_GP0_ARID), + .M_AXI_GP0_AWID(M_AXI_GP0_AWID), + .M_AXI_GP0_WID(M_AXI_GP0_WID), + .M_AXI_GP0_ARBURST(M_AXI_GP0_ARBURST), + .M_AXI_GP0_ARLOCK(M_AXI_GP0_ARLOCK), + .M_AXI_GP0_ARSIZE(M_AXI_GP0_ARSIZE), + .M_AXI_GP0_AWBURST(M_AXI_GP0_AWBURST), + .M_AXI_GP0_AWLOCK(M_AXI_GP0_AWLOCK), + .M_AXI_GP0_AWSIZE(M_AXI_GP0_AWSIZE), + .M_AXI_GP0_ARPROT(M_AXI_GP0_ARPROT), + .M_AXI_GP0_AWPROT(M_AXI_GP0_AWPROT), + .M_AXI_GP0_ARADDR(M_AXI_GP0_ARADDR), + .M_AXI_GP0_AWADDR(M_AXI_GP0_AWADDR), + .M_AXI_GP0_WDATA(M_AXI_GP0_WDATA), + .M_AXI_GP0_ARCACHE(M_AXI_GP0_ARCACHE), + .M_AXI_GP0_ARLEN(M_AXI_GP0_ARLEN), + .M_AXI_GP0_ARQOS(M_AXI_GP0_ARQOS), + .M_AXI_GP0_AWCACHE(M_AXI_GP0_AWCACHE), + .M_AXI_GP0_AWLEN(M_AXI_GP0_AWLEN), + .M_AXI_GP0_AWQOS(M_AXI_GP0_AWQOS), + .M_AXI_GP0_WSTRB(M_AXI_GP0_WSTRB), + .M_AXI_GP0_ACLK(M_AXI_GP0_ACLK), + .M_AXI_GP0_ARREADY(M_AXI_GP0_ARREADY), + .M_AXI_GP0_AWREADY(M_AXI_GP0_AWREADY), + .M_AXI_GP0_BVALID(M_AXI_GP0_BVALID), + .M_AXI_GP0_RLAST(M_AXI_GP0_RLAST), + .M_AXI_GP0_RVALID(M_AXI_GP0_RVALID), + .M_AXI_GP0_WREADY(M_AXI_GP0_WREADY), + .M_AXI_GP0_BID(M_AXI_GP0_BID), + .M_AXI_GP0_RID(M_AXI_GP0_RID), + .M_AXI_GP0_BRESP(M_AXI_GP0_BRESP), + .M_AXI_GP0_RRESP(M_AXI_GP0_RRESP), + .M_AXI_GP0_RDATA(M_AXI_GP0_RDATA), + .M_AXI_GP1_ARVALID(), + .M_AXI_GP1_AWVALID(), + .M_AXI_GP1_BREADY(), + .M_AXI_GP1_RREADY(), + .M_AXI_GP1_WLAST(), + .M_AXI_GP1_WVALID(), + .M_AXI_GP1_ARID(), + .M_AXI_GP1_AWID(), + .M_AXI_GP1_WID(), + .M_AXI_GP1_ARBURST(), + .M_AXI_GP1_ARLOCK(), + .M_AXI_GP1_ARSIZE(), + .M_AXI_GP1_AWBURST(), + .M_AXI_GP1_AWLOCK(), + .M_AXI_GP1_AWSIZE(), + .M_AXI_GP1_ARPROT(), + .M_AXI_GP1_AWPROT(), + .M_AXI_GP1_ARADDR(), + .M_AXI_GP1_AWADDR(), + .M_AXI_GP1_WDATA(), + .M_AXI_GP1_ARCACHE(), + .M_AXI_GP1_ARLEN(), + .M_AXI_GP1_ARQOS(), + .M_AXI_GP1_AWCACHE(), + .M_AXI_GP1_AWLEN(), + .M_AXI_GP1_AWQOS(), + .M_AXI_GP1_WSTRB(), + .M_AXI_GP1_ACLK(1'B0), + .M_AXI_GP1_ARREADY(1'B0), + .M_AXI_GP1_AWREADY(1'B0), + .M_AXI_GP1_BVALID(1'B0), + .M_AXI_GP1_RLAST(1'B0), + .M_AXI_GP1_RVALID(1'B0), + .M_AXI_GP1_WREADY(1'B0), + .M_AXI_GP1_BID(12'B0), + .M_AXI_GP1_RID(12'B0), + .M_AXI_GP1_BRESP(2'B0), + .M_AXI_GP1_RRESP(2'B0), + .M_AXI_GP1_RDATA(32'B0), + .S_AXI_GP0_ARREADY(), + .S_AXI_GP0_AWREADY(), + .S_AXI_GP0_BVALID(), + .S_AXI_GP0_RLAST(), + .S_AXI_GP0_RVALID(), + .S_AXI_GP0_WREADY(), + .S_AXI_GP0_BRESP(), + .S_AXI_GP0_RRESP(), + .S_AXI_GP0_RDATA(), + .S_AXI_GP0_BID(), + .S_AXI_GP0_RID(), + .S_AXI_GP0_ACLK(1'B0), + .S_AXI_GP0_ARVALID(1'B0), + .S_AXI_GP0_AWVALID(1'B0), + .S_AXI_GP0_BREADY(1'B0), + .S_AXI_GP0_RREADY(1'B0), + .S_AXI_GP0_WLAST(1'B0), + .S_AXI_GP0_WVALID(1'B0), + .S_AXI_GP0_ARBURST(2'B0), + .S_AXI_GP0_ARLOCK(2'B0), + .S_AXI_GP0_ARSIZE(3'B0), + .S_AXI_GP0_AWBURST(2'B0), + .S_AXI_GP0_AWLOCK(2'B0), + .S_AXI_GP0_AWSIZE(3'B0), + .S_AXI_GP0_ARPROT(3'B0), + .S_AXI_GP0_AWPROT(3'B0), + .S_AXI_GP0_ARADDR(32'B0), + .S_AXI_GP0_AWADDR(32'B0), + .S_AXI_GP0_WDATA(32'B0), + .S_AXI_GP0_ARCACHE(4'B0), + .S_AXI_GP0_ARLEN(4'B0), + .S_AXI_GP0_ARQOS(4'B0), + .S_AXI_GP0_AWCACHE(4'B0), + .S_AXI_GP0_AWLEN(4'B0), + .S_AXI_GP0_AWQOS(4'B0), + .S_AXI_GP0_WSTRB(4'B0), + .S_AXI_GP0_ARID(6'B0), + .S_AXI_GP0_AWID(6'B0), + .S_AXI_GP0_WID(6'B0), + .S_AXI_GP1_ARREADY(), + .S_AXI_GP1_AWREADY(), + .S_AXI_GP1_BVALID(), + .S_AXI_GP1_RLAST(), + .S_AXI_GP1_RVALID(), + .S_AXI_GP1_WREADY(), + .S_AXI_GP1_BRESP(), + .S_AXI_GP1_RRESP(), + .S_AXI_GP1_RDATA(), + .S_AXI_GP1_BID(), + .S_AXI_GP1_RID(), + .S_AXI_GP1_ACLK(1'B0), + .S_AXI_GP1_ARVALID(1'B0), + .S_AXI_GP1_AWVALID(1'B0), + .S_AXI_GP1_BREADY(1'B0), + .S_AXI_GP1_RREADY(1'B0), + .S_AXI_GP1_WLAST(1'B0), + .S_AXI_GP1_WVALID(1'B0), + .S_AXI_GP1_ARBURST(2'B0), + .S_AXI_GP1_ARLOCK(2'B0), + .S_AXI_GP1_ARSIZE(3'B0), + .S_AXI_GP1_AWBURST(2'B0), + .S_AXI_GP1_AWLOCK(2'B0), + .S_AXI_GP1_AWSIZE(3'B0), + .S_AXI_GP1_ARPROT(3'B0), + .S_AXI_GP1_AWPROT(3'B0), + .S_AXI_GP1_ARADDR(32'B0), + .S_AXI_GP1_AWADDR(32'B0), + .S_AXI_GP1_WDATA(32'B0), + .S_AXI_GP1_ARCACHE(4'B0), + .S_AXI_GP1_ARLEN(4'B0), + .S_AXI_GP1_ARQOS(4'B0), + .S_AXI_GP1_AWCACHE(4'B0), + .S_AXI_GP1_AWLEN(4'B0), + .S_AXI_GP1_AWQOS(4'B0), + .S_AXI_GP1_WSTRB(4'B0), + .S_AXI_GP1_ARID(6'B0), + .S_AXI_GP1_AWID(6'B0), + .S_AXI_GP1_WID(6'B0), + .S_AXI_ACP_ARREADY(), + .S_AXI_ACP_AWREADY(), + .S_AXI_ACP_BVALID(), + .S_AXI_ACP_RLAST(), + .S_AXI_ACP_RVALID(), + .S_AXI_ACP_WREADY(), + .S_AXI_ACP_BRESP(), + .S_AXI_ACP_RRESP(), + .S_AXI_ACP_BID(), + .S_AXI_ACP_RID(), + .S_AXI_ACP_RDATA(), + .S_AXI_ACP_ACLK(1'B0), + .S_AXI_ACP_ARVALID(1'B0), + .S_AXI_ACP_AWVALID(1'B0), + .S_AXI_ACP_BREADY(1'B0), + .S_AXI_ACP_RREADY(1'B0), + .S_AXI_ACP_WLAST(1'B0), + .S_AXI_ACP_WVALID(1'B0), + .S_AXI_ACP_ARID(3'B0), + .S_AXI_ACP_ARPROT(3'B0), + .S_AXI_ACP_AWID(3'B0), + .S_AXI_ACP_AWPROT(3'B0), + .S_AXI_ACP_WID(3'B0), + .S_AXI_ACP_ARADDR(32'B0), + .S_AXI_ACP_AWADDR(32'B0), + .S_AXI_ACP_ARCACHE(4'B0), + .S_AXI_ACP_ARLEN(4'B0), + .S_AXI_ACP_ARQOS(4'B0), + .S_AXI_ACP_AWCACHE(4'B0), + .S_AXI_ACP_AWLEN(4'B0), + .S_AXI_ACP_AWQOS(4'B0), + .S_AXI_ACP_ARBURST(2'B0), + .S_AXI_ACP_ARLOCK(2'B0), + .S_AXI_ACP_ARSIZE(3'B0), + .S_AXI_ACP_AWBURST(2'B0), + .S_AXI_ACP_AWLOCK(2'B0), + .S_AXI_ACP_AWSIZE(3'B0), + .S_AXI_ACP_ARUSER(5'B0), + .S_AXI_ACP_AWUSER(5'B0), + .S_AXI_ACP_WDATA(64'B0), + .S_AXI_ACP_WSTRB(8'B0), + .S_AXI_HP0_ARREADY(), + .S_AXI_HP0_AWREADY(), + .S_AXI_HP0_BVALID(), + .S_AXI_HP0_RLAST(), + .S_AXI_HP0_RVALID(), + .S_AXI_HP0_WREADY(), + .S_AXI_HP0_BRESP(), + .S_AXI_HP0_RRESP(), + .S_AXI_HP0_BID(), + .S_AXI_HP0_RID(), + .S_AXI_HP0_RDATA(), + .S_AXI_HP0_RCOUNT(), + .S_AXI_HP0_WCOUNT(), + .S_AXI_HP0_RACOUNT(), + .S_AXI_HP0_WACOUNT(), + .S_AXI_HP0_ACLK(1'B0), + .S_AXI_HP0_ARVALID(1'B0), + .S_AXI_HP0_AWVALID(1'B0), + .S_AXI_HP0_BREADY(1'B0), + .S_AXI_HP0_RDISSUECAP1_EN(1'B0), + .S_AXI_HP0_RREADY(1'B0), + .S_AXI_HP0_WLAST(1'B0), + .S_AXI_HP0_WRISSUECAP1_EN(1'B0), + .S_AXI_HP0_WVALID(1'B0), + .S_AXI_HP0_ARBURST(2'B0), + .S_AXI_HP0_ARLOCK(2'B0), + .S_AXI_HP0_ARSIZE(3'B0), + .S_AXI_HP0_AWBURST(2'B0), + .S_AXI_HP0_AWLOCK(2'B0), + .S_AXI_HP0_AWSIZE(3'B0), + .S_AXI_HP0_ARPROT(3'B0), + .S_AXI_HP0_AWPROT(3'B0), + .S_AXI_HP0_ARADDR(32'B0), + .S_AXI_HP0_AWADDR(32'B0), + .S_AXI_HP0_ARCACHE(4'B0), + .S_AXI_HP0_ARLEN(4'B0), + .S_AXI_HP0_ARQOS(4'B0), + .S_AXI_HP0_AWCACHE(4'B0), + .S_AXI_HP0_AWLEN(4'B0), + .S_AXI_HP0_AWQOS(4'B0), + .S_AXI_HP0_ARID(6'B0), + .S_AXI_HP0_AWID(6'B0), + .S_AXI_HP0_WID(6'B0), + .S_AXI_HP0_WDATA(64'B0), + .S_AXI_HP0_WSTRB(8'B0), + .S_AXI_HP1_ARREADY(), + .S_AXI_HP1_AWREADY(), + .S_AXI_HP1_BVALID(), + .S_AXI_HP1_RLAST(), + .S_AXI_HP1_RVALID(), + .S_AXI_HP1_WREADY(), + .S_AXI_HP1_BRESP(), + .S_AXI_HP1_RRESP(), + .S_AXI_HP1_BID(), + .S_AXI_HP1_RID(), + .S_AXI_HP1_RDATA(), + .S_AXI_HP1_RCOUNT(), + .S_AXI_HP1_WCOUNT(), + .S_AXI_HP1_RACOUNT(), + .S_AXI_HP1_WACOUNT(), + .S_AXI_HP1_ACLK(1'B0), + .S_AXI_HP1_ARVALID(1'B0), + .S_AXI_HP1_AWVALID(1'B0), + .S_AXI_HP1_BREADY(1'B0), + .S_AXI_HP1_RDISSUECAP1_EN(1'B0), + .S_AXI_HP1_RREADY(1'B0), + .S_AXI_HP1_WLAST(1'B0), + .S_AXI_HP1_WRISSUECAP1_EN(1'B0), + .S_AXI_HP1_WVALID(1'B0), + .S_AXI_HP1_ARBURST(2'B0), + .S_AXI_HP1_ARLOCK(2'B0), + .S_AXI_HP1_ARSIZE(3'B0), + .S_AXI_HP1_AWBURST(2'B0), + .S_AXI_HP1_AWLOCK(2'B0), + .S_AXI_HP1_AWSIZE(3'B0), + .S_AXI_HP1_ARPROT(3'B0), + .S_AXI_HP1_AWPROT(3'B0), + .S_AXI_HP1_ARADDR(32'B0), + .S_AXI_HP1_AWADDR(32'B0), + .S_AXI_HP1_ARCACHE(4'B0), + .S_AXI_HP1_ARLEN(4'B0), + .S_AXI_HP1_ARQOS(4'B0), + .S_AXI_HP1_AWCACHE(4'B0), + .S_AXI_HP1_AWLEN(4'B0), + .S_AXI_HP1_AWQOS(4'B0), + .S_AXI_HP1_ARID(6'B0), + .S_AXI_HP1_AWID(6'B0), + .S_AXI_HP1_WID(6'B0), + .S_AXI_HP1_WDATA(64'B0), + .S_AXI_HP1_WSTRB(8'B0), + .S_AXI_HP2_ARREADY(), + .S_AXI_HP2_AWREADY(), + .S_AXI_HP2_BVALID(), + .S_AXI_HP2_RLAST(), + .S_AXI_HP2_RVALID(), + .S_AXI_HP2_WREADY(), + .S_AXI_HP2_BRESP(), + .S_AXI_HP2_RRESP(), + .S_AXI_HP2_BID(), + .S_AXI_HP2_RID(), + .S_AXI_HP2_RDATA(), + .S_AXI_HP2_RCOUNT(), + .S_AXI_HP2_WCOUNT(), + .S_AXI_HP2_RACOUNT(), + .S_AXI_HP2_WACOUNT(), + .S_AXI_HP2_ACLK(1'B0), + .S_AXI_HP2_ARVALID(1'B0), + .S_AXI_HP2_AWVALID(1'B0), + .S_AXI_HP2_BREADY(1'B0), + .S_AXI_HP2_RDISSUECAP1_EN(1'B0), + .S_AXI_HP2_RREADY(1'B0), + .S_AXI_HP2_WLAST(1'B0), + .S_AXI_HP2_WRISSUECAP1_EN(1'B0), + .S_AXI_HP2_WVALID(1'B0), + .S_AXI_HP2_ARBURST(2'B0), + .S_AXI_HP2_ARLOCK(2'B0), + .S_AXI_HP2_ARSIZE(3'B0), + .S_AXI_HP2_AWBURST(2'B0), + .S_AXI_HP2_AWLOCK(2'B0), + .S_AXI_HP2_AWSIZE(3'B0), + .S_AXI_HP2_ARPROT(3'B0), + .S_AXI_HP2_AWPROT(3'B0), + .S_AXI_HP2_ARADDR(32'B0), + .S_AXI_HP2_AWADDR(32'B0), + .S_AXI_HP2_ARCACHE(4'B0), + .S_AXI_HP2_ARLEN(4'B0), + .S_AXI_HP2_ARQOS(4'B0), + .S_AXI_HP2_AWCACHE(4'B0), + .S_AXI_HP2_AWLEN(4'B0), + .S_AXI_HP2_AWQOS(4'B0), + .S_AXI_HP2_ARID(6'B0), + .S_AXI_HP2_AWID(6'B0), + .S_AXI_HP2_WID(6'B0), + .S_AXI_HP2_WDATA(64'B0), + .S_AXI_HP2_WSTRB(8'B0), + .S_AXI_HP3_ARREADY(), + .S_AXI_HP3_AWREADY(), + .S_AXI_HP3_BVALID(), + .S_AXI_HP3_RLAST(), + .S_AXI_HP3_RVALID(), + .S_AXI_HP3_WREADY(), + .S_AXI_HP3_BRESP(), + .S_AXI_HP3_RRESP(), + .S_AXI_HP3_BID(), + .S_AXI_HP3_RID(), + .S_AXI_HP3_RDATA(), + .S_AXI_HP3_RCOUNT(), + .S_AXI_HP3_WCOUNT(), + .S_AXI_HP3_RACOUNT(), + .S_AXI_HP3_WACOUNT(), + .S_AXI_HP3_ACLK(1'B0), + .S_AXI_HP3_ARVALID(1'B0), + .S_AXI_HP3_AWVALID(1'B0), + .S_AXI_HP3_BREADY(1'B0), + .S_AXI_HP3_RDISSUECAP1_EN(1'B0), + .S_AXI_HP3_RREADY(1'B0), + .S_AXI_HP3_WLAST(1'B0), + .S_AXI_HP3_WRISSUECAP1_EN(1'B0), + .S_AXI_HP3_WVALID(1'B0), + .S_AXI_HP3_ARBURST(2'B0), + .S_AXI_HP3_ARLOCK(2'B0), + .S_AXI_HP3_ARSIZE(3'B0), + .S_AXI_HP3_AWBURST(2'B0), + .S_AXI_HP3_AWLOCK(2'B0), + .S_AXI_HP3_AWSIZE(3'B0), + .S_AXI_HP3_ARPROT(3'B0), + .S_AXI_HP3_AWPROT(3'B0), + .S_AXI_HP3_ARADDR(32'B0), + .S_AXI_HP3_AWADDR(32'B0), + .S_AXI_HP3_ARCACHE(4'B0), + .S_AXI_HP3_ARLEN(4'B0), + .S_AXI_HP3_ARQOS(4'B0), + .S_AXI_HP3_AWCACHE(4'B0), + .S_AXI_HP3_AWLEN(4'B0), + .S_AXI_HP3_AWQOS(4'B0), + .S_AXI_HP3_ARID(6'B0), + .S_AXI_HP3_AWID(6'B0), + .S_AXI_HP3_WID(6'B0), + .S_AXI_HP3_WDATA(64'B0), + .S_AXI_HP3_WSTRB(8'B0), + .IRQ_P2F_DMAC_ABORT(), + .IRQ_P2F_DMAC0(), + .IRQ_P2F_DMAC1(), + .IRQ_P2F_DMAC2(), + .IRQ_P2F_DMAC3(), + .IRQ_P2F_DMAC4(), + .IRQ_P2F_DMAC5(), + .IRQ_P2F_DMAC6(), + .IRQ_P2F_DMAC7(), + .IRQ_P2F_SMC(), + .IRQ_P2F_QSPI(), + .IRQ_P2F_CTI(), + .IRQ_P2F_GPIO(), + .IRQ_P2F_USB0(), + .IRQ_P2F_ENET0(), + .IRQ_P2F_ENET_WAKE0(), + .IRQ_P2F_SDIO0(), + .IRQ_P2F_I2C0(), + .IRQ_P2F_SPI0(), + .IRQ_P2F_UART0(), + .IRQ_P2F_CAN0(), + .IRQ_P2F_USB1(), + .IRQ_P2F_ENET1(), + .IRQ_P2F_ENET_WAKE1(), + .IRQ_P2F_SDIO1(), + .IRQ_P2F_I2C1(), + .IRQ_P2F_SPI1(), + .IRQ_P2F_UART1(), + .IRQ_P2F_CAN1(), + .IRQ_F2P(IRQ_F2P), + .Core0_nFIQ(1'B0), + .Core0_nIRQ(1'B0), + .Core1_nFIQ(1'B0), + .Core1_nIRQ(1'B0), + .DMA0_DATYPE(), + .DMA0_DAVALID(), + .DMA0_DRREADY(), + .DMA1_DATYPE(), + .DMA1_DAVALID(), + .DMA1_DRREADY(), + .DMA2_DATYPE(), + .DMA2_DAVALID(), + .DMA2_DRREADY(), + .DMA3_DATYPE(), + .DMA3_DAVALID(), + .DMA3_DRREADY(), + .DMA0_ACLK(1'B0), + .DMA0_DAREADY(1'B0), + .DMA0_DRLAST(1'B0), + .DMA0_DRVALID(1'B0), + .DMA1_ACLK(1'B0), + .DMA1_DAREADY(1'B0), + .DMA1_DRLAST(1'B0), + .DMA1_DRVALID(1'B0), + .DMA2_ACLK(1'B0), + .DMA2_DAREADY(1'B0), + .DMA2_DRLAST(1'B0), + .DMA2_DRVALID(1'B0), + .DMA3_ACLK(1'B0), + .DMA3_DAREADY(1'B0), + .DMA3_DRLAST(1'B0), + .DMA3_DRVALID(1'B0), + .DMA0_DRTYPE(2'B0), + .DMA1_DRTYPE(2'B0), + .DMA2_DRTYPE(2'B0), + .DMA3_DRTYPE(2'B0), + .FCLK_CLK0(FCLK_CLK0), + .FCLK_CLK1(FCLK_CLK1), + .FCLK_CLK2(), + .FCLK_CLK3(), + .FCLK_CLKTRIG0_N(1'B0), + .FCLK_CLKTRIG1_N(1'B0), + .FCLK_CLKTRIG2_N(1'B0), + .FCLK_CLKTRIG3_N(1'B0), + .FCLK_RESET0_N(FCLK_RESET0_N), + .FCLK_RESET1_N(), + .FCLK_RESET2_N(), + .FCLK_RESET3_N(), + .FTMD_TRACEIN_DATA(32'B0), + .FTMD_TRACEIN_VALID(1'B0), + .FTMD_TRACEIN_CLK(1'B0), + .FTMD_TRACEIN_ATID(4'B0), + .FTMT_F2P_TRIG_0(1'B0), + .FTMT_F2P_TRIGACK_0(), + .FTMT_F2P_TRIG_1(1'B0), + .FTMT_F2P_TRIGACK_1(), + .FTMT_F2P_TRIG_2(1'B0), + .FTMT_F2P_TRIGACK_2(), + .FTMT_F2P_TRIG_3(1'B0), + .FTMT_F2P_TRIGACK_3(), + .FTMT_F2P_DEBUG(32'B0), + .FTMT_P2F_TRIGACK_0(1'B0), + .FTMT_P2F_TRIG_0(), + .FTMT_P2F_TRIGACK_1(1'B0), + .FTMT_P2F_TRIG_1(), + .FTMT_P2F_TRIGACK_2(1'B0), + .FTMT_P2F_TRIG_2(), + .FTMT_P2F_TRIGACK_3(1'B0), + .FTMT_P2F_TRIG_3(), + .FTMT_P2F_DEBUG(), + .FPGA_IDLE_N(1'B0), + .EVENT_EVENTO(), + .EVENT_STANDBYWFE(), + .EVENT_STANDBYWFI(), + .EVENT_EVENTI(1'B0), + .DDR_ARB(4'B0), + .MIO(MIO), + .DDR_CAS_n(DDR_CAS_n), + .DDR_CKE(DDR_CKE), + .DDR_Clk_n(DDR_Clk_n), + .DDR_Clk(DDR_Clk), + .DDR_CS_n(DDR_CS_n), + .DDR_DRSTB(DDR_DRSTB), + .DDR_ODT(DDR_ODT), + .DDR_RAS_n(DDR_RAS_n), + .DDR_WEB(DDR_WEB), + .DDR_BankAddr(DDR_BankAddr), + .DDR_Addr(DDR_Addr), + .DDR_VRN(DDR_VRN), + .DDR_VRP(DDR_VRP), + .DDR_DM(DDR_DM), + .DDR_DQ(DDR_DQ), + .DDR_DQS_n(DDR_DQS_n), + .DDR_DQS(DDR_DQS), + .PS_SRSTB(PS_SRSTB), + .PS_CLK(PS_CLK), + .PS_PORB(PS_PORB) + ); +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_apis.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_apis.v new file mode 100644 index 0000000..db24752 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_apis.v @@ -0,0 +1,842 @@ +/***************************************************************************** + * File : processing_system7_vip_v1_0_5_apis.v + * + * Date : 2012-11 + * + * Description : Set of Zynq VIP APIs that are used for writing tests. + * + *****************************************************************************/ + + /* API for setting the STOP_ON_ERROR*/ + task automatic set_stop_on_error; + input LEVEL; + begin + $display("[%0d] : %0s : Setting Stop On Error as %0b",$time, DISP_INFO, LEVEL); + STOP_ON_ERROR = LEVEL; +// M_AXI_GP0.master.set_stop_on_error(LEVEL); +// M_AXI_GP1.master.set_stop_on_error(LEVEL); +// S_AXI_GP0.slave.set_stop_on_error(LEVEL); +// S_AXI_GP1.slave.set_stop_on_error(LEVEL); +// S_AXI_HP0.slave.set_stop_on_error(LEVEL); +// S_AXI_HP1.slave.set_stop_on_error(LEVEL); +// S_AXI_HP2.slave.set_stop_on_error(LEVEL); +// S_AXI_HP3.slave.set_stop_on_error(LEVEL); +// S_AXI_ACP.slave.set_stop_on_error(LEVEL); + M_AXI_GP0.STOP_ON_ERROR = LEVEL; + M_AXI_GP1.STOP_ON_ERROR = LEVEL; + S_AXI_GP0.STOP_ON_ERROR = LEVEL; + S_AXI_GP1.STOP_ON_ERROR = LEVEL; + S_AXI_HP0.STOP_ON_ERROR = LEVEL; + S_AXI_HP1.STOP_ON_ERROR = LEVEL; + S_AXI_HP2.STOP_ON_ERROR = LEVEL; + S_AXI_HP3.STOP_ON_ERROR = LEVEL; + S_AXI_ACP.STOP_ON_ERROR = LEVEL; + + end + endtask + + /* API for setting the verbosity for channel level info*/ + task automatic set_channel_level_info; + input [1023:0] name; + input LEVEL; + begin + $display("[%0d] : [%0s] : %0s Port/s : Setting Channel Level Info as %0b",$time, DISP_INFO, name , LEVEL); + case(name) +// "M_AXI_GP0" : M_AXI_GP0.master.set_channel_level_info(LEVEL); +// "M_AXI_GP1" : M_AXI_GP1.master.set_channel_level_info(LEVEL); +// "S_AXI_GP0" : S_AXI_GP0.slave.set_channel_level_info(LEVEL); +// "S_AXI_GP1" : S_AXI_GP1.slave.set_channel_level_info(LEVEL); +// "S_AXI_HP0" : S_AXI_HP0.slave.set_channel_level_info(LEVEL); +// "S_AXI_HP1" : S_AXI_HP1.slave.set_channel_level_info(LEVEL); +// "S_AXI_HP2" : S_AXI_HP2.slave.set_channel_level_info(LEVEL); +// "S_AXI_HP3" : S_AXI_HP3.slave.set_channel_level_info(LEVEL); +// "S_AXI_ACP" : S_AXI_ACP.slave.set_channel_level_info(LEVEL); + "ALL" : begin +// M_AXI_GP0.master.set_channel_level_info(LEVEL); +// M_AXI_GP1.master.set_channel_level_info(LEVEL); +// S_AXI_GP0.slave.set_channel_level_info(LEVEL); +// S_AXI_GP1.slave.set_channel_level_info(LEVEL); +// S_AXI_HP0.slave.set_channel_level_info(LEVEL); +// S_AXI_HP1.slave.set_channel_level_info(LEVEL); +// S_AXI_HP2.slave.set_channel_level_info(LEVEL); +// S_AXI_HP3.slave.set_channel_level_info(LEVEL); +// S_AXI_ACP.slave.set_channel_level_info(LEVEL); + end + default : $display("[%0d] : %0s : Invalid Port name (%0s)",$time, DISP_ERR, name); + endcase + end + endtask + + /* API for setting the verbosity for function level info*/ + task automatic set_function_level_info; + input [1023:0] name; + input LEVEL; + begin + $display("[%0d] : [%0s] : %0s Port/s : Setting Function Level Info as %0b",$time, DISP_INFO, name , LEVEL); + case(name) +// "M_AXI_GP0" : M_AXI_GP0.master.set_function_level_info(LEVEL); +// "M_AXI_GP1" : M_AXI_GP1.master.set_function_level_info(LEVEL); +// "S_AXI_GP0" : S_AXI_GP0.slave.set_function_level_info(LEVEL); +// "S_AXI_GP1" : S_AXI_GP1.slave.set_function_level_info(LEVEL); +// "S_AXI_HP0" : S_AXI_HP0.slave.set_function_level_info(LEVEL); +// "S_AXI_HP1" : S_AXI_HP1.slave.set_function_level_info(LEVEL); +// "S_AXI_HP2" : S_AXI_HP2.slave.set_function_level_info(LEVEL); +// "S_AXI_HP3" : S_AXI_HP3.slave.set_function_level_info(LEVEL); +// "S_AXI_ACP" : S_AXI_ACP.slave.set_function_level_info(LEVEL); + "ALL" : begin +// M_AXI_GP0.master.set_function_level_info(LEVEL); +// M_AXI_GP1.master.set_function_level_info(LEVEL); +// S_AXI_GP0.slave.set_function_level_info(LEVEL); +// S_AXI_GP1.slave.set_function_level_info(LEVEL); +// S_AXI_HP0.slave.set_function_level_info(LEVEL); +// S_AXI_HP1.slave.set_function_level_info(LEVEL); +// S_AXI_HP2.slave.set_function_level_info(LEVEL); +// S_AXI_HP3.slave.set_function_level_info(LEVEL); +// S_AXI_ACP.slave.set_function_level_info(LEVEL); + end + default : $display("[%0d] : %0s : Invalid Port name (%0s)",$time, DISP_ERR, name); + endcase + end + endtask + + /* API for setting the Message verbosity */ + task automatic set_debug_level_info; + input LEVEL; + begin + $display("[%0d] : %0s : Setting Debug Level Info as %0b",$time, DISP_INFO, LEVEL); + DEBUG_INFO = LEVEL; + M_AXI_GP0.DEBUG_INFO = LEVEL; + M_AXI_GP1.DEBUG_INFO = LEVEL; + S_AXI_GP0.DEBUG_INFO = LEVEL; + S_AXI_GP1.DEBUG_INFO = LEVEL; + S_AXI_HP0.DEBUG_INFO = LEVEL; + S_AXI_HP1.DEBUG_INFO = LEVEL; + S_AXI_HP2.DEBUG_INFO = LEVEL; + S_AXI_HP3.DEBUG_INFO = LEVEL; + S_AXI_ACP.DEBUG_INFO = LEVEL; + end + endtask + + /* API for setting ARQos Values */ + task automatic set_arqos; + input [1023:0] name; + input [axi_qos_width-1:0] value; + begin + $display("[%0d] : [%0s] : %0s Port/s : Setting AWQOS as %0b",$time, DISP_INFO, name , value); + case(name) + "S_AXI_GP0" : S_AXI_GP0.set_arqos(value); + "S_AXI_GP1" : S_AXI_GP1.set_arqos(value); + "S_AXI_HP0" : S_AXI_HP0.set_arqos(value); + "S_AXI_HP1" : S_AXI_HP1.set_arqos(value); + "S_AXI_HP2" : S_AXI_HP2.set_arqos(value); + "S_AXI_HP3" : S_AXI_HP3.set_arqos(value); + "S_AXI_ACP" : S_AXI_ACP.set_arqos(value); + default : $display("[%0d] : %0s : Invalid Slave Port name (%0s)",$time, DISP_ERR, name); + endcase + end + endtask + + /* API for setting AWQos Values */ + task automatic set_awqos; + input [1023:0] name; + input [axi_qos_width-1:0] value; + begin + $display("[%0d] : [%0s] : %0s Port/s : Setting ARQOS as %0b",$time, DISP_INFO, name , value); + case(name) + "S_AXI_GP0" : S_AXI_GP0.set_awqos(value); + "S_AXI_GP1" : S_AXI_GP1.set_awqos(value); + "S_AXI_HP0" : S_AXI_HP0.set_awqos(value); + "S_AXI_HP1" : S_AXI_HP1.set_awqos(value); + "S_AXI_HP2" : S_AXI_HP2.set_awqos(value); + "S_AXI_HP3" : S_AXI_HP3.set_awqos(value); + "S_AXI_ACP" : S_AXI_ACP.set_awqos(value); + default : $display("[%0d] : %0s : Invalid Slave Port (%0s)",$time, DISP_ERR, name); + endcase + end + endtask + + /* API for soft reset control */ + task automatic fpga_soft_reset; + input[data_width-1:0] reset_ctrl; + begin + if(DEBUG_INFO) $display("[%0d] : %0s : FPGA Soft Reset called for 0x%0h",$time, DISP_INFO, reset_ctrl); + gen_rst.fpga_soft_reset(reset_ctrl); + end + endtask + + /* API for por and strb reset control */ +// task automatic por_srstb_reset; +// input por_reset_ctrl; +// begin +// if(DEBUG_INFO) $display("[%0d] : %0s : POR and STRB Reset called for 0x%0h",$time, DISP_INFO, por_reset_ctrl); +// // gen_rst.por_srstb_reset(por_reset_ctrl); +// gen_rst.por_srstb_reset(por_reset_ctrl); +// +// end +// endtask + + /* API for pre-loading memories from (DDR/OCM model) */ + task automatic pre_load_mem_from_file; + input [(max_chars*8)-1:0] file_name; + input [addr_width-1:0] start_addr; + input [int_width-1:0] no_of_bytes; + reg [1:0] mem_type; + integer succ; + begin + mem_type = decode_address(start_addr); + succ = $fopen(file_name,"r"); + if(succ == 0) begin + $display("[%0d] : %0s : '%0s' doesn't exist. 'pre_load_mem_from_file' call failed ...\n",$time, DISP_ERR, file_name); + if(STOP_ON_ERROR) $stop; + end + else if(check_addr_aligned(start_addr)) begin + case(mem_type) + OCM_MEM : begin + if (!C_HIGH_OCM_EN) + ocmc.ocm.pre_load_mem_from_file(file_name,start_addr,no_of_bytes); + else + ocmc.ocm.pre_load_mem_from_file(file_name,(start_addr - high_ocm_start_addr),no_of_bytes); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> OCM Memory is pre-loaded with %0d bytes of data from file %0s",$time, DISP_INFO, start_addr, no_of_bytes, file_name); + end + DDR_MEM : begin + ddrc.ddr.pre_load_mem_from_file(file_name,start_addr,no_of_bytes); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> DDR Memory is pre-loaded with %0d bytes of data from file %0s",$time, DISP_INFO, start_addr, no_of_bytes, file_name); + end + default : begin + $display("[%0d] : %0s : Address(0x%0h) is out-of-range. 'pre_load_mem_from_file' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end + endcase + end else begin + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'pre_load_mem_from_file' call failed ...",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) + $stop; + end + end + endtask + + /* API for pre-loading memories (DDR/OCM) */ + task automatic pre_load_mem; + input [1:0] data_type; + input [addr_width-1:0] start_addr; + input [int_width-1:0] no_of_bytes; + reg [1:0] mem_type; + begin + mem_type = decode_address(start_addr); + if(check_addr_aligned(start_addr)) begin + case(mem_type) + OCM_MEM : begin + if (!C_HIGH_OCM_EN) + ocmc.ocm.pre_load_mem(data_type,start_addr,no_of_bytes); + else + ocmc.ocm.pre_load_mem(data_type,(start_addr - high_ocm_start_addr),no_of_bytes); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> OCM Memory is pre-loaded with %0d bytes of data",$time, DISP_INFO, start_addr, no_of_bytes); + end + DDR_MEM : begin + ddrc.ddr.pre_load_mem(data_type,start_addr,no_of_bytes); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> DDR Memory is pre-loaded with %0d bytes of data",$time, DISP_INFO, start_addr, no_of_bytes); + end + default : begin + $display("[%0d] : %0s : Address(0x%0h) is out-of-range. 'pre_load_mem' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end + endcase + end else begin + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'pre_load_mem' call failed ...",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end + end + endtask + + /* API for backdoor write to memories (DDR/OCM) */ + task automatic write_mem; + input [max_burst_bits-1 :0] data; + input [addr_width-1:0] start_addr; + input [max_burst_bytes_width:0] no_of_bytes; + reg [1:0] mem_type; + integer succ; + begin + mem_type = decode_address(start_addr); + if(check_addr_aligned(start_addr)) begin + case(mem_type) + OCM_MEM : begin + if (!C_HIGH_OCM_EN) + ocmc.ocm.write_mem(data,start_addr,no_of_bytes,all_strb_valid); + else + ocmc.ocm.write_mem(data,(start_addr - high_ocm_start_addr),no_of_bytes,all_strb_valid); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> Write %0d bytes of data to OCM Memory",$time, DISP_INFO, start_addr, no_of_bytes); + end + DDR_MEM : begin + ddrc.ddr.write_mem(data,start_addr,no_of_bytes,all_strb_valid); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> Write %0d bytes of data to DDR Memory",$time, DISP_INFO, start_addr, no_of_bytes); + end + default : begin + $display("[%0d] : %0s : Address(0x%0h) is out-of-range. 'write_mem' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end + endcase + end else begin + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'write_mem' call failed ...",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) + $stop; + end + end + endtask + + /* read_memory */ + task automatic read_mem; + input [addr_width-1:0] start_addr; + input [max_burst_bytes_width :0] no_of_bytes; + output[max_burst_bits-1 :0] data; + reg [1:0] mem_type; + integer succ; + begin + mem_type = decode_address(start_addr); + if(check_addr_aligned(start_addr)) begin + case(mem_type) + OCM_MEM : begin + if (!C_HIGH_OCM_EN) + ocmc.ocm.read_mem(data,start_addr,no_of_bytes); + else + ocmc.ocm.read_mem(data,(start_addr - high_ocm_start_addr),no_of_bytes); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> Read %0d bytes of data from OCM Memory ",$time, DISP_INFO, start_addr, no_of_bytes); + end + DDR_MEM : begin + ddrc.ddr.read_mem(data,start_addr,no_of_bytes); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> Read %0d bytes of data from DDR Memory",$time, DISP_INFO, start_addr, no_of_bytes); + end + default : begin + $display("[%0d] : %0s : Address(0x%0h) is out-of-range. 'read_mem' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end + endcase + end else begin + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'read_mem' call failed ...",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) + $stop; + end + end + endtask + + /* API for backdoor read to memories (DDR/OCM) */ + task automatic peek_mem_to_file; + input [(max_chars*8)-1:0] file_name; + input [addr_width-1:0] start_addr; + input [int_width-1:0] no_of_bytes; + reg [1:0] mem_type; + integer succ; + begin + mem_type = decode_address(start_addr); + if(check_addr_aligned(start_addr)) begin + case(mem_type) + OCM_MEM : begin + if (!C_HIGH_OCM_EN) + ocmc.ocm.peek_mem_to_file(file_name,start_addr,no_of_bytes); + else + ocmc.ocm.peek_mem_to_file(file_name,(start_addr - high_ocm_start_addr),no_of_bytes); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> Peeked %0d bytes of data from OCM Memory to file %0s",$time, DISP_INFO, start_addr, no_of_bytes, file_name); + end + DDR_MEM : begin + ddrc.ddr.peek_mem_to_file(file_name,start_addr,no_of_bytes); + if(DEBUG_INFO) + $display("[%0d] : %0s : Starting Address(0x%0h) -> Peeked %0d bytes of data from DDR Memory to file %0s",$time, DISP_INFO, start_addr, no_of_bytes, file_name); + end + default : begin + $display("[%0d] : %0s : Address(0x%0h) is out-of-range. 'peek_mem_to_file' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end + endcase + end else begin + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'peek_mem_to_file' call failed ...",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) + $stop; + end + end + endtask + + /* API to read interrupt status */ + task automatic read_interrupt; + output[irq_width-1:0] irq_status; + begin + irq_status = IRQ_F2P; + if(DEBUG_INFO) $display("[%0d] : %0s : Reading Interrupt Status as 0x%0h",$time, DISP_INFO, irq_status); + end + endtask + + /* API to wait on interrup */ + task automatic wait_interrupt; + input [3:0] irq; + output[irq_width-1:0] irq_status; + begin + if(DEBUG_INFO) $display("[%0d] : %0s : Waiting on Interrupt irq[%0d]",$time, DISP_INFO, irq); + + case(irq) + 0 : wait(IRQ_F2P[0] === 1'b1); + 1 : wait(IRQ_F2P[1] === 1'b1); + 2 : wait(IRQ_F2P[2] === 1'b1); + 3 : wait(IRQ_F2P[3] === 1'b1); + 4 : wait(IRQ_F2P[4] === 1'b1); + 5 : wait(IRQ_F2P[5] === 1'b1); + 6 : wait(IRQ_F2P[6] === 1'b1); + 7 : wait(IRQ_F2P[7] === 1'b1); + 8 : wait(IRQ_F2P[8] === 1'b1); + 8 : wait(IRQ_F2P[9] === 1'b1); + 10: wait(IRQ_F2P[10] === 1'b1); + 11: wait(IRQ_F2P[11] === 1'b1); + 12: wait(IRQ_F2P[12] === 1'b1); + 13: wait(IRQ_F2P[13] === 1'b1); + 14: wait(IRQ_F2P[14] === 1'b1); + 15: wait(IRQ_F2P[15] === 1'b1); + default : $display("[%0d] : %0s : Only 16 Interrupt lines (irq_fp0:irq_fp15) are supported",$time, DISP_ERR); + endcase + if(DEBUG_INFO) $display("[%0d] : %0s : Received Interrupt irq[%0d]",$time, DISP_INFO, irq); + irq_status = IRQ_F2P; + end + endtask + + /* API to wait for a certain match pattern*/ + task automatic wait_mem_update; + input[addr_width-1:0] address; + input[data_width-1:0] data_in; + output[data_width-1:0] data_out; + reg[data_width-1:0] datao; + begin + if(mem_update_key) begin + mem_update_key = 0; + if(DEBUG_INFO) $display("[%0d] : %0s : 'wait_mem_update' called for Address(0x%0h) , Match Pattern(0x%0h) \n",$time, DISP_INFO, address, data_in); + if(check_addr_aligned(address)) begin + ddrc.ddr.wait_mem_update(address, datao); + if(datao != data_in)begin + $display("[%0d] : %0s : Address(0x%0h) -> DATA PATTERN MATCH FAILED, Expected data = 0x%0h, Received data = 0x%0h \n",$time, DISP_ERR, address, data_in,datao); + $stop; + end else + $display("[%0d] : %0s : Address(0x%0h) -> DATA PATTERN(0x%0h) MATCHED \n",$time, DISP_INFO, address, data_in); + data_out = datao; + end else begin + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'wait_mem_update' call failed ...\n",$time, DISP_ERR, address); + if(STOP_ON_ERROR) $stop; + end + mem_update_key = 1; + end else + $display("[%0d] : %0s : One instance of 'wait_mem_update' thread is already running.Only one instance can be called at a time ...\n",$time, DISP_WARN); + end + endtask + + + /* API to initiate a WRITE transaction on one of the AXI-Master ports*/ + task automatic write_from_file; + input [(max_chars*8)-1:0] file_name; + input [addr_width-1:0] start_addr; + input [int_width-1:0] wr_size; + output [axi_rsp_width-1:0] response; + integer succ; + begin + succ = $fopen(file_name,"r"); + if(succ == 0) begin + $display("[%0d] : %0s : '%0s' doesn't exist. 'write_from_file' call failed ...\n",$time, DISP_ERR, file_name); + if(STOP_ON_ERROR) $stop; + end + else if(!check_master_address(start_addr)) begin + $display("[%0d] : %0s : Master Address(0x%0h) is out of range\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end else if(check_addr_aligned(start_addr)) begin + $fclose(succ); + // case(start_addr[31:30]) + if (start_addr[31:30] === 2'b01) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Starting Address(0x%0h) -> AXI Write -> %0d bytes from file %0s",$time, DISP_INFO, start_addr, wr_size, file_name); + M_AXI_GP0.write_from_file(file_name,start_addr,wr_size,response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Done AXI Write for Starting Address(0x%0h)",$time, DISP_INFO, start_addr); + end else if(start_addr[31:30] === 2'b10) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Starting Address(0x%0h) -> AXI Write -> %0d bytes from file %0s",$time, DISP_INFO, start_addr, wr_size, file_name); + M_AXI_GP1.write_from_file(file_name,start_addr,wr_size,response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Done AXI Write for Starting Address(0x%0h)",$time, DISP_INFO, start_addr); + end else begin + $display("[%0d] : %0s : Invalid Address(0x%0h) 'write_from_file' call failed ...\n",$time, DISP_ERR, start_addr); + end + // endcase + end else begin + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'write_from_file' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end + end + endtask + + /* API to initiate a READ transaction on one of the AXI-Master ports*/ + task automatic read_to_file; + input [(max_chars*8)-1:0] file_name; + input [addr_width-1:0] start_addr; + input [int_width-1:0] rd_size; + output [axi_rsp_width-1:0] response; + begin + if(!check_master_address(start_addr)) begin + $display("[%0d] : %0s : Master Address(0x%0h) is out of range\n",$time, DISP_ERR , start_addr); + if(STOP_ON_ERROR) $stop; + end else if(check_addr_aligned(start_addr)) begin + // case(start_addr[31:30]) + if (start_addr[31:30] === 2'b01) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Starting Address(0x%0h) -> AXI Read -> %0d bytes to file %0s",$time, DISP_INFO, start_addr, rd_size, file_name); + M_AXI_GP0.read_to_file(file_name,start_addr,rd_size,response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Done AXI Read for Starting Address(0x%0h)",$time, DISP_INFO, start_addr); + end else if(start_addr[31:30] === 2'b10) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Starting Address(0x%0h) -> AXI Read -> %0d bytes to file %0s",$time, DISP_INFO, start_addr, rd_size, file_name); + M_AXI_GP1.read_to_file(file_name,start_addr,rd_size,response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Done AXI Read for Starting Address(0x%0h)",$time, DISP_INFO, start_addr); + // end + // default : $display("[%0d] : %0s : Invalid Address(0x%0h) 'read_to_file' call failed ...\n",$time, DISP_ERR, start_addr); + // endcase + end else begin + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'read_to_file' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end + end + end + endtask + + /* API to initiate a WRITE transaction(<= 128 bytes) on one of the AXI-Master ports*/ + task automatic write_data; + input [addr_width-1:0] start_addr; + input [max_transfer_bytes_width:0] wr_size; + input [(max_transfer_bytes*8)-1:0] w_data; + output [axi_rsp_width-1:0] response; + reg[511:0] rsp; + begin + if(!check_master_address(start_addr)) begin + $display("[%0d] : %0s : Master Address(0x%0h) is out of range. 'write_data' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end else if(wr_size > max_transfer_bytes) begin + $display("[%0d] : %0s : Byte Size supported is 128 bytes only. 'write_data' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end else if(start_addr[31:30] === GP_M0) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Starting Address(0x%0h) -> AXI Write -> %0d bytes",$time, DISP_INFO, start_addr, wr_size); + M_AXI_GP0.write_data(start_addr,wr_size,w_data,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Done AXI Write for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else if(start_addr[31:30] === GP_M1) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Starting Address(0x%0h) -> AXI Write -> %0d bytes",$time, DISP_INFO, start_addr, wr_size); + M_AXI_GP1.write_data(start_addr,wr_size,w_data,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Done AXI Write for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else + $display("[%0d] : %0s : Invalid Address(0x%0h) 'write_data' call failed ...\n",$time, DISP_ERR, start_addr); + end + endtask + + /* API to initiate a READ transaction(<= 128 bytes) on one of the AXI-Master ports*/ + task automatic read_data; + input [addr_width-1:0] start_addr; + input [max_transfer_bytes_width:0] rd_size; + output[(max_transfer_bytes*8)-1:0] rd_data; + output [axi_rsp_width-1:0] response; + reg[511:0] rsp; + begin + if(!check_master_address(start_addr)) begin + $display("[%0d] : %0s : Master Address(0x%0h) is out of range 'read_data' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end else if(rd_size > max_transfer_bytes) begin + $display("[%0d] : %0s : Byte Size supported is 128 bytes only.'read_data' call failed ... \n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end else if(start_addr[31:30] === GP_M0) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Starting Address(0x%0h) -> AXI Read -> %0d bytes",$time, DISP_INFO, start_addr, rd_size); + M_AXI_GP0.read_data(start_addr,rd_size,rd_data,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Done AXI Read for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else if(start_addr[31:30] === GP_M1) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Starting Address(0x%0h) -> AXI Read -> %0d bytes",$time, DISP_INFO, start_addr, rd_size); + M_AXI_GP1.read_data(start_addr,rd_size,rd_data,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Done AXI Read for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else + $display("[%0d] : %0s : Invalid Address(0x%0h) 'read_data' call failed ...\n",$time, DISP_ERR, start_addr); + end + endtask + +/* Hooks to call to VIP APIs */ + task automatic write_burst(input [addr_width-1:0] start_addr,input [axi_len_width-1:0] len,input [axi_size_width-1:0] siz,input [axi_brst_type_width-1:0] burst,input [axi_lock_width-1:0] lck,input [axi_cache_width-1:0] cache,input [axi_prot_width-1:0] prot,input [(axi_mgp_data_width*axi_burst_len)-1:0] data,input integer datasize, output [axi_rsp_width-1:0] response); + reg[511:0] rsp; + begin + if(!check_master_address(start_addr)) begin + $display("[%0d] : %0s : Master Address(0x%0h) is out of range. 'write_burst' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end else if(start_addr[31:30] === 2'b01) begin + // end else if(start_addr[31:30] === GP_M0) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Starting Address(0x%0h) -> AXI Write -> %0d bytes",$time, DISP_INFO, start_addr, datasize); + M_AXI_GP0.write_burst(start_addr,len,siz,burst,lck,cache,prot,data,datasize,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Done AXI Write for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else if(start_addr[31:30] === 2'b10) begin + // end else if(start_addr[31:30] === GP_M1) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Starting Address(0x%0h) -> AXI Write -> %0d bytes",$time, DISP_INFO, start_addr, datasize); + M_AXI_GP1.write_burst(start_addr,len,siz,burst,lck,cache,prot,data,datasize,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Done AXI Write for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else + $display("[%0d] : %0s : Invalid Address(0x%0h) 'write_burst' call failed ... \n",$time, DISP_ERR, start_addr); + end + endtask + + task automatic write_burst_concurrent(input [addr_width-1:0] start_addr,input [axi_len_width-1:0] len,input [axi_size_width-1:0] siz,input [axi_brst_type_width-1:0] burst,input [axi_lock_width-1:0] lck,input [axi_cache_width-1:0] cache,input [axi_prot_width-1:0] prot,input [(axi_mgp_data_width*axi_burst_len)-1:0] data,input integer datasize, output [axi_rsp_width-1:0] response); + reg[511:0] rsp; /// string for response + begin + if(!check_master_address(start_addr)) begin + $display("[%0d] : %0s : Master Address(0x%0h) is out of range. 'write_burst_concurrent' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end else if(start_addr[31:30] === 2'b01) begin + // end else if(start_addr[31:30] === GP_M0) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Starting Address(0x%0h) -> AXI Write -> %0d bytes",$time, DISP_INFO, start_addr, datasize); + M_AXI_GP0.write_burst_concurrent(start_addr,len,siz,burst,lck,cache,prot,data,datasize,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Done AXI Write for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else if(start_addr[31:30] === 2'b10) begin + // end else if(start_addr[31:30] === GP_M1) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Starting Address(0x%0h) -> AXI Write -> %0d bytes",$time, DISP_INFO, start_addr, datasize); + M_AXI_GP1.write_burst_concurrent(start_addr,len,siz,burst,lck,cache,prot,data,datasize,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Done AXI Write for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else + $display("[%0d] : %0s : Invalid Address(0x%0h) 'write_burst_concurrent' call failed ... \n",$time, DISP_ERR, start_addr); + end + endtask + + task automatic read_burst; + input [addr_width-1:0] start_addr; + input [axi_len_width-1:0] len; + input [axi_size_width-1:0] siz; + input [axi_brst_type_width-1:0] burst; + input [axi_lock_width-1:0] lck; + input [axi_cache_width-1:0] cache; + input [axi_prot_width-1:0] prot; + output [(axi_mgp_data_width*axi_burst_len)-1:0] data; + output [(axi_rsp_width*axi_burst_len)-1:0] response; + reg[511:0] rsp; + begin + if(!check_master_address(start_addr)) begin + $display("[%0d] : %0s : Master Address(0x%0h) is out of range. 'read_burst' call failed ...\n",$time, DISP_ERR, start_addr); + if(STOP_ON_ERROR) $stop; + end else if(start_addr[31:30] === 2'b01) begin + // end else if(start_addr[31:30] === GP_M0) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Starting Address(0x%0h) -> AXI Read",$time, DISP_INFO, start_addr); + M_AXI_GP0.read_burst(start_addr,len,siz,burst,lck,cache,prot,data,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : Done AXI Read for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else if(start_addr[31:30] === 2'b10) begin + // end else if(start_addr[31:30] === GP_M1) begin + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Starting Address(0x%0h) -> AXI Read",$time, DISP_INFO, start_addr); + M_AXI_GP1.read_burst(start_addr,len,siz,burst,lck,cache,prot,data,response); + rsp = get_resp(response); + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : Done AXI Read for Starting Address(0x%0h) with Response '%0s'",$time, DISP_INFO, start_addr, rsp); + end else + $display("[%0d] : %0s : Invalid Address(0x%0h) 'read_burst' call failed ... \n",$time, DISP_ERR, start_addr); + end + endtask + + task automatic wait_reg_update; + input [addr_width-1:0] addr; + input [data_width-1:0] data_i; + input [data_width-1:0] mask_i; + input [int_width-1:0] time_interval; + input [int_width-1:0] time_out; + output [data_width-1:0] data_o; + + reg upd_done0; + reg upd_done1; + begin + if(!check_master_address(addr)) begin + $display("[%0d] : %0s : Address(0x%0h) is out of range. 'wait_reg_update' call failed ...\n",$time, DISP_ERR, addr); + if(STOP_ON_ERROR) $stop; + end else if(addr[31:30] === 2'b01) begin + // end else if(addr[31:30] === GP_M0) begin + if(reg_update_key_0) begin + reg_update_key_0 = 0; + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP0 : %0s : 'wait_reg_update' called for Address(0x%0h), Mask(0x%0h), Match Pattern(0x%0h) \n ",$time, DISP_INFO, addr, mask_i, data_i); + M_AXI_GP0.wait_reg_update(addr, data_i, mask_i, time_interval, time_out, data_o, upd_done0); + if(DEBUG_INFO && upd_done0) + $display("[%0d] : M_AXI_GP0 : %0s : Register mapped at Address(0x%0h) is updated ",$time, DISP_INFO, addr); + reg_update_key_0 = 1; + end else + $display("[%0d] : M_AXI_GP0 : One instance of 'wait_reg_update' thread is already running.Only one instance can be called at a time ...\n",$time, DISP_WARN); + end else if(addr[31:30] === 2'b10) begin + // end else if(addr[31:30] === GP_M1) begin + if(reg_update_key_1) begin + reg_update_key_1 = 0; + if(DEBUG_INFO) + $display("[%0d] : M_AXI_GP1 : %0s : 'wait_reg_update' called for Address(0x%0h), Mask(0x%0h), Match Pattern(0x%0h) \n ",$time, DISP_INFO, addr, mask_i, data_i); + M_AXI_GP1.wait_reg_update(addr, data_i, mask_i, time_interval, time_out, data_o, upd_done1); + if(DEBUG_INFO && upd_done1) + $display("[%0d] : M_AXI_GP1 : %0s : Register mapped at Address(0x%0h) is updated ",$time, DISP_INFO, addr); + reg_update_key_1 = 1; + end else + $display("[%0d] : M_AXI_GP1 : One instance of 'wait_reg_update' thread is already running.Only one instance can be called at a time ...\n",$time, DISP_WARN); + end else + $display("[%0d] : %0s : Invalid Address(0x%0h) 'wait_reg_update' call failed ... \n",$time, DISP_ERR, addr); + end + endtask + +/* API to read register map */ + task read_register_map; + input [addr_width-1:0] start_addr; + input [max_regs_width:0] no_of_registers; + output[max_burst_bits-1 :0] data; + reg [max_regs_width:0] no_of_regs; + begin + no_of_regs = no_of_registers; + if(no_of_registers > 32) begin + $display("[%0d] : %0s : No_of_Registers(%0d) exceeds the supported number (32).\n Only 32 registers will be read.",$time, DISP_ERR, start_addr); + no_of_regs = 32; + end + if(check_addr_aligned(start_addr)) begin + if(decode_address(start_addr) == REG_MEM) begin + if(DEBUG_INFO) $display("[%0d] : %0s : Reading Registers starting address (0x%0h) -> %0d registers",$time, DISP_INFO, start_addr,no_of_regs ); + regc.regm.read_reg_mem(data,start_addr,no_of_regs*4); /// as each register is of 4 bytes + if(DEBUG_INFO) $display("[%0d] : %0s : DONE -> Reading Registers starting address (0x%0h), Data returned(0x%0h)",$time, DISP_INFO, start_addr, data ); + end else begin + $display("[%0d] : %0s : Invalid Address(0x%0h) for Register Read. 'read_register_map' call failed ...",$time, DISP_ERR, start_addr); + end + end else begin + data = 0; + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'read_register_map' call failed ...",$time, DISP_ERR, start_addr); + end + end + endtask + +/* API to read single register */ + task read_register; + input [addr_width-1:0] addr; + output[data_width-1:0] data; + begin + if(check_addr_aligned(addr)) begin + if(decode_address(addr) == REG_MEM) begin + if(DEBUG_INFO) $display("[%0d] : %0s : Reading Register (0x%0h) ",$time, DISP_INFO, addr ); + regc.regm.get_data(addr >> 2, data); + if(DEBUG_INFO) $display("[%0d] : %0s : DONE -> Reading Register (0x%0h), Data returned(0x%0h)",$time, DISP_INFO, addr, data ); + end else begin + $display("[%0d] : %0s : Invalid Address(0x%0h) for Register Read. 'read_register' call failed ...",$time, DISP_ERR, addr); + end + end else begin + data = 0; + $display("[%0d] : %0s : Address(0x%0h) has to be 32-bit aligned. 'read_register' call failed ...",$time, DISP_ERR, addr); + end + + end + endtask + + /* API to set the AXI-Slave profile*/ + task automatic set_slave_profile; + input[1023:0] name; + input[1:0] latency ; + begin + if(DEBUG_INFO) $display("[%0d] : %0s : %0s Port/s : Setting Slave profile",$time, DISP_INFO, name); + case(name) + "S_AXI_GP0" : S_AXI_GP0.set_latency_type(latency); + "S_AXI_GP1" : S_AXI_GP1.set_latency_type(latency); + "S_AXI_HP0" : S_AXI_HP0.set_latency_type(latency); + "S_AXI_HP1" : S_AXI_HP1.set_latency_type(latency); + "S_AXI_HP2" : S_AXI_HP2.set_latency_type(latency); + "S_AXI_HP3" : S_AXI_HP3.set_latency_type(latency); + "S_AXI_ACP" : S_AXI_ACP.set_latency_type(latency); + "ALL" : begin + S_AXI_GP0.set_latency_type(latency); + S_AXI_GP1.set_latency_type(latency); + S_AXI_HP0.set_latency_type(latency); + S_AXI_HP1.set_latency_type(latency); + S_AXI_HP2.set_latency_type(latency); + S_AXI_HP3.set_latency_type(latency); + S_AXI_ACP.set_latency_type(latency); + end + endcase + end + endtask + + +/*------------------------------ LOCAL APIs ------------------------------------------------ */ + + /* local API for address decoding*/ + function automatic [1:0] decode_address; + input [addr_width-1:0] address; + begin + if(!C_HIGH_OCM_EN && (address < ocm_end_addr || address >= ocm_low_addr )) + decode_address = OCM_MEM; /// OCM + else if(address >= ddr_start_addr && address <= ddr_end_addr) + decode_address = DDR_MEM; /// DDR + else if(C_HIGH_OCM_EN && address >= high_ocm_start_addr) + decode_address = OCM_MEM; /// OCM + else if(address >= reg_start_addr && reg_start_addr <= reg_end_addr) + decode_address = REG_MEM; /// Register Map + else + decode_address = INVALID_MEM_TYPE; /// ERROR in Address + end + endfunction + + /* local API for checking address is 32-bit (4-byte) aligned */ + function automatic check_addr_aligned; + input [addr_width-1:0] address; + begin + if((address%4) !=0 ) begin // + check_addr_aligned = 0; ///not_aligned + end else + check_addr_aligned = 1; + end + endfunction + + /* local API to check address for GP Masters */ + function check_master_address; + input [addr_width-1:0] address; + begin + if(address >= m_axi_gp0_baseaddr && address <= m_axi_gp0_highaddr) + check_master_address = 1'b1; + else if(address >= m_axi_gp1_baseaddr && address <= m_axi_gp1_highaddr) + check_master_address = 1'b1; + else + check_master_address = 1'b0; /// ERROR in Address + end + endfunction + + /* Response decode */ + function automatic [511:0] get_resp; + input[axi_rsp_width-1:0] response; + begin + case(response) + 2'b00 : get_resp = "OKAY"; + 2'b01 : get_resp = "EXOKAY"; + 2'b10 : get_resp = "SLVERR"; + 2'b11 : get_resp = "DECERR"; + endcase + end + endfunction diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_acp.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_acp.v new file mode 100644 index 0000000..3a11bbe --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_acp.v @@ -0,0 +1,94 @@ +/***************************************************************************** + * File : processing_system7_vip_v1_0_5_axi_acp.v + * + * Date : 2012-11 + * + * Description : Connections for ACP port + * + *****************************************************************************/ + +/* AXI Slave ACP */ + processing_system7_vip_v1_0_5_axi_slave #( C_USE_S_AXI_ACP, // enable + axi_acp_name, // name + axi_acp_data_width, // data width + addr_width, /// address width + axi_acp_id_width, // ID width + C_S_AXI_ACP_BASEADDR, // slave base address + C_S_AXI_ACP_HIGHADDR,// slave size + axi_acp_outstanding, // outstanding transactions // 7 Reads and 3 Writes + axi_slv_excl_support, // Exclusive access support + axi_acp_wr_outstanding, + axi_acp_rd_outstanding) + S_AXI_ACP(.S_RESETN (net_axi_acp_rstn), + .S_ACLK (S_AXI_ACP_ACLK), + // Write Address Channel + .S_AWID (S_AXI_ACP_AWID), + .S_AWADDR (S_AXI_ACP_AWADDR), + .S_AWLEN (S_AXI_ACP_AWLEN), + .S_AWSIZE (S_AXI_ACP_AWSIZE), + .S_AWBURST (S_AXI_ACP_AWBURST), + .S_AWLOCK (S_AXI_ACP_AWLOCK), + .S_AWCACHE (S_AXI_ACP_AWCACHE), + .S_AWPROT (S_AXI_ACP_AWPROT), + .S_AWVALID (S_AXI_ACP_AWVALID), + .S_AWREADY (S_AXI_ACP_AWREADY), + // Write Data Channel Signals. + .S_WID (S_AXI_ACP_WID), + .S_WDATA (S_AXI_ACP_WDATA), + .S_WSTRB (S_AXI_ACP_WSTRB), + .S_WLAST (S_AXI_ACP_WLAST), + .S_WVALID (S_AXI_ACP_WVALID), + .S_WREADY (S_AXI_ACP_WREADY), + // Write Response Channel Signals. + .S_BID (S_AXI_ACP_BID), + .S_BRESP (S_AXI_ACP_BRESP), + .S_BVALID (S_AXI_ACP_BVALID), + .S_BREADY (S_AXI_ACP_BREADY), + // Read Address Channel Signals. + .S_ARID (S_AXI_ACP_ARID), + .S_ARADDR (S_AXI_ACP_ARADDR), + .S_ARLEN (S_AXI_ACP_ARLEN), + .S_ARSIZE (S_AXI_ACP_ARSIZE), + .S_ARBURST (S_AXI_ACP_ARBURST), + .S_ARLOCK (S_AXI_ACP_ARLOCK), + .S_ARCACHE (S_AXI_ACP_ARCACHE), + .S_ARPROT (S_AXI_ACP_ARPROT), + .S_ARVALID (S_AXI_ACP_ARVALID), + .S_ARREADY (S_AXI_ACP_ARREADY), + // Read Data Channel Signals. + .S_RID (S_AXI_ACP_RID), + .S_RDATA (S_AXI_ACP_RDATA), + .S_RRESP (S_AXI_ACP_RRESP), + .S_RLAST (S_AXI_ACP_RLAST), + .S_RVALID (S_AXI_ACP_RVALID), + .S_RREADY (S_AXI_ACP_RREADY), + // Side band signals + .S_AWQOS (S_AXI_ACP_AWQOS), + .S_ARQOS (S_AXI_ACP_ARQOS), // Side band signals + + .SW_CLK (net_sw_clk), +/* This goes to port 0 of DDR and port 0 of OCM , port 0 of REG*/ + .WR_DATA_ACK_DDR (ddr_wr_ack_port0), + .WR_DATA_ACK_OCM (ocm_wr_ack_port0), + .WR_DATA (net_wr_data_acp), + .WR_DATA_STRB (net_wr_strb_acp), + .WR_ADDR (net_wr_addr_acp), + .WR_BYTES (net_wr_bytes_acp), + .WR_DATA_VALID_DDR (ddr_wr_dv_port0), + .WR_DATA_VALID_OCM (ocm_wr_dv_port0), + .WR_QOS (net_wr_qos_acp), + + .RD_REQ_DDR (ddr_rd_req_port0), + .RD_REQ_OCM (ocm_rd_req_port0), + .RD_REQ_REG (reg_rd_req_port0), + .RD_ADDR (net_rd_addr_acp), + .RD_DATA_DDR (ddr_rd_data_port0), + .RD_DATA_OCM (ocm_rd_data_port0), + .RD_DATA_REG (reg_rd_data_port0), + .RD_BYTES (net_rd_bytes_acp), + .RD_DATA_VALID_DDR (ddr_rd_dv_port0), + .RD_DATA_VALID_OCM (ocm_rd_dv_port0), + .RD_DATA_VALID_REG (reg_rd_dv_port0), + .RD_QOS (net_rd_qos_acp) + +); diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_gp.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_gp.v new file mode 100644 index 0000000..e32105d --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_gp.v @@ -0,0 +1,311 @@ +/***************************************************************************** + * File : processing_system7_vip_v1_0_5_axi_gp.v + * + * Date : 2012-11 + * + * Description : Connections for AXI GP ports + * + *****************************************************************************/ + + /* IDs for Masters + // l2m1 (CPU000) + 12'b11_000_000_00_00 + 12'b11_010_000_00_00 + 12'b11_011_000_00_00 + 12'b11_100_000_00_00 + 12'b11_101_000_00_00 + 12'b11_110_000_00_00 + 12'b11_111_000_00_00 + // l2m1 (CPU001) + 12'b11_000_001_00_00 + 12'b11_010_001_00_00 + 12'b11_011_001_00_00 + 12'b11_100_001_00_00 + 12'b11_101_001_00_00 + 12'b11_110_001_00_00 + 12'b11_111_001_00_00 + */ + +/* AXI -Master GP0 */ + processing_system7_vip_v1_0_5_axi_master #(C_USE_M_AXI_GP0, // enable + axi_mgp0_name,// name + axi_mgp_data_width, /// Data Width + addr_width, /// Address width + axi_mgp_id_width, //// ID Width + axi_mgp_outstanding, //// Outstanding transactions + axi_mst_excl_support, // EXCL Access Support + axi_mgp_wr_id, //WR_ID + axi_mgp_rd_id) //RD_ID + M_AXI_GP0(.M_RESETN (net_axi_mgp0_rstn), + .M_ACLK (M_AXI_GP0_ACLK), + // Write Address Channel + .M_AWID (M_AXI_GP0_AWID_FULL), + .M_AWADDR (M_AXI_GP0_AWADDR), + .M_AWLEN (M_AXI_GP0_AWLEN), + .M_AWSIZE (M_AXI_GP0_AWSIZE), + .M_AWBURST (M_AXI_GP0_AWBURST), + .M_AWLOCK (M_AXI_GP0_AWLOCK), + .M_AWCACHE (M_AXI_GP0_AWCACHE), + .M_AWPROT (M_AXI_GP0_AWPROT), + .M_AWVALID (M_AXI_GP0_AWVALID), + .M_AWREADY (M_AXI_GP0_AWREADY), + // Write Data Channel Signals. + .M_WID (M_AXI_GP0_WID_FULL), + .M_WDATA (M_AXI_GP0_WDATA), + .M_WSTRB (M_AXI_GP0_WSTRB), + .M_WLAST (M_AXI_GP0_WLAST), + .M_WVALID (M_AXI_GP0_WVALID), + .M_WREADY (M_AXI_GP0_WREADY), + // Write Response Channel Signals. + .M_BID (M_AXI_GP0_BID_FULL), + .M_BRESP (M_AXI_GP0_BRESP), + .M_BVALID (M_AXI_GP0_BVALID), + .M_BREADY (M_AXI_GP0_BREADY), + // Read Address Channel Signals. + .M_ARID (M_AXI_GP0_ARID_FULL), + .M_ARADDR (M_AXI_GP0_ARADDR), + .M_ARLEN (M_AXI_GP0_ARLEN), + .M_ARSIZE (M_AXI_GP0_ARSIZE), + .M_ARBURST (M_AXI_GP0_ARBURST), + .M_ARLOCK (M_AXI_GP0_ARLOCK), + .M_ARCACHE (M_AXI_GP0_ARCACHE), + .M_ARPROT (M_AXI_GP0_ARPROT), + .M_ARVALID (M_AXI_GP0_ARVALID), + .M_ARREADY (M_AXI_GP0_ARREADY), + // Read Data Channel Signals. + .M_RID (M_AXI_GP0_RID_FULL), + .M_RDATA (M_AXI_GP0_RDATA), + .M_RRESP (M_AXI_GP0_RRESP), + .M_RLAST (M_AXI_GP0_RLAST), + .M_RVALID (M_AXI_GP0_RVALID), + .M_RREADY (M_AXI_GP0_RREADY), + // Side band signals + .M_AWQOS (M_AXI_GP0_AWQOS), + .M_ARQOS (M_AXI_GP0_ARQOS) + ); + + /* AXI Master GP1 */ + processing_system7_vip_v1_0_5_axi_master #(C_USE_M_AXI_GP1, // enable + axi_mgp1_name,// name + axi_mgp_data_width, /// Data Width + addr_width, /// Address width + axi_mgp_id_width, //// ID Width + axi_mgp_outstanding, //// Outstanding transactions + axi_mst_excl_support, // EXCL Access Support + axi_mgp_wr_id, //WR_ID + axi_mgp_rd_id) //RD_ID + M_AXI_GP1(.M_RESETN (net_axi_mgp1_rstn), + .M_ACLK (M_AXI_GP1_ACLK), + // Write Address Channel + .M_AWID (M_AXI_GP1_AWID_FULL), + .M_AWADDR (M_AXI_GP1_AWADDR), + .M_AWLEN (M_AXI_GP1_AWLEN), + .M_AWSIZE (M_AXI_GP1_AWSIZE), + .M_AWBURST (M_AXI_GP1_AWBURST), + .M_AWLOCK (M_AXI_GP1_AWLOCK), + .M_AWCACHE (M_AXI_GP1_AWCACHE), + .M_AWPROT (M_AXI_GP1_AWPROT), + .M_AWVALID (M_AXI_GP1_AWVALID), + .M_AWREADY (M_AXI_GP1_AWREADY), + // Write Data Channel Signals. + .M_WID (M_AXI_GP1_WID_FULL), + .M_WDATA (M_AXI_GP1_WDATA), + .M_WSTRB (M_AXI_GP1_WSTRB), + .M_WLAST (M_AXI_GP1_WLAST), + .M_WVALID (M_AXI_GP1_WVALID), + .M_WREADY (M_AXI_GP1_WREADY), + // Write Response Channel Signals. + .M_BID (M_AXI_GP1_BID_FULL), + .M_BRESP (M_AXI_GP1_BRESP), + .M_BVALID (M_AXI_GP1_BVALID), + .M_BREADY (M_AXI_GP1_BREADY), + // Read Address Channel Signals. + .M_ARID (M_AXI_GP1_ARID_FULL), + .M_ARADDR (M_AXI_GP1_ARADDR), + .M_ARLEN (M_AXI_GP1_ARLEN), + .M_ARSIZE (M_AXI_GP1_ARSIZE), + .M_ARBURST (M_AXI_GP1_ARBURST), + .M_ARLOCK (M_AXI_GP1_ARLOCK), + .M_ARCACHE (M_AXI_GP1_ARCACHE), + .M_ARPROT (M_AXI_GP1_ARPROT), + .M_ARVALID (M_AXI_GP1_ARVALID), + .M_ARREADY (M_AXI_GP1_ARREADY), + // Read Data Channel Signals. + .M_RID (M_AXI_GP1_RID_FULL), + .M_RDATA (M_AXI_GP1_RDATA), + .M_RRESP (M_AXI_GP1_RRESP), + .M_RLAST (M_AXI_GP1_RLAST), + .M_RVALID (M_AXI_GP1_RVALID), + .M_RREADY (M_AXI_GP1_RREADY), + // Side band signals + .M_AWQOS (M_AXI_GP1_AWQOS), + .M_ARQOS (M_AXI_GP1_ARQOS) + ); + +/* AXI Slave GP0 */ + processing_system7_vip_v1_0_5_axi_slave #(C_USE_S_AXI_GP0, /// enable + axi_sgp0_name, //name + axi_sgp_data_width, /// data width + addr_width, /// address width + axi_sgp_id_width, /// ID width + C_S_AXI_GP0_BASEADDR,//// base address + C_S_AXI_GP0_HIGHADDR,/// Memory size (high_addr - base_addr) + axi_sgp_outstanding, // outstanding transactions + axi_slv_excl_support, // exclusive access not supported + axi_sgp_wr_outstanding, + axi_sgp_rd_outstanding) + S_AXI_GP0(.S_RESETN (net_axi_gp0_rstn), + .S_ACLK (S_AXI_GP0_ACLK), + // Write Address Channel + .S_AWID (S_AXI_GP0_AWID), + .S_AWADDR (S_AXI_GP0_AWADDR), + .S_AWLEN (S_AXI_GP0_AWLEN), + .S_AWSIZE (S_AXI_GP0_AWSIZE), + .S_AWBURST (S_AXI_GP0_AWBURST), + .S_AWLOCK (S_AXI_GP0_AWLOCK), + .S_AWCACHE (S_AXI_GP0_AWCACHE), + .S_AWPROT (S_AXI_GP0_AWPROT), + .S_AWVALID (S_AXI_GP0_AWVALID), + .S_AWREADY (S_AXI_GP0_AWREADY), + // Write Data Channel Signals. + .S_WID (S_AXI_GP0_WID), + .S_WDATA (S_AXI_GP0_WDATA), + .S_WSTRB (S_AXI_GP0_WSTRB), + .S_WLAST (S_AXI_GP0_WLAST), + .S_WVALID (S_AXI_GP0_WVALID), + .S_WREADY (S_AXI_GP0_WREADY), + // Write Response Channel Signals. + .S_BID (S_AXI_GP0_BID), + .S_BRESP (S_AXI_GP0_BRESP), + .S_BVALID (S_AXI_GP0_BVALID), + .S_BREADY (S_AXI_GP0_BREADY), + // Read Address Channel Signals. + .S_ARID (S_AXI_GP0_ARID), + .S_ARADDR (S_AXI_GP0_ARADDR), + .S_ARLEN (S_AXI_GP0_ARLEN), + .S_ARSIZE (S_AXI_GP0_ARSIZE), + .S_ARBURST (S_AXI_GP0_ARBURST), + .S_ARLOCK (S_AXI_GP0_ARLOCK), + .S_ARCACHE (S_AXI_GP0_ARCACHE), + .S_ARPROT (S_AXI_GP0_ARPROT), + .S_ARVALID (S_AXI_GP0_ARVALID), + .S_ARREADY (S_AXI_GP0_ARREADY), + // Read Data Channel Signals. + .S_RID (S_AXI_GP0_RID), + .S_RDATA (S_AXI_GP0_RDATA), + .S_RRESP (S_AXI_GP0_RRESP), + .S_RLAST (S_AXI_GP0_RLAST), + .S_RVALID (S_AXI_GP0_RVALID), + .S_RREADY (S_AXI_GP0_RREADY), + // Side band signals + .S_AWQOS (S_AXI_GP0_AWQOS), + .S_ARQOS (S_AXI_GP0_ARQOS), + + .SW_CLK (net_sw_clk), + .WR_DATA_ACK_OCM (net_wr_ack_ocm_gp0), + .WR_DATA_ACK_DDR (net_wr_ack_ddr_gp0), + .WR_DATA (net_wr_data_gp0), + .WR_DATA_STRB (net_wr_strb_gp0), + .WR_ADDR (net_wr_addr_gp0), + .WR_BYTES (net_wr_bytes_gp0), + .WR_DATA_VALID_OCM (net_wr_dv_ocm_gp0), + .WR_DATA_VALID_DDR (net_wr_dv_ddr_gp0), + .WR_QOS (net_wr_qos_gp0), + .RD_REQ_DDR (net_rd_req_ddr_gp0), + .RD_REQ_OCM (net_rd_req_ocm_gp0), + .RD_REQ_REG (net_rd_req_reg_gp0), + .RD_ADDR (net_rd_addr_gp0), + .RD_DATA_DDR (net_rd_data_ddr_gp0), + .RD_DATA_OCM (net_rd_data_ocm_gp0), + .RD_DATA_REG (net_rd_data_reg_gp0), + .RD_BYTES (net_rd_bytes_gp0), + .RD_DATA_VALID_DDR (net_rd_dv_ddr_gp0), + .RD_DATA_VALID_OCM (net_rd_dv_ocm_gp0), + .RD_DATA_VALID_REG (net_rd_dv_reg_gp0), + .RD_QOS (net_rd_qos_gp0) + +); + +/* AXI Slave GP1 */ + processing_system7_vip_v1_0_5_axi_slave #(C_USE_S_AXI_GP1, /// enable + axi_sgp1_name, //name + axi_sgp_data_width, /// data width + addr_width, /// address width + axi_sgp_id_width, /// ID width + C_S_AXI_GP1_BASEADDR,//// base address + C_S_AXI_GP1_HIGHADDR,/// HIGh_addr + axi_sgp_outstanding, // outstanding transactions + axi_slv_excl_support, // exclusive access + axi_sgp_wr_outstanding, + axi_sgp_rd_outstanding) + S_AXI_GP1(.S_RESETN (net_axi_gp1_rstn), + .S_ACLK (S_AXI_GP1_ACLK), + // Write Address Channel + .S_AWID (S_AXI_GP1_AWID), + .S_AWADDR (S_AXI_GP1_AWADDR), + .S_AWLEN (S_AXI_GP1_AWLEN), + .S_AWSIZE (S_AXI_GP1_AWSIZE), + .S_AWBURST (S_AXI_GP1_AWBURST), + .S_AWLOCK (S_AXI_GP1_AWLOCK), + .S_AWCACHE (S_AXI_GP1_AWCACHE), + .S_AWPROT (S_AXI_GP1_AWPROT), + .S_AWVALID (S_AXI_GP1_AWVALID), + .S_AWREADY (S_AXI_GP1_AWREADY), + // Write Data Channel Signals. + .S_WID (S_AXI_GP1_WID), + .S_WDATA (S_AXI_GP1_WDATA), + .S_WSTRB (S_AXI_GP1_WSTRB), + .S_WLAST (S_AXI_GP1_WLAST), + .S_WVALID (S_AXI_GP1_WVALID), + .S_WREADY (S_AXI_GP1_WREADY), + // Write Response Channel Signals. + .S_BID (S_AXI_GP1_BID), + .S_BRESP (S_AXI_GP1_BRESP), + .S_BVALID (S_AXI_GP1_BVALID), + .S_BREADY (S_AXI_GP1_BREADY), + // Read Address Channel Signals. + .S_ARID (S_AXI_GP1_ARID), + .S_ARADDR (S_AXI_GP1_ARADDR), + .S_ARLEN (S_AXI_GP1_ARLEN), + .S_ARSIZE (S_AXI_GP1_ARSIZE), + .S_ARBURST (S_AXI_GP1_ARBURST), + .S_ARLOCK (S_AXI_GP1_ARLOCK), + .S_ARCACHE (S_AXI_GP1_ARCACHE), + .S_ARPROT (S_AXI_GP1_ARPROT), + .S_ARVALID (S_AXI_GP1_ARVALID), + .S_ARREADY (S_AXI_GP1_ARREADY), + // Read Data Channel Signals. + .S_RID (S_AXI_GP1_RID), + .S_RDATA (S_AXI_GP1_RDATA), + .S_RRESP (S_AXI_GP1_RRESP), + .S_RLAST (S_AXI_GP1_RLAST), + .S_RVALID (S_AXI_GP1_RVALID), + .S_RREADY (S_AXI_GP1_RREADY), + // Side band signals + .S_AWQOS (S_AXI_GP1_AWQOS), + .S_ARQOS (S_AXI_GP1_ARQOS), + + .SW_CLK (net_sw_clk), + .WR_DATA_ACK_DDR (net_wr_ack_ddr_gp1), + .WR_DATA_ACK_OCM (net_wr_ack_ocm_gp1), + .WR_DATA (net_wr_data_gp1), + .WR_DATA_STRB (net_wr_strb_gp1), + .WR_ADDR (net_wr_addr_gp1), + .WR_BYTES (net_wr_bytes_gp1), + .WR_DATA_VALID_OCM (net_wr_dv_ocm_gp1), + .WR_DATA_VALID_DDR (net_wr_dv_ddr_gp1), + .WR_QOS (net_wr_qos_gp1), + .RD_REQ_OCM (net_rd_req_ocm_gp1), + .RD_REQ_DDR (net_rd_req_ddr_gp1), + .RD_REQ_REG (net_rd_req_reg_gp1), + .RD_ADDR (net_rd_addr_gp1), + .RD_DATA_DDR (net_rd_data_ddr_gp1), + .RD_DATA_OCM (net_rd_data_ocm_gp1), + .RD_DATA_REG (net_rd_data_reg_gp1), + .RD_BYTES (net_rd_bytes_gp1), + .RD_DATA_VALID_OCM (net_rd_dv_ocm_gp1), + .RD_DATA_VALID_DDR (net_rd_dv_ddr_gp1), + .RD_DATA_VALID_REG (net_rd_dv_reg_gp1), + .RD_QOS (net_rd_qos_gp1) + +); diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_hp.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_hp.v new file mode 100644 index 0000000..34d7151 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_axi_hp.v @@ -0,0 +1,350 @@ +/***************************************************************************** + * File : processing_system7_vip_v1_0_5_axi_hp.v + * + * Date : 2012-11 + * + * Description : Connections for AXI HP ports + * + *****************************************************************************/ + +/* AXI Slave HP0 */ + processing_system7_vip_v1_0_5_afi_slave #( C_USE_S_AXI_HP0, // enable + axi_hp0_name, // name + C_S_AXI_HP0_DATA_WIDTH, // data width + addr_width, /// address width + axi_hp_id_width, // ID width + C_S_AXI_HP0_BASEADDR, // slave base address + C_S_AXI_HP0_HIGHADDR, // slave size + axi_hp_outstanding, // outstanding transactions // dynamic for AFI ports + axi_slv_excl_support) // Exclusive access support + S_AXI_HP0(.S_RESETN (net_axi_hp0_rstn), + .S_ACLK (S_AXI_HP0_ACLK), + // Write Address channel + .S_AWID (S_AXI_HP0_AWID), + .S_AWADDR (S_AXI_HP0_AWADDR), + .S_AWLEN (S_AXI_HP0_AWLEN), + .S_AWSIZE (S_AXI_HP0_AWSIZE), + .S_AWBURST (S_AXI_HP0_AWBURST), + .S_AWLOCK (S_AXI_HP0_AWLOCK), + .S_AWCACHE (S_AXI_HP0_AWCACHE), + .S_AWPROT (S_AXI_HP0_AWPROT), + .S_AWVALID (S_AXI_HP0_AWVALID), + .S_AWREADY (S_AXI_HP0_AWREADY), + // Write Data channel signals. + .S_WID (S_AXI_HP0_WID), + .S_WDATA (S_AXI_HP0_WDATA), + .S_WSTRB (S_AXI_HP0_WSTRB), + .S_WLAST (S_AXI_HP0_WLAST), + .S_WVALID (S_AXI_HP0_WVALID), + .S_WREADY (S_AXI_HP0_WREADY), + // Write Response channel signals. + .S_BID (S_AXI_HP0_BID), + .S_BRESP (S_AXI_HP0_BRESP), + .S_BVALID (S_AXI_HP0_BVALID), + .S_BREADY (S_AXI_HP0_BREADY), + // Read Address channel signals. + .S_ARID (S_AXI_HP0_ARID), + .S_ARADDR (S_AXI_HP0_ARADDR), + .S_ARLEN (S_AXI_HP0_ARLEN), + .S_ARSIZE (S_AXI_HP0_ARSIZE), + .S_ARBURST (S_AXI_HP0_ARBURST), + .S_ARLOCK (S_AXI_HP0_ARLOCK), + .S_ARCACHE (S_AXI_HP0_ARCACHE), + .S_ARPROT (S_AXI_HP0_ARPROT), + .S_ARVALID (S_AXI_HP0_ARVALID), + .S_ARREADY (S_AXI_HP0_ARREADY), + // Read Data channel signals. + .S_RID (S_AXI_HP0_RID), + .S_RDATA (S_AXI_HP0_RDATA), + .S_RRESP (S_AXI_HP0_RRESP), + .S_RLAST (S_AXI_HP0_RLAST), + .S_RVALID (S_AXI_HP0_RVALID), + .S_RREADY (S_AXI_HP0_RREADY), + // Side band signals + .S_AWQOS (S_AXI_HP0_AWQOS), + .S_ARQOS (S_AXI_HP0_ARQOS), + // these are needed only for HP ports + .S_RDISSUECAP1_EN (S_AXI_HP0_RDISSUECAP1_EN), + .S_WRISSUECAP1_EN (S_AXI_HP0_WRISSUECAP1_EN), + .S_RCOUNT (S_AXI_HP0_RCOUNT), + .S_WCOUNT (S_AXI_HP0_WCOUNT), + .S_RACOUNT (S_AXI_HP0_RACOUNT), + .S_WACOUNT (S_AXI_HP0_WACOUNT), + + .SW_CLK (net_sw_clk), + .WR_DATA_ACK_DDR (net_wr_ack_ddr_hp0), + .WR_DATA_ACK_OCM (net_wr_ack_ocm_hp0), + .WR_DATA (net_wr_data_hp0), + .WR_DATA_STRB (net_wr_strb_hp0), + .WR_ADDR (net_wr_addr_hp0), + .WR_BYTES (net_wr_bytes_hp0), + .WR_DATA_VALID_DDR (net_wr_dv_ddr_hp0), + .WR_DATA_VALID_OCM (net_wr_dv_ocm_hp0), + .WR_QOS (net_wr_qos_hp0), + .RD_REQ_DDR (net_rd_req_ddr_hp0), + .RD_REQ_OCM (net_rd_req_ocm_hp0), + .RD_ADDR (net_rd_addr_hp0), + .RD_DATA_DDR (net_rd_data_ddr_hp0), + .RD_DATA_OCM (net_rd_data_ocm_hp0), + .RD_BYTES (net_rd_bytes_hp0), + .RD_DATA_VALID_DDR (net_rd_dv_ddr_hp0), + .RD_DATA_VALID_OCM (net_rd_dv_ocm_hp0), + .RD_QOS (net_rd_qos_hp0) + ); + +/* AXI Slave HP1 */ + processing_system7_vip_v1_0_5_afi_slave #( C_USE_S_AXI_HP1, // enable + axi_hp1_name, // name + C_S_AXI_HP1_DATA_WIDTH, // data width + addr_width, /// address width + axi_hp_id_width, // ID width + C_S_AXI_HP1_BASEADDR, // slave base address + C_S_AXI_HP1_HIGHADDR, // Slave size + axi_hp_outstanding, // outstanding transactions // dynamic for AFI ports + axi_slv_excl_support) // Exclusive access support + S_AXI_HP1(.S_RESETN (net_axi_hp1_rstn), + .S_ACLK (S_AXI_HP1_ACLK), + // Write Address channel + .S_AWID (S_AXI_HP1_AWID), + .S_AWADDR (S_AXI_HP1_AWADDR), + .S_AWLEN (S_AXI_HP1_AWLEN), + .S_AWSIZE (S_AXI_HP1_AWSIZE), + .S_AWBURST (S_AXI_HP1_AWBURST), + .S_AWLOCK (S_AXI_HP1_AWLOCK), + .S_AWCACHE (S_AXI_HP1_AWCACHE), + .S_AWPROT (S_AXI_HP1_AWPROT), + .S_AWVALID (S_AXI_HP1_AWVALID), + .S_AWREADY (S_AXI_HP1_AWREADY), + // Write Data channel signals. + .S_WID (S_AXI_HP1_WID), + .S_WDATA (S_AXI_HP1_WDATA), + .S_WSTRB (S_AXI_HP1_WSTRB), + .S_WLAST (S_AXI_HP1_WLAST), + .S_WVALID (S_AXI_HP1_WVALID), + .S_WREADY (S_AXI_HP1_WREADY), + // Write Response channel signals. + .S_BID (S_AXI_HP1_BID), + .S_BRESP (S_AXI_HP1_BRESP), + .S_BVALID (S_AXI_HP1_BVALID), + .S_BREADY (S_AXI_HP1_BREADY), + // Read Address channel signals. + .S_ARID (S_AXI_HP1_ARID), + .S_ARADDR (S_AXI_HP1_ARADDR), + .S_ARLEN (S_AXI_HP1_ARLEN), + .S_ARSIZE (S_AXI_HP1_ARSIZE), + .S_ARBURST (S_AXI_HP1_ARBURST), + .S_ARLOCK (S_AXI_HP1_ARLOCK), + .S_ARCACHE (S_AXI_HP1_ARCACHE), + .S_ARPROT (S_AXI_HP1_ARPROT), + .S_ARVALID (S_AXI_HP1_ARVALID), + .S_ARREADY (S_AXI_HP1_ARREADY), + // Read Data channel signals. + .S_RID (S_AXI_HP1_RID), + .S_RDATA (S_AXI_HP1_RDATA), + .S_RRESP (S_AXI_HP1_RRESP), + .S_RLAST (S_AXI_HP1_RLAST), + .S_RVALID (S_AXI_HP1_RVALID), + .S_RREADY (S_AXI_HP1_RREADY), + // Side band signals + .S_AWQOS (S_AXI_HP1_AWQOS), + .S_ARQOS (S_AXI_HP1_ARQOS), + // these are needed only for HP ports + .S_RDISSUECAP1_EN (S_AXI_HP1_RDISSUECAP1_EN), + .S_WRISSUECAP1_EN (S_AXI_HP1_WRISSUECAP1_EN), + .S_RCOUNT (S_AXI_HP1_RCOUNT), + .S_WCOUNT (S_AXI_HP1_WCOUNT), + .S_RACOUNT (S_AXI_HP1_RACOUNT), + .S_WACOUNT (S_AXI_HP1_WACOUNT), + + .SW_CLK (net_sw_clk), + .WR_DATA_ACK_DDR (net_wr_ack_ddr_hp1), + .WR_DATA_ACK_OCM (net_wr_ack_ocm_hp1), + .WR_DATA (net_wr_data_hp1), + .WR_DATA_STRB (net_wr_strb_hp1), + .WR_ADDR (net_wr_addr_hp1), + .WR_BYTES (net_wr_bytes_hp1), + .WR_DATA_VALID_DDR (net_wr_dv_ddr_hp1), + .WR_DATA_VALID_OCM (net_wr_dv_ocm_hp1), + .WR_QOS (net_wr_qos_hp1), + .RD_REQ_DDR (net_rd_req_ddr_hp1), + .RD_REQ_OCM (net_rd_req_ocm_hp1), + .RD_ADDR (net_rd_addr_hp1), + .RD_DATA_DDR (net_rd_data_ddr_hp1), + .RD_DATA_OCM (net_rd_data_ocm_hp1), + .RD_BYTES (net_rd_bytes_hp1), + .RD_DATA_VALID_DDR (net_rd_dv_ddr_hp1), + .RD_DATA_VALID_OCM (net_rd_dv_ocm_hp1), + .RD_QOS (net_rd_qos_hp1) + + ); + +/* AXI Slave HP2 */ + processing_system7_vip_v1_0_5_afi_slave #( C_USE_S_AXI_HP2, // enable + axi_hp2_name, // name + C_S_AXI_HP2_DATA_WIDTH, // data width + addr_width, /// address width + axi_hp_id_width, // ID width + C_S_AXI_HP2_BASEADDR, // slave base address + C_S_AXI_HP2_HIGHADDR, // SLave size + axi_hp_outstanding, // outstanding transactions // dynamic for AFI ports + axi_slv_excl_support) // Exclusive access support + S_AXI_HP2(.S_RESETN (net_axi_hp2_rstn), + .S_ACLK (S_AXI_HP2_ACLK), + // Write Address channel + .S_AWID (S_AXI_HP2_AWID), + .S_AWADDR (S_AXI_HP2_AWADDR), + .S_AWLEN (S_AXI_HP2_AWLEN), + .S_AWSIZE (S_AXI_HP2_AWSIZE), + .S_AWBURST (S_AXI_HP2_AWBURST), + .S_AWLOCK (S_AXI_HP2_AWLOCK), + .S_AWCACHE (S_AXI_HP2_AWCACHE), + .S_AWPROT (S_AXI_HP2_AWPROT), + .S_AWVALID (S_AXI_HP2_AWVALID), + .S_AWREADY (S_AXI_HP2_AWREADY), + // Write Data channel signals. + .S_WID (S_AXI_HP2_WID), + .S_WDATA (S_AXI_HP2_WDATA), + .S_WSTRB (S_AXI_HP2_WSTRB), + .S_WLAST (S_AXI_HP2_WLAST), + .S_WVALID (S_AXI_HP2_WVALID), + .S_WREADY (S_AXI_HP2_WREADY), + // Write Response channel signals. + .S_BID (S_AXI_HP2_BID), + .S_BRESP (S_AXI_HP2_BRESP), + .S_BVALID (S_AXI_HP2_BVALID), + .S_BREADY (S_AXI_HP2_BREADY), + // Read Address channel signals. + .S_ARID (S_AXI_HP2_ARID), + .S_ARADDR (S_AXI_HP2_ARADDR), + .S_ARLEN (S_AXI_HP2_ARLEN), + .S_ARSIZE (S_AXI_HP2_ARSIZE), + .S_ARBURST (S_AXI_HP2_ARBURST), + .S_ARLOCK (S_AXI_HP2_ARLOCK), + .S_ARCACHE (S_AXI_HP2_ARCACHE), + .S_ARPROT (S_AXI_HP2_ARPROT), + .S_ARVALID (S_AXI_HP2_ARVALID), + .S_ARREADY (S_AXI_HP2_ARREADY), + // Read Data channel signals. + .S_RID (S_AXI_HP2_RID), + .S_RDATA (S_AXI_HP2_RDATA), + .S_RRESP (S_AXI_HP2_RRESP), + .S_RLAST (S_AXI_HP2_RLAST), + .S_RVALID (S_AXI_HP2_RVALID), + .S_RREADY (S_AXI_HP2_RREADY), + // Side band signals + .S_AWQOS (S_AXI_HP2_AWQOS), + .S_ARQOS (S_AXI_HP2_ARQOS), + // these are needed only for HP ports + .S_RDISSUECAP1_EN (S_AXI_HP2_RDISSUECAP1_EN), + .S_WRISSUECAP1_EN (S_AXI_HP2_WRISSUECAP1_EN), + .S_RCOUNT (S_AXI_HP2_RCOUNT), + .S_WCOUNT (S_AXI_HP2_WCOUNT), + .S_RACOUNT (S_AXI_HP2_RACOUNT), + .S_WACOUNT (S_AXI_HP2_WACOUNT), + + .SW_CLK (net_sw_clk), + .WR_DATA_ACK_DDR (net_wr_ack_ddr_hp2), + .WR_DATA_ACK_OCM (net_wr_ack_ocm_hp2), + .WR_DATA (net_wr_data_hp2), + .WR_DATA_STRB (net_wr_strb_hp2), + .WR_ADDR (net_wr_addr_hp2), + .WR_BYTES (net_wr_bytes_hp2), + .WR_DATA_VALID_DDR (net_wr_dv_ddr_hp2), + .WR_DATA_VALID_OCM (net_wr_dv_ocm_hp2), + .WR_QOS (net_wr_qos_hp2), + .RD_REQ_DDR (net_rd_req_ddr_hp2), + .RD_REQ_OCM (net_rd_req_ocm_hp2), + .RD_ADDR (net_rd_addr_hp2), + .RD_DATA_DDR (net_rd_data_ddr_hp2), + .RD_DATA_OCM (net_rd_data_ocm_hp2), + .RD_BYTES (net_rd_bytes_hp2), + .RD_DATA_VALID_DDR (net_rd_dv_ddr_hp2), + .RD_DATA_VALID_OCM (net_rd_dv_ocm_hp2), + .RD_QOS (net_rd_qos_hp2) + + ); + +/* AXI Slave HP3 */ + processing_system7_vip_v1_0_5_afi_slave #( C_USE_S_AXI_HP3, // enable + axi_hp3_name, // name + C_S_AXI_HP3_DATA_WIDTH, // data width + addr_width, /// address width + axi_hp_id_width, // ID width + C_S_AXI_HP3_BASEADDR, // slave base address + C_S_AXI_HP3_HIGHADDR, // SLave size + axi_hp_outstanding, // outstanding transactions // dynamic for AFI ports + axi_slv_excl_support) // Exclusive access support + S_AXI_HP3(.S_RESETN (net_axi_hp3_rstn), + .S_ACLK (S_AXI_HP3_ACLK), + // Write ADDRESS CHANNEL + .S_AWID (S_AXI_HP3_AWID), + .S_AWADDR (S_AXI_HP3_AWADDR), + .S_AWLEN (S_AXI_HP3_AWLEN), + .S_AWSIZE (S_AXI_HP3_AWSIZE), + .S_AWBURST (S_AXI_HP3_AWBURST), + .S_AWLOCK (S_AXI_HP3_AWLOCK), + .S_AWCACHE (S_AXI_HP3_AWCACHE), + .S_AWPROT (S_AXI_HP3_AWPROT), + .S_AWVALID (S_AXI_HP3_AWVALID), + .S_AWREADY (S_AXI_HP3_AWREADY), + // Write Data channel signals. + .S_WID (S_AXI_HP3_WID), + .S_WDATA (S_AXI_HP3_WDATA), + .S_WSTRB (S_AXI_HP3_WSTRB), + .S_WLAST (S_AXI_HP3_WLAST), + .S_WVALID (S_AXI_HP3_WVALID), + .S_WREADY (S_AXI_HP3_WREADY), + // Write Response channel signals. + .S_BID (S_AXI_HP3_BID), + .S_BRESP (S_AXI_HP3_BRESP), + .S_BVALID (S_AXI_HP3_BVALID), + .S_BREADY (S_AXI_HP3_BREADY), + // Read Address channel signals. + .S_ARID (S_AXI_HP3_ARID), + .S_ARADDR (S_AXI_HP3_ARADDR), + .S_ARLEN (S_AXI_HP3_ARLEN), + .S_ARSIZE (S_AXI_HP3_ARSIZE), + .S_ARBURST (S_AXI_HP3_ARBURST), + .S_ARLOCK (S_AXI_HP3_ARLOCK), + .S_ARCACHE (S_AXI_HP3_ARCACHE), + .S_ARPROT (S_AXI_HP3_ARPROT), + .S_ARVALID (S_AXI_HP3_ARVALID), + .S_ARREADY (S_AXI_HP3_ARREADY), + // Read Data channel signals. + .S_RID (S_AXI_HP3_RID), + .S_RDATA (S_AXI_HP3_RDATA), + .S_RRESP (S_AXI_HP3_RRESP), + .S_RLAST (S_AXI_HP3_RLAST), + .S_RVALID (S_AXI_HP3_RVALID), + .S_RREADY (S_AXI_HP3_RREADY), + // Side band signals + .S_AWQOS (S_AXI_HP3_AWQOS), + .S_ARQOS (S_AXI_HP3_ARQOS), + // these are needed only for HP ports + .S_RDISSUECAP1_EN (S_AXI_HP3_RDISSUECAP1_EN), + .S_WRISSUECAP1_EN (S_AXI_HP3_WRISSUECAP1_EN), + .S_RCOUNT (S_AXI_HP3_RCOUNT), + .S_WCOUNT (S_AXI_HP3_WCOUNT), + .S_RACOUNT (S_AXI_HP3_RACOUNT), + .S_WACOUNT (S_AXI_HP3_WACOUNT), + + .SW_CLK (net_sw_clk), + .WR_DATA_ACK_DDR (net_wr_ack_ddr_hp3), + .WR_DATA_ACK_OCM (net_wr_ack_ocm_hp3), + .WR_DATA (net_wr_data_hp3), + .WR_DATA_STRB (net_wr_strb_hp3), + .WR_ADDR (net_wr_addr_hp3), + .WR_BYTES (net_wr_bytes_hp3), + .WR_DATA_VALID_DDR (net_wr_dv_ddr_hp3), + .WR_DATA_VALID_OCM (net_wr_dv_ocm_hp3), + .WR_QOS (net_wr_qos_hp3), + .RD_REQ_DDR (net_rd_req_ddr_hp3), + .RD_REQ_OCM (net_rd_req_ocm_hp3), + .RD_ADDR (net_rd_addr_hp3), + .RD_DATA_DDR (net_rd_data_ddr_hp3), + .RD_DATA_OCM (net_rd_data_ocm_hp3), + .RD_BYTES (net_rd_bytes_hp3), + .RD_DATA_VALID_DDR (net_rd_dv_ddr_hp3), + .RD_DATA_VALID_OCM (net_rd_dv_ocm_hp3), + .RD_QOS (net_rd_qos_hp3) + ); diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_local_params.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_local_params.v new file mode 100644 index 0000000..d30fd2a --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_local_params.v @@ -0,0 +1,244 @@ +/***************************************************************************** + * File : processing_system7_vip_v1_0_5_local_params.v + * + * Date : 2012-11 + * + * Description : Parameters used in Zynq VIP + * + *****************************************************************************/ + + +/* local */ +parameter m_axi_gp0_baseaddr = 32'h4000_0000; +parameter m_axi_gp1_baseaddr = 32'h8000_0000; +parameter m_axi_gp0_highaddr = 32'h7FFF_FFFF; +parameter m_axi_gp1_highaddr = 32'hBFFF_FFFF; + +parameter addr_width = 32; // maximum address width +parameter data_width = 32; // maximum data width. +parameter max_chars = 128; // max characters for file name +parameter mem_width = data_width/8; /// memory width in bytes +parameter shft_addr_bits = clogb2(mem_width); /// Address to be right shifted +parameter int_width = 32; //integre width + +/* for internal read/write APIs used for data transfers */ +parameter max_burst_len = 16; /// maximum brst length on axi +parameter max_data_width = 64; // maximum data width for internal AXI bursts +parameter max_burst_bits = (max_data_width * max_burst_len); // maximum data width for internal AXI bursts +parameter max_burst_bytes = (max_burst_bits)/8; // maximum data bytes in each transfer +parameter max_burst_bytes_width = clogb2(max_burst_bytes); // maximum data width for internal AXI bursts + +parameter max_registers = 32; +parameter max_regs_width = clogb2(max_registers); + +parameter REG_MEM = 2'b00, DDR_MEM = 2'b01, OCM_MEM = 2'b10, INVALID_MEM_TYPE = 2'b11; + +/* Interrupt bits supported */ +parameter irq_width = 16; + +/* GP Master0 & Master1 address decode */ +parameter GP_M0 = 2'b01; +parameter GP_M1 = 2'b10; + +parameter ALL_RANDOM= 2'b00; +parameter ALL_ZEROS = 2'b01; +parameter ALL_ONES = 2'b10; + +parameter ddr_start_addr = 32'h0008_0000; +parameter ddr_end_addr = 32'h3FFF_FFFF; + +parameter ocm_start_addr = 32'h0000_0000; +parameter ocm_end_addr = 32'h0003_FFFF; +parameter high_ocm_start_addr = 32'hFFFC_0000; +parameter high_ocm_end_addr = 32'hFFFF_FFFF; +parameter ocm_low_addr = 32'hFFFF_0000; + +parameter reg_start_addr = 32'hE000_0000; +parameter reg_end_addr = 32'hF8F0_2F80; + + +/* for Master port APIs and AXI protocol related signal widths*/ +parameter axi_burst_len = 16; +parameter axi_len_width = clogb2(axi_burst_len); +parameter axi_size_width = 3; +parameter axi_brst_type_width = 2; +parameter axi_lock_width = 2; +parameter axi_cache_width = 4; +parameter axi_prot_width = 3; +parameter axi_rsp_width = 2; +parameter axi_mgp_data_width = 32; +parameter axi_mgp_id_width = 12; +parameter axi_mgp_outstanding = 8; +parameter axi_mgp_wr_id = 12'hC00; +parameter axi_mgp_rd_id = 12'hC0C; +parameter axi_mgp0_name = "M_AXI_GP0"; +parameter axi_mgp1_name = "M_AXI_GP1"; +parameter axi_qos_width = 4; +parameter max_transfer_bytes = 256; // For Master APIs. +parameter max_transfer_bytes_width = clogb2(max_transfer_bytes); // For Master APIs. + + +/* for GP slave ports*/ +parameter axi_sgp_data_width = 32; +parameter axi_sgp_id_width = 6; +parameter axi_sgp_rd_outstanding = 8; +parameter axi_sgp_wr_outstanding = 8; +parameter axi_sgp_outstanding = axi_sgp_rd_outstanding + axi_sgp_wr_outstanding; +parameter axi_sgp0_name = "S_AXI_GP0"; +parameter axi_sgp1_name = "S_AXI_GP1"; + +/* for ACP slave ports*/ +parameter axi_acp_data_width = 64; +parameter axi_acp_id_width = 3; +parameter axi_acp_rd_outstanding = 7; +parameter axi_acp_wr_outstanding = 3; +parameter axi_acp_outstanding = axi_acp_rd_outstanding + axi_acp_wr_outstanding; +parameter axi_acp_name = "S_AXI_ACP"; + +/* for HP slave ports*/ +parameter axi_hp_id_width = 6; +parameter axi_hp_outstanding = 256; /// dynamic based on RCOUNT, WCOUNT .. +parameter axi_hp0_name = "S_AXI_HP0"; +parameter axi_hp1_name = "S_AXI_HP1"; +parameter axi_hp2_name = "S_AXI_HP2"; +parameter axi_hp3_name = "S_AXI_HP3"; + + +parameter axi_slv_excl_support = 0; // For Slave ports EXCL access is not supported +parameter axi_mst_excl_support = 1; // For Master ports EXCL access is supported + +/* AXI transfer types */ +parameter AXI_FIXED = 2'b00; +parameter AXI_INCR = 2'b01; +parameter AXI_WRAP = 2'b10; + +/* Exclusive Access */ +parameter AXI_NRML = 2'b00; +parameter AXI_EXCL = 2'b01; +parameter AXI_LOCK = 2'b10; + +/* AXI Response types */ +parameter AXI_OK = 2'b00; +parameter AXI_EXCL_OK = 2'b01; +parameter AXI_SLV_ERR = 2'b10; +parameter AXI_DEC_ERR = 2'b11; + +function automatic integer clogb2; + input [31:0] value; + begin + value = value - 1; + for (clogb2 = 0; value > 0; clogb2 = clogb2 + 1) begin + value = value >> 1; + end + end +endfunction + +/* needed only for AFI modules and axi_slave modules for internal WRITE FIFOs and RESP FIFOs and interconnect fifo models */ + /* WR FIFO data */ + // parameter wr_fifo_data_bits = axi_qos_width + addr_width + max_burst_bits + (max_burst_bytes_width+1); + // parameter wr_fifo_data_bits = axi_qos_width + addr_width + max_burst_bits + (max_burst_bytes_width+1); + // parameter wr_fifo_data_bits = ((data_bus_width/8)*axi_burst_len) + (data_bus_width*axi_burst_len) + axi_qos_width + addr_width + (max_burst_bytes_width+1); + parameter wr_bytes_lsb = 0; + parameter wr_bytes_msb = max_burst_bytes_width; + parameter wr_addr_lsb = wr_bytes_msb + 1; + parameter wr_addr_msb = wr_addr_lsb + addr_width-1; + parameter wr_data_lsb = wr_addr_msb + 1; + // parameter wr_data_msb = wr_data_lsb + max_burst_bits-1; + // parameter wr_data_msb = wr_data_lsb + (data_bus_width*axi_burst_len)-1; + // parameter wr_qos_lsb = wr_data_msb + 1; + // `parameter wr_qos_msb = wr_qos_lsb + axi_qos_width-1; + + /* WR AFI FIFO data */ + /* ID - 1071:1066 + Resp - 1065:1064 + data - 1063:40 + address - 39:8 + valid_bytes - 7:0 + */ + // parameter wr_afi_fifo_data_bits = axi_qos_width + axi_len_width + axi_hp_id_width + axi_rsp_width + max_burst_bits + addr_width + (max_burst_bytes_width+1); + // parameter wr_afi_bytes_lsb = 0; + // parameter wr_afi_bytes_msb = max_burst_bytes_width; + // parameter wr_afi_addr_lsb = wr_afi_bytes_msb + 1; + // parameter wr_afi_addr_msb = wr_afi_addr_lsb + addr_width-1; + // parameter wr_afi_data_lsb = wr_afi_addr_msb + 1; + // parameter wr_afi_rsp_msb = wr_afi_rsp_lsb + axi_rsp_width-1; + // parameter wr_afi_id_lsb = wr_afi_rsp_msb + 1; + // parameter wr_afi_id_msb = wr_afi_id_lsb + axi_hp_id_width-1; + // parameter wr_afi_ln_lsb = wr_afi_id_msb + 1; + // parameter wr_afi_ln_msb = wr_afi_ln_lsb + axi_len_width-1; + // parameter wr_afi_qos_lsb = wr_afi_ln_msb + 1; + // parameter wr_afi_qos_msb = wr_afi_qos_lsb + axi_qos_width-1; + + + parameter afi_fifo_size = 1024; /// AFI FIFO is stored as 1024-bytes + parameter afi_fifo_databits = 64; /// AFI FIFO is stored as 64-bits i.e 8 bytes per location (8 bytes(64-bits) * 128 locations = 1024 bytes) + parameter afi_fifo_locations= afi_fifo_size/(afi_fifo_databits/8); /// AFI FIFO is stored as 128-locations with 8 bytes per location + +/* for interconnect fifo models */ + parameter intr_max_outstanding = 8; + parameter intr_cnt_width = clogb2(intr_max_outstanding)+1; + parameter rd_info_bits = addr_width + axi_size_width + axi_brst_type_width + axi_len_width + axi_hp_id_width + axi_rsp_width + (max_burst_bytes_width+1); + parameter rd_afi_fifo_bits = max_burst_bits + rd_info_bits ; + + //Read Burst Data, addr, size, burst, len, RID, RRESP, valid bytes + parameter rd_afi_bytes_lsb = 0; + parameter rd_afi_bytes_msb = max_burst_bytes_width; + parameter rd_afi_rsp_lsb = rd_afi_bytes_msb + 1; + parameter rd_afi_rsp_msb = rd_afi_rsp_lsb + axi_rsp_width-1; + parameter rd_afi_id_lsb = rd_afi_rsp_msb + 1; + parameter rd_afi_id_msb = rd_afi_id_lsb + axi_hp_id_width-1; + parameter rd_afi_ln_lsb = rd_afi_id_msb + 1; + parameter rd_afi_ln_msb = rd_afi_ln_lsb + axi_len_width-1; + parameter rd_afi_brst_lsb = rd_afi_ln_msb + 1; + parameter rd_afi_brst_msb = rd_afi_brst_lsb + axi_brst_type_width-1; + parameter rd_afi_siz_lsb = rd_afi_brst_msb + 1; + parameter rd_afi_siz_msb = rd_afi_siz_lsb + axi_size_width-1; + parameter rd_afi_addr_lsb = rd_afi_siz_msb + 1; + parameter rd_afi_addr_msb = rd_afi_addr_lsb + addr_width-1; + parameter rd_afi_data_lsb = rd_afi_addr_msb + 1; + parameter rd_afi_data_msb = rd_afi_data_lsb + max_burst_bits-1; + + +/* Latency types */ + parameter BEST_CASE = 0; + parameter AVG_CASE = 1; + parameter WORST_CASE = 2; + parameter RANDOM_CASE = 3; + +/* Latency Parameters ACP */ + parameter acp_wr_min = 21; + parameter acp_wr_avg = 16; + parameter acp_wr_max = 27; + parameter acp_rd_min = 34; + parameter acp_rd_avg = 125; + parameter acp_rd_max = 130; + +/* Latency Parameters GP */ + parameter gp_wr_min = 21; + parameter gp_wr_avg = 16; + parameter gp_wr_max = 46; + parameter gp_rd_min = 38; + parameter gp_rd_avg = 125; + parameter gp_rd_max = 130; + +/* Latency Parameters HP */ + parameter afi_wr_min = 37; + parameter afi_wr_avg = 41; + parameter afi_wr_max = 42; + parameter afi_rd_min = 41; + parameter afi_rd_avg = 221; + parameter afi_rd_max = 229; + +/* ID VALID and INVALID */ + parameter secure_access_enabled = 0; + parameter id_invalid = 0; + parameter id_valid = 1; + +/* Display */ + parameter DISP_INFO = "*ZYNQ_VIP_INFO"; + parameter DISP_WARN = "*ZYNQ_VIP_WARNING"; + parameter DISP_ERR = "*ZYNQ_VIP_ERROR"; + parameter DISP_INT_INFO = "ZYNQ_VIP_INT_INFO"; + + parameter all_strb_valid = 2048'hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_init.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_init.v new file mode 100644 index 0000000..83ed258 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_init.v @@ -0,0 +1,2924 @@ +/***************************************************************************** + * File : processing_system7_vip_v1_0_5_reg_init.v + * + * Date : 2012-11 + * + * Description : Initialize register default values. + * + *****************************************************************************/ + +// Register default value info for chip pele_ps +// This code was auto-generated by xregdb.py ver. 0.68, Thu Jul 12 10:32:25 2012 +// 54 modules, 2532 registers. + + +// ************************************************************ +// Module afi0 AFI +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( afi0__AFI_RDCHAN_CTRL, val_afi0__AFI_RDCHAN_CTRL); +set_reset_data( afi0__AFI_RDCHAN_ISSUINGCAP, val_afi0__AFI_RDCHAN_ISSUINGCAP); +set_reset_data( afi0__AFI_RDQOS, val_afi0__AFI_RDQOS); +set_reset_data( afi0__AFI_RDDATAFIFO_LEVEL, val_afi0__AFI_RDDATAFIFO_LEVEL); +set_reset_data( afi0__AFI_RDDEBUG, val_afi0__AFI_RDDEBUG); +set_reset_data( afi0__AFI_WRCHAN_CTRL, val_afi0__AFI_WRCHAN_CTRL); +set_reset_data( afi0__AFI_WRCHAN_ISSUINGCAP, val_afi0__AFI_WRCHAN_ISSUINGCAP); +set_reset_data( afi0__AFI_WRQOS, val_afi0__AFI_WRQOS); +set_reset_data( afi0__AFI_WRDATAFIFO_LEVEL, val_afi0__AFI_WRDATAFIFO_LEVEL); +set_reset_data( afi0__AFI_WRDEBUG, val_afi0__AFI_WRDEBUG); + +// ************************************************************ +// Module afi1 AFI +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( afi1__AFI_RDCHAN_CTRL, val_afi1__AFI_RDCHAN_CTRL); +set_reset_data( afi1__AFI_RDCHAN_ISSUINGCAP, val_afi1__AFI_RDCHAN_ISSUINGCAP); +set_reset_data( afi1__AFI_RDQOS, val_afi1__AFI_RDQOS); +set_reset_data( afi1__AFI_RDDATAFIFO_LEVEL, val_afi1__AFI_RDDATAFIFO_LEVEL); +set_reset_data( afi1__AFI_RDDEBUG, val_afi1__AFI_RDDEBUG); +set_reset_data( afi1__AFI_WRCHAN_CTRL, val_afi1__AFI_WRCHAN_CTRL); +set_reset_data( afi1__AFI_WRCHAN_ISSUINGCAP, val_afi1__AFI_WRCHAN_ISSUINGCAP); +set_reset_data( afi1__AFI_WRQOS, val_afi1__AFI_WRQOS); +set_reset_data( afi1__AFI_WRDATAFIFO_LEVEL, val_afi1__AFI_WRDATAFIFO_LEVEL); +set_reset_data( afi1__AFI_WRDEBUG, val_afi1__AFI_WRDEBUG); + +// ************************************************************ +// Module afi2 AFI +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( afi2__AFI_RDCHAN_CTRL, val_afi2__AFI_RDCHAN_CTRL); +set_reset_data( afi2__AFI_RDCHAN_ISSUINGCAP, val_afi2__AFI_RDCHAN_ISSUINGCAP); +set_reset_data( afi2__AFI_RDQOS, val_afi2__AFI_RDQOS); +set_reset_data( afi2__AFI_RDDATAFIFO_LEVEL, val_afi2__AFI_RDDATAFIFO_LEVEL); +set_reset_data( afi2__AFI_RDDEBUG, val_afi2__AFI_RDDEBUG); +set_reset_data( afi2__AFI_WRCHAN_CTRL, val_afi2__AFI_WRCHAN_CTRL); +set_reset_data( afi2__AFI_WRCHAN_ISSUINGCAP, val_afi2__AFI_WRCHAN_ISSUINGCAP); +set_reset_data( afi2__AFI_WRQOS, val_afi2__AFI_WRQOS); +set_reset_data( afi2__AFI_WRDATAFIFO_LEVEL, val_afi2__AFI_WRDATAFIFO_LEVEL); +set_reset_data( afi2__AFI_WRDEBUG, val_afi2__AFI_WRDEBUG); + +// ************************************************************ +// Module afi3 AFI +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( afi3__AFI_RDCHAN_CTRL, val_afi3__AFI_RDCHAN_CTRL); +set_reset_data( afi3__AFI_RDCHAN_ISSUINGCAP, val_afi3__AFI_RDCHAN_ISSUINGCAP); +set_reset_data( afi3__AFI_RDQOS, val_afi3__AFI_RDQOS); +set_reset_data( afi3__AFI_RDDATAFIFO_LEVEL, val_afi3__AFI_RDDATAFIFO_LEVEL); +set_reset_data( afi3__AFI_RDDEBUG, val_afi3__AFI_RDDEBUG); +set_reset_data( afi3__AFI_WRCHAN_CTRL, val_afi3__AFI_WRCHAN_CTRL); +set_reset_data( afi3__AFI_WRCHAN_ISSUINGCAP, val_afi3__AFI_WRCHAN_ISSUINGCAP); +set_reset_data( afi3__AFI_WRQOS, val_afi3__AFI_WRQOS); +set_reset_data( afi3__AFI_WRDATAFIFO_LEVEL, val_afi3__AFI_WRDATAFIFO_LEVEL); +set_reset_data( afi3__AFI_WRDEBUG, val_afi3__AFI_WRDEBUG); + +// ************************************************************ +// Module can0 can +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( can0__SRR, val_can0__SRR); +set_reset_data( can0__MSR, val_can0__MSR); +set_reset_data( can0__BRPR, val_can0__BRPR); +set_reset_data( can0__BTR, val_can0__BTR); +set_reset_data( can0__ECR, val_can0__ECR); +set_reset_data( can0__ESR, val_can0__ESR); +set_reset_data( can0__SR, val_can0__SR); +set_reset_data( can0__ISR, val_can0__ISR); +set_reset_data( can0__IER, val_can0__IER); +set_reset_data( can0__ICR, val_can0__ICR); +set_reset_data( can0__TCR, val_can0__TCR); +set_reset_data( can0__WIR, val_can0__WIR); +set_reset_data( can0__TXFIFO_ID, val_can0__TXFIFO_ID); +set_reset_data( can0__TXFIFO_DLC, val_can0__TXFIFO_DLC); +set_reset_data( can0__TXFIFO_DATA1, val_can0__TXFIFO_DATA1); +set_reset_data( can0__TXFIFO_DATA2, val_can0__TXFIFO_DATA2); +set_reset_data( can0__TXHPB_ID, val_can0__TXHPB_ID); +set_reset_data( can0__TXHPB_DLC, val_can0__TXHPB_DLC); +set_reset_data( can0__TXHPB_DATA1, val_can0__TXHPB_DATA1); +set_reset_data( can0__TXHPB_DATA2, val_can0__TXHPB_DATA2); +set_reset_data( can0__RXFIFO_ID, val_can0__RXFIFO_ID); +set_reset_data( can0__RXFIFO_DLC, val_can0__RXFIFO_DLC); +set_reset_data( can0__RXFIFO_DATA1, val_can0__RXFIFO_DATA1); +set_reset_data( can0__RXFIFO_DATA2, val_can0__RXFIFO_DATA2); +set_reset_data( can0__AFR, val_can0__AFR); +set_reset_data( can0__AFMR1, val_can0__AFMR1); +set_reset_data( can0__AFIR1, val_can0__AFIR1); +set_reset_data( can0__AFMR2, val_can0__AFMR2); +set_reset_data( can0__AFIR2, val_can0__AFIR2); +set_reset_data( can0__AFMR3, val_can0__AFMR3); +set_reset_data( can0__AFIR3, val_can0__AFIR3); +set_reset_data( can0__AFMR4, val_can0__AFMR4); +set_reset_data( can0__AFIR4, val_can0__AFIR4); + +// ************************************************************ +// Module can1 can +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( can1__SRR, val_can1__SRR); +set_reset_data( can1__MSR, val_can1__MSR); +set_reset_data( can1__BRPR, val_can1__BRPR); +set_reset_data( can1__BTR, val_can1__BTR); +set_reset_data( can1__ECR, val_can1__ECR); +set_reset_data( can1__ESR, val_can1__ESR); +set_reset_data( can1__SR, val_can1__SR); +set_reset_data( can1__ISR, val_can1__ISR); +set_reset_data( can1__IER, val_can1__IER); +set_reset_data( can1__ICR, val_can1__ICR); +set_reset_data( can1__TCR, val_can1__TCR); +set_reset_data( can1__WIR, val_can1__WIR); +set_reset_data( can1__TXFIFO_ID, val_can1__TXFIFO_ID); +set_reset_data( can1__TXFIFO_DLC, val_can1__TXFIFO_DLC); +set_reset_data( can1__TXFIFO_DATA1, val_can1__TXFIFO_DATA1); +set_reset_data( can1__TXFIFO_DATA2, val_can1__TXFIFO_DATA2); +set_reset_data( can1__TXHPB_ID, val_can1__TXHPB_ID); +set_reset_data( can1__TXHPB_DLC, val_can1__TXHPB_DLC); +set_reset_data( can1__TXHPB_DATA1, val_can1__TXHPB_DATA1); +set_reset_data( can1__TXHPB_DATA2, val_can1__TXHPB_DATA2); +set_reset_data( can1__RXFIFO_ID, val_can1__RXFIFO_ID); +set_reset_data( can1__RXFIFO_DLC, val_can1__RXFIFO_DLC); +set_reset_data( can1__RXFIFO_DATA1, val_can1__RXFIFO_DATA1); +set_reset_data( can1__RXFIFO_DATA2, val_can1__RXFIFO_DATA2); +set_reset_data( can1__AFR, val_can1__AFR); +set_reset_data( can1__AFMR1, val_can1__AFMR1); +set_reset_data( can1__AFIR1, val_can1__AFIR1); +set_reset_data( can1__AFMR2, val_can1__AFMR2); +set_reset_data( can1__AFIR2, val_can1__AFIR2); +set_reset_data( can1__AFMR3, val_can1__AFMR3); +set_reset_data( can1__AFIR3, val_can1__AFIR3); +set_reset_data( can1__AFMR4, val_can1__AFMR4); +set_reset_data( can1__AFIR4, val_can1__AFIR4); + +// ************************************************************ +// Module ddrc ddrc +// doc version: 1.25 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( ddrc__ddrc_ctrl, val_ddrc__ddrc_ctrl); +set_reset_data( ddrc__Two_rank_cfg, val_ddrc__Two_rank_cfg); +set_reset_data( ddrc__HPR_reg, val_ddrc__HPR_reg); +set_reset_data( ddrc__LPR_reg, val_ddrc__LPR_reg); +set_reset_data( ddrc__WR_reg, val_ddrc__WR_reg); +set_reset_data( ddrc__DRAM_param_reg0, val_ddrc__DRAM_param_reg0); +set_reset_data( ddrc__DRAM_param_reg1, val_ddrc__DRAM_param_reg1); +set_reset_data( ddrc__DRAM_param_reg2, val_ddrc__DRAM_param_reg2); +set_reset_data( ddrc__DRAM_param_reg3, val_ddrc__DRAM_param_reg3); +set_reset_data( ddrc__DRAM_param_reg4, val_ddrc__DRAM_param_reg4); +set_reset_data( ddrc__DRAM_init_param, val_ddrc__DRAM_init_param); +set_reset_data( ddrc__DRAM_EMR_reg, val_ddrc__DRAM_EMR_reg); +set_reset_data( ddrc__DRAM_EMR_MR_reg, val_ddrc__DRAM_EMR_MR_reg); +set_reset_data( ddrc__DRAM_burst8_rdwr, val_ddrc__DRAM_burst8_rdwr); +set_reset_data( ddrc__DRAM_disable_DQ, val_ddrc__DRAM_disable_DQ); +set_reset_data( ddrc__DRAM_addr_map_bank, val_ddrc__DRAM_addr_map_bank); +set_reset_data( ddrc__DRAM_addr_map_col, val_ddrc__DRAM_addr_map_col); +set_reset_data( ddrc__DRAM_addr_map_row, val_ddrc__DRAM_addr_map_row); +set_reset_data( ddrc__DRAM_ODT_reg, val_ddrc__DRAM_ODT_reg); +set_reset_data( ddrc__phy_dbg_reg, val_ddrc__phy_dbg_reg); +set_reset_data( ddrc__phy_cmd_timeout_rddata_cpt, val_ddrc__phy_cmd_timeout_rddata_cpt); +set_reset_data( ddrc__mode_sts_reg, val_ddrc__mode_sts_reg); +set_reset_data( ddrc__DLL_calib, val_ddrc__DLL_calib); +set_reset_data( ddrc__ODT_delay_hold, val_ddrc__ODT_delay_hold); +set_reset_data( ddrc__ctrl_reg1, val_ddrc__ctrl_reg1); +set_reset_data( ddrc__ctrl_reg2, val_ddrc__ctrl_reg2); +set_reset_data( ddrc__ctrl_reg3, val_ddrc__ctrl_reg3); +set_reset_data( ddrc__ctrl_reg4, val_ddrc__ctrl_reg4); +set_reset_data( ddrc__ctrl_reg5, val_ddrc__ctrl_reg5); +set_reset_data( ddrc__ctrl_reg6, val_ddrc__ctrl_reg6); +set_reset_data( ddrc__CHE_REFRESH_TIMER01, val_ddrc__CHE_REFRESH_TIMER01); +set_reset_data( ddrc__CHE_T_ZQ, val_ddrc__CHE_T_ZQ); +set_reset_data( ddrc__CHE_T_ZQ_Short_Interval_Reg, val_ddrc__CHE_T_ZQ_Short_Interval_Reg); +set_reset_data( ddrc__deep_pwrdwn_reg, val_ddrc__deep_pwrdwn_reg); +set_reset_data( ddrc__reg_2c, val_ddrc__reg_2c); +set_reset_data( ddrc__reg_2d, val_ddrc__reg_2d); +set_reset_data( ddrc__dfi_timing, val_ddrc__dfi_timing); +set_reset_data( ddrc__refresh_timer_2, val_ddrc__refresh_timer_2); +set_reset_data( ddrc__nc_timing, val_ddrc__nc_timing); +set_reset_data( ddrc__CHE_ECC_CONTROL_REG_OFFSET, val_ddrc__CHE_ECC_CONTROL_REG_OFFSET); +set_reset_data( ddrc__CHE_CORR_ECC_LOG_REG_OFFSET, val_ddrc__CHE_CORR_ECC_LOG_REG_OFFSET); +set_reset_data( ddrc__CHE_CORR_ECC_ADDR_REG_OFFSET, val_ddrc__CHE_CORR_ECC_ADDR_REG_OFFSET); +set_reset_data( ddrc__CHE_CORR_ECC_DATA_31_0_REG_OFFSET, val_ddrc__CHE_CORR_ECC_DATA_31_0_REG_OFFSET); +set_reset_data( ddrc__CHE_CORR_ECC_DATA_63_32_REG_OFFSET, val_ddrc__CHE_CORR_ECC_DATA_63_32_REG_OFFSET); +set_reset_data( ddrc__CHE_CORR_ECC_DATA_71_64_REG_OFFSET, val_ddrc__CHE_CORR_ECC_DATA_71_64_REG_OFFSET); +set_reset_data( ddrc__CHE_UNCORR_ECC_LOG_REG_OFFSET, val_ddrc__CHE_UNCORR_ECC_LOG_REG_OFFSET); +set_reset_data( ddrc__CHE_UNCORR_ECC_ADDR_REG_OFFSET, val_ddrc__CHE_UNCORR_ECC_ADDR_REG_OFFSET); +set_reset_data( ddrc__CHE_UNCORR_ECC_DATA_31_0_REG_OFFSET, val_ddrc__CHE_UNCORR_ECC_DATA_31_0_REG_OFFSET); +set_reset_data( ddrc__CHE_UNCORR_ECC_DATA_63_32_REG_OFFSET, val_ddrc__CHE_UNCORR_ECC_DATA_63_32_REG_OFFSET); +set_reset_data( ddrc__CHE_UNCORR_ECC_DATA_71_64_REG_OFFSET, val_ddrc__CHE_UNCORR_ECC_DATA_71_64_REG_OFFSET); +set_reset_data( ddrc__CHE_ECC_STATS_REG_OFFSET, val_ddrc__CHE_ECC_STATS_REG_OFFSET); +set_reset_data( ddrc__ECC_scrub, val_ddrc__ECC_scrub); +set_reset_data( ddrc__CHE_ECC_CORR_BIT_MASK_31_0_REG_OFFSET, val_ddrc__CHE_ECC_CORR_BIT_MASK_31_0_REG_OFFSET); +set_reset_data( ddrc__CHE_ECC_CORR_BIT_MASK_63_32_REG_OFFSET, val_ddrc__CHE_ECC_CORR_BIT_MASK_63_32_REG_OFFSET); +set_reset_data( ddrc__phy_rcvr_enable, val_ddrc__phy_rcvr_enable); +set_reset_data( ddrc__PHY_Config0, val_ddrc__PHY_Config0); +set_reset_data( ddrc__PHY_Config1, val_ddrc__PHY_Config1); +set_reset_data( ddrc__PHY_Config2, val_ddrc__PHY_Config2); +set_reset_data( ddrc__PHY_Config3, val_ddrc__PHY_Config3); +set_reset_data( ddrc__phy_init_ratio0, val_ddrc__phy_init_ratio0); +set_reset_data( ddrc__phy_init_ratio1, val_ddrc__phy_init_ratio1); +set_reset_data( ddrc__phy_init_ratio2, val_ddrc__phy_init_ratio2); +set_reset_data( ddrc__phy_init_ratio3, val_ddrc__phy_init_ratio3); +set_reset_data( ddrc__phy_rd_dqs_cfg0, val_ddrc__phy_rd_dqs_cfg0); +set_reset_data( ddrc__phy_rd_dqs_cfg1, val_ddrc__phy_rd_dqs_cfg1); +set_reset_data( ddrc__phy_rd_dqs_cfg2, val_ddrc__phy_rd_dqs_cfg2); +set_reset_data( ddrc__phy_rd_dqs_cfg3, val_ddrc__phy_rd_dqs_cfg3); +set_reset_data( ddrc__phy_wr_dqs_cfg0, val_ddrc__phy_wr_dqs_cfg0); +set_reset_data( ddrc__phy_wr_dqs_cfg1, val_ddrc__phy_wr_dqs_cfg1); +set_reset_data( ddrc__phy_wr_dqs_cfg2, val_ddrc__phy_wr_dqs_cfg2); +set_reset_data( ddrc__phy_wr_dqs_cfg3, val_ddrc__phy_wr_dqs_cfg3); +set_reset_data( ddrc__phy_we_cfg0, val_ddrc__phy_we_cfg0); +set_reset_data( ddrc__phy_we_cfg1, val_ddrc__phy_we_cfg1); +set_reset_data( ddrc__phy_we_cfg2, val_ddrc__phy_we_cfg2); +set_reset_data( ddrc__phy_we_cfg3, val_ddrc__phy_we_cfg3); +set_reset_data( ddrc__wr_data_slv0, val_ddrc__wr_data_slv0); +set_reset_data( ddrc__wr_data_slv1, val_ddrc__wr_data_slv1); +set_reset_data( ddrc__wr_data_slv2, val_ddrc__wr_data_slv2); +set_reset_data( ddrc__wr_data_slv3, val_ddrc__wr_data_slv3); +set_reset_data( ddrc__reg_64, val_ddrc__reg_64); +set_reset_data( ddrc__reg_65, val_ddrc__reg_65); +set_reset_data( ddrc__reg69_6a0, val_ddrc__reg69_6a0); +set_reset_data( ddrc__reg69_6a1, val_ddrc__reg69_6a1); +set_reset_data( ddrc__reg6c_6d2, val_ddrc__reg6c_6d2); +set_reset_data( ddrc__reg6c_6d3, val_ddrc__reg6c_6d3); +set_reset_data( ddrc__reg6e_710, val_ddrc__reg6e_710); +set_reset_data( ddrc__reg6e_711, val_ddrc__reg6e_711); +set_reset_data( ddrc__reg6e_712, val_ddrc__reg6e_712); +set_reset_data( ddrc__reg6e_713, val_ddrc__reg6e_713); +set_reset_data( ddrc__phy_dll_sts0, val_ddrc__phy_dll_sts0); +set_reset_data( ddrc__phy_dll_sts1, val_ddrc__phy_dll_sts1); +set_reset_data( ddrc__phy_dll_sts2, val_ddrc__phy_dll_sts2); +set_reset_data( ddrc__phy_dll_sts3, val_ddrc__phy_dll_sts3); +set_reset_data( ddrc__dll_lock_sts, val_ddrc__dll_lock_sts); +set_reset_data( ddrc__phy_ctrl_sts, val_ddrc__phy_ctrl_sts); +set_reset_data( ddrc__phy_ctrl_sts_reg2, val_ddrc__phy_ctrl_sts_reg2); +set_reset_data( ddrc__axi_id, val_ddrc__axi_id); +set_reset_data( ddrc__page_mask, val_ddrc__page_mask); +set_reset_data( ddrc__axi_priority_wr_port0, val_ddrc__axi_priority_wr_port0); +set_reset_data( ddrc__axi_priority_wr_port1, val_ddrc__axi_priority_wr_port1); +set_reset_data( ddrc__axi_priority_wr_port2, val_ddrc__axi_priority_wr_port2); +set_reset_data( ddrc__axi_priority_wr_port3, val_ddrc__axi_priority_wr_port3); +set_reset_data( ddrc__axi_priority_rd_port0, val_ddrc__axi_priority_rd_port0); +set_reset_data( ddrc__axi_priority_rd_port1, val_ddrc__axi_priority_rd_port1); +set_reset_data( ddrc__axi_priority_rd_port2, val_ddrc__axi_priority_rd_port2); +set_reset_data( ddrc__axi_priority_rd_port3, val_ddrc__axi_priority_rd_port3); +set_reset_data( ddrc__AHB_priority_cfg0, val_ddrc__AHB_priority_cfg0); +set_reset_data( ddrc__AHB_priority_cfg1, val_ddrc__AHB_priority_cfg1); +set_reset_data( ddrc__AHB_priority_cfg2, val_ddrc__AHB_priority_cfg2); +set_reset_data( ddrc__AHB_priority_cfg3, val_ddrc__AHB_priority_cfg3); +set_reset_data( ddrc__perf_mon0, val_ddrc__perf_mon0); +set_reset_data( ddrc__perf_mon1, val_ddrc__perf_mon1); +set_reset_data( ddrc__perf_mon2, val_ddrc__perf_mon2); +set_reset_data( ddrc__perf_mon3, val_ddrc__perf_mon3); +set_reset_data( ddrc__perf_mon20, val_ddrc__perf_mon20); +set_reset_data( ddrc__perf_mon21, val_ddrc__perf_mon21); +set_reset_data( ddrc__perf_mon22, val_ddrc__perf_mon22); +set_reset_data( ddrc__perf_mon23, val_ddrc__perf_mon23); +set_reset_data( ddrc__perf_mon30, val_ddrc__perf_mon30); +set_reset_data( ddrc__perf_mon31, val_ddrc__perf_mon31); +set_reset_data( ddrc__perf_mon32, val_ddrc__perf_mon32); +set_reset_data( ddrc__perf_mon33, val_ddrc__perf_mon33); +set_reset_data( ddrc__trusted_mem_cfg, val_ddrc__trusted_mem_cfg); +set_reset_data( ddrc__excl_access_cfg0, val_ddrc__excl_access_cfg0); +set_reset_data( ddrc__excl_access_cfg1, val_ddrc__excl_access_cfg1); +set_reset_data( ddrc__excl_access_cfg2, val_ddrc__excl_access_cfg2); +set_reset_data( ddrc__excl_access_cfg3, val_ddrc__excl_access_cfg3); +set_reset_data( ddrc__mode_reg_read, val_ddrc__mode_reg_read); +set_reset_data( ddrc__lpddr_ctrl0, val_ddrc__lpddr_ctrl0); +set_reset_data( ddrc__lpddr_ctrl1, val_ddrc__lpddr_ctrl1); +set_reset_data( ddrc__lpddr_ctrl2, val_ddrc__lpddr_ctrl2); +set_reset_data( ddrc__lpddr_ctrl3, val_ddrc__lpddr_ctrl3); +set_reset_data( ddrc__phy_wr_lvl_fsm, val_ddrc__phy_wr_lvl_fsm); +set_reset_data( ddrc__phy_rd_lvl_fsm, val_ddrc__phy_rd_lvl_fsm); +set_reset_data( ddrc__phy_gate_lvl_fsm, val_ddrc__phy_gate_lvl_fsm); + +// ************************************************************ +// Module debug_axim axim +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_axim__GLOBAL_CTRL, val_debug_axim__GLOBAL_CTRL); +set_reset_data( debug_axim__GLOBAL_STATUS, val_debug_axim__GLOBAL_STATUS); +set_reset_data( debug_axim__FILTER_CTRL, val_debug_axim__FILTER_CTRL); +set_reset_data( debug_axim__TRIGGER_CTRL, val_debug_axim__TRIGGER_CTRL); +set_reset_data( debug_axim__TRIGGER_STATUS, val_debug_axim__TRIGGER_STATUS); +set_reset_data( debug_axim__PACKET_CTRL, val_debug_axim__PACKET_CTRL); +set_reset_data( debug_axim__TOUT_CTRL, val_debug_axim__TOUT_CTRL); +set_reset_data( debug_axim__TOUT_THRESH, val_debug_axim__TOUT_THRESH); +set_reset_data( debug_axim__FIFO_CURRENT, val_debug_axim__FIFO_CURRENT); +set_reset_data( debug_axim__FIFO_HYSTER, val_debug_axim__FIFO_HYSTER); +set_reset_data( debug_axim__SYNC_CURRENT, val_debug_axim__SYNC_CURRENT); +set_reset_data( debug_axim__SYNC_RELOAD, val_debug_axim__SYNC_RELOAD); +set_reset_data( debug_axim__TSTMP_CURRENT, val_debug_axim__TSTMP_CURRENT); +set_reset_data( debug_axim__ADDR0_MASK, val_debug_axim__ADDR0_MASK); +set_reset_data( debug_axim__ADDR0_LOWER, val_debug_axim__ADDR0_LOWER); +set_reset_data( debug_axim__ADDR0_UPPER, val_debug_axim__ADDR0_UPPER); +set_reset_data( debug_axim__ADDR0_MISC, val_debug_axim__ADDR0_MISC); +set_reset_data( debug_axim__ADDR1_MASK, val_debug_axim__ADDR1_MASK); +set_reset_data( debug_axim__ADDR1_LOWER, val_debug_axim__ADDR1_LOWER); +set_reset_data( debug_axim__ADDR1_UPPER, val_debug_axim__ADDR1_UPPER); +set_reset_data( debug_axim__ADDR1_MISC, val_debug_axim__ADDR1_MISC); +set_reset_data( debug_axim__ADDR2_MASK, val_debug_axim__ADDR2_MASK); +set_reset_data( debug_axim__ADDR2_LOWER, val_debug_axim__ADDR2_LOWER); +set_reset_data( debug_axim__ADDR2_UPPER, val_debug_axim__ADDR2_UPPER); +set_reset_data( debug_axim__ADDR2_MISC, val_debug_axim__ADDR2_MISC); +set_reset_data( debug_axim__ADDR3_MASK, val_debug_axim__ADDR3_MASK); +set_reset_data( debug_axim__ADDR3_LOWER, val_debug_axim__ADDR3_LOWER); +set_reset_data( debug_axim__ADDR3_UPPER, val_debug_axim__ADDR3_UPPER); +set_reset_data( debug_axim__ADDR3_MISC, val_debug_axim__ADDR3_MISC); +set_reset_data( debug_axim__ID0_MASK, val_debug_axim__ID0_MASK); +set_reset_data( debug_axim__ID0_LOWER, val_debug_axim__ID0_LOWER); +set_reset_data( debug_axim__ID0_UPPER, val_debug_axim__ID0_UPPER); +set_reset_data( debug_axim__ID0_MISC, val_debug_axim__ID0_MISC); +set_reset_data( debug_axim__ID1_MASK, val_debug_axim__ID1_MASK); +set_reset_data( debug_axim__ID1_LOWER, val_debug_axim__ID1_LOWER); +set_reset_data( debug_axim__ID1_UPPER, val_debug_axim__ID1_UPPER); +set_reset_data( debug_axim__ID1_MISC, val_debug_axim__ID1_MISC); +set_reset_data( debug_axim__ID2_MASK, val_debug_axim__ID2_MASK); +set_reset_data( debug_axim__ID2_LOWER, val_debug_axim__ID2_LOWER); +set_reset_data( debug_axim__ID2_UPPER, val_debug_axim__ID2_UPPER); +set_reset_data( debug_axim__ID2_MISC, val_debug_axim__ID2_MISC); +set_reset_data( debug_axim__ID3_MASK, val_debug_axim__ID3_MASK); +set_reset_data( debug_axim__ID3_LOWER, val_debug_axim__ID3_LOWER); +set_reset_data( debug_axim__ID3_UPPER, val_debug_axim__ID3_UPPER); +set_reset_data( debug_axim__ID3_MISC, val_debug_axim__ID3_MISC); +set_reset_data( debug_axim__AXI_SEL, val_debug_axim__AXI_SEL); +set_reset_data( debug_axim__IT_TRIGOUT, val_debug_axim__IT_TRIGOUT); +set_reset_data( debug_axim__IT_TRIGOUTACK, val_debug_axim__IT_TRIGOUTACK); +set_reset_data( debug_axim__IT_TRIGIN, val_debug_axim__IT_TRIGIN); +set_reset_data( debug_axim__IT_TRIGINACK, val_debug_axim__IT_TRIGINACK); +set_reset_data( debug_axim__IT_ATBDATA, val_debug_axim__IT_ATBDATA); +set_reset_data( debug_axim__IT_ATBSTATUS, val_debug_axim__IT_ATBSTATUS); +set_reset_data( debug_axim__IT_ATBCTRL1, val_debug_axim__IT_ATBCTRL1); +set_reset_data( debug_axim__IT_ATBCTRL0, val_debug_axim__IT_ATBCTRL0); +set_reset_data( debug_axim__IT_CTRL, val_debug_axim__IT_CTRL); +set_reset_data( debug_axim__CLAIM_SET, val_debug_axim__CLAIM_SET); +set_reset_data( debug_axim__CLAIM_CLEAR, val_debug_axim__CLAIM_CLEAR); +set_reset_data( debug_axim__LOCK_ACCESS, val_debug_axim__LOCK_ACCESS); +set_reset_data( debug_axim__LOCK_STATUS, val_debug_axim__LOCK_STATUS); +set_reset_data( debug_axim__AUTH_STATUS, val_debug_axim__AUTH_STATUS); +set_reset_data( debug_axim__DEV_ID, val_debug_axim__DEV_ID); +set_reset_data( debug_axim__DEV_TYPE, val_debug_axim__DEV_TYPE); +set_reset_data( debug_axim__PERIPHID4, val_debug_axim__PERIPHID4); +set_reset_data( debug_axim__PERIPHID5, val_debug_axim__PERIPHID5); +set_reset_data( debug_axim__PERIPHID6, val_debug_axim__PERIPHID6); +set_reset_data( debug_axim__PERIPHID7, val_debug_axim__PERIPHID7); +set_reset_data( debug_axim__PERIPHID0, val_debug_axim__PERIPHID0); +set_reset_data( debug_axim__PERIPHID1, val_debug_axim__PERIPHID1); +set_reset_data( debug_axim__PERIPHID2, val_debug_axim__PERIPHID2); +set_reset_data( debug_axim__PERIPHID3, val_debug_axim__PERIPHID3); +set_reset_data( debug_axim__COMPID0, val_debug_axim__COMPID0); +set_reset_data( debug_axim__COMPID1, val_debug_axim__COMPID1); +set_reset_data( debug_axim__COMPID2, val_debug_axim__COMPID2); +set_reset_data( debug_axim__COMPID3, val_debug_axim__COMPID3); + +// ************************************************************ +// Module debug_cpu_cti0 cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_cpu_cti0__CTICONTROL, val_debug_cpu_cti0__CTICONTROL); +set_reset_data( debug_cpu_cti0__CTIINTACK, val_debug_cpu_cti0__CTIINTACK); +set_reset_data( debug_cpu_cti0__CTIAPPSET, val_debug_cpu_cti0__CTIAPPSET); +set_reset_data( debug_cpu_cti0__CTIAPPCLEAR, val_debug_cpu_cti0__CTIAPPCLEAR); +set_reset_data( debug_cpu_cti0__CTIAPPPULSE, val_debug_cpu_cti0__CTIAPPPULSE); +set_reset_data( debug_cpu_cti0__CTIINEN0, val_debug_cpu_cti0__CTIINEN0); +set_reset_data( debug_cpu_cti0__CTIINEN1, val_debug_cpu_cti0__CTIINEN1); +set_reset_data( debug_cpu_cti0__CTIINEN2, val_debug_cpu_cti0__CTIINEN2); +set_reset_data( debug_cpu_cti0__CTIINEN3, val_debug_cpu_cti0__CTIINEN3); +set_reset_data( debug_cpu_cti0__CTIINEN4, val_debug_cpu_cti0__CTIINEN4); +set_reset_data( debug_cpu_cti0__CTIINEN5, val_debug_cpu_cti0__CTIINEN5); +set_reset_data( debug_cpu_cti0__CTIINEN6, val_debug_cpu_cti0__CTIINEN6); +set_reset_data( debug_cpu_cti0__CTIINEN7, val_debug_cpu_cti0__CTIINEN7); +set_reset_data( debug_cpu_cti0__CTIOUTEN0, val_debug_cpu_cti0__CTIOUTEN0); +set_reset_data( debug_cpu_cti0__CTIOUTEN1, val_debug_cpu_cti0__CTIOUTEN1); +set_reset_data( debug_cpu_cti0__CTIOUTEN2, val_debug_cpu_cti0__CTIOUTEN2); +set_reset_data( debug_cpu_cti0__CTIOUTEN3, val_debug_cpu_cti0__CTIOUTEN3); +set_reset_data( debug_cpu_cti0__CTIOUTEN4, val_debug_cpu_cti0__CTIOUTEN4); +set_reset_data( debug_cpu_cti0__CTIOUTEN5, val_debug_cpu_cti0__CTIOUTEN5); +set_reset_data( debug_cpu_cti0__CTIOUTEN6, val_debug_cpu_cti0__CTIOUTEN6); +set_reset_data( debug_cpu_cti0__CTIOUTEN7, val_debug_cpu_cti0__CTIOUTEN7); +set_reset_data( debug_cpu_cti0__CTITRIGINSTATUS, val_debug_cpu_cti0__CTITRIGINSTATUS); +set_reset_data( debug_cpu_cti0__CTITRIGOUTSTATUS, val_debug_cpu_cti0__CTITRIGOUTSTATUS); +set_reset_data( debug_cpu_cti0__CTICHINSTATUS, val_debug_cpu_cti0__CTICHINSTATUS); +set_reset_data( debug_cpu_cti0__CTICHOUTSTATUS, val_debug_cpu_cti0__CTICHOUTSTATUS); +set_reset_data( debug_cpu_cti0__CTIGATE, val_debug_cpu_cti0__CTIGATE); +set_reset_data( debug_cpu_cti0__ASICCTL, val_debug_cpu_cti0__ASICCTL); +set_reset_data( debug_cpu_cti0__ITCHINACK, val_debug_cpu_cti0__ITCHINACK); +set_reset_data( debug_cpu_cti0__ITTRIGINACK, val_debug_cpu_cti0__ITTRIGINACK); +set_reset_data( debug_cpu_cti0__ITCHOUT, val_debug_cpu_cti0__ITCHOUT); +set_reset_data( debug_cpu_cti0__ITTRIGOUT, val_debug_cpu_cti0__ITTRIGOUT); +set_reset_data( debug_cpu_cti0__ITCHOUTACK, val_debug_cpu_cti0__ITCHOUTACK); +set_reset_data( debug_cpu_cti0__ITTRIGOUTACK, val_debug_cpu_cti0__ITTRIGOUTACK); +set_reset_data( debug_cpu_cti0__ITCHIN, val_debug_cpu_cti0__ITCHIN); +set_reset_data( debug_cpu_cti0__ITTRIGIN, val_debug_cpu_cti0__ITTRIGIN); +set_reset_data( debug_cpu_cti0__ITCTRL, val_debug_cpu_cti0__ITCTRL); +set_reset_data( debug_cpu_cti0__CTSR, val_debug_cpu_cti0__CTSR); +set_reset_data( debug_cpu_cti0__CTCR, val_debug_cpu_cti0__CTCR); +set_reset_data( debug_cpu_cti0__LAR, val_debug_cpu_cti0__LAR); +set_reset_data( debug_cpu_cti0__LSR, val_debug_cpu_cti0__LSR); +set_reset_data( debug_cpu_cti0__ASR, val_debug_cpu_cti0__ASR); +set_reset_data( debug_cpu_cti0__DEVID, val_debug_cpu_cti0__DEVID); +set_reset_data( debug_cpu_cti0__DTIR, val_debug_cpu_cti0__DTIR); +set_reset_data( debug_cpu_cti0__PERIPHID4, val_debug_cpu_cti0__PERIPHID4); +set_reset_data( debug_cpu_cti0__PERIPHID5, val_debug_cpu_cti0__PERIPHID5); +set_reset_data( debug_cpu_cti0__PERIPHID6, val_debug_cpu_cti0__PERIPHID6); +set_reset_data( debug_cpu_cti0__PERIPHID7, val_debug_cpu_cti0__PERIPHID7); +set_reset_data( debug_cpu_cti0__PERIPHID0, val_debug_cpu_cti0__PERIPHID0); +set_reset_data( debug_cpu_cti0__PERIPHID1, val_debug_cpu_cti0__PERIPHID1); +set_reset_data( debug_cpu_cti0__PERIPHID2, val_debug_cpu_cti0__PERIPHID2); +set_reset_data( debug_cpu_cti0__PERIPHID3, val_debug_cpu_cti0__PERIPHID3); +set_reset_data( debug_cpu_cti0__COMPID0, val_debug_cpu_cti0__COMPID0); +set_reset_data( debug_cpu_cti0__COMPID1, val_debug_cpu_cti0__COMPID1); +set_reset_data( debug_cpu_cti0__COMPID2, val_debug_cpu_cti0__COMPID2); +set_reset_data( debug_cpu_cti0__COMPID3, val_debug_cpu_cti0__COMPID3); + +// ************************************************************ +// Module debug_cpu_cti1 cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_cpu_cti1__CTICONTROL, val_debug_cpu_cti1__CTICONTROL); +set_reset_data( debug_cpu_cti1__CTIINTACK, val_debug_cpu_cti1__CTIINTACK); +set_reset_data( debug_cpu_cti1__CTIAPPSET, val_debug_cpu_cti1__CTIAPPSET); +set_reset_data( debug_cpu_cti1__CTIAPPCLEAR, val_debug_cpu_cti1__CTIAPPCLEAR); +set_reset_data( debug_cpu_cti1__CTIAPPPULSE, val_debug_cpu_cti1__CTIAPPPULSE); +set_reset_data( debug_cpu_cti1__CTIINEN0, val_debug_cpu_cti1__CTIINEN0); +set_reset_data( debug_cpu_cti1__CTIINEN1, val_debug_cpu_cti1__CTIINEN1); +set_reset_data( debug_cpu_cti1__CTIINEN2, val_debug_cpu_cti1__CTIINEN2); +set_reset_data( debug_cpu_cti1__CTIINEN3, val_debug_cpu_cti1__CTIINEN3); +set_reset_data( debug_cpu_cti1__CTIINEN4, val_debug_cpu_cti1__CTIINEN4); +set_reset_data( debug_cpu_cti1__CTIINEN5, val_debug_cpu_cti1__CTIINEN5); +set_reset_data( debug_cpu_cti1__CTIINEN6, val_debug_cpu_cti1__CTIINEN6); +set_reset_data( debug_cpu_cti1__CTIINEN7, val_debug_cpu_cti1__CTIINEN7); +set_reset_data( debug_cpu_cti1__CTIOUTEN0, val_debug_cpu_cti1__CTIOUTEN0); +set_reset_data( debug_cpu_cti1__CTIOUTEN1, val_debug_cpu_cti1__CTIOUTEN1); +set_reset_data( debug_cpu_cti1__CTIOUTEN2, val_debug_cpu_cti1__CTIOUTEN2); +set_reset_data( debug_cpu_cti1__CTIOUTEN3, val_debug_cpu_cti1__CTIOUTEN3); +set_reset_data( debug_cpu_cti1__CTIOUTEN4, val_debug_cpu_cti1__CTIOUTEN4); +set_reset_data( debug_cpu_cti1__CTIOUTEN5, val_debug_cpu_cti1__CTIOUTEN5); +set_reset_data( debug_cpu_cti1__CTIOUTEN6, val_debug_cpu_cti1__CTIOUTEN6); +set_reset_data( debug_cpu_cti1__CTIOUTEN7, val_debug_cpu_cti1__CTIOUTEN7); +set_reset_data( debug_cpu_cti1__CTITRIGINSTATUS, val_debug_cpu_cti1__CTITRIGINSTATUS); +set_reset_data( debug_cpu_cti1__CTITRIGOUTSTATUS, val_debug_cpu_cti1__CTITRIGOUTSTATUS); +set_reset_data( debug_cpu_cti1__CTICHINSTATUS, val_debug_cpu_cti1__CTICHINSTATUS); +set_reset_data( debug_cpu_cti1__CTICHOUTSTATUS, val_debug_cpu_cti1__CTICHOUTSTATUS); +set_reset_data( debug_cpu_cti1__CTIGATE, val_debug_cpu_cti1__CTIGATE); +set_reset_data( debug_cpu_cti1__ASICCTL, val_debug_cpu_cti1__ASICCTL); +set_reset_data( debug_cpu_cti1__ITCHINACK, val_debug_cpu_cti1__ITCHINACK); +set_reset_data( debug_cpu_cti1__ITTRIGINACK, val_debug_cpu_cti1__ITTRIGINACK); +set_reset_data( debug_cpu_cti1__ITCHOUT, val_debug_cpu_cti1__ITCHOUT); +set_reset_data( debug_cpu_cti1__ITTRIGOUT, val_debug_cpu_cti1__ITTRIGOUT); +set_reset_data( debug_cpu_cti1__ITCHOUTACK, val_debug_cpu_cti1__ITCHOUTACK); +set_reset_data( debug_cpu_cti1__ITTRIGOUTACK, val_debug_cpu_cti1__ITTRIGOUTACK); +set_reset_data( debug_cpu_cti1__ITCHIN, val_debug_cpu_cti1__ITCHIN); +set_reset_data( debug_cpu_cti1__ITTRIGIN, val_debug_cpu_cti1__ITTRIGIN); +set_reset_data( debug_cpu_cti1__ITCTRL, val_debug_cpu_cti1__ITCTRL); +set_reset_data( debug_cpu_cti1__CTSR, val_debug_cpu_cti1__CTSR); +set_reset_data( debug_cpu_cti1__CTCR, val_debug_cpu_cti1__CTCR); +set_reset_data( debug_cpu_cti1__LAR, val_debug_cpu_cti1__LAR); +set_reset_data( debug_cpu_cti1__LSR, val_debug_cpu_cti1__LSR); +set_reset_data( debug_cpu_cti1__ASR, val_debug_cpu_cti1__ASR); +set_reset_data( debug_cpu_cti1__DEVID, val_debug_cpu_cti1__DEVID); +set_reset_data( debug_cpu_cti1__DTIR, val_debug_cpu_cti1__DTIR); +set_reset_data( debug_cpu_cti1__PERIPHID4, val_debug_cpu_cti1__PERIPHID4); +set_reset_data( debug_cpu_cti1__PERIPHID5, val_debug_cpu_cti1__PERIPHID5); +set_reset_data( debug_cpu_cti1__PERIPHID6, val_debug_cpu_cti1__PERIPHID6); +set_reset_data( debug_cpu_cti1__PERIPHID7, val_debug_cpu_cti1__PERIPHID7); +set_reset_data( debug_cpu_cti1__PERIPHID0, val_debug_cpu_cti1__PERIPHID0); +set_reset_data( debug_cpu_cti1__PERIPHID1, val_debug_cpu_cti1__PERIPHID1); +set_reset_data( debug_cpu_cti1__PERIPHID2, val_debug_cpu_cti1__PERIPHID2); +set_reset_data( debug_cpu_cti1__PERIPHID3, val_debug_cpu_cti1__PERIPHID3); +set_reset_data( debug_cpu_cti1__COMPID0, val_debug_cpu_cti1__COMPID0); +set_reset_data( debug_cpu_cti1__COMPID1, val_debug_cpu_cti1__COMPID1); +set_reset_data( debug_cpu_cti1__COMPID2, val_debug_cpu_cti1__COMPID2); +set_reset_data( debug_cpu_cti1__COMPID3, val_debug_cpu_cti1__COMPID3); + +// ************************************************************ +// Module debug_cpu_pmu0 cortexa9_pmu +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_cpu_pmu0__PMXEVCNTR0, val_debug_cpu_pmu0__PMXEVCNTR0); +set_reset_data( debug_cpu_pmu0__PMXEVCNTR1, val_debug_cpu_pmu0__PMXEVCNTR1); +set_reset_data( debug_cpu_pmu0__PMXEVCNTR2, val_debug_cpu_pmu0__PMXEVCNTR2); +set_reset_data( debug_cpu_pmu0__PMXEVCNTR3, val_debug_cpu_pmu0__PMXEVCNTR3); +set_reset_data( debug_cpu_pmu0__PMXEVCNTR4, val_debug_cpu_pmu0__PMXEVCNTR4); +set_reset_data( debug_cpu_pmu0__PMXEVCNTR5, val_debug_cpu_pmu0__PMXEVCNTR5); +set_reset_data( debug_cpu_pmu0__PMCCNTR, val_debug_cpu_pmu0__PMCCNTR); +set_reset_data( debug_cpu_pmu0__PMXEVTYPER0, val_debug_cpu_pmu0__PMXEVTYPER0); +set_reset_data( debug_cpu_pmu0__PMXEVTYPER1, val_debug_cpu_pmu0__PMXEVTYPER1); +set_reset_data( debug_cpu_pmu0__PMXEVTYPER2, val_debug_cpu_pmu0__PMXEVTYPER2); +set_reset_data( debug_cpu_pmu0__PMXEVTYPER3, val_debug_cpu_pmu0__PMXEVTYPER3); +set_reset_data( debug_cpu_pmu0__PMXEVTYPER4, val_debug_cpu_pmu0__PMXEVTYPER4); +set_reset_data( debug_cpu_pmu0__PMXEVTYPER5, val_debug_cpu_pmu0__PMXEVTYPER5); +set_reset_data( debug_cpu_pmu0__PMCNTENSET, val_debug_cpu_pmu0__PMCNTENSET); +set_reset_data( debug_cpu_pmu0__PMCNTENCLR, val_debug_cpu_pmu0__PMCNTENCLR); +set_reset_data( debug_cpu_pmu0__PMINTENSET, val_debug_cpu_pmu0__PMINTENSET); +set_reset_data( debug_cpu_pmu0__PMINTENCLR, val_debug_cpu_pmu0__PMINTENCLR); +set_reset_data( debug_cpu_pmu0__PMOVSR, val_debug_cpu_pmu0__PMOVSR); +set_reset_data( debug_cpu_pmu0__PMSWINC, val_debug_cpu_pmu0__PMSWINC); +set_reset_data( debug_cpu_pmu0__PMCR, val_debug_cpu_pmu0__PMCR); +set_reset_data( debug_cpu_pmu0__PMUSERENR, val_debug_cpu_pmu0__PMUSERENR); + +// ************************************************************ +// Module debug_cpu_pmu1 cortexa9_pmu +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_cpu_pmu1__PMXEVCNTR0, val_debug_cpu_pmu1__PMXEVCNTR0); +set_reset_data( debug_cpu_pmu1__PMXEVCNTR1, val_debug_cpu_pmu1__PMXEVCNTR1); +set_reset_data( debug_cpu_pmu1__PMXEVCNTR2, val_debug_cpu_pmu1__PMXEVCNTR2); +set_reset_data( debug_cpu_pmu1__PMXEVCNTR3, val_debug_cpu_pmu1__PMXEVCNTR3); +set_reset_data( debug_cpu_pmu1__PMXEVCNTR4, val_debug_cpu_pmu1__PMXEVCNTR4); +set_reset_data( debug_cpu_pmu1__PMXEVCNTR5, val_debug_cpu_pmu1__PMXEVCNTR5); +set_reset_data( debug_cpu_pmu1__PMCCNTR, val_debug_cpu_pmu1__PMCCNTR); +set_reset_data( debug_cpu_pmu1__PMXEVTYPER0, val_debug_cpu_pmu1__PMXEVTYPER0); +set_reset_data( debug_cpu_pmu1__PMXEVTYPER1, val_debug_cpu_pmu1__PMXEVTYPER1); +set_reset_data( debug_cpu_pmu1__PMXEVTYPER2, val_debug_cpu_pmu1__PMXEVTYPER2); +set_reset_data( debug_cpu_pmu1__PMXEVTYPER3, val_debug_cpu_pmu1__PMXEVTYPER3); +set_reset_data( debug_cpu_pmu1__PMXEVTYPER4, val_debug_cpu_pmu1__PMXEVTYPER4); +set_reset_data( debug_cpu_pmu1__PMXEVTYPER5, val_debug_cpu_pmu1__PMXEVTYPER5); +set_reset_data( debug_cpu_pmu1__PMCNTENSET, val_debug_cpu_pmu1__PMCNTENSET); +set_reset_data( debug_cpu_pmu1__PMCNTENCLR, val_debug_cpu_pmu1__PMCNTENCLR); +set_reset_data( debug_cpu_pmu1__PMINTENSET, val_debug_cpu_pmu1__PMINTENSET); +set_reset_data( debug_cpu_pmu1__PMINTENCLR, val_debug_cpu_pmu1__PMINTENCLR); +set_reset_data( debug_cpu_pmu1__PMOVSR, val_debug_cpu_pmu1__PMOVSR); +set_reset_data( debug_cpu_pmu1__PMSWINC, val_debug_cpu_pmu1__PMSWINC); +set_reset_data( debug_cpu_pmu1__PMCR, val_debug_cpu_pmu1__PMCR); +set_reset_data( debug_cpu_pmu1__PMUSERENR, val_debug_cpu_pmu1__PMUSERENR); + +// ************************************************************ +// Module debug_cpu_ptm0 ptm +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_cpu_ptm0__ETMCR, val_debug_cpu_ptm0__ETMCR); +set_reset_data( debug_cpu_ptm0__ETMCCR, val_debug_cpu_ptm0__ETMCCR); +set_reset_data( debug_cpu_ptm0__ETMTRIGGER, val_debug_cpu_ptm0__ETMTRIGGER); +set_reset_data( debug_cpu_ptm0__ETMSR, val_debug_cpu_ptm0__ETMSR); +set_reset_data( debug_cpu_ptm0__ETMSCR, val_debug_cpu_ptm0__ETMSCR); +set_reset_data( debug_cpu_ptm0__ETMTSSCR, val_debug_cpu_ptm0__ETMTSSCR); +set_reset_data( debug_cpu_ptm0__ETMTECR1, val_debug_cpu_ptm0__ETMTECR1); +set_reset_data( debug_cpu_ptm0__ETMACVR1, val_debug_cpu_ptm0__ETMACVR1); +set_reset_data( debug_cpu_ptm0__ETMACVR2, val_debug_cpu_ptm0__ETMACVR2); +set_reset_data( debug_cpu_ptm0__ETMACVR3, val_debug_cpu_ptm0__ETMACVR3); +set_reset_data( debug_cpu_ptm0__ETMACVR4, val_debug_cpu_ptm0__ETMACVR4); +set_reset_data( debug_cpu_ptm0__ETMACVR5, val_debug_cpu_ptm0__ETMACVR5); +set_reset_data( debug_cpu_ptm0__ETMACVR6, val_debug_cpu_ptm0__ETMACVR6); +set_reset_data( debug_cpu_ptm0__ETMACVR7, val_debug_cpu_ptm0__ETMACVR7); +set_reset_data( debug_cpu_ptm0__ETMACVR8, val_debug_cpu_ptm0__ETMACVR8); +set_reset_data( debug_cpu_ptm0__ETMACTR1, val_debug_cpu_ptm0__ETMACTR1); +set_reset_data( debug_cpu_ptm0__ETMACTR2, val_debug_cpu_ptm0__ETMACTR2); +set_reset_data( debug_cpu_ptm0__ETMACTR3, val_debug_cpu_ptm0__ETMACTR3); +set_reset_data( debug_cpu_ptm0__ETMACTR4, val_debug_cpu_ptm0__ETMACTR4); +set_reset_data( debug_cpu_ptm0__ETMACTR5, val_debug_cpu_ptm0__ETMACTR5); +set_reset_data( debug_cpu_ptm0__ETMACTR6, val_debug_cpu_ptm0__ETMACTR6); +set_reset_data( debug_cpu_ptm0__ETMACTR7, val_debug_cpu_ptm0__ETMACTR7); +set_reset_data( debug_cpu_ptm0__ETMACTR8, val_debug_cpu_ptm0__ETMACTR8); +set_reset_data( debug_cpu_ptm0__ETMCNTRLDVR1, val_debug_cpu_ptm0__ETMCNTRLDVR1); +set_reset_data( debug_cpu_ptm0__ETMCNTRLDVR2, val_debug_cpu_ptm0__ETMCNTRLDVR2); +set_reset_data( debug_cpu_ptm0__ETMCNTENR1, val_debug_cpu_ptm0__ETMCNTENR1); +set_reset_data( debug_cpu_ptm0__ETMCNTENR2, val_debug_cpu_ptm0__ETMCNTENR2); +set_reset_data( debug_cpu_ptm0__ETMCNTRLDEVR1, val_debug_cpu_ptm0__ETMCNTRLDEVR1); +set_reset_data( debug_cpu_ptm0__ETMCNTRLDEVR2, val_debug_cpu_ptm0__ETMCNTRLDEVR2); +set_reset_data( debug_cpu_ptm0__ETMCNTVR1, val_debug_cpu_ptm0__ETMCNTVR1); +set_reset_data( debug_cpu_ptm0__ETMCNTVR2, val_debug_cpu_ptm0__ETMCNTVR2); +set_reset_data( debug_cpu_ptm0__ETMSQ12EVR, val_debug_cpu_ptm0__ETMSQ12EVR); +set_reset_data( debug_cpu_ptm0__ETMSQ21EVR, val_debug_cpu_ptm0__ETMSQ21EVR); +set_reset_data( debug_cpu_ptm0__ETMSQ23EVR, val_debug_cpu_ptm0__ETMSQ23EVR); +set_reset_data( debug_cpu_ptm0__ETMSQ31EVR, val_debug_cpu_ptm0__ETMSQ31EVR); +set_reset_data( debug_cpu_ptm0__ETMSQ32EVR, val_debug_cpu_ptm0__ETMSQ32EVR); +set_reset_data( debug_cpu_ptm0__ETMSQ13EVR, val_debug_cpu_ptm0__ETMSQ13EVR); +set_reset_data( debug_cpu_ptm0__ETMSQR, val_debug_cpu_ptm0__ETMSQR); +set_reset_data( debug_cpu_ptm0__ETMEXTOUTEVR1, val_debug_cpu_ptm0__ETMEXTOUTEVR1); +set_reset_data( debug_cpu_ptm0__ETMEXTOUTEVR2, val_debug_cpu_ptm0__ETMEXTOUTEVR2); +set_reset_data( debug_cpu_ptm0__ETMCIDCVR1, val_debug_cpu_ptm0__ETMCIDCVR1); +set_reset_data( debug_cpu_ptm0__ETMCIDCMR, val_debug_cpu_ptm0__ETMCIDCMR); +set_reset_data( debug_cpu_ptm0__ETMSYNCFR, val_debug_cpu_ptm0__ETMSYNCFR); +set_reset_data( debug_cpu_ptm0__ETMIDR, val_debug_cpu_ptm0__ETMIDR); +set_reset_data( debug_cpu_ptm0__ETMCCER, val_debug_cpu_ptm0__ETMCCER); +set_reset_data( debug_cpu_ptm0__ETMEXTINSELR, val_debug_cpu_ptm0__ETMEXTINSELR); +set_reset_data( debug_cpu_ptm0__ETMAUXCR, val_debug_cpu_ptm0__ETMAUXCR); +set_reset_data( debug_cpu_ptm0__ETMTRACEIDR, val_debug_cpu_ptm0__ETMTRACEIDR); +set_reset_data( debug_cpu_ptm0__OSLSR, val_debug_cpu_ptm0__OSLSR); +set_reset_data( debug_cpu_ptm0__ETMPDSR, val_debug_cpu_ptm0__ETMPDSR); +set_reset_data( debug_cpu_ptm0__ITMISCOUT, val_debug_cpu_ptm0__ITMISCOUT); +set_reset_data( debug_cpu_ptm0__ITMISCIN, val_debug_cpu_ptm0__ITMISCIN); +set_reset_data( debug_cpu_ptm0__ITTRIGGER, val_debug_cpu_ptm0__ITTRIGGER); +set_reset_data( debug_cpu_ptm0__ITATBDATA0, val_debug_cpu_ptm0__ITATBDATA0); +set_reset_data( debug_cpu_ptm0__ITATBCTR2, val_debug_cpu_ptm0__ITATBCTR2); +set_reset_data( debug_cpu_ptm0__ITATBID, val_debug_cpu_ptm0__ITATBID); +set_reset_data( debug_cpu_ptm0__ITATBCTR0, val_debug_cpu_ptm0__ITATBCTR0); +set_reset_data( debug_cpu_ptm0__ETMITCTRL, val_debug_cpu_ptm0__ETMITCTRL); +set_reset_data( debug_cpu_ptm0__CTSR, val_debug_cpu_ptm0__CTSR); +set_reset_data( debug_cpu_ptm0__CTCR, val_debug_cpu_ptm0__CTCR); +set_reset_data( debug_cpu_ptm0__LAR, val_debug_cpu_ptm0__LAR); +set_reset_data( debug_cpu_ptm0__LSR, val_debug_cpu_ptm0__LSR); +set_reset_data( debug_cpu_ptm0__ASR, val_debug_cpu_ptm0__ASR); +set_reset_data( debug_cpu_ptm0__DEVID, val_debug_cpu_ptm0__DEVID); +set_reset_data( debug_cpu_ptm0__DTIR, val_debug_cpu_ptm0__DTIR); +set_reset_data( debug_cpu_ptm0__PERIPHID4, val_debug_cpu_ptm0__PERIPHID4); +set_reset_data( debug_cpu_ptm0__PERIPHID5, val_debug_cpu_ptm0__PERIPHID5); +set_reset_data( debug_cpu_ptm0__PERIPHID6, val_debug_cpu_ptm0__PERIPHID6); +set_reset_data( debug_cpu_ptm0__PERIPHID7, val_debug_cpu_ptm0__PERIPHID7); +set_reset_data( debug_cpu_ptm0__PERIPHID0, val_debug_cpu_ptm0__PERIPHID0); +set_reset_data( debug_cpu_ptm0__PERIPHID1, val_debug_cpu_ptm0__PERIPHID1); +set_reset_data( debug_cpu_ptm0__PERIPHID2, val_debug_cpu_ptm0__PERIPHID2); +set_reset_data( debug_cpu_ptm0__PERIPHID3, val_debug_cpu_ptm0__PERIPHID3); +set_reset_data( debug_cpu_ptm0__COMPID0, val_debug_cpu_ptm0__COMPID0); +set_reset_data( debug_cpu_ptm0__COMPID1, val_debug_cpu_ptm0__COMPID1); +set_reset_data( debug_cpu_ptm0__COMPID2, val_debug_cpu_ptm0__COMPID2); +set_reset_data( debug_cpu_ptm0__COMPID3, val_debug_cpu_ptm0__COMPID3); + +// ************************************************************ +// Module debug_cpu_ptm1 ptm +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_cpu_ptm1__ETMCR, val_debug_cpu_ptm1__ETMCR); +set_reset_data( debug_cpu_ptm1__ETMCCR, val_debug_cpu_ptm1__ETMCCR); +set_reset_data( debug_cpu_ptm1__ETMTRIGGER, val_debug_cpu_ptm1__ETMTRIGGER); +set_reset_data( debug_cpu_ptm1__ETMSR, val_debug_cpu_ptm1__ETMSR); +set_reset_data( debug_cpu_ptm1__ETMSCR, val_debug_cpu_ptm1__ETMSCR); +set_reset_data( debug_cpu_ptm1__ETMTSSCR, val_debug_cpu_ptm1__ETMTSSCR); +set_reset_data( debug_cpu_ptm1__ETMTECR1, val_debug_cpu_ptm1__ETMTECR1); +set_reset_data( debug_cpu_ptm1__ETMACVR1, val_debug_cpu_ptm1__ETMACVR1); +set_reset_data( debug_cpu_ptm1__ETMACVR2, val_debug_cpu_ptm1__ETMACVR2); +set_reset_data( debug_cpu_ptm1__ETMACVR3, val_debug_cpu_ptm1__ETMACVR3); +set_reset_data( debug_cpu_ptm1__ETMACVR4, val_debug_cpu_ptm1__ETMACVR4); +set_reset_data( debug_cpu_ptm1__ETMACVR5, val_debug_cpu_ptm1__ETMACVR5); +set_reset_data( debug_cpu_ptm1__ETMACVR6, val_debug_cpu_ptm1__ETMACVR6); +set_reset_data( debug_cpu_ptm1__ETMACVR7, val_debug_cpu_ptm1__ETMACVR7); +set_reset_data( debug_cpu_ptm1__ETMACVR8, val_debug_cpu_ptm1__ETMACVR8); +set_reset_data( debug_cpu_ptm1__ETMACTR1, val_debug_cpu_ptm1__ETMACTR1); +set_reset_data( debug_cpu_ptm1__ETMACTR2, val_debug_cpu_ptm1__ETMACTR2); +set_reset_data( debug_cpu_ptm1__ETMACTR3, val_debug_cpu_ptm1__ETMACTR3); +set_reset_data( debug_cpu_ptm1__ETMACTR4, val_debug_cpu_ptm1__ETMACTR4); +set_reset_data( debug_cpu_ptm1__ETMACTR5, val_debug_cpu_ptm1__ETMACTR5); +set_reset_data( debug_cpu_ptm1__ETMACTR6, val_debug_cpu_ptm1__ETMACTR6); +set_reset_data( debug_cpu_ptm1__ETMACTR7, val_debug_cpu_ptm1__ETMACTR7); +set_reset_data( debug_cpu_ptm1__ETMACTR8, val_debug_cpu_ptm1__ETMACTR8); +set_reset_data( debug_cpu_ptm1__ETMCNTRLDVR1, val_debug_cpu_ptm1__ETMCNTRLDVR1); +set_reset_data( debug_cpu_ptm1__ETMCNTRLDVR2, val_debug_cpu_ptm1__ETMCNTRLDVR2); +set_reset_data( debug_cpu_ptm1__ETMCNTENR1, val_debug_cpu_ptm1__ETMCNTENR1); +set_reset_data( debug_cpu_ptm1__ETMCNTENR2, val_debug_cpu_ptm1__ETMCNTENR2); +set_reset_data( debug_cpu_ptm1__ETMCNTRLDEVR1, val_debug_cpu_ptm1__ETMCNTRLDEVR1); +set_reset_data( debug_cpu_ptm1__ETMCNTRLDEVR2, val_debug_cpu_ptm1__ETMCNTRLDEVR2); +set_reset_data( debug_cpu_ptm1__ETMCNTVR1, val_debug_cpu_ptm1__ETMCNTVR1); +set_reset_data( debug_cpu_ptm1__ETMCNTVR2, val_debug_cpu_ptm1__ETMCNTVR2); +set_reset_data( debug_cpu_ptm1__ETMSQ12EVR, val_debug_cpu_ptm1__ETMSQ12EVR); +set_reset_data( debug_cpu_ptm1__ETMSQ21EVR, val_debug_cpu_ptm1__ETMSQ21EVR); +set_reset_data( debug_cpu_ptm1__ETMSQ23EVR, val_debug_cpu_ptm1__ETMSQ23EVR); +set_reset_data( debug_cpu_ptm1__ETMSQ31EVR, val_debug_cpu_ptm1__ETMSQ31EVR); +set_reset_data( debug_cpu_ptm1__ETMSQ32EVR, val_debug_cpu_ptm1__ETMSQ32EVR); +set_reset_data( debug_cpu_ptm1__ETMSQ13EVR, val_debug_cpu_ptm1__ETMSQ13EVR); +set_reset_data( debug_cpu_ptm1__ETMSQR, val_debug_cpu_ptm1__ETMSQR); +set_reset_data( debug_cpu_ptm1__ETMEXTOUTEVR1, val_debug_cpu_ptm1__ETMEXTOUTEVR1); +set_reset_data( debug_cpu_ptm1__ETMEXTOUTEVR2, val_debug_cpu_ptm1__ETMEXTOUTEVR2); +set_reset_data( debug_cpu_ptm1__ETMCIDCVR1, val_debug_cpu_ptm1__ETMCIDCVR1); +set_reset_data( debug_cpu_ptm1__ETMCIDCMR, val_debug_cpu_ptm1__ETMCIDCMR); +set_reset_data( debug_cpu_ptm1__ETMSYNCFR, val_debug_cpu_ptm1__ETMSYNCFR); +set_reset_data( debug_cpu_ptm1__ETMIDR, val_debug_cpu_ptm1__ETMIDR); +set_reset_data( debug_cpu_ptm1__ETMCCER, val_debug_cpu_ptm1__ETMCCER); +set_reset_data( debug_cpu_ptm1__ETMEXTINSELR, val_debug_cpu_ptm1__ETMEXTINSELR); +set_reset_data( debug_cpu_ptm1__ETMAUXCR, val_debug_cpu_ptm1__ETMAUXCR); +set_reset_data( debug_cpu_ptm1__ETMTRACEIDR, val_debug_cpu_ptm1__ETMTRACEIDR); +set_reset_data( debug_cpu_ptm1__OSLSR, val_debug_cpu_ptm1__OSLSR); +set_reset_data( debug_cpu_ptm1__ETMPDSR, val_debug_cpu_ptm1__ETMPDSR); +set_reset_data( debug_cpu_ptm1__ITMISCOUT, val_debug_cpu_ptm1__ITMISCOUT); +set_reset_data( debug_cpu_ptm1__ITMISCIN, val_debug_cpu_ptm1__ITMISCIN); +set_reset_data( debug_cpu_ptm1__ITTRIGGER, val_debug_cpu_ptm1__ITTRIGGER); +set_reset_data( debug_cpu_ptm1__ITATBDATA0, val_debug_cpu_ptm1__ITATBDATA0); +set_reset_data( debug_cpu_ptm1__ITATBCTR2, val_debug_cpu_ptm1__ITATBCTR2); +set_reset_data( debug_cpu_ptm1__ITATBID, val_debug_cpu_ptm1__ITATBID); +set_reset_data( debug_cpu_ptm1__ITATBCTR0, val_debug_cpu_ptm1__ITATBCTR0); +set_reset_data( debug_cpu_ptm1__ETMITCTRL, val_debug_cpu_ptm1__ETMITCTRL); +set_reset_data( debug_cpu_ptm1__CTSR, val_debug_cpu_ptm1__CTSR); +set_reset_data( debug_cpu_ptm1__CTCR, val_debug_cpu_ptm1__CTCR); +set_reset_data( debug_cpu_ptm1__LAR, val_debug_cpu_ptm1__LAR); +set_reset_data( debug_cpu_ptm1__LSR, val_debug_cpu_ptm1__LSR); +set_reset_data( debug_cpu_ptm1__ASR, val_debug_cpu_ptm1__ASR); +set_reset_data( debug_cpu_ptm1__DEVID, val_debug_cpu_ptm1__DEVID); +set_reset_data( debug_cpu_ptm1__DTIR, val_debug_cpu_ptm1__DTIR); +set_reset_data( debug_cpu_ptm1__PERIPHID4, val_debug_cpu_ptm1__PERIPHID4); +set_reset_data( debug_cpu_ptm1__PERIPHID5, val_debug_cpu_ptm1__PERIPHID5); +set_reset_data( debug_cpu_ptm1__PERIPHID6, val_debug_cpu_ptm1__PERIPHID6); +set_reset_data( debug_cpu_ptm1__PERIPHID7, val_debug_cpu_ptm1__PERIPHID7); +set_reset_data( debug_cpu_ptm1__PERIPHID0, val_debug_cpu_ptm1__PERIPHID0); +set_reset_data( debug_cpu_ptm1__PERIPHID1, val_debug_cpu_ptm1__PERIPHID1); +set_reset_data( debug_cpu_ptm1__PERIPHID2, val_debug_cpu_ptm1__PERIPHID2); +set_reset_data( debug_cpu_ptm1__PERIPHID3, val_debug_cpu_ptm1__PERIPHID3); +set_reset_data( debug_cpu_ptm1__COMPID0, val_debug_cpu_ptm1__COMPID0); +set_reset_data( debug_cpu_ptm1__COMPID1, val_debug_cpu_ptm1__COMPID1); +set_reset_data( debug_cpu_ptm1__COMPID2, val_debug_cpu_ptm1__COMPID2); +set_reset_data( debug_cpu_ptm1__COMPID3, val_debug_cpu_ptm1__COMPID3); + +// ************************************************************ +// Module debug_cti_axim cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_cti_axim__CTICONTROL, val_debug_cti_axim__CTICONTROL); +set_reset_data( debug_cti_axim__CTIINTACK, val_debug_cti_axim__CTIINTACK); +set_reset_data( debug_cti_axim__CTIAPPSET, val_debug_cti_axim__CTIAPPSET); +set_reset_data( debug_cti_axim__CTIAPPCLEAR, val_debug_cti_axim__CTIAPPCLEAR); +set_reset_data( debug_cti_axim__CTIAPPPULSE, val_debug_cti_axim__CTIAPPPULSE); +set_reset_data( debug_cti_axim__CTIINEN0, val_debug_cti_axim__CTIINEN0); +set_reset_data( debug_cti_axim__CTIINEN1, val_debug_cti_axim__CTIINEN1); +set_reset_data( debug_cti_axim__CTIINEN2, val_debug_cti_axim__CTIINEN2); +set_reset_data( debug_cti_axim__CTIINEN3, val_debug_cti_axim__CTIINEN3); +set_reset_data( debug_cti_axim__CTIINEN4, val_debug_cti_axim__CTIINEN4); +set_reset_data( debug_cti_axim__CTIINEN5, val_debug_cti_axim__CTIINEN5); +set_reset_data( debug_cti_axim__CTIINEN6, val_debug_cti_axim__CTIINEN6); +set_reset_data( debug_cti_axim__CTIINEN7, val_debug_cti_axim__CTIINEN7); +set_reset_data( debug_cti_axim__CTIOUTEN0, val_debug_cti_axim__CTIOUTEN0); +set_reset_data( debug_cti_axim__CTIOUTEN1, val_debug_cti_axim__CTIOUTEN1); +set_reset_data( debug_cti_axim__CTIOUTEN2, val_debug_cti_axim__CTIOUTEN2); +set_reset_data( debug_cti_axim__CTIOUTEN3, val_debug_cti_axim__CTIOUTEN3); +set_reset_data( debug_cti_axim__CTIOUTEN4, val_debug_cti_axim__CTIOUTEN4); +set_reset_data( debug_cti_axim__CTIOUTEN5, val_debug_cti_axim__CTIOUTEN5); +set_reset_data( debug_cti_axim__CTIOUTEN6, val_debug_cti_axim__CTIOUTEN6); +set_reset_data( debug_cti_axim__CTIOUTEN7, val_debug_cti_axim__CTIOUTEN7); +set_reset_data( debug_cti_axim__CTITRIGINSTATUS, val_debug_cti_axim__CTITRIGINSTATUS); +set_reset_data( debug_cti_axim__CTITRIGOUTSTATUS, val_debug_cti_axim__CTITRIGOUTSTATUS); +set_reset_data( debug_cti_axim__CTICHINSTATUS, val_debug_cti_axim__CTICHINSTATUS); +set_reset_data( debug_cti_axim__CTICHOUTSTATUS, val_debug_cti_axim__CTICHOUTSTATUS); +set_reset_data( debug_cti_axim__CTIGATE, val_debug_cti_axim__CTIGATE); +set_reset_data( debug_cti_axim__ASICCTL, val_debug_cti_axim__ASICCTL); +set_reset_data( debug_cti_axim__ITCHINACK, val_debug_cti_axim__ITCHINACK); +set_reset_data( debug_cti_axim__ITTRIGINACK, val_debug_cti_axim__ITTRIGINACK); +set_reset_data( debug_cti_axim__ITCHOUT, val_debug_cti_axim__ITCHOUT); +set_reset_data( debug_cti_axim__ITTRIGOUT, val_debug_cti_axim__ITTRIGOUT); +set_reset_data( debug_cti_axim__ITCHOUTACK, val_debug_cti_axim__ITCHOUTACK); +set_reset_data( debug_cti_axim__ITTRIGOUTACK, val_debug_cti_axim__ITTRIGOUTACK); +set_reset_data( debug_cti_axim__ITCHIN, val_debug_cti_axim__ITCHIN); +set_reset_data( debug_cti_axim__ITTRIGIN, val_debug_cti_axim__ITTRIGIN); +set_reset_data( debug_cti_axim__ITCTRL, val_debug_cti_axim__ITCTRL); +set_reset_data( debug_cti_axim__CTSR, val_debug_cti_axim__CTSR); +set_reset_data( debug_cti_axim__CTCR, val_debug_cti_axim__CTCR); +set_reset_data( debug_cti_axim__LAR, val_debug_cti_axim__LAR); +set_reset_data( debug_cti_axim__LSR, val_debug_cti_axim__LSR); +set_reset_data( debug_cti_axim__ASR, val_debug_cti_axim__ASR); +set_reset_data( debug_cti_axim__DEVID, val_debug_cti_axim__DEVID); +set_reset_data( debug_cti_axim__DTIR, val_debug_cti_axim__DTIR); +set_reset_data( debug_cti_axim__PERIPHID4, val_debug_cti_axim__PERIPHID4); +set_reset_data( debug_cti_axim__PERIPHID5, val_debug_cti_axim__PERIPHID5); +set_reset_data( debug_cti_axim__PERIPHID6, val_debug_cti_axim__PERIPHID6); +set_reset_data( debug_cti_axim__PERIPHID7, val_debug_cti_axim__PERIPHID7); +set_reset_data( debug_cti_axim__PERIPHID0, val_debug_cti_axim__PERIPHID0); +set_reset_data( debug_cti_axim__PERIPHID1, val_debug_cti_axim__PERIPHID1); +set_reset_data( debug_cti_axim__PERIPHID2, val_debug_cti_axim__PERIPHID2); +set_reset_data( debug_cti_axim__PERIPHID3, val_debug_cti_axim__PERIPHID3); +set_reset_data( debug_cti_axim__COMPID0, val_debug_cti_axim__COMPID0); +set_reset_data( debug_cti_axim__COMPID1, val_debug_cti_axim__COMPID1); +set_reset_data( debug_cti_axim__COMPID2, val_debug_cti_axim__COMPID2); +set_reset_data( debug_cti_axim__COMPID3, val_debug_cti_axim__COMPID3); + +// ************************************************************ +// Module debug_cti_etb_tpiu cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_cti_etb_tpiu__CTICONTROL, val_debug_cti_etb_tpiu__CTICONTROL); +set_reset_data( debug_cti_etb_tpiu__CTIINTACK, val_debug_cti_etb_tpiu__CTIINTACK); +set_reset_data( debug_cti_etb_tpiu__CTIAPPSET, val_debug_cti_etb_tpiu__CTIAPPSET); +set_reset_data( debug_cti_etb_tpiu__CTIAPPCLEAR, val_debug_cti_etb_tpiu__CTIAPPCLEAR); +set_reset_data( debug_cti_etb_tpiu__CTIAPPPULSE, val_debug_cti_etb_tpiu__CTIAPPPULSE); +set_reset_data( debug_cti_etb_tpiu__CTIINEN0, val_debug_cti_etb_tpiu__CTIINEN0); +set_reset_data( debug_cti_etb_tpiu__CTIINEN1, val_debug_cti_etb_tpiu__CTIINEN1); +set_reset_data( debug_cti_etb_tpiu__CTIINEN2, val_debug_cti_etb_tpiu__CTIINEN2); +set_reset_data( debug_cti_etb_tpiu__CTIINEN3, val_debug_cti_etb_tpiu__CTIINEN3); +set_reset_data( debug_cti_etb_tpiu__CTIINEN4, val_debug_cti_etb_tpiu__CTIINEN4); +set_reset_data( debug_cti_etb_tpiu__CTIINEN5, val_debug_cti_etb_tpiu__CTIINEN5); +set_reset_data( debug_cti_etb_tpiu__CTIINEN6, val_debug_cti_etb_tpiu__CTIINEN6); +set_reset_data( debug_cti_etb_tpiu__CTIINEN7, val_debug_cti_etb_tpiu__CTIINEN7); +set_reset_data( debug_cti_etb_tpiu__CTIOUTEN0, val_debug_cti_etb_tpiu__CTIOUTEN0); +set_reset_data( debug_cti_etb_tpiu__CTIOUTEN1, val_debug_cti_etb_tpiu__CTIOUTEN1); +set_reset_data( debug_cti_etb_tpiu__CTIOUTEN2, val_debug_cti_etb_tpiu__CTIOUTEN2); +set_reset_data( debug_cti_etb_tpiu__CTIOUTEN3, val_debug_cti_etb_tpiu__CTIOUTEN3); +set_reset_data( debug_cti_etb_tpiu__CTIOUTEN4, val_debug_cti_etb_tpiu__CTIOUTEN4); +set_reset_data( debug_cti_etb_tpiu__CTIOUTEN5, val_debug_cti_etb_tpiu__CTIOUTEN5); +set_reset_data( debug_cti_etb_tpiu__CTIOUTEN6, val_debug_cti_etb_tpiu__CTIOUTEN6); +set_reset_data( debug_cti_etb_tpiu__CTIOUTEN7, val_debug_cti_etb_tpiu__CTIOUTEN7); +set_reset_data( debug_cti_etb_tpiu__CTITRIGINSTATUS, val_debug_cti_etb_tpiu__CTITRIGINSTATUS); +set_reset_data( debug_cti_etb_tpiu__CTITRIGOUTSTATUS, val_debug_cti_etb_tpiu__CTITRIGOUTSTATUS); +set_reset_data( debug_cti_etb_tpiu__CTICHINSTATUS, val_debug_cti_etb_tpiu__CTICHINSTATUS); +set_reset_data( debug_cti_etb_tpiu__CTICHOUTSTATUS, val_debug_cti_etb_tpiu__CTICHOUTSTATUS); +set_reset_data( debug_cti_etb_tpiu__CTIGATE, val_debug_cti_etb_tpiu__CTIGATE); +set_reset_data( debug_cti_etb_tpiu__ASICCTL, val_debug_cti_etb_tpiu__ASICCTL); +set_reset_data( debug_cti_etb_tpiu__ITCHINACK, val_debug_cti_etb_tpiu__ITCHINACK); +set_reset_data( debug_cti_etb_tpiu__ITTRIGINACK, val_debug_cti_etb_tpiu__ITTRIGINACK); +set_reset_data( debug_cti_etb_tpiu__ITCHOUT, val_debug_cti_etb_tpiu__ITCHOUT); +set_reset_data( debug_cti_etb_tpiu__ITTRIGOUT, val_debug_cti_etb_tpiu__ITTRIGOUT); +set_reset_data( debug_cti_etb_tpiu__ITCHOUTACK, val_debug_cti_etb_tpiu__ITCHOUTACK); +set_reset_data( debug_cti_etb_tpiu__ITTRIGOUTACK, val_debug_cti_etb_tpiu__ITTRIGOUTACK); +set_reset_data( debug_cti_etb_tpiu__ITCHIN, val_debug_cti_etb_tpiu__ITCHIN); +set_reset_data( debug_cti_etb_tpiu__ITTRIGIN, val_debug_cti_etb_tpiu__ITTRIGIN); +set_reset_data( debug_cti_etb_tpiu__ITCTRL, val_debug_cti_etb_tpiu__ITCTRL); +set_reset_data( debug_cti_etb_tpiu__CTSR, val_debug_cti_etb_tpiu__CTSR); +set_reset_data( debug_cti_etb_tpiu__CTCR, val_debug_cti_etb_tpiu__CTCR); +set_reset_data( debug_cti_etb_tpiu__LAR, val_debug_cti_etb_tpiu__LAR); +set_reset_data( debug_cti_etb_tpiu__LSR, val_debug_cti_etb_tpiu__LSR); +set_reset_data( debug_cti_etb_tpiu__ASR, val_debug_cti_etb_tpiu__ASR); +set_reset_data( debug_cti_etb_tpiu__DEVID, val_debug_cti_etb_tpiu__DEVID); +set_reset_data( debug_cti_etb_tpiu__DTIR, val_debug_cti_etb_tpiu__DTIR); +set_reset_data( debug_cti_etb_tpiu__PERIPHID4, val_debug_cti_etb_tpiu__PERIPHID4); +set_reset_data( debug_cti_etb_tpiu__PERIPHID5, val_debug_cti_etb_tpiu__PERIPHID5); +set_reset_data( debug_cti_etb_tpiu__PERIPHID6, val_debug_cti_etb_tpiu__PERIPHID6); +set_reset_data( debug_cti_etb_tpiu__PERIPHID7, val_debug_cti_etb_tpiu__PERIPHID7); +set_reset_data( debug_cti_etb_tpiu__PERIPHID0, val_debug_cti_etb_tpiu__PERIPHID0); +set_reset_data( debug_cti_etb_tpiu__PERIPHID1, val_debug_cti_etb_tpiu__PERIPHID1); +set_reset_data( debug_cti_etb_tpiu__PERIPHID2, val_debug_cti_etb_tpiu__PERIPHID2); +set_reset_data( debug_cti_etb_tpiu__PERIPHID3, val_debug_cti_etb_tpiu__PERIPHID3); +set_reset_data( debug_cti_etb_tpiu__COMPID0, val_debug_cti_etb_tpiu__COMPID0); +set_reset_data( debug_cti_etb_tpiu__COMPID1, val_debug_cti_etb_tpiu__COMPID1); +set_reset_data( debug_cti_etb_tpiu__COMPID2, val_debug_cti_etb_tpiu__COMPID2); +set_reset_data( debug_cti_etb_tpiu__COMPID3, val_debug_cti_etb_tpiu__COMPID3); + +// ************************************************************ +// Module debug_cti_ftm cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_cti_ftm__CTICONTROL, val_debug_cti_ftm__CTICONTROL); +set_reset_data( debug_cti_ftm__CTIINTACK, val_debug_cti_ftm__CTIINTACK); +set_reset_data( debug_cti_ftm__CTIAPPSET, val_debug_cti_ftm__CTIAPPSET); +set_reset_data( debug_cti_ftm__CTIAPPCLEAR, val_debug_cti_ftm__CTIAPPCLEAR); +set_reset_data( debug_cti_ftm__CTIAPPPULSE, val_debug_cti_ftm__CTIAPPPULSE); +set_reset_data( debug_cti_ftm__CTIINEN0, val_debug_cti_ftm__CTIINEN0); +set_reset_data( debug_cti_ftm__CTIINEN1, val_debug_cti_ftm__CTIINEN1); +set_reset_data( debug_cti_ftm__CTIINEN2, val_debug_cti_ftm__CTIINEN2); +set_reset_data( debug_cti_ftm__CTIINEN3, val_debug_cti_ftm__CTIINEN3); +set_reset_data( debug_cti_ftm__CTIINEN4, val_debug_cti_ftm__CTIINEN4); +set_reset_data( debug_cti_ftm__CTIINEN5, val_debug_cti_ftm__CTIINEN5); +set_reset_data( debug_cti_ftm__CTIINEN6, val_debug_cti_ftm__CTIINEN6); +set_reset_data( debug_cti_ftm__CTIINEN7, val_debug_cti_ftm__CTIINEN7); +set_reset_data( debug_cti_ftm__CTIOUTEN0, val_debug_cti_ftm__CTIOUTEN0); +set_reset_data( debug_cti_ftm__CTIOUTEN1, val_debug_cti_ftm__CTIOUTEN1); +set_reset_data( debug_cti_ftm__CTIOUTEN2, val_debug_cti_ftm__CTIOUTEN2); +set_reset_data( debug_cti_ftm__CTIOUTEN3, val_debug_cti_ftm__CTIOUTEN3); +set_reset_data( debug_cti_ftm__CTIOUTEN4, val_debug_cti_ftm__CTIOUTEN4); +set_reset_data( debug_cti_ftm__CTIOUTEN5, val_debug_cti_ftm__CTIOUTEN5); +set_reset_data( debug_cti_ftm__CTIOUTEN6, val_debug_cti_ftm__CTIOUTEN6); +set_reset_data( debug_cti_ftm__CTIOUTEN7, val_debug_cti_ftm__CTIOUTEN7); +set_reset_data( debug_cti_ftm__CTITRIGINSTATUS, val_debug_cti_ftm__CTITRIGINSTATUS); +set_reset_data( debug_cti_ftm__CTITRIGOUTSTATUS, val_debug_cti_ftm__CTITRIGOUTSTATUS); +set_reset_data( debug_cti_ftm__CTICHINSTATUS, val_debug_cti_ftm__CTICHINSTATUS); +set_reset_data( debug_cti_ftm__CTICHOUTSTATUS, val_debug_cti_ftm__CTICHOUTSTATUS); +set_reset_data( debug_cti_ftm__CTIGATE, val_debug_cti_ftm__CTIGATE); +set_reset_data( debug_cti_ftm__ASICCTL, val_debug_cti_ftm__ASICCTL); +set_reset_data( debug_cti_ftm__ITCHINACK, val_debug_cti_ftm__ITCHINACK); +set_reset_data( debug_cti_ftm__ITTRIGINACK, val_debug_cti_ftm__ITTRIGINACK); +set_reset_data( debug_cti_ftm__ITCHOUT, val_debug_cti_ftm__ITCHOUT); +set_reset_data( debug_cti_ftm__ITTRIGOUT, val_debug_cti_ftm__ITTRIGOUT); +set_reset_data( debug_cti_ftm__ITCHOUTACK, val_debug_cti_ftm__ITCHOUTACK); +set_reset_data( debug_cti_ftm__ITTRIGOUTACK, val_debug_cti_ftm__ITTRIGOUTACK); +set_reset_data( debug_cti_ftm__ITCHIN, val_debug_cti_ftm__ITCHIN); +set_reset_data( debug_cti_ftm__ITTRIGIN, val_debug_cti_ftm__ITTRIGIN); +set_reset_data( debug_cti_ftm__ITCTRL, val_debug_cti_ftm__ITCTRL); +set_reset_data( debug_cti_ftm__CTSR, val_debug_cti_ftm__CTSR); +set_reset_data( debug_cti_ftm__CTCR, val_debug_cti_ftm__CTCR); +set_reset_data( debug_cti_ftm__LAR, val_debug_cti_ftm__LAR); +set_reset_data( debug_cti_ftm__LSR, val_debug_cti_ftm__LSR); +set_reset_data( debug_cti_ftm__ASR, val_debug_cti_ftm__ASR); +set_reset_data( debug_cti_ftm__DEVID, val_debug_cti_ftm__DEVID); +set_reset_data( debug_cti_ftm__DTIR, val_debug_cti_ftm__DTIR); +set_reset_data( debug_cti_ftm__PERIPHID4, val_debug_cti_ftm__PERIPHID4); +set_reset_data( debug_cti_ftm__PERIPHID5, val_debug_cti_ftm__PERIPHID5); +set_reset_data( debug_cti_ftm__PERIPHID6, val_debug_cti_ftm__PERIPHID6); +set_reset_data( debug_cti_ftm__PERIPHID7, val_debug_cti_ftm__PERIPHID7); +set_reset_data( debug_cti_ftm__PERIPHID0, val_debug_cti_ftm__PERIPHID0); +set_reset_data( debug_cti_ftm__PERIPHID1, val_debug_cti_ftm__PERIPHID1); +set_reset_data( debug_cti_ftm__PERIPHID2, val_debug_cti_ftm__PERIPHID2); +set_reset_data( debug_cti_ftm__PERIPHID3, val_debug_cti_ftm__PERIPHID3); +set_reset_data( debug_cti_ftm__COMPID0, val_debug_cti_ftm__COMPID0); +set_reset_data( debug_cti_ftm__COMPID1, val_debug_cti_ftm__COMPID1); +set_reset_data( debug_cti_ftm__COMPID2, val_debug_cti_ftm__COMPID2); +set_reset_data( debug_cti_ftm__COMPID3, val_debug_cti_ftm__COMPID3); + +// ************************************************************ +// Module debug_dap_rom dap +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_dap_rom__ROMENTRY00, val_debug_dap_rom__ROMENTRY00); +set_reset_data( debug_dap_rom__ROMENTRY01, val_debug_dap_rom__ROMENTRY01); +set_reset_data( debug_dap_rom__ROMENTRY02, val_debug_dap_rom__ROMENTRY02); +set_reset_data( debug_dap_rom__ROMENTRY03, val_debug_dap_rom__ROMENTRY03); +set_reset_data( debug_dap_rom__ROMENTRY04, val_debug_dap_rom__ROMENTRY04); +set_reset_data( debug_dap_rom__ROMENTRY05, val_debug_dap_rom__ROMENTRY05); +set_reset_data( debug_dap_rom__ROMENTRY06, val_debug_dap_rom__ROMENTRY06); +set_reset_data( debug_dap_rom__ROMENTRY07, val_debug_dap_rom__ROMENTRY07); +set_reset_data( debug_dap_rom__ROMENTRY08, val_debug_dap_rom__ROMENTRY08); +set_reset_data( debug_dap_rom__ROMENTRY09, val_debug_dap_rom__ROMENTRY09); +set_reset_data( debug_dap_rom__ROMENTRY10, val_debug_dap_rom__ROMENTRY10); +set_reset_data( debug_dap_rom__ROMENTRY11, val_debug_dap_rom__ROMENTRY11); +set_reset_data( debug_dap_rom__ROMENTRY12, val_debug_dap_rom__ROMENTRY12); +set_reset_data( debug_dap_rom__ROMENTRY13, val_debug_dap_rom__ROMENTRY13); +set_reset_data( debug_dap_rom__ROMENTRY14, val_debug_dap_rom__ROMENTRY14); +set_reset_data( debug_dap_rom__ROMENTRY15, val_debug_dap_rom__ROMENTRY15); +set_reset_data( debug_dap_rom__PERIPHID4, val_debug_dap_rom__PERIPHID4); +set_reset_data( debug_dap_rom__PERIPHID5, val_debug_dap_rom__PERIPHID5); +set_reset_data( debug_dap_rom__PERIPHID6, val_debug_dap_rom__PERIPHID6); +set_reset_data( debug_dap_rom__PERIPHID7, val_debug_dap_rom__PERIPHID7); +set_reset_data( debug_dap_rom__PERIPHID0, val_debug_dap_rom__PERIPHID0); +set_reset_data( debug_dap_rom__PERIPHID1, val_debug_dap_rom__PERIPHID1); +set_reset_data( debug_dap_rom__PERIPHID2, val_debug_dap_rom__PERIPHID2); +set_reset_data( debug_dap_rom__PERIPHID3, val_debug_dap_rom__PERIPHID3); +set_reset_data( debug_dap_rom__COMPID0, val_debug_dap_rom__COMPID0); +set_reset_data( debug_dap_rom__COMPID1, val_debug_dap_rom__COMPID1); +set_reset_data( debug_dap_rom__COMPID2, val_debug_dap_rom__COMPID2); +set_reset_data( debug_dap_rom__COMPID3, val_debug_dap_rom__COMPID3); + +// ************************************************************ +// Module debug_etb etb +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_etb__RDP, val_debug_etb__RDP); +set_reset_data( debug_etb__STS, val_debug_etb__STS); +set_reset_data( debug_etb__RRD, val_debug_etb__RRD); +set_reset_data( debug_etb__RRP, val_debug_etb__RRP); +set_reset_data( debug_etb__RWP, val_debug_etb__RWP); +set_reset_data( debug_etb__TRG, val_debug_etb__TRG); +set_reset_data( debug_etb__CTL, val_debug_etb__CTL); +set_reset_data( debug_etb__RWD, val_debug_etb__RWD); +set_reset_data( debug_etb__FFSR, val_debug_etb__FFSR); +set_reset_data( debug_etb__FFCR, val_debug_etb__FFCR); +set_reset_data( debug_etb__ITMISCOP0, val_debug_etb__ITMISCOP0); +set_reset_data( debug_etb__ITTRFLINACK, val_debug_etb__ITTRFLINACK); +set_reset_data( debug_etb__ITTRFLIN, val_debug_etb__ITTRFLIN); +set_reset_data( debug_etb__ITATBDATA0, val_debug_etb__ITATBDATA0); +set_reset_data( debug_etb__ITATBCTR2, val_debug_etb__ITATBCTR2); +set_reset_data( debug_etb__ITATBCTR1, val_debug_etb__ITATBCTR1); +set_reset_data( debug_etb__ITATBCTR0, val_debug_etb__ITATBCTR0); +set_reset_data( debug_etb__IMCR, val_debug_etb__IMCR); +set_reset_data( debug_etb__CTSR, val_debug_etb__CTSR); +set_reset_data( debug_etb__CTCR, val_debug_etb__CTCR); +set_reset_data( debug_etb__LAR, val_debug_etb__LAR); +set_reset_data( debug_etb__LSR, val_debug_etb__LSR); +set_reset_data( debug_etb__ASR, val_debug_etb__ASR); +set_reset_data( debug_etb__DEVID, val_debug_etb__DEVID); +set_reset_data( debug_etb__DTIR, val_debug_etb__DTIR); +set_reset_data( debug_etb__PERIPHID4, val_debug_etb__PERIPHID4); +set_reset_data( debug_etb__PERIPHID5, val_debug_etb__PERIPHID5); +set_reset_data( debug_etb__PERIPHID6, val_debug_etb__PERIPHID6); +set_reset_data( debug_etb__PERIPHID7, val_debug_etb__PERIPHID7); +set_reset_data( debug_etb__PERIPHID0, val_debug_etb__PERIPHID0); +set_reset_data( debug_etb__PERIPHID1, val_debug_etb__PERIPHID1); +set_reset_data( debug_etb__PERIPHID2, val_debug_etb__PERIPHID2); +set_reset_data( debug_etb__PERIPHID3, val_debug_etb__PERIPHID3); +set_reset_data( debug_etb__COMPID0, val_debug_etb__COMPID0); +set_reset_data( debug_etb__COMPID1, val_debug_etb__COMPID1); +set_reset_data( debug_etb__COMPID2, val_debug_etb__COMPID2); +set_reset_data( debug_etb__COMPID3, val_debug_etb__COMPID3); + +// ************************************************************ +// Module debug_ftm ftm +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_ftm__FTMGLBCTRL, val_debug_ftm__FTMGLBCTRL); +set_reset_data( debug_ftm__FTMSTATUS, val_debug_ftm__FTMSTATUS); +set_reset_data( debug_ftm__FTMCONTROL, val_debug_ftm__FTMCONTROL); +set_reset_data( debug_ftm__FTMP2FDBG0, val_debug_ftm__FTMP2FDBG0); +set_reset_data( debug_ftm__FTMP2FDBG1, val_debug_ftm__FTMP2FDBG1); +set_reset_data( debug_ftm__FTMP2FDBG2, val_debug_ftm__FTMP2FDBG2); +set_reset_data( debug_ftm__FTMP2FDBG3, val_debug_ftm__FTMP2FDBG3); +set_reset_data( debug_ftm__FTMF2PDBG0, val_debug_ftm__FTMF2PDBG0); +set_reset_data( debug_ftm__FTMF2PDBG1, val_debug_ftm__FTMF2PDBG1); +set_reset_data( debug_ftm__FTMF2PDBG2, val_debug_ftm__FTMF2PDBG2); +set_reset_data( debug_ftm__FTMF2PDBG3, val_debug_ftm__FTMF2PDBG3); +set_reset_data( debug_ftm__CYCOUNTPRE, val_debug_ftm__CYCOUNTPRE); +set_reset_data( debug_ftm__FTMSYNCRELOAD, val_debug_ftm__FTMSYNCRELOAD); +set_reset_data( debug_ftm__FTMSYNCCOUT, val_debug_ftm__FTMSYNCCOUT); +set_reset_data( debug_ftm__FTMATID, val_debug_ftm__FTMATID); +set_reset_data( debug_ftm__FTMITTRIGOUTACK, val_debug_ftm__FTMITTRIGOUTACK); +set_reset_data( debug_ftm__FTMITTRIGGER, val_debug_ftm__FTMITTRIGGER); +set_reset_data( debug_ftm__FTMITTRACEDIS, val_debug_ftm__FTMITTRACEDIS); +set_reset_data( debug_ftm__FTMITCYCCOUNT, val_debug_ftm__FTMITCYCCOUNT); +set_reset_data( debug_ftm__FTMITATBDATA0, val_debug_ftm__FTMITATBDATA0); +set_reset_data( debug_ftm__FTMITATBCTR2, val_debug_ftm__FTMITATBCTR2); +set_reset_data( debug_ftm__FTMITATBCTR1, val_debug_ftm__FTMITATBCTR1); +set_reset_data( debug_ftm__FTMITATBCTR0, val_debug_ftm__FTMITATBCTR0); +set_reset_data( debug_ftm__FTMITCR, val_debug_ftm__FTMITCR); +set_reset_data( debug_ftm__CLAIMTAGSET, val_debug_ftm__CLAIMTAGSET); +set_reset_data( debug_ftm__CLAIMTAGCLR, val_debug_ftm__CLAIMTAGCLR); +set_reset_data( debug_ftm__LOCK_ACCESS, val_debug_ftm__LOCK_ACCESS); +set_reset_data( debug_ftm__LOCK_STATUS, val_debug_ftm__LOCK_STATUS); +set_reset_data( debug_ftm__FTMAUTHSTATUS, val_debug_ftm__FTMAUTHSTATUS); +set_reset_data( debug_ftm__FTMDEVID, val_debug_ftm__FTMDEVID); +set_reset_data( debug_ftm__FTMDEV_TYPE, val_debug_ftm__FTMDEV_TYPE); +set_reset_data( debug_ftm__FTMPERIPHID4, val_debug_ftm__FTMPERIPHID4); +set_reset_data( debug_ftm__FTMPERIPHID5, val_debug_ftm__FTMPERIPHID5); +set_reset_data( debug_ftm__FTMPERIPHID6, val_debug_ftm__FTMPERIPHID6); +set_reset_data( debug_ftm__FTMPERIPHID7, val_debug_ftm__FTMPERIPHID7); +set_reset_data( debug_ftm__FTMPERIPHID0, val_debug_ftm__FTMPERIPHID0); +set_reset_data( debug_ftm__FTMPERIPHID1, val_debug_ftm__FTMPERIPHID1); +set_reset_data( debug_ftm__FTMPERIPHID2, val_debug_ftm__FTMPERIPHID2); +set_reset_data( debug_ftm__FTMPERIPHID3, val_debug_ftm__FTMPERIPHID3); +set_reset_data( debug_ftm__FTMCOMPONID0, val_debug_ftm__FTMCOMPONID0); +set_reset_data( debug_ftm__FTMCOMPONID1, val_debug_ftm__FTMCOMPONID1); +set_reset_data( debug_ftm__FTMCOMPONID2, val_debug_ftm__FTMCOMPONID2); +set_reset_data( debug_ftm__FTMCOMPONID3, val_debug_ftm__FTMCOMPONID3); + +// ************************************************************ +// Module debug_funnel funnel +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_funnel__Control, val_debug_funnel__Control); +set_reset_data( debug_funnel__PriControl, val_debug_funnel__PriControl); +set_reset_data( debug_funnel__ITATBDATA0, val_debug_funnel__ITATBDATA0); +set_reset_data( debug_funnel__ITATBCTR2, val_debug_funnel__ITATBCTR2); +set_reset_data( debug_funnel__ITATBCTR1, val_debug_funnel__ITATBCTR1); +set_reset_data( debug_funnel__ITATBCTR0, val_debug_funnel__ITATBCTR0); +set_reset_data( debug_funnel__IMCR, val_debug_funnel__IMCR); +set_reset_data( debug_funnel__CTSR, val_debug_funnel__CTSR); +set_reset_data( debug_funnel__CTCR, val_debug_funnel__CTCR); +set_reset_data( debug_funnel__LAR, val_debug_funnel__LAR); +set_reset_data( debug_funnel__LSR, val_debug_funnel__LSR); +set_reset_data( debug_funnel__ASR, val_debug_funnel__ASR); +set_reset_data( debug_funnel__DEVID, val_debug_funnel__DEVID); +set_reset_data( debug_funnel__DTIR, val_debug_funnel__DTIR); +set_reset_data( debug_funnel__PERIPHID4, val_debug_funnel__PERIPHID4); +set_reset_data( debug_funnel__PERIPHID5, val_debug_funnel__PERIPHID5); +set_reset_data( debug_funnel__PERIPHID6, val_debug_funnel__PERIPHID6); +set_reset_data( debug_funnel__PERIPHID7, val_debug_funnel__PERIPHID7); +set_reset_data( debug_funnel__PERIPHID0, val_debug_funnel__PERIPHID0); +set_reset_data( debug_funnel__PERIPHID1, val_debug_funnel__PERIPHID1); +set_reset_data( debug_funnel__PERIPHID2, val_debug_funnel__PERIPHID2); +set_reset_data( debug_funnel__PERIPHID3, val_debug_funnel__PERIPHID3); +set_reset_data( debug_funnel__COMPID0, val_debug_funnel__COMPID0); +set_reset_data( debug_funnel__COMPID1, val_debug_funnel__COMPID1); +set_reset_data( debug_funnel__COMPID2, val_debug_funnel__COMPID2); +set_reset_data( debug_funnel__COMPID3, val_debug_funnel__COMPID3); + +// ************************************************************ +// Module debug_itm itm +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_itm__StimPort00, val_debug_itm__StimPort00); +set_reset_data( debug_itm__StimPort01, val_debug_itm__StimPort01); +set_reset_data( debug_itm__StimPort02, val_debug_itm__StimPort02); +set_reset_data( debug_itm__StimPort03, val_debug_itm__StimPort03); +set_reset_data( debug_itm__StimPort04, val_debug_itm__StimPort04); +set_reset_data( debug_itm__StimPort05, val_debug_itm__StimPort05); +set_reset_data( debug_itm__StimPort06, val_debug_itm__StimPort06); +set_reset_data( debug_itm__StimPort07, val_debug_itm__StimPort07); +set_reset_data( debug_itm__StimPort08, val_debug_itm__StimPort08); +set_reset_data( debug_itm__StimPort09, val_debug_itm__StimPort09); +set_reset_data( debug_itm__StimPort10, val_debug_itm__StimPort10); +set_reset_data( debug_itm__StimPort11, val_debug_itm__StimPort11); +set_reset_data( debug_itm__StimPort12, val_debug_itm__StimPort12); +set_reset_data( debug_itm__StimPort13, val_debug_itm__StimPort13); +set_reset_data( debug_itm__StimPort14, val_debug_itm__StimPort14); +set_reset_data( debug_itm__StimPort15, val_debug_itm__StimPort15); +set_reset_data( debug_itm__StimPort16, val_debug_itm__StimPort16); +set_reset_data( debug_itm__StimPort17, val_debug_itm__StimPort17); +set_reset_data( debug_itm__StimPort18, val_debug_itm__StimPort18); +set_reset_data( debug_itm__StimPort19, val_debug_itm__StimPort19); +set_reset_data( debug_itm__StimPort20, val_debug_itm__StimPort20); +set_reset_data( debug_itm__StimPort21, val_debug_itm__StimPort21); +set_reset_data( debug_itm__StimPort22, val_debug_itm__StimPort22); +set_reset_data( debug_itm__StimPort23, val_debug_itm__StimPort23); +set_reset_data( debug_itm__StimPort24, val_debug_itm__StimPort24); +set_reset_data( debug_itm__StimPort25, val_debug_itm__StimPort25); +set_reset_data( debug_itm__StimPort26, val_debug_itm__StimPort26); +set_reset_data( debug_itm__StimPort27, val_debug_itm__StimPort27); +set_reset_data( debug_itm__StimPort28, val_debug_itm__StimPort28); +set_reset_data( debug_itm__StimPort29, val_debug_itm__StimPort29); +set_reset_data( debug_itm__StimPort30, val_debug_itm__StimPort30); +set_reset_data( debug_itm__StimPort31, val_debug_itm__StimPort31); +set_reset_data( debug_itm__TER, val_debug_itm__TER); +set_reset_data( debug_itm__TTR, val_debug_itm__TTR); +set_reset_data( debug_itm__CR, val_debug_itm__CR); +set_reset_data( debug_itm__SCR, val_debug_itm__SCR); +set_reset_data( debug_itm__ITTRIGOUTACK, val_debug_itm__ITTRIGOUTACK); +set_reset_data( debug_itm__ITTRIGOUT, val_debug_itm__ITTRIGOUT); +set_reset_data( debug_itm__ITATBDATA0, val_debug_itm__ITATBDATA0); +set_reset_data( debug_itm__ITATBCTR2, val_debug_itm__ITATBCTR2); +set_reset_data( debug_itm__ITATABCTR1, val_debug_itm__ITATABCTR1); +set_reset_data( debug_itm__ITATBCTR0, val_debug_itm__ITATBCTR0); +set_reset_data( debug_itm__IMCR, val_debug_itm__IMCR); +set_reset_data( debug_itm__CTSR, val_debug_itm__CTSR); +set_reset_data( debug_itm__CTCR, val_debug_itm__CTCR); +set_reset_data( debug_itm__LAR, val_debug_itm__LAR); +set_reset_data( debug_itm__LSR, val_debug_itm__LSR); +set_reset_data( debug_itm__ASR, val_debug_itm__ASR); +set_reset_data( debug_itm__DEVID, val_debug_itm__DEVID); +set_reset_data( debug_itm__DTIR, val_debug_itm__DTIR); +set_reset_data( debug_itm__PERIPHID4, val_debug_itm__PERIPHID4); +set_reset_data( debug_itm__PERIPHID5, val_debug_itm__PERIPHID5); +set_reset_data( debug_itm__PERIPHID6, val_debug_itm__PERIPHID6); +set_reset_data( debug_itm__PERIPHID7, val_debug_itm__PERIPHID7); +set_reset_data( debug_itm__PERIPHID0, val_debug_itm__PERIPHID0); +set_reset_data( debug_itm__PERIPHID1, val_debug_itm__PERIPHID1); +set_reset_data( debug_itm__PERIPHID2, val_debug_itm__PERIPHID2); +set_reset_data( debug_itm__PERIPHID3, val_debug_itm__PERIPHID3); +set_reset_data( debug_itm__COMPID0, val_debug_itm__COMPID0); +set_reset_data( debug_itm__COMPID1, val_debug_itm__COMPID1); +set_reset_data( debug_itm__COMPID2, val_debug_itm__COMPID2); +set_reset_data( debug_itm__COMPID3, val_debug_itm__COMPID3); + +// ************************************************************ +// Module debug_tpiu tpiu +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( debug_tpiu__SuppSize, val_debug_tpiu__SuppSize); +set_reset_data( debug_tpiu__CurrentSize, val_debug_tpiu__CurrentSize); +set_reset_data( debug_tpiu__SuppTrigMode, val_debug_tpiu__SuppTrigMode); +set_reset_data( debug_tpiu__TrigCount, val_debug_tpiu__TrigCount); +set_reset_data( debug_tpiu__TrigMult, val_debug_tpiu__TrigMult); +set_reset_data( debug_tpiu__SuppTest, val_debug_tpiu__SuppTest); +set_reset_data( debug_tpiu__CurrentTest, val_debug_tpiu__CurrentTest); +set_reset_data( debug_tpiu__TestRepeatCount, val_debug_tpiu__TestRepeatCount); +set_reset_data( debug_tpiu__FFSR, val_debug_tpiu__FFSR); +set_reset_data( debug_tpiu__FFCR, val_debug_tpiu__FFCR); +set_reset_data( debug_tpiu__FormatSyncCount, val_debug_tpiu__FormatSyncCount); +set_reset_data( debug_tpiu__EXTCTLIn, val_debug_tpiu__EXTCTLIn); +set_reset_data( debug_tpiu__EXTCTLOut, val_debug_tpiu__EXTCTLOut); +set_reset_data( debug_tpiu__ITTRFLINACK, val_debug_tpiu__ITTRFLINACK); +set_reset_data( debug_tpiu__ITTRFLIN, val_debug_tpiu__ITTRFLIN); +set_reset_data( debug_tpiu__ITATBDATA0, val_debug_tpiu__ITATBDATA0); +set_reset_data( debug_tpiu__ITATBCTR2, val_debug_tpiu__ITATBCTR2); +set_reset_data( debug_tpiu__ITATBCTR1, val_debug_tpiu__ITATBCTR1); +set_reset_data( debug_tpiu__ITATBCTR0, val_debug_tpiu__ITATBCTR0); +set_reset_data( debug_tpiu__IMCR, val_debug_tpiu__IMCR); +set_reset_data( debug_tpiu__CTSR, val_debug_tpiu__CTSR); +set_reset_data( debug_tpiu__CTCR, val_debug_tpiu__CTCR); +set_reset_data( debug_tpiu__LAR, val_debug_tpiu__LAR); +set_reset_data( debug_tpiu__LSR, val_debug_tpiu__LSR); +set_reset_data( debug_tpiu__ASR, val_debug_tpiu__ASR); +set_reset_data( debug_tpiu__DEVID, val_debug_tpiu__DEVID); +set_reset_data( debug_tpiu__DTIR, val_debug_tpiu__DTIR); +set_reset_data( debug_tpiu__PERIPHID4, val_debug_tpiu__PERIPHID4); +set_reset_data( debug_tpiu__PERIPHID5, val_debug_tpiu__PERIPHID5); +set_reset_data( debug_tpiu__PERIPHID6, val_debug_tpiu__PERIPHID6); +set_reset_data( debug_tpiu__PERIPHID7, val_debug_tpiu__PERIPHID7); +set_reset_data( debug_tpiu__PERIPHID0, val_debug_tpiu__PERIPHID0); +set_reset_data( debug_tpiu__PERIPHID1, val_debug_tpiu__PERIPHID1); +set_reset_data( debug_tpiu__PERIPHID2, val_debug_tpiu__PERIPHID2); +set_reset_data( debug_tpiu__PERIPHID3, val_debug_tpiu__PERIPHID3); +set_reset_data( debug_tpiu__COMPID0, val_debug_tpiu__COMPID0); +set_reset_data( debug_tpiu__COMPID1, val_debug_tpiu__COMPID1); +set_reset_data( debug_tpiu__COMPID2, val_debug_tpiu__COMPID2); +set_reset_data( debug_tpiu__COMPID3, val_debug_tpiu__COMPID3); + +// ************************************************************ +// Module devcfg devcfg +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( devcfg__CTRL, val_devcfg__CTRL); +set_reset_data( devcfg__LOCK, val_devcfg__LOCK); +set_reset_data( devcfg__CFG, val_devcfg__CFG); +set_reset_data( devcfg__INT_STS, val_devcfg__INT_STS); +set_reset_data( devcfg__INT_MASK, val_devcfg__INT_MASK); +set_reset_data( devcfg__STATUS, val_devcfg__STATUS); +set_reset_data( devcfg__DMA_SRC_ADDR, val_devcfg__DMA_SRC_ADDR); +set_reset_data( devcfg__DMA_DST_ADDR, val_devcfg__DMA_DST_ADDR); +set_reset_data( devcfg__DMA_SRC_LEN, val_devcfg__DMA_SRC_LEN); +set_reset_data( devcfg__DMA_DEST_LEN, val_devcfg__DMA_DEST_LEN); +set_reset_data( devcfg__ROM_SHADOW, val_devcfg__ROM_SHADOW); +set_reset_data( devcfg__MULTIBOOT_ADDR, val_devcfg__MULTIBOOT_ADDR); +set_reset_data( devcfg__SW_ID, val_devcfg__SW_ID); +set_reset_data( devcfg__UNLOCK, val_devcfg__UNLOCK); +set_reset_data( devcfg__MCTRL, val_devcfg__MCTRL); +set_reset_data( devcfg__XADCIF_CFG, val_devcfg__XADCIF_CFG); +set_reset_data( devcfg__XADCIF_INT_STS, val_devcfg__XADCIF_INT_STS); +set_reset_data( devcfg__XADCIF_INT_MASK, val_devcfg__XADCIF_INT_MASK); +set_reset_data( devcfg__XADCIF_MSTS, val_devcfg__XADCIF_MSTS); +set_reset_data( devcfg__XADCIF_CMDFIFO, val_devcfg__XADCIF_CMDFIFO); +set_reset_data( devcfg__XADCIF_RDFIFO, val_devcfg__XADCIF_RDFIFO); +set_reset_data( devcfg__XADCIF_MCTL, val_devcfg__XADCIF_MCTL); + +// ************************************************************ +// Module dmac0_ns dmac +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( dmac0_ns__DSR, val_dmac0_ns__DSR); +set_reset_data( dmac0_ns__DPC, val_dmac0_ns__DPC); +set_reset_data( dmac0_ns__INTEN, val_dmac0_ns__INTEN); +set_reset_data( dmac0_ns__INT_EVENT_RIS, val_dmac0_ns__INT_EVENT_RIS); +set_reset_data( dmac0_ns__INTMIS, val_dmac0_ns__INTMIS); +set_reset_data( dmac0_ns__INTCLR, val_dmac0_ns__INTCLR); +set_reset_data( dmac0_ns__FSRD, val_dmac0_ns__FSRD); +set_reset_data( dmac0_ns__FSRC, val_dmac0_ns__FSRC); +set_reset_data( dmac0_ns__FTRD, val_dmac0_ns__FTRD); +set_reset_data( dmac0_ns__FTR0, val_dmac0_ns__FTR0); +set_reset_data( dmac0_ns__FTR1, val_dmac0_ns__FTR1); +set_reset_data( dmac0_ns__FTR2, val_dmac0_ns__FTR2); +set_reset_data( dmac0_ns__FTR3, val_dmac0_ns__FTR3); +set_reset_data( dmac0_ns__FTR4, val_dmac0_ns__FTR4); +set_reset_data( dmac0_ns__FTR5, val_dmac0_ns__FTR5); +set_reset_data( dmac0_ns__FTR6, val_dmac0_ns__FTR6); +set_reset_data( dmac0_ns__FTR7, val_dmac0_ns__FTR7); +set_reset_data( dmac0_ns__CSR0, val_dmac0_ns__CSR0); +set_reset_data( dmac0_ns__CPC0, val_dmac0_ns__CPC0); +set_reset_data( dmac0_ns__CSR1, val_dmac0_ns__CSR1); +set_reset_data( dmac0_ns__CPC1, val_dmac0_ns__CPC1); +set_reset_data( dmac0_ns__CSR2, val_dmac0_ns__CSR2); +set_reset_data( dmac0_ns__CPC2, val_dmac0_ns__CPC2); +set_reset_data( dmac0_ns__CSR3, val_dmac0_ns__CSR3); +set_reset_data( dmac0_ns__CPC3, val_dmac0_ns__CPC3); +set_reset_data( dmac0_ns__CSR4, val_dmac0_ns__CSR4); +set_reset_data( dmac0_ns__CPC4, val_dmac0_ns__CPC4); +set_reset_data( dmac0_ns__CSR5, val_dmac0_ns__CSR5); +set_reset_data( dmac0_ns__CPC5, val_dmac0_ns__CPC5); +set_reset_data( dmac0_ns__CSR6, val_dmac0_ns__CSR6); +set_reset_data( dmac0_ns__CPC6, val_dmac0_ns__CPC6); +set_reset_data( dmac0_ns__CSR7, val_dmac0_ns__CSR7); +set_reset_data( dmac0_ns__CPC7, val_dmac0_ns__CPC7); +set_reset_data( dmac0_ns__SAR0, val_dmac0_ns__SAR0); +set_reset_data( dmac0_ns__DAR0, val_dmac0_ns__DAR0); +set_reset_data( dmac0_ns__CCR0, val_dmac0_ns__CCR0); +set_reset_data( dmac0_ns__LC0_0, val_dmac0_ns__LC0_0); +set_reset_data( dmac0_ns__LC1_0, val_dmac0_ns__LC1_0); +set_reset_data( dmac0_ns__SAR1, val_dmac0_ns__SAR1); +set_reset_data( dmac0_ns__DAR1, val_dmac0_ns__DAR1); +set_reset_data( dmac0_ns__CCR1, val_dmac0_ns__CCR1); +set_reset_data( dmac0_ns__LC0_1, val_dmac0_ns__LC0_1); +set_reset_data( dmac0_ns__LC1_1, val_dmac0_ns__LC1_1); +set_reset_data( dmac0_ns__SAR2, val_dmac0_ns__SAR2); +set_reset_data( dmac0_ns__DAR2, val_dmac0_ns__DAR2); +set_reset_data( dmac0_ns__CCR2, val_dmac0_ns__CCR2); +set_reset_data( dmac0_ns__LC0_2, val_dmac0_ns__LC0_2); +set_reset_data( dmac0_ns__LC1_2, val_dmac0_ns__LC1_2); +set_reset_data( dmac0_ns__SAR3, val_dmac0_ns__SAR3); +set_reset_data( dmac0_ns__DAR3, val_dmac0_ns__DAR3); +set_reset_data( dmac0_ns__CCR3, val_dmac0_ns__CCR3); +set_reset_data( dmac0_ns__LC0_3, val_dmac0_ns__LC0_3); +set_reset_data( dmac0_ns__LC1_3, val_dmac0_ns__LC1_3); +set_reset_data( dmac0_ns__SAR4, val_dmac0_ns__SAR4); +set_reset_data( dmac0_ns__DAR4, val_dmac0_ns__DAR4); +set_reset_data( dmac0_ns__CCR4, val_dmac0_ns__CCR4); +set_reset_data( dmac0_ns__LC0_4, val_dmac0_ns__LC0_4); +set_reset_data( dmac0_ns__LC1_4, val_dmac0_ns__LC1_4); +set_reset_data( dmac0_ns__SAR5, val_dmac0_ns__SAR5); +set_reset_data( dmac0_ns__DAR5, val_dmac0_ns__DAR5); +set_reset_data( dmac0_ns__CCR5, val_dmac0_ns__CCR5); +set_reset_data( dmac0_ns__LC0_5, val_dmac0_ns__LC0_5); +set_reset_data( dmac0_ns__LC1_5, val_dmac0_ns__LC1_5); +set_reset_data( dmac0_ns__SAR6, val_dmac0_ns__SAR6); +set_reset_data( dmac0_ns__DAR6, val_dmac0_ns__DAR6); +set_reset_data( dmac0_ns__CCR6, val_dmac0_ns__CCR6); +set_reset_data( dmac0_ns__LC0_6, val_dmac0_ns__LC0_6); +set_reset_data( dmac0_ns__LC1_6, val_dmac0_ns__LC1_6); +set_reset_data( dmac0_ns__SAR7, val_dmac0_ns__SAR7); +set_reset_data( dmac0_ns__DAR7, val_dmac0_ns__DAR7); +set_reset_data( dmac0_ns__CCR7, val_dmac0_ns__CCR7); +set_reset_data( dmac0_ns__LC0_7, val_dmac0_ns__LC0_7); +set_reset_data( dmac0_ns__LC1_7, val_dmac0_ns__LC1_7); +set_reset_data( dmac0_ns__DBGSTATUS, val_dmac0_ns__DBGSTATUS); +set_reset_data( dmac0_ns__DBGCMD, val_dmac0_ns__DBGCMD); +set_reset_data( dmac0_ns__DBGINST0, val_dmac0_ns__DBGINST0); +set_reset_data( dmac0_ns__DBGINST1, val_dmac0_ns__DBGINST1); +set_reset_data( dmac0_ns__CR0, val_dmac0_ns__CR0); +set_reset_data( dmac0_ns__CR1, val_dmac0_ns__CR1); +set_reset_data( dmac0_ns__CR2, val_dmac0_ns__CR2); +set_reset_data( dmac0_ns__CR3, val_dmac0_ns__CR3); +set_reset_data( dmac0_ns__CR4, val_dmac0_ns__CR4); +set_reset_data( dmac0_ns__CRD, val_dmac0_ns__CRD); +set_reset_data( dmac0_ns__WD, val_dmac0_ns__WD); +set_reset_data( dmac0_ns__periph_id_0, val_dmac0_ns__periph_id_0); +set_reset_data( dmac0_ns__periph_id_1, val_dmac0_ns__periph_id_1); +set_reset_data( dmac0_ns__periph_id_2, val_dmac0_ns__periph_id_2); +set_reset_data( dmac0_ns__periph_id_3, val_dmac0_ns__periph_id_3); +set_reset_data( dmac0_ns__pcell_id_0, val_dmac0_ns__pcell_id_0); +set_reset_data( dmac0_ns__pcell_id_1, val_dmac0_ns__pcell_id_1); +set_reset_data( dmac0_ns__pcell_id_2, val_dmac0_ns__pcell_id_2); +set_reset_data( dmac0_ns__pcell_id_3, val_dmac0_ns__pcell_id_3); + +// ************************************************************ +// Module dmac0_s dmac +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( dmac0_s__DSR, val_dmac0_s__DSR); +set_reset_data( dmac0_s__DPC, val_dmac0_s__DPC); +set_reset_data( dmac0_s__INTEN, val_dmac0_s__INTEN); +set_reset_data( dmac0_s__INT_EVENT_RIS, val_dmac0_s__INT_EVENT_RIS); +set_reset_data( dmac0_s__INTMIS, val_dmac0_s__INTMIS); +set_reset_data( dmac0_s__INTCLR, val_dmac0_s__INTCLR); +set_reset_data( dmac0_s__FSRD, val_dmac0_s__FSRD); +set_reset_data( dmac0_s__FSRC, val_dmac0_s__FSRC); +set_reset_data( dmac0_s__FTRD, val_dmac0_s__FTRD); +set_reset_data( dmac0_s__FTR0, val_dmac0_s__FTR0); +set_reset_data( dmac0_s__FTR1, val_dmac0_s__FTR1); +set_reset_data( dmac0_s__FTR2, val_dmac0_s__FTR2); +set_reset_data( dmac0_s__FTR3, val_dmac0_s__FTR3); +set_reset_data( dmac0_s__FTR4, val_dmac0_s__FTR4); +set_reset_data( dmac0_s__FTR5, val_dmac0_s__FTR5); +set_reset_data( dmac0_s__FTR6, val_dmac0_s__FTR6); +set_reset_data( dmac0_s__FTR7, val_dmac0_s__FTR7); +set_reset_data( dmac0_s__CSR0, val_dmac0_s__CSR0); +set_reset_data( dmac0_s__CPC0, val_dmac0_s__CPC0); +set_reset_data( dmac0_s__CSR1, val_dmac0_s__CSR1); +set_reset_data( dmac0_s__CPC1, val_dmac0_s__CPC1); +set_reset_data( dmac0_s__CSR2, val_dmac0_s__CSR2); +set_reset_data( dmac0_s__CPC2, val_dmac0_s__CPC2); +set_reset_data( dmac0_s__CSR3, val_dmac0_s__CSR3); +set_reset_data( dmac0_s__CPC3, val_dmac0_s__CPC3); +set_reset_data( dmac0_s__CSR4, val_dmac0_s__CSR4); +set_reset_data( dmac0_s__CPC4, val_dmac0_s__CPC4); +set_reset_data( dmac0_s__CSR5, val_dmac0_s__CSR5); +set_reset_data( dmac0_s__CPC5, val_dmac0_s__CPC5); +set_reset_data( dmac0_s__CSR6, val_dmac0_s__CSR6); +set_reset_data( dmac0_s__CPC6, val_dmac0_s__CPC6); +set_reset_data( dmac0_s__CSR7, val_dmac0_s__CSR7); +set_reset_data( dmac0_s__CPC7, val_dmac0_s__CPC7); +set_reset_data( dmac0_s__SAR0, val_dmac0_s__SAR0); +set_reset_data( dmac0_s__DAR0, val_dmac0_s__DAR0); +set_reset_data( dmac0_s__CCR0, val_dmac0_s__CCR0); +set_reset_data( dmac0_s__LC0_0, val_dmac0_s__LC0_0); +set_reset_data( dmac0_s__LC1_0, val_dmac0_s__LC1_0); +set_reset_data( dmac0_s__SAR1, val_dmac0_s__SAR1); +set_reset_data( dmac0_s__DAR1, val_dmac0_s__DAR1); +set_reset_data( dmac0_s__CCR1, val_dmac0_s__CCR1); +set_reset_data( dmac0_s__LC0_1, val_dmac0_s__LC0_1); +set_reset_data( dmac0_s__LC1_1, val_dmac0_s__LC1_1); +set_reset_data( dmac0_s__SAR2, val_dmac0_s__SAR2); +set_reset_data( dmac0_s__DAR2, val_dmac0_s__DAR2); +set_reset_data( dmac0_s__CCR2, val_dmac0_s__CCR2); +set_reset_data( dmac0_s__LC0_2, val_dmac0_s__LC0_2); +set_reset_data( dmac0_s__LC1_2, val_dmac0_s__LC1_2); +set_reset_data( dmac0_s__SAR3, val_dmac0_s__SAR3); +set_reset_data( dmac0_s__DAR3, val_dmac0_s__DAR3); +set_reset_data( dmac0_s__CCR3, val_dmac0_s__CCR3); +set_reset_data( dmac0_s__LC0_3, val_dmac0_s__LC0_3); +set_reset_data( dmac0_s__LC1_3, val_dmac0_s__LC1_3); +set_reset_data( dmac0_s__SAR4, val_dmac0_s__SAR4); +set_reset_data( dmac0_s__DAR4, val_dmac0_s__DAR4); +set_reset_data( dmac0_s__CCR4, val_dmac0_s__CCR4); +set_reset_data( dmac0_s__LC0_4, val_dmac0_s__LC0_4); +set_reset_data( dmac0_s__LC1_4, val_dmac0_s__LC1_4); +set_reset_data( dmac0_s__SAR5, val_dmac0_s__SAR5); +set_reset_data( dmac0_s__DAR5, val_dmac0_s__DAR5); +set_reset_data( dmac0_s__CCR5, val_dmac0_s__CCR5); +set_reset_data( dmac0_s__LC0_5, val_dmac0_s__LC0_5); +set_reset_data( dmac0_s__LC1_5, val_dmac0_s__LC1_5); +set_reset_data( dmac0_s__SAR6, val_dmac0_s__SAR6); +set_reset_data( dmac0_s__DAR6, val_dmac0_s__DAR6); +set_reset_data( dmac0_s__CCR6, val_dmac0_s__CCR6); +set_reset_data( dmac0_s__LC0_6, val_dmac0_s__LC0_6); +set_reset_data( dmac0_s__LC1_6, val_dmac0_s__LC1_6); +set_reset_data( dmac0_s__SAR7, val_dmac0_s__SAR7); +set_reset_data( dmac0_s__DAR7, val_dmac0_s__DAR7); +set_reset_data( dmac0_s__CCR7, val_dmac0_s__CCR7); +set_reset_data( dmac0_s__LC0_7, val_dmac0_s__LC0_7); +set_reset_data( dmac0_s__LC1_7, val_dmac0_s__LC1_7); +set_reset_data( dmac0_s__DBGSTATUS, val_dmac0_s__DBGSTATUS); +set_reset_data( dmac0_s__DBGCMD, val_dmac0_s__DBGCMD); +set_reset_data( dmac0_s__DBGINST0, val_dmac0_s__DBGINST0); +set_reset_data( dmac0_s__DBGINST1, val_dmac0_s__DBGINST1); +set_reset_data( dmac0_s__CR0, val_dmac0_s__CR0); +set_reset_data( dmac0_s__CR1, val_dmac0_s__CR1); +set_reset_data( dmac0_s__CR2, val_dmac0_s__CR2); +set_reset_data( dmac0_s__CR3, val_dmac0_s__CR3); +set_reset_data( dmac0_s__CR4, val_dmac0_s__CR4); +set_reset_data( dmac0_s__CRD, val_dmac0_s__CRD); +set_reset_data( dmac0_s__WD, val_dmac0_s__WD); +set_reset_data( dmac0_s__periph_id_0, val_dmac0_s__periph_id_0); +set_reset_data( dmac0_s__periph_id_1, val_dmac0_s__periph_id_1); +set_reset_data( dmac0_s__periph_id_2, val_dmac0_s__periph_id_2); +set_reset_data( dmac0_s__periph_id_3, val_dmac0_s__periph_id_3); +set_reset_data( dmac0_s__pcell_id_0, val_dmac0_s__pcell_id_0); +set_reset_data( dmac0_s__pcell_id_1, val_dmac0_s__pcell_id_1); +set_reset_data( dmac0_s__pcell_id_2, val_dmac0_s__pcell_id_2); +set_reset_data( dmac0_s__pcell_id_3, val_dmac0_s__pcell_id_3); + +// ************************************************************ +// Module efuse_ctrl efuse_ctrl +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( efuse_ctrl__WR_LOCK, val_efuse_ctrl__WR_LOCK); +set_reset_data( efuse_ctrl__WR_UNLOCK, val_efuse_ctrl__WR_UNLOCK); +set_reset_data( efuse_ctrl__WR_LOCKSTA, val_efuse_ctrl__WR_LOCKSTA); +set_reset_data( efuse_ctrl__CFG, val_efuse_ctrl__CFG); +set_reset_data( efuse_ctrl__STATUS, val_efuse_ctrl__STATUS); +set_reset_data( efuse_ctrl__CONTROL, val_efuse_ctrl__CONTROL); +set_reset_data( efuse_ctrl__PGM_STBW, val_efuse_ctrl__PGM_STBW); +set_reset_data( efuse_ctrl__RD_STBW, val_efuse_ctrl__RD_STBW); + +// ************************************************************ +// Module gem0 GEM +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( gem0__net_ctrl, val_gem0__net_ctrl); +set_reset_data( gem0__net_cfg, val_gem0__net_cfg); +set_reset_data( gem0__net_status, val_gem0__net_status); +set_reset_data( gem0__user_io, val_gem0__user_io); +set_reset_data( gem0__dma_cfg, val_gem0__dma_cfg); +set_reset_data( gem0__tx_status, val_gem0__tx_status); +set_reset_data( gem0__rx_qbar, val_gem0__rx_qbar); +set_reset_data( gem0__tx_qbar, val_gem0__tx_qbar); +set_reset_data( gem0__rx_status, val_gem0__rx_status); +set_reset_data( gem0__intr_status, val_gem0__intr_status); +set_reset_data( gem0__intr_en, val_gem0__intr_en); +set_reset_data( gem0__intr_dis, val_gem0__intr_dis); +set_reset_data( gem0__intr_mask, val_gem0__intr_mask); +set_reset_data( gem0__phy_maint, val_gem0__phy_maint); +set_reset_data( gem0__rx_pauseq, val_gem0__rx_pauseq); +set_reset_data( gem0__tx_pauseq, val_gem0__tx_pauseq); +set_reset_data( gem0__tx_partial_st_fwd, val_gem0__tx_partial_st_fwd); +set_reset_data( gem0__rx_partial_st_fwd, val_gem0__rx_partial_st_fwd); +set_reset_data( gem0__hash_bot, val_gem0__hash_bot); +set_reset_data( gem0__hash_top, val_gem0__hash_top); +set_reset_data( gem0__spec_addr1_bot, val_gem0__spec_addr1_bot); +set_reset_data( gem0__spec_addr1_top, val_gem0__spec_addr1_top); +set_reset_data( gem0__spec_addr2_bot, val_gem0__spec_addr2_bot); +set_reset_data( gem0__spec_addr2_top, val_gem0__spec_addr2_top); +set_reset_data( gem0__spec_addr3_bot, val_gem0__spec_addr3_bot); +set_reset_data( gem0__spec_addr3_top, val_gem0__spec_addr3_top); +set_reset_data( gem0__spec_addr4_bot, val_gem0__spec_addr4_bot); +set_reset_data( gem0__spec_addr4_top, val_gem0__spec_addr4_top); +set_reset_data( gem0__type_id_match1, val_gem0__type_id_match1); +set_reset_data( gem0__type_id_match2, val_gem0__type_id_match2); +set_reset_data( gem0__type_id_match3, val_gem0__type_id_match3); +set_reset_data( gem0__type_id_match4, val_gem0__type_id_match4); +set_reset_data( gem0__wake_on_lan, val_gem0__wake_on_lan); +set_reset_data( gem0__ipg_stretch, val_gem0__ipg_stretch); +set_reset_data( gem0__stacked_vlan, val_gem0__stacked_vlan); +set_reset_data( gem0__tx_pfc_pause, val_gem0__tx_pfc_pause); +set_reset_data( gem0__spec_addr1_mask_bot, val_gem0__spec_addr1_mask_bot); +set_reset_data( gem0__spec_addr1_mask_top, val_gem0__spec_addr1_mask_top); +set_reset_data( gem0__module_id, val_gem0__module_id); +set_reset_data( gem0__octets_tx_bot, val_gem0__octets_tx_bot); +set_reset_data( gem0__octets_tx_top, val_gem0__octets_tx_top); +set_reset_data( gem0__frames_tx, val_gem0__frames_tx); +set_reset_data( gem0__broadcast_frames_tx, val_gem0__broadcast_frames_tx); +set_reset_data( gem0__multi_frames_tx, val_gem0__multi_frames_tx); +set_reset_data( gem0__pause_frames_tx, val_gem0__pause_frames_tx); +set_reset_data( gem0__frames_64b_tx, val_gem0__frames_64b_tx); +set_reset_data( gem0__frames_65to127b_tx, val_gem0__frames_65to127b_tx); +set_reset_data( gem0__frames_128to255b_tx, val_gem0__frames_128to255b_tx); +set_reset_data( gem0__frames_256to511b_tx, val_gem0__frames_256to511b_tx); +set_reset_data( gem0__frames_512to1023b_tx, val_gem0__frames_512to1023b_tx); +set_reset_data( gem0__frames_1024to1518b_tx, val_gem0__frames_1024to1518b_tx); +set_reset_data( gem0__frames_gt1518b_tx, val_gem0__frames_gt1518b_tx); +set_reset_data( gem0__tx_under_runs, val_gem0__tx_under_runs); +set_reset_data( gem0__single_collisn_frames, val_gem0__single_collisn_frames); +set_reset_data( gem0__multi_collisn_frames, val_gem0__multi_collisn_frames); +set_reset_data( gem0__excessive_collisns, val_gem0__excessive_collisns); +set_reset_data( gem0__late_collisns, val_gem0__late_collisns); +set_reset_data( gem0__deferred_tx_frames, val_gem0__deferred_tx_frames); +set_reset_data( gem0__carrier_sense_errs, val_gem0__carrier_sense_errs); +set_reset_data( gem0__octets_rx_bot, val_gem0__octets_rx_bot); +set_reset_data( gem0__octets_rx_top, val_gem0__octets_rx_top); +set_reset_data( gem0__frames_rx, val_gem0__frames_rx); +set_reset_data( gem0__bdcast_fames_rx, val_gem0__bdcast_fames_rx); +set_reset_data( gem0__multi_frames_rx, val_gem0__multi_frames_rx); +set_reset_data( gem0__pause_rx, val_gem0__pause_rx); +set_reset_data( gem0__frames_64b_rx, val_gem0__frames_64b_rx); +set_reset_data( gem0__frames_65to127b_rx, val_gem0__frames_65to127b_rx); +set_reset_data( gem0__frames_128to255b_rx, val_gem0__frames_128to255b_rx); +set_reset_data( gem0__frames_256to511b_rx, val_gem0__frames_256to511b_rx); +set_reset_data( gem0__frames_512to1023b_rx, val_gem0__frames_512to1023b_rx); +set_reset_data( gem0__frames_1024to1518b_rx, val_gem0__frames_1024to1518b_rx); +set_reset_data( gem0__frames_gt1518b_rx, val_gem0__frames_gt1518b_rx); +set_reset_data( gem0__undersz_rx, val_gem0__undersz_rx); +set_reset_data( gem0__oversz_rx, val_gem0__oversz_rx); +set_reset_data( gem0__jab_rx, val_gem0__jab_rx); +set_reset_data( gem0__fcs_errors, val_gem0__fcs_errors); +set_reset_data( gem0__length_field_errors, val_gem0__length_field_errors); +set_reset_data( gem0__rx_symbol_errors, val_gem0__rx_symbol_errors); +set_reset_data( gem0__align_errors, val_gem0__align_errors); +set_reset_data( gem0__rx_resource_errors, val_gem0__rx_resource_errors); +set_reset_data( gem0__rx_overrun_errors, val_gem0__rx_overrun_errors); +set_reset_data( gem0__ip_hdr_csum_errors, val_gem0__ip_hdr_csum_errors); +set_reset_data( gem0__tcp_csum_errors, val_gem0__tcp_csum_errors); +set_reset_data( gem0__udp_csum_errors, val_gem0__udp_csum_errors); +set_reset_data( gem0__timer_strobe_s, val_gem0__timer_strobe_s); +set_reset_data( gem0__timer_strobe_ns, val_gem0__timer_strobe_ns); +set_reset_data( gem0__timer_s, val_gem0__timer_s); +set_reset_data( gem0__timer_ns, val_gem0__timer_ns); +set_reset_data( gem0__timer_adjust, val_gem0__timer_adjust); +set_reset_data( gem0__timer_incr, val_gem0__timer_incr); +set_reset_data( gem0__ptp_tx_s, val_gem0__ptp_tx_s); +set_reset_data( gem0__ptp_tx_ns, val_gem0__ptp_tx_ns); +set_reset_data( gem0__ptp_rx_s, val_gem0__ptp_rx_s); +set_reset_data( gem0__ptp_rx_ns, val_gem0__ptp_rx_ns); +set_reset_data( gem0__ptp_peer_tx_s, val_gem0__ptp_peer_tx_s); +set_reset_data( gem0__ptp_peer_tx_ns, val_gem0__ptp_peer_tx_ns); +set_reset_data( gem0__ptp_peer_rx_s, val_gem0__ptp_peer_rx_s); +set_reset_data( gem0__ptp_peer_rx_ns, val_gem0__ptp_peer_rx_ns); +set_reset_data( gem0__pcs_ctrl, val_gem0__pcs_ctrl); +set_reset_data( gem0__pcs_status, val_gem0__pcs_status); +set_reset_data( gem0__pcs_upper_phy_id, val_gem0__pcs_upper_phy_id); +set_reset_data( gem0__pcs_lower_phy_id, val_gem0__pcs_lower_phy_id); +set_reset_data( gem0__pcs_autoneg_ad, val_gem0__pcs_autoneg_ad); +set_reset_data( gem0__pcs_autoneg_ability, val_gem0__pcs_autoneg_ability); +set_reset_data( gem0__pcs_autonec_exp, val_gem0__pcs_autonec_exp); +set_reset_data( gem0__pcs_autoneg_next_pg, val_gem0__pcs_autoneg_next_pg); +set_reset_data( gem0__pcs_autoneg_pnext_pg, val_gem0__pcs_autoneg_pnext_pg); +set_reset_data( gem0__pcs_extended_status, val_gem0__pcs_extended_status); +set_reset_data( gem0__design_cfg1, val_gem0__design_cfg1); +set_reset_data( gem0__design_cfg2, val_gem0__design_cfg2); +set_reset_data( gem0__design_cfg3, val_gem0__design_cfg3); +set_reset_data( gem0__design_cfg4, val_gem0__design_cfg4); +set_reset_data( gem0__design_cfg5, val_gem0__design_cfg5); +set_reset_data( gem0__design_cfg6, val_gem0__design_cfg6); +set_reset_data( gem0__design_cfg7, val_gem0__design_cfg7); +set_reset_data( gem0__isr_pq1, val_gem0__isr_pq1); +set_reset_data( gem0__isr_pq2, val_gem0__isr_pq2); +set_reset_data( gem0__isr_pq3, val_gem0__isr_pq3); +set_reset_data( gem0__isr_pq4, val_gem0__isr_pq4); +set_reset_data( gem0__isr_pq5, val_gem0__isr_pq5); +set_reset_data( gem0__isr_pq6, val_gem0__isr_pq6); +set_reset_data( gem0__isr_pq7, val_gem0__isr_pq7); +set_reset_data( gem0__tx_qbar_q1, val_gem0__tx_qbar_q1); +set_reset_data( gem0__tx_qbar_q2, val_gem0__tx_qbar_q2); +set_reset_data( gem0__tx_qbar_q3, val_gem0__tx_qbar_q3); +set_reset_data( gem0__tx_qbar_q4, val_gem0__tx_qbar_q4); +set_reset_data( gem0__tx_qbar_q5, val_gem0__tx_qbar_q5); +set_reset_data( gem0__tx_qbar_q6, val_gem0__tx_qbar_q6); +set_reset_data( gem0__tx_qbar_q7, val_gem0__tx_qbar_q7); +set_reset_data( gem0__rx_qbar_q1, val_gem0__rx_qbar_q1); +set_reset_data( gem0__rx_qbar_q2, val_gem0__rx_qbar_q2); +set_reset_data( gem0__rx_qbar_q3, val_gem0__rx_qbar_q3); +set_reset_data( gem0__rx_qbar_q4, val_gem0__rx_qbar_q4); +set_reset_data( gem0__rx_qbar_q5, val_gem0__rx_qbar_q5); +set_reset_data( gem0__rx_qbar_q6, val_gem0__rx_qbar_q6); +set_reset_data( gem0__rx_qbar_q7, val_gem0__rx_qbar_q7); +set_reset_data( gem0__rx_bufsz_q1, val_gem0__rx_bufsz_q1); +set_reset_data( gem0__rx_bufsz_q2, val_gem0__rx_bufsz_q2); +set_reset_data( gem0__rx_bufsz_q3, val_gem0__rx_bufsz_q3); +set_reset_data( gem0__rx_bufsz_q4, val_gem0__rx_bufsz_q4); +set_reset_data( gem0__rx_bufsz_q5, val_gem0__rx_bufsz_q5); +set_reset_data( gem0__rx_bufsz_q6, val_gem0__rx_bufsz_q6); +set_reset_data( gem0__rx_bufsz_q7, val_gem0__rx_bufsz_q7); +set_reset_data( gem0__screen_t1_r0, val_gem0__screen_t1_r0); +set_reset_data( gem0__screen_t1_r1, val_gem0__screen_t1_r1); +set_reset_data( gem0__screen_t1_r2, val_gem0__screen_t1_r2); +set_reset_data( gem0__screen_t1_r3, val_gem0__screen_t1_r3); +set_reset_data( gem0__screen_t1_r4, val_gem0__screen_t1_r4); +set_reset_data( gem0__screen_t1_r5, val_gem0__screen_t1_r5); +set_reset_data( gem0__screen_t1_r6, val_gem0__screen_t1_r6); +set_reset_data( gem0__screen_t1_r7, val_gem0__screen_t1_r7); +set_reset_data( gem0__screen_t1_r8, val_gem0__screen_t1_r8); +set_reset_data( gem0__screen_t1_r9, val_gem0__screen_t1_r9); +set_reset_data( gem0__screen_t1_r10, val_gem0__screen_t1_r10); +set_reset_data( gem0__screen_t1_r11, val_gem0__screen_t1_r11); +set_reset_data( gem0__screen_t1_r12, val_gem0__screen_t1_r12); +set_reset_data( gem0__screen_t1_r13, val_gem0__screen_t1_r13); +set_reset_data( gem0__screen_t1_r14, val_gem0__screen_t1_r14); +set_reset_data( gem0__screen_t1_r15, val_gem0__screen_t1_r15); +set_reset_data( gem0__screen_t2_r0, val_gem0__screen_t2_r0); +set_reset_data( gem0__screen_t2_r1, val_gem0__screen_t2_r1); +set_reset_data( gem0__screen_t2_r2, val_gem0__screen_t2_r2); +set_reset_data( gem0__screen_t2_r3, val_gem0__screen_t2_r3); +set_reset_data( gem0__screen_t2_r4, val_gem0__screen_t2_r4); +set_reset_data( gem0__screen_t2_r5, val_gem0__screen_t2_r5); +set_reset_data( gem0__screen_t2_r6, val_gem0__screen_t2_r6); +set_reset_data( gem0__screen_t2_r7, val_gem0__screen_t2_r7); +set_reset_data( gem0__screen_t2_r8, val_gem0__screen_t2_r8); +set_reset_data( gem0__screen_t2_r9, val_gem0__screen_t2_r9); +set_reset_data( gem0__screen_t2_r10, val_gem0__screen_t2_r10); +set_reset_data( gem0__screen_t2_r11, val_gem0__screen_t2_r11); +set_reset_data( gem0__screen_t2_r12, val_gem0__screen_t2_r12); +set_reset_data( gem0__screen_t2_r13, val_gem0__screen_t2_r13); +set_reset_data( gem0__screen_t2_r14, val_gem0__screen_t2_r14); +set_reset_data( gem0__screen_t2_r15, val_gem0__screen_t2_r15); +set_reset_data( gem0__intr_en_pq1, val_gem0__intr_en_pq1); +set_reset_data( gem0__intr_en_pq2, val_gem0__intr_en_pq2); +set_reset_data( gem0__intr_en_pq3, val_gem0__intr_en_pq3); +set_reset_data( gem0__intr_en_pq4, val_gem0__intr_en_pq4); +set_reset_data( gem0__intr_en_pq5, val_gem0__intr_en_pq5); +set_reset_data( gem0__intr_en_pq6, val_gem0__intr_en_pq6); +set_reset_data( gem0__intr_en_pq7, val_gem0__intr_en_pq7); +set_reset_data( gem0__intr_dis_pq1, val_gem0__intr_dis_pq1); +set_reset_data( gem0__intr_dis_pq2, val_gem0__intr_dis_pq2); +set_reset_data( gem0__intr_dis_pq3, val_gem0__intr_dis_pq3); +set_reset_data( gem0__intr_dis_pq4, val_gem0__intr_dis_pq4); +set_reset_data( gem0__intr_dis_pq5, val_gem0__intr_dis_pq5); +set_reset_data( gem0__intr_dis_pq6, val_gem0__intr_dis_pq6); +set_reset_data( gem0__intr_dis_pq7, val_gem0__intr_dis_pq7); +set_reset_data( gem0__intr_mask_pq1, val_gem0__intr_mask_pq1); +set_reset_data( gem0__intr_mask_pq2, val_gem0__intr_mask_pq2); +set_reset_data( gem0__intr_mask_pq3, val_gem0__intr_mask_pq3); +set_reset_data( gem0__intr_mask_pq4, val_gem0__intr_mask_pq4); +set_reset_data( gem0__intr_mask_pq5, val_gem0__intr_mask_pq5); +set_reset_data( gem0__intr_mask_pq6, val_gem0__intr_mask_pq6); +set_reset_data( gem0__intr_mask_pq7, val_gem0__intr_mask_pq7); + +// ************************************************************ +// Module gem1 GEM +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( gem1__net_ctrl, val_gem1__net_ctrl); +set_reset_data( gem1__net_cfg, val_gem1__net_cfg); +set_reset_data( gem1__net_status, val_gem1__net_status); +set_reset_data( gem1__user_io, val_gem1__user_io); +set_reset_data( gem1__dma_cfg, val_gem1__dma_cfg); +set_reset_data( gem1__tx_status, val_gem1__tx_status); +set_reset_data( gem1__rx_qbar, val_gem1__rx_qbar); +set_reset_data( gem1__tx_qbar, val_gem1__tx_qbar); +set_reset_data( gem1__rx_status, val_gem1__rx_status); +set_reset_data( gem1__intr_status, val_gem1__intr_status); +set_reset_data( gem1__intr_en, val_gem1__intr_en); +set_reset_data( gem1__intr_dis, val_gem1__intr_dis); +set_reset_data( gem1__intr_mask, val_gem1__intr_mask); +set_reset_data( gem1__phy_maint, val_gem1__phy_maint); +set_reset_data( gem1__rx_pauseq, val_gem1__rx_pauseq); +set_reset_data( gem1__tx_pauseq, val_gem1__tx_pauseq); +set_reset_data( gem1__tx_partial_st_fwd, val_gem1__tx_partial_st_fwd); +set_reset_data( gem1__rx_partial_st_fwd, val_gem1__rx_partial_st_fwd); +set_reset_data( gem1__hash_bot, val_gem1__hash_bot); +set_reset_data( gem1__hash_top, val_gem1__hash_top); +set_reset_data( gem1__spec_addr1_bot, val_gem1__spec_addr1_bot); +set_reset_data( gem1__spec_addr1_top, val_gem1__spec_addr1_top); +set_reset_data( gem1__spec_addr2_bot, val_gem1__spec_addr2_bot); +set_reset_data( gem1__spec_addr2_top, val_gem1__spec_addr2_top); +set_reset_data( gem1__spec_addr3_bot, val_gem1__spec_addr3_bot); +set_reset_data( gem1__spec_addr3_top, val_gem1__spec_addr3_top); +set_reset_data( gem1__spec_addr4_bot, val_gem1__spec_addr4_bot); +set_reset_data( gem1__spec_addr4_top, val_gem1__spec_addr4_top); +set_reset_data( gem1__type_id_match1, val_gem1__type_id_match1); +set_reset_data( gem1__type_id_match2, val_gem1__type_id_match2); +set_reset_data( gem1__type_id_match3, val_gem1__type_id_match3); +set_reset_data( gem1__type_id_match4, val_gem1__type_id_match4); +set_reset_data( gem1__wake_on_lan, val_gem1__wake_on_lan); +set_reset_data( gem1__ipg_stretch, val_gem1__ipg_stretch); +set_reset_data( gem1__stacked_vlan, val_gem1__stacked_vlan); +set_reset_data( gem1__tx_pfc_pause, val_gem1__tx_pfc_pause); +set_reset_data( gem1__spec_addr1_mask_bot, val_gem1__spec_addr1_mask_bot); +set_reset_data( gem1__spec_addr1_mask_top, val_gem1__spec_addr1_mask_top); +set_reset_data( gem1__module_id, val_gem1__module_id); +set_reset_data( gem1__octets_tx_bot, val_gem1__octets_tx_bot); +set_reset_data( gem1__octets_tx_top, val_gem1__octets_tx_top); +set_reset_data( gem1__frames_tx, val_gem1__frames_tx); +set_reset_data( gem1__broadcast_frames_tx, val_gem1__broadcast_frames_tx); +set_reset_data( gem1__multi_frames_tx, val_gem1__multi_frames_tx); +set_reset_data( gem1__pause_frames_tx, val_gem1__pause_frames_tx); +set_reset_data( gem1__frames_64b_tx, val_gem1__frames_64b_tx); +set_reset_data( gem1__frames_65to127b_tx, val_gem1__frames_65to127b_tx); +set_reset_data( gem1__frames_128to255b_tx, val_gem1__frames_128to255b_tx); +set_reset_data( gem1__frames_256to511b_tx, val_gem1__frames_256to511b_tx); +set_reset_data( gem1__frames_512to1023b_tx, val_gem1__frames_512to1023b_tx); +set_reset_data( gem1__frames_1024to1518b_tx, val_gem1__frames_1024to1518b_tx); +set_reset_data( gem1__frames_gt1518b_tx, val_gem1__frames_gt1518b_tx); +set_reset_data( gem1__tx_under_runs, val_gem1__tx_under_runs); +set_reset_data( gem1__single_collisn_frames, val_gem1__single_collisn_frames); +set_reset_data( gem1__multi_collisn_frames, val_gem1__multi_collisn_frames); +set_reset_data( gem1__excessive_collisns, val_gem1__excessive_collisns); +set_reset_data( gem1__late_collisns, val_gem1__late_collisns); +set_reset_data( gem1__deferred_tx_frames, val_gem1__deferred_tx_frames); +set_reset_data( gem1__carrier_sense_errs, val_gem1__carrier_sense_errs); +set_reset_data( gem1__octets_rx_bot, val_gem1__octets_rx_bot); +set_reset_data( gem1__octets_rx_top, val_gem1__octets_rx_top); +set_reset_data( gem1__frames_rx, val_gem1__frames_rx); +set_reset_data( gem1__bdcast_fames_rx, val_gem1__bdcast_fames_rx); +set_reset_data( gem1__multi_frames_rx, val_gem1__multi_frames_rx); +set_reset_data( gem1__pause_rx, val_gem1__pause_rx); +set_reset_data( gem1__frames_64b_rx, val_gem1__frames_64b_rx); +set_reset_data( gem1__frames_65to127b_rx, val_gem1__frames_65to127b_rx); +set_reset_data( gem1__frames_128to255b_rx, val_gem1__frames_128to255b_rx); +set_reset_data( gem1__frames_256to511b_rx, val_gem1__frames_256to511b_rx); +set_reset_data( gem1__frames_512to1023b_rx, val_gem1__frames_512to1023b_rx); +set_reset_data( gem1__frames_1024to1518b_rx, val_gem1__frames_1024to1518b_rx); +set_reset_data( gem1__frames_gt1518b_rx, val_gem1__frames_gt1518b_rx); +set_reset_data( gem1__undersz_rx, val_gem1__undersz_rx); +set_reset_data( gem1__oversz_rx, val_gem1__oversz_rx); +set_reset_data( gem1__jab_rx, val_gem1__jab_rx); +set_reset_data( gem1__fcs_errors, val_gem1__fcs_errors); +set_reset_data( gem1__length_field_errors, val_gem1__length_field_errors); +set_reset_data( gem1__rx_symbol_errors, val_gem1__rx_symbol_errors); +set_reset_data( gem1__align_errors, val_gem1__align_errors); +set_reset_data( gem1__rx_resource_errors, val_gem1__rx_resource_errors); +set_reset_data( gem1__rx_overrun_errors, val_gem1__rx_overrun_errors); +set_reset_data( gem1__ip_hdr_csum_errors, val_gem1__ip_hdr_csum_errors); +set_reset_data( gem1__tcp_csum_errors, val_gem1__tcp_csum_errors); +set_reset_data( gem1__udp_csum_errors, val_gem1__udp_csum_errors); +set_reset_data( gem1__timer_strobe_s, val_gem1__timer_strobe_s); +set_reset_data( gem1__timer_strobe_ns, val_gem1__timer_strobe_ns); +set_reset_data( gem1__timer_s, val_gem1__timer_s); +set_reset_data( gem1__timer_ns, val_gem1__timer_ns); +set_reset_data( gem1__timer_adjust, val_gem1__timer_adjust); +set_reset_data( gem1__timer_incr, val_gem1__timer_incr); +set_reset_data( gem1__ptp_tx_s, val_gem1__ptp_tx_s); +set_reset_data( gem1__ptp_tx_ns, val_gem1__ptp_tx_ns); +set_reset_data( gem1__ptp_rx_s, val_gem1__ptp_rx_s); +set_reset_data( gem1__ptp_rx_ns, val_gem1__ptp_rx_ns); +set_reset_data( gem1__ptp_peer_tx_s, val_gem1__ptp_peer_tx_s); +set_reset_data( gem1__ptp_peer_tx_ns, val_gem1__ptp_peer_tx_ns); +set_reset_data( gem1__ptp_peer_rx_s, val_gem1__ptp_peer_rx_s); +set_reset_data( gem1__ptp_peer_rx_ns, val_gem1__ptp_peer_rx_ns); +set_reset_data( gem1__pcs_ctrl, val_gem1__pcs_ctrl); +set_reset_data( gem1__pcs_status, val_gem1__pcs_status); +set_reset_data( gem1__pcs_upper_phy_id, val_gem1__pcs_upper_phy_id); +set_reset_data( gem1__pcs_lower_phy_id, val_gem1__pcs_lower_phy_id); +set_reset_data( gem1__pcs_autoneg_ad, val_gem1__pcs_autoneg_ad); +set_reset_data( gem1__pcs_autoneg_ability, val_gem1__pcs_autoneg_ability); +set_reset_data( gem1__pcs_autonec_exp, val_gem1__pcs_autonec_exp); +set_reset_data( gem1__pcs_autoneg_next_pg, val_gem1__pcs_autoneg_next_pg); +set_reset_data( gem1__pcs_autoneg_pnext_pg, val_gem1__pcs_autoneg_pnext_pg); +set_reset_data( gem1__pcs_extended_status, val_gem1__pcs_extended_status); +set_reset_data( gem1__design_cfg1, val_gem1__design_cfg1); +set_reset_data( gem1__design_cfg2, val_gem1__design_cfg2); +set_reset_data( gem1__design_cfg3, val_gem1__design_cfg3); +set_reset_data( gem1__design_cfg4, val_gem1__design_cfg4); +set_reset_data( gem1__design_cfg5, val_gem1__design_cfg5); +set_reset_data( gem1__design_cfg6, val_gem1__design_cfg6); +set_reset_data( gem1__design_cfg7, val_gem1__design_cfg7); +set_reset_data( gem1__isr_pq1, val_gem1__isr_pq1); +set_reset_data( gem1__isr_pq2, val_gem1__isr_pq2); +set_reset_data( gem1__isr_pq3, val_gem1__isr_pq3); +set_reset_data( gem1__isr_pq4, val_gem1__isr_pq4); +set_reset_data( gem1__isr_pq5, val_gem1__isr_pq5); +set_reset_data( gem1__isr_pq6, val_gem1__isr_pq6); +set_reset_data( gem1__isr_pq7, val_gem1__isr_pq7); +set_reset_data( gem1__tx_qbar_q1, val_gem1__tx_qbar_q1); +set_reset_data( gem1__tx_qbar_q2, val_gem1__tx_qbar_q2); +set_reset_data( gem1__tx_qbar_q3, val_gem1__tx_qbar_q3); +set_reset_data( gem1__tx_qbar_q4, val_gem1__tx_qbar_q4); +set_reset_data( gem1__tx_qbar_q5, val_gem1__tx_qbar_q5); +set_reset_data( gem1__tx_qbar_q6, val_gem1__tx_qbar_q6); +set_reset_data( gem1__tx_qbar_q7, val_gem1__tx_qbar_q7); +set_reset_data( gem1__rx_qbar_q1, val_gem1__rx_qbar_q1); +set_reset_data( gem1__rx_qbar_q2, val_gem1__rx_qbar_q2); +set_reset_data( gem1__rx_qbar_q3, val_gem1__rx_qbar_q3); +set_reset_data( gem1__rx_qbar_q4, val_gem1__rx_qbar_q4); +set_reset_data( gem1__rx_qbar_q5, val_gem1__rx_qbar_q5); +set_reset_data( gem1__rx_qbar_q6, val_gem1__rx_qbar_q6); +set_reset_data( gem1__rx_qbar_q7, val_gem1__rx_qbar_q7); +set_reset_data( gem1__rx_bufsz_q1, val_gem1__rx_bufsz_q1); +set_reset_data( gem1__rx_bufsz_q2, val_gem1__rx_bufsz_q2); +set_reset_data( gem1__rx_bufsz_q3, val_gem1__rx_bufsz_q3); +set_reset_data( gem1__rx_bufsz_q4, val_gem1__rx_bufsz_q4); +set_reset_data( gem1__rx_bufsz_q5, val_gem1__rx_bufsz_q5); +set_reset_data( gem1__rx_bufsz_q6, val_gem1__rx_bufsz_q6); +set_reset_data( gem1__rx_bufsz_q7, val_gem1__rx_bufsz_q7); +set_reset_data( gem1__screen_t1_r0, val_gem1__screen_t1_r0); +set_reset_data( gem1__screen_t1_r1, val_gem1__screen_t1_r1); +set_reset_data( gem1__screen_t1_r2, val_gem1__screen_t1_r2); +set_reset_data( gem1__screen_t1_r3, val_gem1__screen_t1_r3); +set_reset_data( gem1__screen_t1_r4, val_gem1__screen_t1_r4); +set_reset_data( gem1__screen_t1_r5, val_gem1__screen_t1_r5); +set_reset_data( gem1__screen_t1_r6, val_gem1__screen_t1_r6); +set_reset_data( gem1__screen_t1_r7, val_gem1__screen_t1_r7); +set_reset_data( gem1__screen_t1_r8, val_gem1__screen_t1_r8); +set_reset_data( gem1__screen_t1_r9, val_gem1__screen_t1_r9); +set_reset_data( gem1__screen_t1_r10, val_gem1__screen_t1_r10); +set_reset_data( gem1__screen_t1_r11, val_gem1__screen_t1_r11); +set_reset_data( gem1__screen_t1_r12, val_gem1__screen_t1_r12); +set_reset_data( gem1__screen_t1_r13, val_gem1__screen_t1_r13); +set_reset_data( gem1__screen_t1_r14, val_gem1__screen_t1_r14); +set_reset_data( gem1__screen_t1_r15, val_gem1__screen_t1_r15); +set_reset_data( gem1__screen_t2_r0, val_gem1__screen_t2_r0); +set_reset_data( gem1__screen_t2_r1, val_gem1__screen_t2_r1); +set_reset_data( gem1__screen_t2_r2, val_gem1__screen_t2_r2); +set_reset_data( gem1__screen_t2_r3, val_gem1__screen_t2_r3); +set_reset_data( gem1__screen_t2_r4, val_gem1__screen_t2_r4); +set_reset_data( gem1__screen_t2_r5, val_gem1__screen_t2_r5); +set_reset_data( gem1__screen_t2_r6, val_gem1__screen_t2_r6); +set_reset_data( gem1__screen_t2_r7, val_gem1__screen_t2_r7); +set_reset_data( gem1__screen_t2_r8, val_gem1__screen_t2_r8); +set_reset_data( gem1__screen_t2_r9, val_gem1__screen_t2_r9); +set_reset_data( gem1__screen_t2_r10, val_gem1__screen_t2_r10); +set_reset_data( gem1__screen_t2_r11, val_gem1__screen_t2_r11); +set_reset_data( gem1__screen_t2_r12, val_gem1__screen_t2_r12); +set_reset_data( gem1__screen_t2_r13, val_gem1__screen_t2_r13); +set_reset_data( gem1__screen_t2_r14, val_gem1__screen_t2_r14); +set_reset_data( gem1__screen_t2_r15, val_gem1__screen_t2_r15); +set_reset_data( gem1__intr_en_pq1, val_gem1__intr_en_pq1); +set_reset_data( gem1__intr_en_pq2, val_gem1__intr_en_pq2); +set_reset_data( gem1__intr_en_pq3, val_gem1__intr_en_pq3); +set_reset_data( gem1__intr_en_pq4, val_gem1__intr_en_pq4); +set_reset_data( gem1__intr_en_pq5, val_gem1__intr_en_pq5); +set_reset_data( gem1__intr_en_pq6, val_gem1__intr_en_pq6); +set_reset_data( gem1__intr_en_pq7, val_gem1__intr_en_pq7); +set_reset_data( gem1__intr_dis_pq1, val_gem1__intr_dis_pq1); +set_reset_data( gem1__intr_dis_pq2, val_gem1__intr_dis_pq2); +set_reset_data( gem1__intr_dis_pq3, val_gem1__intr_dis_pq3); +set_reset_data( gem1__intr_dis_pq4, val_gem1__intr_dis_pq4); +set_reset_data( gem1__intr_dis_pq5, val_gem1__intr_dis_pq5); +set_reset_data( gem1__intr_dis_pq6, val_gem1__intr_dis_pq6); +set_reset_data( gem1__intr_dis_pq7, val_gem1__intr_dis_pq7); +set_reset_data( gem1__intr_mask_pq1, val_gem1__intr_mask_pq1); +set_reset_data( gem1__intr_mask_pq2, val_gem1__intr_mask_pq2); +set_reset_data( gem1__intr_mask_pq3, val_gem1__intr_mask_pq3); +set_reset_data( gem1__intr_mask_pq4, val_gem1__intr_mask_pq4); +set_reset_data( gem1__intr_mask_pq5, val_gem1__intr_mask_pq5); +set_reset_data( gem1__intr_mask_pq6, val_gem1__intr_mask_pq6); +set_reset_data( gem1__intr_mask_pq7, val_gem1__intr_mask_pq7); + +// ************************************************************ +// Module gpio gpio +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( gpio__MASK_DATA_0_LSW, val_gpio__MASK_DATA_0_LSW); +set_reset_data( gpio__MASK_DATA_0_MSW, val_gpio__MASK_DATA_0_MSW); +set_reset_data( gpio__MASK_DATA_1_LSW, val_gpio__MASK_DATA_1_LSW); +set_reset_data( gpio__MASK_DATA_1_MSW, val_gpio__MASK_DATA_1_MSW); +set_reset_data( gpio__MASK_DATA_2_LSW, val_gpio__MASK_DATA_2_LSW); +set_reset_data( gpio__MASK_DATA_2_MSW, val_gpio__MASK_DATA_2_MSW); +set_reset_data( gpio__MASK_DATA_3_LSW, val_gpio__MASK_DATA_3_LSW); +set_reset_data( gpio__MASK_DATA_3_MSW, val_gpio__MASK_DATA_3_MSW); +set_reset_data( gpio__DATA_0, val_gpio__DATA_0); +set_reset_data( gpio__DATA_1, val_gpio__DATA_1); +set_reset_data( gpio__DATA_2, val_gpio__DATA_2); +set_reset_data( gpio__DATA_3, val_gpio__DATA_3); +set_reset_data( gpio__DATA_0_RO, val_gpio__DATA_0_RO); +set_reset_data( gpio__DATA_1_RO, val_gpio__DATA_1_RO); +set_reset_data( gpio__DATA_2_RO, val_gpio__DATA_2_RO); +set_reset_data( gpio__DATA_3_RO, val_gpio__DATA_3_RO); +set_reset_data( gpio__BYPM_0, val_gpio__BYPM_0); +set_reset_data( gpio__DIRM_0, val_gpio__DIRM_0); +set_reset_data( gpio__OEN_0, val_gpio__OEN_0); +set_reset_data( gpio__INT_MASK_0, val_gpio__INT_MASK_0); +set_reset_data( gpio__INT_EN_0, val_gpio__INT_EN_0); +set_reset_data( gpio__INT_DIS_0, val_gpio__INT_DIS_0); +set_reset_data( gpio__INT_STAT_0, val_gpio__INT_STAT_0); +set_reset_data( gpio__INT_TYPE_0, val_gpio__INT_TYPE_0); +set_reset_data( gpio__INT_POLARITY_0, val_gpio__INT_POLARITY_0); +set_reset_data( gpio__INT_ANY_0, val_gpio__INT_ANY_0); +set_reset_data( gpio__BYPM_1, val_gpio__BYPM_1); +set_reset_data( gpio__DIRM_1, val_gpio__DIRM_1); +set_reset_data( gpio__OEN_1, val_gpio__OEN_1); +set_reset_data( gpio__INT_MASK_1, val_gpio__INT_MASK_1); +set_reset_data( gpio__INT_EN_1, val_gpio__INT_EN_1); +set_reset_data( gpio__INT_DIS_1, val_gpio__INT_DIS_1); +set_reset_data( gpio__INT_STAT_1, val_gpio__INT_STAT_1); +set_reset_data( gpio__INT_TYPE_1, val_gpio__INT_TYPE_1); +set_reset_data( gpio__INT_POLARITY_1, val_gpio__INT_POLARITY_1); +set_reset_data( gpio__INT_ANY_1, val_gpio__INT_ANY_1); +set_reset_data( gpio__BYPM_2, val_gpio__BYPM_2); +set_reset_data( gpio__DIRM_2, val_gpio__DIRM_2); +set_reset_data( gpio__OEN_2, val_gpio__OEN_2); +set_reset_data( gpio__INT_MASK_2, val_gpio__INT_MASK_2); +set_reset_data( gpio__INT_EN_2, val_gpio__INT_EN_2); +set_reset_data( gpio__INT_DIS_2, val_gpio__INT_DIS_2); +set_reset_data( gpio__INT_STAT_2, val_gpio__INT_STAT_2); +set_reset_data( gpio__INT_TYPE_2, val_gpio__INT_TYPE_2); +set_reset_data( gpio__INT_POLARITY_2, val_gpio__INT_POLARITY_2); +set_reset_data( gpio__INT_ANY_2, val_gpio__INT_ANY_2); +set_reset_data( gpio__BYPM_3, val_gpio__BYPM_3); +set_reset_data( gpio__DIRM_3, val_gpio__DIRM_3); +set_reset_data( gpio__OEN_3, val_gpio__OEN_3); +set_reset_data( gpio__INT_MASK_3, val_gpio__INT_MASK_3); +set_reset_data( gpio__INT_EN_3, val_gpio__INT_EN_3); +set_reset_data( gpio__INT_DIS_3, val_gpio__INT_DIS_3); +set_reset_data( gpio__INT_STAT_3, val_gpio__INT_STAT_3); +set_reset_data( gpio__INT_TYPE_3, val_gpio__INT_TYPE_3); +set_reset_data( gpio__INT_POLARITY_3, val_gpio__INT_POLARITY_3); +set_reset_data( gpio__INT_ANY_3, val_gpio__INT_ANY_3); + +// ************************************************************ +// Module gpv_iou_switch gpv_iou_switch +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( gpv_iou_switch__Remap, val_gpv_iou_switch__Remap); +set_reset_data( gpv_iou_switch__security2_sdio0, val_gpv_iou_switch__security2_sdio0); +set_reset_data( gpv_iou_switch__security3_sdio1, val_gpv_iou_switch__security3_sdio1); +set_reset_data( gpv_iou_switch__security4_qspi, val_gpv_iou_switch__security4_qspi); +set_reset_data( gpv_iou_switch__security5_miou, val_gpv_iou_switch__security5_miou); +set_reset_data( gpv_iou_switch__security6_apb_slaves, val_gpv_iou_switch__security6_apb_slaves); +set_reset_data( gpv_iou_switch__security7_smc, val_gpv_iou_switch__security7_smc); +set_reset_data( gpv_iou_switch__peripheral_id4, val_gpv_iou_switch__peripheral_id4); +set_reset_data( gpv_iou_switch__peripheral_id5, val_gpv_iou_switch__peripheral_id5); +set_reset_data( gpv_iou_switch__peripheral_id6, val_gpv_iou_switch__peripheral_id6); +set_reset_data( gpv_iou_switch__peripheral_id7, val_gpv_iou_switch__peripheral_id7); +set_reset_data( gpv_iou_switch__peripheral_id0, val_gpv_iou_switch__peripheral_id0); +set_reset_data( gpv_iou_switch__peripheral_id1, val_gpv_iou_switch__peripheral_id1); +set_reset_data( gpv_iou_switch__peripheral_id2, val_gpv_iou_switch__peripheral_id2); +set_reset_data( gpv_iou_switch__peripheral_id3, val_gpv_iou_switch__peripheral_id3); +set_reset_data( gpv_iou_switch__component_id0, val_gpv_iou_switch__component_id0); +set_reset_data( gpv_iou_switch__component_id1, val_gpv_iou_switch__component_id1); +set_reset_data( gpv_iou_switch__component_id2, val_gpv_iou_switch__component_id2); +set_reset_data( gpv_iou_switch__component_id3, val_gpv_iou_switch__component_id3); +set_reset_data( gpv_iou_switch__fn_mod_bm_iss_sdio0, val_gpv_iou_switch__fn_mod_bm_iss_sdio0); +set_reset_data( gpv_iou_switch__ahb_cntl_sdio0, val_gpv_iou_switch__ahb_cntl_sdio0); +set_reset_data( gpv_iou_switch__fn_mod_bm_iss_sdio1, val_gpv_iou_switch__fn_mod_bm_iss_sdio1); +set_reset_data( gpv_iou_switch__ahb_cntl_sdio1, val_gpv_iou_switch__ahb_cntl_sdio1); +set_reset_data( gpv_iou_switch__fn_mod_bm_iss_qspi, val_gpv_iou_switch__fn_mod_bm_iss_qspi); +set_reset_data( gpv_iou_switch__fn_mod_bm_iss_miou, val_gpv_iou_switch__fn_mod_bm_iss_miou); +set_reset_data( gpv_iou_switch__fn_mod_bm_iss_smc, val_gpv_iou_switch__fn_mod_bm_iss_smc); +set_reset_data( gpv_iou_switch__fn_mod_ahb_gem0, val_gpv_iou_switch__fn_mod_ahb_gem0); +set_reset_data( gpv_iou_switch__read_qos_gem0, val_gpv_iou_switch__read_qos_gem0); +set_reset_data( gpv_iou_switch__write_qos_gem0, val_gpv_iou_switch__write_qos_gem0); +set_reset_data( gpv_iou_switch__fn_mod_iss_gem0, val_gpv_iou_switch__fn_mod_iss_gem0); +set_reset_data( gpv_iou_switch__fn_mod_ahb_gem1, val_gpv_iou_switch__fn_mod_ahb_gem1); +set_reset_data( gpv_iou_switch__read_qos_gem1, val_gpv_iou_switch__read_qos_gem1); +set_reset_data( gpv_iou_switch__write_qos_gem1, val_gpv_iou_switch__write_qos_gem1); +set_reset_data( gpv_iou_switch__fn_mod_iss_gem1, val_gpv_iou_switch__fn_mod_iss_gem1); +set_reset_data( gpv_iou_switch__fn_mod_ahb_usb0, val_gpv_iou_switch__fn_mod_ahb_usb0); +set_reset_data( gpv_iou_switch__read_qos_usb0, val_gpv_iou_switch__read_qos_usb0); +set_reset_data( gpv_iou_switch__write_qos_usb0, val_gpv_iou_switch__write_qos_usb0); +set_reset_data( gpv_iou_switch__fn_mod_iss_usb0, val_gpv_iou_switch__fn_mod_iss_usb0); +set_reset_data( gpv_iou_switch__fn_mod_ahb_usb1, val_gpv_iou_switch__fn_mod_ahb_usb1); +set_reset_data( gpv_iou_switch__read_qos_usb1, val_gpv_iou_switch__read_qos_usb1); +set_reset_data( gpv_iou_switch__write_qos_usb1, val_gpv_iou_switch__write_qos_usb1); +set_reset_data( gpv_iou_switch__fn_mod_iss_usb1, val_gpv_iou_switch__fn_mod_iss_usb1); +set_reset_data( gpv_iou_switch__fn_mod_ahb_sdio0, val_gpv_iou_switch__fn_mod_ahb_sdio0); +set_reset_data( gpv_iou_switch__read_qos_sdio0, val_gpv_iou_switch__read_qos_sdio0); +set_reset_data( gpv_iou_switch__write_qos_sdio0, val_gpv_iou_switch__write_qos_sdio0); +set_reset_data( gpv_iou_switch__fn_mod_iss_sdio0, val_gpv_iou_switch__fn_mod_iss_sdio0); +set_reset_data( gpv_iou_switch__fn_mod_ahb_sdio1, val_gpv_iou_switch__fn_mod_ahb_sdio1); +set_reset_data( gpv_iou_switch__read_qos_sdio1, val_gpv_iou_switch__read_qos_sdio1); +set_reset_data( gpv_iou_switch__write_qos_sdio1, val_gpv_iou_switch__write_qos_sdio1); +set_reset_data( gpv_iou_switch__fn_mod_iss_sdio1, val_gpv_iou_switch__fn_mod_iss_sdio1); +set_reset_data( gpv_iou_switch__fn_mod_iss_siou, val_gpv_iou_switch__fn_mod_iss_siou); + +// ************************************************************ +// Module gpv_qos301_cpu qos301 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( gpv_qos301_cpu__qos_cntl, val_gpv_qos301_cpu__qos_cntl); +set_reset_data( gpv_qos301_cpu__max_ot, val_gpv_qos301_cpu__max_ot); +set_reset_data( gpv_qos301_cpu__max_comb_ot, val_gpv_qos301_cpu__max_comb_ot); +set_reset_data( gpv_qos301_cpu__aw_p, val_gpv_qos301_cpu__aw_p); +set_reset_data( gpv_qos301_cpu__aw_b, val_gpv_qos301_cpu__aw_b); +set_reset_data( gpv_qos301_cpu__aw_r, val_gpv_qos301_cpu__aw_r); +set_reset_data( gpv_qos301_cpu__ar_p, val_gpv_qos301_cpu__ar_p); +set_reset_data( gpv_qos301_cpu__ar_b, val_gpv_qos301_cpu__ar_b); +set_reset_data( gpv_qos301_cpu__ar_r, val_gpv_qos301_cpu__ar_r); + +// ************************************************************ +// Module gpv_qos301_dmac qos301 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( gpv_qos301_dmac__qos_cntl, val_gpv_qos301_dmac__qos_cntl); +set_reset_data( gpv_qos301_dmac__max_ot, val_gpv_qos301_dmac__max_ot); +set_reset_data( gpv_qos301_dmac__max_comb_ot, val_gpv_qos301_dmac__max_comb_ot); +set_reset_data( gpv_qos301_dmac__aw_p, val_gpv_qos301_dmac__aw_p); +set_reset_data( gpv_qos301_dmac__aw_b, val_gpv_qos301_dmac__aw_b); +set_reset_data( gpv_qos301_dmac__aw_r, val_gpv_qos301_dmac__aw_r); +set_reset_data( gpv_qos301_dmac__ar_p, val_gpv_qos301_dmac__ar_p); +set_reset_data( gpv_qos301_dmac__ar_b, val_gpv_qos301_dmac__ar_b); +set_reset_data( gpv_qos301_dmac__ar_r, val_gpv_qos301_dmac__ar_r); + +// ************************************************************ +// Module gpv_qos301_iou qos301 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( gpv_qos301_iou__qos_cntl, val_gpv_qos301_iou__qos_cntl); +set_reset_data( gpv_qos301_iou__max_ot, val_gpv_qos301_iou__max_ot); +set_reset_data( gpv_qos301_iou__max_comb_ot, val_gpv_qos301_iou__max_comb_ot); +set_reset_data( gpv_qos301_iou__aw_p, val_gpv_qos301_iou__aw_p); +set_reset_data( gpv_qos301_iou__aw_b, val_gpv_qos301_iou__aw_b); +set_reset_data( gpv_qos301_iou__aw_r, val_gpv_qos301_iou__aw_r); +set_reset_data( gpv_qos301_iou__ar_p, val_gpv_qos301_iou__ar_p); +set_reset_data( gpv_qos301_iou__ar_b, val_gpv_qos301_iou__ar_b); +set_reset_data( gpv_qos301_iou__ar_r, val_gpv_qos301_iou__ar_r); + +// ************************************************************ +// Module gpv_trustzone nic301_addr_region_ctrl_registers +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( gpv_trustzone__Remap, val_gpv_trustzone__Remap); +set_reset_data( gpv_trustzone__security_fssw_s0, val_gpv_trustzone__security_fssw_s0); +set_reset_data( gpv_trustzone__security_fssw_s1, val_gpv_trustzone__security_fssw_s1); +set_reset_data( gpv_trustzone__security_apb, val_gpv_trustzone__security_apb); + +// ************************************************************ +// Module i2c0 IIC +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( i2c0__Control_reg0, val_i2c0__Control_reg0); +set_reset_data( i2c0__Status_reg0, val_i2c0__Status_reg0); +set_reset_data( i2c0__I2C_address_reg0, val_i2c0__I2C_address_reg0); +set_reset_data( i2c0__I2C_data_reg0, val_i2c0__I2C_data_reg0); +set_reset_data( i2c0__Interrupt_status_reg0, val_i2c0__Interrupt_status_reg0); +set_reset_data( i2c0__Transfer_size_reg0, val_i2c0__Transfer_size_reg0); +set_reset_data( i2c0__Slave_mon_pause_reg0, val_i2c0__Slave_mon_pause_reg0); +set_reset_data( i2c0__Time_out_reg0, val_i2c0__Time_out_reg0); +set_reset_data( i2c0__Intrpt_mask_reg0, val_i2c0__Intrpt_mask_reg0); +set_reset_data( i2c0__Intrpt_enable_reg0, val_i2c0__Intrpt_enable_reg0); +set_reset_data( i2c0__Intrpt_disable_reg0, val_i2c0__Intrpt_disable_reg0); + +// ************************************************************ +// Module i2c1 IIC +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( i2c1__Control_reg0, val_i2c1__Control_reg0); +set_reset_data( i2c1__Status_reg0, val_i2c1__Status_reg0); +set_reset_data( i2c1__I2C_address_reg0, val_i2c1__I2C_address_reg0); +set_reset_data( i2c1__I2C_data_reg0, val_i2c1__I2C_data_reg0); +set_reset_data( i2c1__Interrupt_status_reg0, val_i2c1__Interrupt_status_reg0); +set_reset_data( i2c1__Transfer_size_reg0, val_i2c1__Transfer_size_reg0); +set_reset_data( i2c1__Slave_mon_pause_reg0, val_i2c1__Slave_mon_pause_reg0); +set_reset_data( i2c1__Time_out_reg0, val_i2c1__Time_out_reg0); +set_reset_data( i2c1__Intrpt_mask_reg0, val_i2c1__Intrpt_mask_reg0); +set_reset_data( i2c1__Intrpt_enable_reg0, val_i2c1__Intrpt_enable_reg0); +set_reset_data( i2c1__Intrpt_disable_reg0, val_i2c1__Intrpt_disable_reg0); + +// ************************************************************ +// Module l2cache L2Cpl310 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( l2cache__reg0_cache_id, val_l2cache__reg0_cache_id); +set_reset_data( l2cache__reg0_cache_type, val_l2cache__reg0_cache_type); +set_reset_data( l2cache__reg1_control, val_l2cache__reg1_control); +set_reset_data( l2cache__reg1_aux_control, val_l2cache__reg1_aux_control); +set_reset_data( l2cache__reg1_tag_ram_control, val_l2cache__reg1_tag_ram_control); +set_reset_data( l2cache__reg1_data_ram_control, val_l2cache__reg1_data_ram_control); +set_reset_data( l2cache__reg2_ev_counter_ctrl, val_l2cache__reg2_ev_counter_ctrl); +set_reset_data( l2cache__reg2_ev_counter1_cfg, val_l2cache__reg2_ev_counter1_cfg); +set_reset_data( l2cache__reg2_ev_counter0_cfg, val_l2cache__reg2_ev_counter0_cfg); +set_reset_data( l2cache__reg2_ev_counter1, val_l2cache__reg2_ev_counter1); +set_reset_data( l2cache__reg2_ev_counter0, val_l2cache__reg2_ev_counter0); +set_reset_data( l2cache__reg2_int_mask, val_l2cache__reg2_int_mask); +set_reset_data( l2cache__reg2_int_mask_status, val_l2cache__reg2_int_mask_status); +set_reset_data( l2cache__reg2_int_raw_status, val_l2cache__reg2_int_raw_status); +set_reset_data( l2cache__reg2_int_clear, val_l2cache__reg2_int_clear); +set_reset_data( l2cache__reg7_cache_sync, val_l2cache__reg7_cache_sync); +set_reset_data( l2cache__reg7_inv_pa, val_l2cache__reg7_inv_pa); +set_reset_data( l2cache__reg7_inv_way, val_l2cache__reg7_inv_way); +set_reset_data( l2cache__reg7_clean_pa, val_l2cache__reg7_clean_pa); +set_reset_data( l2cache__reg7_clean_index, val_l2cache__reg7_clean_index); +set_reset_data( l2cache__reg7_clean_way, val_l2cache__reg7_clean_way); +set_reset_data( l2cache__reg7_clean_inv_pa, val_l2cache__reg7_clean_inv_pa); +set_reset_data( l2cache__reg7_clean_inv_index, val_l2cache__reg7_clean_inv_index); +set_reset_data( l2cache__reg7_clean_inv_way, val_l2cache__reg7_clean_inv_way); +set_reset_data( l2cache__reg9_d_lockdown0, val_l2cache__reg9_d_lockdown0); +set_reset_data( l2cache__reg9_i_lockdown0, val_l2cache__reg9_i_lockdown0); +set_reset_data( l2cache__reg9_d_lockdown1, val_l2cache__reg9_d_lockdown1); +set_reset_data( l2cache__reg9_i_lockdown1, val_l2cache__reg9_i_lockdown1); +set_reset_data( l2cache__reg9_d_lockdown2, val_l2cache__reg9_d_lockdown2); +set_reset_data( l2cache__reg9_i_lockdown2, val_l2cache__reg9_i_lockdown2); +set_reset_data( l2cache__reg9_d_lockdown3, val_l2cache__reg9_d_lockdown3); +set_reset_data( l2cache__reg9_i_lockdown3, val_l2cache__reg9_i_lockdown3); +set_reset_data( l2cache__reg9_d_lockdown4, val_l2cache__reg9_d_lockdown4); +set_reset_data( l2cache__reg9_i_lockdown4, val_l2cache__reg9_i_lockdown4); +set_reset_data( l2cache__reg9_d_lockdown5, val_l2cache__reg9_d_lockdown5); +set_reset_data( l2cache__reg9_i_lockdown5, val_l2cache__reg9_i_lockdown5); +set_reset_data( l2cache__reg9_d_lockdown6, val_l2cache__reg9_d_lockdown6); +set_reset_data( l2cache__reg9_i_lockdown6, val_l2cache__reg9_i_lockdown6); +set_reset_data( l2cache__reg9_d_lockdown7, val_l2cache__reg9_d_lockdown7); +set_reset_data( l2cache__reg9_i_lockdown7, val_l2cache__reg9_i_lockdown7); +set_reset_data( l2cache__reg9_lock_line_en, val_l2cache__reg9_lock_line_en); +set_reset_data( l2cache__reg9_unlock_way, val_l2cache__reg9_unlock_way); +set_reset_data( l2cache__reg12_addr_filtering_start, val_l2cache__reg12_addr_filtering_start); +set_reset_data( l2cache__reg12_addr_filtering_end, val_l2cache__reg12_addr_filtering_end); +set_reset_data( l2cache__reg15_debug_ctrl, val_l2cache__reg15_debug_ctrl); +set_reset_data( l2cache__reg15_prefetch_ctrl, val_l2cache__reg15_prefetch_ctrl); +set_reset_data( l2cache__reg15_power_ctrl, val_l2cache__reg15_power_ctrl); + +// ************************************************************ +// Module mpcore mpcore +// doc version: 1.3 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( mpcore__SCU_CONTROL_REGISTER, val_mpcore__SCU_CONTROL_REGISTER); +set_reset_data( mpcore__SCU_CONFIGURATION_REGISTER, val_mpcore__SCU_CONFIGURATION_REGISTER); +set_reset_data( mpcore__SCU_CPU_Power_Status_Register, val_mpcore__SCU_CPU_Power_Status_Register); +set_reset_data( mpcore__SCU_Invalidate_All_Registers_in_Secure_State, val_mpcore__SCU_Invalidate_All_Registers_in_Secure_State); +set_reset_data( mpcore__Filtering_Start_Address_Register, val_mpcore__Filtering_Start_Address_Register); +set_reset_data( mpcore__Filtering_End_Address_Register, val_mpcore__Filtering_End_Address_Register); +set_reset_data( mpcore__SCU_Access_Control_Register_SAC, val_mpcore__SCU_Access_Control_Register_SAC); +set_reset_data( mpcore__SCU_Non_secure_Access_Control_Register, val_mpcore__SCU_Non_secure_Access_Control_Register); +set_reset_data( mpcore__ICCICR, val_mpcore__ICCICR); +set_reset_data( mpcore__ICCPMR, val_mpcore__ICCPMR); +set_reset_data( mpcore__ICCBPR, val_mpcore__ICCBPR); +set_reset_data( mpcore__ICCIAR, val_mpcore__ICCIAR); +set_reset_data( mpcore__ICCEOIR, val_mpcore__ICCEOIR); +set_reset_data( mpcore__ICCRPR, val_mpcore__ICCRPR); +set_reset_data( mpcore__ICCHPIR, val_mpcore__ICCHPIR); +set_reset_data( mpcore__ICCABPR, val_mpcore__ICCABPR); +set_reset_data( mpcore__ICCIDR, val_mpcore__ICCIDR); +set_reset_data( mpcore__Global_Timer_Counter_Register0, val_mpcore__Global_Timer_Counter_Register0); +set_reset_data( mpcore__Global_Timer_Counter_Register1, val_mpcore__Global_Timer_Counter_Register1); +set_reset_data( mpcore__Global_Timer_Control_Register, val_mpcore__Global_Timer_Control_Register); +set_reset_data( mpcore__Global_Timer_Interrupt_Status_Register, val_mpcore__Global_Timer_Interrupt_Status_Register); +set_reset_data( mpcore__Comparator_Value_Register0, val_mpcore__Comparator_Value_Register0); +set_reset_data( mpcore__Comparator_Value_Register1, val_mpcore__Comparator_Value_Register1); +set_reset_data( mpcore__Auto_increment_Register, val_mpcore__Auto_increment_Register); +set_reset_data( mpcore__Private_Timer_Load_Register, val_mpcore__Private_Timer_Load_Register); +set_reset_data( mpcore__Private_Timer_Counter_Register, val_mpcore__Private_Timer_Counter_Register); +set_reset_data( mpcore__Private_Timer_Control_Register, val_mpcore__Private_Timer_Control_Register); +set_reset_data( mpcore__Private_Timer_Interrupt_Status_Register, val_mpcore__Private_Timer_Interrupt_Status_Register); +set_reset_data( mpcore__Watchdog_Load_Register, val_mpcore__Watchdog_Load_Register); +set_reset_data( mpcore__Watchdog_Counter_Register, val_mpcore__Watchdog_Counter_Register); +set_reset_data( mpcore__Watchdog_Control_Register, val_mpcore__Watchdog_Control_Register); +set_reset_data( mpcore__Watchdog_Interrupt_Status_Register, val_mpcore__Watchdog_Interrupt_Status_Register); +set_reset_data( mpcore__Watchdog_Reset_Status_Register, val_mpcore__Watchdog_Reset_Status_Register); +set_reset_data( mpcore__Watchdog_Disable_Register, val_mpcore__Watchdog_Disable_Register); +set_reset_data( mpcore__ICDDCR, val_mpcore__ICDDCR); +set_reset_data( mpcore__ICDICTR, val_mpcore__ICDICTR); +set_reset_data( mpcore__ICDIIDR, val_mpcore__ICDIIDR); +set_reset_data( mpcore__ICDISR0, val_mpcore__ICDISR0); +set_reset_data( mpcore__ICDISR1, val_mpcore__ICDISR1); +set_reset_data( mpcore__ICDISR2, val_mpcore__ICDISR2); +set_reset_data( mpcore__ICDISER0, val_mpcore__ICDISER0); +set_reset_data( mpcore__ICDISER1, val_mpcore__ICDISER1); +set_reset_data( mpcore__ICDISER2, val_mpcore__ICDISER2); +set_reset_data( mpcore__ICDICER0, val_mpcore__ICDICER0); +set_reset_data( mpcore__ICDICER1, val_mpcore__ICDICER1); +set_reset_data( mpcore__ICDICER2, val_mpcore__ICDICER2); +set_reset_data( mpcore__ICDISPR0, val_mpcore__ICDISPR0); +set_reset_data( mpcore__ICDISPR1, val_mpcore__ICDISPR1); +set_reset_data( mpcore__ICDISPR2, val_mpcore__ICDISPR2); +set_reset_data( mpcore__ICDICPR0, val_mpcore__ICDICPR0); +set_reset_data( mpcore__ICDICPR1, val_mpcore__ICDICPR1); +set_reset_data( mpcore__ICDICPR2, val_mpcore__ICDICPR2); +set_reset_data( mpcore__ICDABR0, val_mpcore__ICDABR0); +set_reset_data( mpcore__ICDABR1, val_mpcore__ICDABR1); +set_reset_data( mpcore__ICDABR2, val_mpcore__ICDABR2); +set_reset_data( mpcore__ICDIPR0, val_mpcore__ICDIPR0); +set_reset_data( mpcore__ICDIPR1, val_mpcore__ICDIPR1); +set_reset_data( mpcore__ICDIPR2, val_mpcore__ICDIPR2); +set_reset_data( mpcore__ICDIPR3, val_mpcore__ICDIPR3); +set_reset_data( mpcore__ICDIPR4, val_mpcore__ICDIPR4); +set_reset_data( mpcore__ICDIPR5, val_mpcore__ICDIPR5); +set_reset_data( mpcore__ICDIPR6, val_mpcore__ICDIPR6); +set_reset_data( mpcore__ICDIPR7, val_mpcore__ICDIPR7); +set_reset_data( mpcore__ICDIPR8, val_mpcore__ICDIPR8); +set_reset_data( mpcore__ICDIPR9, val_mpcore__ICDIPR9); +set_reset_data( mpcore__ICDIPR10, val_mpcore__ICDIPR10); +set_reset_data( mpcore__ICDIPR11, val_mpcore__ICDIPR11); +set_reset_data( mpcore__ICDIPR12, val_mpcore__ICDIPR12); +set_reset_data( mpcore__ICDIPR13, val_mpcore__ICDIPR13); +set_reset_data( mpcore__ICDIPR14, val_mpcore__ICDIPR14); +set_reset_data( mpcore__ICDIPR15, val_mpcore__ICDIPR15); +set_reset_data( mpcore__ICDIPR16, val_mpcore__ICDIPR16); +set_reset_data( mpcore__ICDIPR17, val_mpcore__ICDIPR17); +set_reset_data( mpcore__ICDIPR18, val_mpcore__ICDIPR18); +set_reset_data( mpcore__ICDIPR19, val_mpcore__ICDIPR19); +set_reset_data( mpcore__ICDIPR20, val_mpcore__ICDIPR20); +set_reset_data( mpcore__ICDIPR21, val_mpcore__ICDIPR21); +set_reset_data( mpcore__ICDIPR22, val_mpcore__ICDIPR22); +set_reset_data( mpcore__ICDIPR23, val_mpcore__ICDIPR23); +set_reset_data( mpcore__ICDIPTR0, val_mpcore__ICDIPTR0); +set_reset_data( mpcore__ICDIPTR1, val_mpcore__ICDIPTR1); +set_reset_data( mpcore__ICDIPTR2, val_mpcore__ICDIPTR2); +set_reset_data( mpcore__ICDIPTR3, val_mpcore__ICDIPTR3); +set_reset_data( mpcore__ICDIPTR4, val_mpcore__ICDIPTR4); +set_reset_data( mpcore__ICDIPTR5, val_mpcore__ICDIPTR5); +set_reset_data( mpcore__ICDIPTR6, val_mpcore__ICDIPTR6); +set_reset_data( mpcore__ICDIPTR7, val_mpcore__ICDIPTR7); +set_reset_data( mpcore__ICDIPTR8, val_mpcore__ICDIPTR8); +set_reset_data( mpcore__ICDIPTR9, val_mpcore__ICDIPTR9); +set_reset_data( mpcore__ICDIPTR10, val_mpcore__ICDIPTR10); +set_reset_data( mpcore__ICDIPTR11, val_mpcore__ICDIPTR11); +set_reset_data( mpcore__ICDIPTR12, val_mpcore__ICDIPTR12); +set_reset_data( mpcore__ICDIPTR13, val_mpcore__ICDIPTR13); +set_reset_data( mpcore__ICDIPTR14, val_mpcore__ICDIPTR14); +set_reset_data( mpcore__ICDIPTR15, val_mpcore__ICDIPTR15); +set_reset_data( mpcore__ICDIPTR16, val_mpcore__ICDIPTR16); +set_reset_data( mpcore__ICDIPTR17, val_mpcore__ICDIPTR17); +set_reset_data( mpcore__ICDIPTR18, val_mpcore__ICDIPTR18); +set_reset_data( mpcore__ICDIPTR19, val_mpcore__ICDIPTR19); +set_reset_data( mpcore__ICDIPTR20, val_mpcore__ICDIPTR20); +set_reset_data( mpcore__ICDIPTR21, val_mpcore__ICDIPTR21); +set_reset_data( mpcore__ICDIPTR22, val_mpcore__ICDIPTR22); +set_reset_data( mpcore__ICDIPTR23, val_mpcore__ICDIPTR23); +set_reset_data( mpcore__ICDICFR0, val_mpcore__ICDICFR0); +set_reset_data( mpcore__ICDICFR1, val_mpcore__ICDICFR1); +set_reset_data( mpcore__ICDICFR2, val_mpcore__ICDICFR2); +set_reset_data( mpcore__ICDICFR3, val_mpcore__ICDICFR3); +set_reset_data( mpcore__ICDICFR4, val_mpcore__ICDICFR4); +set_reset_data( mpcore__ICDICFR5, val_mpcore__ICDICFR5); +set_reset_data( mpcore__ppi_status, val_mpcore__ppi_status); +set_reset_data( mpcore__spi_status_0, val_mpcore__spi_status_0); +set_reset_data( mpcore__spi_status_1, val_mpcore__spi_status_1); +set_reset_data( mpcore__ICDSGIR, val_mpcore__ICDSGIR); +set_reset_data( mpcore__ICPIDR4, val_mpcore__ICPIDR4); +set_reset_data( mpcore__ICPIDR5, val_mpcore__ICPIDR5); +set_reset_data( mpcore__ICPIDR6, val_mpcore__ICPIDR6); +set_reset_data( mpcore__ICPIDR7, val_mpcore__ICPIDR7); +set_reset_data( mpcore__ICPIDR0, val_mpcore__ICPIDR0); +set_reset_data( mpcore__ICPIDR1, val_mpcore__ICPIDR1); +set_reset_data( mpcore__ICPIDR2, val_mpcore__ICPIDR2); +set_reset_data( mpcore__ICPIDR3, val_mpcore__ICPIDR3); +set_reset_data( mpcore__ICCIDR0, val_mpcore__ICCIDR0); +set_reset_data( mpcore__ICCIDR1, val_mpcore__ICCIDR1); +set_reset_data( mpcore__ICCIDR2, val_mpcore__ICCIDR2); +set_reset_data( mpcore__ICCIDR3, val_mpcore__ICCIDR3); + +// ************************************************************ +// Module ocm ocm +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( ocm__OCM_PARITY_CTRL, val_ocm__OCM_PARITY_CTRL); +set_reset_data( ocm__OCM_PARITY_ERRADDRESS, val_ocm__OCM_PARITY_ERRADDRESS); +set_reset_data( ocm__OCM_IRQ_STS, val_ocm__OCM_IRQ_STS); +set_reset_data( ocm__OCM_CONTROL, val_ocm__OCM_CONTROL); + +// ************************************************************ +// Module qspi qspi +// doc version: 0.8, based on 11/01/10 Linear Quad-SPI Controller +/// Design Specification document +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( qspi__Config_reg, val_qspi__Config_reg); +set_reset_data( qspi__Intr_status_REG, val_qspi__Intr_status_REG); +set_reset_data( qspi__Intrpt_en_REG, val_qspi__Intrpt_en_REG); +set_reset_data( qspi__Intrpt_dis_REG, val_qspi__Intrpt_dis_REG); +set_reset_data( qspi__Intrpt_mask_REG, val_qspi__Intrpt_mask_REG); +set_reset_data( qspi__En_REG, val_qspi__En_REG); +set_reset_data( qspi__Delay_REG, val_qspi__Delay_REG); +set_reset_data( qspi__TXD0, val_qspi__TXD0); +set_reset_data( qspi__Rx_data_REG, val_qspi__Rx_data_REG); +set_reset_data( qspi__Slave_Idle_count_REG, val_qspi__Slave_Idle_count_REG); +set_reset_data( qspi__TX_thres_REG, val_qspi__TX_thres_REG); +set_reset_data( qspi__RX_thres_REG, val_qspi__RX_thres_REG); +set_reset_data( qspi__GPIO, val_qspi__GPIO); +set_reset_data( qspi__LPBK_DLY_ADJ, val_qspi__LPBK_DLY_ADJ); +set_reset_data( qspi__TXD1, val_qspi__TXD1); +set_reset_data( qspi__TXD2, val_qspi__TXD2); +set_reset_data( qspi__TXD3, val_qspi__TXD3); +set_reset_data( qspi__LQSPI_CFG, val_qspi__LQSPI_CFG); +set_reset_data( qspi__LQSPI_STS, val_qspi__LQSPI_STS); +set_reset_data( qspi__MOD_ID, val_qspi__MOD_ID); + +// ************************************************************ +// Module sd0 sdio +// doc version: 4.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( sd0__SDMA_system_address_register, val_sd0__SDMA_system_address_register); +set_reset_data( sd0__Block_Size_Block_Count, val_sd0__Block_Size_Block_Count); +set_reset_data( sd0__Argument, val_sd0__Argument); +set_reset_data( sd0__Transfer_Mode_Command, val_sd0__Transfer_Mode_Command); +set_reset_data( sd0__Response0, val_sd0__Response0); +set_reset_data( sd0__Response1, val_sd0__Response1); +set_reset_data( sd0__Response2, val_sd0__Response2); +set_reset_data( sd0__Response3, val_sd0__Response3); +set_reset_data( sd0__Buffer_Data_Port, val_sd0__Buffer_Data_Port); +set_reset_data( sd0__Present_State, val_sd0__Present_State); +set_reset_data( sd0__Host_control_Power_control_Block_Gap_Control_Wakeup_control, val_sd0__Host_control_Power_control_Block_Gap_Control_Wakeup_control); +set_reset_data( sd0__Clock_Control_Timeout_control_Software_reset, val_sd0__Clock_Control_Timeout_control_Software_reset); +set_reset_data( sd0__Normal_interrupt_status_Error_interrupt_status, val_sd0__Normal_interrupt_status_Error_interrupt_status); +set_reset_data( sd0__Normal_interrupt_status_enable_Error_interrupt_status_enable, val_sd0__Normal_interrupt_status_enable_Error_interrupt_status_enable); +set_reset_data( sd0__Normal_interrupt_signal_enable_Error_interrupt_signal_enable, val_sd0__Normal_interrupt_signal_enable_Error_interrupt_signal_enable); +set_reset_data( sd0__Auto_CMD12_error_status, val_sd0__Auto_CMD12_error_status); +set_reset_data( sd0__Capabilities, val_sd0__Capabilities); +set_reset_data( sd0__Maximum_current_capabilities, val_sd0__Maximum_current_capabilities); +set_reset_data( sd0__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status, val_sd0__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status); +set_reset_data( sd0__ADMA_error_status, val_sd0__ADMA_error_status); +set_reset_data( sd0__ADMA_system_address, val_sd0__ADMA_system_address); +set_reset_data( sd0__Boot_Timeout_control, val_sd0__Boot_Timeout_control); +set_reset_data( sd0__Debug_Selection, val_sd0__Debug_Selection); +set_reset_data( sd0__SPI_interrupt_support, val_sd0__SPI_interrupt_support); +set_reset_data( sd0__Slot_interrupt_status_Host_controller_version, val_sd0__Slot_interrupt_status_Host_controller_version); + +// ************************************************************ +// Module sd1 sdio +// doc version: 4.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( sd1__SDMA_system_address_register, val_sd1__SDMA_system_address_register); +set_reset_data( sd1__Block_Size_Block_Count, val_sd1__Block_Size_Block_Count); +set_reset_data( sd1__Argument, val_sd1__Argument); +set_reset_data( sd1__Transfer_Mode_Command, val_sd1__Transfer_Mode_Command); +set_reset_data( sd1__Response0, val_sd1__Response0); +set_reset_data( sd1__Response1, val_sd1__Response1); +set_reset_data( sd1__Response2, val_sd1__Response2); +set_reset_data( sd1__Response3, val_sd1__Response3); +set_reset_data( sd1__Buffer_Data_Port, val_sd1__Buffer_Data_Port); +set_reset_data( sd1__Present_State, val_sd1__Present_State); +set_reset_data( sd1__Host_control_Power_control_Block_Gap_Control_Wakeup_control, val_sd1__Host_control_Power_control_Block_Gap_Control_Wakeup_control); +set_reset_data( sd1__Clock_Control_Timeout_control_Software_reset, val_sd1__Clock_Control_Timeout_control_Software_reset); +set_reset_data( sd1__Normal_interrupt_status_Error_interrupt_status, val_sd1__Normal_interrupt_status_Error_interrupt_status); +set_reset_data( sd1__Normal_interrupt_status_enable_Error_interrupt_status_enable, val_sd1__Normal_interrupt_status_enable_Error_interrupt_status_enable); +set_reset_data( sd1__Normal_interrupt_signal_enable_Error_interrupt_signal_enable, val_sd1__Normal_interrupt_signal_enable_Error_interrupt_signal_enable); +set_reset_data( sd1__Auto_CMD12_error_status, val_sd1__Auto_CMD12_error_status); +set_reset_data( sd1__Capabilities, val_sd1__Capabilities); +set_reset_data( sd1__Maximum_current_capabilities, val_sd1__Maximum_current_capabilities); +set_reset_data( sd1__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status, val_sd1__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status); +set_reset_data( sd1__ADMA_error_status, val_sd1__ADMA_error_status); +set_reset_data( sd1__ADMA_system_address, val_sd1__ADMA_system_address); +set_reset_data( sd1__Boot_Timeout_control, val_sd1__Boot_Timeout_control); +set_reset_data( sd1__Debug_Selection, val_sd1__Debug_Selection); +set_reset_data( sd1__SPI_interrupt_support, val_sd1__SPI_interrupt_support); +set_reset_data( sd1__Slot_interrupt_status_Host_controller_version, val_sd1__Slot_interrupt_status_Host_controller_version); + +// ************************************************************ +// Module slcr slcr +// doc version: 1.3, based on 11/18/2010 SLCR_spec.doc +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( slcr__SCL, val_slcr__SCL); +set_reset_data( slcr__SLCR_LOCK, val_slcr__SLCR_LOCK); +set_reset_data( slcr__SLCR_UNLOCK, val_slcr__SLCR_UNLOCK); +set_reset_data( slcr__SLCR_LOCKSTA, val_slcr__SLCR_LOCKSTA); +set_reset_data( slcr__ARM_PLL_CTRL, val_slcr__ARM_PLL_CTRL); +set_reset_data( slcr__DDR_PLL_CTRL, val_slcr__DDR_PLL_CTRL); +set_reset_data( slcr__IO_PLL_CTRL, val_slcr__IO_PLL_CTRL); +set_reset_data( slcr__PLL_STATUS, val_slcr__PLL_STATUS); +set_reset_data( slcr__ARM_PLL_CFG, val_slcr__ARM_PLL_CFG); +set_reset_data( slcr__DDR_PLL_CFG, val_slcr__DDR_PLL_CFG); +set_reset_data( slcr__IO_PLL_CFG, val_slcr__IO_PLL_CFG); +set_reset_data( slcr__PLL_BG_CTRL, val_slcr__PLL_BG_CTRL); +set_reset_data( slcr__ARM_CLK_CTRL, val_slcr__ARM_CLK_CTRL); +set_reset_data( slcr__DDR_CLK_CTRL, val_slcr__DDR_CLK_CTRL); +set_reset_data( slcr__DCI_CLK_CTRL, val_slcr__DCI_CLK_CTRL); +set_reset_data( slcr__APER_CLK_CTRL, val_slcr__APER_CLK_CTRL); +set_reset_data( slcr__USB0_CLK_CTRL, val_slcr__USB0_CLK_CTRL); +set_reset_data( slcr__USB1_CLK_CTRL, val_slcr__USB1_CLK_CTRL); +set_reset_data( slcr__GEM0_RCLK_CTRL, val_slcr__GEM0_RCLK_CTRL); +set_reset_data( slcr__GEM1_RCLK_CTRL, val_slcr__GEM1_RCLK_CTRL); +set_reset_data( slcr__GEM0_CLK_CTRL, val_slcr__GEM0_CLK_CTRL); +set_reset_data( slcr__GEM1_CLK_CTRL, val_slcr__GEM1_CLK_CTRL); +set_reset_data( slcr__SMC_CLK_CTRL, val_slcr__SMC_CLK_CTRL); +set_reset_data( slcr__LQSPI_CLK_CTRL, val_slcr__LQSPI_CLK_CTRL); +set_reset_data( slcr__SDIO_CLK_CTRL, val_slcr__SDIO_CLK_CTRL); +set_reset_data( slcr__UART_CLK_CTRL, val_slcr__UART_CLK_CTRL); +set_reset_data( slcr__SPI_CLK_CTRL, val_slcr__SPI_CLK_CTRL); +set_reset_data( slcr__CAN_CLK_CTRL, val_slcr__CAN_CLK_CTRL); +set_reset_data( slcr__CAN_MIOCLK_CTRL, val_slcr__CAN_MIOCLK_CTRL); +set_reset_data( slcr__DBG_CLK_CTRL, val_slcr__DBG_CLK_CTRL); +set_reset_data( slcr__PCAP_CLK_CTRL, val_slcr__PCAP_CLK_CTRL); +set_reset_data( slcr__TOPSW_CLK_CTRL, val_slcr__TOPSW_CLK_CTRL); +set_reset_data( slcr__FPGA0_CLK_CTRL, val_slcr__FPGA0_CLK_CTRL); +set_reset_data( slcr__FPGA0_THR_CTRL, val_slcr__FPGA0_THR_CTRL); +set_reset_data( slcr__FPGA0_THR_CNT, val_slcr__FPGA0_THR_CNT); +set_reset_data( slcr__FPGA0_THR_STA, val_slcr__FPGA0_THR_STA); +set_reset_data( slcr__FPGA1_CLK_CTRL, val_slcr__FPGA1_CLK_CTRL); +set_reset_data( slcr__FPGA1_THR_CTRL, val_slcr__FPGA1_THR_CTRL); +set_reset_data( slcr__FPGA1_THR_CNT, val_slcr__FPGA1_THR_CNT); +set_reset_data( slcr__FPGA1_THR_STA, val_slcr__FPGA1_THR_STA); +set_reset_data( slcr__FPGA2_CLK_CTRL, val_slcr__FPGA2_CLK_CTRL); +set_reset_data( slcr__FPGA2_THR_CTRL, val_slcr__FPGA2_THR_CTRL); +set_reset_data( slcr__FPGA2_THR_CNT, val_slcr__FPGA2_THR_CNT); +set_reset_data( slcr__FPGA2_THR_STA, val_slcr__FPGA2_THR_STA); +set_reset_data( slcr__FPGA3_CLK_CTRL, val_slcr__FPGA3_CLK_CTRL); +set_reset_data( slcr__FPGA3_THR_CTRL, val_slcr__FPGA3_THR_CTRL); +set_reset_data( slcr__FPGA3_THR_CNT, val_slcr__FPGA3_THR_CNT); +set_reset_data( slcr__FPGA3_THR_STA, val_slcr__FPGA3_THR_STA); +set_reset_data( slcr__SRST_UART_CTRL, val_slcr__SRST_UART_CTRL); +set_reset_data( slcr__BANDGAP_TRIM, val_slcr__BANDGAP_TRIM); +set_reset_data( slcr__CC_TEST, val_slcr__CC_TEST); +set_reset_data( slcr__PLL_PREDIVISOR, val_slcr__PLL_PREDIVISOR); +set_reset_data( slcr__CLK_621_TRUE, val_slcr__CLK_621_TRUE); +set_reset_data( slcr__PICTURE_DBG, val_slcr__PICTURE_DBG); +set_reset_data( slcr__PICTURE_DBG_UCNT, val_slcr__PICTURE_DBG_UCNT); +set_reset_data( slcr__PICTURE_DBG_LCNT, val_slcr__PICTURE_DBG_LCNT); +set_reset_data( slcr__PSS_RST_CTRL, val_slcr__PSS_RST_CTRL); +set_reset_data( slcr__DDR_RST_CTRL, val_slcr__DDR_RST_CTRL); +set_reset_data( slcr__TOPSW_RST_CTRL, val_slcr__TOPSW_RST_CTRL); +set_reset_data( slcr__DMAC_RST_CTRL, val_slcr__DMAC_RST_CTRL); +set_reset_data( slcr__USB_RST_CTRL, val_slcr__USB_RST_CTRL); +set_reset_data( slcr__GEM_RST_CTRL, val_slcr__GEM_RST_CTRL); +set_reset_data( slcr__SDIO_RST_CTRL, val_slcr__SDIO_RST_CTRL); +set_reset_data( slcr__SPI_RST_CTRL, val_slcr__SPI_RST_CTRL); +set_reset_data( slcr__CAN_RST_CTRL, val_slcr__CAN_RST_CTRL); +set_reset_data( slcr__I2C_RST_CTRL, val_slcr__I2C_RST_CTRL); +set_reset_data( slcr__UART_RST_CTRL, val_slcr__UART_RST_CTRL); +set_reset_data( slcr__GPIO_RST_CTRL, val_slcr__GPIO_RST_CTRL); +set_reset_data( slcr__LQSPI_RST_CTRL, val_slcr__LQSPI_RST_CTRL); +set_reset_data( slcr__SMC_RST_CTRL, val_slcr__SMC_RST_CTRL); +set_reset_data( slcr__OCM_RST_CTRL, val_slcr__OCM_RST_CTRL); +set_reset_data( slcr__DEVCI_RST_CTRL, val_slcr__DEVCI_RST_CTRL); +set_reset_data( slcr__FPGA_RST_CTRL, val_slcr__FPGA_RST_CTRL); +set_reset_data( slcr__A9_CPU_RST_CTRL, val_slcr__A9_CPU_RST_CTRL); +set_reset_data( slcr__RS_AWDT_CTRL, val_slcr__RS_AWDT_CTRL); +set_reset_data( slcr__RST_REASON, val_slcr__RST_REASON); +set_reset_data( slcr__RST_REASON_CLR, val_slcr__RST_REASON_CLR); +set_reset_data( slcr__REBOOT_STATUS, val_slcr__REBOOT_STATUS); +set_reset_data( slcr__BOOT_MODE, val_slcr__BOOT_MODE); +set_reset_data( slcr__APU_CTRL, val_slcr__APU_CTRL); +set_reset_data( slcr__WDT_CLK_SEL, val_slcr__WDT_CLK_SEL); +set_reset_data( slcr__TZ_OCM_RAM0, val_slcr__TZ_OCM_RAM0); +set_reset_data( slcr__TZ_OCM_RAM1, val_slcr__TZ_OCM_RAM1); +set_reset_data( slcr__TZ_OCM_ROM, val_slcr__TZ_OCM_ROM); +set_reset_data( slcr__TZ_DDR_RAM, val_slcr__TZ_DDR_RAM); +set_reset_data( slcr__TZ_DMA_NS, val_slcr__TZ_DMA_NS); +set_reset_data( slcr__TZ_DMA_IRQ_NS, val_slcr__TZ_DMA_IRQ_NS); +set_reset_data( slcr__TZ_DMA_PERIPH_NS, val_slcr__TZ_DMA_PERIPH_NS); +set_reset_data( slcr__TZ_GEM, val_slcr__TZ_GEM); +set_reset_data( slcr__TZ_SDIO, val_slcr__TZ_SDIO); +set_reset_data( slcr__TZ_USB, val_slcr__TZ_USB); +set_reset_data( slcr__TZ_FPGA_M, val_slcr__TZ_FPGA_M); +set_reset_data( slcr__TZ_FPGA_AFI, val_slcr__TZ_FPGA_AFI); +set_reset_data( slcr__DBG_CTRL, val_slcr__DBG_CTRL); +set_reset_data( slcr__PSS_IDCODE, val_slcr__PSS_IDCODE); +set_reset_data( slcr__DDR_URGENT, val_slcr__DDR_URGENT); +set_reset_data( slcr__DDR_CAL_START, val_slcr__DDR_CAL_START); +set_reset_data( slcr__DDR_REF_START, val_slcr__DDR_REF_START); +set_reset_data( slcr__DDR_CMD_STA, val_slcr__DDR_CMD_STA); +set_reset_data( slcr__DDR_URGENT_SEL, val_slcr__DDR_URGENT_SEL); +set_reset_data( slcr__DDR_DFI_STATUS, val_slcr__DDR_DFI_STATUS); +set_reset_data( slcr__MIO_PIN_00, val_slcr__MIO_PIN_00); +set_reset_data( slcr__MIO_PIN_01, val_slcr__MIO_PIN_01); +set_reset_data( slcr__MIO_PIN_02, val_slcr__MIO_PIN_02); +set_reset_data( slcr__MIO_PIN_03, val_slcr__MIO_PIN_03); +set_reset_data( slcr__MIO_PIN_04, val_slcr__MIO_PIN_04); +set_reset_data( slcr__MIO_PIN_05, val_slcr__MIO_PIN_05); +set_reset_data( slcr__MIO_PIN_06, val_slcr__MIO_PIN_06); +set_reset_data( slcr__MIO_PIN_07, val_slcr__MIO_PIN_07); +set_reset_data( slcr__MIO_PIN_08, val_slcr__MIO_PIN_08); +set_reset_data( slcr__MIO_PIN_09, val_slcr__MIO_PIN_09); +set_reset_data( slcr__MIO_PIN_10, val_slcr__MIO_PIN_10); +set_reset_data( slcr__MIO_PIN_11, val_slcr__MIO_PIN_11); +set_reset_data( slcr__MIO_PIN_12, val_slcr__MIO_PIN_12); +set_reset_data( slcr__MIO_PIN_13, val_slcr__MIO_PIN_13); +set_reset_data( slcr__MIO_PIN_14, val_slcr__MIO_PIN_14); +set_reset_data( slcr__MIO_PIN_15, val_slcr__MIO_PIN_15); +set_reset_data( slcr__MIO_PIN_16, val_slcr__MIO_PIN_16); +set_reset_data( slcr__MIO_PIN_17, val_slcr__MIO_PIN_17); +set_reset_data( slcr__MIO_PIN_18, val_slcr__MIO_PIN_18); +set_reset_data( slcr__MIO_PIN_19, val_slcr__MIO_PIN_19); +set_reset_data( slcr__MIO_PIN_20, val_slcr__MIO_PIN_20); +set_reset_data( slcr__MIO_PIN_21, val_slcr__MIO_PIN_21); +set_reset_data( slcr__MIO_PIN_22, val_slcr__MIO_PIN_22); +set_reset_data( slcr__MIO_PIN_23, val_slcr__MIO_PIN_23); +set_reset_data( slcr__MIO_PIN_24, val_slcr__MIO_PIN_24); +set_reset_data( slcr__MIO_PIN_25, val_slcr__MIO_PIN_25); +set_reset_data( slcr__MIO_PIN_26, val_slcr__MIO_PIN_26); +set_reset_data( slcr__MIO_PIN_27, val_slcr__MIO_PIN_27); +set_reset_data( slcr__MIO_PIN_28, val_slcr__MIO_PIN_28); +set_reset_data( slcr__MIO_PIN_29, val_slcr__MIO_PIN_29); +set_reset_data( slcr__MIO_PIN_30, val_slcr__MIO_PIN_30); +set_reset_data( slcr__MIO_PIN_31, val_slcr__MIO_PIN_31); +set_reset_data( slcr__MIO_PIN_32, val_slcr__MIO_PIN_32); +set_reset_data( slcr__MIO_PIN_33, val_slcr__MIO_PIN_33); +set_reset_data( slcr__MIO_PIN_34, val_slcr__MIO_PIN_34); +set_reset_data( slcr__MIO_PIN_35, val_slcr__MIO_PIN_35); +set_reset_data( slcr__MIO_PIN_36, val_slcr__MIO_PIN_36); +set_reset_data( slcr__MIO_PIN_37, val_slcr__MIO_PIN_37); +set_reset_data( slcr__MIO_PIN_38, val_slcr__MIO_PIN_38); +set_reset_data( slcr__MIO_PIN_39, val_slcr__MIO_PIN_39); +set_reset_data( slcr__MIO_PIN_40, val_slcr__MIO_PIN_40); +set_reset_data( slcr__MIO_PIN_41, val_slcr__MIO_PIN_41); +set_reset_data( slcr__MIO_PIN_42, val_slcr__MIO_PIN_42); +set_reset_data( slcr__MIO_PIN_43, val_slcr__MIO_PIN_43); +set_reset_data( slcr__MIO_PIN_44, val_slcr__MIO_PIN_44); +set_reset_data( slcr__MIO_PIN_45, val_slcr__MIO_PIN_45); +set_reset_data( slcr__MIO_PIN_46, val_slcr__MIO_PIN_46); +set_reset_data( slcr__MIO_PIN_47, val_slcr__MIO_PIN_47); +set_reset_data( slcr__MIO_PIN_48, val_slcr__MIO_PIN_48); +set_reset_data( slcr__MIO_PIN_49, val_slcr__MIO_PIN_49); +set_reset_data( slcr__MIO_PIN_50, val_slcr__MIO_PIN_50); +set_reset_data( slcr__MIO_PIN_51, val_slcr__MIO_PIN_51); +set_reset_data( slcr__MIO_PIN_52, val_slcr__MIO_PIN_52); +set_reset_data( slcr__MIO_PIN_53, val_slcr__MIO_PIN_53); +set_reset_data( slcr__MIO_FMIO_GEM_SEL, val_slcr__MIO_FMIO_GEM_SEL); +set_reset_data( slcr__MIO_LOOPBACK, val_slcr__MIO_LOOPBACK); +set_reset_data( slcr__MIO_MST_TRI0, val_slcr__MIO_MST_TRI0); +set_reset_data( slcr__MIO_MST_TRI1, val_slcr__MIO_MST_TRI1); +set_reset_data( slcr__SD0_WP_CD_SEL, val_slcr__SD0_WP_CD_SEL); +set_reset_data( slcr__SD1_WP_CD_SEL, val_slcr__SD1_WP_CD_SEL); +set_reset_data( slcr__LVL_SHFTR_EN, val_slcr__LVL_SHFTR_EN); +set_reset_data( slcr__OCM_CFG, val_slcr__OCM_CFG); +set_reset_data( slcr__CPU0_RAM0, val_slcr__CPU0_RAM0); +set_reset_data( slcr__CPU0_RAM1, val_slcr__CPU0_RAM1); +set_reset_data( slcr__CPU0_RAM2, val_slcr__CPU0_RAM2); +set_reset_data( slcr__CPU1_RAM0, val_slcr__CPU1_RAM0); +set_reset_data( slcr__CPU1_RAM1, val_slcr__CPU1_RAM1); +set_reset_data( slcr__CPU1_RAM2, val_slcr__CPU1_RAM2); +set_reset_data( slcr__SCU_RAM, val_slcr__SCU_RAM); +set_reset_data( slcr__L2C_RAM, val_slcr__L2C_RAM); +set_reset_data( slcr__IOU_RAM_GEM01, val_slcr__IOU_RAM_GEM01); +set_reset_data( slcr__IOU_RAM_USB01, val_slcr__IOU_RAM_USB01); +set_reset_data( slcr__IOU_RAM_SDIO0, val_slcr__IOU_RAM_SDIO0); +set_reset_data( slcr__IOU_RAM_SDIO1, val_slcr__IOU_RAM_SDIO1); +set_reset_data( slcr__IOU_RAM_CAN0, val_slcr__IOU_RAM_CAN0); +set_reset_data( slcr__IOU_RAM_CAN1, val_slcr__IOU_RAM_CAN1); +set_reset_data( slcr__IOU_RAM_LQSPI, val_slcr__IOU_RAM_LQSPI); +set_reset_data( slcr__DMAC_RAM, val_slcr__DMAC_RAM); +set_reset_data( slcr__AFI0_RAM0, val_slcr__AFI0_RAM0); +set_reset_data( slcr__AFI0_RAM1, val_slcr__AFI0_RAM1); +set_reset_data( slcr__AFI0_RAM2, val_slcr__AFI0_RAM2); +set_reset_data( slcr__AFI1_RAM0, val_slcr__AFI1_RAM0); +set_reset_data( slcr__AFI1_RAM1, val_slcr__AFI1_RAM1); +set_reset_data( slcr__AFI1_RAM2, val_slcr__AFI1_RAM2); +set_reset_data( slcr__AFI2_RAM0, val_slcr__AFI2_RAM0); +set_reset_data( slcr__AFI2_RAM1, val_slcr__AFI2_RAM1); +set_reset_data( slcr__AFI2_RAM2, val_slcr__AFI2_RAM2); +set_reset_data( slcr__AFI3_RAM0, val_slcr__AFI3_RAM0); +set_reset_data( slcr__AFI3_RAM1, val_slcr__AFI3_RAM1); +set_reset_data( slcr__AFI3_RAM2, val_slcr__AFI3_RAM2); +set_reset_data( slcr__OCM_RAM, val_slcr__OCM_RAM); +set_reset_data( slcr__OCM_ROM0, val_slcr__OCM_ROM0); +set_reset_data( slcr__OCM_ROM1, val_slcr__OCM_ROM1); +set_reset_data( slcr__DEVCI_RAM, val_slcr__DEVCI_RAM); +set_reset_data( slcr__CSG_RAM, val_slcr__CSG_RAM); +set_reset_data( slcr__GPIOB_CTRL, val_slcr__GPIOB_CTRL); +set_reset_data( slcr__GPIOB_CFG_CMOS18, val_slcr__GPIOB_CFG_CMOS18); +set_reset_data( slcr__GPIOB_CFG_CMOS25, val_slcr__GPIOB_CFG_CMOS25); +set_reset_data( slcr__GPIOB_CFG_CMOS33, val_slcr__GPIOB_CFG_CMOS33); +set_reset_data( slcr__GPIOB_CFG_LVTTL, val_slcr__GPIOB_CFG_LVTTL); +set_reset_data( slcr__GPIOB_CFG_HSTL, val_slcr__GPIOB_CFG_HSTL); +set_reset_data( slcr__GPIOB_DRVR_BIAS_CTRL, val_slcr__GPIOB_DRVR_BIAS_CTRL); +set_reset_data( slcr__DDRIOB_ADDR0, val_slcr__DDRIOB_ADDR0); +set_reset_data( slcr__DDRIOB_ADDR1, val_slcr__DDRIOB_ADDR1); +set_reset_data( slcr__DDRIOB_DATA0, val_slcr__DDRIOB_DATA0); +set_reset_data( slcr__DDRIOB_DATA1, val_slcr__DDRIOB_DATA1); +set_reset_data( slcr__DDRIOB_DIFF0, val_slcr__DDRIOB_DIFF0); +set_reset_data( slcr__DDRIOB_DIFF1, val_slcr__DDRIOB_DIFF1); +set_reset_data( slcr__DDRIOB_CLOCK, val_slcr__DDRIOB_CLOCK); +set_reset_data( slcr__DDRIOB_DRIVE_SLEW_ADDR, val_slcr__DDRIOB_DRIVE_SLEW_ADDR); +set_reset_data( slcr__DDRIOB_DRIVE_SLEW_DATA, val_slcr__DDRIOB_DRIVE_SLEW_DATA); +set_reset_data( slcr__DDRIOB_DRIVE_SLEW_DIFF, val_slcr__DDRIOB_DRIVE_SLEW_DIFF); +set_reset_data( slcr__DDRIOB_DRIVE_SLEW_CLOCK, val_slcr__DDRIOB_DRIVE_SLEW_CLOCK); +set_reset_data( slcr__DDRIOB_DDR_CTRL, val_slcr__DDRIOB_DDR_CTRL); +set_reset_data( slcr__DDRIOB_DCI_CTRL, val_slcr__DDRIOB_DCI_CTRL); +set_reset_data( slcr__DDRIOB_DCI_STATUS, val_slcr__DDRIOB_DCI_STATUS); + +// ************************************************************ +// Module smcc pl353 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( smcc__memc_status, val_smcc__memc_status); +set_reset_data( smcc__memif_cfg, val_smcc__memif_cfg); +set_reset_data( smcc__memc_cfg_set, val_smcc__memc_cfg_set); +set_reset_data( smcc__memc_cfg_clr, val_smcc__memc_cfg_clr); +set_reset_data( smcc__direct_cmd, val_smcc__direct_cmd); +set_reset_data( smcc__set_cycles, val_smcc__set_cycles); +set_reset_data( smcc__set_opmode, val_smcc__set_opmode); +set_reset_data( smcc__refresh_period_0, val_smcc__refresh_period_0); +set_reset_data( smcc__refresh_period_1, val_smcc__refresh_period_1); +set_reset_data( smcc__sram_cycles0_0, val_smcc__sram_cycles0_0); +set_reset_data( smcc__opmode0_0, val_smcc__opmode0_0); +set_reset_data( smcc__sram_cycles0_1, val_smcc__sram_cycles0_1); +set_reset_data( smcc__opmode0_1, val_smcc__opmode0_1); +set_reset_data( smcc__nand_cycles1_0, val_smcc__nand_cycles1_0); +set_reset_data( smcc__opmode1_0, val_smcc__opmode1_0); +set_reset_data( smcc__user_status, val_smcc__user_status); +set_reset_data( smcc__user_config, val_smcc__user_config); +set_reset_data( smcc__ecc_status_0, val_smcc__ecc_status_0); +set_reset_data( smcc__ecc_memcfg_0, val_smcc__ecc_memcfg_0); +set_reset_data( smcc__ecc_memcommand1_0, val_smcc__ecc_memcommand1_0); +set_reset_data( smcc__ecc_memcommand2_0, val_smcc__ecc_memcommand2_0); +set_reset_data( smcc__ecc_addr0_0, val_smcc__ecc_addr0_0); +set_reset_data( smcc__ecc_addr1_0, val_smcc__ecc_addr1_0); +set_reset_data( smcc__ecc_value0_0, val_smcc__ecc_value0_0); +set_reset_data( smcc__ecc_value1_0, val_smcc__ecc_value1_0); +set_reset_data( smcc__ecc_value2_0, val_smcc__ecc_value2_0); +set_reset_data( smcc__ecc_value3_0, val_smcc__ecc_value3_0); +set_reset_data( smcc__ecc_status_1, val_smcc__ecc_status_1); +set_reset_data( smcc__ecc_memcfg_1, val_smcc__ecc_memcfg_1); +set_reset_data( smcc__ecc_memcommand1_1, val_smcc__ecc_memcommand1_1); +set_reset_data( smcc__ecc_memcommand2_1, val_smcc__ecc_memcommand2_1); +set_reset_data( smcc__ecc_addr0_1, val_smcc__ecc_addr0_1); +set_reset_data( smcc__ecc_addr1_1, val_smcc__ecc_addr1_1); +set_reset_data( smcc__ecc_value0_1, val_smcc__ecc_value0_1); +set_reset_data( smcc__ecc_value1_1, val_smcc__ecc_value1_1); +set_reset_data( smcc__ecc_value2_1, val_smcc__ecc_value2_1); +set_reset_data( smcc__ecc_value3_1, val_smcc__ecc_value3_1); +set_reset_data( smcc__integration_test, val_smcc__integration_test); +set_reset_data( smcc__periph_id_0, val_smcc__periph_id_0); +set_reset_data( smcc__periph_id_1, val_smcc__periph_id_1); +set_reset_data( smcc__periph_id_2, val_smcc__periph_id_2); +set_reset_data( smcc__periph_id_3, val_smcc__periph_id_3); +set_reset_data( smcc__pcell_id_0, val_smcc__pcell_id_0); +set_reset_data( smcc__pcell_id_1, val_smcc__pcell_id_1); +set_reset_data( smcc__pcell_id_2, val_smcc__pcell_id_2); +set_reset_data( smcc__pcell_id_3, val_smcc__pcell_id_3); + +// ************************************************************ +// Module spi0 SPI +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( spi0__Config_reg0, val_spi0__Config_reg0); +set_reset_data( spi0__Intr_status_reg0, val_spi0__Intr_status_reg0); +set_reset_data( spi0__Intrpt_en_reg0, val_spi0__Intrpt_en_reg0); +set_reset_data( spi0__Intrpt_dis_reg0, val_spi0__Intrpt_dis_reg0); +set_reset_data( spi0__Intrpt_mask_reg0, val_spi0__Intrpt_mask_reg0); +set_reset_data( spi0__En_reg0, val_spi0__En_reg0); +set_reset_data( spi0__Delay_reg0, val_spi0__Delay_reg0); +set_reset_data( spi0__Tx_data_reg0, val_spi0__Tx_data_reg0); +set_reset_data( spi0__Rx_data_reg0, val_spi0__Rx_data_reg0); +set_reset_data( spi0__Slave_Idle_count_reg0, val_spi0__Slave_Idle_count_reg0); +set_reset_data( spi0__TX_thres_reg0, val_spi0__TX_thres_reg0); +set_reset_data( spi0__RX_thres_reg0, val_spi0__RX_thres_reg0); +set_reset_data( spi0__Mod_id_reg0, val_spi0__Mod_id_reg0); + +// ************************************************************ +// Module spi1 SPI +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( spi1__Config_reg0, val_spi1__Config_reg0); +set_reset_data( spi1__Intr_status_reg0, val_spi1__Intr_status_reg0); +set_reset_data( spi1__Intrpt_en_reg0, val_spi1__Intrpt_en_reg0); +set_reset_data( spi1__Intrpt_dis_reg0, val_spi1__Intrpt_dis_reg0); +set_reset_data( spi1__Intrpt_mask_reg0, val_spi1__Intrpt_mask_reg0); +set_reset_data( spi1__En_reg0, val_spi1__En_reg0); +set_reset_data( spi1__Delay_reg0, val_spi1__Delay_reg0); +set_reset_data( spi1__Tx_data_reg0, val_spi1__Tx_data_reg0); +set_reset_data( spi1__Rx_data_reg0, val_spi1__Rx_data_reg0); +set_reset_data( spi1__Slave_Idle_count_reg0, val_spi1__Slave_Idle_count_reg0); +set_reset_data( spi1__TX_thres_reg0, val_spi1__TX_thres_reg0); +set_reset_data( spi1__RX_thres_reg0, val_spi1__RX_thres_reg0); +set_reset_data( spi1__Mod_id_reg0, val_spi1__Mod_id_reg0); + +// ************************************************************ +// Module swdt swdt +// doc version: 2.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( swdt__MODE, val_swdt__MODE); +set_reset_data( swdt__CONTROL, val_swdt__CONTROL); +set_reset_data( swdt__RESTART, val_swdt__RESTART); +set_reset_data( swdt__STATUS, val_swdt__STATUS); + +// ************************************************************ +// Module ttc0 ttc +// doc version: 2.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( ttc0__Clock_Control_1, val_ttc0__Clock_Control_1); +set_reset_data( ttc0__Clock_Control_2, val_ttc0__Clock_Control_2); +set_reset_data( ttc0__Clock_Control_3, val_ttc0__Clock_Control_3); +set_reset_data( ttc0__Counter_Control_1, val_ttc0__Counter_Control_1); +set_reset_data( ttc0__Counter_Control_2, val_ttc0__Counter_Control_2); +set_reset_data( ttc0__Counter_Control_3, val_ttc0__Counter_Control_3); +set_reset_data( ttc0__Counter_Value_1, val_ttc0__Counter_Value_1); +set_reset_data( ttc0__Counter_Value_2, val_ttc0__Counter_Value_2); +set_reset_data( ttc0__Counter_Value_3, val_ttc0__Counter_Value_3); +set_reset_data( ttc0__Interval_Counter_1, val_ttc0__Interval_Counter_1); +set_reset_data( ttc0__Interval_Counter_2, val_ttc0__Interval_Counter_2); +set_reset_data( ttc0__Interval_Counter_3, val_ttc0__Interval_Counter_3); +set_reset_data( ttc0__Match_1_Counter_1, val_ttc0__Match_1_Counter_1); +set_reset_data( ttc0__Match_1_Counter_2, val_ttc0__Match_1_Counter_2); +set_reset_data( ttc0__Match_1_Counter_3, val_ttc0__Match_1_Counter_3); +set_reset_data( ttc0__Match_2_Counter_1, val_ttc0__Match_2_Counter_1); +set_reset_data( ttc0__Match_2_Counter_2, val_ttc0__Match_2_Counter_2); +set_reset_data( ttc0__Match_2_Counter_3, val_ttc0__Match_2_Counter_3); +set_reset_data( ttc0__Match_3_Counter_1, val_ttc0__Match_3_Counter_1); +set_reset_data( ttc0__Match_3_Counter_2, val_ttc0__Match_3_Counter_2); +set_reset_data( ttc0__Match_3_Counter_3, val_ttc0__Match_3_Counter_3); +set_reset_data( ttc0__Interrupt_Register_1, val_ttc0__Interrupt_Register_1); +set_reset_data( ttc0__Interrupt_Register_2, val_ttc0__Interrupt_Register_2); +set_reset_data( ttc0__Interrupt_Register_3, val_ttc0__Interrupt_Register_3); +set_reset_data( ttc0__Interrupt_Enable_1, val_ttc0__Interrupt_Enable_1); +set_reset_data( ttc0__Interrupt_Enable_2, val_ttc0__Interrupt_Enable_2); +set_reset_data( ttc0__Interrupt_Enable_3, val_ttc0__Interrupt_Enable_3); +set_reset_data( ttc0__Event_Control_Timer_1, val_ttc0__Event_Control_Timer_1); +set_reset_data( ttc0__Event_Control_Timer_2, val_ttc0__Event_Control_Timer_2); +set_reset_data( ttc0__Event_Control_Timer_3, val_ttc0__Event_Control_Timer_3); +set_reset_data( ttc0__Event_Register_1, val_ttc0__Event_Register_1); +set_reset_data( ttc0__Event_Register_2, val_ttc0__Event_Register_2); +set_reset_data( ttc0__Event_Register_3, val_ttc0__Event_Register_3); + +// ************************************************************ +// Module ttc1 ttc +// doc version: 2.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( ttc1__Clock_Control_1, val_ttc1__Clock_Control_1); +set_reset_data( ttc1__Clock_Control_2, val_ttc1__Clock_Control_2); +set_reset_data( ttc1__Clock_Control_3, val_ttc1__Clock_Control_3); +set_reset_data( ttc1__Counter_Control_1, val_ttc1__Counter_Control_1); +set_reset_data( ttc1__Counter_Control_2, val_ttc1__Counter_Control_2); +set_reset_data( ttc1__Counter_Control_3, val_ttc1__Counter_Control_3); +set_reset_data( ttc1__Counter_Value_1, val_ttc1__Counter_Value_1); +set_reset_data( ttc1__Counter_Value_2, val_ttc1__Counter_Value_2); +set_reset_data( ttc1__Counter_Value_3, val_ttc1__Counter_Value_3); +set_reset_data( ttc1__Interval_Counter_1, val_ttc1__Interval_Counter_1); +set_reset_data( ttc1__Interval_Counter_2, val_ttc1__Interval_Counter_2); +set_reset_data( ttc1__Interval_Counter_3, val_ttc1__Interval_Counter_3); +set_reset_data( ttc1__Match_1_Counter_1, val_ttc1__Match_1_Counter_1); +set_reset_data( ttc1__Match_1_Counter_2, val_ttc1__Match_1_Counter_2); +set_reset_data( ttc1__Match_1_Counter_3, val_ttc1__Match_1_Counter_3); +set_reset_data( ttc1__Match_2_Counter_1, val_ttc1__Match_2_Counter_1); +set_reset_data( ttc1__Match_2_Counter_2, val_ttc1__Match_2_Counter_2); +set_reset_data( ttc1__Match_2_Counter_3, val_ttc1__Match_2_Counter_3); +set_reset_data( ttc1__Match_3_Counter_1, val_ttc1__Match_3_Counter_1); +set_reset_data( ttc1__Match_3_Counter_2, val_ttc1__Match_3_Counter_2); +set_reset_data( ttc1__Match_3_Counter_3, val_ttc1__Match_3_Counter_3); +set_reset_data( ttc1__Interrupt_Register_1, val_ttc1__Interrupt_Register_1); +set_reset_data( ttc1__Interrupt_Register_2, val_ttc1__Interrupt_Register_2); +set_reset_data( ttc1__Interrupt_Register_3, val_ttc1__Interrupt_Register_3); +set_reset_data( ttc1__Interrupt_Enable_1, val_ttc1__Interrupt_Enable_1); +set_reset_data( ttc1__Interrupt_Enable_2, val_ttc1__Interrupt_Enable_2); +set_reset_data( ttc1__Interrupt_Enable_3, val_ttc1__Interrupt_Enable_3); +set_reset_data( ttc1__Event_Control_Timer_1, val_ttc1__Event_Control_Timer_1); +set_reset_data( ttc1__Event_Control_Timer_2, val_ttc1__Event_Control_Timer_2); +set_reset_data( ttc1__Event_Control_Timer_3, val_ttc1__Event_Control_Timer_3); +set_reset_data( ttc1__Event_Register_1, val_ttc1__Event_Register_1); +set_reset_data( ttc1__Event_Register_2, val_ttc1__Event_Register_2); +set_reset_data( ttc1__Event_Register_3, val_ttc1__Event_Register_3); + +// ************************************************************ +// Module uart0 UART +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( uart0__Control_reg0, val_uart0__Control_reg0); +set_reset_data( uart0__mode_reg0, val_uart0__mode_reg0); +set_reset_data( uart0__Intrpt_en_reg0, val_uart0__Intrpt_en_reg0); +set_reset_data( uart0__Intrpt_dis_reg0, val_uart0__Intrpt_dis_reg0); +set_reset_data( uart0__Intrpt_mask_reg0, val_uart0__Intrpt_mask_reg0); +set_reset_data( uart0__Chnl_int_sts_reg0, val_uart0__Chnl_int_sts_reg0); +set_reset_data( uart0__Baud_rate_gen_reg0, val_uart0__Baud_rate_gen_reg0); +set_reset_data( uart0__Rcvr_timeout_reg0, val_uart0__Rcvr_timeout_reg0); +set_reset_data( uart0__Rcvr_FIFO_trigger_level0, val_uart0__Rcvr_FIFO_trigger_level0); +set_reset_data( uart0__Modem_ctrl_reg0, val_uart0__Modem_ctrl_reg0); +set_reset_data( uart0__Modem_sts_reg0, val_uart0__Modem_sts_reg0); +set_reset_data( uart0__Channel_sts_reg0, val_uart0__Channel_sts_reg0); +set_reset_data( uart0__TX_RX_FIFO0, val_uart0__TX_RX_FIFO0); +set_reset_data( uart0__Baud_rate_divider_reg0, val_uart0__Baud_rate_divider_reg0); +set_reset_data( uart0__Flow_delay_reg0, val_uart0__Flow_delay_reg0); +set_reset_data( uart0__IR_min_rcv_pulse_wdth0, val_uart0__IR_min_rcv_pulse_wdth0); +set_reset_data( uart0__IR_transmitted_pulse_wdth0, val_uart0__IR_transmitted_pulse_wdth0); +set_reset_data( uart0__Tx_FIFO_trigger_level0, val_uart0__Tx_FIFO_trigger_level0); + +// ************************************************************ +// Module uart1 UART +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( uart1__Control_reg0, val_uart1__Control_reg0); +set_reset_data( uart1__mode_reg0, val_uart1__mode_reg0); +set_reset_data( uart1__Intrpt_en_reg0, val_uart1__Intrpt_en_reg0); +set_reset_data( uart1__Intrpt_dis_reg0, val_uart1__Intrpt_dis_reg0); +set_reset_data( uart1__Intrpt_mask_reg0, val_uart1__Intrpt_mask_reg0); +set_reset_data( uart1__Chnl_int_sts_reg0, val_uart1__Chnl_int_sts_reg0); +set_reset_data( uart1__Baud_rate_gen_reg0, val_uart1__Baud_rate_gen_reg0); +set_reset_data( uart1__Rcvr_timeout_reg0, val_uart1__Rcvr_timeout_reg0); +set_reset_data( uart1__Rcvr_FIFO_trigger_level0, val_uart1__Rcvr_FIFO_trigger_level0); +set_reset_data( uart1__Modem_ctrl_reg0, val_uart1__Modem_ctrl_reg0); +set_reset_data( uart1__Modem_sts_reg0, val_uart1__Modem_sts_reg0); +set_reset_data( uart1__Channel_sts_reg0, val_uart1__Channel_sts_reg0); +set_reset_data( uart1__TX_RX_FIFO0, val_uart1__TX_RX_FIFO0); +set_reset_data( uart1__Baud_rate_divider_reg0, val_uart1__Baud_rate_divider_reg0); +set_reset_data( uart1__Flow_delay_reg0, val_uart1__Flow_delay_reg0); +set_reset_data( uart1__IR_min_rcv_pulse_wdth0, val_uart1__IR_min_rcv_pulse_wdth0); +set_reset_data( uart1__IR_transmitted_pulse_wdth0, val_uart1__IR_transmitted_pulse_wdth0); +set_reset_data( uart1__Tx_FIFO_trigger_level0, val_uart1__Tx_FIFO_trigger_level0); + +// ************************************************************ +// Module usb0 usb +// doc version: 1.3 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( usb0__ID, val_usb0__ID); +set_reset_data( usb0__HWGENERAL, val_usb0__HWGENERAL); +set_reset_data( usb0__HWHOST, val_usb0__HWHOST); +set_reset_data( usb0__HWDEVICE, val_usb0__HWDEVICE); +set_reset_data( usb0__HWTXBUF, val_usb0__HWTXBUF); +set_reset_data( usb0__HWRXBUF, val_usb0__HWRXBUF); +set_reset_data( usb0__GPTIMER0LD, val_usb0__GPTIMER0LD); +set_reset_data( usb0__GPTIMER0CTRL, val_usb0__GPTIMER0CTRL); +set_reset_data( usb0__GPTIMER1LD, val_usb0__GPTIMER1LD); +set_reset_data( usb0__GPTIMER1CTRL, val_usb0__GPTIMER1CTRL); +set_reset_data( usb0__SBUSCFG, val_usb0__SBUSCFG); +set_reset_data( usb0__CAPLENGTH_HCIVERSION, val_usb0__CAPLENGTH_HCIVERSION); +set_reset_data( usb0__HCSPARAMS, val_usb0__HCSPARAMS); +set_reset_data( usb0__HCCPARAMS, val_usb0__HCCPARAMS); +set_reset_data( usb0__DCIVERSION, val_usb0__DCIVERSION); +set_reset_data( usb0__DCCPARAMS, val_usb0__DCCPARAMS); +set_reset_data( usb0__USBCMD, val_usb0__USBCMD); +set_reset_data( usb0__USBSTS, val_usb0__USBSTS); +set_reset_data( usb0__USBINTR, val_usb0__USBINTR); +set_reset_data( usb0__FRINDEX, val_usb0__FRINDEX); +set_reset_data( usb0__PERIODICLISTBASE_DEVICEADDR, val_usb0__PERIODICLISTBASE_DEVICEADDR); +set_reset_data( usb0__ASYNCLISTADDR_ENDPOINTLISTADDR, val_usb0__ASYNCLISTADDR_ENDPOINTLISTADDR); +set_reset_data( usb0__TTCTRL, val_usb0__TTCTRL); +set_reset_data( usb0__BURSTSIZE, val_usb0__BURSTSIZE); +set_reset_data( usb0__TXFILLTUNING, val_usb0__TXFILLTUNING); +set_reset_data( usb0__TXTTFILLTUNING, val_usb0__TXTTFILLTUNING); +set_reset_data( usb0__IC_USB, val_usb0__IC_USB); +set_reset_data( usb0__ULPI_VIEWPORT, val_usb0__ULPI_VIEWPORT); +set_reset_data( usb0__ENDPTNAK, val_usb0__ENDPTNAK); +set_reset_data( usb0__ENDPTNAKEN, val_usb0__ENDPTNAKEN); +set_reset_data( usb0__CONFIGFLAG, val_usb0__CONFIGFLAG); +set_reset_data( usb0__PORTSC1, val_usb0__PORTSC1); +set_reset_data( usb0__OTGSC, val_usb0__OTGSC); +set_reset_data( usb0__USBMODE, val_usb0__USBMODE); +set_reset_data( usb0__ENDPTSETUPSTAT, val_usb0__ENDPTSETUPSTAT); +set_reset_data( usb0__ENDPTPRIME, val_usb0__ENDPTPRIME); +set_reset_data( usb0__ENDPTFLUSH, val_usb0__ENDPTFLUSH); +set_reset_data( usb0__ENDPTSTAT, val_usb0__ENDPTSTAT); +set_reset_data( usb0__ENDPTCOMPLETE, val_usb0__ENDPTCOMPLETE); +set_reset_data( usb0__ENDPTCTRL0, val_usb0__ENDPTCTRL0); +set_reset_data( usb0__ENDPTCTRL1, val_usb0__ENDPTCTRL1); +set_reset_data( usb0__ENDPTCTRL2, val_usb0__ENDPTCTRL2); +set_reset_data( usb0__ENDPTCTRL3, val_usb0__ENDPTCTRL3); +set_reset_data( usb0__ENDPTCTRL4, val_usb0__ENDPTCTRL4); +set_reset_data( usb0__ENDPTCTRL5, val_usb0__ENDPTCTRL5); +set_reset_data( usb0__ENDPTCTRL6, val_usb0__ENDPTCTRL6); +set_reset_data( usb0__ENDPTCTRL7, val_usb0__ENDPTCTRL7); +set_reset_data( usb0__ENDPTCTRL8, val_usb0__ENDPTCTRL8); +set_reset_data( usb0__ENDPTCTRL9, val_usb0__ENDPTCTRL9); +set_reset_data( usb0__ENDPTCTRL10, val_usb0__ENDPTCTRL10); +set_reset_data( usb0__ENDPTCTRL11, val_usb0__ENDPTCTRL11); +set_reset_data( usb0__ENDPTCTRL12, val_usb0__ENDPTCTRL12); + +// ************************************************************ +// Module usb1 usb +// doc version: 1.3 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +set_reset_data( usb1__ID, val_usb1__ID); +set_reset_data( usb1__HWGENERAL, val_usb1__HWGENERAL); +set_reset_data( usb1__HWHOST, val_usb1__HWHOST); +set_reset_data( usb1__HWDEVICE, val_usb1__HWDEVICE); +set_reset_data( usb1__HWTXBUF, val_usb1__HWTXBUF); +set_reset_data( usb1__HWRXBUF, val_usb1__HWRXBUF); +set_reset_data( usb1__GPTIMER0LD, val_usb1__GPTIMER0LD); +set_reset_data( usb1__GPTIMER0CTRL, val_usb1__GPTIMER0CTRL); +set_reset_data( usb1__GPTIMER1LD, val_usb1__GPTIMER1LD); +set_reset_data( usb1__GPTIMER1CTRL, val_usb1__GPTIMER1CTRL); +set_reset_data( usb1__SBUSCFG, val_usb1__SBUSCFG); +set_reset_data( usb1__CAPLENGTH_HCIVERSION, val_usb1__CAPLENGTH_HCIVERSION); +set_reset_data( usb1__HCSPARAMS, val_usb1__HCSPARAMS); +set_reset_data( usb1__HCCPARAMS, val_usb1__HCCPARAMS); +set_reset_data( usb1__DCIVERSION, val_usb1__DCIVERSION); +set_reset_data( usb1__DCCPARAMS, val_usb1__DCCPARAMS); +set_reset_data( usb1__USBCMD, val_usb1__USBCMD); +set_reset_data( usb1__USBSTS, val_usb1__USBSTS); +set_reset_data( usb1__USBINTR, val_usb1__USBINTR); +set_reset_data( usb1__FRINDEX, val_usb1__FRINDEX); +set_reset_data( usb1__PERIODICLISTBASE_DEVICEADDR, val_usb1__PERIODICLISTBASE_DEVICEADDR); +set_reset_data( usb1__ASYNCLISTADDR_ENDPOINTLISTADDR, val_usb1__ASYNCLISTADDR_ENDPOINTLISTADDR); +set_reset_data( usb1__TTCTRL, val_usb1__TTCTRL); +set_reset_data( usb1__BURSTSIZE, val_usb1__BURSTSIZE); +set_reset_data( usb1__TXFILLTUNING, val_usb1__TXFILLTUNING); +set_reset_data( usb1__TXTTFILLTUNING, val_usb1__TXTTFILLTUNING); +set_reset_data( usb1__IC_USB, val_usb1__IC_USB); +set_reset_data( usb1__ULPI_VIEWPORT, val_usb1__ULPI_VIEWPORT); +set_reset_data( usb1__ENDPTNAK, val_usb1__ENDPTNAK); +set_reset_data( usb1__ENDPTNAKEN, val_usb1__ENDPTNAKEN); +set_reset_data( usb1__CONFIGFLAG, val_usb1__CONFIGFLAG); +set_reset_data( usb1__PORTSC1, val_usb1__PORTSC1); +set_reset_data( usb1__OTGSC, val_usb1__OTGSC); +set_reset_data( usb1__USBMODE, val_usb1__USBMODE); +set_reset_data( usb1__ENDPTSETUPSTAT, val_usb1__ENDPTSETUPSTAT); +set_reset_data( usb1__ENDPTPRIME, val_usb1__ENDPTPRIME); +set_reset_data( usb1__ENDPTFLUSH, val_usb1__ENDPTFLUSH); +set_reset_data( usb1__ENDPTSTAT, val_usb1__ENDPTSTAT); +set_reset_data( usb1__ENDPTCOMPLETE, val_usb1__ENDPTCOMPLETE); +set_reset_data( usb1__ENDPTCTRL0, val_usb1__ENDPTCTRL0); +set_reset_data( usb1__ENDPTCTRL1, val_usb1__ENDPTCTRL1); +set_reset_data( usb1__ENDPTCTRL2, val_usb1__ENDPTCTRL2); +set_reset_data( usb1__ENDPTCTRL3, val_usb1__ENDPTCTRL3); +set_reset_data( usb1__ENDPTCTRL4, val_usb1__ENDPTCTRL4); +set_reset_data( usb1__ENDPTCTRL5, val_usb1__ENDPTCTRL5); +set_reset_data( usb1__ENDPTCTRL6, val_usb1__ENDPTCTRL6); +set_reset_data( usb1__ENDPTCTRL7, val_usb1__ENDPTCTRL7); +set_reset_data( usb1__ENDPTCTRL8, val_usb1__ENDPTCTRL8); +set_reset_data( usb1__ENDPTCTRL9, val_usb1__ENDPTCTRL9); +set_reset_data( usb1__ENDPTCTRL10, val_usb1__ENDPTCTRL10); +set_reset_data( usb1__ENDPTCTRL11, val_usb1__ENDPTCTRL11); +set_reset_data( usb1__ENDPTCTRL12, val_usb1__ENDPTCTRL12); diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_params.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_params.v new file mode 100644 index 0000000..41b0b56 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_reg_params.v @@ -0,0 +1,10519 @@ +/***************************************************************************** + * File : processing_system7_vip_v1_0_5_reg_params.v + * + * Date : 2012-11 + * + * Description : Parameters for Register Address and Default values. + * + *****************************************************************************/ + +// Register default value info for chip pele_ps +// This code was auto-generated by xregdb.py ver. 0.68, Thu Jul 12 10:32:25 2012 +// 54 modules, 2532 registers. + + +// ************************************************************ +// Module afi0 AFI +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter afi0__AFI_RDCHAN_CTRL = 32'hF8008000; +parameter val_afi0__AFI_RDCHAN_CTRL = 32'h00000000; +parameter mask_afi0__AFI_RDCHAN_CTRL = 32'hFFFFFFFF; + +parameter afi0__AFI_RDCHAN_ISSUINGCAP = 32'hF8008004; +parameter val_afi0__AFI_RDCHAN_ISSUINGCAP = 32'h00000007; +parameter mask_afi0__AFI_RDCHAN_ISSUINGCAP = 32'hFFFFFFFF; + +parameter afi0__AFI_RDQOS = 32'hF8008008; +parameter val_afi0__AFI_RDQOS = 32'h00000000; +parameter mask_afi0__AFI_RDQOS = 32'hFFFFFFFF; + +parameter afi0__AFI_RDDATAFIFO_LEVEL = 32'hF800800C; +parameter val_afi0__AFI_RDDATAFIFO_LEVEL = 32'h00000000; +parameter mask_afi0__AFI_RDDATAFIFO_LEVEL = 32'hFFFFFFFF; + +parameter afi0__AFI_RDDEBUG = 32'hF8008010; +parameter val_afi0__AFI_RDDEBUG = 32'h00000000; +parameter mask_afi0__AFI_RDDEBUG = 32'hFFFFFFFF; + +parameter afi0__AFI_WRCHAN_CTRL = 32'hF8008014; +parameter val_afi0__AFI_WRCHAN_CTRL = 32'h00000F00; +parameter mask_afi0__AFI_WRCHAN_CTRL = 32'hFFFFFFFF; + +parameter afi0__AFI_WRCHAN_ISSUINGCAP = 32'hF8008018; +parameter val_afi0__AFI_WRCHAN_ISSUINGCAP = 32'h00000007; +parameter mask_afi0__AFI_WRCHAN_ISSUINGCAP = 32'hFFFFFFFF; + +parameter afi0__AFI_WRQOS = 32'hF800801C; +parameter val_afi0__AFI_WRQOS = 32'h00000000; +parameter mask_afi0__AFI_WRQOS = 32'hFFFFFFFF; + +parameter afi0__AFI_WRDATAFIFO_LEVEL = 32'hF8008020; +parameter val_afi0__AFI_WRDATAFIFO_LEVEL = 32'h00000000; +parameter mask_afi0__AFI_WRDATAFIFO_LEVEL = 32'hFFFFFFFF; + +parameter afi0__AFI_WRDEBUG = 32'hF8008024; +parameter val_afi0__AFI_WRDEBUG = 32'h00000000; +parameter mask_afi0__AFI_WRDEBUG = 32'hFFFFFFFF; + + +// ************************************************************ +// Module afi1 AFI +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter afi1__AFI_RDCHAN_CTRL = 32'hF8009000; +parameter val_afi1__AFI_RDCHAN_CTRL = 32'h00000000; +parameter mask_afi1__AFI_RDCHAN_CTRL = 32'hFFFFFFFF; + +parameter afi1__AFI_RDCHAN_ISSUINGCAP = 32'hF8009004; +parameter val_afi1__AFI_RDCHAN_ISSUINGCAP = 32'h00000007; +parameter mask_afi1__AFI_RDCHAN_ISSUINGCAP = 32'hFFFFFFFF; + +parameter afi1__AFI_RDQOS = 32'hF8009008; +parameter val_afi1__AFI_RDQOS = 32'h00000000; +parameter mask_afi1__AFI_RDQOS = 32'hFFFFFFFF; + +parameter afi1__AFI_RDDATAFIFO_LEVEL = 32'hF800900C; +parameter val_afi1__AFI_RDDATAFIFO_LEVEL = 32'h00000000; +parameter mask_afi1__AFI_RDDATAFIFO_LEVEL = 32'hFFFFFFFF; + +parameter afi1__AFI_RDDEBUG = 32'hF8009010; +parameter val_afi1__AFI_RDDEBUG = 32'h00000000; +parameter mask_afi1__AFI_RDDEBUG = 32'hFFFFFFFF; + +parameter afi1__AFI_WRCHAN_CTRL = 32'hF8009014; +parameter val_afi1__AFI_WRCHAN_CTRL = 32'h00000F00; +parameter mask_afi1__AFI_WRCHAN_CTRL = 32'hFFFFFFFF; + +parameter afi1__AFI_WRCHAN_ISSUINGCAP = 32'hF8009018; +parameter val_afi1__AFI_WRCHAN_ISSUINGCAP = 32'h00000007; +parameter mask_afi1__AFI_WRCHAN_ISSUINGCAP = 32'hFFFFFFFF; + +parameter afi1__AFI_WRQOS = 32'hF800901C; +parameter val_afi1__AFI_WRQOS = 32'h00000000; +parameter mask_afi1__AFI_WRQOS = 32'hFFFFFFFF; + +parameter afi1__AFI_WRDATAFIFO_LEVEL = 32'hF8009020; +parameter val_afi1__AFI_WRDATAFIFO_LEVEL = 32'h00000000; +parameter mask_afi1__AFI_WRDATAFIFO_LEVEL = 32'hFFFFFFFF; + +parameter afi1__AFI_WRDEBUG = 32'hF8009024; +parameter val_afi1__AFI_WRDEBUG = 32'h00000000; +parameter mask_afi1__AFI_WRDEBUG = 32'hFFFFFFFF; + + +// ************************************************************ +// Module afi2 AFI +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter afi2__AFI_RDCHAN_CTRL = 32'hF800A000; +parameter val_afi2__AFI_RDCHAN_CTRL = 32'h00000000; +parameter mask_afi2__AFI_RDCHAN_CTRL = 32'hFFFFFFFF; + +parameter afi2__AFI_RDCHAN_ISSUINGCAP = 32'hF800A004; +parameter val_afi2__AFI_RDCHAN_ISSUINGCAP = 32'h00000007; +parameter mask_afi2__AFI_RDCHAN_ISSUINGCAP = 32'hFFFFFFFF; + +parameter afi2__AFI_RDQOS = 32'hF800A008; +parameter val_afi2__AFI_RDQOS = 32'h00000000; +parameter mask_afi2__AFI_RDQOS = 32'hFFFFFFFF; + +parameter afi2__AFI_RDDATAFIFO_LEVEL = 32'hF800A00C; +parameter val_afi2__AFI_RDDATAFIFO_LEVEL = 32'h00000000; +parameter mask_afi2__AFI_RDDATAFIFO_LEVEL = 32'hFFFFFFFF; + +parameter afi2__AFI_RDDEBUG = 32'hF800A010; +parameter val_afi2__AFI_RDDEBUG = 32'h00000000; +parameter mask_afi2__AFI_RDDEBUG = 32'hFFFFFFFF; + +parameter afi2__AFI_WRCHAN_CTRL = 32'hF800A014; +parameter val_afi2__AFI_WRCHAN_CTRL = 32'h00000F00; +parameter mask_afi2__AFI_WRCHAN_CTRL = 32'hFFFFFFFF; + +parameter afi2__AFI_WRCHAN_ISSUINGCAP = 32'hF800A018; +parameter val_afi2__AFI_WRCHAN_ISSUINGCAP = 32'h00000007; +parameter mask_afi2__AFI_WRCHAN_ISSUINGCAP = 32'hFFFFFFFF; + +parameter afi2__AFI_WRQOS = 32'hF800A01C; +parameter val_afi2__AFI_WRQOS = 32'h00000000; +parameter mask_afi2__AFI_WRQOS = 32'hFFFFFFFF; + +parameter afi2__AFI_WRDATAFIFO_LEVEL = 32'hF800A020; +parameter val_afi2__AFI_WRDATAFIFO_LEVEL = 32'h00000000; +parameter mask_afi2__AFI_WRDATAFIFO_LEVEL = 32'hFFFFFFFF; + +parameter afi2__AFI_WRDEBUG = 32'hF800A024; +parameter val_afi2__AFI_WRDEBUG = 32'h00000000; +parameter mask_afi2__AFI_WRDEBUG = 32'hFFFFFFFF; + + +// ************************************************************ +// Module afi3 AFI +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter afi3__AFI_RDCHAN_CTRL = 32'hF800B000; +parameter val_afi3__AFI_RDCHAN_CTRL = 32'h00000000; +parameter mask_afi3__AFI_RDCHAN_CTRL = 32'hFFFFFFFF; + +parameter afi3__AFI_RDCHAN_ISSUINGCAP = 32'hF800B004; +parameter val_afi3__AFI_RDCHAN_ISSUINGCAP = 32'h00000007; +parameter mask_afi3__AFI_RDCHAN_ISSUINGCAP = 32'hFFFFFFFF; + +parameter afi3__AFI_RDQOS = 32'hF800B008; +parameter val_afi3__AFI_RDQOS = 32'h00000000; +parameter mask_afi3__AFI_RDQOS = 32'hFFFFFFFF; + +parameter afi3__AFI_RDDATAFIFO_LEVEL = 32'hF800B00C; +parameter val_afi3__AFI_RDDATAFIFO_LEVEL = 32'h00000000; +parameter mask_afi3__AFI_RDDATAFIFO_LEVEL = 32'hFFFFFFFF; + +parameter afi3__AFI_RDDEBUG = 32'hF800B010; +parameter val_afi3__AFI_RDDEBUG = 32'h00000000; +parameter mask_afi3__AFI_RDDEBUG = 32'hFFFFFFFF; + +parameter afi3__AFI_WRCHAN_CTRL = 32'hF800B014; +parameter val_afi3__AFI_WRCHAN_CTRL = 32'h00000F00; +parameter mask_afi3__AFI_WRCHAN_CTRL = 32'hFFFFFFFF; + +parameter afi3__AFI_WRCHAN_ISSUINGCAP = 32'hF800B018; +parameter val_afi3__AFI_WRCHAN_ISSUINGCAP = 32'h00000007; +parameter mask_afi3__AFI_WRCHAN_ISSUINGCAP = 32'hFFFFFFFF; + +parameter afi3__AFI_WRQOS = 32'hF800B01C; +parameter val_afi3__AFI_WRQOS = 32'h00000000; +parameter mask_afi3__AFI_WRQOS = 32'hFFFFFFFF; + +parameter afi3__AFI_WRDATAFIFO_LEVEL = 32'hF800B020; +parameter val_afi3__AFI_WRDATAFIFO_LEVEL = 32'h00000000; +parameter mask_afi3__AFI_WRDATAFIFO_LEVEL = 32'hFFFFFFFF; + +parameter afi3__AFI_WRDEBUG = 32'hF800B024; +parameter val_afi3__AFI_WRDEBUG = 32'h00000000; +parameter mask_afi3__AFI_WRDEBUG = 32'hFFFFFFFF; + + +// ************************************************************ +// Module can0 can +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter can0__SRR = 32'hE0008000; +parameter val_can0__SRR = 32'h00000000; +parameter mask_can0__SRR = 32'hFFFFFFFF; + +parameter can0__MSR = 32'hE0008004; +parameter val_can0__MSR = 32'h00000000; +parameter mask_can0__MSR = 32'hFFFFFFFF; + +parameter can0__BRPR = 32'hE0008008; +parameter val_can0__BRPR = 32'h00000000; +parameter mask_can0__BRPR = 32'hFFFFFFFF; + +parameter can0__BTR = 32'hE000800C; +parameter val_can0__BTR = 32'h00000000; +parameter mask_can0__BTR = 32'hFFFFFFFF; + +parameter can0__ECR = 32'hE0008010; +parameter val_can0__ECR = 32'h00000000; +parameter mask_can0__ECR = 32'hFFFFFFFF; + +parameter can0__ESR = 32'hE0008014; +parameter val_can0__ESR = 32'h00000000; +parameter mask_can0__ESR = 32'hFFFFFFFF; + +parameter can0__SR = 32'hE0008018; +parameter val_can0__SR = 32'h00000001; +parameter mask_can0__SR = 32'hFFFFFFFF; + +parameter can0__ISR = 32'hE000801C; +parameter val_can0__ISR = 32'h00006000; +parameter mask_can0__ISR = 32'hFFFFFFFF; + +parameter can0__IER = 32'hE0008020; +parameter val_can0__IER = 32'h00000000; +parameter mask_can0__IER = 32'hFFFFFFFF; + +parameter can0__ICR = 32'hE0008024; +parameter val_can0__ICR = 32'h00000000; +parameter mask_can0__ICR = 32'hFFFFFFFF; + +parameter can0__TCR = 32'hE0008028; +parameter val_can0__TCR = 32'h00000000; +parameter mask_can0__TCR = 32'hFFFFFFFF; + +parameter can0__WIR = 32'hE000802C; +parameter val_can0__WIR = 32'h00003F3F; +parameter mask_can0__WIR = 32'hFFFFFFFF; + +parameter can0__TXFIFO_ID = 32'hE0008030; +parameter val_can0__TXFIFO_ID = 32'h00000000; +parameter mask_can0__TXFIFO_ID = 32'hFFFFFFFF; + +parameter can0__TXFIFO_DLC = 32'hE0008034; +parameter val_can0__TXFIFO_DLC = 32'h00000000; +parameter mask_can0__TXFIFO_DLC = 32'hFFFFFFFF; + +parameter can0__TXFIFO_DATA1 = 32'hE0008038; +parameter val_can0__TXFIFO_DATA1 = 32'h00000000; +parameter mask_can0__TXFIFO_DATA1 = 32'hFFFFFFFF; + +parameter can0__TXFIFO_DATA2 = 32'hE000803C; +parameter val_can0__TXFIFO_DATA2 = 32'h00000000; +parameter mask_can0__TXFIFO_DATA2 = 32'hFFFFFFFF; + +parameter can0__TXHPB_ID = 32'hE0008040; +parameter val_can0__TXHPB_ID = 32'h00000000; +parameter mask_can0__TXHPB_ID = 32'hFFFFFFFF; + +parameter can0__TXHPB_DLC = 32'hE0008044; +parameter val_can0__TXHPB_DLC = 32'h00000000; +parameter mask_can0__TXHPB_DLC = 32'hFFFFFFFF; + +parameter can0__TXHPB_DATA1 = 32'hE0008048; +parameter val_can0__TXHPB_DATA1 = 32'h00000000; +parameter mask_can0__TXHPB_DATA1 = 32'hFFFFFFFF; + +parameter can0__TXHPB_DATA2 = 32'hE000804C; +parameter val_can0__TXHPB_DATA2 = 32'h00000000; +parameter mask_can0__TXHPB_DATA2 = 32'hFFFFFFFF; + +parameter can0__RXFIFO_ID = 32'hE0008050; +parameter val_can0__RXFIFO_ID = 32'h00000000; +parameter mask_can0__RXFIFO_ID = 32'h00000000; + +parameter can0__RXFIFO_DLC = 32'hE0008054; +parameter val_can0__RXFIFO_DLC = 32'h00000000; +parameter mask_can0__RXFIFO_DLC = 32'h00000000; + +parameter can0__RXFIFO_DATA1 = 32'hE0008058; +parameter val_can0__RXFIFO_DATA1 = 32'h00000000; +parameter mask_can0__RXFIFO_DATA1 = 32'h00000000; + +parameter can0__RXFIFO_DATA2 = 32'hE000805C; +parameter val_can0__RXFIFO_DATA2 = 32'h00000000; +parameter mask_can0__RXFIFO_DATA2 = 32'h00000000; + +parameter can0__AFR = 32'hE0008060; +parameter val_can0__AFR = 32'h00000000; +parameter mask_can0__AFR = 32'hFFFFFFFF; + +parameter can0__AFMR1 = 32'hE0008064; +parameter val_can0__AFMR1 = 32'h00000000; +parameter mask_can0__AFMR1 = 32'h00000000; + +parameter can0__AFIR1 = 32'hE0008068; +parameter val_can0__AFIR1 = 32'h00000000; +parameter mask_can0__AFIR1 = 32'h00000000; + +parameter can0__AFMR2 = 32'hE000806C; +parameter val_can0__AFMR2 = 32'h00000000; +parameter mask_can0__AFMR2 = 32'h00000000; + +parameter can0__AFIR2 = 32'hE0008070; +parameter val_can0__AFIR2 = 32'h00000000; +parameter mask_can0__AFIR2 = 32'h00000000; + +parameter can0__AFMR3 = 32'hE0008074; +parameter val_can0__AFMR3 = 32'h00000000; +parameter mask_can0__AFMR3 = 32'h00000000; + +parameter can0__AFIR3 = 32'hE0008078; +parameter val_can0__AFIR3 = 32'h00000000; +parameter mask_can0__AFIR3 = 32'h00000000; + +parameter can0__AFMR4 = 32'hE000807C; +parameter val_can0__AFMR4 = 32'h00000000; +parameter mask_can0__AFMR4 = 32'h00000000; + +parameter can0__AFIR4 = 32'hE0008080; +parameter val_can0__AFIR4 = 32'h00000000; +parameter mask_can0__AFIR4 = 32'h00000000; + + +// ************************************************************ +// Module can1 can +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter can1__SRR = 32'hE0009000; +parameter val_can1__SRR = 32'h00000000; +parameter mask_can1__SRR = 32'hFFFFFFFF; + +parameter can1__MSR = 32'hE0009004; +parameter val_can1__MSR = 32'h00000000; +parameter mask_can1__MSR = 32'hFFFFFFFF; + +parameter can1__BRPR = 32'hE0009008; +parameter val_can1__BRPR = 32'h00000000; +parameter mask_can1__BRPR = 32'hFFFFFFFF; + +parameter can1__BTR = 32'hE000900C; +parameter val_can1__BTR = 32'h00000000; +parameter mask_can1__BTR = 32'hFFFFFFFF; + +parameter can1__ECR = 32'hE0009010; +parameter val_can1__ECR = 32'h00000000; +parameter mask_can1__ECR = 32'hFFFFFFFF; + +parameter can1__ESR = 32'hE0009014; +parameter val_can1__ESR = 32'h00000000; +parameter mask_can1__ESR = 32'hFFFFFFFF; + +parameter can1__SR = 32'hE0009018; +parameter val_can1__SR = 32'h00000001; +parameter mask_can1__SR = 32'hFFFFFFFF; + +parameter can1__ISR = 32'hE000901C; +parameter val_can1__ISR = 32'h00006000; +parameter mask_can1__ISR = 32'hFFFFFFFF; + +parameter can1__IER = 32'hE0009020; +parameter val_can1__IER = 32'h00000000; +parameter mask_can1__IER = 32'hFFFFFFFF; + +parameter can1__ICR = 32'hE0009024; +parameter val_can1__ICR = 32'h00000000; +parameter mask_can1__ICR = 32'hFFFFFFFF; + +parameter can1__TCR = 32'hE0009028; +parameter val_can1__TCR = 32'h00000000; +parameter mask_can1__TCR = 32'hFFFFFFFF; + +parameter can1__WIR = 32'hE000902C; +parameter val_can1__WIR = 32'h00003F3F; +parameter mask_can1__WIR = 32'hFFFFFFFF; + +parameter can1__TXFIFO_ID = 32'hE0009030; +parameter val_can1__TXFIFO_ID = 32'h00000000; +parameter mask_can1__TXFIFO_ID = 32'hFFFFFFFF; + +parameter can1__TXFIFO_DLC = 32'hE0009034; +parameter val_can1__TXFIFO_DLC = 32'h00000000; +parameter mask_can1__TXFIFO_DLC = 32'hFFFFFFFF; + +parameter can1__TXFIFO_DATA1 = 32'hE0009038; +parameter val_can1__TXFIFO_DATA1 = 32'h00000000; +parameter mask_can1__TXFIFO_DATA1 = 32'hFFFFFFFF; + +parameter can1__TXFIFO_DATA2 = 32'hE000903C; +parameter val_can1__TXFIFO_DATA2 = 32'h00000000; +parameter mask_can1__TXFIFO_DATA2 = 32'hFFFFFFFF; + +parameter can1__TXHPB_ID = 32'hE0009040; +parameter val_can1__TXHPB_ID = 32'h00000000; +parameter mask_can1__TXHPB_ID = 32'hFFFFFFFF; + +parameter can1__TXHPB_DLC = 32'hE0009044; +parameter val_can1__TXHPB_DLC = 32'h00000000; +parameter mask_can1__TXHPB_DLC = 32'hFFFFFFFF; + +parameter can1__TXHPB_DATA1 = 32'hE0009048; +parameter val_can1__TXHPB_DATA1 = 32'h00000000; +parameter mask_can1__TXHPB_DATA1 = 32'hFFFFFFFF; + +parameter can1__TXHPB_DATA2 = 32'hE000904C; +parameter val_can1__TXHPB_DATA2 = 32'h00000000; +parameter mask_can1__TXHPB_DATA2 = 32'hFFFFFFFF; + +parameter can1__RXFIFO_ID = 32'hE0009050; +parameter val_can1__RXFIFO_ID = 32'h00000000; +parameter mask_can1__RXFIFO_ID = 32'h00000000; + +parameter can1__RXFIFO_DLC = 32'hE0009054; +parameter val_can1__RXFIFO_DLC = 32'h00000000; +parameter mask_can1__RXFIFO_DLC = 32'h00000000; + +parameter can1__RXFIFO_DATA1 = 32'hE0009058; +parameter val_can1__RXFIFO_DATA1 = 32'h00000000; +parameter mask_can1__RXFIFO_DATA1 = 32'h00000000; + +parameter can1__RXFIFO_DATA2 = 32'hE000905C; +parameter val_can1__RXFIFO_DATA2 = 32'h00000000; +parameter mask_can1__RXFIFO_DATA2 = 32'h00000000; + +parameter can1__AFR = 32'hE0009060; +parameter val_can1__AFR = 32'h00000000; +parameter mask_can1__AFR = 32'hFFFFFFFF; + +parameter can1__AFMR1 = 32'hE0009064; +parameter val_can1__AFMR1 = 32'h00000000; +parameter mask_can1__AFMR1 = 32'h00000000; + +parameter can1__AFIR1 = 32'hE0009068; +parameter val_can1__AFIR1 = 32'h00000000; +parameter mask_can1__AFIR1 = 32'h00000000; + +parameter can1__AFMR2 = 32'hE000906C; +parameter val_can1__AFMR2 = 32'h00000000; +parameter mask_can1__AFMR2 = 32'h00000000; + +parameter can1__AFIR2 = 32'hE0009070; +parameter val_can1__AFIR2 = 32'h00000000; +parameter mask_can1__AFIR2 = 32'h00000000; + +parameter can1__AFMR3 = 32'hE0009074; +parameter val_can1__AFMR3 = 32'h00000000; +parameter mask_can1__AFMR3 = 32'h00000000; + +parameter can1__AFIR3 = 32'hE0009078; +parameter val_can1__AFIR3 = 32'h00000000; +parameter mask_can1__AFIR3 = 32'h00000000; + +parameter can1__AFMR4 = 32'hE000907C; +parameter val_can1__AFMR4 = 32'h00000000; +parameter mask_can1__AFMR4 = 32'h00000000; + +parameter can1__AFIR4 = 32'hE0009080; +parameter val_can1__AFIR4 = 32'h00000000; +parameter mask_can1__AFIR4 = 32'h00000000; + + +// ************************************************************ +// Module ddrc ddrc +// doc version: 1.25 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter ddrc__ddrc_ctrl = 32'hF8006000; +parameter val_ddrc__ddrc_ctrl = 32'h00000200; +parameter mask_ddrc__ddrc_ctrl = 32'hFFFFFFFF; + +parameter ddrc__Two_rank_cfg = 32'hF8006004; +parameter val_ddrc__Two_rank_cfg = 32'h000C1076; +parameter mask_ddrc__Two_rank_cfg = 32'h1FFFFFFF; + +parameter ddrc__HPR_reg = 32'hF8006008; +parameter val_ddrc__HPR_reg = 32'h03C0780F; +parameter mask_ddrc__HPR_reg = 32'h03FFFFFF; + +parameter ddrc__LPR_reg = 32'hF800600C; +parameter val_ddrc__LPR_reg = 32'h03C0780F; +parameter mask_ddrc__LPR_reg = 32'h03FFFFFF; + +parameter ddrc__WR_reg = 32'hF8006010; +parameter val_ddrc__WR_reg = 32'h0007F80F; +parameter mask_ddrc__WR_reg = 32'h03FFFFFF; + +parameter ddrc__DRAM_param_reg0 = 32'hF8006014; +parameter val_ddrc__DRAM_param_reg0 = 32'h00041016; +parameter mask_ddrc__DRAM_param_reg0 = 32'h001FFFFF; + +parameter ddrc__DRAM_param_reg1 = 32'hF8006018; +parameter val_ddrc__DRAM_param_reg1 = 32'h351B48D9; +parameter mask_ddrc__DRAM_param_reg1 = 32'hF7FFFFFF; + +parameter ddrc__DRAM_param_reg2 = 32'hF800601C; +parameter val_ddrc__DRAM_param_reg2 = 32'h83015904; +parameter mask_ddrc__DRAM_param_reg2 = 32'hFFFFFFFF; + +parameter ddrc__DRAM_param_reg3 = 32'hF8006020; +parameter val_ddrc__DRAM_param_reg3 = 32'h250882D0; +parameter mask_ddrc__DRAM_param_reg3 = 32'hFFFFFFFF; + +parameter ddrc__DRAM_param_reg4 = 32'hF8006024; +parameter val_ddrc__DRAM_param_reg4 = 32'h0000003C; +parameter mask_ddrc__DRAM_param_reg4 = 32'h0FFFFFFF; + +parameter ddrc__DRAM_init_param = 32'hF8006028; +parameter val_ddrc__DRAM_init_param = 32'h00002007; +parameter mask_ddrc__DRAM_init_param = 32'h00003FFF; + +parameter ddrc__DRAM_EMR_reg = 32'hF800602C; +parameter val_ddrc__DRAM_EMR_reg = 32'h00000008; +parameter mask_ddrc__DRAM_EMR_reg = 32'hFFFFFFFF; + +parameter ddrc__DRAM_EMR_MR_reg = 32'hF8006030; +parameter val_ddrc__DRAM_EMR_MR_reg = 32'h00000940; +parameter mask_ddrc__DRAM_EMR_MR_reg = 32'hFFFFFFFF; + +parameter ddrc__DRAM_burst8_rdwr = 32'hF8006034; +parameter val_ddrc__DRAM_burst8_rdwr = 32'h00020034; +parameter mask_ddrc__DRAM_burst8_rdwr = 32'h1FFFFFFF; + +parameter ddrc__DRAM_disable_DQ = 32'hF8006038; +parameter val_ddrc__DRAM_disable_DQ = 32'h00000000; +parameter mask_ddrc__DRAM_disable_DQ = 32'h00001FFF; + +parameter ddrc__DRAM_addr_map_bank = 32'hF800603C; +parameter val_ddrc__DRAM_addr_map_bank = 32'h00000F77; +parameter mask_ddrc__DRAM_addr_map_bank = 32'h000FFFFF; + +parameter ddrc__DRAM_addr_map_col = 32'hF8006040; +parameter val_ddrc__DRAM_addr_map_col = 32'hFFF00000; +parameter mask_ddrc__DRAM_addr_map_col = 32'hFFFFFFFF; + +parameter ddrc__DRAM_addr_map_row = 32'hF8006044; +parameter val_ddrc__DRAM_addr_map_row = 32'h0FF55555; +parameter mask_ddrc__DRAM_addr_map_row = 32'h0FFFFFFF; + +parameter ddrc__DRAM_ODT_reg = 32'hF8006048; +parameter val_ddrc__DRAM_ODT_reg = 32'h00000249; +parameter mask_ddrc__DRAM_ODT_reg = 32'h3FFFFFFF; + +parameter ddrc__phy_dbg_reg = 32'hF800604C; +parameter val_ddrc__phy_dbg_reg = 32'h00000000; +parameter mask_ddrc__phy_dbg_reg = 32'h000FFFFF; + +parameter ddrc__phy_cmd_timeout_rddata_cpt = 32'hF8006050; +parameter val_ddrc__phy_cmd_timeout_rddata_cpt = 32'h00010200; +parameter mask_ddrc__phy_cmd_timeout_rddata_cpt = 32'hFFFFFFFF; + +parameter ddrc__mode_sts_reg = 32'hF8006054; +parameter val_ddrc__mode_sts_reg = 32'h00000000; +parameter mask_ddrc__mode_sts_reg = 32'h001FFFFF; + +parameter ddrc__DLL_calib = 32'hF8006058; +parameter val_ddrc__DLL_calib = 32'h00000101; +parameter mask_ddrc__DLL_calib = 32'h0001FFFF; + +parameter ddrc__ODT_delay_hold = 32'hF800605C; +parameter val_ddrc__ODT_delay_hold = 32'h00000023; +parameter mask_ddrc__ODT_delay_hold = 32'h0000FFFF; + +parameter ddrc__ctrl_reg1 = 32'hF8006060; +parameter val_ddrc__ctrl_reg1 = 32'h0000003E; +parameter mask_ddrc__ctrl_reg1 = 32'h00001FFF; + +parameter ddrc__ctrl_reg2 = 32'hF8006064; +parameter val_ddrc__ctrl_reg2 = 32'h00020000; +parameter mask_ddrc__ctrl_reg2 = 32'h0003FFFF; + +parameter ddrc__ctrl_reg3 = 32'hF8006068; +parameter val_ddrc__ctrl_reg3 = 32'h00284027; +parameter mask_ddrc__ctrl_reg3 = 32'h03FFFFFF; + +parameter ddrc__ctrl_reg4 = 32'hF800606C; +parameter val_ddrc__ctrl_reg4 = 32'h00001610; +parameter mask_ddrc__ctrl_reg4 = 32'h0000FFFF; + +parameter ddrc__ctrl_reg5 = 32'hF8006078; +parameter val_ddrc__ctrl_reg5 = 32'h00455111; +parameter mask_ddrc__ctrl_reg5 = 32'hFFFFFFFF; + +parameter ddrc__ctrl_reg6 = 32'hF800607C; +parameter val_ddrc__ctrl_reg6 = 32'h00032222; +parameter mask_ddrc__ctrl_reg6 = 32'hFFFFFFFF; + +parameter ddrc__CHE_REFRESH_TIMER01 = 32'hF80060A0; +parameter val_ddrc__CHE_REFRESH_TIMER01 = 32'h00008000; +parameter mask_ddrc__CHE_REFRESH_TIMER01 = 32'h00FFFFFF; + +parameter ddrc__CHE_T_ZQ = 32'hF80060A4; +parameter val_ddrc__CHE_T_ZQ = 32'h10300802; +parameter mask_ddrc__CHE_T_ZQ = 32'hFFFFFFFF; + +parameter ddrc__CHE_T_ZQ_Short_Interval_Reg = 32'hF80060A8; +parameter val_ddrc__CHE_T_ZQ_Short_Interval_Reg = 32'h0020003A; +parameter mask_ddrc__CHE_T_ZQ_Short_Interval_Reg = 32'h0FFFFFFF; + +parameter ddrc__deep_pwrdwn_reg = 32'hF80060AC; +parameter val_ddrc__deep_pwrdwn_reg = 32'h00000000; +parameter mask_ddrc__deep_pwrdwn_reg = 32'h000001FF; + +parameter ddrc__reg_2c = 32'hF80060B0; +parameter val_ddrc__reg_2c = 32'h00000000; +parameter mask_ddrc__reg_2c = 32'h1FFFFFFF; + +parameter ddrc__reg_2d = 32'hF80060B4; +parameter val_ddrc__reg_2d = 32'h00000200; +parameter mask_ddrc__reg_2d = 32'h000007FF; + +parameter ddrc__dfi_timing = 32'hF80060B8; +parameter val_ddrc__dfi_timing = 32'h00200067; +parameter mask_ddrc__dfi_timing = 32'h01FFFFFF; + +parameter ddrc__refresh_timer_2 = 32'hF80060BC; +parameter val_ddrc__refresh_timer_2 = 32'h00000000; +parameter mask_ddrc__refresh_timer_2 = 32'h00FFFFFF; + +parameter ddrc__nc_timing = 32'hF80060C0; +parameter val_ddrc__nc_timing = 32'h00000000; +parameter mask_ddrc__nc_timing = 32'h003FFFFF; + +parameter ddrc__CHE_ECC_CONTROL_REG_OFFSET = 32'hF80060C4; +parameter val_ddrc__CHE_ECC_CONTROL_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_ECC_CONTROL_REG_OFFSET = 32'h00000003; + +parameter ddrc__CHE_CORR_ECC_LOG_REG_OFFSET = 32'hF80060C8; +parameter val_ddrc__CHE_CORR_ECC_LOG_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_CORR_ECC_LOG_REG_OFFSET = 32'h000000FF; + +parameter ddrc__CHE_CORR_ECC_ADDR_REG_OFFSET = 32'hF80060CC; +parameter val_ddrc__CHE_CORR_ECC_ADDR_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_CORR_ECC_ADDR_REG_OFFSET = 32'h7FFFFFFF; + +parameter ddrc__CHE_CORR_ECC_DATA_31_0_REG_OFFSET = 32'hF80060D0; +parameter val_ddrc__CHE_CORR_ECC_DATA_31_0_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_CORR_ECC_DATA_31_0_REG_OFFSET = 32'hFFFFFFFF; + +parameter ddrc__CHE_CORR_ECC_DATA_63_32_REG_OFFSET = 32'hF80060D4; +parameter val_ddrc__CHE_CORR_ECC_DATA_63_32_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_CORR_ECC_DATA_63_32_REG_OFFSET = 32'hFFFFFFFF; + +parameter ddrc__CHE_CORR_ECC_DATA_71_64_REG_OFFSET = 32'hF80060D8; +parameter val_ddrc__CHE_CORR_ECC_DATA_71_64_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_CORR_ECC_DATA_71_64_REG_OFFSET = 32'h000000FF; + +parameter ddrc__CHE_UNCORR_ECC_LOG_REG_OFFSET = 32'hF80060DC; +parameter val_ddrc__CHE_UNCORR_ECC_LOG_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_UNCORR_ECC_LOG_REG_OFFSET = 32'h00000001; + +parameter ddrc__CHE_UNCORR_ECC_ADDR_REG_OFFSET = 32'hF80060E0; +parameter val_ddrc__CHE_UNCORR_ECC_ADDR_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_UNCORR_ECC_ADDR_REG_OFFSET = 32'h7FFFFFFF; + +parameter ddrc__CHE_UNCORR_ECC_DATA_31_0_REG_OFFSET = 32'hF80060E4; +parameter val_ddrc__CHE_UNCORR_ECC_DATA_31_0_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_UNCORR_ECC_DATA_31_0_REG_OFFSET = 32'hFFFFFFFF; + +parameter ddrc__CHE_UNCORR_ECC_DATA_63_32_REG_OFFSET = 32'hF80060E8; +parameter val_ddrc__CHE_UNCORR_ECC_DATA_63_32_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_UNCORR_ECC_DATA_63_32_REG_OFFSET = 32'hFFFFFFFF; + +parameter ddrc__CHE_UNCORR_ECC_DATA_71_64_REG_OFFSET = 32'hF80060EC; +parameter val_ddrc__CHE_UNCORR_ECC_DATA_71_64_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_UNCORR_ECC_DATA_71_64_REG_OFFSET = 32'h000000FF; + +parameter ddrc__CHE_ECC_STATS_REG_OFFSET = 32'hF80060F0; +parameter val_ddrc__CHE_ECC_STATS_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_ECC_STATS_REG_OFFSET = 32'h0000FFFF; + +parameter ddrc__ECC_scrub = 32'hF80060F4; +parameter val_ddrc__ECC_scrub = 32'h00000008; +parameter mask_ddrc__ECC_scrub = 32'h0000000F; + +parameter ddrc__CHE_ECC_CORR_BIT_MASK_31_0_REG_OFFSET = 32'hF80060F8; +parameter val_ddrc__CHE_ECC_CORR_BIT_MASK_31_0_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_ECC_CORR_BIT_MASK_31_0_REG_OFFSET = 32'hFFFFFFFF; + +parameter ddrc__CHE_ECC_CORR_BIT_MASK_63_32_REG_OFFSET = 32'hF80060FC; +parameter val_ddrc__CHE_ECC_CORR_BIT_MASK_63_32_REG_OFFSET = 32'h00000000; +parameter mask_ddrc__CHE_ECC_CORR_BIT_MASK_63_32_REG_OFFSET = 32'hFFFFFFFF; + +parameter ddrc__phy_rcvr_enable = 32'hF8006114; +parameter val_ddrc__phy_rcvr_enable = 32'h00000000; +parameter mask_ddrc__phy_rcvr_enable = 32'h000000FF; + +parameter ddrc__PHY_Config0 = 32'hF8006118; +parameter val_ddrc__PHY_Config0 = 32'h40000001; +parameter mask_ddrc__PHY_Config0 = 32'h7FFFFFFF; + +parameter ddrc__PHY_Config1 = 32'hF800611C; +parameter val_ddrc__PHY_Config1 = 32'h40000001; +parameter mask_ddrc__PHY_Config1 = 32'h7FFFFFFF; + +parameter ddrc__PHY_Config2 = 32'hF8006120; +parameter val_ddrc__PHY_Config2 = 32'h40000001; +parameter mask_ddrc__PHY_Config2 = 32'h7FFFFFFF; + +parameter ddrc__PHY_Config3 = 32'hF8006124; +parameter val_ddrc__PHY_Config3 = 32'h40000001; +parameter mask_ddrc__PHY_Config3 = 32'h7FFFFFFF; + +parameter ddrc__phy_init_ratio0 = 32'hF800612C; +parameter val_ddrc__phy_init_ratio0 = 32'h00000000; +parameter mask_ddrc__phy_init_ratio0 = 32'h000FFFFF; + +parameter ddrc__phy_init_ratio1 = 32'hF8006130; +parameter val_ddrc__phy_init_ratio1 = 32'h00000000; +parameter mask_ddrc__phy_init_ratio1 = 32'h000FFFFF; + +parameter ddrc__phy_init_ratio2 = 32'hF8006134; +parameter val_ddrc__phy_init_ratio2 = 32'h00000000; +parameter mask_ddrc__phy_init_ratio2 = 32'h000FFFFF; + +parameter ddrc__phy_init_ratio3 = 32'hF8006138; +parameter val_ddrc__phy_init_ratio3 = 32'h00000000; +parameter mask_ddrc__phy_init_ratio3 = 32'h000FFFFF; + +parameter ddrc__phy_rd_dqs_cfg0 = 32'hF8006140; +parameter val_ddrc__phy_rd_dqs_cfg0 = 32'h00000040; +parameter mask_ddrc__phy_rd_dqs_cfg0 = 32'h000FFFFF; + +parameter ddrc__phy_rd_dqs_cfg1 = 32'hF8006144; +parameter val_ddrc__phy_rd_dqs_cfg1 = 32'h00000040; +parameter mask_ddrc__phy_rd_dqs_cfg1 = 32'h000FFFFF; + +parameter ddrc__phy_rd_dqs_cfg2 = 32'hF8006148; +parameter val_ddrc__phy_rd_dqs_cfg2 = 32'h00000040; +parameter mask_ddrc__phy_rd_dqs_cfg2 = 32'h000FFFFF; + +parameter ddrc__phy_rd_dqs_cfg3 = 32'hF800614C; +parameter val_ddrc__phy_rd_dqs_cfg3 = 32'h00000040; +parameter mask_ddrc__phy_rd_dqs_cfg3 = 32'h000FFFFF; + +parameter ddrc__phy_wr_dqs_cfg0 = 32'hF8006154; +parameter val_ddrc__phy_wr_dqs_cfg0 = 32'h00000000; +parameter mask_ddrc__phy_wr_dqs_cfg0 = 32'h000FFFFF; + +parameter ddrc__phy_wr_dqs_cfg1 = 32'hF8006158; +parameter val_ddrc__phy_wr_dqs_cfg1 = 32'h00000000; +parameter mask_ddrc__phy_wr_dqs_cfg1 = 32'h000FFFFF; + +parameter ddrc__phy_wr_dqs_cfg2 = 32'hF800615C; +parameter val_ddrc__phy_wr_dqs_cfg2 = 32'h00000000; +parameter mask_ddrc__phy_wr_dqs_cfg2 = 32'h000FFFFF; + +parameter ddrc__phy_wr_dqs_cfg3 = 32'hF8006160; +parameter val_ddrc__phy_wr_dqs_cfg3 = 32'h00000000; +parameter mask_ddrc__phy_wr_dqs_cfg3 = 32'h000FFFFF; + +parameter ddrc__phy_we_cfg0 = 32'hF8006168; +parameter val_ddrc__phy_we_cfg0 = 32'h00000040; +parameter mask_ddrc__phy_we_cfg0 = 32'h001FFFFF; + +parameter ddrc__phy_we_cfg1 = 32'hF800616C; +parameter val_ddrc__phy_we_cfg1 = 32'h00000040; +parameter mask_ddrc__phy_we_cfg1 = 32'h001FFFFF; + +parameter ddrc__phy_we_cfg2 = 32'hF8006170; +parameter val_ddrc__phy_we_cfg2 = 32'h00000040; +parameter mask_ddrc__phy_we_cfg2 = 32'h001FFFFF; + +parameter ddrc__phy_we_cfg3 = 32'hF8006174; +parameter val_ddrc__phy_we_cfg3 = 32'h00000040; +parameter mask_ddrc__phy_we_cfg3 = 32'h001FFFFF; + +parameter ddrc__wr_data_slv0 = 32'hF800617C; +parameter val_ddrc__wr_data_slv0 = 32'h00000080; +parameter mask_ddrc__wr_data_slv0 = 32'h000FFFFF; + +parameter ddrc__wr_data_slv1 = 32'hF8006180; +parameter val_ddrc__wr_data_slv1 = 32'h00000080; +parameter mask_ddrc__wr_data_slv1 = 32'h000FFFFF; + +parameter ddrc__wr_data_slv2 = 32'hF8006184; +parameter val_ddrc__wr_data_slv2 = 32'h00000080; +parameter mask_ddrc__wr_data_slv2 = 32'h000FFFFF; + +parameter ddrc__wr_data_slv3 = 32'hF8006188; +parameter val_ddrc__wr_data_slv3 = 32'h00000080; +parameter mask_ddrc__wr_data_slv3 = 32'h000FFFFF; + +parameter ddrc__reg_64 = 32'hF8006190; +parameter val_ddrc__reg_64 = 32'h10020000; +parameter mask_ddrc__reg_64 = 32'hFFFFFFFF; + +parameter ddrc__reg_65 = 32'hF8006194; +parameter val_ddrc__reg_65 = 32'h00000000; +parameter mask_ddrc__reg_65 = 32'h000FFFFF; + +parameter ddrc__reg69_6a0 = 32'hF80061A4; +parameter val_ddrc__reg69_6a0 = 32'h000F0000; +parameter mask_ddrc__reg69_6a0 = 32'h1FFFFFFF; + +parameter ddrc__reg69_6a1 = 32'hF80061A8; +parameter val_ddrc__reg69_6a1 = 32'h000F0000; +parameter mask_ddrc__reg69_6a1 = 32'h1FFFFFFF; + +parameter ddrc__reg6c_6d2 = 32'hF80061B0; +parameter val_ddrc__reg6c_6d2 = 32'h000F0000; +parameter mask_ddrc__reg6c_6d2 = 32'h1FFFFFFF; + +parameter ddrc__reg6c_6d3 = 32'hF80061B4; +parameter val_ddrc__reg6c_6d3 = 32'h000F0000; +parameter mask_ddrc__reg6c_6d3 = 32'h1FFFFFFF; + +parameter ddrc__reg6e_710 = 32'hF80061B8; +parameter val_ddrc__reg6e_710 = 32'h00000000; +parameter mask_ddrc__reg6e_710 = 32'h00000000; + +parameter ddrc__reg6e_711 = 32'hF80061BC; +parameter val_ddrc__reg6e_711 = 32'h00000000; +parameter mask_ddrc__reg6e_711 = 32'h00000000; + +parameter ddrc__reg6e_712 = 32'hF80061C0; +parameter val_ddrc__reg6e_712 = 32'h00000000; +parameter mask_ddrc__reg6e_712 = 32'h00000000; + +parameter ddrc__reg6e_713 = 32'hF80061C4; +parameter val_ddrc__reg6e_713 = 32'h00000000; +parameter mask_ddrc__reg6e_713 = 32'h00000000; + +parameter ddrc__phy_dll_sts0 = 32'hF80061CC; +parameter val_ddrc__phy_dll_sts0 = 32'h00000000; +parameter mask_ddrc__phy_dll_sts0 = 32'h07FFFFFF; + +parameter ddrc__phy_dll_sts1 = 32'hF80061D0; +parameter val_ddrc__phy_dll_sts1 = 32'h00000000; +parameter mask_ddrc__phy_dll_sts1 = 32'h07FFFFFF; + +parameter ddrc__phy_dll_sts2 = 32'hF80061D4; +parameter val_ddrc__phy_dll_sts2 = 32'h00000000; +parameter mask_ddrc__phy_dll_sts2 = 32'h07FFFFFF; + +parameter ddrc__phy_dll_sts3 = 32'hF80061D8; +parameter val_ddrc__phy_dll_sts3 = 32'h00000000; +parameter mask_ddrc__phy_dll_sts3 = 32'h07FFFFFF; + +parameter ddrc__dll_lock_sts = 32'hF80061E0; +parameter val_ddrc__dll_lock_sts = 32'h00000000; +parameter mask_ddrc__dll_lock_sts = 32'h00FFFFFF; + +parameter ddrc__phy_ctrl_sts = 32'hF80061E4; +parameter val_ddrc__phy_ctrl_sts = 32'h00000000; +parameter mask_ddrc__phy_ctrl_sts = 32'h3FF80000; + +parameter ddrc__phy_ctrl_sts_reg2 = 32'hF80061E8; +parameter val_ddrc__phy_ctrl_sts_reg2 = 32'h00000000; +parameter mask_ddrc__phy_ctrl_sts_reg2 = 32'h07FFFFFF; + +parameter ddrc__axi_id = 32'hF8006200; +parameter val_ddrc__axi_id = 32'h00153042; +parameter mask_ddrc__axi_id = 32'h03FFFFFF; + +parameter ddrc__page_mask = 32'hF8006204; +parameter val_ddrc__page_mask = 32'h00000000; +parameter mask_ddrc__page_mask = 32'hFFFFFFFF; + +parameter ddrc__axi_priority_wr_port0 = 32'hF8006208; +parameter val_ddrc__axi_priority_wr_port0 = 32'h000803FF; +parameter mask_ddrc__axi_priority_wr_port0 = 32'h000FFFFF; + +parameter ddrc__axi_priority_wr_port1 = 32'hF800620C; +parameter val_ddrc__axi_priority_wr_port1 = 32'h000803FF; +parameter mask_ddrc__axi_priority_wr_port1 = 32'h000FFFFF; + +parameter ddrc__axi_priority_wr_port2 = 32'hF8006210; +parameter val_ddrc__axi_priority_wr_port2 = 32'h000803FF; +parameter mask_ddrc__axi_priority_wr_port2 = 32'h000FFFFF; + +parameter ddrc__axi_priority_wr_port3 = 32'hF8006214; +parameter val_ddrc__axi_priority_wr_port3 = 32'h000803FF; +parameter mask_ddrc__axi_priority_wr_port3 = 32'h000FFFFF; + +parameter ddrc__axi_priority_rd_port0 = 32'hF8006218; +parameter val_ddrc__axi_priority_rd_port0 = 32'h000003FF; +parameter mask_ddrc__axi_priority_rd_port0 = 32'h000FFFFF; + +parameter ddrc__axi_priority_rd_port1 = 32'hF800621C; +parameter val_ddrc__axi_priority_rd_port1 = 32'h000003FF; +parameter mask_ddrc__axi_priority_rd_port1 = 32'h000FFFFF; + +parameter ddrc__axi_priority_rd_port2 = 32'hF8006220; +parameter val_ddrc__axi_priority_rd_port2 = 32'h000003FF; +parameter mask_ddrc__axi_priority_rd_port2 = 32'h000FFFFF; + +parameter ddrc__axi_priority_rd_port3 = 32'hF8006224; +parameter val_ddrc__axi_priority_rd_port3 = 32'h000003FF; +parameter mask_ddrc__axi_priority_rd_port3 = 32'h000FFFFF; + +parameter ddrc__AHB_priority_cfg0 = 32'hF8006248; +parameter val_ddrc__AHB_priority_cfg0 = 32'h000003FF; +parameter mask_ddrc__AHB_priority_cfg0 = 32'h000FFFFF; + +parameter ddrc__AHB_priority_cfg1 = 32'hF800624C; +parameter val_ddrc__AHB_priority_cfg1 = 32'h000003FF; +parameter mask_ddrc__AHB_priority_cfg1 = 32'h000FFFFF; + +parameter ddrc__AHB_priority_cfg2 = 32'hF8006250; +parameter val_ddrc__AHB_priority_cfg2 = 32'h000003FF; +parameter mask_ddrc__AHB_priority_cfg2 = 32'h000FFFFF; + +parameter ddrc__AHB_priority_cfg3 = 32'hF8006254; +parameter val_ddrc__AHB_priority_cfg3 = 32'h000003FF; +parameter mask_ddrc__AHB_priority_cfg3 = 32'h000FFFFF; + +parameter ddrc__perf_mon0 = 32'hF8006260; +parameter val_ddrc__perf_mon0 = 32'h00000000; +parameter mask_ddrc__perf_mon0 = 32'h7FFFFFFF; + +parameter ddrc__perf_mon1 = 32'hF8006264; +parameter val_ddrc__perf_mon1 = 32'h00000000; +parameter mask_ddrc__perf_mon1 = 32'h7FFFFFFF; + +parameter ddrc__perf_mon2 = 32'hF8006268; +parameter val_ddrc__perf_mon2 = 32'h00000000; +parameter mask_ddrc__perf_mon2 = 32'h7FFFFFFF; + +parameter ddrc__perf_mon3 = 32'hF800626C; +parameter val_ddrc__perf_mon3 = 32'h00000000; +parameter mask_ddrc__perf_mon3 = 32'h7FFFFFFF; + +parameter ddrc__perf_mon20 = 32'hF8006270; +parameter val_ddrc__perf_mon20 = 32'h00000000; +parameter mask_ddrc__perf_mon20 = 32'hFFFFFFFF; + +parameter ddrc__perf_mon21 = 32'hF8006274; +parameter val_ddrc__perf_mon21 = 32'h00000000; +parameter mask_ddrc__perf_mon21 = 32'hFFFFFFFF; + +parameter ddrc__perf_mon22 = 32'hF8006278; +parameter val_ddrc__perf_mon22 = 32'h00000000; +parameter mask_ddrc__perf_mon22 = 32'hFFFFFFFF; + +parameter ddrc__perf_mon23 = 32'hF800627C; +parameter val_ddrc__perf_mon23 = 32'h00000000; +parameter mask_ddrc__perf_mon23 = 32'hFFFFFFFF; + +parameter ddrc__perf_mon30 = 32'hF8006280; +parameter val_ddrc__perf_mon30 = 32'h00000000; +parameter mask_ddrc__perf_mon30 = 32'h0000FFFF; + +parameter ddrc__perf_mon31 = 32'hF8006284; +parameter val_ddrc__perf_mon31 = 32'h00000000; +parameter mask_ddrc__perf_mon31 = 32'h0000FFFF; + +parameter ddrc__perf_mon32 = 32'hF8006288; +parameter val_ddrc__perf_mon32 = 32'h00000000; +parameter mask_ddrc__perf_mon32 = 32'h0000FFFF; + +parameter ddrc__perf_mon33 = 32'hF800628C; +parameter val_ddrc__perf_mon33 = 32'h00000000; +parameter mask_ddrc__perf_mon33 = 32'h0000FFFF; + +parameter ddrc__trusted_mem_cfg = 32'hF8006290; +parameter val_ddrc__trusted_mem_cfg = 32'h00000000; +parameter mask_ddrc__trusted_mem_cfg = 32'h0000FFFF; + +parameter ddrc__excl_access_cfg0 = 32'hF8006294; +parameter val_ddrc__excl_access_cfg0 = 32'h00000000; +parameter mask_ddrc__excl_access_cfg0 = 32'h0003FFFF; + +parameter ddrc__excl_access_cfg1 = 32'hF8006298; +parameter val_ddrc__excl_access_cfg1 = 32'h00000000; +parameter mask_ddrc__excl_access_cfg1 = 32'h0003FFFF; + +parameter ddrc__excl_access_cfg2 = 32'hF800629C; +parameter val_ddrc__excl_access_cfg2 = 32'h00000000; +parameter mask_ddrc__excl_access_cfg2 = 32'h0003FFFF; + +parameter ddrc__excl_access_cfg3 = 32'hF80062A0; +parameter val_ddrc__excl_access_cfg3 = 32'h00000000; +parameter mask_ddrc__excl_access_cfg3 = 32'h0003FFFF; + +parameter ddrc__mode_reg_read = 32'hF80062A4; +parameter val_ddrc__mode_reg_read = 32'h00000000; +parameter mask_ddrc__mode_reg_read = 32'hFFFFFFFF; + +parameter ddrc__lpddr_ctrl0 = 32'hF80062A8; +parameter val_ddrc__lpddr_ctrl0 = 32'h00000000; +parameter mask_ddrc__lpddr_ctrl0 = 32'h00000FFF; + +parameter ddrc__lpddr_ctrl1 = 32'hF80062AC; +parameter val_ddrc__lpddr_ctrl1 = 32'h00000000; +parameter mask_ddrc__lpddr_ctrl1 = 32'hFFFFFFFF; + +parameter ddrc__lpddr_ctrl2 = 32'hF80062B0; +parameter val_ddrc__lpddr_ctrl2 = 32'h003C0015; +parameter mask_ddrc__lpddr_ctrl2 = 32'h003FFFFF; + +parameter ddrc__lpddr_ctrl3 = 32'hF80062B4; +parameter val_ddrc__lpddr_ctrl3 = 32'h00000601; +parameter mask_ddrc__lpddr_ctrl3 = 32'h0003FFFF; + +parameter ddrc__phy_wr_lvl_fsm = 32'hF80062B8; +parameter val_ddrc__phy_wr_lvl_fsm = 32'h00004444; +parameter mask_ddrc__phy_wr_lvl_fsm = 32'h00007FFF; + +parameter ddrc__phy_rd_lvl_fsm = 32'hF80062BC; +parameter val_ddrc__phy_rd_lvl_fsm = 32'h00008888; +parameter mask_ddrc__phy_rd_lvl_fsm = 32'h0000FFFF; + +parameter ddrc__phy_gate_lvl_fsm = 32'hF80062C0; +parameter val_ddrc__phy_gate_lvl_fsm = 32'h00004444; +parameter mask_ddrc__phy_gate_lvl_fsm = 32'h00007FFF; + + +// ************************************************************ +// Module debug_axim axim +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_axim__GLOBAL_CTRL = 32'hF880C000; +parameter val_debug_axim__GLOBAL_CTRL = 32'h00000002; +parameter mask_debug_axim__GLOBAL_CTRL = 32'h00000003; + +parameter debug_axim__GLOBAL_STATUS = 32'hF880C004; +parameter val_debug_axim__GLOBAL_STATUS = 32'h00001000; +parameter mask_debug_axim__GLOBAL_STATUS = 32'h00001FC3; + +parameter debug_axim__FILTER_CTRL = 32'hF880C010; +parameter val_debug_axim__FILTER_CTRL = 32'h00000000; +parameter mask_debug_axim__FILTER_CTRL = 32'h0000007F; + +parameter debug_axim__TRIGGER_CTRL = 32'hF880C020; +parameter val_debug_axim__TRIGGER_CTRL = 32'h00000000; +parameter mask_debug_axim__TRIGGER_CTRL = 32'h0000FFFF; + +parameter debug_axim__TRIGGER_STATUS = 32'hF880C024; +parameter val_debug_axim__TRIGGER_STATUS = 32'h00000000; +parameter mask_debug_axim__TRIGGER_STATUS = 32'h00000003; + +parameter debug_axim__PACKET_CTRL = 32'hF880C030; +parameter val_debug_axim__PACKET_CTRL = 32'h00070000; +parameter mask_debug_axim__PACKET_CTRL = 32'h0007FFFF; + +parameter debug_axim__TOUT_CTRL = 32'hF880C040; +parameter val_debug_axim__TOUT_CTRL = 32'h00000000; +parameter mask_debug_axim__TOUT_CTRL = 32'h0000007F; + +parameter debug_axim__TOUT_THRESH = 32'hF880C044; +parameter val_debug_axim__TOUT_THRESH = 32'h00008000; +parameter mask_debug_axim__TOUT_THRESH = 32'hFFFFFFFF; + +parameter debug_axim__FIFO_CURRENT = 32'hF880C050; +parameter val_debug_axim__FIFO_CURRENT = 32'h80000000; +parameter mask_debug_axim__FIFO_CURRENT = 32'hFFFFFFFF; + +parameter debug_axim__FIFO_HYSTER = 32'hF880C054; +parameter val_debug_axim__FIFO_HYSTER = 32'h00000100; +parameter mask_debug_axim__FIFO_HYSTER = 32'h000003FF; + +parameter debug_axim__SYNC_CURRENT = 32'hF880C060; +parameter val_debug_axim__SYNC_CURRENT = 32'h00000000; +parameter mask_debug_axim__SYNC_CURRENT = 32'h00000FFF; + +parameter debug_axim__SYNC_RELOAD = 32'hF880C064; +parameter val_debug_axim__SYNC_RELOAD = 32'h00000800; +parameter mask_debug_axim__SYNC_RELOAD = 32'h00000FFF; + +parameter debug_axim__TSTMP_CURRENT = 32'hF880C070; +parameter val_debug_axim__TSTMP_CURRENT = 32'h00000000; +parameter mask_debug_axim__TSTMP_CURRENT = 32'h00000000; + +parameter debug_axim__ADDR0_MASK = 32'hF880C200; +parameter val_debug_axim__ADDR0_MASK = 32'h7FFFFFFC; +parameter mask_debug_axim__ADDR0_MASK = 32'h7FFFFFFF; + +parameter debug_axim__ADDR0_LOWER = 32'hF880C204; +parameter val_debug_axim__ADDR0_LOWER = 32'h00000000; +parameter mask_debug_axim__ADDR0_LOWER = 32'h7FFFFFFF; + +parameter debug_axim__ADDR0_UPPER = 32'hF880C208; +parameter val_debug_axim__ADDR0_UPPER = 32'h7FFFFFFC; +parameter mask_debug_axim__ADDR0_UPPER = 32'h7FFFFFFF; + +parameter debug_axim__ADDR0_MISC = 32'hF880C20C; +parameter val_debug_axim__ADDR0_MISC = 32'h00000000; +parameter mask_debug_axim__ADDR0_MISC = 32'h00007FFF; + +parameter debug_axim__ADDR1_MASK = 32'hF880C210; +parameter val_debug_axim__ADDR1_MASK = 32'h7FFFFFFC; +parameter mask_debug_axim__ADDR1_MASK = 32'h7FFFFFFF; + +parameter debug_axim__ADDR1_LOWER = 32'hF880C214; +parameter val_debug_axim__ADDR1_LOWER = 32'h00000000; +parameter mask_debug_axim__ADDR1_LOWER = 32'h7FFFFFFF; + +parameter debug_axim__ADDR1_UPPER = 32'hF880C218; +parameter val_debug_axim__ADDR1_UPPER = 32'h7FFFFFFC; +parameter mask_debug_axim__ADDR1_UPPER = 32'h7FFFFFFF; + +parameter debug_axim__ADDR1_MISC = 32'hF880C21C; +parameter val_debug_axim__ADDR1_MISC = 32'h00000000; +parameter mask_debug_axim__ADDR1_MISC = 32'h00007FFF; + +parameter debug_axim__ADDR2_MASK = 32'hF880C220; +parameter val_debug_axim__ADDR2_MASK = 32'h7FFFFFFC; +parameter mask_debug_axim__ADDR2_MASK = 32'h7FFFFFFF; + +parameter debug_axim__ADDR2_LOWER = 32'hF880C224; +parameter val_debug_axim__ADDR2_LOWER = 32'h00000000; +parameter mask_debug_axim__ADDR2_LOWER = 32'h7FFFFFFF; + +parameter debug_axim__ADDR2_UPPER = 32'hF880C228; +parameter val_debug_axim__ADDR2_UPPER = 32'h7FFFFFFC; +parameter mask_debug_axim__ADDR2_UPPER = 32'h7FFFFFFF; + +parameter debug_axim__ADDR2_MISC = 32'hF880C22C; +parameter val_debug_axim__ADDR2_MISC = 32'h00000000; +parameter mask_debug_axim__ADDR2_MISC = 32'h00007FFF; + +parameter debug_axim__ADDR3_MASK = 32'hF880C230; +parameter val_debug_axim__ADDR3_MASK = 32'h7FFFFFFC; +parameter mask_debug_axim__ADDR3_MASK = 32'h7FFFFFFF; + +parameter debug_axim__ADDR3_LOWER = 32'hF880C234; +parameter val_debug_axim__ADDR3_LOWER = 32'h00000000; +parameter mask_debug_axim__ADDR3_LOWER = 32'h7FFFFFFF; + +parameter debug_axim__ADDR3_UPPER = 32'hF880C238; +parameter val_debug_axim__ADDR3_UPPER = 32'h7FFFFFFC; +parameter mask_debug_axim__ADDR3_UPPER = 32'h7FFFFFFF; + +parameter debug_axim__ADDR3_MISC = 32'hF880C23C; +parameter val_debug_axim__ADDR3_MISC = 32'h00000000; +parameter mask_debug_axim__ADDR3_MISC = 32'h00007FFF; + +parameter debug_axim__ID0_MASK = 32'hF880C300; +parameter val_debug_axim__ID0_MASK = 32'h000003FF; +parameter mask_debug_axim__ID0_MASK = 32'h000003FF; + +parameter debug_axim__ID0_LOWER = 32'hF880C304; +parameter val_debug_axim__ID0_LOWER = 32'h00000000; +parameter mask_debug_axim__ID0_LOWER = 32'h000003FF; + +parameter debug_axim__ID0_UPPER = 32'hF880C308; +parameter val_debug_axim__ID0_UPPER = 32'h000003FF; +parameter mask_debug_axim__ID0_UPPER = 32'h000003FF; + +parameter debug_axim__ID0_MISC = 32'hF880C30C; +parameter val_debug_axim__ID0_MISC = 32'h00000000; +parameter mask_debug_axim__ID0_MISC = 32'h00003FFF; + +parameter debug_axim__ID1_MASK = 32'hF880C310; +parameter val_debug_axim__ID1_MASK = 32'h000003FF; +parameter mask_debug_axim__ID1_MASK = 32'h000003FF; + +parameter debug_axim__ID1_LOWER = 32'hF880C314; +parameter val_debug_axim__ID1_LOWER = 32'h00000000; +parameter mask_debug_axim__ID1_LOWER = 32'h000003FF; + +parameter debug_axim__ID1_UPPER = 32'hF880C318; +parameter val_debug_axim__ID1_UPPER = 32'h000003FF; +parameter mask_debug_axim__ID1_UPPER = 32'h000003FF; + +parameter debug_axim__ID1_MISC = 32'hF880C31C; +parameter val_debug_axim__ID1_MISC = 32'h00000000; +parameter mask_debug_axim__ID1_MISC = 32'h00003FFF; + +parameter debug_axim__ID2_MASK = 32'hF880C320; +parameter val_debug_axim__ID2_MASK = 32'h000003FF; +parameter mask_debug_axim__ID2_MASK = 32'h000003FF; + +parameter debug_axim__ID2_LOWER = 32'hF880C324; +parameter val_debug_axim__ID2_LOWER = 32'h00000000; +parameter mask_debug_axim__ID2_LOWER = 32'h000003FF; + +parameter debug_axim__ID2_UPPER = 32'hF880C328; +parameter val_debug_axim__ID2_UPPER = 32'h000003FF; +parameter mask_debug_axim__ID2_UPPER = 32'h000003FF; + +parameter debug_axim__ID2_MISC = 32'hF880C32C; +parameter val_debug_axim__ID2_MISC = 32'h00000000; +parameter mask_debug_axim__ID2_MISC = 32'h00003FFF; + +parameter debug_axim__ID3_MASK = 32'hF880C330; +parameter val_debug_axim__ID3_MASK = 32'h000003FF; +parameter mask_debug_axim__ID3_MASK = 32'h000003FF; + +parameter debug_axim__ID3_LOWER = 32'hF880C334; +parameter val_debug_axim__ID3_LOWER = 32'h00000000; +parameter mask_debug_axim__ID3_LOWER = 32'h000003FF; + +parameter debug_axim__ID3_UPPER = 32'hF880C338; +parameter val_debug_axim__ID3_UPPER = 32'h000003FF; +parameter mask_debug_axim__ID3_UPPER = 32'h000003FF; + +parameter debug_axim__ID3_MISC = 32'hF880C33C; +parameter val_debug_axim__ID3_MISC = 32'h00000000; +parameter mask_debug_axim__ID3_MISC = 32'h00003FFF; + +parameter debug_axim__AXI_SEL = 32'hF880C800; +parameter val_debug_axim__AXI_SEL = 32'h00000000; +parameter mask_debug_axim__AXI_SEL = 32'h00000007; + +parameter debug_axim__IT_TRIGOUT = 32'hF880CED0; +parameter val_debug_axim__IT_TRIGOUT = 32'h00000000; +parameter mask_debug_axim__IT_TRIGOUT = 32'h00000001; + +parameter debug_axim__IT_TRIGOUTACK = 32'hF880CED4; +parameter val_debug_axim__IT_TRIGOUTACK = 32'h00000000; +parameter mask_debug_axim__IT_TRIGOUTACK = 32'h00000000; + +parameter debug_axim__IT_TRIGIN = 32'hF880CED8; +parameter val_debug_axim__IT_TRIGIN = 32'h00000000; +parameter mask_debug_axim__IT_TRIGIN = 32'h00000000; + +parameter debug_axim__IT_TRIGINACK = 32'hF880CEDC; +parameter val_debug_axim__IT_TRIGINACK = 32'h00000000; +parameter mask_debug_axim__IT_TRIGINACK = 32'h00000001; + +parameter debug_axim__IT_ATBDATA = 32'hF880CEEC; +parameter val_debug_axim__IT_ATBDATA = 32'h00000000; +parameter mask_debug_axim__IT_ATBDATA = 32'h0000001F; + +parameter debug_axim__IT_ATBSTATUS = 32'hF880CEF0; +parameter val_debug_axim__IT_ATBSTATUS = 32'h00000000; +parameter mask_debug_axim__IT_ATBSTATUS = 32'h00000000; + +parameter debug_axim__IT_ATBCTRL1 = 32'hF880CEF4; +parameter val_debug_axim__IT_ATBCTRL1 = 32'h00000000; +parameter mask_debug_axim__IT_ATBCTRL1 = 32'h0000007F; + +parameter debug_axim__IT_ATBCTRL0 = 32'hF880CEF8; +parameter val_debug_axim__IT_ATBCTRL0 = 32'h00000000; +parameter mask_debug_axim__IT_ATBCTRL0 = 32'h000003FF; + +parameter debug_axim__IT_CTRL = 32'hF880CF00; +parameter val_debug_axim__IT_CTRL = 32'h00000000; +parameter mask_debug_axim__IT_CTRL = 32'h00000001; + +parameter debug_axim__CLAIM_SET = 32'hF880CFA0; +parameter val_debug_axim__CLAIM_SET = 32'h00000001; +parameter mask_debug_axim__CLAIM_SET = 32'h0000000F; + +parameter debug_axim__CLAIM_CLEAR = 32'hF880CFA4; +parameter val_debug_axim__CLAIM_CLEAR = 32'h00000000; +parameter mask_debug_axim__CLAIM_CLEAR = 32'h0000000F; + +parameter debug_axim__LOCK_ACCESS = 32'hF880CFB0; +parameter val_debug_axim__LOCK_ACCESS = 32'h00000000; +parameter mask_debug_axim__LOCK_ACCESS = 32'hFFFFFFFF; + +parameter debug_axim__LOCK_STATUS = 32'hF880CFB4; +parameter val_debug_axim__LOCK_STATUS = 32'h00000003; +parameter mask_debug_axim__LOCK_STATUS = 32'h00000007; + +parameter debug_axim__AUTH_STATUS = 32'hF880CFB8; +parameter val_debug_axim__AUTH_STATUS = 32'h00000000; +parameter mask_debug_axim__AUTH_STATUS = 32'h00000033; + +parameter debug_axim__DEV_ID = 32'hF880CFC8; +parameter val_debug_axim__DEV_ID = 32'h00000000; +parameter mask_debug_axim__DEV_ID = 32'hFFFFFFFF; + +parameter debug_axim__DEV_TYPE = 32'hF880CFCC; +parameter val_debug_axim__DEV_TYPE = 32'h00000043; +parameter mask_debug_axim__DEV_TYPE = 32'hFFFFFFFF; + +parameter debug_axim__PERIPHID4 = 32'hF880CFD0; +parameter val_debug_axim__PERIPHID4 = 32'h00000003; +parameter mask_debug_axim__PERIPHID4 = 32'hFFFFFFFF; + +parameter debug_axim__PERIPHID5 = 32'hF880CFD4; +parameter val_debug_axim__PERIPHID5 = 32'h00000000; +parameter mask_debug_axim__PERIPHID5 = 32'hFFFFFFFF; + +parameter debug_axim__PERIPHID6 = 32'hF880CFD8; +parameter val_debug_axim__PERIPHID6 = 32'h00000000; +parameter mask_debug_axim__PERIPHID6 = 32'hFFFFFFFF; + +parameter debug_axim__PERIPHID7 = 32'hF880CFDC; +parameter val_debug_axim__PERIPHID7 = 32'h00000000; +parameter mask_debug_axim__PERIPHID7 = 32'hFFFFFFFF; + +parameter debug_axim__PERIPHID0 = 32'hF880CFE0; +parameter val_debug_axim__PERIPHID0 = 32'h000000B2; +parameter mask_debug_axim__PERIPHID0 = 32'hFFFFFFFF; + +parameter debug_axim__PERIPHID1 = 32'hF880CFE4; +parameter val_debug_axim__PERIPHID1 = 32'h00000093; +parameter mask_debug_axim__PERIPHID1 = 32'hFFFFFFFF; + +parameter debug_axim__PERIPHID2 = 32'hF880CFE8; +parameter val_debug_axim__PERIPHID2 = 32'h00000008; +parameter mask_debug_axim__PERIPHID2 = 32'hFFFFFFFF; + +parameter debug_axim__PERIPHID3 = 32'hF880CFEC; +parameter val_debug_axim__PERIPHID3 = 32'h00000002; +parameter mask_debug_axim__PERIPHID3 = 32'hFFFFFFFF; + +parameter debug_axim__COMPID0 = 32'hF880CFF0; +parameter val_debug_axim__COMPID0 = 32'h0000000D; +parameter mask_debug_axim__COMPID0 = 32'hFFFFFFFF; + +parameter debug_axim__COMPID1 = 32'hF880CFF4; +parameter val_debug_axim__COMPID1 = 32'h00000090; +parameter mask_debug_axim__COMPID1 = 32'hFFFFFFFF; + +parameter debug_axim__COMPID2 = 32'hF880CFF8; +parameter val_debug_axim__COMPID2 = 32'h00000005; +parameter mask_debug_axim__COMPID2 = 32'hFFFFFFFF; + +parameter debug_axim__COMPID3 = 32'hF880CFFC; +parameter val_debug_axim__COMPID3 = 32'h000000B1; +parameter mask_debug_axim__COMPID3 = 32'hFFFFFFFF; + + +// ************************************************************ +// Module debug_cpu_cti0 cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_cpu_cti0__CTICONTROL = 32'hF8898000; +parameter val_debug_cpu_cti0__CTICONTROL = 32'h00000000; +parameter mask_debug_cpu_cti0__CTICONTROL = 32'h00000001; + +parameter debug_cpu_cti0__CTIINTACK = 32'hF8898010; +parameter val_debug_cpu_cti0__CTIINTACK = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIINTACK = 32'h000000FF; + +parameter debug_cpu_cti0__CTIAPPSET = 32'hF8898014; +parameter val_debug_cpu_cti0__CTIAPPSET = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIAPPSET = 32'h0000000F; + +parameter debug_cpu_cti0__CTIAPPCLEAR = 32'hF8898018; +parameter val_debug_cpu_cti0__CTIAPPCLEAR = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIAPPCLEAR = 32'h0000000F; + +parameter debug_cpu_cti0__CTIAPPPULSE = 32'hF889801C; +parameter val_debug_cpu_cti0__CTIAPPPULSE = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIAPPPULSE = 32'h0000000F; + +parameter debug_cpu_cti0__CTIINEN0 = 32'hF8898020; +parameter val_debug_cpu_cti0__CTIINEN0 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIINEN0 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIINEN1 = 32'hF8898024; +parameter val_debug_cpu_cti0__CTIINEN1 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIINEN1 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIINEN2 = 32'hF8898028; +parameter val_debug_cpu_cti0__CTIINEN2 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIINEN2 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIINEN3 = 32'hF889802C; +parameter val_debug_cpu_cti0__CTIINEN3 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIINEN3 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIINEN4 = 32'hF8898030; +parameter val_debug_cpu_cti0__CTIINEN4 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIINEN4 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIINEN5 = 32'hF8898034; +parameter val_debug_cpu_cti0__CTIINEN5 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIINEN5 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIINEN6 = 32'hF8898038; +parameter val_debug_cpu_cti0__CTIINEN6 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIINEN6 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIINEN7 = 32'hF889803C; +parameter val_debug_cpu_cti0__CTIINEN7 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIINEN7 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIOUTEN0 = 32'hF88980A0; +parameter val_debug_cpu_cti0__CTIOUTEN0 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIOUTEN0 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIOUTEN1 = 32'hF88980A4; +parameter val_debug_cpu_cti0__CTIOUTEN1 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIOUTEN1 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIOUTEN2 = 32'hF88980A8; +parameter val_debug_cpu_cti0__CTIOUTEN2 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIOUTEN2 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIOUTEN3 = 32'hF88980AC; +parameter val_debug_cpu_cti0__CTIOUTEN3 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIOUTEN3 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIOUTEN4 = 32'hF88980B0; +parameter val_debug_cpu_cti0__CTIOUTEN4 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIOUTEN4 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIOUTEN5 = 32'hF88980B4; +parameter val_debug_cpu_cti0__CTIOUTEN5 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIOUTEN5 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIOUTEN6 = 32'hF88980B8; +parameter val_debug_cpu_cti0__CTIOUTEN6 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIOUTEN6 = 32'h0000000F; + +parameter debug_cpu_cti0__CTIOUTEN7 = 32'hF88980BC; +parameter val_debug_cpu_cti0__CTIOUTEN7 = 32'h00000000; +parameter mask_debug_cpu_cti0__CTIOUTEN7 = 32'h0000000F; + +parameter debug_cpu_cti0__CTITRIGINSTATUS = 32'hF8898130; +parameter val_debug_cpu_cti0__CTITRIGINSTATUS = 32'h00000000; +parameter mask_debug_cpu_cti0__CTITRIGINSTATUS = 32'h00000000; + +parameter debug_cpu_cti0__CTITRIGOUTSTATUS = 32'hF8898134; +parameter val_debug_cpu_cti0__CTITRIGOUTSTATUS = 32'h00000000; +parameter mask_debug_cpu_cti0__CTITRIGOUTSTATUS = 32'h000000FF; + +parameter debug_cpu_cti0__CTICHINSTATUS = 32'hF8898138; +parameter val_debug_cpu_cti0__CTICHINSTATUS = 32'h00000000; +parameter mask_debug_cpu_cti0__CTICHINSTATUS = 32'h00000000; + +parameter debug_cpu_cti0__CTICHOUTSTATUS = 32'hF889813C; +parameter val_debug_cpu_cti0__CTICHOUTSTATUS = 32'h00000000; +parameter mask_debug_cpu_cti0__CTICHOUTSTATUS = 32'h0000000F; + +parameter debug_cpu_cti0__CTIGATE = 32'hF8898140; +parameter val_debug_cpu_cti0__CTIGATE = 32'h0000000F; +parameter mask_debug_cpu_cti0__CTIGATE = 32'h0000000F; + +parameter debug_cpu_cti0__ASICCTL = 32'hF8898144; +parameter val_debug_cpu_cti0__ASICCTL = 32'h00000000; +parameter mask_debug_cpu_cti0__ASICCTL = 32'h000000FF; + +parameter debug_cpu_cti0__ITCHINACK = 32'hF8898EDC; +parameter val_debug_cpu_cti0__ITCHINACK = 32'h00000000; +parameter mask_debug_cpu_cti0__ITCHINACK = 32'h0000000F; + +parameter debug_cpu_cti0__ITTRIGINACK = 32'hF8898EE0; +parameter val_debug_cpu_cti0__ITTRIGINACK = 32'h00000000; +parameter mask_debug_cpu_cti0__ITTRIGINACK = 32'h000000FF; + +parameter debug_cpu_cti0__ITCHOUT = 32'hF8898EE4; +parameter val_debug_cpu_cti0__ITCHOUT = 32'h00000000; +parameter mask_debug_cpu_cti0__ITCHOUT = 32'h0000000F; + +parameter debug_cpu_cti0__ITTRIGOUT = 32'hF8898EE8; +parameter val_debug_cpu_cti0__ITTRIGOUT = 32'h00000000; +parameter mask_debug_cpu_cti0__ITTRIGOUT = 32'h000000FF; + +parameter debug_cpu_cti0__ITCHOUTACK = 32'hF8898EEC; +parameter val_debug_cpu_cti0__ITCHOUTACK = 32'h00000000; +parameter mask_debug_cpu_cti0__ITCHOUTACK = 32'h0000000F; + +parameter debug_cpu_cti0__ITTRIGOUTACK = 32'hF8898EF0; +parameter val_debug_cpu_cti0__ITTRIGOUTACK = 32'h00000000; +parameter mask_debug_cpu_cti0__ITTRIGOUTACK = 32'h000000FF; + +parameter debug_cpu_cti0__ITCHIN = 32'hF8898EF4; +parameter val_debug_cpu_cti0__ITCHIN = 32'h00000000; +parameter mask_debug_cpu_cti0__ITCHIN = 32'h0000000F; + +parameter debug_cpu_cti0__ITTRIGIN = 32'hF8898EF8; +parameter val_debug_cpu_cti0__ITTRIGIN = 32'h00000000; +parameter mask_debug_cpu_cti0__ITTRIGIN = 32'h000000FF; + +parameter debug_cpu_cti0__ITCTRL = 32'hF8898F00; +parameter val_debug_cpu_cti0__ITCTRL = 32'h00000000; +parameter mask_debug_cpu_cti0__ITCTRL = 32'h00000001; + +parameter debug_cpu_cti0__CTSR = 32'hF8898FA0; +parameter val_debug_cpu_cti0__CTSR = 32'h0000000F; +parameter mask_debug_cpu_cti0__CTSR = 32'h0000000F; + +parameter debug_cpu_cti0__CTCR = 32'hF8898FA4; +parameter val_debug_cpu_cti0__CTCR = 32'h00000000; +parameter mask_debug_cpu_cti0__CTCR = 32'h0000000F; + +parameter debug_cpu_cti0__LAR = 32'hF8898FB0; +parameter val_debug_cpu_cti0__LAR = 32'h00000000; +parameter mask_debug_cpu_cti0__LAR = 32'hFFFFFFFF; + +parameter debug_cpu_cti0__LSR = 32'hF8898FB4; +parameter val_debug_cpu_cti0__LSR = 32'h00000003; +parameter mask_debug_cpu_cti0__LSR = 32'h00000007; + +parameter debug_cpu_cti0__ASR = 32'hF8898FB8; +parameter val_debug_cpu_cti0__ASR = 32'h00000005; +parameter mask_debug_cpu_cti0__ASR = 32'h00000005; + +parameter debug_cpu_cti0__DEVID = 32'hF8898FC8; +parameter val_debug_cpu_cti0__DEVID = 32'h00040800; +parameter mask_debug_cpu_cti0__DEVID = 32'h000FFFFF; + +parameter debug_cpu_cti0__DTIR = 32'hF8898FCC; +parameter val_debug_cpu_cti0__DTIR = 32'h00000014; +parameter mask_debug_cpu_cti0__DTIR = 32'h000000FF; + +parameter debug_cpu_cti0__PERIPHID4 = 32'hF8898FD0; +parameter val_debug_cpu_cti0__PERIPHID4 = 32'h00000004; +parameter mask_debug_cpu_cti0__PERIPHID4 = 32'h000000FF; + +parameter debug_cpu_cti0__PERIPHID5 = 32'hF8898FD4; +parameter val_debug_cpu_cti0__PERIPHID5 = 32'h00000000; +parameter mask_debug_cpu_cti0__PERIPHID5 = 32'h000000FF; + +parameter debug_cpu_cti0__PERIPHID6 = 32'hF8898FD8; +parameter val_debug_cpu_cti0__PERIPHID6 = 32'h00000000; +parameter mask_debug_cpu_cti0__PERIPHID6 = 32'h000000FF; + +parameter debug_cpu_cti0__PERIPHID7 = 32'hF8898FDC; +parameter val_debug_cpu_cti0__PERIPHID7 = 32'h00000000; +parameter mask_debug_cpu_cti0__PERIPHID7 = 32'h000000FF; + +parameter debug_cpu_cti0__PERIPHID0 = 32'hF8898FE0; +parameter val_debug_cpu_cti0__PERIPHID0 = 32'h00000006; +parameter mask_debug_cpu_cti0__PERIPHID0 = 32'h000000FF; + +parameter debug_cpu_cti0__PERIPHID1 = 32'hF8898FE4; +parameter val_debug_cpu_cti0__PERIPHID1 = 32'h000000B9; +parameter mask_debug_cpu_cti0__PERIPHID1 = 32'h000000FF; + +parameter debug_cpu_cti0__PERIPHID2 = 32'hF8898FE8; +parameter val_debug_cpu_cti0__PERIPHID2 = 32'h0000002B; +parameter mask_debug_cpu_cti0__PERIPHID2 = 32'h000000FF; + +parameter debug_cpu_cti0__PERIPHID3 = 32'hF8898FEC; +parameter val_debug_cpu_cti0__PERIPHID3 = 32'h00000000; +parameter mask_debug_cpu_cti0__PERIPHID3 = 32'h000000FF; + +parameter debug_cpu_cti0__COMPID0 = 32'hF8898FF0; +parameter val_debug_cpu_cti0__COMPID0 = 32'h0000000D; +parameter mask_debug_cpu_cti0__COMPID0 = 32'h000000FF; + +parameter debug_cpu_cti0__COMPID1 = 32'hF8898FF4; +parameter val_debug_cpu_cti0__COMPID1 = 32'h00000090; +parameter mask_debug_cpu_cti0__COMPID1 = 32'h000000FF; + +parameter debug_cpu_cti0__COMPID2 = 32'hF8898FF8; +parameter val_debug_cpu_cti0__COMPID2 = 32'h00000005; +parameter mask_debug_cpu_cti0__COMPID2 = 32'h000000FF; + +parameter debug_cpu_cti0__COMPID3 = 32'hF8898FFC; +parameter val_debug_cpu_cti0__COMPID3 = 32'h000000B1; +parameter mask_debug_cpu_cti0__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_cpu_cti1 cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_cpu_cti1__CTICONTROL = 32'hF8899000; +parameter val_debug_cpu_cti1__CTICONTROL = 32'h00000000; +parameter mask_debug_cpu_cti1__CTICONTROL = 32'h00000001; + +parameter debug_cpu_cti1__CTIINTACK = 32'hF8899010; +parameter val_debug_cpu_cti1__CTIINTACK = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIINTACK = 32'h000000FF; + +parameter debug_cpu_cti1__CTIAPPSET = 32'hF8899014; +parameter val_debug_cpu_cti1__CTIAPPSET = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIAPPSET = 32'h0000000F; + +parameter debug_cpu_cti1__CTIAPPCLEAR = 32'hF8899018; +parameter val_debug_cpu_cti1__CTIAPPCLEAR = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIAPPCLEAR = 32'h0000000F; + +parameter debug_cpu_cti1__CTIAPPPULSE = 32'hF889901C; +parameter val_debug_cpu_cti1__CTIAPPPULSE = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIAPPPULSE = 32'h0000000F; + +parameter debug_cpu_cti1__CTIINEN0 = 32'hF8899020; +parameter val_debug_cpu_cti1__CTIINEN0 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIINEN0 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIINEN1 = 32'hF8899024; +parameter val_debug_cpu_cti1__CTIINEN1 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIINEN1 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIINEN2 = 32'hF8899028; +parameter val_debug_cpu_cti1__CTIINEN2 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIINEN2 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIINEN3 = 32'hF889902C; +parameter val_debug_cpu_cti1__CTIINEN3 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIINEN3 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIINEN4 = 32'hF8899030; +parameter val_debug_cpu_cti1__CTIINEN4 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIINEN4 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIINEN5 = 32'hF8899034; +parameter val_debug_cpu_cti1__CTIINEN5 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIINEN5 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIINEN6 = 32'hF8899038; +parameter val_debug_cpu_cti1__CTIINEN6 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIINEN6 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIINEN7 = 32'hF889903C; +parameter val_debug_cpu_cti1__CTIINEN7 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIINEN7 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIOUTEN0 = 32'hF88990A0; +parameter val_debug_cpu_cti1__CTIOUTEN0 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIOUTEN0 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIOUTEN1 = 32'hF88990A4; +parameter val_debug_cpu_cti1__CTIOUTEN1 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIOUTEN1 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIOUTEN2 = 32'hF88990A8; +parameter val_debug_cpu_cti1__CTIOUTEN2 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIOUTEN2 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIOUTEN3 = 32'hF88990AC; +parameter val_debug_cpu_cti1__CTIOUTEN3 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIOUTEN3 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIOUTEN4 = 32'hF88990B0; +parameter val_debug_cpu_cti1__CTIOUTEN4 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIOUTEN4 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIOUTEN5 = 32'hF88990B4; +parameter val_debug_cpu_cti1__CTIOUTEN5 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIOUTEN5 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIOUTEN6 = 32'hF88990B8; +parameter val_debug_cpu_cti1__CTIOUTEN6 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIOUTEN6 = 32'h0000000F; + +parameter debug_cpu_cti1__CTIOUTEN7 = 32'hF88990BC; +parameter val_debug_cpu_cti1__CTIOUTEN7 = 32'h00000000; +parameter mask_debug_cpu_cti1__CTIOUTEN7 = 32'h0000000F; + +parameter debug_cpu_cti1__CTITRIGINSTATUS = 32'hF8899130; +parameter val_debug_cpu_cti1__CTITRIGINSTATUS = 32'h00000000; +parameter mask_debug_cpu_cti1__CTITRIGINSTATUS = 32'h00000000; + +parameter debug_cpu_cti1__CTITRIGOUTSTATUS = 32'hF8899134; +parameter val_debug_cpu_cti1__CTITRIGOUTSTATUS = 32'h00000000; +parameter mask_debug_cpu_cti1__CTITRIGOUTSTATUS = 32'h000000FF; + +parameter debug_cpu_cti1__CTICHINSTATUS = 32'hF8899138; +parameter val_debug_cpu_cti1__CTICHINSTATUS = 32'h00000000; +parameter mask_debug_cpu_cti1__CTICHINSTATUS = 32'h00000000; + +parameter debug_cpu_cti1__CTICHOUTSTATUS = 32'hF889913C; +parameter val_debug_cpu_cti1__CTICHOUTSTATUS = 32'h00000000; +parameter mask_debug_cpu_cti1__CTICHOUTSTATUS = 32'h0000000F; + +parameter debug_cpu_cti1__CTIGATE = 32'hF8899140; +parameter val_debug_cpu_cti1__CTIGATE = 32'h0000000F; +parameter mask_debug_cpu_cti1__CTIGATE = 32'h0000000F; + +parameter debug_cpu_cti1__ASICCTL = 32'hF8899144; +parameter val_debug_cpu_cti1__ASICCTL = 32'h00000000; +parameter mask_debug_cpu_cti1__ASICCTL = 32'h000000FF; + +parameter debug_cpu_cti1__ITCHINACK = 32'hF8899EDC; +parameter val_debug_cpu_cti1__ITCHINACK = 32'h00000000; +parameter mask_debug_cpu_cti1__ITCHINACK = 32'h0000000F; + +parameter debug_cpu_cti1__ITTRIGINACK = 32'hF8899EE0; +parameter val_debug_cpu_cti1__ITTRIGINACK = 32'h00000000; +parameter mask_debug_cpu_cti1__ITTRIGINACK = 32'h000000FF; + +parameter debug_cpu_cti1__ITCHOUT = 32'hF8899EE4; +parameter val_debug_cpu_cti1__ITCHOUT = 32'h00000000; +parameter mask_debug_cpu_cti1__ITCHOUT = 32'h0000000F; + +parameter debug_cpu_cti1__ITTRIGOUT = 32'hF8899EE8; +parameter val_debug_cpu_cti1__ITTRIGOUT = 32'h00000000; +parameter mask_debug_cpu_cti1__ITTRIGOUT = 32'h000000FF; + +parameter debug_cpu_cti1__ITCHOUTACK = 32'hF8899EEC; +parameter val_debug_cpu_cti1__ITCHOUTACK = 32'h00000000; +parameter mask_debug_cpu_cti1__ITCHOUTACK = 32'h0000000F; + +parameter debug_cpu_cti1__ITTRIGOUTACK = 32'hF8899EF0; +parameter val_debug_cpu_cti1__ITTRIGOUTACK = 32'h00000000; +parameter mask_debug_cpu_cti1__ITTRIGOUTACK = 32'h000000FF; + +parameter debug_cpu_cti1__ITCHIN = 32'hF8899EF4; +parameter val_debug_cpu_cti1__ITCHIN = 32'h00000000; +parameter mask_debug_cpu_cti1__ITCHIN = 32'h0000000F; + +parameter debug_cpu_cti1__ITTRIGIN = 32'hF8899EF8; +parameter val_debug_cpu_cti1__ITTRIGIN = 32'h00000000; +parameter mask_debug_cpu_cti1__ITTRIGIN = 32'h000000FF; + +parameter debug_cpu_cti1__ITCTRL = 32'hF8899F00; +parameter val_debug_cpu_cti1__ITCTRL = 32'h00000000; +parameter mask_debug_cpu_cti1__ITCTRL = 32'h00000001; + +parameter debug_cpu_cti1__CTSR = 32'hF8899FA0; +parameter val_debug_cpu_cti1__CTSR = 32'h0000000F; +parameter mask_debug_cpu_cti1__CTSR = 32'h0000000F; + +parameter debug_cpu_cti1__CTCR = 32'hF8899FA4; +parameter val_debug_cpu_cti1__CTCR = 32'h00000000; +parameter mask_debug_cpu_cti1__CTCR = 32'h0000000F; + +parameter debug_cpu_cti1__LAR = 32'hF8899FB0; +parameter val_debug_cpu_cti1__LAR = 32'h00000000; +parameter mask_debug_cpu_cti1__LAR = 32'hFFFFFFFF; + +parameter debug_cpu_cti1__LSR = 32'hF8899FB4; +parameter val_debug_cpu_cti1__LSR = 32'h00000003; +parameter mask_debug_cpu_cti1__LSR = 32'h00000007; + +parameter debug_cpu_cti1__ASR = 32'hF8899FB8; +parameter val_debug_cpu_cti1__ASR = 32'h00000005; +parameter mask_debug_cpu_cti1__ASR = 32'h00000005; + +parameter debug_cpu_cti1__DEVID = 32'hF8899FC8; +parameter val_debug_cpu_cti1__DEVID = 32'h00040800; +parameter mask_debug_cpu_cti1__DEVID = 32'h000FFFFF; + +parameter debug_cpu_cti1__DTIR = 32'hF8899FCC; +parameter val_debug_cpu_cti1__DTIR = 32'h00000014; +parameter mask_debug_cpu_cti1__DTIR = 32'h000000FF; + +parameter debug_cpu_cti1__PERIPHID4 = 32'hF8899FD0; +parameter val_debug_cpu_cti1__PERIPHID4 = 32'h00000004; +parameter mask_debug_cpu_cti1__PERIPHID4 = 32'h000000FF; + +parameter debug_cpu_cti1__PERIPHID5 = 32'hF8899FD4; +parameter val_debug_cpu_cti1__PERIPHID5 = 32'h00000000; +parameter mask_debug_cpu_cti1__PERIPHID5 = 32'h000000FF; + +parameter debug_cpu_cti1__PERIPHID6 = 32'hF8899FD8; +parameter val_debug_cpu_cti1__PERIPHID6 = 32'h00000000; +parameter mask_debug_cpu_cti1__PERIPHID6 = 32'h000000FF; + +parameter debug_cpu_cti1__PERIPHID7 = 32'hF8899FDC; +parameter val_debug_cpu_cti1__PERIPHID7 = 32'h00000000; +parameter mask_debug_cpu_cti1__PERIPHID7 = 32'h000000FF; + +parameter debug_cpu_cti1__PERIPHID0 = 32'hF8899FE0; +parameter val_debug_cpu_cti1__PERIPHID0 = 32'h00000006; +parameter mask_debug_cpu_cti1__PERIPHID0 = 32'h000000FF; + +parameter debug_cpu_cti1__PERIPHID1 = 32'hF8899FE4; +parameter val_debug_cpu_cti1__PERIPHID1 = 32'h000000B9; +parameter mask_debug_cpu_cti1__PERIPHID1 = 32'h000000FF; + +parameter debug_cpu_cti1__PERIPHID2 = 32'hF8899FE8; +parameter val_debug_cpu_cti1__PERIPHID2 = 32'h0000002B; +parameter mask_debug_cpu_cti1__PERIPHID2 = 32'h000000FF; + +parameter debug_cpu_cti1__PERIPHID3 = 32'hF8899FEC; +parameter val_debug_cpu_cti1__PERIPHID3 = 32'h00000000; +parameter mask_debug_cpu_cti1__PERIPHID3 = 32'h000000FF; + +parameter debug_cpu_cti1__COMPID0 = 32'hF8899FF0; +parameter val_debug_cpu_cti1__COMPID0 = 32'h0000000D; +parameter mask_debug_cpu_cti1__COMPID0 = 32'h000000FF; + +parameter debug_cpu_cti1__COMPID1 = 32'hF8899FF4; +parameter val_debug_cpu_cti1__COMPID1 = 32'h00000090; +parameter mask_debug_cpu_cti1__COMPID1 = 32'h000000FF; + +parameter debug_cpu_cti1__COMPID2 = 32'hF8899FF8; +parameter val_debug_cpu_cti1__COMPID2 = 32'h00000005; +parameter mask_debug_cpu_cti1__COMPID2 = 32'h000000FF; + +parameter debug_cpu_cti1__COMPID3 = 32'hF8899FFC; +parameter val_debug_cpu_cti1__COMPID3 = 32'h000000B1; +parameter mask_debug_cpu_cti1__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_cpu_pmu0 cortexa9_pmu +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_cpu_pmu0__PMXEVCNTR0 = 32'hF8891000; +parameter val_debug_cpu_pmu0__PMXEVCNTR0 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVCNTR0 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVCNTR1 = 32'hF8891004; +parameter val_debug_cpu_pmu0__PMXEVCNTR1 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVCNTR1 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVCNTR2 = 32'hF8891008; +parameter val_debug_cpu_pmu0__PMXEVCNTR2 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVCNTR2 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVCNTR3 = 32'hF889100C; +parameter val_debug_cpu_pmu0__PMXEVCNTR3 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVCNTR3 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVCNTR4 = 32'hF8891010; +parameter val_debug_cpu_pmu0__PMXEVCNTR4 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVCNTR4 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVCNTR5 = 32'hF8891014; +parameter val_debug_cpu_pmu0__PMXEVCNTR5 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVCNTR5 = 32'h00000000; + +parameter debug_cpu_pmu0__PMCCNTR = 32'hF889107C; +parameter val_debug_cpu_pmu0__PMCCNTR = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMCCNTR = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVTYPER0 = 32'hF8891400; +parameter val_debug_cpu_pmu0__PMXEVTYPER0 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVTYPER0 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVTYPER1 = 32'hF8891404; +parameter val_debug_cpu_pmu0__PMXEVTYPER1 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVTYPER1 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVTYPER2 = 32'hF8891408; +parameter val_debug_cpu_pmu0__PMXEVTYPER2 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVTYPER2 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVTYPER3 = 32'hF889140C; +parameter val_debug_cpu_pmu0__PMXEVTYPER3 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVTYPER3 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVTYPER4 = 32'hF8891410; +parameter val_debug_cpu_pmu0__PMXEVTYPER4 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVTYPER4 = 32'h00000000; + +parameter debug_cpu_pmu0__PMXEVTYPER5 = 32'hF8891414; +parameter val_debug_cpu_pmu0__PMXEVTYPER5 = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMXEVTYPER5 = 32'h00000000; + +parameter debug_cpu_pmu0__PMCNTENSET = 32'hF8891C00; +parameter val_debug_cpu_pmu0__PMCNTENSET = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMCNTENSET = 32'hFFFFFFFF; + +parameter debug_cpu_pmu0__PMCNTENCLR = 32'hF8891C20; +parameter val_debug_cpu_pmu0__PMCNTENCLR = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMCNTENCLR = 32'hFFFFFFFF; + +parameter debug_cpu_pmu0__PMINTENSET = 32'hF8891C40; +parameter val_debug_cpu_pmu0__PMINTENSET = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMINTENSET = 32'hFFFFFFFF; + +parameter debug_cpu_pmu0__PMINTENCLR = 32'hF8891C60; +parameter val_debug_cpu_pmu0__PMINTENCLR = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMINTENCLR = 32'hFFFFFFFF; + +parameter debug_cpu_pmu0__PMOVSR = 32'hF8891C80; +parameter val_debug_cpu_pmu0__PMOVSR = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMOVSR = 32'h00000000; + +parameter debug_cpu_pmu0__PMSWINC = 32'hF8891CA0; +parameter val_debug_cpu_pmu0__PMSWINC = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMSWINC = 32'h00000000; + +parameter debug_cpu_pmu0__PMCR = 32'hF8891E04; +parameter val_debug_cpu_pmu0__PMCR = 32'h41093000; +parameter mask_debug_cpu_pmu0__PMCR = 32'hFFFFFFFF; + +parameter debug_cpu_pmu0__PMUSERENR = 32'hF8891E08; +parameter val_debug_cpu_pmu0__PMUSERENR = 32'h00000000; +parameter mask_debug_cpu_pmu0__PMUSERENR = 32'hFFFFFFFF; + + +// ************************************************************ +// Module debug_cpu_pmu1 cortexa9_pmu +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_cpu_pmu1__PMXEVCNTR0 = 32'hF8893000; +parameter val_debug_cpu_pmu1__PMXEVCNTR0 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVCNTR0 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVCNTR1 = 32'hF8893004; +parameter val_debug_cpu_pmu1__PMXEVCNTR1 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVCNTR1 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVCNTR2 = 32'hF8893008; +parameter val_debug_cpu_pmu1__PMXEVCNTR2 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVCNTR2 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVCNTR3 = 32'hF889300C; +parameter val_debug_cpu_pmu1__PMXEVCNTR3 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVCNTR3 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVCNTR4 = 32'hF8893010; +parameter val_debug_cpu_pmu1__PMXEVCNTR4 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVCNTR4 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVCNTR5 = 32'hF8893014; +parameter val_debug_cpu_pmu1__PMXEVCNTR5 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVCNTR5 = 32'h00000000; + +parameter debug_cpu_pmu1__PMCCNTR = 32'hF889307C; +parameter val_debug_cpu_pmu1__PMCCNTR = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMCCNTR = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVTYPER0 = 32'hF8893400; +parameter val_debug_cpu_pmu1__PMXEVTYPER0 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVTYPER0 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVTYPER1 = 32'hF8893404; +parameter val_debug_cpu_pmu1__PMXEVTYPER1 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVTYPER1 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVTYPER2 = 32'hF8893408; +parameter val_debug_cpu_pmu1__PMXEVTYPER2 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVTYPER2 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVTYPER3 = 32'hF889340C; +parameter val_debug_cpu_pmu1__PMXEVTYPER3 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVTYPER3 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVTYPER4 = 32'hF8893410; +parameter val_debug_cpu_pmu1__PMXEVTYPER4 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVTYPER4 = 32'h00000000; + +parameter debug_cpu_pmu1__PMXEVTYPER5 = 32'hF8893414; +parameter val_debug_cpu_pmu1__PMXEVTYPER5 = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMXEVTYPER5 = 32'h00000000; + +parameter debug_cpu_pmu1__PMCNTENSET = 32'hF8893C00; +parameter val_debug_cpu_pmu1__PMCNTENSET = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMCNTENSET = 32'hFFFFFFFF; + +parameter debug_cpu_pmu1__PMCNTENCLR = 32'hF8893C20; +parameter val_debug_cpu_pmu1__PMCNTENCLR = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMCNTENCLR = 32'hFFFFFFFF; + +parameter debug_cpu_pmu1__PMINTENSET = 32'hF8893C40; +parameter val_debug_cpu_pmu1__PMINTENSET = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMINTENSET = 32'hFFFFFFFF; + +parameter debug_cpu_pmu1__PMINTENCLR = 32'hF8893C60; +parameter val_debug_cpu_pmu1__PMINTENCLR = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMINTENCLR = 32'hFFFFFFFF; + +parameter debug_cpu_pmu1__PMOVSR = 32'hF8893C80; +parameter val_debug_cpu_pmu1__PMOVSR = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMOVSR = 32'h00000000; + +parameter debug_cpu_pmu1__PMSWINC = 32'hF8893CA0; +parameter val_debug_cpu_pmu1__PMSWINC = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMSWINC = 32'h00000000; + +parameter debug_cpu_pmu1__PMCR = 32'hF8893E04; +parameter val_debug_cpu_pmu1__PMCR = 32'h41093000; +parameter mask_debug_cpu_pmu1__PMCR = 32'hFFFFFFFF; + +parameter debug_cpu_pmu1__PMUSERENR = 32'hF8893E08; +parameter val_debug_cpu_pmu1__PMUSERENR = 32'h00000000; +parameter mask_debug_cpu_pmu1__PMUSERENR = 32'hFFFFFFFF; + + +// ************************************************************ +// Module debug_cpu_ptm0 ptm +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_cpu_ptm0__ETMCR = 32'hF889C000; +parameter val_debug_cpu_ptm0__ETMCR = 32'h00000400; +parameter mask_debug_cpu_ptm0__ETMCR = 32'h3FFFFFFF; + +parameter debug_cpu_ptm0__ETMCCR = 32'hF889C004; +parameter val_debug_cpu_ptm0__ETMCCR = 32'h8D294004; +parameter mask_debug_cpu_ptm0__ETMCCR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMTRIGGER = 32'hF889C008; +parameter val_debug_cpu_ptm0__ETMTRIGGER = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMTRIGGER = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMSR = 32'hF889C010; +parameter val_debug_cpu_ptm0__ETMSR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMSR = 32'h0000000F; + +parameter debug_cpu_ptm0__ETMSCR = 32'hF889C014; +parameter val_debug_cpu_ptm0__ETMSCR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMSCR = 32'h00007FFF; + +parameter debug_cpu_ptm0__ETMTSSCR = 32'hF889C018; +parameter val_debug_cpu_ptm0__ETMTSSCR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMTSSCR = 32'h00FFFFFF; + +parameter debug_cpu_ptm0__ETMTECR1 = 32'hF889C024; +parameter val_debug_cpu_ptm0__ETMTECR1 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMTECR1 = 32'h03FFFFFF; + +parameter debug_cpu_ptm0__ETMACVR1 = 32'hF889C040; +parameter val_debug_cpu_ptm0__ETMACVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMACVR1 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMACVR2 = 32'hF889C044; +parameter val_debug_cpu_ptm0__ETMACVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMACVR2 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMACVR3 = 32'hF889C048; +parameter val_debug_cpu_ptm0__ETMACVR3 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMACVR3 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMACVR4 = 32'hF889C04C; +parameter val_debug_cpu_ptm0__ETMACVR4 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMACVR4 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMACVR5 = 32'hF889C050; +parameter val_debug_cpu_ptm0__ETMACVR5 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMACVR5 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMACVR6 = 32'hF889C054; +parameter val_debug_cpu_ptm0__ETMACVR6 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMACVR6 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMACVR7 = 32'hF889C058; +parameter val_debug_cpu_ptm0__ETMACVR7 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMACVR7 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMACVR8 = 32'hF889C05C; +parameter val_debug_cpu_ptm0__ETMACVR8 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMACVR8 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMACTR1 = 32'hF889C080; +parameter val_debug_cpu_ptm0__ETMACTR1 = 32'h00000001; +parameter mask_debug_cpu_ptm0__ETMACTR1 = 32'h00000FFF; + +parameter debug_cpu_ptm0__ETMACTR2 = 32'hF889C084; +parameter val_debug_cpu_ptm0__ETMACTR2 = 32'h00000001; +parameter mask_debug_cpu_ptm0__ETMACTR2 = 32'h00000FFF; + +parameter debug_cpu_ptm0__ETMACTR3 = 32'hF889C088; +parameter val_debug_cpu_ptm0__ETMACTR3 = 32'h00000001; +parameter mask_debug_cpu_ptm0__ETMACTR3 = 32'h00000FFF; + +parameter debug_cpu_ptm0__ETMACTR4 = 32'hF889C08C; +parameter val_debug_cpu_ptm0__ETMACTR4 = 32'h00000001; +parameter mask_debug_cpu_ptm0__ETMACTR4 = 32'h00000FFF; + +parameter debug_cpu_ptm0__ETMACTR5 = 32'hF889C090; +parameter val_debug_cpu_ptm0__ETMACTR5 = 32'h00000001; +parameter mask_debug_cpu_ptm0__ETMACTR5 = 32'h00000FFF; + +parameter debug_cpu_ptm0__ETMACTR6 = 32'hF889C094; +parameter val_debug_cpu_ptm0__ETMACTR6 = 32'h00000001; +parameter mask_debug_cpu_ptm0__ETMACTR6 = 32'h00000FFF; + +parameter debug_cpu_ptm0__ETMACTR7 = 32'hF889C098; +parameter val_debug_cpu_ptm0__ETMACTR7 = 32'h00000001; +parameter mask_debug_cpu_ptm0__ETMACTR7 = 32'h00000FFF; + +parameter debug_cpu_ptm0__ETMACTR8 = 32'hF889C09C; +parameter val_debug_cpu_ptm0__ETMACTR8 = 32'h00000001; +parameter mask_debug_cpu_ptm0__ETMACTR8 = 32'h00000FFF; + +parameter debug_cpu_ptm0__ETMCNTRLDVR1 = 32'hF889C140; +parameter val_debug_cpu_ptm0__ETMCNTRLDVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMCNTRLDVR1 = 32'h0000FFFF; + +parameter debug_cpu_ptm0__ETMCNTRLDVR2 = 32'hF889C144; +parameter val_debug_cpu_ptm0__ETMCNTRLDVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMCNTRLDVR2 = 32'h0000FFFF; + +parameter debug_cpu_ptm0__ETMCNTENR1 = 32'hF889C150; +parameter val_debug_cpu_ptm0__ETMCNTENR1 = 32'h00020000; +parameter mask_debug_cpu_ptm0__ETMCNTENR1 = 32'h0003FFFF; + +parameter debug_cpu_ptm0__ETMCNTENR2 = 32'hF889C154; +parameter val_debug_cpu_ptm0__ETMCNTENR2 = 32'h00020000; +parameter mask_debug_cpu_ptm0__ETMCNTENR2 = 32'h0003FFFF; + +parameter debug_cpu_ptm0__ETMCNTRLDEVR1 = 32'hF889C160; +parameter val_debug_cpu_ptm0__ETMCNTRLDEVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMCNTRLDEVR1 = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMCNTRLDEVR2 = 32'hF889C164; +parameter val_debug_cpu_ptm0__ETMCNTRLDEVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMCNTRLDEVR2 = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMCNTVR1 = 32'hF889C170; +parameter val_debug_cpu_ptm0__ETMCNTVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMCNTVR1 = 32'h0000FFFF; + +parameter debug_cpu_ptm0__ETMCNTVR2 = 32'hF889C174; +parameter val_debug_cpu_ptm0__ETMCNTVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMCNTVR2 = 32'h0000FFFF; + +parameter debug_cpu_ptm0__ETMSQ12EVR = 32'hF889C180; +parameter val_debug_cpu_ptm0__ETMSQ12EVR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMSQ12EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMSQ21EVR = 32'hF889C184; +parameter val_debug_cpu_ptm0__ETMSQ21EVR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMSQ21EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMSQ23EVR = 32'hF889C188; +parameter val_debug_cpu_ptm0__ETMSQ23EVR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMSQ23EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMSQ31EVR = 32'hF889C18C; +parameter val_debug_cpu_ptm0__ETMSQ31EVR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMSQ31EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMSQ32EVR = 32'hF889C190; +parameter val_debug_cpu_ptm0__ETMSQ32EVR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMSQ32EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMSQ13EVR = 32'hF889C194; +parameter val_debug_cpu_ptm0__ETMSQ13EVR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMSQ13EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMSQR = 32'hF889C19C; +parameter val_debug_cpu_ptm0__ETMSQR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMSQR = 32'h00000003; + +parameter debug_cpu_ptm0__ETMEXTOUTEVR1 = 32'hF889C1A0; +parameter val_debug_cpu_ptm0__ETMEXTOUTEVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMEXTOUTEVR1 = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMEXTOUTEVR2 = 32'hF889C1A4; +parameter val_debug_cpu_ptm0__ETMEXTOUTEVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMEXTOUTEVR2 = 32'h0001FFFF; + +parameter debug_cpu_ptm0__ETMCIDCVR1 = 32'hF889C1B0; +parameter val_debug_cpu_ptm0__ETMCIDCVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMCIDCVR1 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMCIDCMR = 32'hF889C1BC; +parameter val_debug_cpu_ptm0__ETMCIDCMR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMCIDCMR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMSYNCFR = 32'hF889C1E0; +parameter val_debug_cpu_ptm0__ETMSYNCFR = 32'h00000400; +parameter mask_debug_cpu_ptm0__ETMSYNCFR = 32'h00000FFF; + +parameter debug_cpu_ptm0__ETMIDR = 32'hF889C1E4; +parameter val_debug_cpu_ptm0__ETMIDR = 32'h411CF300; +parameter mask_debug_cpu_ptm0__ETMIDR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMCCER = 32'hF889C1E8; +parameter val_debug_cpu_ptm0__ETMCCER = 32'h00C019A2; +parameter mask_debug_cpu_ptm0__ETMCCER = 32'h03FFFFFF; + +parameter debug_cpu_ptm0__ETMEXTINSELR = 32'hF889C1EC; +parameter val_debug_cpu_ptm0__ETMEXTINSELR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMEXTINSELR = 32'h00003FFF; + +parameter debug_cpu_ptm0__ETMAUXCR = 32'hF889C1FC; +parameter val_debug_cpu_ptm0__ETMAUXCR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMAUXCR = 32'h0000000F; + +parameter debug_cpu_ptm0__ETMTRACEIDR = 32'hF889C200; +parameter val_debug_cpu_ptm0__ETMTRACEIDR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMTRACEIDR = 32'h0000007F; + +parameter debug_cpu_ptm0__OSLSR = 32'hF889C304; +parameter val_debug_cpu_ptm0__OSLSR = 32'h00000000; +parameter mask_debug_cpu_ptm0__OSLSR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ETMPDSR = 32'hF889C314; +parameter val_debug_cpu_ptm0__ETMPDSR = 32'h00000001; +parameter mask_debug_cpu_ptm0__ETMPDSR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__ITMISCOUT = 32'hF889CEDC; +parameter val_debug_cpu_ptm0__ITMISCOUT = 32'h00000000; +parameter mask_debug_cpu_ptm0__ITMISCOUT = 32'h000003FF; + +parameter debug_cpu_ptm0__ITMISCIN = 32'hF889CEE0; +parameter val_debug_cpu_ptm0__ITMISCIN = 32'h00000000; +parameter mask_debug_cpu_ptm0__ITMISCIN = 32'h00000020; + +parameter debug_cpu_ptm0__ITTRIGGER = 32'hF889CEE8; +parameter val_debug_cpu_ptm0__ITTRIGGER = 32'h00000000; +parameter mask_debug_cpu_ptm0__ITTRIGGER = 32'h00000001; + +parameter debug_cpu_ptm0__ITATBDATA0 = 32'hF889CEEC; +parameter val_debug_cpu_ptm0__ITATBDATA0 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ITATBDATA0 = 32'h0000001F; + +parameter debug_cpu_ptm0__ITATBCTR2 = 32'hF889CEF0; +parameter val_debug_cpu_ptm0__ITATBCTR2 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ITATBCTR2 = 32'h00000000; + +parameter debug_cpu_ptm0__ITATBID = 32'hF889CEF4; +parameter val_debug_cpu_ptm0__ITATBID = 32'h00000000; +parameter mask_debug_cpu_ptm0__ITATBID = 32'h0000007F; + +parameter debug_cpu_ptm0__ITATBCTR0 = 32'hF889CEF8; +parameter val_debug_cpu_ptm0__ITATBCTR0 = 32'h00000000; +parameter mask_debug_cpu_ptm0__ITATBCTR0 = 32'h000003FF; + +parameter debug_cpu_ptm0__ETMITCTRL = 32'hF889CF00; +parameter val_debug_cpu_ptm0__ETMITCTRL = 32'h00000000; +parameter mask_debug_cpu_ptm0__ETMITCTRL = 32'h00000001; + +parameter debug_cpu_ptm0__CTSR = 32'hF889CFA0; +parameter val_debug_cpu_ptm0__CTSR = 32'h000000FF; +parameter mask_debug_cpu_ptm0__CTSR = 32'h000000FF; + +parameter debug_cpu_ptm0__CTCR = 32'hF889CFA4; +parameter val_debug_cpu_ptm0__CTCR = 32'h00000000; +parameter mask_debug_cpu_ptm0__CTCR = 32'h000000FF; + +parameter debug_cpu_ptm0__LAR = 32'hF889CFB0; +parameter val_debug_cpu_ptm0__LAR = 32'h00000000; +parameter mask_debug_cpu_ptm0__LAR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__LSR = 32'hF889CFB4; +parameter val_debug_cpu_ptm0__LSR = 32'h00000003; +parameter mask_debug_cpu_ptm0__LSR = 32'h00000007; + +parameter debug_cpu_ptm0__ASR = 32'hF889CFB8; +parameter val_debug_cpu_ptm0__ASR = 32'h00000000; +parameter mask_debug_cpu_ptm0__ASR = 32'h000000F3; + +parameter debug_cpu_ptm0__DEVID = 32'hF889CFC8; +parameter val_debug_cpu_ptm0__DEVID = 32'h00000000; +parameter mask_debug_cpu_ptm0__DEVID = 32'hFFFFFFFF; + +parameter debug_cpu_ptm0__DTIR = 32'hF889CFCC; +parameter val_debug_cpu_ptm0__DTIR = 32'h00000013; +parameter mask_debug_cpu_ptm0__DTIR = 32'h000000FF; + +parameter debug_cpu_ptm0__PERIPHID4 = 32'hF889CFD0; +parameter val_debug_cpu_ptm0__PERIPHID4 = 32'h00000004; +parameter mask_debug_cpu_ptm0__PERIPHID4 = 32'h000000FF; + +parameter debug_cpu_ptm0__PERIPHID5 = 32'hF889CFD4; +parameter val_debug_cpu_ptm0__PERIPHID5 = 32'h00000000; +parameter mask_debug_cpu_ptm0__PERIPHID5 = 32'h000000FF; + +parameter debug_cpu_ptm0__PERIPHID6 = 32'hF889CFD8; +parameter val_debug_cpu_ptm0__PERIPHID6 = 32'h00000000; +parameter mask_debug_cpu_ptm0__PERIPHID6 = 32'h000000FF; + +parameter debug_cpu_ptm0__PERIPHID7 = 32'hF889CFDC; +parameter val_debug_cpu_ptm0__PERIPHID7 = 32'h00000000; +parameter mask_debug_cpu_ptm0__PERIPHID7 = 32'h000000FF; + +parameter debug_cpu_ptm0__PERIPHID0 = 32'hF889CFE0; +parameter val_debug_cpu_ptm0__PERIPHID0 = 32'h00000050; +parameter mask_debug_cpu_ptm0__PERIPHID0 = 32'h000000FF; + +parameter debug_cpu_ptm0__PERIPHID1 = 32'hF889CFE4; +parameter val_debug_cpu_ptm0__PERIPHID1 = 32'h000000B9; +parameter mask_debug_cpu_ptm0__PERIPHID1 = 32'h000000FF; + +parameter debug_cpu_ptm0__PERIPHID2 = 32'hF889CFE8; +parameter val_debug_cpu_ptm0__PERIPHID2 = 32'h0000001B; +parameter mask_debug_cpu_ptm0__PERIPHID2 = 32'h000000FF; + +parameter debug_cpu_ptm0__PERIPHID3 = 32'hF889CFEC; +parameter val_debug_cpu_ptm0__PERIPHID3 = 32'h00000000; +parameter mask_debug_cpu_ptm0__PERIPHID3 = 32'h000000FF; + +parameter debug_cpu_ptm0__COMPID0 = 32'hF889CFF0; +parameter val_debug_cpu_ptm0__COMPID0 = 32'h0000000D; +parameter mask_debug_cpu_ptm0__COMPID0 = 32'h000000FF; + +parameter debug_cpu_ptm0__COMPID1 = 32'hF889CFF4; +parameter val_debug_cpu_ptm0__COMPID1 = 32'h00000090; +parameter mask_debug_cpu_ptm0__COMPID1 = 32'h000000FF; + +parameter debug_cpu_ptm0__COMPID2 = 32'hF889CFF8; +parameter val_debug_cpu_ptm0__COMPID2 = 32'h00000005; +parameter mask_debug_cpu_ptm0__COMPID2 = 32'h000000FF; + +parameter debug_cpu_ptm0__COMPID3 = 32'hF889CFFC; +parameter val_debug_cpu_ptm0__COMPID3 = 32'h000000B1; +parameter mask_debug_cpu_ptm0__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_cpu_ptm1 ptm +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_cpu_ptm1__ETMCR = 32'hF889D000; +parameter val_debug_cpu_ptm1__ETMCR = 32'h00000400; +parameter mask_debug_cpu_ptm1__ETMCR = 32'h3FFFFFFF; + +parameter debug_cpu_ptm1__ETMCCR = 32'hF889D004; +parameter val_debug_cpu_ptm1__ETMCCR = 32'h8D294004; +parameter mask_debug_cpu_ptm1__ETMCCR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMTRIGGER = 32'hF889D008; +parameter val_debug_cpu_ptm1__ETMTRIGGER = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMTRIGGER = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMSR = 32'hF889D010; +parameter val_debug_cpu_ptm1__ETMSR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMSR = 32'h0000000F; + +parameter debug_cpu_ptm1__ETMSCR = 32'hF889D014; +parameter val_debug_cpu_ptm1__ETMSCR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMSCR = 32'h00007FFF; + +parameter debug_cpu_ptm1__ETMTSSCR = 32'hF889D018; +parameter val_debug_cpu_ptm1__ETMTSSCR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMTSSCR = 32'h00FFFFFF; + +parameter debug_cpu_ptm1__ETMTECR1 = 32'hF889D024; +parameter val_debug_cpu_ptm1__ETMTECR1 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMTECR1 = 32'h03FFFFFF; + +parameter debug_cpu_ptm1__ETMACVR1 = 32'hF889D040; +parameter val_debug_cpu_ptm1__ETMACVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMACVR1 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMACVR2 = 32'hF889D044; +parameter val_debug_cpu_ptm1__ETMACVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMACVR2 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMACVR3 = 32'hF889D048; +parameter val_debug_cpu_ptm1__ETMACVR3 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMACVR3 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMACVR4 = 32'hF889D04C; +parameter val_debug_cpu_ptm1__ETMACVR4 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMACVR4 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMACVR5 = 32'hF889D050; +parameter val_debug_cpu_ptm1__ETMACVR5 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMACVR5 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMACVR6 = 32'hF889D054; +parameter val_debug_cpu_ptm1__ETMACVR6 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMACVR6 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMACVR7 = 32'hF889D058; +parameter val_debug_cpu_ptm1__ETMACVR7 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMACVR7 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMACVR8 = 32'hF889D05C; +parameter val_debug_cpu_ptm1__ETMACVR8 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMACVR8 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMACTR1 = 32'hF889D080; +parameter val_debug_cpu_ptm1__ETMACTR1 = 32'h00000001; +parameter mask_debug_cpu_ptm1__ETMACTR1 = 32'h00000FFF; + +parameter debug_cpu_ptm1__ETMACTR2 = 32'hF889D084; +parameter val_debug_cpu_ptm1__ETMACTR2 = 32'h00000001; +parameter mask_debug_cpu_ptm1__ETMACTR2 = 32'h00000FFF; + +parameter debug_cpu_ptm1__ETMACTR3 = 32'hF889D088; +parameter val_debug_cpu_ptm1__ETMACTR3 = 32'h00000001; +parameter mask_debug_cpu_ptm1__ETMACTR3 = 32'h00000FFF; + +parameter debug_cpu_ptm1__ETMACTR4 = 32'hF889D08C; +parameter val_debug_cpu_ptm1__ETMACTR4 = 32'h00000001; +parameter mask_debug_cpu_ptm1__ETMACTR4 = 32'h00000FFF; + +parameter debug_cpu_ptm1__ETMACTR5 = 32'hF889D090; +parameter val_debug_cpu_ptm1__ETMACTR5 = 32'h00000001; +parameter mask_debug_cpu_ptm1__ETMACTR5 = 32'h00000FFF; + +parameter debug_cpu_ptm1__ETMACTR6 = 32'hF889D094; +parameter val_debug_cpu_ptm1__ETMACTR6 = 32'h00000001; +parameter mask_debug_cpu_ptm1__ETMACTR6 = 32'h00000FFF; + +parameter debug_cpu_ptm1__ETMACTR7 = 32'hF889D098; +parameter val_debug_cpu_ptm1__ETMACTR7 = 32'h00000001; +parameter mask_debug_cpu_ptm1__ETMACTR7 = 32'h00000FFF; + +parameter debug_cpu_ptm1__ETMACTR8 = 32'hF889D09C; +parameter val_debug_cpu_ptm1__ETMACTR8 = 32'h00000001; +parameter mask_debug_cpu_ptm1__ETMACTR8 = 32'h00000FFF; + +parameter debug_cpu_ptm1__ETMCNTRLDVR1 = 32'hF889D140; +parameter val_debug_cpu_ptm1__ETMCNTRLDVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMCNTRLDVR1 = 32'h0000FFFF; + +parameter debug_cpu_ptm1__ETMCNTRLDVR2 = 32'hF889D144; +parameter val_debug_cpu_ptm1__ETMCNTRLDVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMCNTRLDVR2 = 32'h0000FFFF; + +parameter debug_cpu_ptm1__ETMCNTENR1 = 32'hF889D150; +parameter val_debug_cpu_ptm1__ETMCNTENR1 = 32'h00020000; +parameter mask_debug_cpu_ptm1__ETMCNTENR1 = 32'h0003FFFF; + +parameter debug_cpu_ptm1__ETMCNTENR2 = 32'hF889D154; +parameter val_debug_cpu_ptm1__ETMCNTENR2 = 32'h00020000; +parameter mask_debug_cpu_ptm1__ETMCNTENR2 = 32'h0003FFFF; + +parameter debug_cpu_ptm1__ETMCNTRLDEVR1 = 32'hF889D160; +parameter val_debug_cpu_ptm1__ETMCNTRLDEVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMCNTRLDEVR1 = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMCNTRLDEVR2 = 32'hF889D164; +parameter val_debug_cpu_ptm1__ETMCNTRLDEVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMCNTRLDEVR2 = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMCNTVR1 = 32'hF889D170; +parameter val_debug_cpu_ptm1__ETMCNTVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMCNTVR1 = 32'h0000FFFF; + +parameter debug_cpu_ptm1__ETMCNTVR2 = 32'hF889D174; +parameter val_debug_cpu_ptm1__ETMCNTVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMCNTVR2 = 32'h0000FFFF; + +parameter debug_cpu_ptm1__ETMSQ12EVR = 32'hF889D180; +parameter val_debug_cpu_ptm1__ETMSQ12EVR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMSQ12EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMSQ21EVR = 32'hF889D184; +parameter val_debug_cpu_ptm1__ETMSQ21EVR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMSQ21EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMSQ23EVR = 32'hF889D188; +parameter val_debug_cpu_ptm1__ETMSQ23EVR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMSQ23EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMSQ31EVR = 32'hF889D18C; +parameter val_debug_cpu_ptm1__ETMSQ31EVR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMSQ31EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMSQ32EVR = 32'hF889D190; +parameter val_debug_cpu_ptm1__ETMSQ32EVR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMSQ32EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMSQ13EVR = 32'hF889D194; +parameter val_debug_cpu_ptm1__ETMSQ13EVR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMSQ13EVR = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMSQR = 32'hF889D19C; +parameter val_debug_cpu_ptm1__ETMSQR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMSQR = 32'h00000003; + +parameter debug_cpu_ptm1__ETMEXTOUTEVR1 = 32'hF889D1A0; +parameter val_debug_cpu_ptm1__ETMEXTOUTEVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMEXTOUTEVR1 = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMEXTOUTEVR2 = 32'hF889D1A4; +parameter val_debug_cpu_ptm1__ETMEXTOUTEVR2 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMEXTOUTEVR2 = 32'h0001FFFF; + +parameter debug_cpu_ptm1__ETMCIDCVR1 = 32'hF889D1B0; +parameter val_debug_cpu_ptm1__ETMCIDCVR1 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMCIDCVR1 = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMCIDCMR = 32'hF889D1BC; +parameter val_debug_cpu_ptm1__ETMCIDCMR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMCIDCMR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMSYNCFR = 32'hF889D1E0; +parameter val_debug_cpu_ptm1__ETMSYNCFR = 32'h00000400; +parameter mask_debug_cpu_ptm1__ETMSYNCFR = 32'h00000FFF; + +parameter debug_cpu_ptm1__ETMIDR = 32'hF889D1E4; +parameter val_debug_cpu_ptm1__ETMIDR = 32'h411CF300; +parameter mask_debug_cpu_ptm1__ETMIDR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMCCER = 32'hF889D1E8; +parameter val_debug_cpu_ptm1__ETMCCER = 32'h00C019A2; +parameter mask_debug_cpu_ptm1__ETMCCER = 32'h03FFFFFF; + +parameter debug_cpu_ptm1__ETMEXTINSELR = 32'hF889D1EC; +parameter val_debug_cpu_ptm1__ETMEXTINSELR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMEXTINSELR = 32'h00003FFF; + +parameter debug_cpu_ptm1__ETMAUXCR = 32'hF889D1FC; +parameter val_debug_cpu_ptm1__ETMAUXCR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMAUXCR = 32'h0000000F; + +parameter debug_cpu_ptm1__ETMTRACEIDR = 32'hF889D200; +parameter val_debug_cpu_ptm1__ETMTRACEIDR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMTRACEIDR = 32'h0000007F; + +parameter debug_cpu_ptm1__OSLSR = 32'hF889D304; +parameter val_debug_cpu_ptm1__OSLSR = 32'h00000000; +parameter mask_debug_cpu_ptm1__OSLSR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ETMPDSR = 32'hF889D314; +parameter val_debug_cpu_ptm1__ETMPDSR = 32'h00000001; +parameter mask_debug_cpu_ptm1__ETMPDSR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__ITMISCOUT = 32'hF889DEDC; +parameter val_debug_cpu_ptm1__ITMISCOUT = 32'h00000000; +parameter mask_debug_cpu_ptm1__ITMISCOUT = 32'h000003FF; + +parameter debug_cpu_ptm1__ITMISCIN = 32'hF889DEE0; +parameter val_debug_cpu_ptm1__ITMISCIN = 32'h00000000; +parameter mask_debug_cpu_ptm1__ITMISCIN = 32'h00000020; + +parameter debug_cpu_ptm1__ITTRIGGER = 32'hF889DEE8; +parameter val_debug_cpu_ptm1__ITTRIGGER = 32'h00000000; +parameter mask_debug_cpu_ptm1__ITTRIGGER = 32'h00000001; + +parameter debug_cpu_ptm1__ITATBDATA0 = 32'hF889DEEC; +parameter val_debug_cpu_ptm1__ITATBDATA0 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ITATBDATA0 = 32'h0000001F; + +parameter debug_cpu_ptm1__ITATBCTR2 = 32'hF889DEF0; +parameter val_debug_cpu_ptm1__ITATBCTR2 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ITATBCTR2 = 32'h00000000; + +parameter debug_cpu_ptm1__ITATBID = 32'hF889DEF4; +parameter val_debug_cpu_ptm1__ITATBID = 32'h00000000; +parameter mask_debug_cpu_ptm1__ITATBID = 32'h0000007F; + +parameter debug_cpu_ptm1__ITATBCTR0 = 32'hF889DEF8; +parameter val_debug_cpu_ptm1__ITATBCTR0 = 32'h00000000; +parameter mask_debug_cpu_ptm1__ITATBCTR0 = 32'h000003FF; + +parameter debug_cpu_ptm1__ETMITCTRL = 32'hF889DF00; +parameter val_debug_cpu_ptm1__ETMITCTRL = 32'h00000000; +parameter mask_debug_cpu_ptm1__ETMITCTRL = 32'h00000001; + +parameter debug_cpu_ptm1__CTSR = 32'hF889DFA0; +parameter val_debug_cpu_ptm1__CTSR = 32'h000000FF; +parameter mask_debug_cpu_ptm1__CTSR = 32'h000000FF; + +parameter debug_cpu_ptm1__CTCR = 32'hF889DFA4; +parameter val_debug_cpu_ptm1__CTCR = 32'h00000000; +parameter mask_debug_cpu_ptm1__CTCR = 32'h000000FF; + +parameter debug_cpu_ptm1__LAR = 32'hF889DFB0; +parameter val_debug_cpu_ptm1__LAR = 32'h00000000; +parameter mask_debug_cpu_ptm1__LAR = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__LSR = 32'hF889DFB4; +parameter val_debug_cpu_ptm1__LSR = 32'h00000003; +parameter mask_debug_cpu_ptm1__LSR = 32'h00000007; + +parameter debug_cpu_ptm1__ASR = 32'hF889DFB8; +parameter val_debug_cpu_ptm1__ASR = 32'h00000000; +parameter mask_debug_cpu_ptm1__ASR = 32'h000000F3; + +parameter debug_cpu_ptm1__DEVID = 32'hF889DFC8; +parameter val_debug_cpu_ptm1__DEVID = 32'h00000000; +parameter mask_debug_cpu_ptm1__DEVID = 32'hFFFFFFFF; + +parameter debug_cpu_ptm1__DTIR = 32'hF889DFCC; +parameter val_debug_cpu_ptm1__DTIR = 32'h00000013; +parameter mask_debug_cpu_ptm1__DTIR = 32'h000000FF; + +parameter debug_cpu_ptm1__PERIPHID4 = 32'hF889DFD0; +parameter val_debug_cpu_ptm1__PERIPHID4 = 32'h00000004; +parameter mask_debug_cpu_ptm1__PERIPHID4 = 32'h000000FF; + +parameter debug_cpu_ptm1__PERIPHID5 = 32'hF889DFD4; +parameter val_debug_cpu_ptm1__PERIPHID5 = 32'h00000000; +parameter mask_debug_cpu_ptm1__PERIPHID5 = 32'h000000FF; + +parameter debug_cpu_ptm1__PERIPHID6 = 32'hF889DFD8; +parameter val_debug_cpu_ptm1__PERIPHID6 = 32'h00000000; +parameter mask_debug_cpu_ptm1__PERIPHID6 = 32'h000000FF; + +parameter debug_cpu_ptm1__PERIPHID7 = 32'hF889DFDC; +parameter val_debug_cpu_ptm1__PERIPHID7 = 32'h00000000; +parameter mask_debug_cpu_ptm1__PERIPHID7 = 32'h000000FF; + +parameter debug_cpu_ptm1__PERIPHID0 = 32'hF889DFE0; +parameter val_debug_cpu_ptm1__PERIPHID0 = 32'h00000050; +parameter mask_debug_cpu_ptm1__PERIPHID0 = 32'h000000FF; + +parameter debug_cpu_ptm1__PERIPHID1 = 32'hF889DFE4; +parameter val_debug_cpu_ptm1__PERIPHID1 = 32'h000000B9; +parameter mask_debug_cpu_ptm1__PERIPHID1 = 32'h000000FF; + +parameter debug_cpu_ptm1__PERIPHID2 = 32'hF889DFE8; +parameter val_debug_cpu_ptm1__PERIPHID2 = 32'h0000001B; +parameter mask_debug_cpu_ptm1__PERIPHID2 = 32'h000000FF; + +parameter debug_cpu_ptm1__PERIPHID3 = 32'hF889DFEC; +parameter val_debug_cpu_ptm1__PERIPHID3 = 32'h00000000; +parameter mask_debug_cpu_ptm1__PERIPHID3 = 32'h000000FF; + +parameter debug_cpu_ptm1__COMPID0 = 32'hF889DFF0; +parameter val_debug_cpu_ptm1__COMPID0 = 32'h0000000D; +parameter mask_debug_cpu_ptm1__COMPID0 = 32'h000000FF; + +parameter debug_cpu_ptm1__COMPID1 = 32'hF889DFF4; +parameter val_debug_cpu_ptm1__COMPID1 = 32'h00000090; +parameter mask_debug_cpu_ptm1__COMPID1 = 32'h000000FF; + +parameter debug_cpu_ptm1__COMPID2 = 32'hF889DFF8; +parameter val_debug_cpu_ptm1__COMPID2 = 32'h00000005; +parameter mask_debug_cpu_ptm1__COMPID2 = 32'h000000FF; + +parameter debug_cpu_ptm1__COMPID3 = 32'hF889DFFC; +parameter val_debug_cpu_ptm1__COMPID3 = 32'h000000B1; +parameter mask_debug_cpu_ptm1__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_cti_axim cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_cti_axim__CTICONTROL = 32'hF880A000; +parameter val_debug_cti_axim__CTICONTROL = 32'h00000000; +parameter mask_debug_cti_axim__CTICONTROL = 32'h00000001; + +parameter debug_cti_axim__CTIINTACK = 32'hF880A010; +parameter val_debug_cti_axim__CTIINTACK = 32'h00000000; +parameter mask_debug_cti_axim__CTIINTACK = 32'h000000FF; + +parameter debug_cti_axim__CTIAPPSET = 32'hF880A014; +parameter val_debug_cti_axim__CTIAPPSET = 32'h00000000; +parameter mask_debug_cti_axim__CTIAPPSET = 32'h0000000F; + +parameter debug_cti_axim__CTIAPPCLEAR = 32'hF880A018; +parameter val_debug_cti_axim__CTIAPPCLEAR = 32'h00000000; +parameter mask_debug_cti_axim__CTIAPPCLEAR = 32'h0000000F; + +parameter debug_cti_axim__CTIAPPPULSE = 32'hF880A01C; +parameter val_debug_cti_axim__CTIAPPPULSE = 32'h00000000; +parameter mask_debug_cti_axim__CTIAPPPULSE = 32'h0000000F; + +parameter debug_cti_axim__CTIINEN0 = 32'hF880A020; +parameter val_debug_cti_axim__CTIINEN0 = 32'h00000000; +parameter mask_debug_cti_axim__CTIINEN0 = 32'h0000000F; + +parameter debug_cti_axim__CTIINEN1 = 32'hF880A024; +parameter val_debug_cti_axim__CTIINEN1 = 32'h00000000; +parameter mask_debug_cti_axim__CTIINEN1 = 32'h0000000F; + +parameter debug_cti_axim__CTIINEN2 = 32'hF880A028; +parameter val_debug_cti_axim__CTIINEN2 = 32'h00000000; +parameter mask_debug_cti_axim__CTIINEN2 = 32'h0000000F; + +parameter debug_cti_axim__CTIINEN3 = 32'hF880A02C; +parameter val_debug_cti_axim__CTIINEN3 = 32'h00000000; +parameter mask_debug_cti_axim__CTIINEN3 = 32'h0000000F; + +parameter debug_cti_axim__CTIINEN4 = 32'hF880A030; +parameter val_debug_cti_axim__CTIINEN4 = 32'h00000000; +parameter mask_debug_cti_axim__CTIINEN4 = 32'h0000000F; + +parameter debug_cti_axim__CTIINEN5 = 32'hF880A034; +parameter val_debug_cti_axim__CTIINEN5 = 32'h00000000; +parameter mask_debug_cti_axim__CTIINEN5 = 32'h0000000F; + +parameter debug_cti_axim__CTIINEN6 = 32'hF880A038; +parameter val_debug_cti_axim__CTIINEN6 = 32'h00000000; +parameter mask_debug_cti_axim__CTIINEN6 = 32'h0000000F; + +parameter debug_cti_axim__CTIINEN7 = 32'hF880A03C; +parameter val_debug_cti_axim__CTIINEN7 = 32'h00000000; +parameter mask_debug_cti_axim__CTIINEN7 = 32'h0000000F; + +parameter debug_cti_axim__CTIOUTEN0 = 32'hF880A0A0; +parameter val_debug_cti_axim__CTIOUTEN0 = 32'h00000000; +parameter mask_debug_cti_axim__CTIOUTEN0 = 32'h0000000F; + +parameter debug_cti_axim__CTIOUTEN1 = 32'hF880A0A4; +parameter val_debug_cti_axim__CTIOUTEN1 = 32'h00000000; +parameter mask_debug_cti_axim__CTIOUTEN1 = 32'h0000000F; + +parameter debug_cti_axim__CTIOUTEN2 = 32'hF880A0A8; +parameter val_debug_cti_axim__CTIOUTEN2 = 32'h00000000; +parameter mask_debug_cti_axim__CTIOUTEN2 = 32'h0000000F; + +parameter debug_cti_axim__CTIOUTEN3 = 32'hF880A0AC; +parameter val_debug_cti_axim__CTIOUTEN3 = 32'h00000000; +parameter mask_debug_cti_axim__CTIOUTEN3 = 32'h0000000F; + +parameter debug_cti_axim__CTIOUTEN4 = 32'hF880A0B0; +parameter val_debug_cti_axim__CTIOUTEN4 = 32'h00000000; +parameter mask_debug_cti_axim__CTIOUTEN4 = 32'h0000000F; + +parameter debug_cti_axim__CTIOUTEN5 = 32'hF880A0B4; +parameter val_debug_cti_axim__CTIOUTEN5 = 32'h00000000; +parameter mask_debug_cti_axim__CTIOUTEN5 = 32'h0000000F; + +parameter debug_cti_axim__CTIOUTEN6 = 32'hF880A0B8; +parameter val_debug_cti_axim__CTIOUTEN6 = 32'h00000000; +parameter mask_debug_cti_axim__CTIOUTEN6 = 32'h0000000F; + +parameter debug_cti_axim__CTIOUTEN7 = 32'hF880A0BC; +parameter val_debug_cti_axim__CTIOUTEN7 = 32'h00000000; +parameter mask_debug_cti_axim__CTIOUTEN7 = 32'h0000000F; + +parameter debug_cti_axim__CTITRIGINSTATUS = 32'hF880A130; +parameter val_debug_cti_axim__CTITRIGINSTATUS = 32'h00000000; +parameter mask_debug_cti_axim__CTITRIGINSTATUS = 32'h00000000; + +parameter debug_cti_axim__CTITRIGOUTSTATUS = 32'hF880A134; +parameter val_debug_cti_axim__CTITRIGOUTSTATUS = 32'h00000000; +parameter mask_debug_cti_axim__CTITRIGOUTSTATUS = 32'h000000FF; + +parameter debug_cti_axim__CTICHINSTATUS = 32'hF880A138; +parameter val_debug_cti_axim__CTICHINSTATUS = 32'h00000000; +parameter mask_debug_cti_axim__CTICHINSTATUS = 32'h00000000; + +parameter debug_cti_axim__CTICHOUTSTATUS = 32'hF880A13C; +parameter val_debug_cti_axim__CTICHOUTSTATUS = 32'h00000000; +parameter mask_debug_cti_axim__CTICHOUTSTATUS = 32'h0000000F; + +parameter debug_cti_axim__CTIGATE = 32'hF880A140; +parameter val_debug_cti_axim__CTIGATE = 32'h0000000F; +parameter mask_debug_cti_axim__CTIGATE = 32'h0000000F; + +parameter debug_cti_axim__ASICCTL = 32'hF880A144; +parameter val_debug_cti_axim__ASICCTL = 32'h00000000; +parameter mask_debug_cti_axim__ASICCTL = 32'h000000FF; + +parameter debug_cti_axim__ITCHINACK = 32'hF880AEDC; +parameter val_debug_cti_axim__ITCHINACK = 32'h00000000; +parameter mask_debug_cti_axim__ITCHINACK = 32'h0000000F; + +parameter debug_cti_axim__ITTRIGINACK = 32'hF880AEE0; +parameter val_debug_cti_axim__ITTRIGINACK = 32'h00000000; +parameter mask_debug_cti_axim__ITTRIGINACK = 32'h000000FF; + +parameter debug_cti_axim__ITCHOUT = 32'hF880AEE4; +parameter val_debug_cti_axim__ITCHOUT = 32'h00000000; +parameter mask_debug_cti_axim__ITCHOUT = 32'h0000000F; + +parameter debug_cti_axim__ITTRIGOUT = 32'hF880AEE8; +parameter val_debug_cti_axim__ITTRIGOUT = 32'h00000000; +parameter mask_debug_cti_axim__ITTRIGOUT = 32'h000000FF; + +parameter debug_cti_axim__ITCHOUTACK = 32'hF880AEEC; +parameter val_debug_cti_axim__ITCHOUTACK = 32'h00000000; +parameter mask_debug_cti_axim__ITCHOUTACK = 32'h0000000F; + +parameter debug_cti_axim__ITTRIGOUTACK = 32'hF880AEF0; +parameter val_debug_cti_axim__ITTRIGOUTACK = 32'h00000000; +parameter mask_debug_cti_axim__ITTRIGOUTACK = 32'h000000FF; + +parameter debug_cti_axim__ITCHIN = 32'hF880AEF4; +parameter val_debug_cti_axim__ITCHIN = 32'h00000000; +parameter mask_debug_cti_axim__ITCHIN = 32'h0000000F; + +parameter debug_cti_axim__ITTRIGIN = 32'hF880AEF8; +parameter val_debug_cti_axim__ITTRIGIN = 32'h00000000; +parameter mask_debug_cti_axim__ITTRIGIN = 32'h000000FF; + +parameter debug_cti_axim__ITCTRL = 32'hF880AF00; +parameter val_debug_cti_axim__ITCTRL = 32'h00000000; +parameter mask_debug_cti_axim__ITCTRL = 32'h00000001; + +parameter debug_cti_axim__CTSR = 32'hF880AFA0; +parameter val_debug_cti_axim__CTSR = 32'h0000000F; +parameter mask_debug_cti_axim__CTSR = 32'h0000000F; + +parameter debug_cti_axim__CTCR = 32'hF880AFA4; +parameter val_debug_cti_axim__CTCR = 32'h00000000; +parameter mask_debug_cti_axim__CTCR = 32'h0000000F; + +parameter debug_cti_axim__LAR = 32'hF880AFB0; +parameter val_debug_cti_axim__LAR = 32'h00000000; +parameter mask_debug_cti_axim__LAR = 32'hFFFFFFFF; + +parameter debug_cti_axim__LSR = 32'hF880AFB4; +parameter val_debug_cti_axim__LSR = 32'h00000003; +parameter mask_debug_cti_axim__LSR = 32'h00000007; + +parameter debug_cti_axim__ASR = 32'hF880AFB8; +parameter val_debug_cti_axim__ASR = 32'h00000005; +parameter mask_debug_cti_axim__ASR = 32'h00000005; + +parameter debug_cti_axim__DEVID = 32'hF880AFC8; +parameter val_debug_cti_axim__DEVID = 32'h00040800; +parameter mask_debug_cti_axim__DEVID = 32'h000FFFFF; + +parameter debug_cti_axim__DTIR = 32'hF880AFCC; +parameter val_debug_cti_axim__DTIR = 32'h00000014; +parameter mask_debug_cti_axim__DTIR = 32'h000000FF; + +parameter debug_cti_axim__PERIPHID4 = 32'hF880AFD0; +parameter val_debug_cti_axim__PERIPHID4 = 32'h00000004; +parameter mask_debug_cti_axim__PERIPHID4 = 32'h000000FF; + +parameter debug_cti_axim__PERIPHID5 = 32'hF880AFD4; +parameter val_debug_cti_axim__PERIPHID5 = 32'h00000000; +parameter mask_debug_cti_axim__PERIPHID5 = 32'h000000FF; + +parameter debug_cti_axim__PERIPHID6 = 32'hF880AFD8; +parameter val_debug_cti_axim__PERIPHID6 = 32'h00000000; +parameter mask_debug_cti_axim__PERIPHID6 = 32'h000000FF; + +parameter debug_cti_axim__PERIPHID7 = 32'hF880AFDC; +parameter val_debug_cti_axim__PERIPHID7 = 32'h00000000; +parameter mask_debug_cti_axim__PERIPHID7 = 32'h000000FF; + +parameter debug_cti_axim__PERIPHID0 = 32'hF880AFE0; +parameter val_debug_cti_axim__PERIPHID0 = 32'h00000006; +parameter mask_debug_cti_axim__PERIPHID0 = 32'h000000FF; + +parameter debug_cti_axim__PERIPHID1 = 32'hF880AFE4; +parameter val_debug_cti_axim__PERIPHID1 = 32'h000000B9; +parameter mask_debug_cti_axim__PERIPHID1 = 32'h000000FF; + +parameter debug_cti_axim__PERIPHID2 = 32'hF880AFE8; +parameter val_debug_cti_axim__PERIPHID2 = 32'h0000002B; +parameter mask_debug_cti_axim__PERIPHID2 = 32'h000000FF; + +parameter debug_cti_axim__PERIPHID3 = 32'hF880AFEC; +parameter val_debug_cti_axim__PERIPHID3 = 32'h00000000; +parameter mask_debug_cti_axim__PERIPHID3 = 32'h000000FF; + +parameter debug_cti_axim__COMPID0 = 32'hF880AFF0; +parameter val_debug_cti_axim__COMPID0 = 32'h0000000D; +parameter mask_debug_cti_axim__COMPID0 = 32'h000000FF; + +parameter debug_cti_axim__COMPID1 = 32'hF880AFF4; +parameter val_debug_cti_axim__COMPID1 = 32'h00000090; +parameter mask_debug_cti_axim__COMPID1 = 32'h000000FF; + +parameter debug_cti_axim__COMPID2 = 32'hF880AFF8; +parameter val_debug_cti_axim__COMPID2 = 32'h00000005; +parameter mask_debug_cti_axim__COMPID2 = 32'h000000FF; + +parameter debug_cti_axim__COMPID3 = 32'hF880AFFC; +parameter val_debug_cti_axim__COMPID3 = 32'h000000B1; +parameter mask_debug_cti_axim__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_cti_etb_tpiu cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_cti_etb_tpiu__CTICONTROL = 32'hF8802000; +parameter val_debug_cti_etb_tpiu__CTICONTROL = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTICONTROL = 32'h00000001; + +parameter debug_cti_etb_tpiu__CTIINTACK = 32'hF8802010; +parameter val_debug_cti_etb_tpiu__CTIINTACK = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIINTACK = 32'h000000FF; + +parameter debug_cti_etb_tpiu__CTIAPPSET = 32'hF8802014; +parameter val_debug_cti_etb_tpiu__CTIAPPSET = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIAPPSET = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIAPPCLEAR = 32'hF8802018; +parameter val_debug_cti_etb_tpiu__CTIAPPCLEAR = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIAPPCLEAR = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIAPPPULSE = 32'hF880201C; +parameter val_debug_cti_etb_tpiu__CTIAPPPULSE = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIAPPPULSE = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIINEN0 = 32'hF8802020; +parameter val_debug_cti_etb_tpiu__CTIINEN0 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIINEN0 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIINEN1 = 32'hF8802024; +parameter val_debug_cti_etb_tpiu__CTIINEN1 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIINEN1 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIINEN2 = 32'hF8802028; +parameter val_debug_cti_etb_tpiu__CTIINEN2 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIINEN2 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIINEN3 = 32'hF880202C; +parameter val_debug_cti_etb_tpiu__CTIINEN3 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIINEN3 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIINEN4 = 32'hF8802030; +parameter val_debug_cti_etb_tpiu__CTIINEN4 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIINEN4 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIINEN5 = 32'hF8802034; +parameter val_debug_cti_etb_tpiu__CTIINEN5 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIINEN5 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIINEN6 = 32'hF8802038; +parameter val_debug_cti_etb_tpiu__CTIINEN6 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIINEN6 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIINEN7 = 32'hF880203C; +parameter val_debug_cti_etb_tpiu__CTIINEN7 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIINEN7 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIOUTEN0 = 32'hF88020A0; +parameter val_debug_cti_etb_tpiu__CTIOUTEN0 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIOUTEN0 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIOUTEN1 = 32'hF88020A4; +parameter val_debug_cti_etb_tpiu__CTIOUTEN1 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIOUTEN1 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIOUTEN2 = 32'hF88020A8; +parameter val_debug_cti_etb_tpiu__CTIOUTEN2 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIOUTEN2 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIOUTEN3 = 32'hF88020AC; +parameter val_debug_cti_etb_tpiu__CTIOUTEN3 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIOUTEN3 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIOUTEN4 = 32'hF88020B0; +parameter val_debug_cti_etb_tpiu__CTIOUTEN4 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIOUTEN4 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIOUTEN5 = 32'hF88020B4; +parameter val_debug_cti_etb_tpiu__CTIOUTEN5 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIOUTEN5 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIOUTEN6 = 32'hF88020B8; +parameter val_debug_cti_etb_tpiu__CTIOUTEN6 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIOUTEN6 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIOUTEN7 = 32'hF88020BC; +parameter val_debug_cti_etb_tpiu__CTIOUTEN7 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTIOUTEN7 = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTITRIGINSTATUS = 32'hF8802130; +parameter val_debug_cti_etb_tpiu__CTITRIGINSTATUS = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTITRIGINSTATUS = 32'h00000000; + +parameter debug_cti_etb_tpiu__CTITRIGOUTSTATUS = 32'hF8802134; +parameter val_debug_cti_etb_tpiu__CTITRIGOUTSTATUS = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTITRIGOUTSTATUS = 32'h000000FF; + +parameter debug_cti_etb_tpiu__CTICHINSTATUS = 32'hF8802138; +parameter val_debug_cti_etb_tpiu__CTICHINSTATUS = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTICHINSTATUS = 32'h00000000; + +parameter debug_cti_etb_tpiu__CTICHOUTSTATUS = 32'hF880213C; +parameter val_debug_cti_etb_tpiu__CTICHOUTSTATUS = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTICHOUTSTATUS = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTIGATE = 32'hF8802140; +parameter val_debug_cti_etb_tpiu__CTIGATE = 32'h0000000F; +parameter mask_debug_cti_etb_tpiu__CTIGATE = 32'h0000000F; + +parameter debug_cti_etb_tpiu__ASICCTL = 32'hF8802144; +parameter val_debug_cti_etb_tpiu__ASICCTL = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ASICCTL = 32'h000000FF; + +parameter debug_cti_etb_tpiu__ITCHINACK = 32'hF8802EDC; +parameter val_debug_cti_etb_tpiu__ITCHINACK = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ITCHINACK = 32'h0000000F; + +parameter debug_cti_etb_tpiu__ITTRIGINACK = 32'hF8802EE0; +parameter val_debug_cti_etb_tpiu__ITTRIGINACK = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ITTRIGINACK = 32'h000000FF; + +parameter debug_cti_etb_tpiu__ITCHOUT = 32'hF8802EE4; +parameter val_debug_cti_etb_tpiu__ITCHOUT = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ITCHOUT = 32'h0000000F; + +parameter debug_cti_etb_tpiu__ITTRIGOUT = 32'hF8802EE8; +parameter val_debug_cti_etb_tpiu__ITTRIGOUT = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ITTRIGOUT = 32'h000000FF; + +parameter debug_cti_etb_tpiu__ITCHOUTACK = 32'hF8802EEC; +parameter val_debug_cti_etb_tpiu__ITCHOUTACK = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ITCHOUTACK = 32'h0000000F; + +parameter debug_cti_etb_tpiu__ITTRIGOUTACK = 32'hF8802EF0; +parameter val_debug_cti_etb_tpiu__ITTRIGOUTACK = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ITTRIGOUTACK = 32'h000000FF; + +parameter debug_cti_etb_tpiu__ITCHIN = 32'hF8802EF4; +parameter val_debug_cti_etb_tpiu__ITCHIN = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ITCHIN = 32'h0000000F; + +parameter debug_cti_etb_tpiu__ITTRIGIN = 32'hF8802EF8; +parameter val_debug_cti_etb_tpiu__ITTRIGIN = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ITTRIGIN = 32'h000000FF; + +parameter debug_cti_etb_tpiu__ITCTRL = 32'hF8802F00; +parameter val_debug_cti_etb_tpiu__ITCTRL = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__ITCTRL = 32'h00000001; + +parameter debug_cti_etb_tpiu__CTSR = 32'hF8802FA0; +parameter val_debug_cti_etb_tpiu__CTSR = 32'h0000000F; +parameter mask_debug_cti_etb_tpiu__CTSR = 32'h0000000F; + +parameter debug_cti_etb_tpiu__CTCR = 32'hF8802FA4; +parameter val_debug_cti_etb_tpiu__CTCR = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__CTCR = 32'h0000000F; + +parameter debug_cti_etb_tpiu__LAR = 32'hF8802FB0; +parameter val_debug_cti_etb_tpiu__LAR = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__LAR = 32'hFFFFFFFF; + +parameter debug_cti_etb_tpiu__LSR = 32'hF8802FB4; +parameter val_debug_cti_etb_tpiu__LSR = 32'h00000003; +parameter mask_debug_cti_etb_tpiu__LSR = 32'h00000007; + +parameter debug_cti_etb_tpiu__ASR = 32'hF8802FB8; +parameter val_debug_cti_etb_tpiu__ASR = 32'h00000005; +parameter mask_debug_cti_etb_tpiu__ASR = 32'h00000005; + +parameter debug_cti_etb_tpiu__DEVID = 32'hF8802FC8; +parameter val_debug_cti_etb_tpiu__DEVID = 32'h00040800; +parameter mask_debug_cti_etb_tpiu__DEVID = 32'h000FFFFF; + +parameter debug_cti_etb_tpiu__DTIR = 32'hF8802FCC; +parameter val_debug_cti_etb_tpiu__DTIR = 32'h00000014; +parameter mask_debug_cti_etb_tpiu__DTIR = 32'h000000FF; + +parameter debug_cti_etb_tpiu__PERIPHID4 = 32'hF8802FD0; +parameter val_debug_cti_etb_tpiu__PERIPHID4 = 32'h00000004; +parameter mask_debug_cti_etb_tpiu__PERIPHID4 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__PERIPHID5 = 32'hF8802FD4; +parameter val_debug_cti_etb_tpiu__PERIPHID5 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__PERIPHID5 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__PERIPHID6 = 32'hF8802FD8; +parameter val_debug_cti_etb_tpiu__PERIPHID6 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__PERIPHID6 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__PERIPHID7 = 32'hF8802FDC; +parameter val_debug_cti_etb_tpiu__PERIPHID7 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__PERIPHID7 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__PERIPHID0 = 32'hF8802FE0; +parameter val_debug_cti_etb_tpiu__PERIPHID0 = 32'h00000006; +parameter mask_debug_cti_etb_tpiu__PERIPHID0 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__PERIPHID1 = 32'hF8802FE4; +parameter val_debug_cti_etb_tpiu__PERIPHID1 = 32'h000000B9; +parameter mask_debug_cti_etb_tpiu__PERIPHID1 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__PERIPHID2 = 32'hF8802FE8; +parameter val_debug_cti_etb_tpiu__PERIPHID2 = 32'h0000002B; +parameter mask_debug_cti_etb_tpiu__PERIPHID2 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__PERIPHID3 = 32'hF8802FEC; +parameter val_debug_cti_etb_tpiu__PERIPHID3 = 32'h00000000; +parameter mask_debug_cti_etb_tpiu__PERIPHID3 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__COMPID0 = 32'hF8802FF0; +parameter val_debug_cti_etb_tpiu__COMPID0 = 32'h0000000D; +parameter mask_debug_cti_etb_tpiu__COMPID0 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__COMPID1 = 32'hF8802FF4; +parameter val_debug_cti_etb_tpiu__COMPID1 = 32'h00000090; +parameter mask_debug_cti_etb_tpiu__COMPID1 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__COMPID2 = 32'hF8802FF8; +parameter val_debug_cti_etb_tpiu__COMPID2 = 32'h00000005; +parameter mask_debug_cti_etb_tpiu__COMPID2 = 32'h000000FF; + +parameter debug_cti_etb_tpiu__COMPID3 = 32'hF8802FFC; +parameter val_debug_cti_etb_tpiu__COMPID3 = 32'h000000B1; +parameter mask_debug_cti_etb_tpiu__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_cti_ftm cti +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_cti_ftm__CTICONTROL = 32'hF8809000; +parameter val_debug_cti_ftm__CTICONTROL = 32'h00000000; +parameter mask_debug_cti_ftm__CTICONTROL = 32'h00000001; + +parameter debug_cti_ftm__CTIINTACK = 32'hF8809010; +parameter val_debug_cti_ftm__CTIINTACK = 32'h00000000; +parameter mask_debug_cti_ftm__CTIINTACK = 32'h000000FF; + +parameter debug_cti_ftm__CTIAPPSET = 32'hF8809014; +parameter val_debug_cti_ftm__CTIAPPSET = 32'h00000000; +parameter mask_debug_cti_ftm__CTIAPPSET = 32'h0000000F; + +parameter debug_cti_ftm__CTIAPPCLEAR = 32'hF8809018; +parameter val_debug_cti_ftm__CTIAPPCLEAR = 32'h00000000; +parameter mask_debug_cti_ftm__CTIAPPCLEAR = 32'h0000000F; + +parameter debug_cti_ftm__CTIAPPPULSE = 32'hF880901C; +parameter val_debug_cti_ftm__CTIAPPPULSE = 32'h00000000; +parameter mask_debug_cti_ftm__CTIAPPPULSE = 32'h0000000F; + +parameter debug_cti_ftm__CTIINEN0 = 32'hF8809020; +parameter val_debug_cti_ftm__CTIINEN0 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIINEN0 = 32'h0000000F; + +parameter debug_cti_ftm__CTIINEN1 = 32'hF8809024; +parameter val_debug_cti_ftm__CTIINEN1 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIINEN1 = 32'h0000000F; + +parameter debug_cti_ftm__CTIINEN2 = 32'hF8809028; +parameter val_debug_cti_ftm__CTIINEN2 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIINEN2 = 32'h0000000F; + +parameter debug_cti_ftm__CTIINEN3 = 32'hF880902C; +parameter val_debug_cti_ftm__CTIINEN3 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIINEN3 = 32'h0000000F; + +parameter debug_cti_ftm__CTIINEN4 = 32'hF8809030; +parameter val_debug_cti_ftm__CTIINEN4 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIINEN4 = 32'h0000000F; + +parameter debug_cti_ftm__CTIINEN5 = 32'hF8809034; +parameter val_debug_cti_ftm__CTIINEN5 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIINEN5 = 32'h0000000F; + +parameter debug_cti_ftm__CTIINEN6 = 32'hF8809038; +parameter val_debug_cti_ftm__CTIINEN6 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIINEN6 = 32'h0000000F; + +parameter debug_cti_ftm__CTIINEN7 = 32'hF880903C; +parameter val_debug_cti_ftm__CTIINEN7 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIINEN7 = 32'h0000000F; + +parameter debug_cti_ftm__CTIOUTEN0 = 32'hF88090A0; +parameter val_debug_cti_ftm__CTIOUTEN0 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIOUTEN0 = 32'h0000000F; + +parameter debug_cti_ftm__CTIOUTEN1 = 32'hF88090A4; +parameter val_debug_cti_ftm__CTIOUTEN1 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIOUTEN1 = 32'h0000000F; + +parameter debug_cti_ftm__CTIOUTEN2 = 32'hF88090A8; +parameter val_debug_cti_ftm__CTIOUTEN2 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIOUTEN2 = 32'h0000000F; + +parameter debug_cti_ftm__CTIOUTEN3 = 32'hF88090AC; +parameter val_debug_cti_ftm__CTIOUTEN3 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIOUTEN3 = 32'h0000000F; + +parameter debug_cti_ftm__CTIOUTEN4 = 32'hF88090B0; +parameter val_debug_cti_ftm__CTIOUTEN4 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIOUTEN4 = 32'h0000000F; + +parameter debug_cti_ftm__CTIOUTEN5 = 32'hF88090B4; +parameter val_debug_cti_ftm__CTIOUTEN5 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIOUTEN5 = 32'h0000000F; + +parameter debug_cti_ftm__CTIOUTEN6 = 32'hF88090B8; +parameter val_debug_cti_ftm__CTIOUTEN6 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIOUTEN6 = 32'h0000000F; + +parameter debug_cti_ftm__CTIOUTEN7 = 32'hF88090BC; +parameter val_debug_cti_ftm__CTIOUTEN7 = 32'h00000000; +parameter mask_debug_cti_ftm__CTIOUTEN7 = 32'h0000000F; + +parameter debug_cti_ftm__CTITRIGINSTATUS = 32'hF8809130; +parameter val_debug_cti_ftm__CTITRIGINSTATUS = 32'h00000000; +parameter mask_debug_cti_ftm__CTITRIGINSTATUS = 32'h00000000; + +parameter debug_cti_ftm__CTITRIGOUTSTATUS = 32'hF8809134; +parameter val_debug_cti_ftm__CTITRIGOUTSTATUS = 32'h00000000; +parameter mask_debug_cti_ftm__CTITRIGOUTSTATUS = 32'h000000FF; + +parameter debug_cti_ftm__CTICHINSTATUS = 32'hF8809138; +parameter val_debug_cti_ftm__CTICHINSTATUS = 32'h00000000; +parameter mask_debug_cti_ftm__CTICHINSTATUS = 32'h00000000; + +parameter debug_cti_ftm__CTICHOUTSTATUS = 32'hF880913C; +parameter val_debug_cti_ftm__CTICHOUTSTATUS = 32'h00000000; +parameter mask_debug_cti_ftm__CTICHOUTSTATUS = 32'h0000000F; + +parameter debug_cti_ftm__CTIGATE = 32'hF8809140; +parameter val_debug_cti_ftm__CTIGATE = 32'h0000000F; +parameter mask_debug_cti_ftm__CTIGATE = 32'h0000000F; + +parameter debug_cti_ftm__ASICCTL = 32'hF8809144; +parameter val_debug_cti_ftm__ASICCTL = 32'h00000000; +parameter mask_debug_cti_ftm__ASICCTL = 32'h000000FF; + +parameter debug_cti_ftm__ITCHINACK = 32'hF8809EDC; +parameter val_debug_cti_ftm__ITCHINACK = 32'h00000000; +parameter mask_debug_cti_ftm__ITCHINACK = 32'h0000000F; + +parameter debug_cti_ftm__ITTRIGINACK = 32'hF8809EE0; +parameter val_debug_cti_ftm__ITTRIGINACK = 32'h00000000; +parameter mask_debug_cti_ftm__ITTRIGINACK = 32'h000000FF; + +parameter debug_cti_ftm__ITCHOUT = 32'hF8809EE4; +parameter val_debug_cti_ftm__ITCHOUT = 32'h00000000; +parameter mask_debug_cti_ftm__ITCHOUT = 32'h0000000F; + +parameter debug_cti_ftm__ITTRIGOUT = 32'hF8809EE8; +parameter val_debug_cti_ftm__ITTRIGOUT = 32'h00000000; +parameter mask_debug_cti_ftm__ITTRIGOUT = 32'h000000FF; + +parameter debug_cti_ftm__ITCHOUTACK = 32'hF8809EEC; +parameter val_debug_cti_ftm__ITCHOUTACK = 32'h00000000; +parameter mask_debug_cti_ftm__ITCHOUTACK = 32'h0000000F; + +parameter debug_cti_ftm__ITTRIGOUTACK = 32'hF8809EF0; +parameter val_debug_cti_ftm__ITTRIGOUTACK = 32'h00000000; +parameter mask_debug_cti_ftm__ITTRIGOUTACK = 32'h000000FF; + +parameter debug_cti_ftm__ITCHIN = 32'hF8809EF4; +parameter val_debug_cti_ftm__ITCHIN = 32'h00000000; +parameter mask_debug_cti_ftm__ITCHIN = 32'h0000000F; + +parameter debug_cti_ftm__ITTRIGIN = 32'hF8809EF8; +parameter val_debug_cti_ftm__ITTRIGIN = 32'h00000000; +parameter mask_debug_cti_ftm__ITTRIGIN = 32'h000000FF; + +parameter debug_cti_ftm__ITCTRL = 32'hF8809F00; +parameter val_debug_cti_ftm__ITCTRL = 32'h00000000; +parameter mask_debug_cti_ftm__ITCTRL = 32'h00000001; + +parameter debug_cti_ftm__CTSR = 32'hF8809FA0; +parameter val_debug_cti_ftm__CTSR = 32'h0000000F; +parameter mask_debug_cti_ftm__CTSR = 32'h0000000F; + +parameter debug_cti_ftm__CTCR = 32'hF8809FA4; +parameter val_debug_cti_ftm__CTCR = 32'h00000000; +parameter mask_debug_cti_ftm__CTCR = 32'h0000000F; + +parameter debug_cti_ftm__LAR = 32'hF8809FB0; +parameter val_debug_cti_ftm__LAR = 32'h00000000; +parameter mask_debug_cti_ftm__LAR = 32'hFFFFFFFF; + +parameter debug_cti_ftm__LSR = 32'hF8809FB4; +parameter val_debug_cti_ftm__LSR = 32'h00000003; +parameter mask_debug_cti_ftm__LSR = 32'h00000007; + +parameter debug_cti_ftm__ASR = 32'hF8809FB8; +parameter val_debug_cti_ftm__ASR = 32'h00000005; +parameter mask_debug_cti_ftm__ASR = 32'h00000005; + +parameter debug_cti_ftm__DEVID = 32'hF8809FC8; +parameter val_debug_cti_ftm__DEVID = 32'h00040800; +parameter mask_debug_cti_ftm__DEVID = 32'h000FFFFF; + +parameter debug_cti_ftm__DTIR = 32'hF8809FCC; +parameter val_debug_cti_ftm__DTIR = 32'h00000014; +parameter mask_debug_cti_ftm__DTIR = 32'h000000FF; + +parameter debug_cti_ftm__PERIPHID4 = 32'hF8809FD0; +parameter val_debug_cti_ftm__PERIPHID4 = 32'h00000004; +parameter mask_debug_cti_ftm__PERIPHID4 = 32'h000000FF; + +parameter debug_cti_ftm__PERIPHID5 = 32'hF8809FD4; +parameter val_debug_cti_ftm__PERIPHID5 = 32'h00000000; +parameter mask_debug_cti_ftm__PERIPHID5 = 32'h000000FF; + +parameter debug_cti_ftm__PERIPHID6 = 32'hF8809FD8; +parameter val_debug_cti_ftm__PERIPHID6 = 32'h00000000; +parameter mask_debug_cti_ftm__PERIPHID6 = 32'h000000FF; + +parameter debug_cti_ftm__PERIPHID7 = 32'hF8809FDC; +parameter val_debug_cti_ftm__PERIPHID7 = 32'h00000000; +parameter mask_debug_cti_ftm__PERIPHID7 = 32'h000000FF; + +parameter debug_cti_ftm__PERIPHID0 = 32'hF8809FE0; +parameter val_debug_cti_ftm__PERIPHID0 = 32'h00000006; +parameter mask_debug_cti_ftm__PERIPHID0 = 32'h000000FF; + +parameter debug_cti_ftm__PERIPHID1 = 32'hF8809FE4; +parameter val_debug_cti_ftm__PERIPHID1 = 32'h000000B9; +parameter mask_debug_cti_ftm__PERIPHID1 = 32'h000000FF; + +parameter debug_cti_ftm__PERIPHID2 = 32'hF8809FE8; +parameter val_debug_cti_ftm__PERIPHID2 = 32'h0000002B; +parameter mask_debug_cti_ftm__PERIPHID2 = 32'h000000FF; + +parameter debug_cti_ftm__PERIPHID3 = 32'hF8809FEC; +parameter val_debug_cti_ftm__PERIPHID3 = 32'h00000000; +parameter mask_debug_cti_ftm__PERIPHID3 = 32'h000000FF; + +parameter debug_cti_ftm__COMPID0 = 32'hF8809FF0; +parameter val_debug_cti_ftm__COMPID0 = 32'h0000000D; +parameter mask_debug_cti_ftm__COMPID0 = 32'h000000FF; + +parameter debug_cti_ftm__COMPID1 = 32'hF8809FF4; +parameter val_debug_cti_ftm__COMPID1 = 32'h00000090; +parameter mask_debug_cti_ftm__COMPID1 = 32'h000000FF; + +parameter debug_cti_ftm__COMPID2 = 32'hF8809FF8; +parameter val_debug_cti_ftm__COMPID2 = 32'h00000005; +parameter mask_debug_cti_ftm__COMPID2 = 32'h000000FF; + +parameter debug_cti_ftm__COMPID3 = 32'hF8809FFC; +parameter val_debug_cti_ftm__COMPID3 = 32'h000000B1; +parameter mask_debug_cti_ftm__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_dap_rom dap +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_dap_rom__ROMENTRY00 = 32'hF8800000; +parameter val_debug_dap_rom__ROMENTRY00 = 32'h00001003; +parameter mask_debug_dap_rom__ROMENTRY00 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY01 = 32'hF8800004; +parameter val_debug_dap_rom__ROMENTRY01 = 32'h00002003; +parameter mask_debug_dap_rom__ROMENTRY01 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY02 = 32'hF8800008; +parameter val_debug_dap_rom__ROMENTRY02 = 32'h00003003; +parameter mask_debug_dap_rom__ROMENTRY02 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY03 = 32'hF880000C; +parameter val_debug_dap_rom__ROMENTRY03 = 32'h00004003; +parameter mask_debug_dap_rom__ROMENTRY03 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY04 = 32'hF8800010; +parameter val_debug_dap_rom__ROMENTRY04 = 32'h00005003; +parameter mask_debug_dap_rom__ROMENTRY04 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY05 = 32'hF8800014; +parameter val_debug_dap_rom__ROMENTRY05 = 32'h00009003; +parameter mask_debug_dap_rom__ROMENTRY05 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY06 = 32'hF8800018; +parameter val_debug_dap_rom__ROMENTRY06 = 32'h0000A003; +parameter mask_debug_dap_rom__ROMENTRY06 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY07 = 32'hF880001C; +parameter val_debug_dap_rom__ROMENTRY07 = 32'h0000B003; +parameter mask_debug_dap_rom__ROMENTRY07 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY08 = 32'hF8800020; +parameter val_debug_dap_rom__ROMENTRY08 = 32'h0000C003; +parameter mask_debug_dap_rom__ROMENTRY08 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY09 = 32'hF8800024; +parameter val_debug_dap_rom__ROMENTRY09 = 32'h00080003; +parameter mask_debug_dap_rom__ROMENTRY09 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY10 = 32'hF8800028; +parameter val_debug_dap_rom__ROMENTRY10 = 32'h00000000; +parameter mask_debug_dap_rom__ROMENTRY10 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY11 = 32'hF880002C; +parameter val_debug_dap_rom__ROMENTRY11 = 32'h00000000; +parameter mask_debug_dap_rom__ROMENTRY11 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY12 = 32'hF8800030; +parameter val_debug_dap_rom__ROMENTRY12 = 32'h00000000; +parameter mask_debug_dap_rom__ROMENTRY12 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY13 = 32'hF8800034; +parameter val_debug_dap_rom__ROMENTRY13 = 32'h00000000; +parameter mask_debug_dap_rom__ROMENTRY13 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY14 = 32'hF8800038; +parameter val_debug_dap_rom__ROMENTRY14 = 32'h00000000; +parameter mask_debug_dap_rom__ROMENTRY14 = 32'hFFFFFFFF; + +parameter debug_dap_rom__ROMENTRY15 = 32'hF880003C; +parameter val_debug_dap_rom__ROMENTRY15 = 32'h00000000; +parameter mask_debug_dap_rom__ROMENTRY15 = 32'hFFFFFFFF; + +parameter debug_dap_rom__PERIPHID4 = 32'hF8800FD0; +parameter val_debug_dap_rom__PERIPHID4 = 32'h00000003; +parameter mask_debug_dap_rom__PERIPHID4 = 32'h000000FF; + +parameter debug_dap_rom__PERIPHID5 = 32'hF8800FD4; +parameter val_debug_dap_rom__PERIPHID5 = 32'h00000000; +parameter mask_debug_dap_rom__PERIPHID5 = 32'h000000FF; + +parameter debug_dap_rom__PERIPHID6 = 32'hF8800FD8; +parameter val_debug_dap_rom__PERIPHID6 = 32'h00000000; +parameter mask_debug_dap_rom__PERIPHID6 = 32'h000000FF; + +parameter debug_dap_rom__PERIPHID7 = 32'hF8800FDC; +parameter val_debug_dap_rom__PERIPHID7 = 32'h00000000; +parameter mask_debug_dap_rom__PERIPHID7 = 32'h000000FF; + +parameter debug_dap_rom__PERIPHID0 = 32'hF8800FE0; +parameter val_debug_dap_rom__PERIPHID0 = 32'h000000B2; +parameter mask_debug_dap_rom__PERIPHID0 = 32'h000000FF; + +parameter debug_dap_rom__PERIPHID1 = 32'hF8800FE4; +parameter val_debug_dap_rom__PERIPHID1 = 32'h00000093; +parameter mask_debug_dap_rom__PERIPHID1 = 32'h000000FF; + +parameter debug_dap_rom__PERIPHID2 = 32'hF8800FE8; +parameter val_debug_dap_rom__PERIPHID2 = 32'h00000008; +parameter mask_debug_dap_rom__PERIPHID2 = 32'h000000FF; + +parameter debug_dap_rom__PERIPHID3 = 32'hF8800FEC; +parameter val_debug_dap_rom__PERIPHID3 = 32'h00000000; +parameter mask_debug_dap_rom__PERIPHID3 = 32'h000000FF; + +parameter debug_dap_rom__COMPID0 = 32'hF8800FF0; +parameter val_debug_dap_rom__COMPID0 = 32'h0000000D; +parameter mask_debug_dap_rom__COMPID0 = 32'h000000FF; + +parameter debug_dap_rom__COMPID1 = 32'hF8800FF4; +parameter val_debug_dap_rom__COMPID1 = 32'h00000010; +parameter mask_debug_dap_rom__COMPID1 = 32'h000000FF; + +parameter debug_dap_rom__COMPID2 = 32'hF8800FF8; +parameter val_debug_dap_rom__COMPID2 = 32'h00000005; +parameter mask_debug_dap_rom__COMPID2 = 32'h000000FF; + +parameter debug_dap_rom__COMPID3 = 32'hF8800FFC; +parameter val_debug_dap_rom__COMPID3 = 32'h000000B1; +parameter mask_debug_dap_rom__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_etb etb +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_etb__RDP = 32'hF8801004; +parameter val_debug_etb__RDP = 32'h00000400; +parameter mask_debug_etb__RDP = 32'hFFFFFFFF; + +parameter debug_etb__STS = 32'hF880100C; +parameter val_debug_etb__STS = 32'h00000000; +parameter mask_debug_etb__STS = 32'h0000000F; + +parameter debug_etb__RRD = 32'hF8801010; +parameter val_debug_etb__RRD = 32'h00000000; +parameter mask_debug_etb__RRD = 32'hFFFFFFFF; + +parameter debug_etb__RRP = 32'hF8801014; +parameter val_debug_etb__RRP = 32'h00000000; +parameter mask_debug_etb__RRP = 32'h000003FF; + +parameter debug_etb__RWP = 32'hF8801018; +parameter val_debug_etb__RWP = 32'h00000000; +parameter mask_debug_etb__RWP = 32'h000003FF; + +parameter debug_etb__TRG = 32'hF880101C; +parameter val_debug_etb__TRG = 32'h00000000; +parameter mask_debug_etb__TRG = 32'h000003FF; + +parameter debug_etb__CTL = 32'hF8801020; +parameter val_debug_etb__CTL = 32'h00000000; +parameter mask_debug_etb__CTL = 32'h00000001; + +parameter debug_etb__RWD = 32'hF8801024; +parameter val_debug_etb__RWD = 32'h00000000; +parameter mask_debug_etb__RWD = 32'hFFFFFFFF; + +parameter debug_etb__FFSR = 32'hF8801300; +parameter val_debug_etb__FFSR = 32'h00000000; +parameter mask_debug_etb__FFSR = 32'h00000003; + +parameter debug_etb__FFCR = 32'hF8801304; +parameter val_debug_etb__FFCR = 32'h00000200; +parameter mask_debug_etb__FFCR = 32'h00003FFF; + +parameter debug_etb__ITMISCOP0 = 32'hF8801EE0; +parameter val_debug_etb__ITMISCOP0 = 32'h00000000; +parameter mask_debug_etb__ITMISCOP0 = 32'h00000003; + +parameter debug_etb__ITTRFLINACK = 32'hF8801EE4; +parameter val_debug_etb__ITTRFLINACK = 32'h00000000; +parameter mask_debug_etb__ITTRFLINACK = 32'h00000003; + +parameter debug_etb__ITTRFLIN = 32'hF8801EE8; +parameter val_debug_etb__ITTRFLIN = 32'h00000000; +parameter mask_debug_etb__ITTRFLIN = 32'h00000003; + +parameter debug_etb__ITATBDATA0 = 32'hF8801EEC; +parameter val_debug_etb__ITATBDATA0 = 32'h00000000; +parameter mask_debug_etb__ITATBDATA0 = 32'h0000001F; + +parameter debug_etb__ITATBCTR2 = 32'hF8801EF0; +parameter val_debug_etb__ITATBCTR2 = 32'h00000000; +parameter mask_debug_etb__ITATBCTR2 = 32'h00000003; + +parameter debug_etb__ITATBCTR1 = 32'hF8801EF4; +parameter val_debug_etb__ITATBCTR1 = 32'h00000000; +parameter mask_debug_etb__ITATBCTR1 = 32'h0000007F; + +parameter debug_etb__ITATBCTR0 = 32'hF8801EF8; +parameter val_debug_etb__ITATBCTR0 = 32'h00000000; +parameter mask_debug_etb__ITATBCTR0 = 32'h000003FF; + +parameter debug_etb__IMCR = 32'hF8801F00; +parameter val_debug_etb__IMCR = 32'h00000000; +parameter mask_debug_etb__IMCR = 32'h00000001; + +parameter debug_etb__CTSR = 32'hF8801FA0; +parameter val_debug_etb__CTSR = 32'h0000000F; +parameter mask_debug_etb__CTSR = 32'h0000000F; + +parameter debug_etb__CTCR = 32'hF8801FA4; +parameter val_debug_etb__CTCR = 32'h00000000; +parameter mask_debug_etb__CTCR = 32'h0000000F; + +parameter debug_etb__LAR = 32'hF8801FB0; +parameter val_debug_etb__LAR = 32'h00000000; +parameter mask_debug_etb__LAR = 32'hFFFFFFFF; + +parameter debug_etb__LSR = 32'hF8801FB4; +parameter val_debug_etb__LSR = 32'h00000003; +parameter mask_debug_etb__LSR = 32'h00000007; + +parameter debug_etb__ASR = 32'hF8801FB8; +parameter val_debug_etb__ASR = 32'h00000000; +parameter mask_debug_etb__ASR = 32'h000000FF; + +parameter debug_etb__DEVID = 32'hF8801FC8; +parameter val_debug_etb__DEVID = 32'h00000000; +parameter mask_debug_etb__DEVID = 32'h0000003F; + +parameter debug_etb__DTIR = 32'hF8801FCC; +parameter val_debug_etb__DTIR = 32'h00000021; +parameter mask_debug_etb__DTIR = 32'h000000FF; + +parameter debug_etb__PERIPHID4 = 32'hF8801FD0; +parameter val_debug_etb__PERIPHID4 = 32'h00000004; +parameter mask_debug_etb__PERIPHID4 = 32'h000000FF; + +parameter debug_etb__PERIPHID5 = 32'hF8801FD4; +parameter val_debug_etb__PERIPHID5 = 32'h00000000; +parameter mask_debug_etb__PERIPHID5 = 32'h000000FF; + +parameter debug_etb__PERIPHID6 = 32'hF8801FD8; +parameter val_debug_etb__PERIPHID6 = 32'h00000000; +parameter mask_debug_etb__PERIPHID6 = 32'h000000FF; + +parameter debug_etb__PERIPHID7 = 32'hF8801FDC; +parameter val_debug_etb__PERIPHID7 = 32'h00000000; +parameter mask_debug_etb__PERIPHID7 = 32'h000000FF; + +parameter debug_etb__PERIPHID0 = 32'hF8801FE0; +parameter val_debug_etb__PERIPHID0 = 32'h00000007; +parameter mask_debug_etb__PERIPHID0 = 32'h000000FF; + +parameter debug_etb__PERIPHID1 = 32'hF8801FE4; +parameter val_debug_etb__PERIPHID1 = 32'h000000B9; +parameter mask_debug_etb__PERIPHID1 = 32'h000000FF; + +parameter debug_etb__PERIPHID2 = 32'hF8801FE8; +parameter val_debug_etb__PERIPHID2 = 32'h0000002B; +parameter mask_debug_etb__PERIPHID2 = 32'h000000FF; + +parameter debug_etb__PERIPHID3 = 32'hF8801FEC; +parameter val_debug_etb__PERIPHID3 = 32'h00000000; +parameter mask_debug_etb__PERIPHID3 = 32'h000000FF; + +parameter debug_etb__COMPID0 = 32'hF8801FF0; +parameter val_debug_etb__COMPID0 = 32'h0000000D; +parameter mask_debug_etb__COMPID0 = 32'h000000FF; + +parameter debug_etb__COMPID1 = 32'hF8801FF4; +parameter val_debug_etb__COMPID1 = 32'h00000090; +parameter mask_debug_etb__COMPID1 = 32'h000000FF; + +parameter debug_etb__COMPID2 = 32'hF8801FF8; +parameter val_debug_etb__COMPID2 = 32'h00000005; +parameter mask_debug_etb__COMPID2 = 32'h000000FF; + +parameter debug_etb__COMPID3 = 32'hF8801FFC; +parameter val_debug_etb__COMPID3 = 32'h000000B1; +parameter mask_debug_etb__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_ftm ftm +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_ftm__FTMGLBCTRL = 32'hF880B000; +parameter val_debug_ftm__FTMGLBCTRL = 32'h00000000; +parameter mask_debug_ftm__FTMGLBCTRL = 32'h00000001; + +parameter debug_ftm__FTMSTATUS = 32'hF880B004; +parameter val_debug_ftm__FTMSTATUS = 32'h00000082; +parameter mask_debug_ftm__FTMSTATUS = 32'h000000FF; + +parameter debug_ftm__FTMCONTROL = 32'hF880B008; +parameter val_debug_ftm__FTMCONTROL = 32'h00000000; +parameter mask_debug_ftm__FTMCONTROL = 32'h00000007; + +parameter debug_ftm__FTMP2FDBG0 = 32'hF880B00C; +parameter val_debug_ftm__FTMP2FDBG0 = 32'h00000000; +parameter mask_debug_ftm__FTMP2FDBG0 = 32'h000000FF; + +parameter debug_ftm__FTMP2FDBG1 = 32'hF880B010; +parameter val_debug_ftm__FTMP2FDBG1 = 32'h00000000; +parameter mask_debug_ftm__FTMP2FDBG1 = 32'h000000FF; + +parameter debug_ftm__FTMP2FDBG2 = 32'hF880B014; +parameter val_debug_ftm__FTMP2FDBG2 = 32'h00000000; +parameter mask_debug_ftm__FTMP2FDBG2 = 32'h000000FF; + +parameter debug_ftm__FTMP2FDBG3 = 32'hF880B018; +parameter val_debug_ftm__FTMP2FDBG3 = 32'h00000000; +parameter mask_debug_ftm__FTMP2FDBG3 = 32'h000000FF; + +parameter debug_ftm__FTMF2PDBG0 = 32'hF880B01C; +parameter val_debug_ftm__FTMF2PDBG0 = 32'h00000000; +parameter mask_debug_ftm__FTMF2PDBG0 = 32'h000000FF; + +parameter debug_ftm__FTMF2PDBG1 = 32'hF880B020; +parameter val_debug_ftm__FTMF2PDBG1 = 32'h00000000; +parameter mask_debug_ftm__FTMF2PDBG1 = 32'h000000FF; + +parameter debug_ftm__FTMF2PDBG2 = 32'hF880B024; +parameter val_debug_ftm__FTMF2PDBG2 = 32'h00000000; +parameter mask_debug_ftm__FTMF2PDBG2 = 32'h000000FF; + +parameter debug_ftm__FTMF2PDBG3 = 32'hF880B028; +parameter val_debug_ftm__FTMF2PDBG3 = 32'h00000000; +parameter mask_debug_ftm__FTMF2PDBG3 = 32'h000000FF; + +parameter debug_ftm__CYCOUNTPRE = 32'hF880B02C; +parameter val_debug_ftm__CYCOUNTPRE = 32'h00000000; +parameter mask_debug_ftm__CYCOUNTPRE = 32'h0000000F; + +parameter debug_ftm__FTMSYNCRELOAD = 32'hF880B030; +parameter val_debug_ftm__FTMSYNCRELOAD = 32'h00000000; +parameter mask_debug_ftm__FTMSYNCRELOAD = 32'h00000FFF; + +parameter debug_ftm__FTMSYNCCOUT = 32'hF880B034; +parameter val_debug_ftm__FTMSYNCCOUT = 32'h00000000; +parameter mask_debug_ftm__FTMSYNCCOUT = 32'h00000FFF; + +parameter debug_ftm__FTMATID = 32'hF880B400; +parameter val_debug_ftm__FTMATID = 32'h00000000; +parameter mask_debug_ftm__FTMATID = 32'h0000007F; + +parameter debug_ftm__FTMITTRIGOUTACK = 32'hF880BED0; +parameter val_debug_ftm__FTMITTRIGOUTACK = 32'h00000000; +parameter mask_debug_ftm__FTMITTRIGOUTACK = 32'h0000000F; + +parameter debug_ftm__FTMITTRIGGER = 32'hF880BED4; +parameter val_debug_ftm__FTMITTRIGGER = 32'h00000000; +parameter mask_debug_ftm__FTMITTRIGGER = 32'h0000000F; + +parameter debug_ftm__FTMITTRACEDIS = 32'hF880BED8; +parameter val_debug_ftm__FTMITTRACEDIS = 32'h00000000; +parameter mask_debug_ftm__FTMITTRACEDIS = 32'h00000001; + +parameter debug_ftm__FTMITCYCCOUNT = 32'hF880BEDC; +parameter val_debug_ftm__FTMITCYCCOUNT = 32'h00000001; +parameter mask_debug_ftm__FTMITCYCCOUNT = 32'hFFFFFFFF; + +parameter debug_ftm__FTMITATBDATA0 = 32'hF880BEEC; +parameter val_debug_ftm__FTMITATBDATA0 = 32'h00000000; +parameter mask_debug_ftm__FTMITATBDATA0 = 32'h0000001F; + +parameter debug_ftm__FTMITATBCTR2 = 32'hF880BEF0; +parameter val_debug_ftm__FTMITATBCTR2 = 32'h00000001; +parameter mask_debug_ftm__FTMITATBCTR2 = 32'h00000003; + +parameter debug_ftm__FTMITATBCTR1 = 32'hF880BEF4; +parameter val_debug_ftm__FTMITATBCTR1 = 32'h00000000; +parameter mask_debug_ftm__FTMITATBCTR1 = 32'h0000007F; + +parameter debug_ftm__FTMITATBCTR0 = 32'hF880BEF8; +parameter val_debug_ftm__FTMITATBCTR0 = 32'h00000000; +parameter mask_debug_ftm__FTMITATBCTR0 = 32'h000003FF; + +parameter debug_ftm__FTMITCR = 32'hF880BF00; +parameter val_debug_ftm__FTMITCR = 32'h00000000; +parameter mask_debug_ftm__FTMITCR = 32'h00000001; + +parameter debug_ftm__CLAIMTAGSET = 32'hF880BFA0; +parameter val_debug_ftm__CLAIMTAGSET = 32'h000000FF; +parameter mask_debug_ftm__CLAIMTAGSET = 32'h000000FF; + +parameter debug_ftm__CLAIMTAGCLR = 32'hF880BFA4; +parameter val_debug_ftm__CLAIMTAGCLR = 32'h000000FF; +parameter mask_debug_ftm__CLAIMTAGCLR = 32'h000000FF; + +parameter debug_ftm__LOCK_ACCESS = 32'hF880BFB0; +parameter val_debug_ftm__LOCK_ACCESS = 32'h00000000; +parameter mask_debug_ftm__LOCK_ACCESS = 32'hFFFFFFFF; + +parameter debug_ftm__LOCK_STATUS = 32'hF880BFB4; +parameter val_debug_ftm__LOCK_STATUS = 32'h00000003; +parameter mask_debug_ftm__LOCK_STATUS = 32'h00000007; + +parameter debug_ftm__FTMAUTHSTATUS = 32'hF880BFB8; +parameter val_debug_ftm__FTMAUTHSTATUS = 32'h00000088; +parameter mask_debug_ftm__FTMAUTHSTATUS = 32'h000000FF; + +parameter debug_ftm__FTMDEVID = 32'hF880BFC8; +parameter val_debug_ftm__FTMDEVID = 32'h00000000; +parameter mask_debug_ftm__FTMDEVID = 32'h00000001; + +parameter debug_ftm__FTMDEV_TYPE = 32'hF880BFCC; +parameter val_debug_ftm__FTMDEV_TYPE = 32'h00000033; +parameter mask_debug_ftm__FTMDEV_TYPE = 32'h000000FF; + +parameter debug_ftm__FTMPERIPHID4 = 32'hF880BFD0; +parameter val_debug_ftm__FTMPERIPHID4 = 32'h00000000; +parameter mask_debug_ftm__FTMPERIPHID4 = 32'h000000FF; + +parameter debug_ftm__FTMPERIPHID5 = 32'hF880BFD4; +parameter val_debug_ftm__FTMPERIPHID5 = 32'h00000000; +parameter mask_debug_ftm__FTMPERIPHID5 = 32'h000000FF; + +parameter debug_ftm__FTMPERIPHID6 = 32'hF880BFD8; +parameter val_debug_ftm__FTMPERIPHID6 = 32'h00000000; +parameter mask_debug_ftm__FTMPERIPHID6 = 32'h000000FF; + +parameter debug_ftm__FTMPERIPHID7 = 32'hF880BFDC; +parameter val_debug_ftm__FTMPERIPHID7 = 32'h00000000; +parameter mask_debug_ftm__FTMPERIPHID7 = 32'h000000FF; + +parameter debug_ftm__FTMPERIPHID0 = 32'hF880BFE0; +parameter val_debug_ftm__FTMPERIPHID0 = 32'h00000001; +parameter mask_debug_ftm__FTMPERIPHID0 = 32'h000000FF; + +parameter debug_ftm__FTMPERIPHID1 = 32'hF880BFE4; +parameter val_debug_ftm__FTMPERIPHID1 = 32'h00000090; +parameter mask_debug_ftm__FTMPERIPHID1 = 32'h000000FF; + +parameter debug_ftm__FTMPERIPHID2 = 32'hF880BFE8; +parameter val_debug_ftm__FTMPERIPHID2 = 32'h0000000C; +parameter mask_debug_ftm__FTMPERIPHID2 = 32'h000000FF; + +parameter debug_ftm__FTMPERIPHID3 = 32'hF880BFEC; +parameter val_debug_ftm__FTMPERIPHID3 = 32'h00000000; +parameter mask_debug_ftm__FTMPERIPHID3 = 32'h000000FF; + +parameter debug_ftm__FTMCOMPONID0 = 32'hF880BFF0; +parameter val_debug_ftm__FTMCOMPONID0 = 32'h0000000D; +parameter mask_debug_ftm__FTMCOMPONID0 = 32'h000000FF; + +parameter debug_ftm__FTMCOMPONID1 = 32'hF880BFF4; +parameter val_debug_ftm__FTMCOMPONID1 = 32'h00000090; +parameter mask_debug_ftm__FTMCOMPONID1 = 32'h000000FF; + +parameter debug_ftm__FTMCOMPONID2 = 32'hF880BFF8; +parameter val_debug_ftm__FTMCOMPONID2 = 32'h00000005; +parameter mask_debug_ftm__FTMCOMPONID2 = 32'h000000FF; + +parameter debug_ftm__FTMCOMPONID3 = 32'hF880BFFC; +parameter val_debug_ftm__FTMCOMPONID3 = 32'h000000B1; +parameter mask_debug_ftm__FTMCOMPONID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_funnel funnel +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_funnel__Control = 32'hF8804000; +parameter val_debug_funnel__Control = 32'h00000300; +parameter mask_debug_funnel__Control = 32'h00000FFF; + +parameter debug_funnel__PriControl = 32'hF8804004; +parameter val_debug_funnel__PriControl = 32'h00FAC688; +parameter mask_debug_funnel__PriControl = 32'h00FFFFFF; + +parameter debug_funnel__ITATBDATA0 = 32'hF8804EEC; +parameter val_debug_funnel__ITATBDATA0 = 32'h00000000; +parameter mask_debug_funnel__ITATBDATA0 = 32'h0000001F; + +parameter debug_funnel__ITATBCTR2 = 32'hF8804EF0; +parameter val_debug_funnel__ITATBCTR2 = 32'h00000000; +parameter mask_debug_funnel__ITATBCTR2 = 32'h00000003; + +parameter debug_funnel__ITATBCTR1 = 32'hF8804EF4; +parameter val_debug_funnel__ITATBCTR1 = 32'h00000000; +parameter mask_debug_funnel__ITATBCTR1 = 32'h0000007F; + +parameter debug_funnel__ITATBCTR0 = 32'hF8804EF8; +parameter val_debug_funnel__ITATBCTR0 = 32'h00000000; +parameter mask_debug_funnel__ITATBCTR0 = 32'h000003FF; + +parameter debug_funnel__IMCR = 32'hF8804F00; +parameter val_debug_funnel__IMCR = 32'h00000000; +parameter mask_debug_funnel__IMCR = 32'h00000001; + +parameter debug_funnel__CTSR = 32'hF8804FA0; +parameter val_debug_funnel__CTSR = 32'h0000000F; +parameter mask_debug_funnel__CTSR = 32'h0000000F; + +parameter debug_funnel__CTCR = 32'hF8804FA4; +parameter val_debug_funnel__CTCR = 32'h00000000; +parameter mask_debug_funnel__CTCR = 32'h0000000F; + +parameter debug_funnel__LAR = 32'hF8804FB0; +parameter val_debug_funnel__LAR = 32'h00000000; +parameter mask_debug_funnel__LAR = 32'hFFFFFFFF; + +parameter debug_funnel__LSR = 32'hF8804FB4; +parameter val_debug_funnel__LSR = 32'h00000003; +parameter mask_debug_funnel__LSR = 32'h00000007; + +parameter debug_funnel__ASR = 32'hF8804FB8; +parameter val_debug_funnel__ASR = 32'h00000000; +parameter mask_debug_funnel__ASR = 32'h000000FF; + +parameter debug_funnel__DEVID = 32'hF8804FC8; +parameter val_debug_funnel__DEVID = 32'h00000028; +parameter mask_debug_funnel__DEVID = 32'h000000FF; + +parameter debug_funnel__DTIR = 32'hF8804FCC; +parameter val_debug_funnel__DTIR = 32'h00000012; +parameter mask_debug_funnel__DTIR = 32'h000000FF; + +parameter debug_funnel__PERIPHID4 = 32'hF8804FD0; +parameter val_debug_funnel__PERIPHID4 = 32'h00000004; +parameter mask_debug_funnel__PERIPHID4 = 32'h000000FF; + +parameter debug_funnel__PERIPHID5 = 32'hF8804FD4; +parameter val_debug_funnel__PERIPHID5 = 32'h00000000; +parameter mask_debug_funnel__PERIPHID5 = 32'h000000FF; + +parameter debug_funnel__PERIPHID6 = 32'hF8804FD8; +parameter val_debug_funnel__PERIPHID6 = 32'h00000000; +parameter mask_debug_funnel__PERIPHID6 = 32'h000000FF; + +parameter debug_funnel__PERIPHID7 = 32'hF8804FDC; +parameter val_debug_funnel__PERIPHID7 = 32'h00000000; +parameter mask_debug_funnel__PERIPHID7 = 32'h000000FF; + +parameter debug_funnel__PERIPHID0 = 32'hF8804FE0; +parameter val_debug_funnel__PERIPHID0 = 32'h00000008; +parameter mask_debug_funnel__PERIPHID0 = 32'h000000FF; + +parameter debug_funnel__PERIPHID1 = 32'hF8804FE4; +parameter val_debug_funnel__PERIPHID1 = 32'h000000B9; +parameter mask_debug_funnel__PERIPHID1 = 32'h000000FF; + +parameter debug_funnel__PERIPHID2 = 32'hF8804FE8; +parameter val_debug_funnel__PERIPHID2 = 32'h0000001B; +parameter mask_debug_funnel__PERIPHID2 = 32'h000000FF; + +parameter debug_funnel__PERIPHID3 = 32'hF8804FEC; +parameter val_debug_funnel__PERIPHID3 = 32'h00000000; +parameter mask_debug_funnel__PERIPHID3 = 32'h000000FF; + +parameter debug_funnel__COMPID0 = 32'hF8804FF0; +parameter val_debug_funnel__COMPID0 = 32'h0000000D; +parameter mask_debug_funnel__COMPID0 = 32'h000000FF; + +parameter debug_funnel__COMPID1 = 32'hF8804FF4; +parameter val_debug_funnel__COMPID1 = 32'h00000090; +parameter mask_debug_funnel__COMPID1 = 32'h000000FF; + +parameter debug_funnel__COMPID2 = 32'hF8804FF8; +parameter val_debug_funnel__COMPID2 = 32'h00000005; +parameter mask_debug_funnel__COMPID2 = 32'h000000FF; + +parameter debug_funnel__COMPID3 = 32'hF8804FFC; +parameter val_debug_funnel__COMPID3 = 32'h000000B1; +parameter mask_debug_funnel__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_itm itm +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_itm__StimPort00 = 32'hF8805000; +parameter val_debug_itm__StimPort00 = 32'h00000000; +parameter mask_debug_itm__StimPort00 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort01 = 32'hF8805004; +parameter val_debug_itm__StimPort01 = 32'h00000000; +parameter mask_debug_itm__StimPort01 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort02 = 32'hF8805008; +parameter val_debug_itm__StimPort02 = 32'h00000000; +parameter mask_debug_itm__StimPort02 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort03 = 32'hF880500C; +parameter val_debug_itm__StimPort03 = 32'h00000000; +parameter mask_debug_itm__StimPort03 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort04 = 32'hF8805010; +parameter val_debug_itm__StimPort04 = 32'h00000000; +parameter mask_debug_itm__StimPort04 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort05 = 32'hF8805014; +parameter val_debug_itm__StimPort05 = 32'h00000000; +parameter mask_debug_itm__StimPort05 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort06 = 32'hF8805018; +parameter val_debug_itm__StimPort06 = 32'h00000000; +parameter mask_debug_itm__StimPort06 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort07 = 32'hF880501C; +parameter val_debug_itm__StimPort07 = 32'h00000000; +parameter mask_debug_itm__StimPort07 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort08 = 32'hF8805020; +parameter val_debug_itm__StimPort08 = 32'h00000000; +parameter mask_debug_itm__StimPort08 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort09 = 32'hF8805024; +parameter val_debug_itm__StimPort09 = 32'h00000000; +parameter mask_debug_itm__StimPort09 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort10 = 32'hF8805028; +parameter val_debug_itm__StimPort10 = 32'h00000000; +parameter mask_debug_itm__StimPort10 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort11 = 32'hF880502C; +parameter val_debug_itm__StimPort11 = 32'h00000000; +parameter mask_debug_itm__StimPort11 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort12 = 32'hF8805030; +parameter val_debug_itm__StimPort12 = 32'h00000000; +parameter mask_debug_itm__StimPort12 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort13 = 32'hF8805034; +parameter val_debug_itm__StimPort13 = 32'h00000000; +parameter mask_debug_itm__StimPort13 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort14 = 32'hF8805038; +parameter val_debug_itm__StimPort14 = 32'h00000000; +parameter mask_debug_itm__StimPort14 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort15 = 32'hF880503C; +parameter val_debug_itm__StimPort15 = 32'h00000000; +parameter mask_debug_itm__StimPort15 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort16 = 32'hF8805040; +parameter val_debug_itm__StimPort16 = 32'h00000000; +parameter mask_debug_itm__StimPort16 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort17 = 32'hF8805044; +parameter val_debug_itm__StimPort17 = 32'h00000000; +parameter mask_debug_itm__StimPort17 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort18 = 32'hF8805048; +parameter val_debug_itm__StimPort18 = 32'h00000000; +parameter mask_debug_itm__StimPort18 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort19 = 32'hF880504C; +parameter val_debug_itm__StimPort19 = 32'h00000000; +parameter mask_debug_itm__StimPort19 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort20 = 32'hF8805050; +parameter val_debug_itm__StimPort20 = 32'h00000000; +parameter mask_debug_itm__StimPort20 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort21 = 32'hF8805054; +parameter val_debug_itm__StimPort21 = 32'h00000000; +parameter mask_debug_itm__StimPort21 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort22 = 32'hF8805058; +parameter val_debug_itm__StimPort22 = 32'h00000000; +parameter mask_debug_itm__StimPort22 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort23 = 32'hF880505C; +parameter val_debug_itm__StimPort23 = 32'h00000000; +parameter mask_debug_itm__StimPort23 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort24 = 32'hF8805060; +parameter val_debug_itm__StimPort24 = 32'h00000000; +parameter mask_debug_itm__StimPort24 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort25 = 32'hF8805064; +parameter val_debug_itm__StimPort25 = 32'h00000000; +parameter mask_debug_itm__StimPort25 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort26 = 32'hF8805068; +parameter val_debug_itm__StimPort26 = 32'h00000000; +parameter mask_debug_itm__StimPort26 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort27 = 32'hF880506C; +parameter val_debug_itm__StimPort27 = 32'h00000000; +parameter mask_debug_itm__StimPort27 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort28 = 32'hF8805070; +parameter val_debug_itm__StimPort28 = 32'h00000000; +parameter mask_debug_itm__StimPort28 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort29 = 32'hF8805074; +parameter val_debug_itm__StimPort29 = 32'h00000000; +parameter mask_debug_itm__StimPort29 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort30 = 32'hF8805078; +parameter val_debug_itm__StimPort30 = 32'h00000000; +parameter mask_debug_itm__StimPort30 = 32'hFFFFFFFF; + +parameter debug_itm__StimPort31 = 32'hF880507C; +parameter val_debug_itm__StimPort31 = 32'h00000000; +parameter mask_debug_itm__StimPort31 = 32'hFFFFFFFF; + +parameter debug_itm__TER = 32'hF8805E00; +parameter val_debug_itm__TER = 32'h00000000; +parameter mask_debug_itm__TER = 32'hFFFFFFFF; + +parameter debug_itm__TTR = 32'hF8805E20; +parameter val_debug_itm__TTR = 32'h00000000; +parameter mask_debug_itm__TTR = 32'hFFFFFFFF; + +parameter debug_itm__CR = 32'hF8805E80; +parameter val_debug_itm__CR = 32'h00000004; +parameter mask_debug_itm__CR = 32'h00FFFFFF; + +parameter debug_itm__SCR = 32'hF8805E90; +parameter val_debug_itm__SCR = 32'h00000400; +parameter mask_debug_itm__SCR = 32'h00000FFF; + +parameter debug_itm__ITTRIGOUTACK = 32'hF8805EE4; +parameter val_debug_itm__ITTRIGOUTACK = 32'h00000000; +parameter mask_debug_itm__ITTRIGOUTACK = 32'h00000001; + +parameter debug_itm__ITTRIGOUT = 32'hF8805EE8; +parameter val_debug_itm__ITTRIGOUT = 32'h00000000; +parameter mask_debug_itm__ITTRIGOUT = 32'h00000001; + +parameter debug_itm__ITATBDATA0 = 32'hF8805EEC; +parameter val_debug_itm__ITATBDATA0 = 32'h00000000; +parameter mask_debug_itm__ITATBDATA0 = 32'h00000003; + +parameter debug_itm__ITATBCTR2 = 32'hF8805EF0; +parameter val_debug_itm__ITATBCTR2 = 32'h00000001; +parameter mask_debug_itm__ITATBCTR2 = 32'h00000001; + +parameter debug_itm__ITATABCTR1 = 32'hF8805EF4; +parameter val_debug_itm__ITATABCTR1 = 32'h00000000; +parameter mask_debug_itm__ITATABCTR1 = 32'h0000007F; + +parameter debug_itm__ITATBCTR0 = 32'hF8805EF8; +parameter val_debug_itm__ITATBCTR0 = 32'h00000000; +parameter mask_debug_itm__ITATBCTR0 = 32'h00000003; + +parameter debug_itm__IMCR = 32'hF8805F00; +parameter val_debug_itm__IMCR = 32'h00000000; +parameter mask_debug_itm__IMCR = 32'h00000001; + +parameter debug_itm__CTSR = 32'hF8805FA0; +parameter val_debug_itm__CTSR = 32'h000000FF; +parameter mask_debug_itm__CTSR = 32'h000000FF; + +parameter debug_itm__CTCR = 32'hF8805FA4; +parameter val_debug_itm__CTCR = 32'h00000000; +parameter mask_debug_itm__CTCR = 32'h000000FF; + +parameter debug_itm__LAR = 32'hF8805FB0; +parameter val_debug_itm__LAR = 32'h00000000; +parameter mask_debug_itm__LAR = 32'hFFFFFFFF; + +parameter debug_itm__LSR = 32'hF8805FB4; +parameter val_debug_itm__LSR = 32'h00000003; +parameter mask_debug_itm__LSR = 32'h00000007; + +parameter debug_itm__ASR = 32'hF8805FB8; +parameter val_debug_itm__ASR = 32'h00000088; +parameter mask_debug_itm__ASR = 32'h000000FF; + +parameter debug_itm__DEVID = 32'hF8805FC8; +parameter val_debug_itm__DEVID = 32'h00000020; +parameter mask_debug_itm__DEVID = 32'h00001FFF; + +parameter debug_itm__DTIR = 32'hF8805FCC; +parameter val_debug_itm__DTIR = 32'h00000043; +parameter mask_debug_itm__DTIR = 32'h000000FF; + +parameter debug_itm__PERIPHID4 = 32'hF8805FD0; +parameter val_debug_itm__PERIPHID4 = 32'h00000004; +parameter mask_debug_itm__PERIPHID4 = 32'h000000FF; + +parameter debug_itm__PERIPHID5 = 32'hF8805FD4; +parameter val_debug_itm__PERIPHID5 = 32'h00000000; +parameter mask_debug_itm__PERIPHID5 = 32'h000000FF; + +parameter debug_itm__PERIPHID6 = 32'hF8805FD8; +parameter val_debug_itm__PERIPHID6 = 32'h00000000; +parameter mask_debug_itm__PERIPHID6 = 32'h000000FF; + +parameter debug_itm__PERIPHID7 = 32'hF8805FDC; +parameter val_debug_itm__PERIPHID7 = 32'h00000000; +parameter mask_debug_itm__PERIPHID7 = 32'h000000FF; + +parameter debug_itm__PERIPHID0 = 32'hF8805FE0; +parameter val_debug_itm__PERIPHID0 = 32'h00000013; +parameter mask_debug_itm__PERIPHID0 = 32'h000000FF; + +parameter debug_itm__PERIPHID1 = 32'hF8805FE4; +parameter val_debug_itm__PERIPHID1 = 32'h000000B9; +parameter mask_debug_itm__PERIPHID1 = 32'h000000FF; + +parameter debug_itm__PERIPHID2 = 32'hF8805FE8; +parameter val_debug_itm__PERIPHID2 = 32'h0000002B; +parameter mask_debug_itm__PERIPHID2 = 32'h000000FF; + +parameter debug_itm__PERIPHID3 = 32'hF8805FEC; +parameter val_debug_itm__PERIPHID3 = 32'h00000000; +parameter mask_debug_itm__PERIPHID3 = 32'h000000FF; + +parameter debug_itm__COMPID0 = 32'hF8805FF0; +parameter val_debug_itm__COMPID0 = 32'h0000000D; +parameter mask_debug_itm__COMPID0 = 32'h000000FF; + +parameter debug_itm__COMPID1 = 32'hF8805FF4; +parameter val_debug_itm__COMPID1 = 32'h00000090; +parameter mask_debug_itm__COMPID1 = 32'h000000FF; + +parameter debug_itm__COMPID2 = 32'hF8805FF8; +parameter val_debug_itm__COMPID2 = 32'h00000005; +parameter mask_debug_itm__COMPID2 = 32'h000000FF; + +parameter debug_itm__COMPID3 = 32'hF8805FFC; +parameter val_debug_itm__COMPID3 = 32'h000000B1; +parameter mask_debug_itm__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module debug_tpiu tpiu +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter debug_tpiu__SuppSize = 32'hF8803000; +parameter val_debug_tpiu__SuppSize = 32'hFFFFFFFF; +parameter mask_debug_tpiu__SuppSize = 32'hFFFFFFFF; + +parameter debug_tpiu__CurrentSize = 32'hF8803004; +parameter val_debug_tpiu__CurrentSize = 32'h00000001; +parameter mask_debug_tpiu__CurrentSize = 32'hFFFFFFFF; + +parameter debug_tpiu__SuppTrigMode = 32'hF8803100; +parameter val_debug_tpiu__SuppTrigMode = 32'h0000011F; +parameter mask_debug_tpiu__SuppTrigMode = 32'h0003FFFF; + +parameter debug_tpiu__TrigCount = 32'hF8803104; +parameter val_debug_tpiu__TrigCount = 32'h00000000; +parameter mask_debug_tpiu__TrigCount = 32'h000000FF; + +parameter debug_tpiu__TrigMult = 32'hF8803108; +parameter val_debug_tpiu__TrigMult = 32'h00000000; +parameter mask_debug_tpiu__TrigMult = 32'h0000001F; + +parameter debug_tpiu__SuppTest = 32'hF8803200; +parameter val_debug_tpiu__SuppTest = 32'h0003000F; +parameter mask_debug_tpiu__SuppTest = 32'h0003FFFF; + +parameter debug_tpiu__CurrentTest = 32'hF8803204; +parameter val_debug_tpiu__CurrentTest = 32'h00000000; +parameter mask_debug_tpiu__CurrentTest = 32'h0003FFFF; + +parameter debug_tpiu__TestRepeatCount = 32'hF8803208; +parameter val_debug_tpiu__TestRepeatCount = 32'h00000000; +parameter mask_debug_tpiu__TestRepeatCount = 32'h000000FF; + +parameter debug_tpiu__FFSR = 32'hF8803300; +parameter val_debug_tpiu__FFSR = 32'h00000006; +parameter mask_debug_tpiu__FFSR = 32'h00000007; + +parameter debug_tpiu__FFCR = 32'hF8803304; +parameter val_debug_tpiu__FFCR = 32'h00000000; +parameter mask_debug_tpiu__FFCR = 32'h00003FFF; + +parameter debug_tpiu__FormatSyncCount = 32'hF8803308; +parameter val_debug_tpiu__FormatSyncCount = 32'h00000040; +parameter mask_debug_tpiu__FormatSyncCount = 32'h00000FFF; + +parameter debug_tpiu__EXTCTLIn = 32'hF8803400; +parameter val_debug_tpiu__EXTCTLIn = 32'h00000000; +parameter mask_debug_tpiu__EXTCTLIn = 32'h000000FF; + +parameter debug_tpiu__EXTCTLOut = 32'hF8803404; +parameter val_debug_tpiu__EXTCTLOut = 32'h00000000; +parameter mask_debug_tpiu__EXTCTLOut = 32'h000000FF; + +parameter debug_tpiu__ITTRFLINACK = 32'hF8803EE4; +parameter val_debug_tpiu__ITTRFLINACK = 32'h00000000; +parameter mask_debug_tpiu__ITTRFLINACK = 32'h00000003; + +parameter debug_tpiu__ITTRFLIN = 32'hF8803EE8; +parameter val_debug_tpiu__ITTRFLIN = 32'h00000000; +parameter mask_debug_tpiu__ITTRFLIN = 32'h00000000; + +parameter debug_tpiu__ITATBDATA0 = 32'hF8803EEC; +parameter val_debug_tpiu__ITATBDATA0 = 32'h00000000; +parameter mask_debug_tpiu__ITATBDATA0 = 32'h00000000; + +parameter debug_tpiu__ITATBCTR2 = 32'hF8803EF0; +parameter val_debug_tpiu__ITATBCTR2 = 32'h00000000; +parameter mask_debug_tpiu__ITATBCTR2 = 32'h00000003; + +parameter debug_tpiu__ITATBCTR1 = 32'hF8803EF4; +parameter val_debug_tpiu__ITATBCTR1 = 32'h00000000; +parameter mask_debug_tpiu__ITATBCTR1 = 32'h00000000; + +parameter debug_tpiu__ITATBCTR0 = 32'hF8803EF8; +parameter val_debug_tpiu__ITATBCTR0 = 32'h00000000; +parameter mask_debug_tpiu__ITATBCTR0 = 32'h00000000; + +parameter debug_tpiu__IMCR = 32'hF8803F00; +parameter val_debug_tpiu__IMCR = 32'h00000000; +parameter mask_debug_tpiu__IMCR = 32'h00000001; + +parameter debug_tpiu__CTSR = 32'hF8803FA0; +parameter val_debug_tpiu__CTSR = 32'h0000000F; +parameter mask_debug_tpiu__CTSR = 32'h0000000F; + +parameter debug_tpiu__CTCR = 32'hF8803FA4; +parameter val_debug_tpiu__CTCR = 32'h00000000; +parameter mask_debug_tpiu__CTCR = 32'h0000000F; + +parameter debug_tpiu__LAR = 32'hF8803FB0; +parameter val_debug_tpiu__LAR = 32'h00000000; +parameter mask_debug_tpiu__LAR = 32'hFFFFFFFF; + +parameter debug_tpiu__LSR = 32'hF8803FB4; +parameter val_debug_tpiu__LSR = 32'h00000003; +parameter mask_debug_tpiu__LSR = 32'h00000007; + +parameter debug_tpiu__ASR = 32'hF8803FB8; +parameter val_debug_tpiu__ASR = 32'h00000000; +parameter mask_debug_tpiu__ASR = 32'h000000FF; + +parameter debug_tpiu__DEVID = 32'hF8803FC8; +parameter val_debug_tpiu__DEVID = 32'h000000A0; +parameter mask_debug_tpiu__DEVID = 32'h00000FFF; + +parameter debug_tpiu__DTIR = 32'hF8803FCC; +parameter val_debug_tpiu__DTIR = 32'h00000011; +parameter mask_debug_tpiu__DTIR = 32'h000000FF; + +parameter debug_tpiu__PERIPHID4 = 32'hF8803FD0; +parameter val_debug_tpiu__PERIPHID4 = 32'h00000004; +parameter mask_debug_tpiu__PERIPHID4 = 32'h000000FF; + +parameter debug_tpiu__PERIPHID5 = 32'hF8803FD4; +parameter val_debug_tpiu__PERIPHID5 = 32'h00000000; +parameter mask_debug_tpiu__PERIPHID5 = 32'h000000FF; + +parameter debug_tpiu__PERIPHID6 = 32'hF8803FD8; +parameter val_debug_tpiu__PERIPHID6 = 32'h00000000; +parameter mask_debug_tpiu__PERIPHID6 = 32'h000000FF; + +parameter debug_tpiu__PERIPHID7 = 32'hF8803FDC; +parameter val_debug_tpiu__PERIPHID7 = 32'h00000000; +parameter mask_debug_tpiu__PERIPHID7 = 32'h000000FF; + +parameter debug_tpiu__PERIPHID0 = 32'hF8803FE0; +parameter val_debug_tpiu__PERIPHID0 = 32'h00000012; +parameter mask_debug_tpiu__PERIPHID0 = 32'h000000FF; + +parameter debug_tpiu__PERIPHID1 = 32'hF8803FE4; +parameter val_debug_tpiu__PERIPHID1 = 32'h000000B9; +parameter mask_debug_tpiu__PERIPHID1 = 32'h000000FF; + +parameter debug_tpiu__PERIPHID2 = 32'hF8803FE8; +parameter val_debug_tpiu__PERIPHID2 = 32'h0000004B; +parameter mask_debug_tpiu__PERIPHID2 = 32'h000000FF; + +parameter debug_tpiu__PERIPHID3 = 32'hF8803FEC; +parameter val_debug_tpiu__PERIPHID3 = 32'h00000000; +parameter mask_debug_tpiu__PERIPHID3 = 32'h000000FF; + +parameter debug_tpiu__COMPID0 = 32'hF8803FF0; +parameter val_debug_tpiu__COMPID0 = 32'h0000000D; +parameter mask_debug_tpiu__COMPID0 = 32'h000000FF; + +parameter debug_tpiu__COMPID1 = 32'hF8803FF4; +parameter val_debug_tpiu__COMPID1 = 32'h00000090; +parameter mask_debug_tpiu__COMPID1 = 32'h000000FF; + +parameter debug_tpiu__COMPID2 = 32'hF8803FF8; +parameter val_debug_tpiu__COMPID2 = 32'h00000005; +parameter mask_debug_tpiu__COMPID2 = 32'h000000FF; + +parameter debug_tpiu__COMPID3 = 32'hF8803FFC; +parameter val_debug_tpiu__COMPID3 = 32'h000000B1; +parameter mask_debug_tpiu__COMPID3 = 32'h000000FF; + + +// ************************************************************ +// Module devcfg devcfg +// doc version: 1.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter devcfg__CTRL = 32'hF8007000; +parameter val_devcfg__CTRL = 32'h0C000000; +parameter mask_devcfg__CTRL = 32'hFFFFFFFF; + +parameter devcfg__LOCK = 32'hF8007004; +parameter val_devcfg__LOCK = 32'h00000000; +parameter mask_devcfg__LOCK = 32'hFFFFFFFF; + +parameter devcfg__CFG = 32'hF8007008; +parameter val_devcfg__CFG = 32'h0000050B; +parameter mask_devcfg__CFG = 32'hFFFFFFFF; + +parameter devcfg__INT_STS = 32'hF800700C; +parameter val_devcfg__INT_STS = 32'h00000000; +parameter mask_devcfg__INT_STS = 32'hFFFFFFFF; + +parameter devcfg__INT_MASK = 32'hF8007010; +parameter val_devcfg__INT_MASK = 32'hFFFFFFFF; +parameter mask_devcfg__INT_MASK = 32'hFFFFFFFF; + +parameter devcfg__STATUS = 32'hF8007014; +parameter val_devcfg__STATUS = 32'h40000820; +parameter mask_devcfg__STATUS = 32'hFFFFFFFF; + +parameter devcfg__DMA_SRC_ADDR = 32'hF8007018; +parameter val_devcfg__DMA_SRC_ADDR = 32'h00000000; +parameter mask_devcfg__DMA_SRC_ADDR = 32'hFFFFFFFF; + +parameter devcfg__DMA_DST_ADDR = 32'hF800701C; +parameter val_devcfg__DMA_DST_ADDR = 32'h00000000; +parameter mask_devcfg__DMA_DST_ADDR = 32'hFFFFFFFF; + +parameter devcfg__DMA_SRC_LEN = 32'hF8007020; +parameter val_devcfg__DMA_SRC_LEN = 32'h00000000; +parameter mask_devcfg__DMA_SRC_LEN = 32'hFFFFFFFF; + +parameter devcfg__DMA_DEST_LEN = 32'hF8007024; +parameter val_devcfg__DMA_DEST_LEN = 32'h00000000; +parameter mask_devcfg__DMA_DEST_LEN = 32'hFFFFFFFF; + +parameter devcfg__ROM_SHADOW = 32'hF8007028; +parameter val_devcfg__ROM_SHADOW = 32'h00000000; +parameter mask_devcfg__ROM_SHADOW = 32'hFFFFFFFF; + +parameter devcfg__MULTIBOOT_ADDR = 32'hF800702C; +parameter val_devcfg__MULTIBOOT_ADDR = 32'h00000000; +parameter mask_devcfg__MULTIBOOT_ADDR = 32'hFFFFFFFF; + +parameter devcfg__SW_ID = 32'hF8007030; +parameter val_devcfg__SW_ID = 32'h00000000; +parameter mask_devcfg__SW_ID = 32'hFFFFFFFF; + +parameter devcfg__UNLOCK = 32'hF8007034; +parameter val_devcfg__UNLOCK = 32'h00000000; +parameter mask_devcfg__UNLOCK = 32'hFFFFFFFF; + +parameter devcfg__MCTRL = 32'hF8007080; +parameter val_devcfg__MCTRL = 32'h00800000; +parameter mask_devcfg__MCTRL = 32'h0FFFFFFF; + +parameter devcfg__XADCIF_CFG = 32'hF8007100; +parameter val_devcfg__XADCIF_CFG = 32'h00001114; +parameter mask_devcfg__XADCIF_CFG = 32'hFFFFFFFF; + +parameter devcfg__XADCIF_INT_STS = 32'hF8007104; +parameter val_devcfg__XADCIF_INT_STS = 32'h00000200; +parameter mask_devcfg__XADCIF_INT_STS = 32'hFFFFFFFF; + +parameter devcfg__XADCIF_INT_MASK = 32'hF8007108; +parameter val_devcfg__XADCIF_INT_MASK = 32'hFFFFFFFF; +parameter mask_devcfg__XADCIF_INT_MASK = 32'hFFFFFFFF; + +parameter devcfg__XADCIF_MSTS = 32'hF800710C; +parameter val_devcfg__XADCIF_MSTS = 32'h00000500; +parameter mask_devcfg__XADCIF_MSTS = 32'hFFFFFFFF; + +parameter devcfg__XADCIF_CMDFIFO = 32'hF8007110; +parameter val_devcfg__XADCIF_CMDFIFO = 32'h00000000; +parameter mask_devcfg__XADCIF_CMDFIFO = 32'hFFFFFFFF; + +parameter devcfg__XADCIF_RDFIFO = 32'hF8007114; +parameter val_devcfg__XADCIF_RDFIFO = 32'h00000000; +parameter mask_devcfg__XADCIF_RDFIFO = 32'hFFFFFFFF; + +parameter devcfg__XADCIF_MCTL = 32'hF8007118; +parameter val_devcfg__XADCIF_MCTL = 32'h00000010; +parameter mask_devcfg__XADCIF_MCTL = 32'hFFFFFFFF; + + +// ************************************************************ +// Module dmac0_ns dmac +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter dmac0_ns__DSR = 32'hF8004000; +parameter val_dmac0_ns__DSR = 32'h00000000; +parameter mask_dmac0_ns__DSR = 32'hFFFFFFFF; + +parameter dmac0_ns__DPC = 32'hF8004004; +parameter val_dmac0_ns__DPC = 32'h00000000; +parameter mask_dmac0_ns__DPC = 32'hFFFFFFFF; + +parameter dmac0_ns__INTEN = 32'hF8004020; +parameter val_dmac0_ns__INTEN = 32'h00000000; +parameter mask_dmac0_ns__INTEN = 32'hFFFFFFFF; + +parameter dmac0_ns__INT_EVENT_RIS = 32'hF8004024; +parameter val_dmac0_ns__INT_EVENT_RIS = 32'h00000000; +parameter mask_dmac0_ns__INT_EVENT_RIS = 32'hFFFFFFFF; + +parameter dmac0_ns__INTMIS = 32'hF8004028; +parameter val_dmac0_ns__INTMIS = 32'h00000000; +parameter mask_dmac0_ns__INTMIS = 32'hFFFFFFFF; + +parameter dmac0_ns__INTCLR = 32'hF800402C; +parameter val_dmac0_ns__INTCLR = 32'h00000000; +parameter mask_dmac0_ns__INTCLR = 32'hFFFFFFFF; + +parameter dmac0_ns__FSRD = 32'hF8004030; +parameter val_dmac0_ns__FSRD = 32'h00000000; +parameter mask_dmac0_ns__FSRD = 32'hFFFFFFFF; + +parameter dmac0_ns__FSRC = 32'hF8004034; +parameter val_dmac0_ns__FSRC = 32'h00000000; +parameter mask_dmac0_ns__FSRC = 32'hFFFFFFFF; + +parameter dmac0_ns__FTRD = 32'hF8004038; +parameter val_dmac0_ns__FTRD = 32'h00000000; +parameter mask_dmac0_ns__FTRD = 32'hFFFFFFFF; + +parameter dmac0_ns__FTR0 = 32'hF8004040; +parameter val_dmac0_ns__FTR0 = 32'h00000000; +parameter mask_dmac0_ns__FTR0 = 32'hFFFFFFFF; + +parameter dmac0_ns__FTR1 = 32'hF8004044; +parameter val_dmac0_ns__FTR1 = 32'h00000000; +parameter mask_dmac0_ns__FTR1 = 32'hFFFFFFFF; + +parameter dmac0_ns__FTR2 = 32'hF8004048; +parameter val_dmac0_ns__FTR2 = 32'h00000000; +parameter mask_dmac0_ns__FTR2 = 32'hFFFFFFFF; + +parameter dmac0_ns__FTR3 = 32'hF800404C; +parameter val_dmac0_ns__FTR3 = 32'h00000000; +parameter mask_dmac0_ns__FTR3 = 32'hFFFFFFFF; + +parameter dmac0_ns__FTR4 = 32'hF8004050; +parameter val_dmac0_ns__FTR4 = 32'h00000000; +parameter mask_dmac0_ns__FTR4 = 32'hFFFFFFFF; + +parameter dmac0_ns__FTR5 = 32'hF8004054; +parameter val_dmac0_ns__FTR5 = 32'h00000000; +parameter mask_dmac0_ns__FTR5 = 32'hFFFFFFFF; + +parameter dmac0_ns__FTR6 = 32'hF8004058; +parameter val_dmac0_ns__FTR6 = 32'h00000000; +parameter mask_dmac0_ns__FTR6 = 32'hFFFFFFFF; + +parameter dmac0_ns__FTR7 = 32'hF800405C; +parameter val_dmac0_ns__FTR7 = 32'h00000000; +parameter mask_dmac0_ns__FTR7 = 32'hFFFFFFFF; + +parameter dmac0_ns__CSR0 = 32'hF8004100; +parameter val_dmac0_ns__CSR0 = 32'h00000000; +parameter mask_dmac0_ns__CSR0 = 32'hFFFFFFFF; + +parameter dmac0_ns__CPC0 = 32'hF8004104; +parameter val_dmac0_ns__CPC0 = 32'h00000000; +parameter mask_dmac0_ns__CPC0 = 32'hFFFFFFFF; + +parameter dmac0_ns__CSR1 = 32'hF8004108; +parameter val_dmac0_ns__CSR1 = 32'h00000000; +parameter mask_dmac0_ns__CSR1 = 32'hFFFFFFFF; + +parameter dmac0_ns__CPC1 = 32'hF800410C; +parameter val_dmac0_ns__CPC1 = 32'h00000000; +parameter mask_dmac0_ns__CPC1 = 32'hFFFFFFFF; + +parameter dmac0_ns__CSR2 = 32'hF8004110; +parameter val_dmac0_ns__CSR2 = 32'h00000000; +parameter mask_dmac0_ns__CSR2 = 32'hFFFFFFFF; + +parameter dmac0_ns__CPC2 = 32'hF8004114; +parameter val_dmac0_ns__CPC2 = 32'h00000000; +parameter mask_dmac0_ns__CPC2 = 32'hFFFFFFFF; + +parameter dmac0_ns__CSR3 = 32'hF8004118; +parameter val_dmac0_ns__CSR3 = 32'h00000000; +parameter mask_dmac0_ns__CSR3 = 32'hFFFFFFFF; + +parameter dmac0_ns__CPC3 = 32'hF800411C; +parameter val_dmac0_ns__CPC3 = 32'h00000000; +parameter mask_dmac0_ns__CPC3 = 32'hFFFFFFFF; + +parameter dmac0_ns__CSR4 = 32'hF8004120; +parameter val_dmac0_ns__CSR4 = 32'h00000000; +parameter mask_dmac0_ns__CSR4 = 32'hFFFFFFFF; + +parameter dmac0_ns__CPC4 = 32'hF8004124; +parameter val_dmac0_ns__CPC4 = 32'h00000000; +parameter mask_dmac0_ns__CPC4 = 32'hFFFFFFFF; + +parameter dmac0_ns__CSR5 = 32'hF8004128; +parameter val_dmac0_ns__CSR5 = 32'h00000000; +parameter mask_dmac0_ns__CSR5 = 32'hFFFFFFFF; + +parameter dmac0_ns__CPC5 = 32'hF800412C; +parameter val_dmac0_ns__CPC5 = 32'h00000000; +parameter mask_dmac0_ns__CPC5 = 32'hFFFFFFFF; + +parameter dmac0_ns__CSR6 = 32'hF8004130; +parameter val_dmac0_ns__CSR6 = 32'h00000000; +parameter mask_dmac0_ns__CSR6 = 32'hFFFFFFFF; + +parameter dmac0_ns__CPC6 = 32'hF8004134; +parameter val_dmac0_ns__CPC6 = 32'h00000000; +parameter mask_dmac0_ns__CPC6 = 32'hFFFFFFFF; + +parameter dmac0_ns__CSR7 = 32'hF8004138; +parameter val_dmac0_ns__CSR7 = 32'h00000000; +parameter mask_dmac0_ns__CSR7 = 32'hFFFFFFFF; + +parameter dmac0_ns__CPC7 = 32'hF800413C; +parameter val_dmac0_ns__CPC7 = 32'h00000000; +parameter mask_dmac0_ns__CPC7 = 32'hFFFFFFFF; + +parameter dmac0_ns__SAR0 = 32'hF8004400; +parameter val_dmac0_ns__SAR0 = 32'h00000000; +parameter mask_dmac0_ns__SAR0 = 32'hFFFFFFFF; + +parameter dmac0_ns__DAR0 = 32'hF8004404; +parameter val_dmac0_ns__DAR0 = 32'h00000000; +parameter mask_dmac0_ns__DAR0 = 32'hFFFFFFFF; + +parameter dmac0_ns__CCR0 = 32'hF8004408; +parameter val_dmac0_ns__CCR0 = 32'h00000000; +parameter mask_dmac0_ns__CCR0 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC0_0 = 32'hF800440C; +parameter val_dmac0_ns__LC0_0 = 32'h00000000; +parameter mask_dmac0_ns__LC0_0 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC1_0 = 32'hF8004410; +parameter val_dmac0_ns__LC1_0 = 32'h00000000; +parameter mask_dmac0_ns__LC1_0 = 32'hFFFFFFFF; + +parameter dmac0_ns__SAR1 = 32'hF8004420; +parameter val_dmac0_ns__SAR1 = 32'h00000000; +parameter mask_dmac0_ns__SAR1 = 32'hFFFFFFFF; + +parameter dmac0_ns__DAR1 = 32'hF8004424; +parameter val_dmac0_ns__DAR1 = 32'h00000000; +parameter mask_dmac0_ns__DAR1 = 32'hFFFFFFFF; + +parameter dmac0_ns__CCR1 = 32'hF8004428; +parameter val_dmac0_ns__CCR1 = 32'h00000000; +parameter mask_dmac0_ns__CCR1 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC0_1 = 32'hF800442C; +parameter val_dmac0_ns__LC0_1 = 32'h00000000; +parameter mask_dmac0_ns__LC0_1 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC1_1 = 32'hF8004430; +parameter val_dmac0_ns__LC1_1 = 32'h00000000; +parameter mask_dmac0_ns__LC1_1 = 32'hFFFFFFFF; + +parameter dmac0_ns__SAR2 = 32'hF8004440; +parameter val_dmac0_ns__SAR2 = 32'h00000000; +parameter mask_dmac0_ns__SAR2 = 32'hFFFFFFFF; + +parameter dmac0_ns__DAR2 = 32'hF8004444; +parameter val_dmac0_ns__DAR2 = 32'h00000000; +parameter mask_dmac0_ns__DAR2 = 32'hFFFFFFFF; + +parameter dmac0_ns__CCR2 = 32'hF8004448; +parameter val_dmac0_ns__CCR2 = 32'h00000000; +parameter mask_dmac0_ns__CCR2 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC0_2 = 32'hF800444C; +parameter val_dmac0_ns__LC0_2 = 32'h00000000; +parameter mask_dmac0_ns__LC0_2 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC1_2 = 32'hF8004450; +parameter val_dmac0_ns__LC1_2 = 32'h00000000; +parameter mask_dmac0_ns__LC1_2 = 32'hFFFFFFFF; + +parameter dmac0_ns__SAR3 = 32'hF8004460; +parameter val_dmac0_ns__SAR3 = 32'h00000000; +parameter mask_dmac0_ns__SAR3 = 32'hFFFFFFFF; + +parameter dmac0_ns__DAR3 = 32'hF8004464; +parameter val_dmac0_ns__DAR3 = 32'h00000000; +parameter mask_dmac0_ns__DAR3 = 32'hFFFFFFFF; + +parameter dmac0_ns__CCR3 = 32'hF8004468; +parameter val_dmac0_ns__CCR3 = 32'h00000000; +parameter mask_dmac0_ns__CCR3 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC0_3 = 32'hF800446C; +parameter val_dmac0_ns__LC0_3 = 32'h00000000; +parameter mask_dmac0_ns__LC0_3 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC1_3 = 32'hF8004470; +parameter val_dmac0_ns__LC1_3 = 32'h00000000; +parameter mask_dmac0_ns__LC1_3 = 32'hFFFFFFFF; + +parameter dmac0_ns__SAR4 = 32'hF8004480; +parameter val_dmac0_ns__SAR4 = 32'h00000000; +parameter mask_dmac0_ns__SAR4 = 32'hFFFFFFFF; + +parameter dmac0_ns__DAR4 = 32'hF8004484; +parameter val_dmac0_ns__DAR4 = 32'h00000000; +parameter mask_dmac0_ns__DAR4 = 32'hFFFFFFFF; + +parameter dmac0_ns__CCR4 = 32'hF8004488; +parameter val_dmac0_ns__CCR4 = 32'h00000000; +parameter mask_dmac0_ns__CCR4 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC0_4 = 32'hF800448C; +parameter val_dmac0_ns__LC0_4 = 32'h00000000; +parameter mask_dmac0_ns__LC0_4 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC1_4 = 32'hF8004490; +parameter val_dmac0_ns__LC1_4 = 32'h00000000; +parameter mask_dmac0_ns__LC1_4 = 32'hFFFFFFFF; + +parameter dmac0_ns__SAR5 = 32'hF80044A0; +parameter val_dmac0_ns__SAR5 = 32'h00000000; +parameter mask_dmac0_ns__SAR5 = 32'hFFFFFFFF; + +parameter dmac0_ns__DAR5 = 32'hF80044A4; +parameter val_dmac0_ns__DAR5 = 32'h00000000; +parameter mask_dmac0_ns__DAR5 = 32'hFFFFFFFF; + +parameter dmac0_ns__CCR5 = 32'hF80044A8; +parameter val_dmac0_ns__CCR5 = 32'h00000000; +parameter mask_dmac0_ns__CCR5 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC0_5 = 32'hF80044AC; +parameter val_dmac0_ns__LC0_5 = 32'h00000000; +parameter mask_dmac0_ns__LC0_5 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC1_5 = 32'hF80044B0; +parameter val_dmac0_ns__LC1_5 = 32'h00000000; +parameter mask_dmac0_ns__LC1_5 = 32'hFFFFFFFF; + +parameter dmac0_ns__SAR6 = 32'hF80044C0; +parameter val_dmac0_ns__SAR6 = 32'h00000000; +parameter mask_dmac0_ns__SAR6 = 32'hFFFFFFFF; + +parameter dmac0_ns__DAR6 = 32'hF80044C4; +parameter val_dmac0_ns__DAR6 = 32'h00000000; +parameter mask_dmac0_ns__DAR6 = 32'hFFFFFFFF; + +parameter dmac0_ns__CCR6 = 32'hF80044C8; +parameter val_dmac0_ns__CCR6 = 32'h00000000; +parameter mask_dmac0_ns__CCR6 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC0_6 = 32'hF80044CC; +parameter val_dmac0_ns__LC0_6 = 32'h00000000; +parameter mask_dmac0_ns__LC0_6 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC1_6 = 32'hF80044D0; +parameter val_dmac0_ns__LC1_6 = 32'h00000000; +parameter mask_dmac0_ns__LC1_6 = 32'hFFFFFFFF; + +parameter dmac0_ns__SAR7 = 32'hF80044E0; +parameter val_dmac0_ns__SAR7 = 32'h00000000; +parameter mask_dmac0_ns__SAR7 = 32'hFFFFFFFF; + +parameter dmac0_ns__DAR7 = 32'hF80044E4; +parameter val_dmac0_ns__DAR7 = 32'h00000000; +parameter mask_dmac0_ns__DAR7 = 32'hFFFFFFFF; + +parameter dmac0_ns__CCR7 = 32'hF80044E8; +parameter val_dmac0_ns__CCR7 = 32'h00000000; +parameter mask_dmac0_ns__CCR7 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC0_7 = 32'hF80044EC; +parameter val_dmac0_ns__LC0_7 = 32'h00000000; +parameter mask_dmac0_ns__LC0_7 = 32'hFFFFFFFF; + +parameter dmac0_ns__LC1_7 = 32'hF80044F0; +parameter val_dmac0_ns__LC1_7 = 32'h00000000; +parameter mask_dmac0_ns__LC1_7 = 32'hFFFFFFFF; + +parameter dmac0_ns__DBGSTATUS = 32'hF8004D00; +parameter val_dmac0_ns__DBGSTATUS = 32'h00000000; +parameter mask_dmac0_ns__DBGSTATUS = 32'hFFFFFFFF; + +parameter dmac0_ns__DBGCMD = 32'hF8004D04; +parameter val_dmac0_ns__DBGCMD = 32'h00000000; +parameter mask_dmac0_ns__DBGCMD = 32'hFFFFFFFF; + +parameter dmac0_ns__DBGINST0 = 32'hF8004D08; +parameter val_dmac0_ns__DBGINST0 = 32'h00000000; +parameter mask_dmac0_ns__DBGINST0 = 32'hFFFFFFFF; + +parameter dmac0_ns__DBGINST1 = 32'hF8004D0C; +parameter val_dmac0_ns__DBGINST1 = 32'h00000000; +parameter mask_dmac0_ns__DBGINST1 = 32'hFFFFFFFF; + +parameter dmac0_ns__CR0 = 32'hF8004E00; +parameter val_dmac0_ns__CR0 = 32'h00000000; +parameter mask_dmac0_ns__CR0 = 32'hFFFFFFFF; + +parameter dmac0_ns__CR1 = 32'hF8004E04; +parameter val_dmac0_ns__CR1 = 32'h00000000; +parameter mask_dmac0_ns__CR1 = 32'hFFFFFFFF; + +parameter dmac0_ns__CR2 = 32'hF8004E08; +parameter val_dmac0_ns__CR2 = 32'h00000000; +parameter mask_dmac0_ns__CR2 = 32'hFFFFFFFF; + +parameter dmac0_ns__CR3 = 32'hF8004E0C; +parameter val_dmac0_ns__CR3 = 32'h00000000; +parameter mask_dmac0_ns__CR3 = 32'hFFFFFFFF; + +parameter dmac0_ns__CR4 = 32'hF8004E10; +parameter val_dmac0_ns__CR4 = 32'h00000000; +parameter mask_dmac0_ns__CR4 = 32'hFFFFFFFF; + +parameter dmac0_ns__CRD = 32'hF8004E14; +parameter val_dmac0_ns__CRD = 32'h00000000; +parameter mask_dmac0_ns__CRD = 32'hFFFFFFFF; + +parameter dmac0_ns__WD = 32'hF8004E80; +parameter val_dmac0_ns__WD = 32'h00000000; +parameter mask_dmac0_ns__WD = 32'hFFFFFFFF; + +parameter dmac0_ns__periph_id_0 = 32'hF8004FE0; +parameter val_dmac0_ns__periph_id_0 = 32'h00000000; +parameter mask_dmac0_ns__periph_id_0 = 32'hFFFFFFFF; + +parameter dmac0_ns__periph_id_1 = 32'hF8004FE4; +parameter val_dmac0_ns__periph_id_1 = 32'h00000000; +parameter mask_dmac0_ns__periph_id_1 = 32'hFFFFFFFF; + +parameter dmac0_ns__periph_id_2 = 32'hF8004FE8; +parameter val_dmac0_ns__periph_id_2 = 32'h00000000; +parameter mask_dmac0_ns__periph_id_2 = 32'hFFFFFFFF; + +parameter dmac0_ns__periph_id_3 = 32'hF8004FEC; +parameter val_dmac0_ns__periph_id_3 = 32'h00000000; +parameter mask_dmac0_ns__periph_id_3 = 32'hFFFFFFFF; + +parameter dmac0_ns__pcell_id_0 = 32'hF8004FF0; +parameter val_dmac0_ns__pcell_id_0 = 32'h00000000; +parameter mask_dmac0_ns__pcell_id_0 = 32'hFFFFFFFF; + +parameter dmac0_ns__pcell_id_1 = 32'hF8004FF4; +parameter val_dmac0_ns__pcell_id_1 = 32'h00000000; +parameter mask_dmac0_ns__pcell_id_1 = 32'hFFFFFFFF; + +parameter dmac0_ns__pcell_id_2 = 32'hF8004FF8; +parameter val_dmac0_ns__pcell_id_2 = 32'h00000000; +parameter mask_dmac0_ns__pcell_id_2 = 32'hFFFFFFFF; + +parameter dmac0_ns__pcell_id_3 = 32'hF8004FFC; +parameter val_dmac0_ns__pcell_id_3 = 32'h00000000; +parameter mask_dmac0_ns__pcell_id_3 = 32'hFFFFFFFF; + + +// ************************************************************ +// Module dmac0_s dmac +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter dmac0_s__DSR = 32'hF8003000; +parameter val_dmac0_s__DSR = 32'h00000000; +parameter mask_dmac0_s__DSR = 32'hFFFFFFFF; + +parameter dmac0_s__DPC = 32'hF8003004; +parameter val_dmac0_s__DPC = 32'h00000000; +parameter mask_dmac0_s__DPC = 32'hFFFFFFFF; + +parameter dmac0_s__INTEN = 32'hF8003020; +parameter val_dmac0_s__INTEN = 32'h00000000; +parameter mask_dmac0_s__INTEN = 32'hFFFFFFFF; + +parameter dmac0_s__INT_EVENT_RIS = 32'hF8003024; +parameter val_dmac0_s__INT_EVENT_RIS = 32'h00000000; +parameter mask_dmac0_s__INT_EVENT_RIS = 32'hFFFFFFFF; + +parameter dmac0_s__INTMIS = 32'hF8003028; +parameter val_dmac0_s__INTMIS = 32'h00000000; +parameter mask_dmac0_s__INTMIS = 32'hFFFFFFFF; + +parameter dmac0_s__INTCLR = 32'hF800302C; +parameter val_dmac0_s__INTCLR = 32'h00000000; +parameter mask_dmac0_s__INTCLR = 32'hFFFFFFFF; + +parameter dmac0_s__FSRD = 32'hF8003030; +parameter val_dmac0_s__FSRD = 32'h00000000; +parameter mask_dmac0_s__FSRD = 32'hFFFFFFFF; + +parameter dmac0_s__FSRC = 32'hF8003034; +parameter val_dmac0_s__FSRC = 32'h00000000; +parameter mask_dmac0_s__FSRC = 32'hFFFFFFFF; + +parameter dmac0_s__FTRD = 32'hF8003038; +parameter val_dmac0_s__FTRD = 32'h00000000; +parameter mask_dmac0_s__FTRD = 32'hFFFFFFFF; + +parameter dmac0_s__FTR0 = 32'hF8003040; +parameter val_dmac0_s__FTR0 = 32'h00000000; +parameter mask_dmac0_s__FTR0 = 32'hFFFFFFFF; + +parameter dmac0_s__FTR1 = 32'hF8003044; +parameter val_dmac0_s__FTR1 = 32'h00000000; +parameter mask_dmac0_s__FTR1 = 32'hFFFFFFFF; + +parameter dmac0_s__FTR2 = 32'hF8003048; +parameter val_dmac0_s__FTR2 = 32'h00000000; +parameter mask_dmac0_s__FTR2 = 32'hFFFFFFFF; + +parameter dmac0_s__FTR3 = 32'hF800304C; +parameter val_dmac0_s__FTR3 = 32'h00000000; +parameter mask_dmac0_s__FTR3 = 32'hFFFFFFFF; + +parameter dmac0_s__FTR4 = 32'hF8003050; +parameter val_dmac0_s__FTR4 = 32'h00000000; +parameter mask_dmac0_s__FTR4 = 32'hFFFFFFFF; + +parameter dmac0_s__FTR5 = 32'hF8003054; +parameter val_dmac0_s__FTR5 = 32'h00000000; +parameter mask_dmac0_s__FTR5 = 32'hFFFFFFFF; + +parameter dmac0_s__FTR6 = 32'hF8003058; +parameter val_dmac0_s__FTR6 = 32'h00000000; +parameter mask_dmac0_s__FTR6 = 32'hFFFFFFFF; + +parameter dmac0_s__FTR7 = 32'hF800305C; +parameter val_dmac0_s__FTR7 = 32'h00000000; +parameter mask_dmac0_s__FTR7 = 32'hFFFFFFFF; + +parameter dmac0_s__CSR0 = 32'hF8003100; +parameter val_dmac0_s__CSR0 = 32'h00000000; +parameter mask_dmac0_s__CSR0 = 32'hFFFFFFFF; + +parameter dmac0_s__CPC0 = 32'hF8003104; +parameter val_dmac0_s__CPC0 = 32'h00000000; +parameter mask_dmac0_s__CPC0 = 32'hFFFFFFFF; + +parameter dmac0_s__CSR1 = 32'hF8003108; +parameter val_dmac0_s__CSR1 = 32'h00000000; +parameter mask_dmac0_s__CSR1 = 32'hFFFFFFFF; + +parameter dmac0_s__CPC1 = 32'hF800310C; +parameter val_dmac0_s__CPC1 = 32'h00000000; +parameter mask_dmac0_s__CPC1 = 32'hFFFFFFFF; + +parameter dmac0_s__CSR2 = 32'hF8003110; +parameter val_dmac0_s__CSR2 = 32'h00000000; +parameter mask_dmac0_s__CSR2 = 32'hFFFFFFFF; + +parameter dmac0_s__CPC2 = 32'hF8003114; +parameter val_dmac0_s__CPC2 = 32'h00000000; +parameter mask_dmac0_s__CPC2 = 32'hFFFFFFFF; + +parameter dmac0_s__CSR3 = 32'hF8003118; +parameter val_dmac0_s__CSR3 = 32'h00000000; +parameter mask_dmac0_s__CSR3 = 32'hFFFFFFFF; + +parameter dmac0_s__CPC3 = 32'hF800311C; +parameter val_dmac0_s__CPC3 = 32'h00000000; +parameter mask_dmac0_s__CPC3 = 32'hFFFFFFFF; + +parameter dmac0_s__CSR4 = 32'hF8003120; +parameter val_dmac0_s__CSR4 = 32'h00000000; +parameter mask_dmac0_s__CSR4 = 32'hFFFFFFFF; + +parameter dmac0_s__CPC4 = 32'hF8003124; +parameter val_dmac0_s__CPC4 = 32'h00000000; +parameter mask_dmac0_s__CPC4 = 32'hFFFFFFFF; + +parameter dmac0_s__CSR5 = 32'hF8003128; +parameter val_dmac0_s__CSR5 = 32'h00000000; +parameter mask_dmac0_s__CSR5 = 32'hFFFFFFFF; + +parameter dmac0_s__CPC5 = 32'hF800312C; +parameter val_dmac0_s__CPC5 = 32'h00000000; +parameter mask_dmac0_s__CPC5 = 32'hFFFFFFFF; + +parameter dmac0_s__CSR6 = 32'hF8003130; +parameter val_dmac0_s__CSR6 = 32'h00000000; +parameter mask_dmac0_s__CSR6 = 32'hFFFFFFFF; + +parameter dmac0_s__CPC6 = 32'hF8003134; +parameter val_dmac0_s__CPC6 = 32'h00000000; +parameter mask_dmac0_s__CPC6 = 32'hFFFFFFFF; + +parameter dmac0_s__CSR7 = 32'hF8003138; +parameter val_dmac0_s__CSR7 = 32'h00000000; +parameter mask_dmac0_s__CSR7 = 32'hFFFFFFFF; + +parameter dmac0_s__CPC7 = 32'hF800313C; +parameter val_dmac0_s__CPC7 = 32'h00000000; +parameter mask_dmac0_s__CPC7 = 32'hFFFFFFFF; + +parameter dmac0_s__SAR0 = 32'hF8003400; +parameter val_dmac0_s__SAR0 = 32'h00000000; +parameter mask_dmac0_s__SAR0 = 32'hFFFFFFFF; + +parameter dmac0_s__DAR0 = 32'hF8003404; +parameter val_dmac0_s__DAR0 = 32'h00000000; +parameter mask_dmac0_s__DAR0 = 32'hFFFFFFFF; + +parameter dmac0_s__CCR0 = 32'hF8003408; +parameter val_dmac0_s__CCR0 = 32'h00800200; +parameter mask_dmac0_s__CCR0 = 32'hFFFFFFFF; + +parameter dmac0_s__LC0_0 = 32'hF800340C; +parameter val_dmac0_s__LC0_0 = 32'h00000000; +parameter mask_dmac0_s__LC0_0 = 32'hFFFFFFFF; + +parameter dmac0_s__LC1_0 = 32'hF8003410; +parameter val_dmac0_s__LC1_0 = 32'h00000000; +parameter mask_dmac0_s__LC1_0 = 32'hFFFFFFFF; + +parameter dmac0_s__SAR1 = 32'hF8003420; +parameter val_dmac0_s__SAR1 = 32'h00000000; +parameter mask_dmac0_s__SAR1 = 32'hFFFFFFFF; + +parameter dmac0_s__DAR1 = 32'hF8003424; +parameter val_dmac0_s__DAR1 = 32'h00000000; +parameter mask_dmac0_s__DAR1 = 32'hFFFFFFFF; + +parameter dmac0_s__CCR1 = 32'hF8003428; +parameter val_dmac0_s__CCR1 = 32'h00800200; +parameter mask_dmac0_s__CCR1 = 32'hFFFFFFFF; + +parameter dmac0_s__LC0_1 = 32'hF800342C; +parameter val_dmac0_s__LC0_1 = 32'h00000000; +parameter mask_dmac0_s__LC0_1 = 32'hFFFFFFFF; + +parameter dmac0_s__LC1_1 = 32'hF8003430; +parameter val_dmac0_s__LC1_1 = 32'h00000000; +parameter mask_dmac0_s__LC1_1 = 32'hFFFFFFFF; + +parameter dmac0_s__SAR2 = 32'hF8003440; +parameter val_dmac0_s__SAR2 = 32'h00000000; +parameter mask_dmac0_s__SAR2 = 32'hFFFFFFFF; + +parameter dmac0_s__DAR2 = 32'hF8003444; +parameter val_dmac0_s__DAR2 = 32'h00000000; +parameter mask_dmac0_s__DAR2 = 32'hFFFFFFFF; + +parameter dmac0_s__CCR2 = 32'hF8003448; +parameter val_dmac0_s__CCR2 = 32'h00800200; +parameter mask_dmac0_s__CCR2 = 32'hFFFFFFFF; + +parameter dmac0_s__LC0_2 = 32'hF800344C; +parameter val_dmac0_s__LC0_2 = 32'h00000000; +parameter mask_dmac0_s__LC0_2 = 32'hFFFFFFFF; + +parameter dmac0_s__LC1_2 = 32'hF8003450; +parameter val_dmac0_s__LC1_2 = 32'h00000000; +parameter mask_dmac0_s__LC1_2 = 32'hFFFFFFFF; + +parameter dmac0_s__SAR3 = 32'hF8003460; +parameter val_dmac0_s__SAR3 = 32'h00000000; +parameter mask_dmac0_s__SAR3 = 32'hFFFFFFFF; + +parameter dmac0_s__DAR3 = 32'hF8003464; +parameter val_dmac0_s__DAR3 = 32'h00000000; +parameter mask_dmac0_s__DAR3 = 32'hFFFFFFFF; + +parameter dmac0_s__CCR3 = 32'hF8003468; +parameter val_dmac0_s__CCR3 = 32'h00800200; +parameter mask_dmac0_s__CCR3 = 32'hFFFFFFFF; + +parameter dmac0_s__LC0_3 = 32'hF800346C; +parameter val_dmac0_s__LC0_3 = 32'h00000000; +parameter mask_dmac0_s__LC0_3 = 32'hFFFFFFFF; + +parameter dmac0_s__LC1_3 = 32'hF8003470; +parameter val_dmac0_s__LC1_3 = 32'h00000000; +parameter mask_dmac0_s__LC1_3 = 32'hFFFFFFFF; + +parameter dmac0_s__SAR4 = 32'hF8003480; +parameter val_dmac0_s__SAR4 = 32'h00000000; +parameter mask_dmac0_s__SAR4 = 32'hFFFFFFFF; + +parameter dmac0_s__DAR4 = 32'hF8003484; +parameter val_dmac0_s__DAR4 = 32'h00000000; +parameter mask_dmac0_s__DAR4 = 32'hFFFFFFFF; + +parameter dmac0_s__CCR4 = 32'hF8003488; +parameter val_dmac0_s__CCR4 = 32'h00800200; +parameter mask_dmac0_s__CCR4 = 32'hFFFFFFFF; + +parameter dmac0_s__LC0_4 = 32'hF800348C; +parameter val_dmac0_s__LC0_4 = 32'h00000000; +parameter mask_dmac0_s__LC0_4 = 32'hFFFFFFFF; + +parameter dmac0_s__LC1_4 = 32'hF8003490; +parameter val_dmac0_s__LC1_4 = 32'h00000000; +parameter mask_dmac0_s__LC1_4 = 32'hFFFFFFFF; + +parameter dmac0_s__SAR5 = 32'hF80034A0; +parameter val_dmac0_s__SAR5 = 32'h00000000; +parameter mask_dmac0_s__SAR5 = 32'hFFFFFFFF; + +parameter dmac0_s__DAR5 = 32'hF80034A4; +parameter val_dmac0_s__DAR5 = 32'h00000000; +parameter mask_dmac0_s__DAR5 = 32'hFFFFFFFF; + +parameter dmac0_s__CCR5 = 32'hF80034A8; +parameter val_dmac0_s__CCR5 = 32'h00800200; +parameter mask_dmac0_s__CCR5 = 32'hFFFFFFFF; + +parameter dmac0_s__LC0_5 = 32'hF80034AC; +parameter val_dmac0_s__LC0_5 = 32'h00000000; +parameter mask_dmac0_s__LC0_5 = 32'hFFFFFFFF; + +parameter dmac0_s__LC1_5 = 32'hF80034B0; +parameter val_dmac0_s__LC1_5 = 32'h00000000; +parameter mask_dmac0_s__LC1_5 = 32'hFFFFFFFF; + +parameter dmac0_s__SAR6 = 32'hF80034C0; +parameter val_dmac0_s__SAR6 = 32'h00000000; +parameter mask_dmac0_s__SAR6 = 32'hFFFFFFFF; + +parameter dmac0_s__DAR6 = 32'hF80034C4; +parameter val_dmac0_s__DAR6 = 32'h00000000; +parameter mask_dmac0_s__DAR6 = 32'hFFFFFFFF; + +parameter dmac0_s__CCR6 = 32'hF80034C8; +parameter val_dmac0_s__CCR6 = 32'h00800200; +parameter mask_dmac0_s__CCR6 = 32'hFFFFFFFF; + +parameter dmac0_s__LC0_6 = 32'hF80034CC; +parameter val_dmac0_s__LC0_6 = 32'h00000000; +parameter mask_dmac0_s__LC0_6 = 32'hFFFFFFFF; + +parameter dmac0_s__LC1_6 = 32'hF80034D0; +parameter val_dmac0_s__LC1_6 = 32'h00000000; +parameter mask_dmac0_s__LC1_6 = 32'hFFFFFFFF; + +parameter dmac0_s__SAR7 = 32'hF80034E0; +parameter val_dmac0_s__SAR7 = 32'h00000000; +parameter mask_dmac0_s__SAR7 = 32'hFFFFFFFF; + +parameter dmac0_s__DAR7 = 32'hF80034E4; +parameter val_dmac0_s__DAR7 = 32'h00000000; +parameter mask_dmac0_s__DAR7 = 32'hFFFFFFFF; + +parameter dmac0_s__CCR7 = 32'hF80034E8; +parameter val_dmac0_s__CCR7 = 32'h00800200; +parameter mask_dmac0_s__CCR7 = 32'hFFFFFFFF; + +parameter dmac0_s__LC0_7 = 32'hF80034EC; +parameter val_dmac0_s__LC0_7 = 32'h00000000; +parameter mask_dmac0_s__LC0_7 = 32'hFFFFFFFF; + +parameter dmac0_s__LC1_7 = 32'hF80034F0; +parameter val_dmac0_s__LC1_7 = 32'h00000000; +parameter mask_dmac0_s__LC1_7 = 32'hFFFFFFFF; + +parameter dmac0_s__DBGSTATUS = 32'hF8003D00; +parameter val_dmac0_s__DBGSTATUS = 32'h00000000; +parameter mask_dmac0_s__DBGSTATUS = 32'hFFFFFFFF; + +parameter dmac0_s__DBGCMD = 32'hF8003D04; +parameter val_dmac0_s__DBGCMD = 32'h00000000; +parameter mask_dmac0_s__DBGCMD = 32'hFFFFFFFF; + +parameter dmac0_s__DBGINST0 = 32'hF8003D08; +parameter val_dmac0_s__DBGINST0 = 32'h00000000; +parameter mask_dmac0_s__DBGINST0 = 32'hFFFFFFFF; + +parameter dmac0_s__DBGINST1 = 32'hF8003D0C; +parameter val_dmac0_s__DBGINST1 = 32'h00000000; +parameter mask_dmac0_s__DBGINST1 = 32'hFFFFFFFF; + +parameter dmac0_s__CR0 = 32'hF8003E00; +parameter val_dmac0_s__CR0 = 32'h001E3071; +parameter mask_dmac0_s__CR0 = 32'hFFFFFFFF; + +parameter dmac0_s__CR1 = 32'hF8003E04; +parameter val_dmac0_s__CR1 = 32'h00000074; +parameter mask_dmac0_s__CR1 = 32'hFFFFFFFF; + +parameter dmac0_s__CR2 = 32'hF8003E08; +parameter val_dmac0_s__CR2 = 32'h00000000; +parameter mask_dmac0_s__CR2 = 32'hFFFFFFFF; + +parameter dmac0_s__CR3 = 32'hF8003E0C; +parameter val_dmac0_s__CR3 = 32'h00000000; +parameter mask_dmac0_s__CR3 = 32'hFFFFFFFF; + +parameter dmac0_s__CR4 = 32'hF8003E10; +parameter val_dmac0_s__CR4 = 32'h00000000; +parameter mask_dmac0_s__CR4 = 32'hFFFFFFFF; + +parameter dmac0_s__CRD = 32'hF8003E14; +parameter val_dmac0_s__CRD = 32'h07FF7F73; +parameter mask_dmac0_s__CRD = 32'hFFFFFFFF; + +parameter dmac0_s__WD = 32'hF8003E80; +parameter val_dmac0_s__WD = 32'h00000000; +parameter mask_dmac0_s__WD = 32'hFFFFFFFF; + +parameter dmac0_s__periph_id_0 = 32'hF8003FE0; +parameter val_dmac0_s__periph_id_0 = 32'h00000030; +parameter mask_dmac0_s__periph_id_0 = 32'hFFFFFFFF; + +parameter dmac0_s__periph_id_1 = 32'hF8003FE4; +parameter val_dmac0_s__periph_id_1 = 32'h00000013; +parameter mask_dmac0_s__periph_id_1 = 32'hFFFFFFFF; + +parameter dmac0_s__periph_id_2 = 32'hF8003FE8; +parameter val_dmac0_s__periph_id_2 = 32'h00000024; +parameter mask_dmac0_s__periph_id_2 = 32'hFFFFFFFF; + +parameter dmac0_s__periph_id_3 = 32'hF8003FEC; +parameter val_dmac0_s__periph_id_3 = 32'h00000000; +parameter mask_dmac0_s__periph_id_3 = 32'hFFFFFFFF; + +parameter dmac0_s__pcell_id_0 = 32'hF8003FF0; +parameter val_dmac0_s__pcell_id_0 = 32'h0000000D; +parameter mask_dmac0_s__pcell_id_0 = 32'hFFFFFFFF; + +parameter dmac0_s__pcell_id_1 = 32'hF8003FF4; +parameter val_dmac0_s__pcell_id_1 = 32'h000000F0; +parameter mask_dmac0_s__pcell_id_1 = 32'hFFFFFFFF; + +parameter dmac0_s__pcell_id_2 = 32'hF8003FF8; +parameter val_dmac0_s__pcell_id_2 = 32'h00000005; +parameter mask_dmac0_s__pcell_id_2 = 32'hFFFFFFFF; + +parameter dmac0_s__pcell_id_3 = 32'hF8003FFC; +parameter val_dmac0_s__pcell_id_3 = 32'h000000B1; +parameter mask_dmac0_s__pcell_id_3 = 32'hFFFFFFFF; + + +// ************************************************************ +// Module efuse_ctrl efuse_ctrl +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter efuse_ctrl__WR_LOCK = 32'hF800D000; +parameter val_efuse_ctrl__WR_LOCK = 32'h00000000; +parameter mask_efuse_ctrl__WR_LOCK = 32'hFFFFFFFF; + +parameter efuse_ctrl__WR_UNLOCK = 32'hF800D004; +parameter val_efuse_ctrl__WR_UNLOCK = 32'h00000000; +parameter mask_efuse_ctrl__WR_UNLOCK = 32'hFFFFFFFF; + +parameter efuse_ctrl__WR_LOCKSTA = 32'hF800D008; +parameter val_efuse_ctrl__WR_LOCKSTA = 32'h00000001; +parameter mask_efuse_ctrl__WR_LOCKSTA = 32'hFFFFFFFF; + +parameter efuse_ctrl__CFG = 32'hF800D00C; +parameter val_efuse_ctrl__CFG = 32'h00010F00; +parameter mask_efuse_ctrl__CFG = 32'hFFFFFFFF; + +parameter efuse_ctrl__STATUS = 32'hF800D010; +parameter val_efuse_ctrl__STATUS = 32'h00100000; +parameter mask_efuse_ctrl__STATUS = 32'hFFFFFFFF; + +parameter efuse_ctrl__CONTROL = 32'hF800D014; +parameter val_efuse_ctrl__CONTROL = 32'h00000003; +parameter mask_efuse_ctrl__CONTROL = 32'hFFFFFFFF; + +parameter efuse_ctrl__PGM_STBW = 32'hF800D018; +parameter val_efuse_ctrl__PGM_STBW = 32'h000002D0; +parameter mask_efuse_ctrl__PGM_STBW = 32'hFFFFFFFF; + +parameter efuse_ctrl__RD_STBW = 32'hF800D01C; +parameter val_efuse_ctrl__RD_STBW = 32'h0000000B; +parameter mask_efuse_ctrl__RD_STBW = 32'hFFFFFFFF; + + +// ************************************************************ +// Module gem0 GEM +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter gem0__net_ctrl = 32'hE000B000; +parameter val_gem0__net_ctrl = 32'h00000000; +parameter mask_gem0__net_ctrl = 32'hFFFFFFFF; + +parameter gem0__net_cfg = 32'hE000B004; +parameter val_gem0__net_cfg = 32'h00080000; +parameter mask_gem0__net_cfg = 32'hFFFFFFFF; + +parameter gem0__net_status = 32'hE000B008; +parameter val_gem0__net_status = 32'h00000004; +parameter mask_gem0__net_status = 32'hFFFFFFFD; + +parameter gem0__user_io = 32'hE000B00C; +parameter val_gem0__user_io = 32'h00000000; +parameter mask_gem0__user_io = 32'h0000FFFF; + +parameter gem0__dma_cfg = 32'hE000B010; +parameter val_gem0__dma_cfg = 32'h00020784; +parameter mask_gem0__dma_cfg = 32'hFFFFFFFF; + +parameter gem0__tx_status = 32'hE000B014; +parameter val_gem0__tx_status = 32'h00000000; +parameter mask_gem0__tx_status = 32'hFFFFFFFF; + +parameter gem0__rx_qbar = 32'hE000B018; +parameter val_gem0__rx_qbar = 32'h00000000; +parameter mask_gem0__rx_qbar = 32'hFFFFFFFF; + +parameter gem0__tx_qbar = 32'hE000B01C; +parameter val_gem0__tx_qbar = 32'h00000000; +parameter mask_gem0__tx_qbar = 32'hFFFFFFFF; + +parameter gem0__rx_status = 32'hE000B020; +parameter val_gem0__rx_status = 32'h00000000; +parameter mask_gem0__rx_status = 32'hFFFFFFFF; + +parameter gem0__intr_status = 32'hE000B024; +parameter val_gem0__intr_status = 32'h00000000; +parameter mask_gem0__intr_status = 32'hFFFFFFFF; + +parameter gem0__intr_en = 32'hE000B028; +parameter val_gem0__intr_en = 32'h00000000; +parameter mask_gem0__intr_en = 32'h00000000; + +parameter gem0__intr_dis = 32'hE000B02C; +parameter val_gem0__intr_dis = 32'h00000000; +parameter mask_gem0__intr_dis = 32'h00000000; + +parameter gem0__intr_mask = 32'hE000B030; +parameter val_gem0__intr_mask = 32'h0001FFFF; +parameter mask_gem0__intr_mask = 32'hFC01FFFF; + +parameter gem0__phy_maint = 32'hE000B034; +parameter val_gem0__phy_maint = 32'h00000000; +parameter mask_gem0__phy_maint = 32'hFFFFFFFF; + +parameter gem0__rx_pauseq = 32'hE000B038; +parameter val_gem0__rx_pauseq = 32'h00000000; +parameter mask_gem0__rx_pauseq = 32'hFFFFFFFF; + +parameter gem0__tx_pauseq = 32'hE000B03C; +parameter val_gem0__tx_pauseq = 32'h0000FFFF; +parameter mask_gem0__tx_pauseq = 32'hFFFFFFFF; + +parameter gem0__tx_partial_st_fwd = 32'hE000B040; +parameter val_gem0__tx_partial_st_fwd = 32'h000003FF; +parameter mask_gem0__tx_partial_st_fwd = 32'hFFFFFFFF; + +parameter gem0__rx_partial_st_fwd = 32'hE000B044; +parameter val_gem0__rx_partial_st_fwd = 32'h000003FF; +parameter mask_gem0__rx_partial_st_fwd = 32'hFFFFFFFF; + +parameter gem0__hash_bot = 32'hE000B080; +parameter val_gem0__hash_bot = 32'h00000000; +parameter mask_gem0__hash_bot = 32'hFFFFFFFF; + +parameter gem0__hash_top = 32'hE000B084; +parameter val_gem0__hash_top = 32'h00000000; +parameter mask_gem0__hash_top = 32'hFFFFFFFF; + +parameter gem0__spec_addr1_bot = 32'hE000B088; +parameter val_gem0__spec_addr1_bot = 32'h00000000; +parameter mask_gem0__spec_addr1_bot = 32'hFFFFFFFF; + +parameter gem0__spec_addr1_top = 32'hE000B08C; +parameter val_gem0__spec_addr1_top = 32'h00000000; +parameter mask_gem0__spec_addr1_top = 32'hFFFFFFFF; + +parameter gem0__spec_addr2_bot = 32'hE000B090; +parameter val_gem0__spec_addr2_bot = 32'h00000000; +parameter mask_gem0__spec_addr2_bot = 32'hFFFFFFFF; + +parameter gem0__spec_addr2_top = 32'hE000B094; +parameter val_gem0__spec_addr2_top = 32'h00000000; +parameter mask_gem0__spec_addr2_top = 32'hFFFFFFFF; + +parameter gem0__spec_addr3_bot = 32'hE000B098; +parameter val_gem0__spec_addr3_bot = 32'h00000000; +parameter mask_gem0__spec_addr3_bot = 32'hFFFFFFFF; + +parameter gem0__spec_addr3_top = 32'hE000B09C; +parameter val_gem0__spec_addr3_top = 32'h00000000; +parameter mask_gem0__spec_addr3_top = 32'hFFFFFFFF; + +parameter gem0__spec_addr4_bot = 32'hE000B0A0; +parameter val_gem0__spec_addr4_bot = 32'h00000000; +parameter mask_gem0__spec_addr4_bot = 32'hFFFFFFFF; + +parameter gem0__spec_addr4_top = 32'hE000B0A4; +parameter val_gem0__spec_addr4_top = 32'h00000000; +parameter mask_gem0__spec_addr4_top = 32'hFFFFFFFF; + +parameter gem0__type_id_match1 = 32'hE000B0A8; +parameter val_gem0__type_id_match1 = 32'h00000000; +parameter mask_gem0__type_id_match1 = 32'hFFFFFFFF; + +parameter gem0__type_id_match2 = 32'hE000B0AC; +parameter val_gem0__type_id_match2 = 32'h00000000; +parameter mask_gem0__type_id_match2 = 32'hFFFFFFFF; + +parameter gem0__type_id_match3 = 32'hE000B0B0; +parameter val_gem0__type_id_match3 = 32'h00000000; +parameter mask_gem0__type_id_match3 = 32'hFFFFFFFF; + +parameter gem0__type_id_match4 = 32'hE000B0B4; +parameter val_gem0__type_id_match4 = 32'h00000000; +parameter mask_gem0__type_id_match4 = 32'hFFFFFFFF; + +parameter gem0__wake_on_lan = 32'hE000B0B8; +parameter val_gem0__wake_on_lan = 32'h00000000; +parameter mask_gem0__wake_on_lan = 32'hFFFFFFFF; + +parameter gem0__ipg_stretch = 32'hE000B0BC; +parameter val_gem0__ipg_stretch = 32'h00000000; +parameter mask_gem0__ipg_stretch = 32'hFFFFFFFF; + +parameter gem0__stacked_vlan = 32'hE000B0C0; +parameter val_gem0__stacked_vlan = 32'h00000000; +parameter mask_gem0__stacked_vlan = 32'hFFFFFFFF; + +parameter gem0__tx_pfc_pause = 32'hE000B0C4; +parameter val_gem0__tx_pfc_pause = 32'h00000000; +parameter mask_gem0__tx_pfc_pause = 32'hFFFFFFFF; + +parameter gem0__spec_addr1_mask_bot = 32'hE000B0C8; +parameter val_gem0__spec_addr1_mask_bot = 32'h00000000; +parameter mask_gem0__spec_addr1_mask_bot = 32'hFFFFFFFF; + +parameter gem0__spec_addr1_mask_top = 32'hE000B0CC; +parameter val_gem0__spec_addr1_mask_top = 32'h00000000; +parameter mask_gem0__spec_addr1_mask_top = 32'hFFFFFFFF; + +parameter gem0__module_id = 32'hE000B0FC; +parameter val_gem0__module_id = 32'h00020118; +parameter mask_gem0__module_id = 32'hFFFFFFFF; + +parameter gem0__octets_tx_bot = 32'hE000B100; +parameter val_gem0__octets_tx_bot = 32'h00000000; +parameter mask_gem0__octets_tx_bot = 32'hFFFFFFFF; + +parameter gem0__octets_tx_top = 32'hE000B104; +parameter val_gem0__octets_tx_top = 32'h00000000; +parameter mask_gem0__octets_tx_top = 32'hFFFFFFFF; + +parameter gem0__frames_tx = 32'hE000B108; +parameter val_gem0__frames_tx = 32'h00000000; +parameter mask_gem0__frames_tx = 32'hFFFFFFFF; + +parameter gem0__broadcast_frames_tx = 32'hE000B10C; +parameter val_gem0__broadcast_frames_tx = 32'h00000000; +parameter mask_gem0__broadcast_frames_tx = 32'hFFFFFFFF; + +parameter gem0__multi_frames_tx = 32'hE000B110; +parameter val_gem0__multi_frames_tx = 32'h00000000; +parameter mask_gem0__multi_frames_tx = 32'hFFFFFFFF; + +parameter gem0__pause_frames_tx = 32'hE000B114; +parameter val_gem0__pause_frames_tx = 32'h00000000; +parameter mask_gem0__pause_frames_tx = 32'hFFFFFFFF; + +parameter gem0__frames_64b_tx = 32'hE000B118; +parameter val_gem0__frames_64b_tx = 32'h00000000; +parameter mask_gem0__frames_64b_tx = 32'hFFFFFFFF; + +parameter gem0__frames_65to127b_tx = 32'hE000B11C; +parameter val_gem0__frames_65to127b_tx = 32'h00000000; +parameter mask_gem0__frames_65to127b_tx = 32'hFFFFFFFF; + +parameter gem0__frames_128to255b_tx = 32'hE000B120; +parameter val_gem0__frames_128to255b_tx = 32'h00000000; +parameter mask_gem0__frames_128to255b_tx = 32'hFFFFFFFF; + +parameter gem0__frames_256to511b_tx = 32'hE000B124; +parameter val_gem0__frames_256to511b_tx = 32'h00000000; +parameter mask_gem0__frames_256to511b_tx = 32'hFFFFFFFF; + +parameter gem0__frames_512to1023b_tx = 32'hE000B128; +parameter val_gem0__frames_512to1023b_tx = 32'h00000000; +parameter mask_gem0__frames_512to1023b_tx = 32'hFFFFFFFF; + +parameter gem0__frames_1024to1518b_tx = 32'hE000B12C; +parameter val_gem0__frames_1024to1518b_tx = 32'h00000000; +parameter mask_gem0__frames_1024to1518b_tx = 32'hFFFFFFFF; + +parameter gem0__frames_gt1518b_tx = 32'hE000B130; +parameter val_gem0__frames_gt1518b_tx = 32'h00000000; +parameter mask_gem0__frames_gt1518b_tx = 32'hFFFFFFFF; + +parameter gem0__tx_under_runs = 32'hE000B134; +parameter val_gem0__tx_under_runs = 32'h00000000; +parameter mask_gem0__tx_under_runs = 32'hFFFFFFFF; + +parameter gem0__single_collisn_frames = 32'hE000B138; +parameter val_gem0__single_collisn_frames = 32'h00000000; +parameter mask_gem0__single_collisn_frames = 32'hFFFFFFFF; + +parameter gem0__multi_collisn_frames = 32'hE000B13C; +parameter val_gem0__multi_collisn_frames = 32'h00000000; +parameter mask_gem0__multi_collisn_frames = 32'hFFFFFFFF; + +parameter gem0__excessive_collisns = 32'hE000B140; +parameter val_gem0__excessive_collisns = 32'h00000000; +parameter mask_gem0__excessive_collisns = 32'hFFFFFFFF; + +parameter gem0__late_collisns = 32'hE000B144; +parameter val_gem0__late_collisns = 32'h00000000; +parameter mask_gem0__late_collisns = 32'hFFFFFFFF; + +parameter gem0__deferred_tx_frames = 32'hE000B148; +parameter val_gem0__deferred_tx_frames = 32'h00000000; +parameter mask_gem0__deferred_tx_frames = 32'hFFFFFFFF; + +parameter gem0__carrier_sense_errs = 32'hE000B14C; +parameter val_gem0__carrier_sense_errs = 32'h00000000; +parameter mask_gem0__carrier_sense_errs = 32'hFFFFFFFF; + +parameter gem0__octets_rx_bot = 32'hE000B150; +parameter val_gem0__octets_rx_bot = 32'h00000000; +parameter mask_gem0__octets_rx_bot = 32'hFFFFFFFF; + +parameter gem0__octets_rx_top = 32'hE000B154; +parameter val_gem0__octets_rx_top = 32'h00000000; +parameter mask_gem0__octets_rx_top = 32'hFFFFFFFF; + +parameter gem0__frames_rx = 32'hE000B158; +parameter val_gem0__frames_rx = 32'h00000000; +parameter mask_gem0__frames_rx = 32'hFFFFFFFF; + +parameter gem0__bdcast_fames_rx = 32'hE000B15C; +parameter val_gem0__bdcast_fames_rx = 32'h00000000; +parameter mask_gem0__bdcast_fames_rx = 32'hFFFFFFFF; + +parameter gem0__multi_frames_rx = 32'hE000B160; +parameter val_gem0__multi_frames_rx = 32'h00000000; +parameter mask_gem0__multi_frames_rx = 32'hFFFFFFFF; + +parameter gem0__pause_rx = 32'hE000B164; +parameter val_gem0__pause_rx = 32'h00000000; +parameter mask_gem0__pause_rx = 32'hFFFFFFFF; + +parameter gem0__frames_64b_rx = 32'hE000B168; +parameter val_gem0__frames_64b_rx = 32'h00000000; +parameter mask_gem0__frames_64b_rx = 32'hFFFFFFFF; + +parameter gem0__frames_65to127b_rx = 32'hE000B16C; +parameter val_gem0__frames_65to127b_rx = 32'h00000000; +parameter mask_gem0__frames_65to127b_rx = 32'hFFFFFFFF; + +parameter gem0__frames_128to255b_rx = 32'hE000B170; +parameter val_gem0__frames_128to255b_rx = 32'h00000000; +parameter mask_gem0__frames_128to255b_rx = 32'hFFFFFFFF; + +parameter gem0__frames_256to511b_rx = 32'hE000B174; +parameter val_gem0__frames_256to511b_rx = 32'h00000000; +parameter mask_gem0__frames_256to511b_rx = 32'hFFFFFFFF; + +parameter gem0__frames_512to1023b_rx = 32'hE000B178; +parameter val_gem0__frames_512to1023b_rx = 32'h00000000; +parameter mask_gem0__frames_512to1023b_rx = 32'hFFFFFFFF; + +parameter gem0__frames_1024to1518b_rx = 32'hE000B17C; +parameter val_gem0__frames_1024to1518b_rx = 32'h00000000; +parameter mask_gem0__frames_1024to1518b_rx = 32'hFFFFFFFF; + +parameter gem0__frames_gt1518b_rx = 32'hE000B180; +parameter val_gem0__frames_gt1518b_rx = 32'h00000000; +parameter mask_gem0__frames_gt1518b_rx = 32'hFFFFFFFF; + +parameter gem0__undersz_rx = 32'hE000B184; +parameter val_gem0__undersz_rx = 32'h00000000; +parameter mask_gem0__undersz_rx = 32'hFFFFFFFF; + +parameter gem0__oversz_rx = 32'hE000B188; +parameter val_gem0__oversz_rx = 32'h00000000; +parameter mask_gem0__oversz_rx = 32'hFFFFFFFF; + +parameter gem0__jab_rx = 32'hE000B18C; +parameter val_gem0__jab_rx = 32'h00000000; +parameter mask_gem0__jab_rx = 32'hFFFFFFFF; + +parameter gem0__fcs_errors = 32'hE000B190; +parameter val_gem0__fcs_errors = 32'h00000000; +parameter mask_gem0__fcs_errors = 32'hFFFFFFFF; + +parameter gem0__length_field_errors = 32'hE000B194; +parameter val_gem0__length_field_errors = 32'h00000000; +parameter mask_gem0__length_field_errors = 32'hFFFFFFFF; + +parameter gem0__rx_symbol_errors = 32'hE000B198; +parameter val_gem0__rx_symbol_errors = 32'h00000000; +parameter mask_gem0__rx_symbol_errors = 32'hFFFFFFFF; + +parameter gem0__align_errors = 32'hE000B19C; +parameter val_gem0__align_errors = 32'h00000000; +parameter mask_gem0__align_errors = 32'hFFFFFFFF; + +parameter gem0__rx_resource_errors = 32'hE000B1A0; +parameter val_gem0__rx_resource_errors = 32'h00000000; +parameter mask_gem0__rx_resource_errors = 32'hFFFFFFFF; + +parameter gem0__rx_overrun_errors = 32'hE000B1A4; +parameter val_gem0__rx_overrun_errors = 32'h00000000; +parameter mask_gem0__rx_overrun_errors = 32'hFFFFFFFF; + +parameter gem0__ip_hdr_csum_errors = 32'hE000B1A8; +parameter val_gem0__ip_hdr_csum_errors = 32'h00000000; +parameter mask_gem0__ip_hdr_csum_errors = 32'hFFFFFFFF; + +parameter gem0__tcp_csum_errors = 32'hE000B1AC; +parameter val_gem0__tcp_csum_errors = 32'h00000000; +parameter mask_gem0__tcp_csum_errors = 32'hFFFFFFFF; + +parameter gem0__udp_csum_errors = 32'hE000B1B0; +parameter val_gem0__udp_csum_errors = 32'h00000000; +parameter mask_gem0__udp_csum_errors = 32'hFFFFFFFF; + +parameter gem0__timer_strobe_s = 32'hE000B1C8; +parameter val_gem0__timer_strobe_s = 32'h00000000; +parameter mask_gem0__timer_strobe_s = 32'hFFFFFFFF; + +parameter gem0__timer_strobe_ns = 32'hE000B1CC; +parameter val_gem0__timer_strobe_ns = 32'h00000000; +parameter mask_gem0__timer_strobe_ns = 32'hFFFFFFFF; + +parameter gem0__timer_s = 32'hE000B1D0; +parameter val_gem0__timer_s = 32'h00000000; +parameter mask_gem0__timer_s = 32'hFFFFFFFF; + +parameter gem0__timer_ns = 32'hE000B1D4; +parameter val_gem0__timer_ns = 32'h00000000; +parameter mask_gem0__timer_ns = 32'hFFFFFFFF; + +parameter gem0__timer_adjust = 32'hE000B1D8; +parameter val_gem0__timer_adjust = 32'h00000000; +parameter mask_gem0__timer_adjust = 32'hFFFFFFFF; + +parameter gem0__timer_incr = 32'hE000B1DC; +parameter val_gem0__timer_incr = 32'h00000000; +parameter mask_gem0__timer_incr = 32'hFFFFFFFF; + +parameter gem0__ptp_tx_s = 32'hE000B1E0; +parameter val_gem0__ptp_tx_s = 32'h00000000; +parameter mask_gem0__ptp_tx_s = 32'hFFFFFFFF; + +parameter gem0__ptp_tx_ns = 32'hE000B1E4; +parameter val_gem0__ptp_tx_ns = 32'h00000000; +parameter mask_gem0__ptp_tx_ns = 32'hFFFFFFFF; + +parameter gem0__ptp_rx_s = 32'hE000B1E8; +parameter val_gem0__ptp_rx_s = 32'h00000000; +parameter mask_gem0__ptp_rx_s = 32'hFFFFFFFF; + +parameter gem0__ptp_rx_ns = 32'hE000B1EC; +parameter val_gem0__ptp_rx_ns = 32'h00000000; +parameter mask_gem0__ptp_rx_ns = 32'hFFFFFFFF; + +parameter gem0__ptp_peer_tx_s = 32'hE000B1F0; +parameter val_gem0__ptp_peer_tx_s = 32'h00000000; +parameter mask_gem0__ptp_peer_tx_s = 32'hFFFFFFFF; + +parameter gem0__ptp_peer_tx_ns = 32'hE000B1F4; +parameter val_gem0__ptp_peer_tx_ns = 32'h00000000; +parameter mask_gem0__ptp_peer_tx_ns = 32'hFFFFFFFF; + +parameter gem0__ptp_peer_rx_s = 32'hE000B1F8; +parameter val_gem0__ptp_peer_rx_s = 32'h00000000; +parameter mask_gem0__ptp_peer_rx_s = 32'hFFFFFFFF; + +parameter gem0__ptp_peer_rx_ns = 32'hE000B1FC; +parameter val_gem0__ptp_peer_rx_ns = 32'h00000000; +parameter mask_gem0__ptp_peer_rx_ns = 32'hFFFFFFFF; + +parameter gem0__pcs_ctrl = 32'hE000B200; +parameter val_gem0__pcs_ctrl = 32'h00000000; +parameter mask_gem0__pcs_ctrl = 32'h00000000; + +parameter gem0__pcs_status = 32'hE000B204; +parameter val_gem0__pcs_status = 32'h00000000; +parameter mask_gem0__pcs_status = 32'h00000000; + +parameter gem0__pcs_upper_phy_id = 32'hE000B208; +parameter val_gem0__pcs_upper_phy_id = 32'h00000000; +parameter mask_gem0__pcs_upper_phy_id = 32'h00000000; + +parameter gem0__pcs_lower_phy_id = 32'hE000B20C; +parameter val_gem0__pcs_lower_phy_id = 32'h00000000; +parameter mask_gem0__pcs_lower_phy_id = 32'h00000000; + +parameter gem0__pcs_autoneg_ad = 32'hE000B210; +parameter val_gem0__pcs_autoneg_ad = 32'h00000000; +parameter mask_gem0__pcs_autoneg_ad = 32'h00000000; + +parameter gem0__pcs_autoneg_ability = 32'hE000B214; +parameter val_gem0__pcs_autoneg_ability = 32'h00000000; +parameter mask_gem0__pcs_autoneg_ability = 32'h00000000; + +parameter gem0__pcs_autonec_exp = 32'hE000B218; +parameter val_gem0__pcs_autonec_exp = 32'h00000000; +parameter mask_gem0__pcs_autonec_exp = 32'h00000000; + +parameter gem0__pcs_autoneg_next_pg = 32'hE000B21C; +parameter val_gem0__pcs_autoneg_next_pg = 32'h00000000; +parameter mask_gem0__pcs_autoneg_next_pg = 32'h00000000; + +parameter gem0__pcs_autoneg_pnext_pg = 32'hE000B220; +parameter val_gem0__pcs_autoneg_pnext_pg = 32'h00000000; +parameter mask_gem0__pcs_autoneg_pnext_pg = 32'h00000000; + +parameter gem0__pcs_extended_status = 32'hE000B23C; +parameter val_gem0__pcs_extended_status = 32'h00000000; +parameter mask_gem0__pcs_extended_status = 32'h00000000; + +parameter gem0__design_cfg1 = 32'hE000B280; +parameter val_gem0__design_cfg1 = 32'h02000000; +parameter mask_gem0__design_cfg1 = 32'h0E000000; + +parameter gem0__design_cfg2 = 32'hE000B284; +parameter val_gem0__design_cfg2 = 32'h2A813FFF; +parameter mask_gem0__design_cfg2 = 32'h3FCFFFFF; + +parameter gem0__design_cfg3 = 32'hE000B288; +parameter val_gem0__design_cfg3 = 32'h00000000; +parameter mask_gem0__design_cfg3 = 32'hFFFFFFFF; + +parameter gem0__design_cfg4 = 32'hE000B28C; +parameter val_gem0__design_cfg4 = 32'h00000000; +parameter mask_gem0__design_cfg4 = 32'hFFFFFFFF; + +parameter gem0__design_cfg5 = 32'hE000B290; +parameter val_gem0__design_cfg5 = 32'h002F2045; +parameter mask_gem0__design_cfg5 = 32'h0FFFFCFF; + +parameter gem0__design_cfg6 = 32'hE000B294; +parameter val_gem0__design_cfg6 = 32'h00000000; +parameter mask_gem0__design_cfg6 = 32'h00000000; + +parameter gem0__design_cfg7 = 32'hE000B298; +parameter val_gem0__design_cfg7 = 32'h00000000; +parameter mask_gem0__design_cfg7 = 32'h00000000; + +parameter gem0__isr_pq1 = 32'hE000B400; +parameter val_gem0__isr_pq1 = 32'h00000000; +parameter mask_gem0__isr_pq1 = 32'h00000000; + +parameter gem0__isr_pq2 = 32'hE000B404; +parameter val_gem0__isr_pq2 = 32'h00000000; +parameter mask_gem0__isr_pq2 = 32'h00000000; + +parameter gem0__isr_pq3 = 32'hE000B408; +parameter val_gem0__isr_pq3 = 32'h00000000; +parameter mask_gem0__isr_pq3 = 32'h00000000; + +parameter gem0__isr_pq4 = 32'hE000B40C; +parameter val_gem0__isr_pq4 = 32'h00000000; +parameter mask_gem0__isr_pq4 = 32'h00000000; + +parameter gem0__isr_pq5 = 32'hE000B410; +parameter val_gem0__isr_pq5 = 32'h00000000; +parameter mask_gem0__isr_pq5 = 32'h00000000; + +parameter gem0__isr_pq6 = 32'hE000B414; +parameter val_gem0__isr_pq6 = 32'h00000000; +parameter mask_gem0__isr_pq6 = 32'h00000000; + +parameter gem0__isr_pq7 = 32'hE000B418; +parameter val_gem0__isr_pq7 = 32'h00000000; +parameter mask_gem0__isr_pq7 = 32'h00000000; + +parameter gem0__tx_qbar_q1 = 32'hE000B440; +parameter val_gem0__tx_qbar_q1 = 32'h00000000; +parameter mask_gem0__tx_qbar_q1 = 32'h00000000; + +parameter gem0__tx_qbar_q2 = 32'hE000B444; +parameter val_gem0__tx_qbar_q2 = 32'h00000000; +parameter mask_gem0__tx_qbar_q2 = 32'h00000000; + +parameter gem0__tx_qbar_q3 = 32'hE000B448; +parameter val_gem0__tx_qbar_q3 = 32'h00000000; +parameter mask_gem0__tx_qbar_q3 = 32'h00000000; + +parameter gem0__tx_qbar_q4 = 32'hE000B44C; +parameter val_gem0__tx_qbar_q4 = 32'h00000000; +parameter mask_gem0__tx_qbar_q4 = 32'h00000000; + +parameter gem0__tx_qbar_q5 = 32'hE000B450; +parameter val_gem0__tx_qbar_q5 = 32'h00000000; +parameter mask_gem0__tx_qbar_q5 = 32'h00000000; + +parameter gem0__tx_qbar_q6 = 32'hE000B454; +parameter val_gem0__tx_qbar_q6 = 32'h00000000; +parameter mask_gem0__tx_qbar_q6 = 32'h00000000; + +parameter gem0__tx_qbar_q7 = 32'hE000B458; +parameter val_gem0__tx_qbar_q7 = 32'h00000000; +parameter mask_gem0__tx_qbar_q7 = 32'h00000000; + +parameter gem0__rx_qbar_q1 = 32'hE000B480; +parameter val_gem0__rx_qbar_q1 = 32'h00000000; +parameter mask_gem0__rx_qbar_q1 = 32'h00000000; + +parameter gem0__rx_qbar_q2 = 32'hE000B484; +parameter val_gem0__rx_qbar_q2 = 32'h00000000; +parameter mask_gem0__rx_qbar_q2 = 32'h00000000; + +parameter gem0__rx_qbar_q3 = 32'hE000B488; +parameter val_gem0__rx_qbar_q3 = 32'h00000000; +parameter mask_gem0__rx_qbar_q3 = 32'h00000000; + +parameter gem0__rx_qbar_q4 = 32'hE000B48C; +parameter val_gem0__rx_qbar_q4 = 32'h00000000; +parameter mask_gem0__rx_qbar_q4 = 32'h00000000; + +parameter gem0__rx_qbar_q5 = 32'hE000B490; +parameter val_gem0__rx_qbar_q5 = 32'h00000000; +parameter mask_gem0__rx_qbar_q5 = 32'h00000000; + +parameter gem0__rx_qbar_q6 = 32'hE000B494; +parameter val_gem0__rx_qbar_q6 = 32'h00000000; +parameter mask_gem0__rx_qbar_q6 = 32'h00000000; + +parameter gem0__rx_qbar_q7 = 32'hE000B498; +parameter val_gem0__rx_qbar_q7 = 32'h00000000; +parameter mask_gem0__rx_qbar_q7 = 32'h00000000; + +parameter gem0__rx_bufsz_q1 = 32'hE000B4A0; +parameter val_gem0__rx_bufsz_q1 = 32'h00000000; +parameter mask_gem0__rx_bufsz_q1 = 32'h00000000; + +parameter gem0__rx_bufsz_q2 = 32'hE000B4A4; +parameter val_gem0__rx_bufsz_q2 = 32'h00000000; +parameter mask_gem0__rx_bufsz_q2 = 32'h00000000; + +parameter gem0__rx_bufsz_q3 = 32'hE000B4A8; +parameter val_gem0__rx_bufsz_q3 = 32'h00000000; +parameter mask_gem0__rx_bufsz_q3 = 32'h00000000; + +parameter gem0__rx_bufsz_q4 = 32'hE000B4AC; +parameter val_gem0__rx_bufsz_q4 = 32'h00000000; +parameter mask_gem0__rx_bufsz_q4 = 32'h00000000; + +parameter gem0__rx_bufsz_q5 = 32'hE000B4B0; +parameter val_gem0__rx_bufsz_q5 = 32'h00000000; +parameter mask_gem0__rx_bufsz_q5 = 32'h00000000; + +parameter gem0__rx_bufsz_q6 = 32'hE000B4B4; +parameter val_gem0__rx_bufsz_q6 = 32'h00000000; +parameter mask_gem0__rx_bufsz_q6 = 32'h00000000; + +parameter gem0__rx_bufsz_q7 = 32'hE000B4B8; +parameter val_gem0__rx_bufsz_q7 = 32'h00000000; +parameter mask_gem0__rx_bufsz_q7 = 32'h00000000; + +parameter gem0__screen_t1_r0 = 32'hE000B500; +parameter val_gem0__screen_t1_r0 = 32'h00000000; +parameter mask_gem0__screen_t1_r0 = 32'h00000000; + +parameter gem0__screen_t1_r1 = 32'hE000B504; +parameter val_gem0__screen_t1_r1 = 32'h00000000; +parameter mask_gem0__screen_t1_r1 = 32'h00000000; + +parameter gem0__screen_t1_r2 = 32'hE000B508; +parameter val_gem0__screen_t1_r2 = 32'h00000000; +parameter mask_gem0__screen_t1_r2 = 32'h00000000; + +parameter gem0__screen_t1_r3 = 32'hE000B50C; +parameter val_gem0__screen_t1_r3 = 32'h00000000; +parameter mask_gem0__screen_t1_r3 = 32'h00000000; + +parameter gem0__screen_t1_r4 = 32'hE000B510; +parameter val_gem0__screen_t1_r4 = 32'h00000000; +parameter mask_gem0__screen_t1_r4 = 32'h00000000; + +parameter gem0__screen_t1_r5 = 32'hE000B514; +parameter val_gem0__screen_t1_r5 = 32'h00000000; +parameter mask_gem0__screen_t1_r5 = 32'h00000000; + +parameter gem0__screen_t1_r6 = 32'hE000B518; +parameter val_gem0__screen_t1_r6 = 32'h00000000; +parameter mask_gem0__screen_t1_r6 = 32'h00000000; + +parameter gem0__screen_t1_r7 = 32'hE000B51C; +parameter val_gem0__screen_t1_r7 = 32'h00000000; +parameter mask_gem0__screen_t1_r7 = 32'h00000000; + +parameter gem0__screen_t1_r8 = 32'hE000B520; +parameter val_gem0__screen_t1_r8 = 32'h00000000; +parameter mask_gem0__screen_t1_r8 = 32'h00000000; + +parameter gem0__screen_t1_r9 = 32'hE000B524; +parameter val_gem0__screen_t1_r9 = 32'h00000000; +parameter mask_gem0__screen_t1_r9 = 32'h00000000; + +parameter gem0__screen_t1_r10 = 32'hE000B528; +parameter val_gem0__screen_t1_r10 = 32'h00000000; +parameter mask_gem0__screen_t1_r10 = 32'h00000000; + +parameter gem0__screen_t1_r11 = 32'hE000B52C; +parameter val_gem0__screen_t1_r11 = 32'h00000000; +parameter mask_gem0__screen_t1_r11 = 32'h00000000; + +parameter gem0__screen_t1_r12 = 32'hE000B530; +parameter val_gem0__screen_t1_r12 = 32'h00000000; +parameter mask_gem0__screen_t1_r12 = 32'h00000000; + +parameter gem0__screen_t1_r13 = 32'hE000B534; +parameter val_gem0__screen_t1_r13 = 32'h00000000; +parameter mask_gem0__screen_t1_r13 = 32'h00000000; + +parameter gem0__screen_t1_r14 = 32'hE000B538; +parameter val_gem0__screen_t1_r14 = 32'h00000000; +parameter mask_gem0__screen_t1_r14 = 32'h00000000; + +parameter gem0__screen_t1_r15 = 32'hE000B53C; +parameter val_gem0__screen_t1_r15 = 32'h00000000; +parameter mask_gem0__screen_t1_r15 = 32'h00000000; + +parameter gem0__screen_t2_r0 = 32'hE000B540; +parameter val_gem0__screen_t2_r0 = 32'h00000000; +parameter mask_gem0__screen_t2_r0 = 32'h00000000; + +parameter gem0__screen_t2_r1 = 32'hE000B544; +parameter val_gem0__screen_t2_r1 = 32'h00000000; +parameter mask_gem0__screen_t2_r1 = 32'h00000000; + +parameter gem0__screen_t2_r2 = 32'hE000B548; +parameter val_gem0__screen_t2_r2 = 32'h00000000; +parameter mask_gem0__screen_t2_r2 = 32'h00000000; + +parameter gem0__screen_t2_r3 = 32'hE000B54C; +parameter val_gem0__screen_t2_r3 = 32'h00000000; +parameter mask_gem0__screen_t2_r3 = 32'h00000000; + +parameter gem0__screen_t2_r4 = 32'hE000B550; +parameter val_gem0__screen_t2_r4 = 32'h00000000; +parameter mask_gem0__screen_t2_r4 = 32'h00000000; + +parameter gem0__screen_t2_r5 = 32'hE000B554; +parameter val_gem0__screen_t2_r5 = 32'h00000000; +parameter mask_gem0__screen_t2_r5 = 32'h00000000; + +parameter gem0__screen_t2_r6 = 32'hE000B558; +parameter val_gem0__screen_t2_r6 = 32'h00000000; +parameter mask_gem0__screen_t2_r6 = 32'h00000000; + +parameter gem0__screen_t2_r7 = 32'hE000B55C; +parameter val_gem0__screen_t2_r7 = 32'h00000000; +parameter mask_gem0__screen_t2_r7 = 32'h00000000; + +parameter gem0__screen_t2_r8 = 32'hE000B560; +parameter val_gem0__screen_t2_r8 = 32'h00000000; +parameter mask_gem0__screen_t2_r8 = 32'h00000000; + +parameter gem0__screen_t2_r9 = 32'hE000B564; +parameter val_gem0__screen_t2_r9 = 32'h00000000; +parameter mask_gem0__screen_t2_r9 = 32'h00000000; + +parameter gem0__screen_t2_r10 = 32'hE000B568; +parameter val_gem0__screen_t2_r10 = 32'h00000000; +parameter mask_gem0__screen_t2_r10 = 32'h00000000; + +parameter gem0__screen_t2_r11 = 32'hE000B56C; +parameter val_gem0__screen_t2_r11 = 32'h00000000; +parameter mask_gem0__screen_t2_r11 = 32'h00000000; + +parameter gem0__screen_t2_r12 = 32'hE000B570; +parameter val_gem0__screen_t2_r12 = 32'h00000000; +parameter mask_gem0__screen_t2_r12 = 32'h00000000; + +parameter gem0__screen_t2_r13 = 32'hE000B574; +parameter val_gem0__screen_t2_r13 = 32'h00000000; +parameter mask_gem0__screen_t2_r13 = 32'h00000000; + +parameter gem0__screen_t2_r14 = 32'hE000B578; +parameter val_gem0__screen_t2_r14 = 32'h00000000; +parameter mask_gem0__screen_t2_r14 = 32'h00000000; + +parameter gem0__screen_t2_r15 = 32'hE000B57C; +parameter val_gem0__screen_t2_r15 = 32'h00000000; +parameter mask_gem0__screen_t2_r15 = 32'h00000000; + +parameter gem0__intr_en_pq1 = 32'hE000B600; +parameter val_gem0__intr_en_pq1 = 32'h00000000; +parameter mask_gem0__intr_en_pq1 = 32'h00000000; + +parameter gem0__intr_en_pq2 = 32'hE000B604; +parameter val_gem0__intr_en_pq2 = 32'h00000000; +parameter mask_gem0__intr_en_pq2 = 32'h00000000; + +parameter gem0__intr_en_pq3 = 32'hE000B608; +parameter val_gem0__intr_en_pq3 = 32'h00000000; +parameter mask_gem0__intr_en_pq3 = 32'h00000000; + +parameter gem0__intr_en_pq4 = 32'hE000B60C; +parameter val_gem0__intr_en_pq4 = 32'h00000000; +parameter mask_gem0__intr_en_pq4 = 32'h00000000; + +parameter gem0__intr_en_pq5 = 32'hE000B610; +parameter val_gem0__intr_en_pq5 = 32'h00000000; +parameter mask_gem0__intr_en_pq5 = 32'h00000000; + +parameter gem0__intr_en_pq6 = 32'hE000B614; +parameter val_gem0__intr_en_pq6 = 32'h00000000; +parameter mask_gem0__intr_en_pq6 = 32'h00000000; + +parameter gem0__intr_en_pq7 = 32'hE000B618; +parameter val_gem0__intr_en_pq7 = 32'h00000000; +parameter mask_gem0__intr_en_pq7 = 32'h00000000; + +parameter gem0__intr_dis_pq1 = 32'hE000B620; +parameter val_gem0__intr_dis_pq1 = 32'h00000000; +parameter mask_gem0__intr_dis_pq1 = 32'h00000000; + +parameter gem0__intr_dis_pq2 = 32'hE000B624; +parameter val_gem0__intr_dis_pq2 = 32'h00000000; +parameter mask_gem0__intr_dis_pq2 = 32'h00000000; + +parameter gem0__intr_dis_pq3 = 32'hE000B628; +parameter val_gem0__intr_dis_pq3 = 32'h00000000; +parameter mask_gem0__intr_dis_pq3 = 32'h00000000; + +parameter gem0__intr_dis_pq4 = 32'hE000B62C; +parameter val_gem0__intr_dis_pq4 = 32'h00000000; +parameter mask_gem0__intr_dis_pq4 = 32'h00000000; + +parameter gem0__intr_dis_pq5 = 32'hE000B630; +parameter val_gem0__intr_dis_pq5 = 32'h00000000; +parameter mask_gem0__intr_dis_pq5 = 32'h00000000; + +parameter gem0__intr_dis_pq6 = 32'hE000B634; +parameter val_gem0__intr_dis_pq6 = 32'h00000000; +parameter mask_gem0__intr_dis_pq6 = 32'h00000000; + +parameter gem0__intr_dis_pq7 = 32'hE000B638; +parameter val_gem0__intr_dis_pq7 = 32'h00000000; +parameter mask_gem0__intr_dis_pq7 = 32'h00000000; + +parameter gem0__intr_mask_pq1 = 32'hE000B640; +parameter val_gem0__intr_mask_pq1 = 32'h00000000; +parameter mask_gem0__intr_mask_pq1 = 32'h00000000; + +parameter gem0__intr_mask_pq2 = 32'hE000B644; +parameter val_gem0__intr_mask_pq2 = 32'h00000000; +parameter mask_gem0__intr_mask_pq2 = 32'h00000000; + +parameter gem0__intr_mask_pq3 = 32'hE000B648; +parameter val_gem0__intr_mask_pq3 = 32'h00000000; +parameter mask_gem0__intr_mask_pq3 = 32'h00000000; + +parameter gem0__intr_mask_pq4 = 32'hE000B64C; +parameter val_gem0__intr_mask_pq4 = 32'h00000000; +parameter mask_gem0__intr_mask_pq4 = 32'h00000000; + +parameter gem0__intr_mask_pq5 = 32'hE000B650; +parameter val_gem0__intr_mask_pq5 = 32'h00000000; +parameter mask_gem0__intr_mask_pq5 = 32'h00000000; + +parameter gem0__intr_mask_pq6 = 32'hE000B654; +parameter val_gem0__intr_mask_pq6 = 32'h00000000; +parameter mask_gem0__intr_mask_pq6 = 32'h00000000; + +parameter gem0__intr_mask_pq7 = 32'hE000B658; +parameter val_gem0__intr_mask_pq7 = 32'h00000000; +parameter mask_gem0__intr_mask_pq7 = 32'h00000000; + + +// ************************************************************ +// Module gem1 GEM +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter gem1__net_ctrl = 32'hE000C000; +parameter val_gem1__net_ctrl = 32'h00000000; +parameter mask_gem1__net_ctrl = 32'hFFFFFFFF; + +parameter gem1__net_cfg = 32'hE000C004; +parameter val_gem1__net_cfg = 32'h00080000; +parameter mask_gem1__net_cfg = 32'hFFFFFFFF; + +parameter gem1__net_status = 32'hE000C008; +parameter val_gem1__net_status = 32'h00000004; +parameter mask_gem1__net_status = 32'hFFFFFFFD; + +parameter gem1__user_io = 32'hE000C00C; +parameter val_gem1__user_io = 32'h00000000; +parameter mask_gem1__user_io = 32'h0000FFFF; + +parameter gem1__dma_cfg = 32'hE000C010; +parameter val_gem1__dma_cfg = 32'h00020784; +parameter mask_gem1__dma_cfg = 32'hFFFFFFFF; + +parameter gem1__tx_status = 32'hE000C014; +parameter val_gem1__tx_status = 32'h00000000; +parameter mask_gem1__tx_status = 32'hFFFFFFFF; + +parameter gem1__rx_qbar = 32'hE000C018; +parameter val_gem1__rx_qbar = 32'h00000000; +parameter mask_gem1__rx_qbar = 32'hFFFFFFFF; + +parameter gem1__tx_qbar = 32'hE000C01C; +parameter val_gem1__tx_qbar = 32'h00000000; +parameter mask_gem1__tx_qbar = 32'hFFFFFFFF; + +parameter gem1__rx_status = 32'hE000C020; +parameter val_gem1__rx_status = 32'h00000000; +parameter mask_gem1__rx_status = 32'hFFFFFFFF; + +parameter gem1__intr_status = 32'hE000C024; +parameter val_gem1__intr_status = 32'h00000000; +parameter mask_gem1__intr_status = 32'hFFFFFFFF; + +parameter gem1__intr_en = 32'hE000C028; +parameter val_gem1__intr_en = 32'h00000000; +parameter mask_gem1__intr_en = 32'h00000000; + +parameter gem1__intr_dis = 32'hE000C02C; +parameter val_gem1__intr_dis = 32'h00000000; +parameter mask_gem1__intr_dis = 32'h00000000; + +parameter gem1__intr_mask = 32'hE000C030; +parameter val_gem1__intr_mask = 32'h0001FFFF; +parameter mask_gem1__intr_mask = 32'hFC01FFFF; + +parameter gem1__phy_maint = 32'hE000C034; +parameter val_gem1__phy_maint = 32'h00000000; +parameter mask_gem1__phy_maint = 32'hFFFFFFFF; + +parameter gem1__rx_pauseq = 32'hE000C038; +parameter val_gem1__rx_pauseq = 32'h00000000; +parameter mask_gem1__rx_pauseq = 32'hFFFFFFFF; + +parameter gem1__tx_pauseq = 32'hE000C03C; +parameter val_gem1__tx_pauseq = 32'h0000FFFF; +parameter mask_gem1__tx_pauseq = 32'hFFFFFFFF; + +parameter gem1__tx_partial_st_fwd = 32'hE000C040; +parameter val_gem1__tx_partial_st_fwd = 32'h000003FF; +parameter mask_gem1__tx_partial_st_fwd = 32'hFFFFFFFF; + +parameter gem1__rx_partial_st_fwd = 32'hE000C044; +parameter val_gem1__rx_partial_st_fwd = 32'h000003FF; +parameter mask_gem1__rx_partial_st_fwd = 32'hFFFFFFFF; + +parameter gem1__hash_bot = 32'hE000C080; +parameter val_gem1__hash_bot = 32'h00000000; +parameter mask_gem1__hash_bot = 32'hFFFFFFFF; + +parameter gem1__hash_top = 32'hE000C084; +parameter val_gem1__hash_top = 32'h00000000; +parameter mask_gem1__hash_top = 32'hFFFFFFFF; + +parameter gem1__spec_addr1_bot = 32'hE000C088; +parameter val_gem1__spec_addr1_bot = 32'h00000000; +parameter mask_gem1__spec_addr1_bot = 32'hFFFFFFFF; + +parameter gem1__spec_addr1_top = 32'hE000C08C; +parameter val_gem1__spec_addr1_top = 32'h00000000; +parameter mask_gem1__spec_addr1_top = 32'hFFFFFFFF; + +parameter gem1__spec_addr2_bot = 32'hE000C090; +parameter val_gem1__spec_addr2_bot = 32'h00000000; +parameter mask_gem1__spec_addr2_bot = 32'hFFFFFFFF; + +parameter gem1__spec_addr2_top = 32'hE000C094; +parameter val_gem1__spec_addr2_top = 32'h00000000; +parameter mask_gem1__spec_addr2_top = 32'hFFFFFFFF; + +parameter gem1__spec_addr3_bot = 32'hE000C098; +parameter val_gem1__spec_addr3_bot = 32'h00000000; +parameter mask_gem1__spec_addr3_bot = 32'hFFFFFFFF; + +parameter gem1__spec_addr3_top = 32'hE000C09C; +parameter val_gem1__spec_addr3_top = 32'h00000000; +parameter mask_gem1__spec_addr3_top = 32'hFFFFFFFF; + +parameter gem1__spec_addr4_bot = 32'hE000C0A0; +parameter val_gem1__spec_addr4_bot = 32'h00000000; +parameter mask_gem1__spec_addr4_bot = 32'hFFFFFFFF; + +parameter gem1__spec_addr4_top = 32'hE000C0A4; +parameter val_gem1__spec_addr4_top = 32'h00000000; +parameter mask_gem1__spec_addr4_top = 32'hFFFFFFFF; + +parameter gem1__type_id_match1 = 32'hE000C0A8; +parameter val_gem1__type_id_match1 = 32'h00000000; +parameter mask_gem1__type_id_match1 = 32'hFFFFFFFF; + +parameter gem1__type_id_match2 = 32'hE000C0AC; +parameter val_gem1__type_id_match2 = 32'h00000000; +parameter mask_gem1__type_id_match2 = 32'hFFFFFFFF; + +parameter gem1__type_id_match3 = 32'hE000C0B0; +parameter val_gem1__type_id_match3 = 32'h00000000; +parameter mask_gem1__type_id_match3 = 32'hFFFFFFFF; + +parameter gem1__type_id_match4 = 32'hE000C0B4; +parameter val_gem1__type_id_match4 = 32'h00000000; +parameter mask_gem1__type_id_match4 = 32'hFFFFFFFF; + +parameter gem1__wake_on_lan = 32'hE000C0B8; +parameter val_gem1__wake_on_lan = 32'h00000000; +parameter mask_gem1__wake_on_lan = 32'hFFFFFFFF; + +parameter gem1__ipg_stretch = 32'hE000C0BC; +parameter val_gem1__ipg_stretch = 32'h00000000; +parameter mask_gem1__ipg_stretch = 32'hFFFFFFFF; + +parameter gem1__stacked_vlan = 32'hE000C0C0; +parameter val_gem1__stacked_vlan = 32'h00000000; +parameter mask_gem1__stacked_vlan = 32'hFFFFFFFF; + +parameter gem1__tx_pfc_pause = 32'hE000C0C4; +parameter val_gem1__tx_pfc_pause = 32'h00000000; +parameter mask_gem1__tx_pfc_pause = 32'hFFFFFFFF; + +parameter gem1__spec_addr1_mask_bot = 32'hE000C0C8; +parameter val_gem1__spec_addr1_mask_bot = 32'h00000000; +parameter mask_gem1__spec_addr1_mask_bot = 32'hFFFFFFFF; + +parameter gem1__spec_addr1_mask_top = 32'hE000C0CC; +parameter val_gem1__spec_addr1_mask_top = 32'h00000000; +parameter mask_gem1__spec_addr1_mask_top = 32'hFFFFFFFF; + +parameter gem1__module_id = 32'hE000C0FC; +parameter val_gem1__module_id = 32'h00020118; +parameter mask_gem1__module_id = 32'hFFFFFFFF; + +parameter gem1__octets_tx_bot = 32'hE000C100; +parameter val_gem1__octets_tx_bot = 32'h00000000; +parameter mask_gem1__octets_tx_bot = 32'hFFFFFFFF; + +parameter gem1__octets_tx_top = 32'hE000C104; +parameter val_gem1__octets_tx_top = 32'h00000000; +parameter mask_gem1__octets_tx_top = 32'hFFFFFFFF; + +parameter gem1__frames_tx = 32'hE000C108; +parameter val_gem1__frames_tx = 32'h00000000; +parameter mask_gem1__frames_tx = 32'hFFFFFFFF; + +parameter gem1__broadcast_frames_tx = 32'hE000C10C; +parameter val_gem1__broadcast_frames_tx = 32'h00000000; +parameter mask_gem1__broadcast_frames_tx = 32'hFFFFFFFF; + +parameter gem1__multi_frames_tx = 32'hE000C110; +parameter val_gem1__multi_frames_tx = 32'h00000000; +parameter mask_gem1__multi_frames_tx = 32'hFFFFFFFF; + +parameter gem1__pause_frames_tx = 32'hE000C114; +parameter val_gem1__pause_frames_tx = 32'h00000000; +parameter mask_gem1__pause_frames_tx = 32'hFFFFFFFF; + +parameter gem1__frames_64b_tx = 32'hE000C118; +parameter val_gem1__frames_64b_tx = 32'h00000000; +parameter mask_gem1__frames_64b_tx = 32'hFFFFFFFF; + +parameter gem1__frames_65to127b_tx = 32'hE000C11C; +parameter val_gem1__frames_65to127b_tx = 32'h00000000; +parameter mask_gem1__frames_65to127b_tx = 32'hFFFFFFFF; + +parameter gem1__frames_128to255b_tx = 32'hE000C120; +parameter val_gem1__frames_128to255b_tx = 32'h00000000; +parameter mask_gem1__frames_128to255b_tx = 32'hFFFFFFFF; + +parameter gem1__frames_256to511b_tx = 32'hE000C124; +parameter val_gem1__frames_256to511b_tx = 32'h00000000; +parameter mask_gem1__frames_256to511b_tx = 32'hFFFFFFFF; + +parameter gem1__frames_512to1023b_tx = 32'hE000C128; +parameter val_gem1__frames_512to1023b_tx = 32'h00000000; +parameter mask_gem1__frames_512to1023b_tx = 32'hFFFFFFFF; + +parameter gem1__frames_1024to1518b_tx = 32'hE000C12C; +parameter val_gem1__frames_1024to1518b_tx = 32'h00000000; +parameter mask_gem1__frames_1024to1518b_tx = 32'hFFFFFFFF; + +parameter gem1__frames_gt1518b_tx = 32'hE000C130; +parameter val_gem1__frames_gt1518b_tx = 32'h00000000; +parameter mask_gem1__frames_gt1518b_tx = 32'hFFFFFFFF; + +parameter gem1__tx_under_runs = 32'hE000C134; +parameter val_gem1__tx_under_runs = 32'h00000000; +parameter mask_gem1__tx_under_runs = 32'hFFFFFFFF; + +parameter gem1__single_collisn_frames = 32'hE000C138; +parameter val_gem1__single_collisn_frames = 32'h00000000; +parameter mask_gem1__single_collisn_frames = 32'hFFFFFFFF; + +parameter gem1__multi_collisn_frames = 32'hE000C13C; +parameter val_gem1__multi_collisn_frames = 32'h00000000; +parameter mask_gem1__multi_collisn_frames = 32'hFFFFFFFF; + +parameter gem1__excessive_collisns = 32'hE000C140; +parameter val_gem1__excessive_collisns = 32'h00000000; +parameter mask_gem1__excessive_collisns = 32'hFFFFFFFF; + +parameter gem1__late_collisns = 32'hE000C144; +parameter val_gem1__late_collisns = 32'h00000000; +parameter mask_gem1__late_collisns = 32'hFFFFFFFF; + +parameter gem1__deferred_tx_frames = 32'hE000C148; +parameter val_gem1__deferred_tx_frames = 32'h00000000; +parameter mask_gem1__deferred_tx_frames = 32'hFFFFFFFF; + +parameter gem1__carrier_sense_errs = 32'hE000C14C; +parameter val_gem1__carrier_sense_errs = 32'h00000000; +parameter mask_gem1__carrier_sense_errs = 32'hFFFFFFFF; + +parameter gem1__octets_rx_bot = 32'hE000C150; +parameter val_gem1__octets_rx_bot = 32'h00000000; +parameter mask_gem1__octets_rx_bot = 32'hFFFFFFFF; + +parameter gem1__octets_rx_top = 32'hE000C154; +parameter val_gem1__octets_rx_top = 32'h00000000; +parameter mask_gem1__octets_rx_top = 32'hFFFFFFFF; + +parameter gem1__frames_rx = 32'hE000C158; +parameter val_gem1__frames_rx = 32'h00000000; +parameter mask_gem1__frames_rx = 32'hFFFFFFFF; + +parameter gem1__bdcast_fames_rx = 32'hE000C15C; +parameter val_gem1__bdcast_fames_rx = 32'h00000000; +parameter mask_gem1__bdcast_fames_rx = 32'hFFFFFFFF; + +parameter gem1__multi_frames_rx = 32'hE000C160; +parameter val_gem1__multi_frames_rx = 32'h00000000; +parameter mask_gem1__multi_frames_rx = 32'hFFFFFFFF; + +parameter gem1__pause_rx = 32'hE000C164; +parameter val_gem1__pause_rx = 32'h00000000; +parameter mask_gem1__pause_rx = 32'hFFFFFFFF; + +parameter gem1__frames_64b_rx = 32'hE000C168; +parameter val_gem1__frames_64b_rx = 32'h00000000; +parameter mask_gem1__frames_64b_rx = 32'hFFFFFFFF; + +parameter gem1__frames_65to127b_rx = 32'hE000C16C; +parameter val_gem1__frames_65to127b_rx = 32'h00000000; +parameter mask_gem1__frames_65to127b_rx = 32'hFFFFFFFF; + +parameter gem1__frames_128to255b_rx = 32'hE000C170; +parameter val_gem1__frames_128to255b_rx = 32'h00000000; +parameter mask_gem1__frames_128to255b_rx = 32'hFFFFFFFF; + +parameter gem1__frames_256to511b_rx = 32'hE000C174; +parameter val_gem1__frames_256to511b_rx = 32'h00000000; +parameter mask_gem1__frames_256to511b_rx = 32'hFFFFFFFF; + +parameter gem1__frames_512to1023b_rx = 32'hE000C178; +parameter val_gem1__frames_512to1023b_rx = 32'h00000000; +parameter mask_gem1__frames_512to1023b_rx = 32'hFFFFFFFF; + +parameter gem1__frames_1024to1518b_rx = 32'hE000C17C; +parameter val_gem1__frames_1024to1518b_rx = 32'h00000000; +parameter mask_gem1__frames_1024to1518b_rx = 32'hFFFFFFFF; + +parameter gem1__frames_gt1518b_rx = 32'hE000C180; +parameter val_gem1__frames_gt1518b_rx = 32'h00000000; +parameter mask_gem1__frames_gt1518b_rx = 32'hFFFFFFFF; + +parameter gem1__undersz_rx = 32'hE000C184; +parameter val_gem1__undersz_rx = 32'h00000000; +parameter mask_gem1__undersz_rx = 32'hFFFFFFFF; + +parameter gem1__oversz_rx = 32'hE000C188; +parameter val_gem1__oversz_rx = 32'h00000000; +parameter mask_gem1__oversz_rx = 32'hFFFFFFFF; + +parameter gem1__jab_rx = 32'hE000C18C; +parameter val_gem1__jab_rx = 32'h00000000; +parameter mask_gem1__jab_rx = 32'hFFFFFFFF; + +parameter gem1__fcs_errors = 32'hE000C190; +parameter val_gem1__fcs_errors = 32'h00000000; +parameter mask_gem1__fcs_errors = 32'hFFFFFFFF; + +parameter gem1__length_field_errors = 32'hE000C194; +parameter val_gem1__length_field_errors = 32'h00000000; +parameter mask_gem1__length_field_errors = 32'hFFFFFFFF; + +parameter gem1__rx_symbol_errors = 32'hE000C198; +parameter val_gem1__rx_symbol_errors = 32'h00000000; +parameter mask_gem1__rx_symbol_errors = 32'hFFFFFFFF; + +parameter gem1__align_errors = 32'hE000C19C; +parameter val_gem1__align_errors = 32'h00000000; +parameter mask_gem1__align_errors = 32'hFFFFFFFF; + +parameter gem1__rx_resource_errors = 32'hE000C1A0; +parameter val_gem1__rx_resource_errors = 32'h00000000; +parameter mask_gem1__rx_resource_errors = 32'hFFFFFFFF; + +parameter gem1__rx_overrun_errors = 32'hE000C1A4; +parameter val_gem1__rx_overrun_errors = 32'h00000000; +parameter mask_gem1__rx_overrun_errors = 32'hFFFFFFFF; + +parameter gem1__ip_hdr_csum_errors = 32'hE000C1A8; +parameter val_gem1__ip_hdr_csum_errors = 32'h00000000; +parameter mask_gem1__ip_hdr_csum_errors = 32'hFFFFFFFF; + +parameter gem1__tcp_csum_errors = 32'hE000C1AC; +parameter val_gem1__tcp_csum_errors = 32'h00000000; +parameter mask_gem1__tcp_csum_errors = 32'hFFFFFFFF; + +parameter gem1__udp_csum_errors = 32'hE000C1B0; +parameter val_gem1__udp_csum_errors = 32'h00000000; +parameter mask_gem1__udp_csum_errors = 32'hFFFFFFFF; + +parameter gem1__timer_strobe_s = 32'hE000C1C8; +parameter val_gem1__timer_strobe_s = 32'h00000000; +parameter mask_gem1__timer_strobe_s = 32'hFFFFFFFF; + +parameter gem1__timer_strobe_ns = 32'hE000C1CC; +parameter val_gem1__timer_strobe_ns = 32'h00000000; +parameter mask_gem1__timer_strobe_ns = 32'hFFFFFFFF; + +parameter gem1__timer_s = 32'hE000C1D0; +parameter val_gem1__timer_s = 32'h00000000; +parameter mask_gem1__timer_s = 32'hFFFFFFFF; + +parameter gem1__timer_ns = 32'hE000C1D4; +parameter val_gem1__timer_ns = 32'h00000000; +parameter mask_gem1__timer_ns = 32'hFFFFFFFF; + +parameter gem1__timer_adjust = 32'hE000C1D8; +parameter val_gem1__timer_adjust = 32'h00000000; +parameter mask_gem1__timer_adjust = 32'hFFFFFFFF; + +parameter gem1__timer_incr = 32'hE000C1DC; +parameter val_gem1__timer_incr = 32'h00000000; +parameter mask_gem1__timer_incr = 32'hFFFFFFFF; + +parameter gem1__ptp_tx_s = 32'hE000C1E0; +parameter val_gem1__ptp_tx_s = 32'h00000000; +parameter mask_gem1__ptp_tx_s = 32'hFFFFFFFF; + +parameter gem1__ptp_tx_ns = 32'hE000C1E4; +parameter val_gem1__ptp_tx_ns = 32'h00000000; +parameter mask_gem1__ptp_tx_ns = 32'hFFFFFFFF; + +parameter gem1__ptp_rx_s = 32'hE000C1E8; +parameter val_gem1__ptp_rx_s = 32'h00000000; +parameter mask_gem1__ptp_rx_s = 32'hFFFFFFFF; + +parameter gem1__ptp_rx_ns = 32'hE000C1EC; +parameter val_gem1__ptp_rx_ns = 32'h00000000; +parameter mask_gem1__ptp_rx_ns = 32'hFFFFFFFF; + +parameter gem1__ptp_peer_tx_s = 32'hE000C1F0; +parameter val_gem1__ptp_peer_tx_s = 32'h00000000; +parameter mask_gem1__ptp_peer_tx_s = 32'hFFFFFFFF; + +parameter gem1__ptp_peer_tx_ns = 32'hE000C1F4; +parameter val_gem1__ptp_peer_tx_ns = 32'h00000000; +parameter mask_gem1__ptp_peer_tx_ns = 32'hFFFFFFFF; + +parameter gem1__ptp_peer_rx_s = 32'hE000C1F8; +parameter val_gem1__ptp_peer_rx_s = 32'h00000000; +parameter mask_gem1__ptp_peer_rx_s = 32'hFFFFFFFF; + +parameter gem1__ptp_peer_rx_ns = 32'hE000C1FC; +parameter val_gem1__ptp_peer_rx_ns = 32'h00000000; +parameter mask_gem1__ptp_peer_rx_ns = 32'hFFFFFFFF; + +parameter gem1__pcs_ctrl = 32'hE000C200; +parameter val_gem1__pcs_ctrl = 32'h00000000; +parameter mask_gem1__pcs_ctrl = 32'h00000000; + +parameter gem1__pcs_status = 32'hE000C204; +parameter val_gem1__pcs_status = 32'h00000000; +parameter mask_gem1__pcs_status = 32'h00000000; + +parameter gem1__pcs_upper_phy_id = 32'hE000C208; +parameter val_gem1__pcs_upper_phy_id = 32'h00000000; +parameter mask_gem1__pcs_upper_phy_id = 32'h00000000; + +parameter gem1__pcs_lower_phy_id = 32'hE000C20C; +parameter val_gem1__pcs_lower_phy_id = 32'h00000000; +parameter mask_gem1__pcs_lower_phy_id = 32'h00000000; + +parameter gem1__pcs_autoneg_ad = 32'hE000C210; +parameter val_gem1__pcs_autoneg_ad = 32'h00000000; +parameter mask_gem1__pcs_autoneg_ad = 32'h00000000; + +parameter gem1__pcs_autoneg_ability = 32'hE000C214; +parameter val_gem1__pcs_autoneg_ability = 32'h00000000; +parameter mask_gem1__pcs_autoneg_ability = 32'h00000000; + +parameter gem1__pcs_autonec_exp = 32'hE000C218; +parameter val_gem1__pcs_autonec_exp = 32'h00000000; +parameter mask_gem1__pcs_autonec_exp = 32'h00000000; + +parameter gem1__pcs_autoneg_next_pg = 32'hE000C21C; +parameter val_gem1__pcs_autoneg_next_pg = 32'h00000000; +parameter mask_gem1__pcs_autoneg_next_pg = 32'h00000000; + +parameter gem1__pcs_autoneg_pnext_pg = 32'hE000C220; +parameter val_gem1__pcs_autoneg_pnext_pg = 32'h00000000; +parameter mask_gem1__pcs_autoneg_pnext_pg = 32'h00000000; + +parameter gem1__pcs_extended_status = 32'hE000C23C; +parameter val_gem1__pcs_extended_status = 32'h00000000; +parameter mask_gem1__pcs_extended_status = 32'h00000000; + +parameter gem1__design_cfg1 = 32'hE000C280; +parameter val_gem1__design_cfg1 = 32'h02000000; +parameter mask_gem1__design_cfg1 = 32'h0E000000; + +parameter gem1__design_cfg2 = 32'hE000C284; +parameter val_gem1__design_cfg2 = 32'h2A813FFF; +parameter mask_gem1__design_cfg2 = 32'h3FCFFFFF; + +parameter gem1__design_cfg3 = 32'hE000C288; +parameter val_gem1__design_cfg3 = 32'h00000000; +parameter mask_gem1__design_cfg3 = 32'hFFFFFFFF; + +parameter gem1__design_cfg4 = 32'hE000C28C; +parameter val_gem1__design_cfg4 = 32'h00000000; +parameter mask_gem1__design_cfg4 = 32'hFFFFFFFF; + +parameter gem1__design_cfg5 = 32'hE000C290; +parameter val_gem1__design_cfg5 = 32'h002F2045; +parameter mask_gem1__design_cfg5 = 32'h0FFFFCFF; + +parameter gem1__design_cfg6 = 32'hE000C294; +parameter val_gem1__design_cfg6 = 32'h00000000; +parameter mask_gem1__design_cfg6 = 32'h00000000; + +parameter gem1__design_cfg7 = 32'hE000C298; +parameter val_gem1__design_cfg7 = 32'h00000000; +parameter mask_gem1__design_cfg7 = 32'h00000000; + +parameter gem1__isr_pq1 = 32'hE000C400; +parameter val_gem1__isr_pq1 = 32'h00000000; +parameter mask_gem1__isr_pq1 = 32'h00000000; + +parameter gem1__isr_pq2 = 32'hE000C404; +parameter val_gem1__isr_pq2 = 32'h00000000; +parameter mask_gem1__isr_pq2 = 32'h00000000; + +parameter gem1__isr_pq3 = 32'hE000C408; +parameter val_gem1__isr_pq3 = 32'h00000000; +parameter mask_gem1__isr_pq3 = 32'h00000000; + +parameter gem1__isr_pq4 = 32'hE000C40C; +parameter val_gem1__isr_pq4 = 32'h00000000; +parameter mask_gem1__isr_pq4 = 32'h00000000; + +parameter gem1__isr_pq5 = 32'hE000C410; +parameter val_gem1__isr_pq5 = 32'h00000000; +parameter mask_gem1__isr_pq5 = 32'h00000000; + +parameter gem1__isr_pq6 = 32'hE000C414; +parameter val_gem1__isr_pq6 = 32'h00000000; +parameter mask_gem1__isr_pq6 = 32'h00000000; + +parameter gem1__isr_pq7 = 32'hE000C418; +parameter val_gem1__isr_pq7 = 32'h00000000; +parameter mask_gem1__isr_pq7 = 32'h00000000; + +parameter gem1__tx_qbar_q1 = 32'hE000C440; +parameter val_gem1__tx_qbar_q1 = 32'h00000000; +parameter mask_gem1__tx_qbar_q1 = 32'h00000000; + +parameter gem1__tx_qbar_q2 = 32'hE000C444; +parameter val_gem1__tx_qbar_q2 = 32'h00000000; +parameter mask_gem1__tx_qbar_q2 = 32'h00000000; + +parameter gem1__tx_qbar_q3 = 32'hE000C448; +parameter val_gem1__tx_qbar_q3 = 32'h00000000; +parameter mask_gem1__tx_qbar_q3 = 32'h00000000; + +parameter gem1__tx_qbar_q4 = 32'hE000C44C; +parameter val_gem1__tx_qbar_q4 = 32'h00000000; +parameter mask_gem1__tx_qbar_q4 = 32'h00000000; + +parameter gem1__tx_qbar_q5 = 32'hE000C450; +parameter val_gem1__tx_qbar_q5 = 32'h00000000; +parameter mask_gem1__tx_qbar_q5 = 32'h00000000; + +parameter gem1__tx_qbar_q6 = 32'hE000C454; +parameter val_gem1__tx_qbar_q6 = 32'h00000000; +parameter mask_gem1__tx_qbar_q6 = 32'h00000000; + +parameter gem1__tx_qbar_q7 = 32'hE000C458; +parameter val_gem1__tx_qbar_q7 = 32'h00000000; +parameter mask_gem1__tx_qbar_q7 = 32'h00000000; + +parameter gem1__rx_qbar_q1 = 32'hE000C480; +parameter val_gem1__rx_qbar_q1 = 32'h00000000; +parameter mask_gem1__rx_qbar_q1 = 32'h00000000; + +parameter gem1__rx_qbar_q2 = 32'hE000C484; +parameter val_gem1__rx_qbar_q2 = 32'h00000000; +parameter mask_gem1__rx_qbar_q2 = 32'h00000000; + +parameter gem1__rx_qbar_q3 = 32'hE000C488; +parameter val_gem1__rx_qbar_q3 = 32'h00000000; +parameter mask_gem1__rx_qbar_q3 = 32'h00000000; + +parameter gem1__rx_qbar_q4 = 32'hE000C48C; +parameter val_gem1__rx_qbar_q4 = 32'h00000000; +parameter mask_gem1__rx_qbar_q4 = 32'h00000000; + +parameter gem1__rx_qbar_q5 = 32'hE000C490; +parameter val_gem1__rx_qbar_q5 = 32'h00000000; +parameter mask_gem1__rx_qbar_q5 = 32'h00000000; + +parameter gem1__rx_qbar_q6 = 32'hE000C494; +parameter val_gem1__rx_qbar_q6 = 32'h00000000; +parameter mask_gem1__rx_qbar_q6 = 32'h00000000; + +parameter gem1__rx_qbar_q7 = 32'hE000C498; +parameter val_gem1__rx_qbar_q7 = 32'h00000000; +parameter mask_gem1__rx_qbar_q7 = 32'h00000000; + +parameter gem1__rx_bufsz_q1 = 32'hE000C4A0; +parameter val_gem1__rx_bufsz_q1 = 32'h00000000; +parameter mask_gem1__rx_bufsz_q1 = 32'h00000000; + +parameter gem1__rx_bufsz_q2 = 32'hE000C4A4; +parameter val_gem1__rx_bufsz_q2 = 32'h00000000; +parameter mask_gem1__rx_bufsz_q2 = 32'h00000000; + +parameter gem1__rx_bufsz_q3 = 32'hE000C4A8; +parameter val_gem1__rx_bufsz_q3 = 32'h00000000; +parameter mask_gem1__rx_bufsz_q3 = 32'h00000000; + +parameter gem1__rx_bufsz_q4 = 32'hE000C4AC; +parameter val_gem1__rx_bufsz_q4 = 32'h00000000; +parameter mask_gem1__rx_bufsz_q4 = 32'h00000000; + +parameter gem1__rx_bufsz_q5 = 32'hE000C4B0; +parameter val_gem1__rx_bufsz_q5 = 32'h00000000; +parameter mask_gem1__rx_bufsz_q5 = 32'h00000000; + +parameter gem1__rx_bufsz_q6 = 32'hE000C4B4; +parameter val_gem1__rx_bufsz_q6 = 32'h00000000; +parameter mask_gem1__rx_bufsz_q6 = 32'h00000000; + +parameter gem1__rx_bufsz_q7 = 32'hE000C4B8; +parameter val_gem1__rx_bufsz_q7 = 32'h00000000; +parameter mask_gem1__rx_bufsz_q7 = 32'h00000000; + +parameter gem1__screen_t1_r0 = 32'hE000C500; +parameter val_gem1__screen_t1_r0 = 32'h00000000; +parameter mask_gem1__screen_t1_r0 = 32'h00000000; + +parameter gem1__screen_t1_r1 = 32'hE000C504; +parameter val_gem1__screen_t1_r1 = 32'h00000000; +parameter mask_gem1__screen_t1_r1 = 32'h00000000; + +parameter gem1__screen_t1_r2 = 32'hE000C508; +parameter val_gem1__screen_t1_r2 = 32'h00000000; +parameter mask_gem1__screen_t1_r2 = 32'h00000000; + +parameter gem1__screen_t1_r3 = 32'hE000C50C; +parameter val_gem1__screen_t1_r3 = 32'h00000000; +parameter mask_gem1__screen_t1_r3 = 32'h00000000; + +parameter gem1__screen_t1_r4 = 32'hE000C510; +parameter val_gem1__screen_t1_r4 = 32'h00000000; +parameter mask_gem1__screen_t1_r4 = 32'h00000000; + +parameter gem1__screen_t1_r5 = 32'hE000C514; +parameter val_gem1__screen_t1_r5 = 32'h00000000; +parameter mask_gem1__screen_t1_r5 = 32'h00000000; + +parameter gem1__screen_t1_r6 = 32'hE000C518; +parameter val_gem1__screen_t1_r6 = 32'h00000000; +parameter mask_gem1__screen_t1_r6 = 32'h00000000; + +parameter gem1__screen_t1_r7 = 32'hE000C51C; +parameter val_gem1__screen_t1_r7 = 32'h00000000; +parameter mask_gem1__screen_t1_r7 = 32'h00000000; + +parameter gem1__screen_t1_r8 = 32'hE000C520; +parameter val_gem1__screen_t1_r8 = 32'h00000000; +parameter mask_gem1__screen_t1_r8 = 32'h00000000; + +parameter gem1__screen_t1_r9 = 32'hE000C524; +parameter val_gem1__screen_t1_r9 = 32'h00000000; +parameter mask_gem1__screen_t1_r9 = 32'h00000000; + +parameter gem1__screen_t1_r10 = 32'hE000C528; +parameter val_gem1__screen_t1_r10 = 32'h00000000; +parameter mask_gem1__screen_t1_r10 = 32'h00000000; + +parameter gem1__screen_t1_r11 = 32'hE000C52C; +parameter val_gem1__screen_t1_r11 = 32'h00000000; +parameter mask_gem1__screen_t1_r11 = 32'h00000000; + +parameter gem1__screen_t1_r12 = 32'hE000C530; +parameter val_gem1__screen_t1_r12 = 32'h00000000; +parameter mask_gem1__screen_t1_r12 = 32'h00000000; + +parameter gem1__screen_t1_r13 = 32'hE000C534; +parameter val_gem1__screen_t1_r13 = 32'h00000000; +parameter mask_gem1__screen_t1_r13 = 32'h00000000; + +parameter gem1__screen_t1_r14 = 32'hE000C538; +parameter val_gem1__screen_t1_r14 = 32'h00000000; +parameter mask_gem1__screen_t1_r14 = 32'h00000000; + +parameter gem1__screen_t1_r15 = 32'hE000C53C; +parameter val_gem1__screen_t1_r15 = 32'h00000000; +parameter mask_gem1__screen_t1_r15 = 32'h00000000; + +parameter gem1__screen_t2_r0 = 32'hE000C540; +parameter val_gem1__screen_t2_r0 = 32'h00000000; +parameter mask_gem1__screen_t2_r0 = 32'h00000000; + +parameter gem1__screen_t2_r1 = 32'hE000C544; +parameter val_gem1__screen_t2_r1 = 32'h00000000; +parameter mask_gem1__screen_t2_r1 = 32'h00000000; + +parameter gem1__screen_t2_r2 = 32'hE000C548; +parameter val_gem1__screen_t2_r2 = 32'h00000000; +parameter mask_gem1__screen_t2_r2 = 32'h00000000; + +parameter gem1__screen_t2_r3 = 32'hE000C54C; +parameter val_gem1__screen_t2_r3 = 32'h00000000; +parameter mask_gem1__screen_t2_r3 = 32'h00000000; + +parameter gem1__screen_t2_r4 = 32'hE000C550; +parameter val_gem1__screen_t2_r4 = 32'h00000000; +parameter mask_gem1__screen_t2_r4 = 32'h00000000; + +parameter gem1__screen_t2_r5 = 32'hE000C554; +parameter val_gem1__screen_t2_r5 = 32'h00000000; +parameter mask_gem1__screen_t2_r5 = 32'h00000000; + +parameter gem1__screen_t2_r6 = 32'hE000C558; +parameter val_gem1__screen_t2_r6 = 32'h00000000; +parameter mask_gem1__screen_t2_r6 = 32'h00000000; + +parameter gem1__screen_t2_r7 = 32'hE000C55C; +parameter val_gem1__screen_t2_r7 = 32'h00000000; +parameter mask_gem1__screen_t2_r7 = 32'h00000000; + +parameter gem1__screen_t2_r8 = 32'hE000C560; +parameter val_gem1__screen_t2_r8 = 32'h00000000; +parameter mask_gem1__screen_t2_r8 = 32'h00000000; + +parameter gem1__screen_t2_r9 = 32'hE000C564; +parameter val_gem1__screen_t2_r9 = 32'h00000000; +parameter mask_gem1__screen_t2_r9 = 32'h00000000; + +parameter gem1__screen_t2_r10 = 32'hE000C568; +parameter val_gem1__screen_t2_r10 = 32'h00000000; +parameter mask_gem1__screen_t2_r10 = 32'h00000000; + +parameter gem1__screen_t2_r11 = 32'hE000C56C; +parameter val_gem1__screen_t2_r11 = 32'h00000000; +parameter mask_gem1__screen_t2_r11 = 32'h00000000; + +parameter gem1__screen_t2_r12 = 32'hE000C570; +parameter val_gem1__screen_t2_r12 = 32'h00000000; +parameter mask_gem1__screen_t2_r12 = 32'h00000000; + +parameter gem1__screen_t2_r13 = 32'hE000C574; +parameter val_gem1__screen_t2_r13 = 32'h00000000; +parameter mask_gem1__screen_t2_r13 = 32'h00000000; + +parameter gem1__screen_t2_r14 = 32'hE000C578; +parameter val_gem1__screen_t2_r14 = 32'h00000000; +parameter mask_gem1__screen_t2_r14 = 32'h00000000; + +parameter gem1__screen_t2_r15 = 32'hE000C57C; +parameter val_gem1__screen_t2_r15 = 32'h00000000; +parameter mask_gem1__screen_t2_r15 = 32'h00000000; + +parameter gem1__intr_en_pq1 = 32'hE000C600; +parameter val_gem1__intr_en_pq1 = 32'h00000000; +parameter mask_gem1__intr_en_pq1 = 32'h00000000; + +parameter gem1__intr_en_pq2 = 32'hE000C604; +parameter val_gem1__intr_en_pq2 = 32'h00000000; +parameter mask_gem1__intr_en_pq2 = 32'h00000000; + +parameter gem1__intr_en_pq3 = 32'hE000C608; +parameter val_gem1__intr_en_pq3 = 32'h00000000; +parameter mask_gem1__intr_en_pq3 = 32'h00000000; + +parameter gem1__intr_en_pq4 = 32'hE000C60C; +parameter val_gem1__intr_en_pq4 = 32'h00000000; +parameter mask_gem1__intr_en_pq4 = 32'h00000000; + +parameter gem1__intr_en_pq5 = 32'hE000C610; +parameter val_gem1__intr_en_pq5 = 32'h00000000; +parameter mask_gem1__intr_en_pq5 = 32'h00000000; + +parameter gem1__intr_en_pq6 = 32'hE000C614; +parameter val_gem1__intr_en_pq6 = 32'h00000000; +parameter mask_gem1__intr_en_pq6 = 32'h00000000; + +parameter gem1__intr_en_pq7 = 32'hE000C618; +parameter val_gem1__intr_en_pq7 = 32'h00000000; +parameter mask_gem1__intr_en_pq7 = 32'h00000000; + +parameter gem1__intr_dis_pq1 = 32'hE000C620; +parameter val_gem1__intr_dis_pq1 = 32'h00000000; +parameter mask_gem1__intr_dis_pq1 = 32'h00000000; + +parameter gem1__intr_dis_pq2 = 32'hE000C624; +parameter val_gem1__intr_dis_pq2 = 32'h00000000; +parameter mask_gem1__intr_dis_pq2 = 32'h00000000; + +parameter gem1__intr_dis_pq3 = 32'hE000C628; +parameter val_gem1__intr_dis_pq3 = 32'h00000000; +parameter mask_gem1__intr_dis_pq3 = 32'h00000000; + +parameter gem1__intr_dis_pq4 = 32'hE000C62C; +parameter val_gem1__intr_dis_pq4 = 32'h00000000; +parameter mask_gem1__intr_dis_pq4 = 32'h00000000; + +parameter gem1__intr_dis_pq5 = 32'hE000C630; +parameter val_gem1__intr_dis_pq5 = 32'h00000000; +parameter mask_gem1__intr_dis_pq5 = 32'h00000000; + +parameter gem1__intr_dis_pq6 = 32'hE000C634; +parameter val_gem1__intr_dis_pq6 = 32'h00000000; +parameter mask_gem1__intr_dis_pq6 = 32'h00000000; + +parameter gem1__intr_dis_pq7 = 32'hE000C638; +parameter val_gem1__intr_dis_pq7 = 32'h00000000; +parameter mask_gem1__intr_dis_pq7 = 32'h00000000; + +parameter gem1__intr_mask_pq1 = 32'hE000C640; +parameter val_gem1__intr_mask_pq1 = 32'h00000000; +parameter mask_gem1__intr_mask_pq1 = 32'h00000000; + +parameter gem1__intr_mask_pq2 = 32'hE000C644; +parameter val_gem1__intr_mask_pq2 = 32'h00000000; +parameter mask_gem1__intr_mask_pq2 = 32'h00000000; + +parameter gem1__intr_mask_pq3 = 32'hE000C648; +parameter val_gem1__intr_mask_pq3 = 32'h00000000; +parameter mask_gem1__intr_mask_pq3 = 32'h00000000; + +parameter gem1__intr_mask_pq4 = 32'hE000C64C; +parameter val_gem1__intr_mask_pq4 = 32'h00000000; +parameter mask_gem1__intr_mask_pq4 = 32'h00000000; + +parameter gem1__intr_mask_pq5 = 32'hE000C650; +parameter val_gem1__intr_mask_pq5 = 32'h00000000; +parameter mask_gem1__intr_mask_pq5 = 32'h00000000; + +parameter gem1__intr_mask_pq6 = 32'hE000C654; +parameter val_gem1__intr_mask_pq6 = 32'h00000000; +parameter mask_gem1__intr_mask_pq6 = 32'h00000000; + +parameter gem1__intr_mask_pq7 = 32'hE000C658; +parameter val_gem1__intr_mask_pq7 = 32'h00000000; +parameter mask_gem1__intr_mask_pq7 = 32'h00000000; + + +// ************************************************************ +// Module gpio gpio +// doc version: +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter gpio__MASK_DATA_0_LSW = 32'hE000A000; +parameter val_gpio__MASK_DATA_0_LSW = 32'h00000000; +parameter mask_gpio__MASK_DATA_0_LSW = 32'hFFFF0000; + +parameter gpio__MASK_DATA_0_MSW = 32'hE000A004; +parameter val_gpio__MASK_DATA_0_MSW = 32'h00000000; +parameter mask_gpio__MASK_DATA_0_MSW = 32'hFFFF0000; + +parameter gpio__MASK_DATA_1_LSW = 32'hE000A008; +parameter val_gpio__MASK_DATA_1_LSW = 32'h00000000; +parameter mask_gpio__MASK_DATA_1_LSW = 32'hFFFF0000; + +parameter gpio__MASK_DATA_1_MSW = 32'hE000A00C; +parameter val_gpio__MASK_DATA_1_MSW = 32'h00000000; +parameter mask_gpio__MASK_DATA_1_MSW = 32'h003FFFC0; + +parameter gpio__MASK_DATA_2_LSW = 32'hE000A010; +parameter val_gpio__MASK_DATA_2_LSW = 32'h00000000; +parameter mask_gpio__MASK_DATA_2_LSW = 32'hFFFFFFFF; + +parameter gpio__MASK_DATA_2_MSW = 32'hE000A014; +parameter val_gpio__MASK_DATA_2_MSW = 32'h00000000; +parameter mask_gpio__MASK_DATA_2_MSW = 32'hFFFFFFFF; + +parameter gpio__MASK_DATA_3_LSW = 32'hE000A018; +parameter val_gpio__MASK_DATA_3_LSW = 32'h00000000; +parameter mask_gpio__MASK_DATA_3_LSW = 32'hFFFFFFFF; + +parameter gpio__MASK_DATA_3_MSW = 32'hE000A01C; +parameter val_gpio__MASK_DATA_3_MSW = 32'h00000000; +parameter mask_gpio__MASK_DATA_3_MSW = 32'hFFFFFFFF; + +parameter gpio__DATA_0 = 32'hE000A040; +parameter val_gpio__DATA_0 = 32'h00000000; +parameter mask_gpio__DATA_0 = 32'h00000000; + +parameter gpio__DATA_1 = 32'hE000A044; +parameter val_gpio__DATA_1 = 32'h00000000; +parameter mask_gpio__DATA_1 = 32'h00000000; + +parameter gpio__DATA_2 = 32'hE000A048; +parameter val_gpio__DATA_2 = 32'h00000000; +parameter mask_gpio__DATA_2 = 32'hFFFFFFFF; + +parameter gpio__DATA_3 = 32'hE000A04C; +parameter val_gpio__DATA_3 = 32'h00000000; +parameter mask_gpio__DATA_3 = 32'hFFFFFFFF; + +parameter gpio__DATA_0_RO = 32'hE000A060; +parameter val_gpio__DATA_0_RO = 32'h00000000; +parameter mask_gpio__DATA_0_RO = 32'h00000000; + +parameter gpio__DATA_1_RO = 32'hE000A064; +parameter val_gpio__DATA_1_RO = 32'h00000000; +parameter mask_gpio__DATA_1_RO = 32'h00000000; + +parameter gpio__DATA_2_RO = 32'hE000A068; +parameter val_gpio__DATA_2_RO = 32'h00000000; +parameter mask_gpio__DATA_2_RO = 32'hFFFFFFFF; + +parameter gpio__DATA_3_RO = 32'hE000A06C; +parameter val_gpio__DATA_3_RO = 32'h00000000; +parameter mask_gpio__DATA_3_RO = 32'hFFFFFFFF; + +parameter gpio__BYPM_0 = 32'hE000A200; +parameter val_gpio__BYPM_0 = 32'h00000000; +parameter mask_gpio__BYPM_0 = 32'hFFFFFFFF; + +parameter gpio__DIRM_0 = 32'hE000A204; +parameter val_gpio__DIRM_0 = 32'h00000000; +parameter mask_gpio__DIRM_0 = 32'hFFFFFFFF; + +parameter gpio__OEN_0 = 32'hE000A208; +parameter val_gpio__OEN_0 = 32'h00000000; +parameter mask_gpio__OEN_0 = 32'hFFFFFFFF; + +parameter gpio__INT_MASK_0 = 32'hE000A20C; +parameter val_gpio__INT_MASK_0 = 32'h00000000; +parameter mask_gpio__INT_MASK_0 = 32'hFFFFFFFF; + +parameter gpio__INT_EN_0 = 32'hE000A210; +parameter val_gpio__INT_EN_0 = 32'h00000000; +parameter mask_gpio__INT_EN_0 = 32'hFFFFFFFF; + +parameter gpio__INT_DIS_0 = 32'hE000A214; +parameter val_gpio__INT_DIS_0 = 32'h00000000; +parameter mask_gpio__INT_DIS_0 = 32'hFFFFFFFF; + +parameter gpio__INT_STAT_0 = 32'hE000A218; +parameter val_gpio__INT_STAT_0 = 32'h00000000; +parameter mask_gpio__INT_STAT_0 = 32'hFFFFFFFF; + +parameter gpio__INT_TYPE_0 = 32'hE000A21C; +parameter val_gpio__INT_TYPE_0 = 32'hFFFFFFFF; +parameter mask_gpio__INT_TYPE_0 = 32'hFFFFFFFF; + +parameter gpio__INT_POLARITY_0 = 32'hE000A220; +parameter val_gpio__INT_POLARITY_0 = 32'h00000000; +parameter mask_gpio__INT_POLARITY_0 = 32'hFFFFFFFF; + +parameter gpio__INT_ANY_0 = 32'hE000A224; +parameter val_gpio__INT_ANY_0 = 32'h00000000; +parameter mask_gpio__INT_ANY_0 = 32'hFFFFFFFF; + +parameter gpio__BYPM_1 = 32'hE000A240; +parameter val_gpio__BYPM_1 = 32'h00000000; +parameter mask_gpio__BYPM_1 = 32'h003FFFFF; + +parameter gpio__DIRM_1 = 32'hE000A244; +parameter val_gpio__DIRM_1 = 32'h00000000; +parameter mask_gpio__DIRM_1 = 32'h003FFFFF; + +parameter gpio__OEN_1 = 32'hE000A248; +parameter val_gpio__OEN_1 = 32'h00000000; +parameter mask_gpio__OEN_1 = 32'h003FFFFF; + +parameter gpio__INT_MASK_1 = 32'hE000A24C; +parameter val_gpio__INT_MASK_1 = 32'h00000000; +parameter mask_gpio__INT_MASK_1 = 32'h003FFFFF; + +parameter gpio__INT_EN_1 = 32'hE000A250; +parameter val_gpio__INT_EN_1 = 32'h00000000; +parameter mask_gpio__INT_EN_1 = 32'h003FFFFF; + +parameter gpio__INT_DIS_1 = 32'hE000A254; +parameter val_gpio__INT_DIS_1 = 32'h00000000; +parameter mask_gpio__INT_DIS_1 = 32'h003FFFFF; + +parameter gpio__INT_STAT_1 = 32'hE000A258; +parameter val_gpio__INT_STAT_1 = 32'h00000000; +parameter mask_gpio__INT_STAT_1 = 32'h003FFFFF; + +parameter gpio__INT_TYPE_1 = 32'hE000A25C; +parameter val_gpio__INT_TYPE_1 = 32'h003FFFFF; +parameter mask_gpio__INT_TYPE_1 = 32'h003FFFFF; + +parameter gpio__INT_POLARITY_1 = 32'hE000A260; +parameter val_gpio__INT_POLARITY_1 = 32'h00000000; +parameter mask_gpio__INT_POLARITY_1 = 32'h003FFFFF; + +parameter gpio__INT_ANY_1 = 32'hE000A264; +parameter val_gpio__INT_ANY_1 = 32'h00000000; +parameter mask_gpio__INT_ANY_1 = 32'h003FFFFF; + +parameter gpio__BYPM_2 = 32'hE000A280; +parameter val_gpio__BYPM_2 = 32'h00000000; +parameter mask_gpio__BYPM_2 = 32'hFFFFFFFF; + +parameter gpio__DIRM_2 = 32'hE000A284; +parameter val_gpio__DIRM_2 = 32'h00000000; +parameter mask_gpio__DIRM_2 = 32'hFFFFFFFF; + +parameter gpio__OEN_2 = 32'hE000A288; +parameter val_gpio__OEN_2 = 32'h00000000; +parameter mask_gpio__OEN_2 = 32'hFFFFFFFF; + +parameter gpio__INT_MASK_2 = 32'hE000A28C; +parameter val_gpio__INT_MASK_2 = 32'h00000000; +parameter mask_gpio__INT_MASK_2 = 32'hFFFFFFFF; + +parameter gpio__INT_EN_2 = 32'hE000A290; +parameter val_gpio__INT_EN_2 = 32'h00000000; +parameter mask_gpio__INT_EN_2 = 32'hFFFFFFFF; + +parameter gpio__INT_DIS_2 = 32'hE000A294; +parameter val_gpio__INT_DIS_2 = 32'h00000000; +parameter mask_gpio__INT_DIS_2 = 32'hFFFFFFFF; + +parameter gpio__INT_STAT_2 = 32'hE000A298; +parameter val_gpio__INT_STAT_2 = 32'h00000000; +parameter mask_gpio__INT_STAT_2 = 32'hFFFFFFFF; + +parameter gpio__INT_TYPE_2 = 32'hE000A29C; +parameter val_gpio__INT_TYPE_2 = 32'hFFFFFFFF; +parameter mask_gpio__INT_TYPE_2 = 32'hFFFFFFFF; + +parameter gpio__INT_POLARITY_2 = 32'hE000A2A0; +parameter val_gpio__INT_POLARITY_2 = 32'h00000000; +parameter mask_gpio__INT_POLARITY_2 = 32'hFFFFFFFF; + +parameter gpio__INT_ANY_2 = 32'hE000A2A4; +parameter val_gpio__INT_ANY_2 = 32'h00000000; +parameter mask_gpio__INT_ANY_2 = 32'hFFFFFFFF; + +parameter gpio__BYPM_3 = 32'hE000A2C0; +parameter val_gpio__BYPM_3 = 32'h00000000; +parameter mask_gpio__BYPM_3 = 32'hFFFFFFFF; + +parameter gpio__DIRM_3 = 32'hE000A2C4; +parameter val_gpio__DIRM_3 = 32'h00000000; +parameter mask_gpio__DIRM_3 = 32'hFFFFFFFF; + +parameter gpio__OEN_3 = 32'hE000A2C8; +parameter val_gpio__OEN_3 = 32'h00000000; +parameter mask_gpio__OEN_3 = 32'hFFFFFFFF; + +parameter gpio__INT_MASK_3 = 32'hE000A2CC; +parameter val_gpio__INT_MASK_3 = 32'h00000000; +parameter mask_gpio__INT_MASK_3 = 32'hFFFFFFFF; + +parameter gpio__INT_EN_3 = 32'hE000A2D0; +parameter val_gpio__INT_EN_3 = 32'h00000000; +parameter mask_gpio__INT_EN_3 = 32'hFFFFFFFF; + +parameter gpio__INT_DIS_3 = 32'hE000A2D4; +parameter val_gpio__INT_DIS_3 = 32'h00000000; +parameter mask_gpio__INT_DIS_3 = 32'hFFFFFFFF; + +parameter gpio__INT_STAT_3 = 32'hE000A2D8; +parameter val_gpio__INT_STAT_3 = 32'h00000000; +parameter mask_gpio__INT_STAT_3 = 32'hFFFFFFFF; + +parameter gpio__INT_TYPE_3 = 32'hE000A2DC; +parameter val_gpio__INT_TYPE_3 = 32'hFFFFFFFF; +parameter mask_gpio__INT_TYPE_3 = 32'hFFFFFFFF; + +parameter gpio__INT_POLARITY_3 = 32'hE000A2E0; +parameter val_gpio__INT_POLARITY_3 = 32'h00000000; +parameter mask_gpio__INT_POLARITY_3 = 32'hFFFFFFFF; + +parameter gpio__INT_ANY_3 = 32'hE000A2E4; +parameter val_gpio__INT_ANY_3 = 32'h00000000; +parameter mask_gpio__INT_ANY_3 = 32'hFFFFFFFF; + + +// ************************************************************ +// Module gpv_iou_switch gpv_iou_switch +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter gpv_iou_switch__Remap = 32'hE0200000; +parameter val_gpv_iou_switch__Remap = 32'h00000000; +parameter mask_gpv_iou_switch__Remap = 32'h000000FF; + +parameter gpv_iou_switch__security2_sdio0 = 32'hE0200008; +parameter val_gpv_iou_switch__security2_sdio0 = 32'h00000000; +parameter mask_gpv_iou_switch__security2_sdio0 = 32'h00000001; + +parameter gpv_iou_switch__security3_sdio1 = 32'hE020000C; +parameter val_gpv_iou_switch__security3_sdio1 = 32'h00000000; +parameter mask_gpv_iou_switch__security3_sdio1 = 32'h00000001; + +parameter gpv_iou_switch__security4_qspi = 32'hE0200010; +parameter val_gpv_iou_switch__security4_qspi = 32'h00000000; +parameter mask_gpv_iou_switch__security4_qspi = 32'h00000001; + +parameter gpv_iou_switch__security5_miou = 32'hE0200014; +parameter val_gpv_iou_switch__security5_miou = 32'h00000000; +parameter mask_gpv_iou_switch__security5_miou = 32'h00000001; + +parameter gpv_iou_switch__security6_apb_slaves = 32'hE0200018; +parameter val_gpv_iou_switch__security6_apb_slaves = 32'h00000000; +parameter mask_gpv_iou_switch__security6_apb_slaves = 32'h00007FFF; + +parameter gpv_iou_switch__security7_smc = 32'hE020001C; +parameter val_gpv_iou_switch__security7_smc = 32'h00000000; +parameter mask_gpv_iou_switch__security7_smc = 32'h00000001; + +parameter gpv_iou_switch__peripheral_id4 = 32'hE0201FD0; +parameter val_gpv_iou_switch__peripheral_id4 = 32'h00000004; +parameter mask_gpv_iou_switch__peripheral_id4 = 32'h000000FF; + +parameter gpv_iou_switch__peripheral_id5 = 32'hE0201FD4; +parameter val_gpv_iou_switch__peripheral_id5 = 32'h00000000; +parameter mask_gpv_iou_switch__peripheral_id5 = 32'h000000FF; + +parameter gpv_iou_switch__peripheral_id6 = 32'hE0201FD8; +parameter val_gpv_iou_switch__peripheral_id6 = 32'h00000000; +parameter mask_gpv_iou_switch__peripheral_id6 = 32'h000000FF; + +parameter gpv_iou_switch__peripheral_id7 = 32'hE0201FDC; +parameter val_gpv_iou_switch__peripheral_id7 = 32'h00000000; +parameter mask_gpv_iou_switch__peripheral_id7 = 32'h000000FF; + +parameter gpv_iou_switch__peripheral_id0 = 32'hE0201FE0; +parameter val_gpv_iou_switch__peripheral_id0 = 32'h00000001; +parameter mask_gpv_iou_switch__peripheral_id0 = 32'h000000FF; + +parameter gpv_iou_switch__peripheral_id1 = 32'hE0201FE4; +parameter val_gpv_iou_switch__peripheral_id1 = 32'h000000B3; +parameter mask_gpv_iou_switch__peripheral_id1 = 32'h000000FF; + +parameter gpv_iou_switch__peripheral_id2 = 32'hE0201FE8; +parameter val_gpv_iou_switch__peripheral_id2 = 32'h0000005B; +parameter mask_gpv_iou_switch__peripheral_id2 = 32'h000000FF; + +parameter gpv_iou_switch__peripheral_id3 = 32'hE0201FEC; +parameter val_gpv_iou_switch__peripheral_id3 = 32'h00000000; +parameter mask_gpv_iou_switch__peripheral_id3 = 32'h000000FF; + +parameter gpv_iou_switch__component_id0 = 32'hE0201FF0; +parameter val_gpv_iou_switch__component_id0 = 32'h0000000D; +parameter mask_gpv_iou_switch__component_id0 = 32'h000000FF; + +parameter gpv_iou_switch__component_id1 = 32'hE0201FF4; +parameter val_gpv_iou_switch__component_id1 = 32'h000000F0; +parameter mask_gpv_iou_switch__component_id1 = 32'h000000FF; + +parameter gpv_iou_switch__component_id2 = 32'hE0201FF8; +parameter val_gpv_iou_switch__component_id2 = 32'h00000005; +parameter mask_gpv_iou_switch__component_id2 = 32'h000000FF; + +parameter gpv_iou_switch__component_id3 = 32'hE0201FFC; +parameter val_gpv_iou_switch__component_id3 = 32'h000000B1; +parameter mask_gpv_iou_switch__component_id3 = 32'h000000FF; + +parameter gpv_iou_switch__fn_mod_bm_iss_sdio0 = 32'hE0202008; +parameter val_gpv_iou_switch__fn_mod_bm_iss_sdio0 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_bm_iss_sdio0 = 32'h00000003; + +parameter gpv_iou_switch__ahb_cntl_sdio0 = 32'hE0202044; +parameter val_gpv_iou_switch__ahb_cntl_sdio0 = 32'h00000000; +parameter mask_gpv_iou_switch__ahb_cntl_sdio0 = 32'h00000000; + +parameter gpv_iou_switch__fn_mod_bm_iss_sdio1 = 32'hE0203008; +parameter val_gpv_iou_switch__fn_mod_bm_iss_sdio1 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_bm_iss_sdio1 = 32'h00000003; + +parameter gpv_iou_switch__ahb_cntl_sdio1 = 32'hE0203044; +parameter val_gpv_iou_switch__ahb_cntl_sdio1 = 32'h00000000; +parameter mask_gpv_iou_switch__ahb_cntl_sdio1 = 32'h00000000; + +parameter gpv_iou_switch__fn_mod_bm_iss_qspi = 32'hE0204008; +parameter val_gpv_iou_switch__fn_mod_bm_iss_qspi = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_bm_iss_qspi = 32'h00000003; + +parameter gpv_iou_switch__fn_mod_bm_iss_miou = 32'hE0205008; +parameter val_gpv_iou_switch__fn_mod_bm_iss_miou = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_bm_iss_miou = 32'h00000003; + +parameter gpv_iou_switch__fn_mod_bm_iss_smc = 32'hE0207008; +parameter val_gpv_iou_switch__fn_mod_bm_iss_smc = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_bm_iss_smc = 32'h00000003; + +parameter gpv_iou_switch__fn_mod_ahb_gem0 = 32'hE0242028; +parameter val_gpv_iou_switch__fn_mod_ahb_gem0 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_ahb_gem0 = 32'h00000007; + +parameter gpv_iou_switch__read_qos_gem0 = 32'hE0242100; +parameter val_gpv_iou_switch__read_qos_gem0 = 32'h00000000; +parameter mask_gpv_iou_switch__read_qos_gem0 = 32'h0000000F; + +parameter gpv_iou_switch__write_qos_gem0 = 32'hE0242104; +parameter val_gpv_iou_switch__write_qos_gem0 = 32'h00000000; +parameter mask_gpv_iou_switch__write_qos_gem0 = 32'h0000000F; + +parameter gpv_iou_switch__fn_mod_iss_gem0 = 32'hE0242108; +parameter val_gpv_iou_switch__fn_mod_iss_gem0 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_iss_gem0 = 32'h00000003; + +parameter gpv_iou_switch__fn_mod_ahb_gem1 = 32'hE0243028; +parameter val_gpv_iou_switch__fn_mod_ahb_gem1 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_ahb_gem1 = 32'h00000007; + +parameter gpv_iou_switch__read_qos_gem1 = 32'hE0243100; +parameter val_gpv_iou_switch__read_qos_gem1 = 32'h00000000; +parameter mask_gpv_iou_switch__read_qos_gem1 = 32'h0000000F; + +parameter gpv_iou_switch__write_qos_gem1 = 32'hE0243104; +parameter val_gpv_iou_switch__write_qos_gem1 = 32'h00000000; +parameter mask_gpv_iou_switch__write_qos_gem1 = 32'h0000000F; + +parameter gpv_iou_switch__fn_mod_iss_gem1 = 32'hE0243108; +parameter val_gpv_iou_switch__fn_mod_iss_gem1 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_iss_gem1 = 32'h00000003; + +parameter gpv_iou_switch__fn_mod_ahb_usb0 = 32'hE0244028; +parameter val_gpv_iou_switch__fn_mod_ahb_usb0 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_ahb_usb0 = 32'h00000007; + +parameter gpv_iou_switch__read_qos_usb0 = 32'hE0244100; +parameter val_gpv_iou_switch__read_qos_usb0 = 32'h00000000; +parameter mask_gpv_iou_switch__read_qos_usb0 = 32'h0000000F; + +parameter gpv_iou_switch__write_qos_usb0 = 32'hE0244104; +parameter val_gpv_iou_switch__write_qos_usb0 = 32'h00000000; +parameter mask_gpv_iou_switch__write_qos_usb0 = 32'h0000000F; + +parameter gpv_iou_switch__fn_mod_iss_usb0 = 32'hE0244108; +parameter val_gpv_iou_switch__fn_mod_iss_usb0 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_iss_usb0 = 32'h00000003; + +parameter gpv_iou_switch__fn_mod_ahb_usb1 = 32'hE0245028; +parameter val_gpv_iou_switch__fn_mod_ahb_usb1 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_ahb_usb1 = 32'h00000007; + +parameter gpv_iou_switch__read_qos_usb1 = 32'hE0245100; +parameter val_gpv_iou_switch__read_qos_usb1 = 32'h00000000; +parameter mask_gpv_iou_switch__read_qos_usb1 = 32'h0000000F; + +parameter gpv_iou_switch__write_qos_usb1 = 32'hE0245104; +parameter val_gpv_iou_switch__write_qos_usb1 = 32'h00000000; +parameter mask_gpv_iou_switch__write_qos_usb1 = 32'h0000000F; + +parameter gpv_iou_switch__fn_mod_iss_usb1 = 32'hE0245108; +parameter val_gpv_iou_switch__fn_mod_iss_usb1 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_iss_usb1 = 32'h00000003; + +parameter gpv_iou_switch__fn_mod_ahb_sdio0 = 32'hE0246028; +parameter val_gpv_iou_switch__fn_mod_ahb_sdio0 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_ahb_sdio0 = 32'h00000007; + +parameter gpv_iou_switch__read_qos_sdio0 = 32'hE0246100; +parameter val_gpv_iou_switch__read_qos_sdio0 = 32'h00000000; +parameter mask_gpv_iou_switch__read_qos_sdio0 = 32'h0000000F; + +parameter gpv_iou_switch__write_qos_sdio0 = 32'hE0246104; +parameter val_gpv_iou_switch__write_qos_sdio0 = 32'h00000000; +parameter mask_gpv_iou_switch__write_qos_sdio0 = 32'h0000000F; + +parameter gpv_iou_switch__fn_mod_iss_sdio0 = 32'hE0246108; +parameter val_gpv_iou_switch__fn_mod_iss_sdio0 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_iss_sdio0 = 32'h00000003; + +parameter gpv_iou_switch__fn_mod_ahb_sdio1 = 32'hE0247028; +parameter val_gpv_iou_switch__fn_mod_ahb_sdio1 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_ahb_sdio1 = 32'h00000007; + +parameter gpv_iou_switch__read_qos_sdio1 = 32'hE0247100; +parameter val_gpv_iou_switch__read_qos_sdio1 = 32'h00000000; +parameter mask_gpv_iou_switch__read_qos_sdio1 = 32'h0000000F; + +parameter gpv_iou_switch__write_qos_sdio1 = 32'hE0247104; +parameter val_gpv_iou_switch__write_qos_sdio1 = 32'h00000000; +parameter mask_gpv_iou_switch__write_qos_sdio1 = 32'h0000000F; + +parameter gpv_iou_switch__fn_mod_iss_sdio1 = 32'hE0247108; +parameter val_gpv_iou_switch__fn_mod_iss_sdio1 = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_iss_sdio1 = 32'h00000003; + +parameter gpv_iou_switch__fn_mod_iss_siou = 32'hE0249108; +parameter val_gpv_iou_switch__fn_mod_iss_siou = 32'h00000000; +parameter mask_gpv_iou_switch__fn_mod_iss_siou = 32'h00000003; + + +// ************************************************************ +// Module gpv_qos301_cpu qos301 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter gpv_qos301_cpu__qos_cntl = 32'hF894610C; +parameter val_gpv_qos301_cpu__qos_cntl = 32'h00000000; +parameter mask_gpv_qos301_cpu__qos_cntl = 32'h000000FF; + +parameter gpv_qos301_cpu__max_ot = 32'hF8946110; +parameter val_gpv_qos301_cpu__max_ot = 32'h00000000; +parameter mask_gpv_qos301_cpu__max_ot = 32'h3FFF3FFF; + +parameter gpv_qos301_cpu__max_comb_ot = 32'hF8946114; +parameter val_gpv_qos301_cpu__max_comb_ot = 32'h00000000; +parameter mask_gpv_qos301_cpu__max_comb_ot = 32'h00007FFF; + +parameter gpv_qos301_cpu__aw_p = 32'hF8946118; +parameter val_gpv_qos301_cpu__aw_p = 32'h00000000; +parameter mask_gpv_qos301_cpu__aw_p = 32'hFF000000; + +parameter gpv_qos301_cpu__aw_b = 32'hF894611C; +parameter val_gpv_qos301_cpu__aw_b = 32'h00000000; +parameter mask_gpv_qos301_cpu__aw_b = 32'h0000FFFF; + +parameter gpv_qos301_cpu__aw_r = 32'hF8946120; +parameter val_gpv_qos301_cpu__aw_r = 32'h00000000; +parameter mask_gpv_qos301_cpu__aw_r = 32'hFFF00000; + +parameter gpv_qos301_cpu__ar_p = 32'hF8946124; +parameter val_gpv_qos301_cpu__ar_p = 32'h00000000; +parameter mask_gpv_qos301_cpu__ar_p = 32'hFF000000; + +parameter gpv_qos301_cpu__ar_b = 32'hF8946128; +parameter val_gpv_qos301_cpu__ar_b = 32'h00000000; +parameter mask_gpv_qos301_cpu__ar_b = 32'h0000FFFF; + +parameter gpv_qos301_cpu__ar_r = 32'hF894612C; +parameter val_gpv_qos301_cpu__ar_r = 32'h00000000; +parameter mask_gpv_qos301_cpu__ar_r = 32'hFFF00000; + + +// ************************************************************ +// Module gpv_qos301_dmac qos301 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter gpv_qos301_dmac__qos_cntl = 32'hF894710C; +parameter val_gpv_qos301_dmac__qos_cntl = 32'h00000000; +parameter mask_gpv_qos301_dmac__qos_cntl = 32'h000000FF; + +parameter gpv_qos301_dmac__max_ot = 32'hF8947110; +parameter val_gpv_qos301_dmac__max_ot = 32'h00000000; +parameter mask_gpv_qos301_dmac__max_ot = 32'h3FFF3FFF; + +parameter gpv_qos301_dmac__max_comb_ot = 32'hF8947114; +parameter val_gpv_qos301_dmac__max_comb_ot = 32'h00000000; +parameter mask_gpv_qos301_dmac__max_comb_ot = 32'h00007FFF; + +parameter gpv_qos301_dmac__aw_p = 32'hF8947118; +parameter val_gpv_qos301_dmac__aw_p = 32'h00000000; +parameter mask_gpv_qos301_dmac__aw_p = 32'hFF000000; + +parameter gpv_qos301_dmac__aw_b = 32'hF894711C; +parameter val_gpv_qos301_dmac__aw_b = 32'h00000000; +parameter mask_gpv_qos301_dmac__aw_b = 32'h0000FFFF; + +parameter gpv_qos301_dmac__aw_r = 32'hF8947120; +parameter val_gpv_qos301_dmac__aw_r = 32'h00000000; +parameter mask_gpv_qos301_dmac__aw_r = 32'hFFF00000; + +parameter gpv_qos301_dmac__ar_p = 32'hF8947124; +parameter val_gpv_qos301_dmac__ar_p = 32'h00000000; +parameter mask_gpv_qos301_dmac__ar_p = 32'hFF000000; + +parameter gpv_qos301_dmac__ar_b = 32'hF8947128; +parameter val_gpv_qos301_dmac__ar_b = 32'h00000000; +parameter mask_gpv_qos301_dmac__ar_b = 32'h0000FFFF; + +parameter gpv_qos301_dmac__ar_r = 32'hF894712C; +parameter val_gpv_qos301_dmac__ar_r = 32'h00000000; +parameter mask_gpv_qos301_dmac__ar_r = 32'hFFF00000; + + +// ************************************************************ +// Module gpv_qos301_iou qos301 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter gpv_qos301_iou__qos_cntl = 32'hF894810C; +parameter val_gpv_qos301_iou__qos_cntl = 32'h00000000; +parameter mask_gpv_qos301_iou__qos_cntl = 32'h000000FF; + +parameter gpv_qos301_iou__max_ot = 32'hF8948110; +parameter val_gpv_qos301_iou__max_ot = 32'h00000000; +parameter mask_gpv_qos301_iou__max_ot = 32'h3FFF3FFF; + +parameter gpv_qos301_iou__max_comb_ot = 32'hF8948114; +parameter val_gpv_qos301_iou__max_comb_ot = 32'h00000000; +parameter mask_gpv_qos301_iou__max_comb_ot = 32'h00007FFF; + +parameter gpv_qos301_iou__aw_p = 32'hF8948118; +parameter val_gpv_qos301_iou__aw_p = 32'h00000000; +parameter mask_gpv_qos301_iou__aw_p = 32'hFF000000; + +parameter gpv_qos301_iou__aw_b = 32'hF894811C; +parameter val_gpv_qos301_iou__aw_b = 32'h00000000; +parameter mask_gpv_qos301_iou__aw_b = 32'h0000FFFF; + +parameter gpv_qos301_iou__aw_r = 32'hF8948120; +parameter val_gpv_qos301_iou__aw_r = 32'h00000000; +parameter mask_gpv_qos301_iou__aw_r = 32'hFFF00000; + +parameter gpv_qos301_iou__ar_p = 32'hF8948124; +parameter val_gpv_qos301_iou__ar_p = 32'h00000000; +parameter mask_gpv_qos301_iou__ar_p = 32'hFF000000; + +parameter gpv_qos301_iou__ar_b = 32'hF8948128; +parameter val_gpv_qos301_iou__ar_b = 32'h00000000; +parameter mask_gpv_qos301_iou__ar_b = 32'h0000FFFF; + +parameter gpv_qos301_iou__ar_r = 32'hF894812C; +parameter val_gpv_qos301_iou__ar_r = 32'h00000000; +parameter mask_gpv_qos301_iou__ar_r = 32'hFFF00000; + + +// ************************************************************ +// Module gpv_trustzone nic301_addr_region_ctrl_registers +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter gpv_trustzone__Remap = 32'hF8900000; +parameter val_gpv_trustzone__Remap = 32'h00000000; +parameter mask_gpv_trustzone__Remap = 32'h000000C0; + +parameter gpv_trustzone__security_fssw_s0 = 32'hF890001C; +parameter val_gpv_trustzone__security_fssw_s0 = 32'h00000000; +parameter mask_gpv_trustzone__security_fssw_s0 = 32'h00000001; + +parameter gpv_trustzone__security_fssw_s1 = 32'hF8900020; +parameter val_gpv_trustzone__security_fssw_s1 = 32'h00000000; +parameter mask_gpv_trustzone__security_fssw_s1 = 32'h00000001; + +parameter gpv_trustzone__security_apb = 32'hF8900028; +parameter val_gpv_trustzone__security_apb = 32'h00000000; +parameter mask_gpv_trustzone__security_apb = 32'h0000003F; + + +// ************************************************************ +// Module i2c0 IIC +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter i2c0__Control_reg0 = 32'hE0004000; +parameter val_i2c0__Control_reg0 = 32'h00000000; +parameter mask_i2c0__Control_reg0 = 32'h0000FFFF; + +parameter i2c0__Status_reg0 = 32'hE0004004; +parameter val_i2c0__Status_reg0 = 32'h00000000; +parameter mask_i2c0__Status_reg0 = 32'h0000FFFF; + +parameter i2c0__I2C_address_reg0 = 32'hE0004008; +parameter val_i2c0__I2C_address_reg0 = 32'h00000000; +parameter mask_i2c0__I2C_address_reg0 = 32'h0000FFFF; + +parameter i2c0__I2C_data_reg0 = 32'hE000400C; +parameter val_i2c0__I2C_data_reg0 = 32'h00000000; +parameter mask_i2c0__I2C_data_reg0 = 32'h0000FFFF; + +parameter i2c0__Interrupt_status_reg0 = 32'hE0004010; +parameter val_i2c0__Interrupt_status_reg0 = 32'h00000000; +parameter mask_i2c0__Interrupt_status_reg0 = 32'h0000FFFF; + +parameter i2c0__Transfer_size_reg0 = 32'hE0004014; +parameter val_i2c0__Transfer_size_reg0 = 32'h00000000; +parameter mask_i2c0__Transfer_size_reg0 = 32'h000000FF; + +parameter i2c0__Slave_mon_pause_reg0 = 32'hE0004018; +parameter val_i2c0__Slave_mon_pause_reg0 = 32'h00000000; +parameter mask_i2c0__Slave_mon_pause_reg0 = 32'h000000FF; + +parameter i2c0__Time_out_reg0 = 32'hE000401C; +parameter val_i2c0__Time_out_reg0 = 32'h0000001F; +parameter mask_i2c0__Time_out_reg0 = 32'h000000FF; + +parameter i2c0__Intrpt_mask_reg0 = 32'hE0004020; +parameter val_i2c0__Intrpt_mask_reg0 = 32'h000002FF; +parameter mask_i2c0__Intrpt_mask_reg0 = 32'h0000FFFF; + +parameter i2c0__Intrpt_enable_reg0 = 32'hE0004024; +parameter val_i2c0__Intrpt_enable_reg0 = 32'h00000000; +parameter mask_i2c0__Intrpt_enable_reg0 = 32'h0000FFFF; + +parameter i2c0__Intrpt_disable_reg0 = 32'hE0004028; +parameter val_i2c0__Intrpt_disable_reg0 = 32'h00000000; +parameter mask_i2c0__Intrpt_disable_reg0 = 32'h0000FFFF; + + +// ************************************************************ +// Module i2c1 IIC +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter i2c1__Control_reg0 = 32'hE0005000; +parameter val_i2c1__Control_reg0 = 32'h00000000; +parameter mask_i2c1__Control_reg0 = 32'h0000FFFF; + +parameter i2c1__Status_reg0 = 32'hE0005004; +parameter val_i2c1__Status_reg0 = 32'h00000000; +parameter mask_i2c1__Status_reg0 = 32'h0000FFFF; + +parameter i2c1__I2C_address_reg0 = 32'hE0005008; +parameter val_i2c1__I2C_address_reg0 = 32'h00000000; +parameter mask_i2c1__I2C_address_reg0 = 32'h0000FFFF; + +parameter i2c1__I2C_data_reg0 = 32'hE000500C; +parameter val_i2c1__I2C_data_reg0 = 32'h00000000; +parameter mask_i2c1__I2C_data_reg0 = 32'h0000FFFF; + +parameter i2c1__Interrupt_status_reg0 = 32'hE0005010; +parameter val_i2c1__Interrupt_status_reg0 = 32'h00000000; +parameter mask_i2c1__Interrupt_status_reg0 = 32'h0000FFFF; + +parameter i2c1__Transfer_size_reg0 = 32'hE0005014; +parameter val_i2c1__Transfer_size_reg0 = 32'h00000000; +parameter mask_i2c1__Transfer_size_reg0 = 32'h000000FF; + +parameter i2c1__Slave_mon_pause_reg0 = 32'hE0005018; +parameter val_i2c1__Slave_mon_pause_reg0 = 32'h00000000; +parameter mask_i2c1__Slave_mon_pause_reg0 = 32'h000000FF; + +parameter i2c1__Time_out_reg0 = 32'hE000501C; +parameter val_i2c1__Time_out_reg0 = 32'h0000001F; +parameter mask_i2c1__Time_out_reg0 = 32'h000000FF; + +parameter i2c1__Intrpt_mask_reg0 = 32'hE0005020; +parameter val_i2c1__Intrpt_mask_reg0 = 32'h000002FF; +parameter mask_i2c1__Intrpt_mask_reg0 = 32'h0000FFFF; + +parameter i2c1__Intrpt_enable_reg0 = 32'hE0005024; +parameter val_i2c1__Intrpt_enable_reg0 = 32'h00000000; +parameter mask_i2c1__Intrpt_enable_reg0 = 32'h0000FFFF; + +parameter i2c1__Intrpt_disable_reg0 = 32'hE0005028; +parameter val_i2c1__Intrpt_disable_reg0 = 32'h00000000; +parameter mask_i2c1__Intrpt_disable_reg0 = 32'h0000FFFF; + + +// ************************************************************ +// Module l2cache L2Cpl310 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter l2cache__reg0_cache_id = 32'hF8F02000; +parameter val_l2cache__reg0_cache_id = 32'h410000C8; +parameter mask_l2cache__reg0_cache_id = 32'hFFFFFFFF; + +parameter l2cache__reg0_cache_type = 32'hF8F02004; +parameter val_l2cache__reg0_cache_type = 32'h9E300300; +parameter mask_l2cache__reg0_cache_type = 32'hFFFFFFFF; + +parameter l2cache__reg1_control = 32'hF8F02100; +parameter val_l2cache__reg1_control = 32'h00000000; +parameter mask_l2cache__reg1_control = 32'h7FFFFFFF; + +parameter l2cache__reg1_aux_control = 32'hF8F02104; +parameter val_l2cache__reg1_aux_control = 32'h02050000; +parameter mask_l2cache__reg1_aux_control = 32'hFFFFFFFF; + +parameter l2cache__reg1_tag_ram_control = 32'hF8F02108; +parameter val_l2cache__reg1_tag_ram_control = 32'h00000777; +parameter mask_l2cache__reg1_tag_ram_control = 32'hFFFFFFFF; + +parameter l2cache__reg1_data_ram_control = 32'hF8F0210C; +parameter val_l2cache__reg1_data_ram_control = 32'h00000777; +parameter mask_l2cache__reg1_data_ram_control = 32'hFFFFFFFF; + +parameter l2cache__reg2_ev_counter_ctrl = 32'hF8F02200; +parameter val_l2cache__reg2_ev_counter_ctrl = 32'h00000000; +parameter mask_l2cache__reg2_ev_counter_ctrl = 32'hFFFFFFFF; + +parameter l2cache__reg2_ev_counter1_cfg = 32'hF8F02204; +parameter val_l2cache__reg2_ev_counter1_cfg = 32'h00000000; +parameter mask_l2cache__reg2_ev_counter1_cfg = 32'hFFFFFFFF; + +parameter l2cache__reg2_ev_counter0_cfg = 32'hF8F02208; +parameter val_l2cache__reg2_ev_counter0_cfg = 32'h00000000; +parameter mask_l2cache__reg2_ev_counter0_cfg = 32'hFFFFFFFF; + +parameter l2cache__reg2_ev_counter1 = 32'hF8F0220C; +parameter val_l2cache__reg2_ev_counter1 = 32'h00000000; +parameter mask_l2cache__reg2_ev_counter1 = 32'hFFFFFFFF; + +parameter l2cache__reg2_ev_counter0 = 32'hF8F02210; +parameter val_l2cache__reg2_ev_counter0 = 32'h00000000; +parameter mask_l2cache__reg2_ev_counter0 = 32'hFFFFFFFF; + +parameter l2cache__reg2_int_mask = 32'hF8F02214; +parameter val_l2cache__reg2_int_mask = 32'h00000000; +parameter mask_l2cache__reg2_int_mask = 32'hFFFFFFFF; + +parameter l2cache__reg2_int_mask_status = 32'hF8F02218; +parameter val_l2cache__reg2_int_mask_status = 32'h00000000; +parameter mask_l2cache__reg2_int_mask_status = 32'hFFFFFFFF; + +parameter l2cache__reg2_int_raw_status = 32'hF8F0221C; +parameter val_l2cache__reg2_int_raw_status = 32'h00000000; +parameter mask_l2cache__reg2_int_raw_status = 32'hFFFFFFFF; + +parameter l2cache__reg2_int_clear = 32'hF8F02220; +parameter val_l2cache__reg2_int_clear = 32'h00000000; +parameter mask_l2cache__reg2_int_clear = 32'hFFFFFFFF; + +parameter l2cache__reg7_cache_sync = 32'hF8F02730; +parameter val_l2cache__reg7_cache_sync = 32'h00000000; +parameter mask_l2cache__reg7_cache_sync = 32'hFFFFFFFF; + +parameter l2cache__reg7_inv_pa = 32'hF8F02770; +parameter val_l2cache__reg7_inv_pa = 32'h00000000; +parameter mask_l2cache__reg7_inv_pa = 32'hFFFFFFFF; + +parameter l2cache__reg7_inv_way = 32'hF8F0277C; +parameter val_l2cache__reg7_inv_way = 32'h00000000; +parameter mask_l2cache__reg7_inv_way = 32'hFFFFFFFF; + +parameter l2cache__reg7_clean_pa = 32'hF8F027B0; +parameter val_l2cache__reg7_clean_pa = 32'h00000000; +parameter mask_l2cache__reg7_clean_pa = 32'hFFFFFFFF; + +parameter l2cache__reg7_clean_index = 32'hF8F027B8; +parameter val_l2cache__reg7_clean_index = 32'h00000000; +parameter mask_l2cache__reg7_clean_index = 32'hFFFFFFFF; + +parameter l2cache__reg7_clean_way = 32'hF8F027BC; +parameter val_l2cache__reg7_clean_way = 32'h00000000; +parameter mask_l2cache__reg7_clean_way = 32'hFFFFFFFF; + +parameter l2cache__reg7_clean_inv_pa = 32'hF8F027F0; +parameter val_l2cache__reg7_clean_inv_pa = 32'h00000000; +parameter mask_l2cache__reg7_clean_inv_pa = 32'hFFFFFFFF; + +parameter l2cache__reg7_clean_inv_index = 32'hF8F027F8; +parameter val_l2cache__reg7_clean_inv_index = 32'h00000000; +parameter mask_l2cache__reg7_clean_inv_index = 32'hFFFFFFFF; + +parameter l2cache__reg7_clean_inv_way = 32'hF8F027FC; +parameter val_l2cache__reg7_clean_inv_way = 32'h00000000; +parameter mask_l2cache__reg7_clean_inv_way = 32'hFFFFFFFF; + +parameter l2cache__reg9_d_lockdown0 = 32'hF8F02900; +parameter val_l2cache__reg9_d_lockdown0 = 32'h00000000; +parameter mask_l2cache__reg9_d_lockdown0 = 32'hFFFFFFFF; + +parameter l2cache__reg9_i_lockdown0 = 32'hF8F02904; +parameter val_l2cache__reg9_i_lockdown0 = 32'h00000000; +parameter mask_l2cache__reg9_i_lockdown0 = 32'hFFFFFFFF; + +parameter l2cache__reg9_d_lockdown1 = 32'hF8F02908; +parameter val_l2cache__reg9_d_lockdown1 = 32'h00000000; +parameter mask_l2cache__reg9_d_lockdown1 = 32'hFFFFFFFF; + +parameter l2cache__reg9_i_lockdown1 = 32'hF8F0290C; +parameter val_l2cache__reg9_i_lockdown1 = 32'h00000000; +parameter mask_l2cache__reg9_i_lockdown1 = 32'hFFFFFFFF; + +parameter l2cache__reg9_d_lockdown2 = 32'hF8F02910; +parameter val_l2cache__reg9_d_lockdown2 = 32'h00000000; +parameter mask_l2cache__reg9_d_lockdown2 = 32'hFFFFFFFF; + +parameter l2cache__reg9_i_lockdown2 = 32'hF8F02914; +parameter val_l2cache__reg9_i_lockdown2 = 32'h00000000; +parameter mask_l2cache__reg9_i_lockdown2 = 32'hFFFFFFFF; + +parameter l2cache__reg9_d_lockdown3 = 32'hF8F02918; +parameter val_l2cache__reg9_d_lockdown3 = 32'h00000000; +parameter mask_l2cache__reg9_d_lockdown3 = 32'hFFFFFFFF; + +parameter l2cache__reg9_i_lockdown3 = 32'hF8F0291C; +parameter val_l2cache__reg9_i_lockdown3 = 32'h00000000; +parameter mask_l2cache__reg9_i_lockdown3 = 32'hFFFFFFFF; + +parameter l2cache__reg9_d_lockdown4 = 32'hF8F02920; +parameter val_l2cache__reg9_d_lockdown4 = 32'h00000000; +parameter mask_l2cache__reg9_d_lockdown4 = 32'hFFFFFFFF; + +parameter l2cache__reg9_i_lockdown4 = 32'hF8F02924; +parameter val_l2cache__reg9_i_lockdown4 = 32'h00000000; +parameter mask_l2cache__reg9_i_lockdown4 = 32'hFFFFFFFF; + +parameter l2cache__reg9_d_lockdown5 = 32'hF8F02928; +parameter val_l2cache__reg9_d_lockdown5 = 32'h00000000; +parameter mask_l2cache__reg9_d_lockdown5 = 32'hFFFFFFFF; + +parameter l2cache__reg9_i_lockdown5 = 32'hF8F0292C; +parameter val_l2cache__reg9_i_lockdown5 = 32'h00000000; +parameter mask_l2cache__reg9_i_lockdown5 = 32'hFFFFFFFF; + +parameter l2cache__reg9_d_lockdown6 = 32'hF8F02930; +parameter val_l2cache__reg9_d_lockdown6 = 32'h00000000; +parameter mask_l2cache__reg9_d_lockdown6 = 32'hFFFFFFFF; + +parameter l2cache__reg9_i_lockdown6 = 32'hF8F02934; +parameter val_l2cache__reg9_i_lockdown6 = 32'h00000000; +parameter mask_l2cache__reg9_i_lockdown6 = 32'hFFFFFFFF; + +parameter l2cache__reg9_d_lockdown7 = 32'hF8F02938; +parameter val_l2cache__reg9_d_lockdown7 = 32'h00000000; +parameter mask_l2cache__reg9_d_lockdown7 = 32'hFFFFFFFF; + +parameter l2cache__reg9_i_lockdown7 = 32'hF8F0293C; +parameter val_l2cache__reg9_i_lockdown7 = 32'h00000000; +parameter mask_l2cache__reg9_i_lockdown7 = 32'hFFFFFFFF; + +parameter l2cache__reg9_lock_line_en = 32'hF8F02950; +parameter val_l2cache__reg9_lock_line_en = 32'h00000000; +parameter mask_l2cache__reg9_lock_line_en = 32'hFFFFFFFF; + +parameter l2cache__reg9_unlock_way = 32'hF8F02954; +parameter val_l2cache__reg9_unlock_way = 32'h00000000; +parameter mask_l2cache__reg9_unlock_way = 32'hFFFFFFFF; + +parameter l2cache__reg12_addr_filtering_start = 32'hF8F02C00; +parameter val_l2cache__reg12_addr_filtering_start = 32'h40000001; +parameter mask_l2cache__reg12_addr_filtering_start = 32'hFFFFFFFF; + +parameter l2cache__reg12_addr_filtering_end = 32'hF8F02C04; +parameter val_l2cache__reg12_addr_filtering_end = 32'hFFF00000; +parameter mask_l2cache__reg12_addr_filtering_end = 32'hFFFFFFFF; + +parameter l2cache__reg15_debug_ctrl = 32'hF8F02F40; +parameter val_l2cache__reg15_debug_ctrl = 32'h00000000; +parameter mask_l2cache__reg15_debug_ctrl = 32'hFFFFFFFF; + +parameter l2cache__reg15_prefetch_ctrl = 32'hF8F02F60; +parameter val_l2cache__reg15_prefetch_ctrl = 32'h00000000; +parameter mask_l2cache__reg15_prefetch_ctrl = 32'hFFFFFFFF; + +parameter l2cache__reg15_power_ctrl = 32'hF8F02F80; +parameter val_l2cache__reg15_power_ctrl = 32'h00000000; +parameter mask_l2cache__reg15_power_ctrl = 32'hFFFFFFFF; + + +// ************************************************************ +// Module mpcore mpcore +// doc version: 1.3 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter mpcore__SCU_CONTROL_REGISTER = 32'hF8F00000; +parameter val_mpcore__SCU_CONTROL_REGISTER = 32'h00000002; +parameter mask_mpcore__SCU_CONTROL_REGISTER = 32'hFFFFFFFF; + +parameter mpcore__SCU_CONFIGURATION_REGISTER = 32'hF8F00004; +parameter val_mpcore__SCU_CONFIGURATION_REGISTER = 32'h00000501; +parameter mask_mpcore__SCU_CONFIGURATION_REGISTER = 32'hFFFFFFFF; + +parameter mpcore__SCU_CPU_Power_Status_Register = 32'hF8F00008; +parameter val_mpcore__SCU_CPU_Power_Status_Register = 32'h00000000; +parameter mask_mpcore__SCU_CPU_Power_Status_Register = 32'hFFFFFFFF; + +parameter mpcore__SCU_Invalidate_All_Registers_in_Secure_State = 32'hF8F0000C; +parameter val_mpcore__SCU_Invalidate_All_Registers_in_Secure_State = 32'h00000000; +parameter mask_mpcore__SCU_Invalidate_All_Registers_in_Secure_State = 32'hFFFFFFFF; + +parameter mpcore__Filtering_Start_Address_Register = 32'hF8F00040; +parameter val_mpcore__Filtering_Start_Address_Register = 32'h00100000; +parameter mask_mpcore__Filtering_Start_Address_Register = 32'hFFFFFFFF; + +parameter mpcore__Filtering_End_Address_Register = 32'hF8F00044; +parameter val_mpcore__Filtering_End_Address_Register = 32'h00000000; +parameter mask_mpcore__Filtering_End_Address_Register = 32'hFFFFFFFF; + +parameter mpcore__SCU_Access_Control_Register_SAC = 32'hF8F00050; +parameter val_mpcore__SCU_Access_Control_Register_SAC = 32'h0000000F; +parameter mask_mpcore__SCU_Access_Control_Register_SAC = 32'hFFFFFFFF; + +parameter mpcore__SCU_Non_secure_Access_Control_Register = 32'hF8F00054; +parameter val_mpcore__SCU_Non_secure_Access_Control_Register = 32'h00000000; +parameter mask_mpcore__SCU_Non_secure_Access_Control_Register = 32'hFFFFFFFF; + +parameter mpcore__ICCICR = 32'hF8F00100; +parameter val_mpcore__ICCICR = 32'h00000000; +parameter mask_mpcore__ICCICR = 32'hFFFFFFFF; + +parameter mpcore__ICCPMR = 32'hF8F00104; +parameter val_mpcore__ICCPMR = 32'h00000000; +parameter mask_mpcore__ICCPMR = 32'hFFFFFFFF; + +parameter mpcore__ICCBPR = 32'hF8F00108; +parameter val_mpcore__ICCBPR = 32'h00000002; +parameter mask_mpcore__ICCBPR = 32'hFFFFFFFF; + +parameter mpcore__ICCIAR = 32'hF8F0010C; +parameter val_mpcore__ICCIAR = 32'h000003FF; +parameter mask_mpcore__ICCIAR = 32'hFFFFFFFF; + +parameter mpcore__ICCEOIR = 32'hF8F00110; +parameter val_mpcore__ICCEOIR = 32'h00000000; +parameter mask_mpcore__ICCEOIR = 32'hFFFFFFFF; + +parameter mpcore__ICCRPR = 32'hF8F00114; +parameter val_mpcore__ICCRPR = 32'h000000FF; +parameter mask_mpcore__ICCRPR = 32'hFFFFFFFF; + +parameter mpcore__ICCHPIR = 32'hF8F00118; +parameter val_mpcore__ICCHPIR = 32'h000003FF; +parameter mask_mpcore__ICCHPIR = 32'hFFFFFFFF; + +parameter mpcore__ICCABPR = 32'hF8F0011C; +parameter val_mpcore__ICCABPR = 32'h00000003; +parameter mask_mpcore__ICCABPR = 32'hFFFFFFFF; + +parameter mpcore__ICCIDR = 32'hF8F001FC; +parameter val_mpcore__ICCIDR = 32'h3901243B; +parameter mask_mpcore__ICCIDR = 32'hFFFFFFFF; + +parameter mpcore__Global_Timer_Counter_Register0 = 32'hF8F00200; +parameter val_mpcore__Global_Timer_Counter_Register0 = 32'h00000000; +parameter mask_mpcore__Global_Timer_Counter_Register0 = 32'hFFFFFFFF; + +parameter mpcore__Global_Timer_Counter_Register1 = 32'hF8F00204; +parameter val_mpcore__Global_Timer_Counter_Register1 = 32'h00000000; +parameter mask_mpcore__Global_Timer_Counter_Register1 = 32'hFFFFFFFF; + +parameter mpcore__Global_Timer_Control_Register = 32'hF8F00208; +parameter val_mpcore__Global_Timer_Control_Register = 32'h00000000; +parameter mask_mpcore__Global_Timer_Control_Register = 32'hFFFFFFFF; + +parameter mpcore__Global_Timer_Interrupt_Status_Register = 32'hF8F0020C; +parameter val_mpcore__Global_Timer_Interrupt_Status_Register = 32'h00000000; +parameter mask_mpcore__Global_Timer_Interrupt_Status_Register = 32'hFFFFFFFF; + +parameter mpcore__Comparator_Value_Register0 = 32'hF8F00210; +parameter val_mpcore__Comparator_Value_Register0 = 32'h00000000; +parameter mask_mpcore__Comparator_Value_Register0 = 32'hFFFFFFFF; + +parameter mpcore__Comparator_Value_Register1 = 32'hF8F00214; +parameter val_mpcore__Comparator_Value_Register1 = 32'h00000000; +parameter mask_mpcore__Comparator_Value_Register1 = 32'hFFFFFFFF; + +parameter mpcore__Auto_increment_Register = 32'hF8F00218; +parameter val_mpcore__Auto_increment_Register = 32'h00000000; +parameter mask_mpcore__Auto_increment_Register = 32'hFFFFFFFF; + +parameter mpcore__Private_Timer_Load_Register = 32'hF8F00600; +parameter val_mpcore__Private_Timer_Load_Register = 32'h00000000; +parameter mask_mpcore__Private_Timer_Load_Register = 32'hFFFFFFFF; + +parameter mpcore__Private_Timer_Counter_Register = 32'hF8F00604; +parameter val_mpcore__Private_Timer_Counter_Register = 32'h00000000; +parameter mask_mpcore__Private_Timer_Counter_Register = 32'hFFFFFFFF; + +parameter mpcore__Private_Timer_Control_Register = 32'hF8F00608; +parameter val_mpcore__Private_Timer_Control_Register = 32'h00000000; +parameter mask_mpcore__Private_Timer_Control_Register = 32'hFFFFFFFF; + +parameter mpcore__Private_Timer_Interrupt_Status_Register = 32'hF8F0060C; +parameter val_mpcore__Private_Timer_Interrupt_Status_Register = 32'h00000000; +parameter mask_mpcore__Private_Timer_Interrupt_Status_Register = 32'hFFFFFFFF; + +parameter mpcore__Watchdog_Load_Register = 32'hF8F00620; +parameter val_mpcore__Watchdog_Load_Register = 32'h00000000; +parameter mask_mpcore__Watchdog_Load_Register = 32'hFFFFFFFF; + +parameter mpcore__Watchdog_Counter_Register = 32'hF8F00624; +parameter val_mpcore__Watchdog_Counter_Register = 32'h00000000; +parameter mask_mpcore__Watchdog_Counter_Register = 32'hFFFFFFFF; + +parameter mpcore__Watchdog_Control_Register = 32'hF8F00628; +parameter val_mpcore__Watchdog_Control_Register = 32'h00000000; +parameter mask_mpcore__Watchdog_Control_Register = 32'hFFFFFFFF; + +parameter mpcore__Watchdog_Interrupt_Status_Register = 32'hF8F0062C; +parameter val_mpcore__Watchdog_Interrupt_Status_Register = 32'h00000000; +parameter mask_mpcore__Watchdog_Interrupt_Status_Register = 32'hFFFFFFFF; + +parameter mpcore__Watchdog_Reset_Status_Register = 32'hF8F00630; +parameter val_mpcore__Watchdog_Reset_Status_Register = 32'h00000000; +parameter mask_mpcore__Watchdog_Reset_Status_Register = 32'hFFFFFFFF; + +parameter mpcore__Watchdog_Disable_Register = 32'hF8F00634; +parameter val_mpcore__Watchdog_Disable_Register = 32'h00000000; +parameter mask_mpcore__Watchdog_Disable_Register = 32'hFFFFFFFF; + +parameter mpcore__ICDDCR = 32'hF8F01000; +parameter val_mpcore__ICDDCR = 32'h00000000; +parameter mask_mpcore__ICDDCR = 32'hFFFFFFFF; + +parameter mpcore__ICDICTR = 32'hF8F01004; +parameter val_mpcore__ICDICTR = 32'h00000C22; +parameter mask_mpcore__ICDICTR = 32'hE000FFFF; + +parameter mpcore__ICDIIDR = 32'hF8F01008; +parameter val_mpcore__ICDIIDR = 32'h0102043B; +parameter mask_mpcore__ICDIIDR = 32'hFFFFFFFF; + +parameter mpcore__ICDISR0 = 32'hF8F01080; +parameter val_mpcore__ICDISR0 = 32'h00000000; +parameter mask_mpcore__ICDISR0 = 32'hFFFFFFFF; + +parameter mpcore__ICDISR1 = 32'hF8F01084; +parameter val_mpcore__ICDISR1 = 32'h00000000; +parameter mask_mpcore__ICDISR1 = 32'hFFFFFFFF; + +parameter mpcore__ICDISR2 = 32'hF8F01088; +parameter val_mpcore__ICDISR2 = 32'h00000000; +parameter mask_mpcore__ICDISR2 = 32'hFFFFFFFF; + +parameter mpcore__ICDISER0 = 32'hF8F01100; +parameter val_mpcore__ICDISER0 = 32'h0000FFFF; +parameter mask_mpcore__ICDISER0 = 32'hFFFFFFFF; + +parameter mpcore__ICDISER1 = 32'hF8F01104; +parameter val_mpcore__ICDISER1 = 32'h00000000; +parameter mask_mpcore__ICDISER1 = 32'hFFFFFFFF; + +parameter mpcore__ICDISER2 = 32'hF8F01108; +parameter val_mpcore__ICDISER2 = 32'h00000000; +parameter mask_mpcore__ICDISER2 = 32'hFFFFFFFF; + +parameter mpcore__ICDICER0 = 32'hF8F01180; +parameter val_mpcore__ICDICER0 = 32'h0000FFFF; +parameter mask_mpcore__ICDICER0 = 32'hFFFFFFFF; + +parameter mpcore__ICDICER1 = 32'hF8F01184; +parameter val_mpcore__ICDICER1 = 32'h00000000; +parameter mask_mpcore__ICDICER1 = 32'hFFFFFFFF; + +parameter mpcore__ICDICER2 = 32'hF8F01188; +parameter val_mpcore__ICDICER2 = 32'h00000000; +parameter mask_mpcore__ICDICER2 = 32'hFFFFFFFF; + +parameter mpcore__ICDISPR0 = 32'hF8F01200; +parameter val_mpcore__ICDISPR0 = 32'h00000000; +parameter mask_mpcore__ICDISPR0 = 32'hFFFFFFFF; + +parameter mpcore__ICDISPR1 = 32'hF8F01204; +parameter val_mpcore__ICDISPR1 = 32'h00000000; +parameter mask_mpcore__ICDISPR1 = 32'hFFFFFFFF; + +parameter mpcore__ICDISPR2 = 32'hF8F01208; +parameter val_mpcore__ICDISPR2 = 32'h00000000; +parameter mask_mpcore__ICDISPR2 = 32'hFFFFFFFF; + +parameter mpcore__ICDICPR0 = 32'hF8F01280; +parameter val_mpcore__ICDICPR0 = 32'h00000000; +parameter mask_mpcore__ICDICPR0 = 32'hFFFFFFFF; + +parameter mpcore__ICDICPR1 = 32'hF8F01284; +parameter val_mpcore__ICDICPR1 = 32'h00000000; +parameter mask_mpcore__ICDICPR1 = 32'hFFFFFFFF; + +parameter mpcore__ICDICPR2 = 32'hF8F01288; +parameter val_mpcore__ICDICPR2 = 32'h00000000; +parameter mask_mpcore__ICDICPR2 = 32'hFFFFFFFF; + +parameter mpcore__ICDABR0 = 32'hF8F01300; +parameter val_mpcore__ICDABR0 = 32'h00000000; +parameter mask_mpcore__ICDABR0 = 32'hFFFFFFFF; + +parameter mpcore__ICDABR1 = 32'hF8F01304; +parameter val_mpcore__ICDABR1 = 32'h00000000; +parameter mask_mpcore__ICDABR1 = 32'hFFFFFFFF; + +parameter mpcore__ICDABR2 = 32'hF8F01308; +parameter val_mpcore__ICDABR2 = 32'h00000000; +parameter mask_mpcore__ICDABR2 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR0 = 32'hF8F01400; +parameter val_mpcore__ICDIPR0 = 32'h00000000; +parameter mask_mpcore__ICDIPR0 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR1 = 32'hF8F01404; +parameter val_mpcore__ICDIPR1 = 32'h00000000; +parameter mask_mpcore__ICDIPR1 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR2 = 32'hF8F01408; +parameter val_mpcore__ICDIPR2 = 32'h00000000; +parameter mask_mpcore__ICDIPR2 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR3 = 32'hF8F0140C; +parameter val_mpcore__ICDIPR3 = 32'h00000000; +parameter mask_mpcore__ICDIPR3 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR4 = 32'hF8F01410; +parameter val_mpcore__ICDIPR4 = 32'h00000000; +parameter mask_mpcore__ICDIPR4 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR5 = 32'hF8F01414; +parameter val_mpcore__ICDIPR5 = 32'h00000000; +parameter mask_mpcore__ICDIPR5 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR6 = 32'hF8F01418; +parameter val_mpcore__ICDIPR6 = 32'h00000000; +parameter mask_mpcore__ICDIPR6 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR7 = 32'hF8F0141C; +parameter val_mpcore__ICDIPR7 = 32'h00000000; +parameter mask_mpcore__ICDIPR7 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR8 = 32'hF8F01420; +parameter val_mpcore__ICDIPR8 = 32'h00000000; +parameter mask_mpcore__ICDIPR8 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR9 = 32'hF8F01424; +parameter val_mpcore__ICDIPR9 = 32'h00000000; +parameter mask_mpcore__ICDIPR9 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR10 = 32'hF8F01428; +parameter val_mpcore__ICDIPR10 = 32'h00000000; +parameter mask_mpcore__ICDIPR10 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR11 = 32'hF8F0142C; +parameter val_mpcore__ICDIPR11 = 32'h00000000; +parameter mask_mpcore__ICDIPR11 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR12 = 32'hF8F01430; +parameter val_mpcore__ICDIPR12 = 32'h00000000; +parameter mask_mpcore__ICDIPR12 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR13 = 32'hF8F01434; +parameter val_mpcore__ICDIPR13 = 32'h00000000; +parameter mask_mpcore__ICDIPR13 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR14 = 32'hF8F01438; +parameter val_mpcore__ICDIPR14 = 32'h00000000; +parameter mask_mpcore__ICDIPR14 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR15 = 32'hF8F0143C; +parameter val_mpcore__ICDIPR15 = 32'h00000000; +parameter mask_mpcore__ICDIPR15 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR16 = 32'hF8F01440; +parameter val_mpcore__ICDIPR16 = 32'h00000000; +parameter mask_mpcore__ICDIPR16 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR17 = 32'hF8F01444; +parameter val_mpcore__ICDIPR17 = 32'h00000000; +parameter mask_mpcore__ICDIPR17 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR18 = 32'hF8F01448; +parameter val_mpcore__ICDIPR18 = 32'h00000000; +parameter mask_mpcore__ICDIPR18 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR19 = 32'hF8F0144C; +parameter val_mpcore__ICDIPR19 = 32'h00000000; +parameter mask_mpcore__ICDIPR19 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR20 = 32'hF8F01450; +parameter val_mpcore__ICDIPR20 = 32'h00000000; +parameter mask_mpcore__ICDIPR20 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR21 = 32'hF8F01454; +parameter val_mpcore__ICDIPR21 = 32'h00000000; +parameter mask_mpcore__ICDIPR21 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR22 = 32'hF8F01458; +parameter val_mpcore__ICDIPR22 = 32'h00000000; +parameter mask_mpcore__ICDIPR22 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPR23 = 32'hF8F0145C; +parameter val_mpcore__ICDIPR23 = 32'h00000000; +parameter mask_mpcore__ICDIPR23 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR0 = 32'hF8F01800; +parameter val_mpcore__ICDIPTR0 = 32'h01010101; +parameter mask_mpcore__ICDIPTR0 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR1 = 32'hF8F01804; +parameter val_mpcore__ICDIPTR1 = 32'h01010101; +parameter mask_mpcore__ICDIPTR1 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR2 = 32'hF8F01808; +parameter val_mpcore__ICDIPTR2 = 32'h01010101; +parameter mask_mpcore__ICDIPTR2 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR3 = 32'hF8F0180C; +parameter val_mpcore__ICDIPTR3 = 32'h01010101; +parameter mask_mpcore__ICDIPTR3 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR4 = 32'hF8F01810; +parameter val_mpcore__ICDIPTR4 = 32'h01010101; +parameter mask_mpcore__ICDIPTR4 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR5 = 32'hF8F01814; +parameter val_mpcore__ICDIPTR5 = 32'h01010101; +parameter mask_mpcore__ICDIPTR5 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR6 = 32'hF8F01818; +parameter val_mpcore__ICDIPTR6 = 32'h01010101; +parameter mask_mpcore__ICDIPTR6 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR7 = 32'hF8F0181C; +parameter val_mpcore__ICDIPTR7 = 32'h01010101; +parameter mask_mpcore__ICDIPTR7 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR8 = 32'hF8F01820; +parameter val_mpcore__ICDIPTR8 = 32'h01010101; +parameter mask_mpcore__ICDIPTR8 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR9 = 32'hF8F01824; +parameter val_mpcore__ICDIPTR9 = 32'h01010101; +parameter mask_mpcore__ICDIPTR9 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR10 = 32'hF8F01828; +parameter val_mpcore__ICDIPTR10 = 32'h01010101; +parameter mask_mpcore__ICDIPTR10 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR11 = 32'hF8F0182C; +parameter val_mpcore__ICDIPTR11 = 32'h01010101; +parameter mask_mpcore__ICDIPTR11 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR12 = 32'hF8F01830; +parameter val_mpcore__ICDIPTR12 = 32'h01010101; +parameter mask_mpcore__ICDIPTR12 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR13 = 32'hF8F01834; +parameter val_mpcore__ICDIPTR13 = 32'h01010101; +parameter mask_mpcore__ICDIPTR13 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR14 = 32'hF8F01838; +parameter val_mpcore__ICDIPTR14 = 32'h01010101; +parameter mask_mpcore__ICDIPTR14 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR15 = 32'hF8F0183C; +parameter val_mpcore__ICDIPTR15 = 32'h01010101; +parameter mask_mpcore__ICDIPTR15 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR16 = 32'hF8F01840; +parameter val_mpcore__ICDIPTR16 = 32'h01010101; +parameter mask_mpcore__ICDIPTR16 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR17 = 32'hF8F01844; +parameter val_mpcore__ICDIPTR17 = 32'h01010101; +parameter mask_mpcore__ICDIPTR17 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR18 = 32'hF8F01848; +parameter val_mpcore__ICDIPTR18 = 32'h01010101; +parameter mask_mpcore__ICDIPTR18 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR19 = 32'hF8F0184C; +parameter val_mpcore__ICDIPTR19 = 32'h01010101; +parameter mask_mpcore__ICDIPTR19 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR20 = 32'hF8F01850; +parameter val_mpcore__ICDIPTR20 = 32'h01010101; +parameter mask_mpcore__ICDIPTR20 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR21 = 32'hF8F01854; +parameter val_mpcore__ICDIPTR21 = 32'h01010101; +parameter mask_mpcore__ICDIPTR21 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR22 = 32'hF8F01858; +parameter val_mpcore__ICDIPTR22 = 32'h01010101; +parameter mask_mpcore__ICDIPTR22 = 32'hFFFFFFFF; + +parameter mpcore__ICDIPTR23 = 32'hF8F0185C; +parameter val_mpcore__ICDIPTR23 = 32'h01010101; +parameter mask_mpcore__ICDIPTR23 = 32'hFFFFFFFF; + +parameter mpcore__ICDICFR0 = 32'hF8F01C00; +parameter val_mpcore__ICDICFR0 = 32'hAAAAAAAA; +parameter mask_mpcore__ICDICFR0 = 32'hFFFFFFFF; + +parameter mpcore__ICDICFR1 = 32'hF8F01C04; +parameter val_mpcore__ICDICFR1 = 32'h7DC00000; +parameter mask_mpcore__ICDICFR1 = 32'hFFFFFFFF; + +parameter mpcore__ICDICFR2 = 32'hF8F01C08; +parameter val_mpcore__ICDICFR2 = 32'h55555555; +parameter mask_mpcore__ICDICFR2 = 32'hFFFFFFFF; + +parameter mpcore__ICDICFR3 = 32'hF8F01C0C; +parameter val_mpcore__ICDICFR3 = 32'h55555555; +parameter mask_mpcore__ICDICFR3 = 32'hFFFFFFFF; + +parameter mpcore__ICDICFR4 = 32'hF8F01C10; +parameter val_mpcore__ICDICFR4 = 32'h55555555; +parameter mask_mpcore__ICDICFR4 = 32'hFFFFFFFF; + +parameter mpcore__ICDICFR5 = 32'hF8F01C14; +parameter val_mpcore__ICDICFR5 = 32'h55555555; +parameter mask_mpcore__ICDICFR5 = 32'hFFFFFFFF; + +parameter mpcore__ppi_status = 32'hF8F01D00; +parameter val_mpcore__ppi_status = 32'h00000000; +parameter mask_mpcore__ppi_status = 32'hFFFFFFFF; + +parameter mpcore__spi_status_0 = 32'hF8F01D04; +parameter val_mpcore__spi_status_0 = 32'h00000000; +parameter mask_mpcore__spi_status_0 = 32'hFFFFFFFF; + +parameter mpcore__spi_status_1 = 32'hF8F01D08; +parameter val_mpcore__spi_status_1 = 32'h00000000; +parameter mask_mpcore__spi_status_1 = 32'hFFFFFFFF; + +parameter mpcore__ICDSGIR = 32'hF8F01F00; +parameter val_mpcore__ICDSGIR = 32'h00000000; +parameter mask_mpcore__ICDSGIR = 32'hFFFFFFFF; + +parameter mpcore__ICPIDR4 = 32'hF8F01FD0; +parameter val_mpcore__ICPIDR4 = 32'h00000004; +parameter mask_mpcore__ICPIDR4 = 32'hFFFFFFFF; + +parameter mpcore__ICPIDR5 = 32'hF8F01FD4; +parameter val_mpcore__ICPIDR5 = 32'h00000000; +parameter mask_mpcore__ICPIDR5 = 32'hFFFFFFFF; + +parameter mpcore__ICPIDR6 = 32'hF8F01FD8; +parameter val_mpcore__ICPIDR6 = 32'h00000000; +parameter mask_mpcore__ICPIDR6 = 32'hFFFFFFFF; + +parameter mpcore__ICPIDR7 = 32'hF8F01FDC; +parameter val_mpcore__ICPIDR7 = 32'h00000000; +parameter mask_mpcore__ICPIDR7 = 32'hFFFFFFFF; + +parameter mpcore__ICPIDR0 = 32'hF8F01FE0; +parameter val_mpcore__ICPIDR0 = 32'h00000090; +parameter mask_mpcore__ICPIDR0 = 32'hFFFFFFFF; + +parameter mpcore__ICPIDR1 = 32'hF8F01FE4; +parameter val_mpcore__ICPIDR1 = 32'h000000B3; +parameter mask_mpcore__ICPIDR1 = 32'hFFFFFFFF; + +parameter mpcore__ICPIDR2 = 32'hF8F01FE8; +parameter val_mpcore__ICPIDR2 = 32'h0000001B; +parameter mask_mpcore__ICPIDR2 = 32'hFFFFFFFF; + +parameter mpcore__ICPIDR3 = 32'hF8F01FEC; +parameter val_mpcore__ICPIDR3 = 32'h00000000; +parameter mask_mpcore__ICPIDR3 = 32'hFFFFFFFF; + +parameter mpcore__ICCIDR0 = 32'hF8F01FF0; +parameter val_mpcore__ICCIDR0 = 32'h0000000D; +parameter mask_mpcore__ICCIDR0 = 32'hFFFFFFFF; + +parameter mpcore__ICCIDR1 = 32'hF8F01FF4; +parameter val_mpcore__ICCIDR1 = 32'h000000F0; +parameter mask_mpcore__ICCIDR1 = 32'hFFFFFFFF; + +parameter mpcore__ICCIDR2 = 32'hF8F01FF8; +parameter val_mpcore__ICCIDR2 = 32'h00000005; +parameter mask_mpcore__ICCIDR2 = 32'hFFFFFFFF; + +parameter mpcore__ICCIDR3 = 32'hF8F01FFC; +parameter val_mpcore__ICCIDR3 = 32'h000000B1; +parameter mask_mpcore__ICCIDR3 = 32'hFFFFFFFF; + + +// ************************************************************ +// Module ocm ocm +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter ocm__OCM_PARITY_CTRL = 32'hF800C000; +parameter val_ocm__OCM_PARITY_CTRL = 32'h00000000; +parameter mask_ocm__OCM_PARITY_CTRL = 32'hFFFFFFFF; + +parameter ocm__OCM_PARITY_ERRADDRESS = 32'hF800C004; +parameter val_ocm__OCM_PARITY_ERRADDRESS = 32'h00000000; +parameter mask_ocm__OCM_PARITY_ERRADDRESS = 32'hFFFFFFFF; + +parameter ocm__OCM_IRQ_STS = 32'hF800C008; +parameter val_ocm__OCM_IRQ_STS = 32'h00000000; +parameter mask_ocm__OCM_IRQ_STS = 32'hFFFFFFFF; + +parameter ocm__OCM_CONTROL = 32'hF800C00C; +parameter val_ocm__OCM_CONTROL = 32'h00000000; +parameter mask_ocm__OCM_CONTROL = 32'hFFFFFFFF; + + +// ************************************************************ +// Module qspi qspi +// doc version: 0.8, based on 11/01/10 Linear Quad-SPI Controller +// Design Specification document +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter qspi__Config_reg = 32'hE000D000; +parameter val_qspi__Config_reg = 32'h80000000; +parameter mask_qspi__Config_reg = 32'hFFFDFFFF; + +parameter qspi__Intr_status_REG = 32'hE000D004; +parameter val_qspi__Intr_status_REG = 32'h00000004; +parameter mask_qspi__Intr_status_REG = 32'hFFFFFFFF; + +parameter qspi__Intrpt_en_REG = 32'hE000D008; +parameter val_qspi__Intrpt_en_REG = 32'h00000000; +parameter mask_qspi__Intrpt_en_REG = 32'hFFFFFFFF; + +parameter qspi__Intrpt_dis_REG = 32'hE000D00C; +parameter val_qspi__Intrpt_dis_REG = 32'h00000000; +parameter mask_qspi__Intrpt_dis_REG = 32'hFFFFFFFF; + +parameter qspi__Intrpt_mask_REG = 32'hE000D010; +parameter val_qspi__Intrpt_mask_REG = 32'h00000000; +parameter mask_qspi__Intrpt_mask_REG = 32'hFFFFFFFF; + +parameter qspi__En_REG = 32'hE000D014; +parameter val_qspi__En_REG = 32'h00000000; +parameter mask_qspi__En_REG = 32'hFFFFFFFF; + +parameter qspi__Delay_REG = 32'hE000D018; +parameter val_qspi__Delay_REG = 32'h00000000; +parameter mask_qspi__Delay_REG = 32'hFFFFFFFF; + +parameter qspi__TXD0 = 32'hE000D01C; +parameter val_qspi__TXD0 = 32'h00000000; +parameter mask_qspi__TXD0 = 32'hFFFFFFFF; + +parameter qspi__Rx_data_REG = 32'hE000D020; +parameter val_qspi__Rx_data_REG = 32'h00000000; +parameter mask_qspi__Rx_data_REG = 32'hFFFFFFFF; + +parameter qspi__Slave_Idle_count_REG = 32'hE000D024; +parameter val_qspi__Slave_Idle_count_REG = 32'h000000FF; +parameter mask_qspi__Slave_Idle_count_REG = 32'hFFFFFFFF; + +parameter qspi__TX_thres_REG = 32'hE000D028; +parameter val_qspi__TX_thres_REG = 32'h00000001; +parameter mask_qspi__TX_thres_REG = 32'hFFFFFFFF; + +parameter qspi__RX_thres_REG = 32'hE000D02C; +parameter val_qspi__RX_thres_REG = 32'h00000001; +parameter mask_qspi__RX_thres_REG = 32'hFFFFFFFF; + +parameter qspi__GPIO = 32'hE000D030; +parameter val_qspi__GPIO = 32'h00000001; +parameter mask_qspi__GPIO = 32'hFFFFFFFF; + +parameter qspi__LPBK_DLY_ADJ = 32'hE000D038; +parameter val_qspi__LPBK_DLY_ADJ = 32'h00000033; +parameter mask_qspi__LPBK_DLY_ADJ = 32'hFFFFFFFF; + +parameter qspi__TXD1 = 32'hE000D080; +parameter val_qspi__TXD1 = 32'h00000000; +parameter mask_qspi__TXD1 = 32'hFFFFFFFF; + +parameter qspi__TXD2 = 32'hE000D084; +parameter val_qspi__TXD2 = 32'h00000000; +parameter mask_qspi__TXD2 = 32'hFFFFFFFF; + +parameter qspi__TXD3 = 32'hE000D088; +parameter val_qspi__TXD3 = 32'h00000000; +parameter mask_qspi__TXD3 = 32'hFFFFFFFF; + +parameter qspi__LQSPI_CFG = 32'hE000D0A0; +parameter val_qspi__LQSPI_CFG = 32'h03A002EB; +parameter mask_qspi__LQSPI_CFG = 32'hFBFF07FF; + +parameter qspi__LQSPI_STS = 32'hE000D0A4; +parameter val_qspi__LQSPI_STS = 32'h00000000; +parameter mask_qspi__LQSPI_STS = 32'h000001FF; + +parameter qspi__MOD_ID = 32'hE000D0FC; +parameter val_qspi__MOD_ID = 32'h01090101; +parameter mask_qspi__MOD_ID = 32'hFFFFFFFF; + + +// ************************************************************ +// Module sd0 sdio +// doc version: 4.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter sd0__SDMA_system_address_register = 32'hE0100000; +parameter val_sd0__SDMA_system_address_register = 32'h00000000; +parameter mask_sd0__SDMA_system_address_register = 32'hFFFFFFFF; + +parameter sd0__Block_Size_Block_Count = 32'hE0100004; +parameter val_sd0__Block_Size_Block_Count = 32'h00000000; +parameter mask_sd0__Block_Size_Block_Count = 32'hFFFFFFFF; + +parameter sd0__Argument = 32'hE0100008; +parameter val_sd0__Argument = 32'h00000000; +parameter mask_sd0__Argument = 32'hFFFFFFFF; + +parameter sd0__Transfer_Mode_Command = 32'hE010000C; +parameter val_sd0__Transfer_Mode_Command = 32'h00000000; +parameter mask_sd0__Transfer_Mode_Command = 32'h1FFFFFFF; + +parameter sd0__Response0 = 32'hE0100010; +parameter val_sd0__Response0 = 32'h00000000; +parameter mask_sd0__Response0 = 32'hFFFFFFFF; + +parameter sd0__Response1 = 32'hE0100014; +parameter val_sd0__Response1 = 32'h00000000; +parameter mask_sd0__Response1 = 32'hFFFFFFFF; + +parameter sd0__Response2 = 32'hE0100018; +parameter val_sd0__Response2 = 32'h00000000; +parameter mask_sd0__Response2 = 32'hFFFFFFFF; + +parameter sd0__Response3 = 32'hE010001C; +parameter val_sd0__Response3 = 32'h00000000; +parameter mask_sd0__Response3 = 32'hFFFFFFFF; + +parameter sd0__Buffer_Data_Port = 32'hE0100020; +parameter val_sd0__Buffer_Data_Port = 32'h00000000; +parameter mask_sd0__Buffer_Data_Port = 32'hFFFFFFFF; + +parameter sd0__Present_State = 32'hE0100024; +parameter val_sd0__Present_State = 32'h01F20000; +parameter mask_sd0__Present_State = 32'h01FFFFFF; + +parameter sd0__Host_control_Power_control_Block_Gap_Control_Wakeup_control = 32'hE0100028; +parameter val_sd0__Host_control_Power_control_Block_Gap_Control_Wakeup_control = 32'h00000000; +parameter mask_sd0__Host_control_Power_control_Block_Gap_Control_Wakeup_control = 32'hFFFFFFFF; + +parameter sd0__Clock_Control_Timeout_control_Software_reset = 32'hE010002C; +parameter val_sd0__Clock_Control_Timeout_control_Software_reset = 32'h00000000; +parameter mask_sd0__Clock_Control_Timeout_control_Software_reset = 32'h07FFFFFF; + +parameter sd0__Normal_interrupt_status_Error_interrupt_status = 32'hE0100030; +parameter val_sd0__Normal_interrupt_status_Error_interrupt_status = 32'h00000000; +parameter mask_sd0__Normal_interrupt_status_Error_interrupt_status = 32'h3FFFFFFF; + +parameter sd0__Normal_interrupt_status_enable_Error_interrupt_status_enable = 32'hE0100034; +parameter val_sd0__Normal_interrupt_status_enable_Error_interrupt_status_enable = 32'h00000000; +parameter mask_sd0__Normal_interrupt_status_enable_Error_interrupt_status_enable = 32'h3FFFFFFF; + +parameter sd0__Normal_interrupt_signal_enable_Error_interrupt_signal_enable = 32'hE0100038; +parameter val_sd0__Normal_interrupt_signal_enable_Error_interrupt_signal_enable = 32'h00000000; +parameter mask_sd0__Normal_interrupt_signal_enable_Error_interrupt_signal_enable = 32'h3FFFFFFF; + +parameter sd0__Auto_CMD12_error_status = 32'hE010003C; +parameter val_sd0__Auto_CMD12_error_status = 32'h00000000; +parameter mask_sd0__Auto_CMD12_error_status = 32'h000000FF; + +parameter sd0__Capabilities = 32'hE0100040; +parameter val_sd0__Capabilities = 32'h69EC0080; +parameter mask_sd0__Capabilities = 32'h7FFFFFFF; + +parameter sd0__Maximum_current_capabilities = 32'hE0100048; +parameter val_sd0__Maximum_current_capabilities = 32'h00000001; +parameter mask_sd0__Maximum_current_capabilities = 32'h00FFFFFF; + +parameter sd0__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status = 32'hE0100050; +parameter val_sd0__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status = 32'h00000000; +parameter mask_sd0__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status = 32'hFFFFFFFF; + +parameter sd0__ADMA_error_status = 32'hE0100054; +parameter val_sd0__ADMA_error_status = 32'h00000000; +parameter mask_sd0__ADMA_error_status = 32'h00000007; + +parameter sd0__ADMA_system_address = 32'hE0100058; +parameter val_sd0__ADMA_system_address = 32'h00000000; +parameter mask_sd0__ADMA_system_address = 32'hFFFFFFFF; + +parameter sd0__Boot_Timeout_control = 32'hE0100060; +parameter val_sd0__Boot_Timeout_control = 32'h00000000; +parameter mask_sd0__Boot_Timeout_control = 32'hFFFFFFFF; + +parameter sd0__Debug_Selection = 32'hE0100064; +parameter val_sd0__Debug_Selection = 32'h00000000; +parameter mask_sd0__Debug_Selection = 32'h00000001; + +parameter sd0__SPI_interrupt_support = 32'hE01000F0; +parameter val_sd0__SPI_interrupt_support = 32'h00000000; +parameter mask_sd0__SPI_interrupt_support = 32'h000000FF; + +parameter sd0__Slot_interrupt_status_Host_controller_version = 32'hE01000FC; +parameter val_sd0__Slot_interrupt_status_Host_controller_version = 32'h89010000; +parameter mask_sd0__Slot_interrupt_status_Host_controller_version = 32'hFFFFFFFF; + + +// ************************************************************ +// Module sd1 sdio +// doc version: 4.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter sd1__SDMA_system_address_register = 32'hE0101000; +parameter val_sd1__SDMA_system_address_register = 32'h00000000; +parameter mask_sd1__SDMA_system_address_register = 32'hFFFFFFFF; + +parameter sd1__Block_Size_Block_Count = 32'hE0101004; +parameter val_sd1__Block_Size_Block_Count = 32'h00000000; +parameter mask_sd1__Block_Size_Block_Count = 32'hFFFFFFFF; + +parameter sd1__Argument = 32'hE0101008; +parameter val_sd1__Argument = 32'h00000000; +parameter mask_sd1__Argument = 32'hFFFFFFFF; + +parameter sd1__Transfer_Mode_Command = 32'hE010100C; +parameter val_sd1__Transfer_Mode_Command = 32'h00000000; +parameter mask_sd1__Transfer_Mode_Command = 32'h1FFFFFFF; + +parameter sd1__Response0 = 32'hE0101010; +parameter val_sd1__Response0 = 32'h00000000; +parameter mask_sd1__Response0 = 32'hFFFFFFFF; + +parameter sd1__Response1 = 32'hE0101014; +parameter val_sd1__Response1 = 32'h00000000; +parameter mask_sd1__Response1 = 32'hFFFFFFFF; + +parameter sd1__Response2 = 32'hE0101018; +parameter val_sd1__Response2 = 32'h00000000; +parameter mask_sd1__Response2 = 32'hFFFFFFFF; + +parameter sd1__Response3 = 32'hE010101C; +parameter val_sd1__Response3 = 32'h00000000; +parameter mask_sd1__Response3 = 32'hFFFFFFFF; + +parameter sd1__Buffer_Data_Port = 32'hE0101020; +parameter val_sd1__Buffer_Data_Port = 32'h00000000; +parameter mask_sd1__Buffer_Data_Port = 32'hFFFFFFFF; + +parameter sd1__Present_State = 32'hE0101024; +parameter val_sd1__Present_State = 32'h01F20000; +parameter mask_sd1__Present_State = 32'h01FFFFFF; + +parameter sd1__Host_control_Power_control_Block_Gap_Control_Wakeup_control = 32'hE0101028; +parameter val_sd1__Host_control_Power_control_Block_Gap_Control_Wakeup_control = 32'h00000000; +parameter mask_sd1__Host_control_Power_control_Block_Gap_Control_Wakeup_control = 32'hFFFFFFFF; + +parameter sd1__Clock_Control_Timeout_control_Software_reset = 32'hE010102C; +parameter val_sd1__Clock_Control_Timeout_control_Software_reset = 32'h00000000; +parameter mask_sd1__Clock_Control_Timeout_control_Software_reset = 32'h07FFFFFF; + +parameter sd1__Normal_interrupt_status_Error_interrupt_status = 32'hE0101030; +parameter val_sd1__Normal_interrupt_status_Error_interrupt_status = 32'h00000000; +parameter mask_sd1__Normal_interrupt_status_Error_interrupt_status = 32'h3FFFFFFF; + +parameter sd1__Normal_interrupt_status_enable_Error_interrupt_status_enable = 32'hE0101034; +parameter val_sd1__Normal_interrupt_status_enable_Error_interrupt_status_enable = 32'h00000000; +parameter mask_sd1__Normal_interrupt_status_enable_Error_interrupt_status_enable = 32'h3FFFFFFF; + +parameter sd1__Normal_interrupt_signal_enable_Error_interrupt_signal_enable = 32'hE0101038; +parameter val_sd1__Normal_interrupt_signal_enable_Error_interrupt_signal_enable = 32'h00000000; +parameter mask_sd1__Normal_interrupt_signal_enable_Error_interrupt_signal_enable = 32'h3FFFFFFF; + +parameter sd1__Auto_CMD12_error_status = 32'hE010103C; +parameter val_sd1__Auto_CMD12_error_status = 32'h00000000; +parameter mask_sd1__Auto_CMD12_error_status = 32'h000000FF; + +parameter sd1__Capabilities = 32'hE0101040; +parameter val_sd1__Capabilities = 32'h69EC0080; +parameter mask_sd1__Capabilities = 32'h7FFFFFFF; + +parameter sd1__Maximum_current_capabilities = 32'hE0101048; +parameter val_sd1__Maximum_current_capabilities = 32'h00000001; +parameter mask_sd1__Maximum_current_capabilities = 32'h00FFFFFF; + +parameter sd1__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status = 32'hE0101050; +parameter val_sd1__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status = 32'h00000000; +parameter mask_sd1__Force_event_for_AutoCmd12_Error_Status_Force_event_register_for_error_interrupt_status = 32'hFFFFFFFF; + +parameter sd1__ADMA_error_status = 32'hE0101054; +parameter val_sd1__ADMA_error_status = 32'h00000000; +parameter mask_sd1__ADMA_error_status = 32'h00000007; + +parameter sd1__ADMA_system_address = 32'hE0101058; +parameter val_sd1__ADMA_system_address = 32'h00000000; +parameter mask_sd1__ADMA_system_address = 32'hFFFFFFFF; + +parameter sd1__Boot_Timeout_control = 32'hE0101060; +parameter val_sd1__Boot_Timeout_control = 32'h00000000; +parameter mask_sd1__Boot_Timeout_control = 32'hFFFFFFFF; + +parameter sd1__Debug_Selection = 32'hE0101064; +parameter val_sd1__Debug_Selection = 32'h00000000; +parameter mask_sd1__Debug_Selection = 32'h00000001; + +parameter sd1__SPI_interrupt_support = 32'hE01010F0; +parameter val_sd1__SPI_interrupt_support = 32'h00000000; +parameter mask_sd1__SPI_interrupt_support = 32'h000000FF; + +parameter sd1__Slot_interrupt_status_Host_controller_version = 32'hE01010FC; +parameter val_sd1__Slot_interrupt_status_Host_controller_version = 32'h89010000; +parameter mask_sd1__Slot_interrupt_status_Host_controller_version = 32'hFFFFFFFF; + + +// ************************************************************ +// Module slcr slcr +// doc version: 1.3, based on 11/18/2010 SLCR_spec.doc +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter slcr__SCL = 32'hF8000000; +parameter val_slcr__SCL = 32'h00000000; +parameter mask_slcr__SCL = 32'hFFFFFFFF; + +parameter slcr__SLCR_LOCK = 32'hF8000004; +parameter val_slcr__SLCR_LOCK = 32'h00000000; +parameter mask_slcr__SLCR_LOCK = 32'hFFFFFFFF; + +parameter slcr__SLCR_UNLOCK = 32'hF8000008; +parameter val_slcr__SLCR_UNLOCK = 32'h00000000; +parameter mask_slcr__SLCR_UNLOCK = 32'hFFFFFFFF; + +parameter slcr__SLCR_LOCKSTA = 32'hF800000C; +parameter val_slcr__SLCR_LOCKSTA = 32'h00000001; +parameter mask_slcr__SLCR_LOCKSTA = 32'hFFFFFFFF; + +parameter slcr__ARM_PLL_CTRL = 32'hF8000100; +parameter val_slcr__ARM_PLL_CTRL = 32'h0001A008; +parameter mask_slcr__ARM_PLL_CTRL = 32'hFFFFFFFF; + +parameter slcr__DDR_PLL_CTRL = 32'hF8000104; +parameter val_slcr__DDR_PLL_CTRL = 32'h0001A008; +parameter mask_slcr__DDR_PLL_CTRL = 32'hFFFFFFFF; + +parameter slcr__IO_PLL_CTRL = 32'hF8000108; +parameter val_slcr__IO_PLL_CTRL = 32'h0001A008; +parameter mask_slcr__IO_PLL_CTRL = 32'hFFFFFFFF; + +parameter slcr__PLL_STATUS = 32'hF800010C; +parameter val_slcr__PLL_STATUS = 32'h0000003F; +parameter mask_slcr__PLL_STATUS = 32'hFFFFFFFF; + +parameter slcr__ARM_PLL_CFG = 32'hF8000110; +parameter val_slcr__ARM_PLL_CFG = 32'h00177EA0; +parameter mask_slcr__ARM_PLL_CFG = 32'hFFFFFFFF; + +parameter slcr__DDR_PLL_CFG = 32'hF8000114; +parameter val_slcr__DDR_PLL_CFG = 32'h00177EA0; +parameter mask_slcr__DDR_PLL_CFG = 32'hFFFFFFFF; + +parameter slcr__IO_PLL_CFG = 32'hF8000118; +parameter val_slcr__IO_PLL_CFG = 32'h00177EA0; +parameter mask_slcr__IO_PLL_CFG = 32'hFFFFFFFF; + +parameter slcr__PLL_BG_CTRL = 32'hF800011C; +parameter val_slcr__PLL_BG_CTRL = 32'h00000000; +parameter mask_slcr__PLL_BG_CTRL = 32'hFFFFFFFF; + +parameter slcr__ARM_CLK_CTRL = 32'hF8000120; +parameter val_slcr__ARM_CLK_CTRL = 32'h1F000400; +parameter mask_slcr__ARM_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__DDR_CLK_CTRL = 32'hF8000124; +parameter val_slcr__DDR_CLK_CTRL = 32'h18400003; +parameter mask_slcr__DDR_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__DCI_CLK_CTRL = 32'hF8000128; +parameter val_slcr__DCI_CLK_CTRL = 32'h01E03201; +parameter mask_slcr__DCI_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__APER_CLK_CTRL = 32'hF800012C; +parameter val_slcr__APER_CLK_CTRL = 32'h01FFCCCD; +parameter mask_slcr__APER_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__USB0_CLK_CTRL = 32'hF8000130; +parameter val_slcr__USB0_CLK_CTRL = 32'h00101941; +parameter mask_slcr__USB0_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__USB1_CLK_CTRL = 32'hF8000134; +parameter val_slcr__USB1_CLK_CTRL = 32'h00101941; +parameter mask_slcr__USB1_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__GEM0_RCLK_CTRL = 32'hF8000138; +parameter val_slcr__GEM0_RCLK_CTRL = 32'h00000001; +parameter mask_slcr__GEM0_RCLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__GEM1_RCLK_CTRL = 32'hF800013C; +parameter val_slcr__GEM1_RCLK_CTRL = 32'h00000001; +parameter mask_slcr__GEM1_RCLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__GEM0_CLK_CTRL = 32'hF8000140; +parameter val_slcr__GEM0_CLK_CTRL = 32'h00003C01; +parameter mask_slcr__GEM0_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__GEM1_CLK_CTRL = 32'hF8000144; +parameter val_slcr__GEM1_CLK_CTRL = 32'h00003C01; +parameter mask_slcr__GEM1_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__SMC_CLK_CTRL = 32'hF8000148; +parameter val_slcr__SMC_CLK_CTRL = 32'h00003C21; +parameter mask_slcr__SMC_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__LQSPI_CLK_CTRL = 32'hF800014C; +parameter val_slcr__LQSPI_CLK_CTRL = 32'h00002821; +parameter mask_slcr__LQSPI_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__SDIO_CLK_CTRL = 32'hF8000150; +parameter val_slcr__SDIO_CLK_CTRL = 32'h00001E03; +parameter mask_slcr__SDIO_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__UART_CLK_CTRL = 32'hF8000154; +parameter val_slcr__UART_CLK_CTRL = 32'h00003F03; +parameter mask_slcr__UART_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__SPI_CLK_CTRL = 32'hF8000158; +parameter val_slcr__SPI_CLK_CTRL = 32'h00003F03; +parameter mask_slcr__SPI_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__CAN_CLK_CTRL = 32'hF800015C; +parameter val_slcr__CAN_CLK_CTRL = 32'h00501903; +parameter mask_slcr__CAN_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__CAN_MIOCLK_CTRL = 32'hF8000160; +parameter val_slcr__CAN_MIOCLK_CTRL = 32'h00000000; +parameter mask_slcr__CAN_MIOCLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__DBG_CLK_CTRL = 32'hF8000164; +parameter val_slcr__DBG_CLK_CTRL = 32'h00000F03; +parameter mask_slcr__DBG_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__PCAP_CLK_CTRL = 32'hF8000168; +parameter val_slcr__PCAP_CLK_CTRL = 32'h00000F01; +parameter mask_slcr__PCAP_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__TOPSW_CLK_CTRL = 32'hF800016C; +parameter val_slcr__TOPSW_CLK_CTRL = 32'h00000000; +parameter mask_slcr__TOPSW_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA0_CLK_CTRL = 32'hF8000170; +parameter val_slcr__FPGA0_CLK_CTRL = 32'h00101800; +parameter mask_slcr__FPGA0_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA0_THR_CTRL = 32'hF8000174; +parameter val_slcr__FPGA0_THR_CTRL = 32'h00000000; +parameter mask_slcr__FPGA0_THR_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA0_THR_CNT = 32'hF8000178; +parameter val_slcr__FPGA0_THR_CNT = 32'h00000000; +parameter mask_slcr__FPGA0_THR_CNT = 32'hFFFFFFFF; + +parameter slcr__FPGA0_THR_STA = 32'hF800017C; +parameter val_slcr__FPGA0_THR_STA = 32'h00010000; +parameter mask_slcr__FPGA0_THR_STA = 32'hFFFFFFFF; + +parameter slcr__FPGA1_CLK_CTRL = 32'hF8000180; +parameter val_slcr__FPGA1_CLK_CTRL = 32'h00101800; +parameter mask_slcr__FPGA1_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA1_THR_CTRL = 32'hF8000184; +parameter val_slcr__FPGA1_THR_CTRL = 32'h00000000; +parameter mask_slcr__FPGA1_THR_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA1_THR_CNT = 32'hF8000188; +parameter val_slcr__FPGA1_THR_CNT = 32'h00000000; +parameter mask_slcr__FPGA1_THR_CNT = 32'hFFFFFFFF; + +parameter slcr__FPGA1_THR_STA = 32'hF800018C; +parameter val_slcr__FPGA1_THR_STA = 32'h00010000; +parameter mask_slcr__FPGA1_THR_STA = 32'hFFFFFFFF; + +parameter slcr__FPGA2_CLK_CTRL = 32'hF8000190; +parameter val_slcr__FPGA2_CLK_CTRL = 32'h00101800; +parameter mask_slcr__FPGA2_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA2_THR_CTRL = 32'hF8000194; +parameter val_slcr__FPGA2_THR_CTRL = 32'h00000000; +parameter mask_slcr__FPGA2_THR_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA2_THR_CNT = 32'hF8000198; +parameter val_slcr__FPGA2_THR_CNT = 32'h00000000; +parameter mask_slcr__FPGA2_THR_CNT = 32'hFFFFFFFF; + +parameter slcr__FPGA2_THR_STA = 32'hF800019C; +parameter val_slcr__FPGA2_THR_STA = 32'h00010000; +parameter mask_slcr__FPGA2_THR_STA = 32'hFFFFFFFF; + +parameter slcr__FPGA3_CLK_CTRL = 32'hF80001A0; +parameter val_slcr__FPGA3_CLK_CTRL = 32'h00101800; +parameter mask_slcr__FPGA3_CLK_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA3_THR_CTRL = 32'hF80001A4; +parameter val_slcr__FPGA3_THR_CTRL = 32'h00000000; +parameter mask_slcr__FPGA3_THR_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA3_THR_CNT = 32'hF80001A8; +parameter val_slcr__FPGA3_THR_CNT = 32'h00000000; +parameter mask_slcr__FPGA3_THR_CNT = 32'hFFFFFFFF; + +parameter slcr__FPGA3_THR_STA = 32'hF80001AC; +parameter val_slcr__FPGA3_THR_STA = 32'h00010000; +parameter mask_slcr__FPGA3_THR_STA = 32'hFFFFFFFF; + +parameter slcr__SRST_UART_CTRL = 32'hF80001B0; +parameter val_slcr__SRST_UART_CTRL = 32'h00000000; +parameter mask_slcr__SRST_UART_CTRL = 32'hFFFFFFFF; + +parameter slcr__BANDGAP_TRIM = 32'hF80001B8; +parameter val_slcr__BANDGAP_TRIM = 32'h0000001F; +parameter mask_slcr__BANDGAP_TRIM = 32'hFFFFFFFF; + +parameter slcr__CC_TEST = 32'hF80001BC; +parameter val_slcr__CC_TEST = 32'h00000000; +parameter mask_slcr__CC_TEST = 32'hFFFFFFFF; + +parameter slcr__PLL_PREDIVISOR = 32'hF80001C0; +parameter val_slcr__PLL_PREDIVISOR = 32'h00000001; +parameter mask_slcr__PLL_PREDIVISOR = 32'hFFFFFFFF; + +parameter slcr__CLK_621_TRUE = 32'hF80001C4; +parameter val_slcr__CLK_621_TRUE = 32'h00000001; +parameter mask_slcr__CLK_621_TRUE = 32'hFFFFFFC1; + +parameter slcr__PICTURE_DBG = 32'hF80001D0; +parameter val_slcr__PICTURE_DBG = 32'h00000000; +parameter mask_slcr__PICTURE_DBG = 32'hFFFFFFFF; + +parameter slcr__PICTURE_DBG_UCNT = 32'hF80001D4; +parameter val_slcr__PICTURE_DBG_UCNT = 32'h00000000; +parameter mask_slcr__PICTURE_DBG_UCNT = 32'hFFFFFFFF; + +parameter slcr__PICTURE_DBG_LCNT = 32'hF80001D8; +parameter val_slcr__PICTURE_DBG_LCNT = 32'h00000000; +parameter mask_slcr__PICTURE_DBG_LCNT = 32'hFFFFFFFF; + +parameter slcr__PSS_RST_CTRL = 32'hF8000200; +parameter val_slcr__PSS_RST_CTRL = 32'h00000000; +parameter mask_slcr__PSS_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__DDR_RST_CTRL = 32'hF8000204; +parameter val_slcr__DDR_RST_CTRL = 32'h00000000; +parameter mask_slcr__DDR_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__TOPSW_RST_CTRL = 32'hF8000208; +parameter val_slcr__TOPSW_RST_CTRL = 32'h00000000; +parameter mask_slcr__TOPSW_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__DMAC_RST_CTRL = 32'hF800020C; +parameter val_slcr__DMAC_RST_CTRL = 32'h00000000; +parameter mask_slcr__DMAC_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__USB_RST_CTRL = 32'hF8000210; +parameter val_slcr__USB_RST_CTRL = 32'h00000000; +parameter mask_slcr__USB_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__GEM_RST_CTRL = 32'hF8000214; +parameter val_slcr__GEM_RST_CTRL = 32'h00000000; +parameter mask_slcr__GEM_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__SDIO_RST_CTRL = 32'hF8000218; +parameter val_slcr__SDIO_RST_CTRL = 32'h00000000; +parameter mask_slcr__SDIO_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__SPI_RST_CTRL = 32'hF800021C; +parameter val_slcr__SPI_RST_CTRL = 32'h00000000; +parameter mask_slcr__SPI_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__CAN_RST_CTRL = 32'hF8000220; +parameter val_slcr__CAN_RST_CTRL = 32'h00000000; +parameter mask_slcr__CAN_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__I2C_RST_CTRL = 32'hF8000224; +parameter val_slcr__I2C_RST_CTRL = 32'h00000000; +parameter mask_slcr__I2C_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__UART_RST_CTRL = 32'hF8000228; +parameter val_slcr__UART_RST_CTRL = 32'h00000000; +parameter mask_slcr__UART_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__GPIO_RST_CTRL = 32'hF800022C; +parameter val_slcr__GPIO_RST_CTRL = 32'h00000000; +parameter mask_slcr__GPIO_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__LQSPI_RST_CTRL = 32'hF8000230; +parameter val_slcr__LQSPI_RST_CTRL = 32'h00000000; +parameter mask_slcr__LQSPI_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__SMC_RST_CTRL = 32'hF8000234; +parameter val_slcr__SMC_RST_CTRL = 32'h00000000; +parameter mask_slcr__SMC_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__OCM_RST_CTRL = 32'hF8000238; +parameter val_slcr__OCM_RST_CTRL = 32'h00000000; +parameter mask_slcr__OCM_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__DEVCI_RST_CTRL = 32'hF800023C; +parameter val_slcr__DEVCI_RST_CTRL = 32'h00000000; +parameter mask_slcr__DEVCI_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__FPGA_RST_CTRL = 32'hF8000240; +parameter val_slcr__FPGA_RST_CTRL = 32'h01F33F0F; +parameter mask_slcr__FPGA_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__A9_CPU_RST_CTRL = 32'hF8000244; +parameter val_slcr__A9_CPU_RST_CTRL = 32'h00000000; +parameter mask_slcr__A9_CPU_RST_CTRL = 32'hFFFFFFFF; + +parameter slcr__RS_AWDT_CTRL = 32'hF800024C; +parameter val_slcr__RS_AWDT_CTRL = 32'h00000000; +parameter mask_slcr__RS_AWDT_CTRL = 32'hFFFFFFFF; + +parameter slcr__RST_REASON = 32'hF8000250; +parameter val_slcr__RST_REASON = 32'h00000040; +parameter mask_slcr__RST_REASON = 32'hFFFFFFFF; + +parameter slcr__RST_REASON_CLR = 32'hF8000254; +parameter val_slcr__RST_REASON_CLR = 32'h00000000; +parameter mask_slcr__RST_REASON_CLR = 32'hFFFFFFFF; + +parameter slcr__REBOOT_STATUS = 32'hF8000258; +parameter val_slcr__REBOOT_STATUS = 32'h00400000; +parameter mask_slcr__REBOOT_STATUS = 32'hFFFFFFFF; + +parameter slcr__BOOT_MODE = 32'hF800025C; +parameter val_slcr__BOOT_MODE = 32'h00000000; +parameter mask_slcr__BOOT_MODE = 32'hFFFFFFF0; + +parameter slcr__APU_CTRL = 32'hF8000300; +parameter val_slcr__APU_CTRL = 32'h00000000; +parameter mask_slcr__APU_CTRL = 32'hFFFFFFFF; + +parameter slcr__WDT_CLK_SEL = 32'hF8000304; +parameter val_slcr__WDT_CLK_SEL = 32'h00000000; +parameter mask_slcr__WDT_CLK_SEL = 32'hFFFFFFFF; + +parameter slcr__TZ_OCM_RAM0 = 32'hF8000400; +parameter val_slcr__TZ_OCM_RAM0 = 32'h00000000; +parameter mask_slcr__TZ_OCM_RAM0 = 32'hFFFFFFFF; + +parameter slcr__TZ_OCM_RAM1 = 32'hF8000404; +parameter val_slcr__TZ_OCM_RAM1 = 32'h00000000; +parameter mask_slcr__TZ_OCM_RAM1 = 32'hFFFFFFFF; + +parameter slcr__TZ_OCM_ROM = 32'hF8000408; +parameter val_slcr__TZ_OCM_ROM = 32'h00000000; +parameter mask_slcr__TZ_OCM_ROM = 32'hFFFFFFFF; + +parameter slcr__TZ_DDR_RAM = 32'hF8000430; +parameter val_slcr__TZ_DDR_RAM = 32'h00000000; +parameter mask_slcr__TZ_DDR_RAM = 32'h00000001; + +parameter slcr__TZ_DMA_NS = 32'hF8000440; +parameter val_slcr__TZ_DMA_NS = 32'h00000000; +parameter mask_slcr__TZ_DMA_NS = 32'hFFFFFFFF; + +parameter slcr__TZ_DMA_IRQ_NS = 32'hF8000444; +parameter val_slcr__TZ_DMA_IRQ_NS = 32'h00000000; +parameter mask_slcr__TZ_DMA_IRQ_NS = 32'hFFFFFFFF; + +parameter slcr__TZ_DMA_PERIPH_NS = 32'hF8000448; +parameter val_slcr__TZ_DMA_PERIPH_NS = 32'h00000000; +parameter mask_slcr__TZ_DMA_PERIPH_NS = 32'hFFFFFFFF; + +parameter slcr__TZ_GEM = 32'hF8000450; +parameter val_slcr__TZ_GEM = 32'h00000000; +parameter mask_slcr__TZ_GEM = 32'hFFFFFFFF; + +parameter slcr__TZ_SDIO = 32'hF8000454; +parameter val_slcr__TZ_SDIO = 32'h00000000; +parameter mask_slcr__TZ_SDIO = 32'hFFFFFFFF; + +parameter slcr__TZ_USB = 32'hF8000458; +parameter val_slcr__TZ_USB = 32'h00000000; +parameter mask_slcr__TZ_USB = 32'hFFFFFFFF; + +parameter slcr__TZ_FPGA_M = 32'hF8000484; +parameter val_slcr__TZ_FPGA_M = 32'h00000000; +parameter mask_slcr__TZ_FPGA_M = 32'hFFFFFFFF; + +parameter slcr__TZ_FPGA_AFI = 32'hF8000488; +parameter val_slcr__TZ_FPGA_AFI = 32'h00000000; +parameter mask_slcr__TZ_FPGA_AFI = 32'hFFFFFFFF; + +parameter slcr__DBG_CTRL = 32'hF8000500; +parameter val_slcr__DBG_CTRL = 32'h00000000; +parameter mask_slcr__DBG_CTRL = 32'hFFFFFFFF; + +parameter slcr__PSS_IDCODE = 32'hF8000530; +parameter val_slcr__PSS_IDCODE = 32'h03720093; +parameter mask_slcr__PSS_IDCODE = 32'h0FFE0FFF; + +parameter slcr__DDR_URGENT = 32'hF8000600; +parameter val_slcr__DDR_URGENT = 32'h00000000; +parameter mask_slcr__DDR_URGENT = 32'hFFFFFFFF; + +parameter slcr__DDR_CAL_START = 32'hF800060C; +parameter val_slcr__DDR_CAL_START = 32'h00000000; +parameter mask_slcr__DDR_CAL_START = 32'hFFFFFFFF; + +parameter slcr__DDR_REF_START = 32'hF8000614; +parameter val_slcr__DDR_REF_START = 32'h00000000; +parameter mask_slcr__DDR_REF_START = 32'hFFFFFFFF; + +parameter slcr__DDR_CMD_STA = 32'hF8000618; +parameter val_slcr__DDR_CMD_STA = 32'h00000000; +parameter mask_slcr__DDR_CMD_STA = 32'hFFFFFFFF; + +parameter slcr__DDR_URGENT_SEL = 32'hF800061C; +parameter val_slcr__DDR_URGENT_SEL = 32'h00000000; +parameter mask_slcr__DDR_URGENT_SEL = 32'hFFFFFFFF; + +parameter slcr__DDR_DFI_STATUS = 32'hF8000620; +parameter val_slcr__DDR_DFI_STATUS = 32'h00000000; +parameter mask_slcr__DDR_DFI_STATUS = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_00 = 32'hF8000700; +parameter val_slcr__MIO_PIN_00 = 32'h00001601; +parameter mask_slcr__MIO_PIN_00 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_01 = 32'hF8000704; +parameter val_slcr__MIO_PIN_01 = 32'h00001601; +parameter mask_slcr__MIO_PIN_01 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_02 = 32'hF8000708; +parameter val_slcr__MIO_PIN_02 = 32'h00000601; +parameter mask_slcr__MIO_PIN_02 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_03 = 32'hF800070C; +parameter val_slcr__MIO_PIN_03 = 32'h00000601; +parameter mask_slcr__MIO_PIN_03 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_04 = 32'hF8000710; +parameter val_slcr__MIO_PIN_04 = 32'h00000601; +parameter mask_slcr__MIO_PIN_04 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_05 = 32'hF8000714; +parameter val_slcr__MIO_PIN_05 = 32'h00000601; +parameter mask_slcr__MIO_PIN_05 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_06 = 32'hF8000718; +parameter val_slcr__MIO_PIN_06 = 32'h00000601; +parameter mask_slcr__MIO_PIN_06 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_07 = 32'hF800071C; +parameter val_slcr__MIO_PIN_07 = 32'h00000601; +parameter mask_slcr__MIO_PIN_07 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_08 = 32'hF8000720; +parameter val_slcr__MIO_PIN_08 = 32'h00000601; +parameter mask_slcr__MIO_PIN_08 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_09 = 32'hF8000724; +parameter val_slcr__MIO_PIN_09 = 32'h00001601; +parameter mask_slcr__MIO_PIN_09 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_10 = 32'hF8000728; +parameter val_slcr__MIO_PIN_10 = 32'h00001601; +parameter mask_slcr__MIO_PIN_10 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_11 = 32'hF800072C; +parameter val_slcr__MIO_PIN_11 = 32'h00001601; +parameter mask_slcr__MIO_PIN_11 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_12 = 32'hF8000730; +parameter val_slcr__MIO_PIN_12 = 32'h00001601; +parameter mask_slcr__MIO_PIN_12 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_13 = 32'hF8000734; +parameter val_slcr__MIO_PIN_13 = 32'h00001601; +parameter mask_slcr__MIO_PIN_13 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_14 = 32'hF8000738; +parameter val_slcr__MIO_PIN_14 = 32'h00001601; +parameter mask_slcr__MIO_PIN_14 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_15 = 32'hF800073C; +parameter val_slcr__MIO_PIN_15 = 32'h00001601; +parameter mask_slcr__MIO_PIN_15 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_16 = 32'hF8000740; +parameter val_slcr__MIO_PIN_16 = 32'h00001601; +parameter mask_slcr__MIO_PIN_16 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_17 = 32'hF8000744; +parameter val_slcr__MIO_PIN_17 = 32'h00001601; +parameter mask_slcr__MIO_PIN_17 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_18 = 32'hF8000748; +parameter val_slcr__MIO_PIN_18 = 32'h00001601; +parameter mask_slcr__MIO_PIN_18 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_19 = 32'hF800074C; +parameter val_slcr__MIO_PIN_19 = 32'h00001601; +parameter mask_slcr__MIO_PIN_19 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_20 = 32'hF8000750; +parameter val_slcr__MIO_PIN_20 = 32'h00001601; +parameter mask_slcr__MIO_PIN_20 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_21 = 32'hF8000754; +parameter val_slcr__MIO_PIN_21 = 32'h00001601; +parameter mask_slcr__MIO_PIN_21 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_22 = 32'hF8000758; +parameter val_slcr__MIO_PIN_22 = 32'h00001601; +parameter mask_slcr__MIO_PIN_22 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_23 = 32'hF800075C; +parameter val_slcr__MIO_PIN_23 = 32'h00001601; +parameter mask_slcr__MIO_PIN_23 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_24 = 32'hF8000760; +parameter val_slcr__MIO_PIN_24 = 32'h00001601; +parameter mask_slcr__MIO_PIN_24 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_25 = 32'hF8000764; +parameter val_slcr__MIO_PIN_25 = 32'h00001601; +parameter mask_slcr__MIO_PIN_25 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_26 = 32'hF8000768; +parameter val_slcr__MIO_PIN_26 = 32'h00001601; +parameter mask_slcr__MIO_PIN_26 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_27 = 32'hF800076C; +parameter val_slcr__MIO_PIN_27 = 32'h00001601; +parameter mask_slcr__MIO_PIN_27 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_28 = 32'hF8000770; +parameter val_slcr__MIO_PIN_28 = 32'h00001601; +parameter mask_slcr__MIO_PIN_28 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_29 = 32'hF8000774; +parameter val_slcr__MIO_PIN_29 = 32'h00001601; +parameter mask_slcr__MIO_PIN_29 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_30 = 32'hF8000778; +parameter val_slcr__MIO_PIN_30 = 32'h00001601; +parameter mask_slcr__MIO_PIN_30 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_31 = 32'hF800077C; +parameter val_slcr__MIO_PIN_31 = 32'h00001601; +parameter mask_slcr__MIO_PIN_31 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_32 = 32'hF8000780; +parameter val_slcr__MIO_PIN_32 = 32'h00001601; +parameter mask_slcr__MIO_PIN_32 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_33 = 32'hF8000784; +parameter val_slcr__MIO_PIN_33 = 32'h00001601; +parameter mask_slcr__MIO_PIN_33 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_34 = 32'hF8000788; +parameter val_slcr__MIO_PIN_34 = 32'h00001601; +parameter mask_slcr__MIO_PIN_34 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_35 = 32'hF800078C; +parameter val_slcr__MIO_PIN_35 = 32'h00001601; +parameter mask_slcr__MIO_PIN_35 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_36 = 32'hF8000790; +parameter val_slcr__MIO_PIN_36 = 32'h00001601; +parameter mask_slcr__MIO_PIN_36 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_37 = 32'hF8000794; +parameter val_slcr__MIO_PIN_37 = 32'h00001601; +parameter mask_slcr__MIO_PIN_37 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_38 = 32'hF8000798; +parameter val_slcr__MIO_PIN_38 = 32'h00001601; +parameter mask_slcr__MIO_PIN_38 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_39 = 32'hF800079C; +parameter val_slcr__MIO_PIN_39 = 32'h00001601; +parameter mask_slcr__MIO_PIN_39 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_40 = 32'hF80007A0; +parameter val_slcr__MIO_PIN_40 = 32'h00001601; +parameter mask_slcr__MIO_PIN_40 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_41 = 32'hF80007A4; +parameter val_slcr__MIO_PIN_41 = 32'h00001601; +parameter mask_slcr__MIO_PIN_41 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_42 = 32'hF80007A8; +parameter val_slcr__MIO_PIN_42 = 32'h00001601; +parameter mask_slcr__MIO_PIN_42 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_43 = 32'hF80007AC; +parameter val_slcr__MIO_PIN_43 = 32'h00001601; +parameter mask_slcr__MIO_PIN_43 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_44 = 32'hF80007B0; +parameter val_slcr__MIO_PIN_44 = 32'h00001601; +parameter mask_slcr__MIO_PIN_44 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_45 = 32'hF80007B4; +parameter val_slcr__MIO_PIN_45 = 32'h00001601; +parameter mask_slcr__MIO_PIN_45 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_46 = 32'hF80007B8; +parameter val_slcr__MIO_PIN_46 = 32'h00001601; +parameter mask_slcr__MIO_PIN_46 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_47 = 32'hF80007BC; +parameter val_slcr__MIO_PIN_47 = 32'h00001601; +parameter mask_slcr__MIO_PIN_47 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_48 = 32'hF80007C0; +parameter val_slcr__MIO_PIN_48 = 32'h00001601; +parameter mask_slcr__MIO_PIN_48 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_49 = 32'hF80007C4; +parameter val_slcr__MIO_PIN_49 = 32'h00001601; +parameter mask_slcr__MIO_PIN_49 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_50 = 32'hF80007C8; +parameter val_slcr__MIO_PIN_50 = 32'h00001601; +parameter mask_slcr__MIO_PIN_50 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_51 = 32'hF80007CC; +parameter val_slcr__MIO_PIN_51 = 32'h00001601; +parameter mask_slcr__MIO_PIN_51 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_52 = 32'hF80007D0; +parameter val_slcr__MIO_PIN_52 = 32'h00001601; +parameter mask_slcr__MIO_PIN_52 = 32'hFFFFFFFF; + +parameter slcr__MIO_PIN_53 = 32'hF80007D4; +parameter val_slcr__MIO_PIN_53 = 32'h00001601; +parameter mask_slcr__MIO_PIN_53 = 32'hFFFFFFFF; + +parameter slcr__MIO_FMIO_GEM_SEL = 32'hF8000800; +parameter val_slcr__MIO_FMIO_GEM_SEL = 32'h00000000; +parameter mask_slcr__MIO_FMIO_GEM_SEL = 32'hFFFFFFFF; + +parameter slcr__MIO_LOOPBACK = 32'hF8000804; +parameter val_slcr__MIO_LOOPBACK = 32'h00000000; +parameter mask_slcr__MIO_LOOPBACK = 32'hFFFFFFFF; + +parameter slcr__MIO_MST_TRI0 = 32'hF800080C; +parameter val_slcr__MIO_MST_TRI0 = 32'hFFFFFFFF; +parameter mask_slcr__MIO_MST_TRI0 = 32'hFFFFFFFF; + +parameter slcr__MIO_MST_TRI1 = 32'hF8000810; +parameter val_slcr__MIO_MST_TRI1 = 32'h003FFFFF; +parameter mask_slcr__MIO_MST_TRI1 = 32'hFFFFFFFF; + +parameter slcr__SD0_WP_CD_SEL = 32'hF8000830; +parameter val_slcr__SD0_WP_CD_SEL = 32'h00000000; +parameter mask_slcr__SD0_WP_CD_SEL = 32'hFFFFFFFF; + +parameter slcr__SD1_WP_CD_SEL = 32'hF8000834; +parameter val_slcr__SD1_WP_CD_SEL = 32'h00000000; +parameter mask_slcr__SD1_WP_CD_SEL = 32'hFFFFFFFF; + +parameter slcr__LVL_SHFTR_EN = 32'hF8000900; +parameter val_slcr__LVL_SHFTR_EN = 32'h00000000; +parameter mask_slcr__LVL_SHFTR_EN = 32'hFFFFFFFF; + +parameter slcr__OCM_CFG = 32'hF8000910; +parameter val_slcr__OCM_CFG = 32'h00000000; +parameter mask_slcr__OCM_CFG = 32'hFFFFFFFF; + +parameter slcr__CPU0_RAM0 = 32'hF8000A00; +parameter val_slcr__CPU0_RAM0 = 32'h00020202; +parameter mask_slcr__CPU0_RAM0 = 32'h00FFFFFF; + +parameter slcr__CPU0_RAM1 = 32'hF8000A04; +parameter val_slcr__CPU0_RAM1 = 32'h00020202; +parameter mask_slcr__CPU0_RAM1 = 32'h00FFFFFF; + +parameter slcr__CPU0_RAM2 = 32'hF8000A08; +parameter val_slcr__CPU0_RAM2 = 32'h02020202; +parameter mask_slcr__CPU0_RAM2 = 32'hFFFFFFFF; + +parameter slcr__CPU1_RAM0 = 32'hF8000A0C; +parameter val_slcr__CPU1_RAM0 = 32'h00020202; +parameter mask_slcr__CPU1_RAM0 = 32'h00FFFFFF; + +parameter slcr__CPU1_RAM1 = 32'hF8000A10; +parameter val_slcr__CPU1_RAM1 = 32'h00020202; +parameter mask_slcr__CPU1_RAM1 = 32'h00FFFFFF; + +parameter slcr__CPU1_RAM2 = 32'hF8000A14; +parameter val_slcr__CPU1_RAM2 = 32'h02020202; +parameter mask_slcr__CPU1_RAM2 = 32'hFFFFFFFF; + +parameter slcr__SCU_RAM = 32'hF8000A18; +parameter val_slcr__SCU_RAM = 32'h00000002; +parameter mask_slcr__SCU_RAM = 32'h000000FF; + +parameter slcr__L2C_RAM = 32'hF8000A1C; +parameter val_slcr__L2C_RAM = 32'h00020202; +parameter mask_slcr__L2C_RAM = 32'h00FFFFFF; + +parameter slcr__IOU_RAM_GEM01 = 32'hF8000A30; +parameter val_slcr__IOU_RAM_GEM01 = 32'h09090909; +parameter mask_slcr__IOU_RAM_GEM01 = 32'hFFFFFFFF; + +parameter slcr__IOU_RAM_USB01 = 32'hF8000A34; +parameter val_slcr__IOU_RAM_USB01 = 32'h09090909; +parameter mask_slcr__IOU_RAM_USB01 = 32'hFFFFFFFF; + +parameter slcr__IOU_RAM_SDIO0 = 32'hF8000A38; +parameter val_slcr__IOU_RAM_SDIO0 = 32'h09090909; +parameter mask_slcr__IOU_RAM_SDIO0 = 32'hFFFFFFFF; + +parameter slcr__IOU_RAM_SDIO1 = 32'hF8000A3C; +parameter val_slcr__IOU_RAM_SDIO1 = 32'h09090909; +parameter mask_slcr__IOU_RAM_SDIO1 = 32'hFFFFFFFF; + +parameter slcr__IOU_RAM_CAN0 = 32'hF8000A40; +parameter val_slcr__IOU_RAM_CAN0 = 32'h00090909; +parameter mask_slcr__IOU_RAM_CAN0 = 32'h00FFFFFF; + +parameter slcr__IOU_RAM_CAN1 = 32'hF8000A44; +parameter val_slcr__IOU_RAM_CAN1 = 32'h00090909; +parameter mask_slcr__IOU_RAM_CAN1 = 32'h00FFFFFF; + +parameter slcr__IOU_RAM_LQSPI = 32'hF8000A48; +parameter val_slcr__IOU_RAM_LQSPI = 32'h00000909; +parameter mask_slcr__IOU_RAM_LQSPI = 32'h0000FFFF; + +parameter slcr__DMAC_RAM = 32'hF8000A50; +parameter val_slcr__DMAC_RAM = 32'h00000009; +parameter mask_slcr__DMAC_RAM = 32'h000000FF; + +parameter slcr__AFI0_RAM0 = 32'hF8000A60; +parameter val_slcr__AFI0_RAM0 = 32'h09090909; +parameter mask_slcr__AFI0_RAM0 = 32'hFFFFFFFF; + +parameter slcr__AFI0_RAM1 = 32'hF8000A64; +parameter val_slcr__AFI0_RAM1 = 32'h09090909; +parameter mask_slcr__AFI0_RAM1 = 32'hFFFFFFFF; + +parameter slcr__AFI0_RAM2 = 32'hF8000A68; +parameter val_slcr__AFI0_RAM2 = 32'h00000909; +parameter mask_slcr__AFI0_RAM2 = 32'h0000FFFF; + +parameter slcr__AFI1_RAM0 = 32'hF8000A6C; +parameter val_slcr__AFI1_RAM0 = 32'h09090909; +parameter mask_slcr__AFI1_RAM0 = 32'hFFFFFFFF; + +parameter slcr__AFI1_RAM1 = 32'hF8000A70; +parameter val_slcr__AFI1_RAM1 = 32'h09090909; +parameter mask_slcr__AFI1_RAM1 = 32'hFFFFFFFF; + +parameter slcr__AFI1_RAM2 = 32'hF8000A74; +parameter val_slcr__AFI1_RAM2 = 32'h00000909; +parameter mask_slcr__AFI1_RAM2 = 32'h0000FFFF; + +parameter slcr__AFI2_RAM0 = 32'hF8000A78; +parameter val_slcr__AFI2_RAM0 = 32'h09090909; +parameter mask_slcr__AFI2_RAM0 = 32'hFFFFFFFF; + +parameter slcr__AFI2_RAM1 = 32'hF8000A7C; +parameter val_slcr__AFI2_RAM1 = 32'h09090909; +parameter mask_slcr__AFI2_RAM1 = 32'hFFFFFFFF; + +parameter slcr__AFI2_RAM2 = 32'hF8000A80; +parameter val_slcr__AFI2_RAM2 = 32'h00000909; +parameter mask_slcr__AFI2_RAM2 = 32'h0000FFFF; + +parameter slcr__AFI3_RAM0 = 32'hF8000A84; +parameter val_slcr__AFI3_RAM0 = 32'h09090909; +parameter mask_slcr__AFI3_RAM0 = 32'hFFFFFFFF; + +parameter slcr__AFI3_RAM1 = 32'hF8000A88; +parameter val_slcr__AFI3_RAM1 = 32'h09090909; +parameter mask_slcr__AFI3_RAM1 = 32'hFFFFFFFF; + +parameter slcr__AFI3_RAM2 = 32'hF8000A8C; +parameter val_slcr__AFI3_RAM2 = 32'h00000909; +parameter mask_slcr__AFI3_RAM2 = 32'h0000FFFF; + +parameter slcr__OCM_RAM = 32'hF8000A90; +parameter val_slcr__OCM_RAM = 32'h01010101; +parameter mask_slcr__OCM_RAM = 32'hFFFFFFFF; + +parameter slcr__OCM_ROM0 = 32'hF8000A94; +parameter val_slcr__OCM_ROM0 = 32'h09090909; +parameter mask_slcr__OCM_ROM0 = 32'hFFFFFFFF; + +parameter slcr__OCM_ROM1 = 32'hF8000A98; +parameter val_slcr__OCM_ROM1 = 32'h09090909; +parameter mask_slcr__OCM_ROM1 = 32'hFFFFFFFF; + +parameter slcr__DEVCI_RAM = 32'hF8000AA0; +parameter val_slcr__DEVCI_RAM = 32'h00000909; +parameter mask_slcr__DEVCI_RAM = 32'h0000FFFF; + +parameter slcr__CSG_RAM = 32'hF8000AB0; +parameter val_slcr__CSG_RAM = 32'h00000001; +parameter mask_slcr__CSG_RAM = 32'h000000FF; + +parameter slcr__GPIOB_CTRL = 32'hF8000B00; +parameter val_slcr__GPIOB_CTRL = 32'h00000000; +parameter mask_slcr__GPIOB_CTRL = 32'hFFFFFFFF; + +parameter slcr__GPIOB_CFG_CMOS18 = 32'hF8000B04; +parameter val_slcr__GPIOB_CFG_CMOS18 = 32'h00000000; +parameter mask_slcr__GPIOB_CFG_CMOS18 = 32'hFFFFFFFF; + +parameter slcr__GPIOB_CFG_CMOS25 = 32'hF8000B08; +parameter val_slcr__GPIOB_CFG_CMOS25 = 32'h00000000; +parameter mask_slcr__GPIOB_CFG_CMOS25 = 32'hFFFFFFFF; + +parameter slcr__GPIOB_CFG_CMOS33 = 32'hF8000B0C; +parameter val_slcr__GPIOB_CFG_CMOS33 = 32'h00000000; +parameter mask_slcr__GPIOB_CFG_CMOS33 = 32'hFFFFFFFF; + +parameter slcr__GPIOB_CFG_LVTTL = 32'hF8000B10; +parameter val_slcr__GPIOB_CFG_LVTTL = 32'h00000000; +parameter mask_slcr__GPIOB_CFG_LVTTL = 32'hFFFFFFFF; + +parameter slcr__GPIOB_CFG_HSTL = 32'hF8000B14; +parameter val_slcr__GPIOB_CFG_HSTL = 32'h00000000; +parameter mask_slcr__GPIOB_CFG_HSTL = 32'hFFFFFFFF; + +parameter slcr__GPIOB_DRVR_BIAS_CTRL = 32'hF8000B18; +parameter val_slcr__GPIOB_DRVR_BIAS_CTRL = 32'h00000000; +parameter mask_slcr__GPIOB_DRVR_BIAS_CTRL = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_ADDR0 = 32'hF8000B40; +parameter val_slcr__DDRIOB_ADDR0 = 32'h00000800; +parameter mask_slcr__DDRIOB_ADDR0 = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_ADDR1 = 32'hF8000B44; +parameter val_slcr__DDRIOB_ADDR1 = 32'h00000800; +parameter mask_slcr__DDRIOB_ADDR1 = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DATA0 = 32'hF8000B48; +parameter val_slcr__DDRIOB_DATA0 = 32'h00000800; +parameter mask_slcr__DDRIOB_DATA0 = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DATA1 = 32'hF8000B4C; +parameter val_slcr__DDRIOB_DATA1 = 32'h00000800; +parameter mask_slcr__DDRIOB_DATA1 = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DIFF0 = 32'hF8000B50; +parameter val_slcr__DDRIOB_DIFF0 = 32'h00000800; +parameter mask_slcr__DDRIOB_DIFF0 = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DIFF1 = 32'hF8000B54; +parameter val_slcr__DDRIOB_DIFF1 = 32'h00000800; +parameter mask_slcr__DDRIOB_DIFF1 = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_CLOCK = 32'hF8000B58; +parameter val_slcr__DDRIOB_CLOCK = 32'h00000800; +parameter mask_slcr__DDRIOB_CLOCK = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DRIVE_SLEW_ADDR = 32'hF8000B5C; +parameter val_slcr__DDRIOB_DRIVE_SLEW_ADDR = 32'h00000000; +parameter mask_slcr__DDRIOB_DRIVE_SLEW_ADDR = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DRIVE_SLEW_DATA = 32'hF8000B60; +parameter val_slcr__DDRIOB_DRIVE_SLEW_DATA = 32'h00000000; +parameter mask_slcr__DDRIOB_DRIVE_SLEW_DATA = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DRIVE_SLEW_DIFF = 32'hF8000B64; +parameter val_slcr__DDRIOB_DRIVE_SLEW_DIFF = 32'h00000000; +parameter mask_slcr__DDRIOB_DRIVE_SLEW_DIFF = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DRIVE_SLEW_CLOCK = 32'hF8000B68; +parameter val_slcr__DDRIOB_DRIVE_SLEW_CLOCK = 32'h00000000; +parameter mask_slcr__DDRIOB_DRIVE_SLEW_CLOCK = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DDR_CTRL = 32'hF8000B6C; +parameter val_slcr__DDRIOB_DDR_CTRL = 32'h00000000; +parameter mask_slcr__DDRIOB_DDR_CTRL = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DCI_CTRL = 32'hF8000B70; +parameter val_slcr__DDRIOB_DCI_CTRL = 32'h00000020; +parameter mask_slcr__DDRIOB_DCI_CTRL = 32'hFFFFFFFF; + +parameter slcr__DDRIOB_DCI_STATUS = 32'hF8000B74; +parameter val_slcr__DDRIOB_DCI_STATUS = 32'h00000000; +parameter mask_slcr__DDRIOB_DCI_STATUS = 32'hFFFFFFFF; + + +// ************************************************************ +// Module smcc pl353 +// doc version: 1.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter smcc__memc_status = 32'hE000E000; +parameter val_smcc__memc_status = 32'h00000000; +parameter mask_smcc__memc_status = 32'h00001FFF; + +parameter smcc__memif_cfg = 32'hE000E004; +parameter val_smcc__memif_cfg = 32'h00011205; +parameter mask_smcc__memif_cfg = 32'h0003FFFF; + +parameter smcc__memc_cfg_set = 32'hE000E008; +parameter val_smcc__memc_cfg_set = 32'h00000000; +parameter mask_smcc__memc_cfg_set = 32'h00000000; + +parameter smcc__memc_cfg_clr = 32'hE000E00C; +parameter val_smcc__memc_cfg_clr = 32'h00000000; +parameter mask_smcc__memc_cfg_clr = 32'h00000000; + +parameter smcc__direct_cmd = 32'hE000E010; +parameter val_smcc__direct_cmd = 32'h00000000; +parameter mask_smcc__direct_cmd = 32'h00000000; + +parameter smcc__set_cycles = 32'hE000E014; +parameter val_smcc__set_cycles = 32'h00000000; +parameter mask_smcc__set_cycles = 32'h00000000; + +parameter smcc__set_opmode = 32'hE000E018; +parameter val_smcc__set_opmode = 32'h00000000; +parameter mask_smcc__set_opmode = 32'h00000000; + +parameter smcc__refresh_period_0 = 32'hE000E020; +parameter val_smcc__refresh_period_0 = 32'h00000000; +parameter mask_smcc__refresh_period_0 = 32'h0000000F; + +parameter smcc__refresh_period_1 = 32'hE000E024; +parameter val_smcc__refresh_period_1 = 32'h00000000; +parameter mask_smcc__refresh_period_1 = 32'h0000000F; + +parameter smcc__sram_cycles0_0 = 32'hE000E100; +parameter val_smcc__sram_cycles0_0 = 32'h0002B3CC; +parameter mask_smcc__sram_cycles0_0 = 32'h001FFFFF; + +parameter smcc__opmode0_0 = 32'hE000E104; +parameter val_smcc__opmode0_0 = 32'hE2FE0800; +parameter mask_smcc__opmode0_0 = 32'hFFFFFFFF; + +parameter smcc__sram_cycles0_1 = 32'hE000E120; +parameter val_smcc__sram_cycles0_1 = 32'h0002B3CC; +parameter mask_smcc__sram_cycles0_1 = 32'h001FFFFF; + +parameter smcc__opmode0_1 = 32'hE000E124; +parameter val_smcc__opmode0_1 = 32'hE4FE0800; +parameter mask_smcc__opmode0_1 = 32'hFFFFFFFF; + +parameter smcc__nand_cycles1_0 = 32'hE000E180; +parameter val_smcc__nand_cycles1_0 = 32'h0024ABCC; +parameter mask_smcc__nand_cycles1_0 = 32'h00FFFFFF; + +parameter smcc__opmode1_0 = 32'hE000E184; +parameter val_smcc__opmode1_0 = 32'hE1FF0001; +parameter mask_smcc__opmode1_0 = 32'hFFFFFFFF; + +parameter smcc__user_status = 32'hE000E200; +parameter val_smcc__user_status = 32'h00000000; +parameter mask_smcc__user_status = 32'h000000FF; + +parameter smcc__user_config = 32'hE000E204; +parameter val_smcc__user_config = 32'h00000000; +parameter mask_smcc__user_config = 32'h00000000; + +parameter smcc__ecc_status_0 = 32'hE000E300; +parameter val_smcc__ecc_status_0 = 32'h00000000; +parameter mask_smcc__ecc_status_0 = 32'h3FFFFFFF; + +parameter smcc__ecc_memcfg_0 = 32'hE000E304; +parameter val_smcc__ecc_memcfg_0 = 32'h00000000; +parameter mask_smcc__ecc_memcfg_0 = 32'h00001FFF; + +parameter smcc__ecc_memcommand1_0 = 32'hE000E308; +parameter val_smcc__ecc_memcommand1_0 = 32'h00000000; +parameter mask_smcc__ecc_memcommand1_0 = 32'h01FFFFFF; + +parameter smcc__ecc_memcommand2_0 = 32'hE000E30C; +parameter val_smcc__ecc_memcommand2_0 = 32'h00000000; +parameter mask_smcc__ecc_memcommand2_0 = 32'h01FFFFFF; + +parameter smcc__ecc_addr0_0 = 32'hE000E310; +parameter val_smcc__ecc_addr0_0 = 32'h00000000; +parameter mask_smcc__ecc_addr0_0 = 32'hFFFFFFFF; + +parameter smcc__ecc_addr1_0 = 32'hE000E314; +parameter val_smcc__ecc_addr1_0 = 32'h00000000; +parameter mask_smcc__ecc_addr1_0 = 32'h00FFFFFF; + +parameter smcc__ecc_value0_0 = 32'hE000E318; +parameter val_smcc__ecc_value0_0 = 32'h00000000; +parameter mask_smcc__ecc_value0_0 = 32'hFFFFFFFF; + +parameter smcc__ecc_value1_0 = 32'hE000E31C; +parameter val_smcc__ecc_value1_0 = 32'h00000000; +parameter mask_smcc__ecc_value1_0 = 32'hFFFFFFFF; + +parameter smcc__ecc_value2_0 = 32'hE000E320; +parameter val_smcc__ecc_value2_0 = 32'h00000000; +parameter mask_smcc__ecc_value2_0 = 32'hFFFFFFFF; + +parameter smcc__ecc_value3_0 = 32'hE000E324; +parameter val_smcc__ecc_value3_0 = 32'h00000000; +parameter mask_smcc__ecc_value3_0 = 32'hFFFFFFFF; + +parameter smcc__ecc_status_1 = 32'hE000E400; +parameter val_smcc__ecc_status_1 = 32'h00000000; +parameter mask_smcc__ecc_status_1 = 32'h3FFFFFFF; + +parameter smcc__ecc_memcfg_1 = 32'hE000E404; +parameter val_smcc__ecc_memcfg_1 = 32'h00000043; +parameter mask_smcc__ecc_memcfg_1 = 32'h00001FFF; + +parameter smcc__ecc_memcommand1_1 = 32'hE000E408; +parameter val_smcc__ecc_memcommand1_1 = 32'h01300080; +parameter mask_smcc__ecc_memcommand1_1 = 32'h01FFFFFF; + +parameter smcc__ecc_memcommand2_1 = 32'hE000E40C; +parameter val_smcc__ecc_memcommand2_1 = 32'h01E00585; +parameter mask_smcc__ecc_memcommand2_1 = 32'h01FFFFFF; + +parameter smcc__ecc_addr0_1 = 32'hE000E410; +parameter val_smcc__ecc_addr0_1 = 32'h00000000; +parameter mask_smcc__ecc_addr0_1 = 32'hFFFFFFFF; + +parameter smcc__ecc_addr1_1 = 32'hE000E414; +parameter val_smcc__ecc_addr1_1 = 32'h00000000; +parameter mask_smcc__ecc_addr1_1 = 32'h00FFFFFF; + +parameter smcc__ecc_value0_1 = 32'hE000E418; +parameter val_smcc__ecc_value0_1 = 32'h00000000; +parameter mask_smcc__ecc_value0_1 = 32'hFFFFFFFF; + +parameter smcc__ecc_value1_1 = 32'hE000E41C; +parameter val_smcc__ecc_value1_1 = 32'h00000000; +parameter mask_smcc__ecc_value1_1 = 32'hFFFFFFFF; + +parameter smcc__ecc_value2_1 = 32'hE000E420; +parameter val_smcc__ecc_value2_1 = 32'h00000000; +parameter mask_smcc__ecc_value2_1 = 32'hFFFFFFFF; + +parameter smcc__ecc_value3_1 = 32'hE000E424; +parameter val_smcc__ecc_value3_1 = 32'h00000000; +parameter mask_smcc__ecc_value3_1 = 32'hFFFFFFFF; + +parameter smcc__integration_test = 32'hE000EE00; +parameter val_smcc__integration_test = 32'h00000000; +parameter mask_smcc__integration_test = 32'hFFFFFFFF; + +parameter smcc__periph_id_0 = 32'hE000EFE0; +parameter val_smcc__periph_id_0 = 32'h00000053; +parameter mask_smcc__periph_id_0 = 32'h000000FF; + +parameter smcc__periph_id_1 = 32'hE000EFE4; +parameter val_smcc__periph_id_1 = 32'h00000013; +parameter mask_smcc__periph_id_1 = 32'h000000FF; + +parameter smcc__periph_id_2 = 32'hE000EFE8; +parameter val_smcc__periph_id_2 = 32'h00000054; +parameter mask_smcc__periph_id_2 = 32'h000000FF; + +parameter smcc__periph_id_3 = 32'hE000EFEC; +parameter val_smcc__periph_id_3 = 32'h00000000; +parameter mask_smcc__periph_id_3 = 32'h00000001; + +parameter smcc__pcell_id_0 = 32'hE000EFF0; +parameter val_smcc__pcell_id_0 = 32'h0000000D; +parameter mask_smcc__pcell_id_0 = 32'h000000FF; + +parameter smcc__pcell_id_1 = 32'hE000EFF4; +parameter val_smcc__pcell_id_1 = 32'h000000F0; +parameter mask_smcc__pcell_id_1 = 32'h000000FF; + +parameter smcc__pcell_id_2 = 32'hE000EFF8; +parameter val_smcc__pcell_id_2 = 32'h00000005; +parameter mask_smcc__pcell_id_2 = 32'h000000FF; + +parameter smcc__pcell_id_3 = 32'hE000EFFC; +parameter val_smcc__pcell_id_3 = 32'h000000B1; +parameter mask_smcc__pcell_id_3 = 32'h000000FF; + + +// ************************************************************ +// Module spi0 SPI +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter spi0__Config_reg0 = 32'hE0006000; +parameter val_spi0__Config_reg0 = 32'h00020000; +parameter mask_spi0__Config_reg0 = 32'hFFFFFFFF; + +parameter spi0__Intr_status_reg0 = 32'hE0006004; +parameter val_spi0__Intr_status_reg0 = 32'h00000004; +parameter mask_spi0__Intr_status_reg0 = 32'hFFFFFFFF; + +parameter spi0__Intrpt_en_reg0 = 32'hE0006008; +parameter val_spi0__Intrpt_en_reg0 = 32'h00000000; +parameter mask_spi0__Intrpt_en_reg0 = 32'hFFFFFFFF; + +parameter spi0__Intrpt_dis_reg0 = 32'hE000600C; +parameter val_spi0__Intrpt_dis_reg0 = 32'h00000000; +parameter mask_spi0__Intrpt_dis_reg0 = 32'hFFFFFFFF; + +parameter spi0__Intrpt_mask_reg0 = 32'hE0006010; +parameter val_spi0__Intrpt_mask_reg0 = 32'h00000000; +parameter mask_spi0__Intrpt_mask_reg0 = 32'hFFFFFFFF; + +parameter spi0__En_reg0 = 32'hE0006014; +parameter val_spi0__En_reg0 = 32'h00000000; +parameter mask_spi0__En_reg0 = 32'hFFFFFFFF; + +parameter spi0__Delay_reg0 = 32'hE0006018; +parameter val_spi0__Delay_reg0 = 32'h00000000; +parameter mask_spi0__Delay_reg0 = 32'hFFFFFFFF; + +parameter spi0__Tx_data_reg0 = 32'hE000601C; +parameter val_spi0__Tx_data_reg0 = 32'h00000000; +parameter mask_spi0__Tx_data_reg0 = 32'hFFFFFFFF; + +parameter spi0__Rx_data_reg0 = 32'hE0006020; +parameter val_spi0__Rx_data_reg0 = 32'h00000000; +parameter mask_spi0__Rx_data_reg0 = 32'hFFFFFFFF; + +parameter spi0__Slave_Idle_count_reg0 = 32'hE0006024; +parameter val_spi0__Slave_Idle_count_reg0 = 32'h000000FF; +parameter mask_spi0__Slave_Idle_count_reg0 = 32'hFFFFFFFF; + +parameter spi0__TX_thres_reg0 = 32'hE0006028; +parameter val_spi0__TX_thres_reg0 = 32'h00000001; +parameter mask_spi0__TX_thres_reg0 = 32'hFFFFFFFF; + +parameter spi0__RX_thres_reg0 = 32'hE000602C; +parameter val_spi0__RX_thres_reg0 = 32'h00000001; +parameter mask_spi0__RX_thres_reg0 = 32'hFFFFFFFF; + +parameter spi0__Mod_id_reg0 = 32'hE00060FC; +parameter val_spi0__Mod_id_reg0 = 32'h00090106; +parameter mask_spi0__Mod_id_reg0 = 32'hFFFFFFFF; + + +// ************************************************************ +// Module spi1 SPI +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter spi1__Config_reg0 = 32'hE0007000; +parameter val_spi1__Config_reg0 = 32'h00020000; +parameter mask_spi1__Config_reg0 = 32'hFFFFFFFF; + +parameter spi1__Intr_status_reg0 = 32'hE0007004; +parameter val_spi1__Intr_status_reg0 = 32'h00000004; +parameter mask_spi1__Intr_status_reg0 = 32'hFFFFFFFF; + +parameter spi1__Intrpt_en_reg0 = 32'hE0007008; +parameter val_spi1__Intrpt_en_reg0 = 32'h00000000; +parameter mask_spi1__Intrpt_en_reg0 = 32'hFFFFFFFF; + +parameter spi1__Intrpt_dis_reg0 = 32'hE000700C; +parameter val_spi1__Intrpt_dis_reg0 = 32'h00000000; +parameter mask_spi1__Intrpt_dis_reg0 = 32'hFFFFFFFF; + +parameter spi1__Intrpt_mask_reg0 = 32'hE0007010; +parameter val_spi1__Intrpt_mask_reg0 = 32'h00000000; +parameter mask_spi1__Intrpt_mask_reg0 = 32'hFFFFFFFF; + +parameter spi1__En_reg0 = 32'hE0007014; +parameter val_spi1__En_reg0 = 32'h00000000; +parameter mask_spi1__En_reg0 = 32'hFFFFFFFF; + +parameter spi1__Delay_reg0 = 32'hE0007018; +parameter val_spi1__Delay_reg0 = 32'h00000000; +parameter mask_spi1__Delay_reg0 = 32'hFFFFFFFF; + +parameter spi1__Tx_data_reg0 = 32'hE000701C; +parameter val_spi1__Tx_data_reg0 = 32'h00000000; +parameter mask_spi1__Tx_data_reg0 = 32'hFFFFFFFF; + +parameter spi1__Rx_data_reg0 = 32'hE0007020; +parameter val_spi1__Rx_data_reg0 = 32'h00000000; +parameter mask_spi1__Rx_data_reg0 = 32'hFFFFFFFF; + +parameter spi1__Slave_Idle_count_reg0 = 32'hE0007024; +parameter val_spi1__Slave_Idle_count_reg0 = 32'h000000FF; +parameter mask_spi1__Slave_Idle_count_reg0 = 32'hFFFFFFFF; + +parameter spi1__TX_thres_reg0 = 32'hE0007028; +parameter val_spi1__TX_thres_reg0 = 32'h00000001; +parameter mask_spi1__TX_thres_reg0 = 32'hFFFFFFFF; + +parameter spi1__RX_thres_reg0 = 32'hE000702C; +parameter val_spi1__RX_thres_reg0 = 32'h00000001; +parameter mask_spi1__RX_thres_reg0 = 32'hFFFFFFFF; + +parameter spi1__Mod_id_reg0 = 32'hE00070FC; +parameter val_spi1__Mod_id_reg0 = 32'h00090106; +parameter mask_spi1__Mod_id_reg0 = 32'hFFFFFFFF; + + +// ************************************************************ +// Module swdt swdt +// doc version: 2.1 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter swdt__MODE = 32'hF8005000; +parameter val_swdt__MODE = 32'h000001C2; +parameter mask_swdt__MODE = 32'h00FFFFFF; + +parameter swdt__CONTROL = 32'hF8005004; +parameter val_swdt__CONTROL = 32'h03FFC3FC; +parameter mask_swdt__CONTROL = 32'h03FFFFFF; + +parameter swdt__RESTART = 32'hF8005008; +parameter val_swdt__RESTART = 32'h00000000; +parameter mask_swdt__RESTART = 32'h0000FFFF; + +parameter swdt__STATUS = 32'hF800500C; +parameter val_swdt__STATUS = 32'h00000000; +parameter mask_swdt__STATUS = 32'h00000001; + + +// ************************************************************ +// Module ttc0 ttc +// doc version: 2.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter ttc0__Clock_Control_1 = 32'hF8001000; +parameter val_ttc0__Clock_Control_1 = 32'h00000000; +parameter mask_ttc0__Clock_Control_1 = 32'h0000007F; + +parameter ttc0__Clock_Control_2 = 32'hF8001004; +parameter val_ttc0__Clock_Control_2 = 32'h00000000; +parameter mask_ttc0__Clock_Control_2 = 32'h0000007F; + +parameter ttc0__Clock_Control_3 = 32'hF8001008; +parameter val_ttc0__Clock_Control_3 = 32'h00000000; +parameter mask_ttc0__Clock_Control_3 = 32'h0000007F; + +parameter ttc0__Counter_Control_1 = 32'hF800100C; +parameter val_ttc0__Counter_Control_1 = 32'h00000021; +parameter mask_ttc0__Counter_Control_1 = 32'h0000007F; + +parameter ttc0__Counter_Control_2 = 32'hF8001010; +parameter val_ttc0__Counter_Control_2 = 32'h00000021; +parameter mask_ttc0__Counter_Control_2 = 32'h0000007F; + +parameter ttc0__Counter_Control_3 = 32'hF8001014; +parameter val_ttc0__Counter_Control_3 = 32'h00000021; +parameter mask_ttc0__Counter_Control_3 = 32'h0000007F; + +parameter ttc0__Counter_Value_1 = 32'hF8001018; +parameter val_ttc0__Counter_Value_1 = 32'h00000000; +parameter mask_ttc0__Counter_Value_1 = 32'h0000FFFF; + +parameter ttc0__Counter_Value_2 = 32'hF800101C; +parameter val_ttc0__Counter_Value_2 = 32'h00000000; +parameter mask_ttc0__Counter_Value_2 = 32'h0000FFFF; + +parameter ttc0__Counter_Value_3 = 32'hF8001020; +parameter val_ttc0__Counter_Value_3 = 32'h00000000; +parameter mask_ttc0__Counter_Value_3 = 32'h0000FFFF; + +parameter ttc0__Interval_Counter_1 = 32'hF8001024; +parameter val_ttc0__Interval_Counter_1 = 32'h00000000; +parameter mask_ttc0__Interval_Counter_1 = 32'h0000FFFF; + +parameter ttc0__Interval_Counter_2 = 32'hF8001028; +parameter val_ttc0__Interval_Counter_2 = 32'h00000000; +parameter mask_ttc0__Interval_Counter_2 = 32'h0000FFFF; + +parameter ttc0__Interval_Counter_3 = 32'hF800102C; +parameter val_ttc0__Interval_Counter_3 = 32'h00000000; +parameter mask_ttc0__Interval_Counter_3 = 32'h0000FFFF; + +parameter ttc0__Match_1_Counter_1 = 32'hF8001030; +parameter val_ttc0__Match_1_Counter_1 = 32'h00000000; +parameter mask_ttc0__Match_1_Counter_1 = 32'h0000FFFF; + +parameter ttc0__Match_1_Counter_2 = 32'hF8001034; +parameter val_ttc0__Match_1_Counter_2 = 32'h00000000; +parameter mask_ttc0__Match_1_Counter_2 = 32'h0000FFFF; + +parameter ttc0__Match_1_Counter_3 = 32'hF8001038; +parameter val_ttc0__Match_1_Counter_3 = 32'h00000000; +parameter mask_ttc0__Match_1_Counter_3 = 32'h0000FFFF; + +parameter ttc0__Match_2_Counter_1 = 32'hF800103C; +parameter val_ttc0__Match_2_Counter_1 = 32'h00000000; +parameter mask_ttc0__Match_2_Counter_1 = 32'h0000FFFF; + +parameter ttc0__Match_2_Counter_2 = 32'hF8001040; +parameter val_ttc0__Match_2_Counter_2 = 32'h00000000; +parameter mask_ttc0__Match_2_Counter_2 = 32'h0000FFFF; + +parameter ttc0__Match_2_Counter_3 = 32'hF8001044; +parameter val_ttc0__Match_2_Counter_3 = 32'h00000000; +parameter mask_ttc0__Match_2_Counter_3 = 32'h0000FFFF; + +parameter ttc0__Match_3_Counter_1 = 32'hF8001048; +parameter val_ttc0__Match_3_Counter_1 = 32'h00000000; +parameter mask_ttc0__Match_3_Counter_1 = 32'h0000FFFF; + +parameter ttc0__Match_3_Counter_2 = 32'hF800104C; +parameter val_ttc0__Match_3_Counter_2 = 32'h00000000; +parameter mask_ttc0__Match_3_Counter_2 = 32'h0000FFFF; + +parameter ttc0__Match_3_Counter_3 = 32'hF8001050; +parameter val_ttc0__Match_3_Counter_3 = 32'h00000000; +parameter mask_ttc0__Match_3_Counter_3 = 32'h0000FFFF; + +parameter ttc0__Interrupt_Register_1 = 32'hF8001054; +parameter val_ttc0__Interrupt_Register_1 = 32'h00000000; +parameter mask_ttc0__Interrupt_Register_1 = 32'h0000003F; + +parameter ttc0__Interrupt_Register_2 = 32'hF8001058; +parameter val_ttc0__Interrupt_Register_2 = 32'h00000000; +parameter mask_ttc0__Interrupt_Register_2 = 32'h0000003F; + +parameter ttc0__Interrupt_Register_3 = 32'hF800105C; +parameter val_ttc0__Interrupt_Register_3 = 32'h00000000; +parameter mask_ttc0__Interrupt_Register_3 = 32'h0000003F; + +parameter ttc0__Interrupt_Enable_1 = 32'hF8001060; +parameter val_ttc0__Interrupt_Enable_1 = 32'h00000000; +parameter mask_ttc0__Interrupt_Enable_1 = 32'h0000003F; + +parameter ttc0__Interrupt_Enable_2 = 32'hF8001064; +parameter val_ttc0__Interrupt_Enable_2 = 32'h00000000; +parameter mask_ttc0__Interrupt_Enable_2 = 32'h0000003F; + +parameter ttc0__Interrupt_Enable_3 = 32'hF8001068; +parameter val_ttc0__Interrupt_Enable_3 = 32'h00000000; +parameter mask_ttc0__Interrupt_Enable_3 = 32'h0000003F; + +parameter ttc0__Event_Control_Timer_1 = 32'hF800106C; +parameter val_ttc0__Event_Control_Timer_1 = 32'h00000000; +parameter mask_ttc0__Event_Control_Timer_1 = 32'h00000007; + +parameter ttc0__Event_Control_Timer_2 = 32'hF8001070; +parameter val_ttc0__Event_Control_Timer_2 = 32'h00000000; +parameter mask_ttc0__Event_Control_Timer_2 = 32'h00000007; + +parameter ttc0__Event_Control_Timer_3 = 32'hF8001074; +parameter val_ttc0__Event_Control_Timer_3 = 32'h00000000; +parameter mask_ttc0__Event_Control_Timer_3 = 32'h00000007; + +parameter ttc0__Event_Register_1 = 32'hF8001078; +parameter val_ttc0__Event_Register_1 = 32'h00000000; +parameter mask_ttc0__Event_Register_1 = 32'h0000FFFF; + +parameter ttc0__Event_Register_2 = 32'hF800107C; +parameter val_ttc0__Event_Register_2 = 32'h00000000; +parameter mask_ttc0__Event_Register_2 = 32'h0000FFFF; + +parameter ttc0__Event_Register_3 = 32'hF8001080; +parameter val_ttc0__Event_Register_3 = 32'h00000000; +parameter mask_ttc0__Event_Register_3 = 32'h0000FFFF; + + +// ************************************************************ +// Module ttc1 ttc +// doc version: 2.0 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter ttc1__Clock_Control_1 = 32'hF8002000; +parameter val_ttc1__Clock_Control_1 = 32'h00000000; +parameter mask_ttc1__Clock_Control_1 = 32'h0000007F; + +parameter ttc1__Clock_Control_2 = 32'hF8002004; +parameter val_ttc1__Clock_Control_2 = 32'h00000000; +parameter mask_ttc1__Clock_Control_2 = 32'h0000007F; + +parameter ttc1__Clock_Control_3 = 32'hF8002008; +parameter val_ttc1__Clock_Control_3 = 32'h00000000; +parameter mask_ttc1__Clock_Control_3 = 32'h0000007F; + +parameter ttc1__Counter_Control_1 = 32'hF800200C; +parameter val_ttc1__Counter_Control_1 = 32'h00000021; +parameter mask_ttc1__Counter_Control_1 = 32'h0000007F; + +parameter ttc1__Counter_Control_2 = 32'hF8002010; +parameter val_ttc1__Counter_Control_2 = 32'h00000021; +parameter mask_ttc1__Counter_Control_2 = 32'h0000007F; + +parameter ttc1__Counter_Control_3 = 32'hF8002014; +parameter val_ttc1__Counter_Control_3 = 32'h00000021; +parameter mask_ttc1__Counter_Control_3 = 32'h0000007F; + +parameter ttc1__Counter_Value_1 = 32'hF8002018; +parameter val_ttc1__Counter_Value_1 = 32'h00000000; +parameter mask_ttc1__Counter_Value_1 = 32'h0000FFFF; + +parameter ttc1__Counter_Value_2 = 32'hF800201C; +parameter val_ttc1__Counter_Value_2 = 32'h00000000; +parameter mask_ttc1__Counter_Value_2 = 32'h0000FFFF; + +parameter ttc1__Counter_Value_3 = 32'hF8002020; +parameter val_ttc1__Counter_Value_3 = 32'h00000000; +parameter mask_ttc1__Counter_Value_3 = 32'h0000FFFF; + +parameter ttc1__Interval_Counter_1 = 32'hF8002024; +parameter val_ttc1__Interval_Counter_1 = 32'h00000000; +parameter mask_ttc1__Interval_Counter_1 = 32'h0000FFFF; + +parameter ttc1__Interval_Counter_2 = 32'hF8002028; +parameter val_ttc1__Interval_Counter_2 = 32'h00000000; +parameter mask_ttc1__Interval_Counter_2 = 32'h0000FFFF; + +parameter ttc1__Interval_Counter_3 = 32'hF800202C; +parameter val_ttc1__Interval_Counter_3 = 32'h00000000; +parameter mask_ttc1__Interval_Counter_3 = 32'h0000FFFF; + +parameter ttc1__Match_1_Counter_1 = 32'hF8002030; +parameter val_ttc1__Match_1_Counter_1 = 32'h00000000; +parameter mask_ttc1__Match_1_Counter_1 = 32'h0000FFFF; + +parameter ttc1__Match_1_Counter_2 = 32'hF8002034; +parameter val_ttc1__Match_1_Counter_2 = 32'h00000000; +parameter mask_ttc1__Match_1_Counter_2 = 32'h0000FFFF; + +parameter ttc1__Match_1_Counter_3 = 32'hF8002038; +parameter val_ttc1__Match_1_Counter_3 = 32'h00000000; +parameter mask_ttc1__Match_1_Counter_3 = 32'h0000FFFF; + +parameter ttc1__Match_2_Counter_1 = 32'hF800203C; +parameter val_ttc1__Match_2_Counter_1 = 32'h00000000; +parameter mask_ttc1__Match_2_Counter_1 = 32'h0000FFFF; + +parameter ttc1__Match_2_Counter_2 = 32'hF8002040; +parameter val_ttc1__Match_2_Counter_2 = 32'h00000000; +parameter mask_ttc1__Match_2_Counter_2 = 32'h0000FFFF; + +parameter ttc1__Match_2_Counter_3 = 32'hF8002044; +parameter val_ttc1__Match_2_Counter_3 = 32'h00000000; +parameter mask_ttc1__Match_2_Counter_3 = 32'h0000FFFF; + +parameter ttc1__Match_3_Counter_1 = 32'hF8002048; +parameter val_ttc1__Match_3_Counter_1 = 32'h00000000; +parameter mask_ttc1__Match_3_Counter_1 = 32'h0000FFFF; + +parameter ttc1__Match_3_Counter_2 = 32'hF800204C; +parameter val_ttc1__Match_3_Counter_2 = 32'h00000000; +parameter mask_ttc1__Match_3_Counter_2 = 32'h0000FFFF; + +parameter ttc1__Match_3_Counter_3 = 32'hF8002050; +parameter val_ttc1__Match_3_Counter_3 = 32'h00000000; +parameter mask_ttc1__Match_3_Counter_3 = 32'h0000FFFF; + +parameter ttc1__Interrupt_Register_1 = 32'hF8002054; +parameter val_ttc1__Interrupt_Register_1 = 32'h00000000; +parameter mask_ttc1__Interrupt_Register_1 = 32'h0000003F; + +parameter ttc1__Interrupt_Register_2 = 32'hF8002058; +parameter val_ttc1__Interrupt_Register_2 = 32'h00000000; +parameter mask_ttc1__Interrupt_Register_2 = 32'h0000003F; + +parameter ttc1__Interrupt_Register_3 = 32'hF800205C; +parameter val_ttc1__Interrupt_Register_3 = 32'h00000000; +parameter mask_ttc1__Interrupt_Register_3 = 32'h0000003F; + +parameter ttc1__Interrupt_Enable_1 = 32'hF8002060; +parameter val_ttc1__Interrupt_Enable_1 = 32'h00000000; +parameter mask_ttc1__Interrupt_Enable_1 = 32'h0000003F; + +parameter ttc1__Interrupt_Enable_2 = 32'hF8002064; +parameter val_ttc1__Interrupt_Enable_2 = 32'h00000000; +parameter mask_ttc1__Interrupt_Enable_2 = 32'h0000003F; + +parameter ttc1__Interrupt_Enable_3 = 32'hF8002068; +parameter val_ttc1__Interrupt_Enable_3 = 32'h00000000; +parameter mask_ttc1__Interrupt_Enable_3 = 32'h0000003F; + +parameter ttc1__Event_Control_Timer_1 = 32'hF800206C; +parameter val_ttc1__Event_Control_Timer_1 = 32'h00000000; +parameter mask_ttc1__Event_Control_Timer_1 = 32'h00000007; + +parameter ttc1__Event_Control_Timer_2 = 32'hF8002070; +parameter val_ttc1__Event_Control_Timer_2 = 32'h00000000; +parameter mask_ttc1__Event_Control_Timer_2 = 32'h00000007; + +parameter ttc1__Event_Control_Timer_3 = 32'hF8002074; +parameter val_ttc1__Event_Control_Timer_3 = 32'h00000000; +parameter mask_ttc1__Event_Control_Timer_3 = 32'h00000007; + +parameter ttc1__Event_Register_1 = 32'hF8002078; +parameter val_ttc1__Event_Register_1 = 32'h00000000; +parameter mask_ttc1__Event_Register_1 = 32'h0000FFFF; + +parameter ttc1__Event_Register_2 = 32'hF800207C; +parameter val_ttc1__Event_Register_2 = 32'h00000000; +parameter mask_ttc1__Event_Register_2 = 32'h0000FFFF; + +parameter ttc1__Event_Register_3 = 32'hF8002080; +parameter val_ttc1__Event_Register_3 = 32'h00000000; +parameter mask_ttc1__Event_Register_3 = 32'h0000FFFF; + + +// ************************************************************ +// Module uart0 UART +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter uart0__Control_reg0 = 32'hE0000000; +parameter val_uart0__Control_reg0 = 32'h00000128; +parameter mask_uart0__Control_reg0 = 32'hFFFFFFFF; + +parameter uart0__mode_reg0 = 32'hE0000004; +parameter val_uart0__mode_reg0 = 32'h00000000; +parameter mask_uart0__mode_reg0 = 32'hFFFFFFFF; + +parameter uart0__Intrpt_en_reg0 = 32'hE0000008; +parameter val_uart0__Intrpt_en_reg0 = 32'h00000000; +parameter mask_uart0__Intrpt_en_reg0 = 32'hFFFFFFFF; + +parameter uart0__Intrpt_dis_reg0 = 32'hE000000C; +parameter val_uart0__Intrpt_dis_reg0 = 32'h00000000; +parameter mask_uart0__Intrpt_dis_reg0 = 32'hFFFFFFFF; + +parameter uart0__Intrpt_mask_reg0 = 32'hE0000010; +parameter val_uart0__Intrpt_mask_reg0 = 32'h00000000; +parameter mask_uart0__Intrpt_mask_reg0 = 32'hFFFFFFFF; + +parameter uart0__Chnl_int_sts_reg0 = 32'hE0000014; +parameter val_uart0__Chnl_int_sts_reg0 = 32'h00000200; +parameter mask_uart0__Chnl_int_sts_reg0 = 32'hFFFFFFFF; + +parameter uart0__Baud_rate_gen_reg0 = 32'hE0000018; +parameter val_uart0__Baud_rate_gen_reg0 = 32'h0000028B; +parameter mask_uart0__Baud_rate_gen_reg0 = 32'hFFFFFFFF; + +parameter uart0__Rcvr_timeout_reg0 = 32'hE000001C; +parameter val_uart0__Rcvr_timeout_reg0 = 32'h00000000; +parameter mask_uart0__Rcvr_timeout_reg0 = 32'hFFFFFFFF; + +parameter uart0__Rcvr_FIFO_trigger_level0 = 32'hE0000020; +parameter val_uart0__Rcvr_FIFO_trigger_level0 = 32'h00000020; +parameter mask_uart0__Rcvr_FIFO_trigger_level0 = 32'hFFFFFFFF; + +parameter uart0__Modem_ctrl_reg0 = 32'hE0000024; +parameter val_uart0__Modem_ctrl_reg0 = 32'h00000000; +parameter mask_uart0__Modem_ctrl_reg0 = 32'hFFFFFFFF; + +parameter uart0__Modem_sts_reg0 = 32'hE0000028; +parameter val_uart0__Modem_sts_reg0 = 32'h00000000; +parameter mask_uart0__Modem_sts_reg0 = 32'h00000000; + +parameter uart0__Channel_sts_reg0 = 32'hE000002C; +parameter val_uart0__Channel_sts_reg0 = 32'h00000000; +parameter mask_uart0__Channel_sts_reg0 = 32'hFFFFFFFF; + +parameter uart0__TX_RX_FIFO0 = 32'hE0000030; +parameter val_uart0__TX_RX_FIFO0 = 32'h00000000; +parameter mask_uart0__TX_RX_FIFO0 = 32'hFFFFFFFF; + +parameter uart0__Baud_rate_divider_reg0 = 32'hE0000034; +parameter val_uart0__Baud_rate_divider_reg0 = 32'h0000000F; +parameter mask_uart0__Baud_rate_divider_reg0 = 32'hFFFFFFFF; + +parameter uart0__Flow_delay_reg0 = 32'hE0000038; +parameter val_uart0__Flow_delay_reg0 = 32'h00000000; +parameter mask_uart0__Flow_delay_reg0 = 32'hFFFFFFFF; + +parameter uart0__IR_min_rcv_pulse_wdth0 = 32'hE000003C; +parameter val_uart0__IR_min_rcv_pulse_wdth0 = 32'h00000000; +parameter mask_uart0__IR_min_rcv_pulse_wdth0 = 32'hFFFFFFFF; + +parameter uart0__IR_transmitted_pulse_wdth0 = 32'hE0000040; +parameter val_uart0__IR_transmitted_pulse_wdth0 = 32'h00000000; +parameter mask_uart0__IR_transmitted_pulse_wdth0 = 32'hFFFF00FF; + +parameter uart0__Tx_FIFO_trigger_level0 = 32'hE0000044; +parameter val_uart0__Tx_FIFO_trigger_level0 = 32'h00000020; +parameter mask_uart0__Tx_FIFO_trigger_level0 = 32'hFFFFFFFF; + + +// ************************************************************ +// Module uart1 UART +// doc version: 1.2 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter uart1__Control_reg0 = 32'hE0001000; +parameter val_uart1__Control_reg0 = 32'h00000128; +parameter mask_uart1__Control_reg0 = 32'hFFFFFFFF; + +parameter uart1__mode_reg0 = 32'hE0001004; +parameter val_uart1__mode_reg0 = 32'h00000000; +parameter mask_uart1__mode_reg0 = 32'hFFFFFFFF; + +parameter uart1__Intrpt_en_reg0 = 32'hE0001008; +parameter val_uart1__Intrpt_en_reg0 = 32'h00000000; +parameter mask_uart1__Intrpt_en_reg0 = 32'hFFFFFFFF; + +parameter uart1__Intrpt_dis_reg0 = 32'hE000100C; +parameter val_uart1__Intrpt_dis_reg0 = 32'h00000000; +parameter mask_uart1__Intrpt_dis_reg0 = 32'hFFFFFFFF; + +parameter uart1__Intrpt_mask_reg0 = 32'hE0001010; +parameter val_uart1__Intrpt_mask_reg0 = 32'h00000000; +parameter mask_uart1__Intrpt_mask_reg0 = 32'hFFFFFFFF; + +parameter uart1__Chnl_int_sts_reg0 = 32'hE0001014; +parameter val_uart1__Chnl_int_sts_reg0 = 32'h00000200; +parameter mask_uart1__Chnl_int_sts_reg0 = 32'hFFFFFFFF; + +parameter uart1__Baud_rate_gen_reg0 = 32'hE0001018; +parameter val_uart1__Baud_rate_gen_reg0 = 32'h0000028B; +parameter mask_uart1__Baud_rate_gen_reg0 = 32'hFFFFFFFF; + +parameter uart1__Rcvr_timeout_reg0 = 32'hE000101C; +parameter val_uart1__Rcvr_timeout_reg0 = 32'h00000000; +parameter mask_uart1__Rcvr_timeout_reg0 = 32'hFFFFFFFF; + +parameter uart1__Rcvr_FIFO_trigger_level0 = 32'hE0001020; +parameter val_uart1__Rcvr_FIFO_trigger_level0 = 32'h00000020; +parameter mask_uart1__Rcvr_FIFO_trigger_level0 = 32'hFFFFFFFF; + +parameter uart1__Modem_ctrl_reg0 = 32'hE0001024; +parameter val_uart1__Modem_ctrl_reg0 = 32'h00000000; +parameter mask_uart1__Modem_ctrl_reg0 = 32'hFFFFFFFF; + +parameter uart1__Modem_sts_reg0 = 32'hE0001028; +parameter val_uart1__Modem_sts_reg0 = 32'h00000000; +parameter mask_uart1__Modem_sts_reg0 = 32'h00000000; + +parameter uart1__Channel_sts_reg0 = 32'hE000102C; +parameter val_uart1__Channel_sts_reg0 = 32'h00000000; +parameter mask_uart1__Channel_sts_reg0 = 32'hFFFFFFFF; + +parameter uart1__TX_RX_FIFO0 = 32'hE0001030; +parameter val_uart1__TX_RX_FIFO0 = 32'h00000000; +parameter mask_uart1__TX_RX_FIFO0 = 32'hFFFFFFFF; + +parameter uart1__Baud_rate_divider_reg0 = 32'hE0001034; +parameter val_uart1__Baud_rate_divider_reg0 = 32'h0000000F; +parameter mask_uart1__Baud_rate_divider_reg0 = 32'hFFFFFFFF; + +parameter uart1__Flow_delay_reg0 = 32'hE0001038; +parameter val_uart1__Flow_delay_reg0 = 32'h00000000; +parameter mask_uart1__Flow_delay_reg0 = 32'hFFFFFFFF; + +parameter uart1__IR_min_rcv_pulse_wdth0 = 32'hE000103C; +parameter val_uart1__IR_min_rcv_pulse_wdth0 = 32'h00000000; +parameter mask_uart1__IR_min_rcv_pulse_wdth0 = 32'hFFFFFFFF; + +parameter uart1__IR_transmitted_pulse_wdth0 = 32'hE0001040; +parameter val_uart1__IR_transmitted_pulse_wdth0 = 32'h00000000; +parameter mask_uart1__IR_transmitted_pulse_wdth0 = 32'hFFFF00FF; + +parameter uart1__Tx_FIFO_trigger_level0 = 32'hE0001044; +parameter val_uart1__Tx_FIFO_trigger_level0 = 32'h00000020; +parameter mask_uart1__Tx_FIFO_trigger_level0 = 32'hFFFFFFFF; + + +// ************************************************************ +// Module usb0 usb +// doc version: 1.3 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter usb0__ID = 32'hE0002000; +parameter val_usb0__ID = 32'hE441FA05; +parameter mask_usb0__ID = 32'hFFFFFFFF; + +parameter usb0__HWGENERAL = 32'hE0002004; +parameter val_usb0__HWGENERAL = 32'h00000083; +parameter mask_usb0__HWGENERAL = 32'h00000FFF; + +parameter usb0__HWHOST = 32'hE0002008; +parameter val_usb0__HWHOST = 32'h10020001; +parameter mask_usb0__HWHOST = 32'hFFFFFFFF; + +parameter usb0__HWDEVICE = 32'hE000200C; +parameter val_usb0__HWDEVICE = 32'h00000019; +parameter mask_usb0__HWDEVICE = 32'h0000003F; + +parameter usb0__HWTXBUF = 32'hE0002010; +parameter val_usb0__HWTXBUF = 32'h80060A10; +parameter mask_usb0__HWTXBUF = 32'hFFFFFFFF; + +parameter usb0__HWRXBUF = 32'hE0002014; +parameter val_usb0__HWRXBUF = 32'h00000A10; +parameter mask_usb0__HWRXBUF = 32'hFF00FFFF; + +parameter usb0__GPTIMER0LD = 32'hE0002080; +parameter val_usb0__GPTIMER0LD = 32'h00000000; +parameter mask_usb0__GPTIMER0LD = 32'h00FFFFFF; + +parameter usb0__GPTIMER0CTRL = 32'hE0002084; +parameter val_usb0__GPTIMER0CTRL = 32'h00000000; +parameter mask_usb0__GPTIMER0CTRL = 32'hFFFFFFFF; + +parameter usb0__GPTIMER1LD = 32'hE0002088; +parameter val_usb0__GPTIMER1LD = 32'h00000000; +parameter mask_usb0__GPTIMER1LD = 32'h00FFFFFF; + +parameter usb0__GPTIMER1CTRL = 32'hE000208C; +parameter val_usb0__GPTIMER1CTRL = 32'h00000000; +parameter mask_usb0__GPTIMER1CTRL = 32'hFFFFFFFF; + +parameter usb0__SBUSCFG = 32'hE0002090; +parameter val_usb0__SBUSCFG = 32'h00000003; +parameter mask_usb0__SBUSCFG = 32'h00000007; + +parameter usb0__CAPLENGTH_HCIVERSION = 32'hE0002100; +parameter val_usb0__CAPLENGTH_HCIVERSION = 32'h01000040; +parameter mask_usb0__CAPLENGTH_HCIVERSION = 32'hFFFFFFFF; + +parameter usb0__HCSPARAMS = 32'hE0002104; +parameter val_usb0__HCSPARAMS = 32'h00010011; +parameter mask_usb0__HCSPARAMS = 32'h0FFFFFFF; + +parameter usb0__HCCPARAMS = 32'hE0002108; +parameter val_usb0__HCCPARAMS = 32'h00000006; +parameter mask_usb0__HCCPARAMS = 32'h0000FFFF; + +parameter usb0__DCIVERSION = 32'hE0002120; +parameter val_usb0__DCIVERSION = 32'h00000001; +parameter mask_usb0__DCIVERSION = 32'h0000FFFF; + +parameter usb0__DCCPARAMS = 32'hE0002124; +parameter val_usb0__DCCPARAMS = 32'h0000018C; +parameter mask_usb0__DCCPARAMS = 32'h000001FF; + +parameter usb0__USBCMD = 32'hE0002140; +parameter val_usb0__USBCMD = 32'h00000B00; +parameter mask_usb0__USBCMD = 32'h00FFFFFF; + +parameter usb0__USBSTS = 32'hE0002144; +parameter val_usb0__USBSTS = 32'h00000000; +parameter mask_usb0__USBSTS = 32'h03FFFFFF; + +parameter usb0__USBINTR = 32'hE0002148; +parameter val_usb0__USBINTR = 32'h00000000; +parameter mask_usb0__USBINTR = 32'h03FF0FFF; + +parameter usb0__FRINDEX = 32'hE000214C; +parameter val_usb0__FRINDEX = 32'h00000000; +parameter mask_usb0__FRINDEX = 32'h00003FFF; + +parameter usb0__PERIODICLISTBASE_DEVICEADDR = 32'hE0002154; +parameter val_usb0__PERIODICLISTBASE_DEVICEADDR = 32'h00000000; +parameter mask_usb0__PERIODICLISTBASE_DEVICEADDR = 32'hFFFFFFFF; + +parameter usb0__ASYNCLISTADDR_ENDPOINTLISTADDR = 32'hE0002158; +parameter val_usb0__ASYNCLISTADDR_ENDPOINTLISTADDR = 32'h00000000; +parameter mask_usb0__ASYNCLISTADDR_ENDPOINTLISTADDR = 32'hFFFFFFFF; + +parameter usb0__TTCTRL = 32'hE000215C; +parameter val_usb0__TTCTRL = 32'h00000000; +parameter mask_usb0__TTCTRL = 32'hFFFFFFFF; + +parameter usb0__BURSTSIZE = 32'hE0002160; +parameter val_usb0__BURSTSIZE = 32'h00001010; +parameter mask_usb0__BURSTSIZE = 32'h0001FFFF; + +parameter usb0__TXFILLTUNING = 32'hE0002164; +parameter val_usb0__TXFILLTUNING = 32'h00020000; +parameter mask_usb0__TXFILLTUNING = 32'h003FFFFF; + +parameter usb0__TXTTFILLTUNING = 32'hE0002168; +parameter val_usb0__TXTTFILLTUNING = 32'h00000000; +parameter mask_usb0__TXTTFILLTUNING = 32'h00001FFF; + +parameter usb0__IC_USB = 32'hE000216C; +parameter val_usb0__IC_USB = 32'h00000000; +parameter mask_usb0__IC_USB = 32'hFFFFFFFF; + +parameter usb0__ULPI_VIEWPORT = 32'hE0002170; +parameter val_usb0__ULPI_VIEWPORT = 32'h00000000; +parameter mask_usb0__ULPI_VIEWPORT = 32'hFFFFFFFF; + +parameter usb0__ENDPTNAK = 32'hE0002178; +parameter val_usb0__ENDPTNAK = 32'h00000000; +parameter mask_usb0__ENDPTNAK = 32'hFFFFFFFF; + +parameter usb0__ENDPTNAKEN = 32'hE000217C; +parameter val_usb0__ENDPTNAKEN = 32'h00000000; +parameter mask_usb0__ENDPTNAKEN = 32'hFFFFFFFF; + +parameter usb0__CONFIGFLAG = 32'hE0002180; +parameter val_usb0__CONFIGFLAG = 32'h00000001; +parameter mask_usb0__CONFIGFLAG = 32'hFFFFFFFF; + +parameter usb0__PORTSC1 = 32'hE0002184; +parameter val_usb0__PORTSC1 = 32'h00000000; +parameter mask_usb0__PORTSC1 = 32'hFFFFFFFF; + +parameter usb0__OTGSC = 32'hE00021A4; +parameter val_usb0__OTGSC = 32'h00000020; +parameter mask_usb0__OTGSC = 32'hFFFFFFFF; + +parameter usb0__USBMODE = 32'hE00021A8; +parameter val_usb0__USBMODE = 32'h00000000; +parameter mask_usb0__USBMODE = 32'h0000FFFF; + +parameter usb0__ENDPTSETUPSTAT = 32'hE00021AC; +parameter val_usb0__ENDPTSETUPSTAT = 32'h00000000; +parameter mask_usb0__ENDPTSETUPSTAT = 32'h0000FFFF; + +parameter usb0__ENDPTPRIME = 32'hE00021B0; +parameter val_usb0__ENDPTPRIME = 32'h00000000; +parameter mask_usb0__ENDPTPRIME = 32'hFFFFFFFF; + +parameter usb0__ENDPTFLUSH = 32'hE00021B4; +parameter val_usb0__ENDPTFLUSH = 32'h00000000; +parameter mask_usb0__ENDPTFLUSH = 32'hFFFFFFFF; + +parameter usb0__ENDPTSTAT = 32'hE00021B8; +parameter val_usb0__ENDPTSTAT = 32'h00000000; +parameter mask_usb0__ENDPTSTAT = 32'hFFFFFFFF; + +parameter usb0__ENDPTCOMPLETE = 32'hE00021BC; +parameter val_usb0__ENDPTCOMPLETE = 32'h00000000; +parameter mask_usb0__ENDPTCOMPLETE = 32'hFFFFFFFF; + +parameter usb0__ENDPTCTRL0 = 32'hE00021C0; +parameter val_usb0__ENDPTCTRL0 = 32'h00800080; +parameter mask_usb0__ENDPTCTRL0 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL1 = 32'hE00021C4; +parameter val_usb0__ENDPTCTRL1 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL1 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL2 = 32'hE00021C8; +parameter val_usb0__ENDPTCTRL2 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL2 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL3 = 32'hE00021CC; +parameter val_usb0__ENDPTCTRL3 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL3 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL4 = 32'hE00021D0; +parameter val_usb0__ENDPTCTRL4 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL4 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL5 = 32'hE00021D4; +parameter val_usb0__ENDPTCTRL5 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL5 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL6 = 32'hE00021D8; +parameter val_usb0__ENDPTCTRL6 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL6 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL7 = 32'hE00021DC; +parameter val_usb0__ENDPTCTRL7 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL7 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL8 = 32'hE00021E0; +parameter val_usb0__ENDPTCTRL8 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL8 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL9 = 32'hE00021E4; +parameter val_usb0__ENDPTCTRL9 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL9 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL10 = 32'hE00021E8; +parameter val_usb0__ENDPTCTRL10 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL10 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL11 = 32'hE00021EC; +parameter val_usb0__ENDPTCTRL11 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL11 = 32'h00FFFFFF; + +parameter usb0__ENDPTCTRL12 = 32'hE00021F0; +parameter val_usb0__ENDPTCTRL12 = 32'h00000000; +parameter mask_usb0__ENDPTCTRL12 = 32'h00FFFFFF; + + +// ************************************************************ +// Module usb1 usb +// doc version: 1.3 +// ************************************************************ + +// ADDRESS DEVFALUE MASK NAME +parameter usb1__ID = 32'hE0003000; +parameter val_usb1__ID = 32'hE441FA05; +parameter mask_usb1__ID = 32'hFFFFFFFF; + +parameter usb1__HWGENERAL = 32'hE0003004; +parameter val_usb1__HWGENERAL = 32'h00000083; +parameter mask_usb1__HWGENERAL = 32'h00000FFF; + +parameter usb1__HWHOST = 32'hE0003008; +parameter val_usb1__HWHOST = 32'h10020001; +parameter mask_usb1__HWHOST = 32'hFFFFFFFF; + +parameter usb1__HWDEVICE = 32'hE000300C; +parameter val_usb1__HWDEVICE = 32'h00000019; +parameter mask_usb1__HWDEVICE = 32'h0000003F; + +parameter usb1__HWTXBUF = 32'hE0003010; +parameter val_usb1__HWTXBUF = 32'h80060A10; +parameter mask_usb1__HWTXBUF = 32'hFFFFFFFF; + +parameter usb1__HWRXBUF = 32'hE0003014; +parameter val_usb1__HWRXBUF = 32'h00000A10; +parameter mask_usb1__HWRXBUF = 32'hFF00FFFF; + +parameter usb1__GPTIMER0LD = 32'hE0003080; +parameter val_usb1__GPTIMER0LD = 32'h00000000; +parameter mask_usb1__GPTIMER0LD = 32'h00FFFFFF; + +parameter usb1__GPTIMER0CTRL = 32'hE0003084; +parameter val_usb1__GPTIMER0CTRL = 32'h00000000; +parameter mask_usb1__GPTIMER0CTRL = 32'hFFFFFFFF; + +parameter usb1__GPTIMER1LD = 32'hE0003088; +parameter val_usb1__GPTIMER1LD = 32'h00000000; +parameter mask_usb1__GPTIMER1LD = 32'h00FFFFFF; + +parameter usb1__GPTIMER1CTRL = 32'hE000308C; +parameter val_usb1__GPTIMER1CTRL = 32'h00000000; +parameter mask_usb1__GPTIMER1CTRL = 32'hFFFFFFFF; + +parameter usb1__SBUSCFG = 32'hE0003090; +parameter val_usb1__SBUSCFG = 32'h00000003; +parameter mask_usb1__SBUSCFG = 32'h00000007; + +parameter usb1__CAPLENGTH_HCIVERSION = 32'hE0003100; +parameter val_usb1__CAPLENGTH_HCIVERSION = 32'h01000040; +parameter mask_usb1__CAPLENGTH_HCIVERSION = 32'hFFFFFFFF; + +parameter usb1__HCSPARAMS = 32'hE0003104; +parameter val_usb1__HCSPARAMS = 32'h00010011; +parameter mask_usb1__HCSPARAMS = 32'h0FFFFFFF; + +parameter usb1__HCCPARAMS = 32'hE0003108; +parameter val_usb1__HCCPARAMS = 32'h00000006; +parameter mask_usb1__HCCPARAMS = 32'h0000FFFF; + +parameter usb1__DCIVERSION = 32'hE0003120; +parameter val_usb1__DCIVERSION = 32'h00000001; +parameter mask_usb1__DCIVERSION = 32'h0000FFFF; + +parameter usb1__DCCPARAMS = 32'hE0003124; +parameter val_usb1__DCCPARAMS = 32'h0000018C; +parameter mask_usb1__DCCPARAMS = 32'h000001FF; + +parameter usb1__USBCMD = 32'hE0003140; +parameter val_usb1__USBCMD = 32'h00000B00; +parameter mask_usb1__USBCMD = 32'h00FFFFFF; + +parameter usb1__USBSTS = 32'hE0003144; +parameter val_usb1__USBSTS = 32'h00000000; +parameter mask_usb1__USBSTS = 32'h03FFFFFF; + +parameter usb1__USBINTR = 32'hE0003148; +parameter val_usb1__USBINTR = 32'h00000000; +parameter mask_usb1__USBINTR = 32'h03FF0FFF; + +parameter usb1__FRINDEX = 32'hE000314C; +parameter val_usb1__FRINDEX = 32'h00000000; +parameter mask_usb1__FRINDEX = 32'h00003FFF; + +parameter usb1__PERIODICLISTBASE_DEVICEADDR = 32'hE0003154; +parameter val_usb1__PERIODICLISTBASE_DEVICEADDR = 32'h00000000; +parameter mask_usb1__PERIODICLISTBASE_DEVICEADDR = 32'hFFFFFFFF; + +parameter usb1__ASYNCLISTADDR_ENDPOINTLISTADDR = 32'hE0003158; +parameter val_usb1__ASYNCLISTADDR_ENDPOINTLISTADDR = 32'h00000000; +parameter mask_usb1__ASYNCLISTADDR_ENDPOINTLISTADDR = 32'hFFFFFFFF; + +parameter usb1__TTCTRL = 32'hE000315C; +parameter val_usb1__TTCTRL = 32'h00000000; +parameter mask_usb1__TTCTRL = 32'hFFFFFFFF; + +parameter usb1__BURSTSIZE = 32'hE0003160; +parameter val_usb1__BURSTSIZE = 32'h00001010; +parameter mask_usb1__BURSTSIZE = 32'h0001FFFF; + +parameter usb1__TXFILLTUNING = 32'hE0003164; +parameter val_usb1__TXFILLTUNING = 32'h00020000; +parameter mask_usb1__TXFILLTUNING = 32'h003FFFFF; + +parameter usb1__TXTTFILLTUNING = 32'hE0003168; +parameter val_usb1__TXTTFILLTUNING = 32'h00000000; +parameter mask_usb1__TXTTFILLTUNING = 32'h00001FFF; + +parameter usb1__IC_USB = 32'hE000316C; +parameter val_usb1__IC_USB = 32'h00000000; +parameter mask_usb1__IC_USB = 32'hFFFFFFFF; + +parameter usb1__ULPI_VIEWPORT = 32'hE0003170; +parameter val_usb1__ULPI_VIEWPORT = 32'h00000000; +parameter mask_usb1__ULPI_VIEWPORT = 32'hFFFFFFFF; + +parameter usb1__ENDPTNAK = 32'hE0003178; +parameter val_usb1__ENDPTNAK = 32'h00000000; +parameter mask_usb1__ENDPTNAK = 32'hFFFFFFFF; + +parameter usb1__ENDPTNAKEN = 32'hE000317C; +parameter val_usb1__ENDPTNAKEN = 32'h00000000; +parameter mask_usb1__ENDPTNAKEN = 32'hFFFFFFFF; + +parameter usb1__CONFIGFLAG = 32'hE0003180; +parameter val_usb1__CONFIGFLAG = 32'h00000001; +parameter mask_usb1__CONFIGFLAG = 32'hFFFFFFFF; + +parameter usb1__PORTSC1 = 32'hE0003184; +parameter val_usb1__PORTSC1 = 32'h00000000; +parameter mask_usb1__PORTSC1 = 32'hFFFFFFFF; + +parameter usb1__OTGSC = 32'hE00031A4; +parameter val_usb1__OTGSC = 32'h00000020; +parameter mask_usb1__OTGSC = 32'hFFFFFFFF; + +parameter usb1__USBMODE = 32'hE00031A8; +parameter val_usb1__USBMODE = 32'h00000000; +parameter mask_usb1__USBMODE = 32'h0000FFFF; + +parameter usb1__ENDPTSETUPSTAT = 32'hE00031AC; +parameter val_usb1__ENDPTSETUPSTAT = 32'h00000000; +parameter mask_usb1__ENDPTSETUPSTAT = 32'h0000FFFF; + +parameter usb1__ENDPTPRIME = 32'hE00031B0; +parameter val_usb1__ENDPTPRIME = 32'h00000000; +parameter mask_usb1__ENDPTPRIME = 32'hFFFFFFFF; + +parameter usb1__ENDPTFLUSH = 32'hE00031B4; +parameter val_usb1__ENDPTFLUSH = 32'h00000000; +parameter mask_usb1__ENDPTFLUSH = 32'hFFFFFFFF; + +parameter usb1__ENDPTSTAT = 32'hE00031B8; +parameter val_usb1__ENDPTSTAT = 32'h00000000; +parameter mask_usb1__ENDPTSTAT = 32'hFFFFFFFF; + +parameter usb1__ENDPTCOMPLETE = 32'hE00031BC; +parameter val_usb1__ENDPTCOMPLETE = 32'h00000000; +parameter mask_usb1__ENDPTCOMPLETE = 32'hFFFFFFFF; + +parameter usb1__ENDPTCTRL0 = 32'hE00031C0; +parameter val_usb1__ENDPTCTRL0 = 32'h00800080; +parameter mask_usb1__ENDPTCTRL0 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL1 = 32'hE00031C4; +parameter val_usb1__ENDPTCTRL1 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL1 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL2 = 32'hE00031C8; +parameter val_usb1__ENDPTCTRL2 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL2 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL3 = 32'hE00031CC; +parameter val_usb1__ENDPTCTRL3 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL3 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL4 = 32'hE00031D0; +parameter val_usb1__ENDPTCTRL4 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL4 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL5 = 32'hE00031D4; +parameter val_usb1__ENDPTCTRL5 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL5 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL6 = 32'hE00031D8; +parameter val_usb1__ENDPTCTRL6 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL6 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL7 = 32'hE00031DC; +parameter val_usb1__ENDPTCTRL7 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL7 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL8 = 32'hE00031E0; +parameter val_usb1__ENDPTCTRL8 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL8 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL9 = 32'hE00031E4; +parameter val_usb1__ENDPTCTRL9 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL9 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL10 = 32'hE00031E8; +parameter val_usb1__ENDPTCTRL10 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL10 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL11 = 32'hE00031EC; +parameter val_usb1__ENDPTCTRL11 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL11 = 32'h00FFFFFF; + +parameter usb1__ENDPTCTRL12 = 32'hE00031F0; +parameter val_usb1__ENDPTCTRL12 = 32'h00000000; +parameter mask_usb1__ENDPTCTRL12 = 32'h00FFFFFF; diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_unused_ports.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_unused_ports.v new file mode 100644 index 0000000..23292b0 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/70fd/hdl/processing_system7_vip_v1_0_5_unused_ports.v @@ -0,0 +1,433 @@ +/***************************************************************************** + * File : processing_system7_vip_v1_0_5_unused_ports.v + * + * Date : 2012-11 + * + * Description : Semantic checks for unused ports. + * + *****************************************************************************/ + +/* CAN */ +assign CAN0_PHY_TX = 0; +assign CAN1_PHY_TX = 0; +always @(CAN0_PHY_RX or CAN1_PHY_RX) +begin + if(CAN0_PHY_RX | CAN1_PHY_RX) + $display("[%0d] : %0s : CAN Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* ETHERNET */ +/* ------------------------------------------- */ + +assign ENET0_GMII_TX_EN = 0; +assign ENET0_GMII_TX_ER = 0; +assign ENET0_MDIO_MDC = 0; +assign ENET0_MDIO_O = 0; /// confirm +assign ENET0_MDIO_T = 0; +assign ENET0_PTP_DELAY_REQ_RX = 0; +assign ENET0_PTP_DELAY_REQ_TX = 0; +assign ENET0_PTP_PDELAY_REQ_RX = 0; +assign ENET0_PTP_PDELAY_REQ_TX = 0; +assign ENET0_PTP_PDELAY_RESP_RX = 0; +assign ENET0_PTP_PDELAY_RESP_TX = 0; +assign ENET0_PTP_SYNC_FRAME_RX = 0; +assign ENET0_PTP_SYNC_FRAME_TX = 0; +assign ENET0_SOF_RX = 0; +assign ENET0_SOF_TX = 0; +assign ENET0_GMII_TXD = 0; +always@(ENET0_GMII_COL or ENET0_GMII_CRS or ENET0_EXT_INTIN or + ENET0_GMII_RX_CLK or ENET0_GMII_RX_DV or ENET0_GMII_RX_ER or + ENET0_GMII_TX_CLK or ENET0_MDIO_I or ENET0_GMII_RXD) +begin + if(ENET0_GMII_COL | ENET0_GMII_CRS | ENET0_EXT_INTIN | + ENET0_GMII_RX_CLK | ENET0_GMII_RX_DV | ENET0_GMII_RX_ER | + ENET0_GMII_TX_CLK | ENET0_MDIO_I ) + $display("[%0d] : %0s : ETHERNET Interface is not supported.",$time, DISP_ERR); +end + +assign ENET1_GMII_TX_EN = 0; +assign ENET1_GMII_TX_ER = 0; +assign ENET1_MDIO_MDC = 0; +assign ENET1_MDIO_O = 0;/// confirm +assign ENET1_MDIO_T = 0; +assign ENET1_PTP_DELAY_REQ_RX = 0; +assign ENET1_PTP_DELAY_REQ_TX = 0; +assign ENET1_PTP_PDELAY_REQ_RX = 0; +assign ENET1_PTP_PDELAY_REQ_TX = 0; +assign ENET1_PTP_PDELAY_RESP_RX = 0; +assign ENET1_PTP_PDELAY_RESP_TX = 0; +assign ENET1_PTP_SYNC_FRAME_RX = 0; +assign ENET1_PTP_SYNC_FRAME_TX = 0; +assign ENET1_SOF_RX = 0; +assign ENET1_SOF_TX = 0; +assign ENET1_GMII_TXD = 0; +always@(ENET1_GMII_COL or ENET1_GMII_CRS or ENET1_EXT_INTIN or + ENET1_GMII_RX_CLK or ENET1_GMII_RX_DV or ENET1_GMII_RX_ER or + ENET1_GMII_TX_CLK or ENET1_MDIO_I or ENET1_GMII_RXD) +begin + if(ENET1_GMII_COL | ENET1_GMII_CRS | ENET1_EXT_INTIN | + ENET1_GMII_RX_CLK | ENET1_GMII_RX_DV | ENET1_GMII_RX_ER | + ENET1_GMII_TX_CLK | ENET1_MDIO_I ) + $display("[%0d] : %0s : ETHERNET Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* GPIO */ +/* ------------------------------------------- */ + +assign GPIO_O = 0; +assign GPIO_T = 0; +always@(GPIO_I) +begin +if(GPIO_I !== 0) + $display("[%0d] : %0s : GPIO Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* I2C */ +/* ------------------------------------------- */ + +assign I2C0_SDA_O = 0; +assign I2C0_SDA_T = 0; +assign I2C0_SCL_O = 0; +assign I2C0_SCL_T = 0; +assign I2C1_SDA_O = 0; +assign I2C1_SDA_T = 0; +assign I2C1_SCL_O = 0; +assign I2C1_SCL_T = 0; +always@(I2C0_SDA_I or I2C0_SCL_I or I2C1_SDA_I or I2C1_SCL_I ) +begin + if(I2C0_SDA_I | I2C0_SCL_I | I2C1_SDA_I | I2C1_SCL_I) + $display("[%0d] : %0s : I2C Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* JTAG */ +/* ------------------------------------------- */ + +assign PJTAG_TD_T = 0; +assign PJTAG_TD_O = 0; +always@(PJTAG_TCK or PJTAG_TMS or PJTAG_TD_I) +begin + if(PJTAG_TCK | PJTAG_TMS | PJTAG_TD_I) + $display("[%0d] : %0s : JTAG Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* SDIO */ +/* ------------------------------------------- */ + +assign SDIO0_CLK = 0; +assign SDIO0_CMD_O = 0; +assign SDIO0_CMD_T = 0; +assign SDIO0_DATA_O = 0; +assign SDIO0_DATA_T = 0; +assign SDIO0_LED = 0; +assign SDIO0_BUSPOW = 0; +assign SDIO0_BUSVOLT = 0; +always@(SDIO0_CLK_FB or SDIO0_CMD_I or SDIO0_DATA_I or SDIO0_CDN or SDIO0_WP ) +begin + if(SDIO0_CLK_FB | SDIO0_CMD_I | SDIO0_CDN | SDIO0_WP ) + $display("[%0d] : %0s : SDIO Interface is not supported.",$time, DISP_ERR); +end + +assign SDIO1_CLK = 0; +assign SDIO1_CMD_O = 0; +assign SDIO1_CMD_T = 0; +assign SDIO1_DATA_O = 0; +assign SDIO1_DATA_T = 0; +assign SDIO1_LED = 0; +assign SDIO1_BUSPOW = 0; +assign SDIO1_BUSVOLT = 0; +always@(SDIO1_CLK_FB or SDIO1_CMD_I or SDIO1_DATA_I or SDIO1_CDN or SDIO1_WP ) +begin + if(SDIO1_CLK_FB | SDIO1_CMD_I | SDIO1_CDN | SDIO1_WP ) + $display("[%0d] : %0s : SDIO Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* SPI */ +/* ------------------------------------------- */ + +assign SPI0_SCLK_O = 0; +assign SPI0_SCLK_T = 0; +assign SPI0_MOSI_O = 0; +assign SPI0_MOSI_T = 0; +assign SPI0_MISO_O = 0; +assign SPI0_MISO_T = 0; +assign SPI0_SS_O = 0; /// confirm +assign SPI0_SS1_O = 0;/// confirm +assign SPI0_SS2_O = 0;/// confirm +assign SPI0_SS_T = 0; +always@(SPI0_SCLK_I or SPI0_MOSI_I or SPI0_MISO_I or SPI0_SS_I) +begin + if(SPI0_SCLK_I | SPI0_MOSI_I | SPI0_MISO_I | SPI0_SS_I) + $display("[%0d] : %0s : SPI Interface is not supported.",$time, DISP_ERR); +end + +assign SPI1_SCLK_O = 0; +assign SPI1_SCLK_T = 0; +assign SPI1_MOSI_O = 0; +assign SPI1_MOSI_T = 0; +assign SPI1_MISO_O = 0; +assign SPI1_MISO_T = 0; +assign SPI1_SS_O = 0; +assign SPI1_SS1_O = 0; +assign SPI1_SS2_O = 0; +assign SPI1_SS_T = 0; +always@(SPI1_SCLK_I or SPI1_MOSI_I or SPI1_MISO_I or SPI1_SS_I) +begin + if(SPI1_SCLK_I | SPI1_MOSI_I | SPI1_MISO_I | SPI1_SS_I) + $display("[%0d] : %0s : SPI Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* UART */ +/* ------------------------------------------- */ +/// confirm +assign UART0_DTRN = 0; +assign UART0_RTSN = 0; +assign UART0_TX = 0; +always@(UART0_CTSN or UART0_DCDN or UART0_DSRN or UART0_RIN or UART0_RX) +begin + if(UART0_CTSN | UART0_DCDN | UART0_DSRN | UART0_RIN | UART0_RX) + $display("[%0d] : %0s : UART Interface is not supported.",$time, DISP_ERR); +end + +assign UART1_DTRN = 0; +assign UART1_RTSN = 0; +assign UART1_TX = 0; +always@(UART1_CTSN or UART1_DCDN or UART1_DSRN or UART1_RIN or UART1_RX) +begin + if(UART1_CTSN | UART1_DCDN | UART1_DSRN | UART1_RIN | UART1_RX) + $display("[%0d] : %0s : UART Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* TTC */ +/* ------------------------------------------- */ + +assign TTC0_WAVE0_OUT = 0; +assign TTC0_WAVE1_OUT = 0; +assign TTC0_WAVE2_OUT = 0; +always@(TTC0_CLK0_IN or TTC0_CLK1_IN or TTC0_CLK2_IN) +begin + if(TTC0_CLK0_IN | TTC0_CLK1_IN | TTC0_CLK2_IN) + $display("[%0d] : %0s : TTC Interface is not supported.",$time, DISP_ERR); +end + +assign TTC1_WAVE0_OUT = 0; +assign TTC1_WAVE1_OUT = 0; +assign TTC1_WAVE2_OUT = 0; +always@(TTC1_CLK0_IN or TTC1_CLK1_IN or TTC1_CLK2_IN) +begin + if(TTC1_CLK0_IN | TTC1_CLK1_IN | TTC1_CLK2_IN) + $display("[%0d] : %0s : TTC Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* WDT */ +/* ------------------------------------------- */ + +assign WDT_RST_OUT = 0; +always@(WDT_CLK_IN) +begin + if(WDT_CLK_IN) + $display("[%0d] : %0s : WDT Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* TRACE */ +/* ------------------------------------------- */ + +assign TRACE_CTL = 0; +assign TRACE_DATA = 0; +always@(TRACE_CLK) +begin + if(TRACE_CLK) + $display("[%0d] : %0s : TRACE Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* USB */ +/* ------------------------------------------- */ +assign USB0_PORT_INDCTL = 0; +assign USB0_VBUS_PWRSELECT = 0; +always@(USB0_VBUS_PWRFAULT) +begin + if(USB0_VBUS_PWRFAULT) + $display("[%0d] : %0s : USB Interface is not supported.",$time, DISP_ERR); +end + +assign USB1_PORT_INDCTL = 0; +assign USB1_VBUS_PWRSELECT = 0; +always@(USB1_VBUS_PWRFAULT) +begin + if(USB1_VBUS_PWRFAULT) + $display("[%0d] : %0s : USB Interface is not supported.",$time, DISP_ERR); +end + +always@(SRAM_INTIN) +begin + if(SRAM_INTIN) + $display("[%0d] : %0s : SRAM_INTIN is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* DMA */ +/* ------------------------------------------- */ + +assign DMA0_DATYPE = 0; +assign DMA0_DAVALID = 0; +assign DMA0_DRREADY = 0; +assign DMA0_RSTN = 0; +always@(DMA0_ACLK or DMA0_DAREADY or DMA0_DRLAST or DMA0_DRVALID or DMA0_DRTYPE) +begin + if(DMA0_ACLK | DMA0_DAREADY | DMA0_DRLAST | DMA0_DRVALID | DMA0_DRTYPE) + $display("[%0d] : %0s : DMA Interface is not supported.",$time, DISP_ERR); +end + +assign DMA1_DATYPE = 0; +assign DMA1_DAVALID = 0; +assign DMA1_DRREADY = 0; +assign DMA1_RSTN = 0; +always@(DMA1_ACLK or DMA1_DAREADY or DMA1_DRLAST or DMA1_DRVALID or DMA1_DRTYPE) +begin + if(DMA1_ACLK | DMA1_DAREADY | DMA1_DRLAST | DMA1_DRVALID | DMA1_DRTYPE) + $display("[%0d] : %0s : DMA Interface is not supported.",$time, DISP_ERR); +end + +assign DMA2_DATYPE = 0; +assign DMA2_DAVALID = 0; +assign DMA2_DRREADY = 0; +assign DMA2_RSTN = 0; +always@(DMA2_ACLK or DMA2_DAREADY or DMA2_DRLAST or DMA2_DRVALID or DMA2_DRTYPE) +begin + if(DMA2_ACLK | DMA2_DAREADY | DMA2_DRLAST | DMA2_DRVALID | DMA2_DRTYPE) + $display("[%0d] : %0s : DMA Interface is not supported.",$time, DISP_ERR); +end + +assign DMA3_DATYPE = 0; +assign DMA3_DAVALID = 0; +assign DMA3_DRREADY = 0; +assign DMA3_RSTN = 0; +always@(DMA3_ACLK or DMA3_DAREADY or DMA3_DRLAST or DMA3_DRVALID or DMA3_DRTYPE) +begin + if(DMA3_ACLK | DMA3_DAREADY | DMA3_DRLAST | DMA3_DRVALID | DMA3_DRTYPE) + $display("[%0d] : %0s : DMA Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* FTM */ +/* ------------------------------------------- */ + +assign FTMT_F2P_TRIGACK = 0; +assign FTMT_P2F_TRIG = 0; +assign FTMT_P2F_DEBUG = 0; +always@(FTMD_TRACEIN_DATA or FTMD_TRACEIN_VALID or FTMD_TRACEIN_CLK or + FTMD_TRACEIN_ATID or FTMT_F2P_TRIG or FTMT_F2P_DEBUG or FTMT_P2F_TRIGACK) +begin + if(FTMD_TRACEIN_DATA | FTMD_TRACEIN_VALID | FTMD_TRACEIN_CLK | FTMD_TRACEIN_ATID | FTMT_F2P_TRIG | FTMT_F2P_DEBUG | FTMT_P2F_TRIGACK) + $display("[%0d] : %0s : FTM Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* EVENT */ +/* ------------------------------------------- */ + +assign EVENT_EVENTO = 0; +assign EVENT_STANDBYWFE = 0; +assign EVENT_STANDBYWFI = 0; +always@(EVENT_EVENTI) +begin + if(EVENT_EVENTI) + $display("[%0d] : %0s : EVENT Interface is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* MIO */ +/* ------------------------------------------- */ + +always@(MIO) +begin + if(MIO !== 0) + $display("[%0d] : %0s : MIO is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* FCLK_TRIG */ +/* ------------------------------------------- */ + +always@(FCLK_CLKTRIG3_N or FCLK_CLKTRIG2_N or FCLK_CLKTRIG1_N or FCLK_CLKTRIG0_N ) +begin + if(FCLK_CLKTRIG3_N | FCLK_CLKTRIG2_N | FCLK_CLKTRIG1_N | FCLK_CLKTRIG0_N ) + $display("[%0d] : %0s : FCLK_TRIG is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* MISC */ +/* ------------------------------------------- */ + +always@(FPGA_IDLE_N) +begin + if(FPGA_IDLE_N) + $display("[%0d] : %0s : FPGA_IDLE_N is not supported.",$time, DISP_ERR); +end + +always@(DDR_ARB) +begin + if(DDR_ARB !== 0) + $display("[%0d] : %0s : DDR_ARB is not supported.",$time, DISP_ERR); +end + +always@(Core0_nFIQ or Core0_nIRQ or Core1_nFIQ or Core1_nIRQ ) +begin + if(Core0_nFIQ | Core0_nIRQ | Core1_nFIQ | Core1_nIRQ) + $display("[%0d] : %0s : CORE FIQ,IRQ is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* DDR */ +/* ------------------------------------------- */ + +assign DDR_WEB = 0; +always@(DDR_Clk or DDR_CS_n) +begin +if(!DDR_CS_n) + $display("[%0d] : %0s : EXTERNAL DDR is not supported.",$time, DISP_ERR); +end + +/* ------------------------------------------- */ +/* IRQ_P2F */ +/* ------------------------------------------- */ + +assign IRQ_P2F_DMAC_ABORT = 0; +assign IRQ_P2F_DMAC0 = 0; +assign IRQ_P2F_DMAC1 = 0; +assign IRQ_P2F_DMAC2 = 0; +assign IRQ_P2F_DMAC3 = 0; +assign IRQ_P2F_DMAC4 = 0; +assign IRQ_P2F_DMAC5 = 0; +assign IRQ_P2F_DMAC6 = 0; +assign IRQ_P2F_DMAC7 = 0; +assign IRQ_P2F_SMC = 0; +assign IRQ_P2F_QSPI = 0; +assign IRQ_P2F_CTI = 0; +assign IRQ_P2F_GPIO = 0; +assign IRQ_P2F_USB0 = 0; +assign IRQ_P2F_ENET0 = 0; +assign IRQ_P2F_ENET_WAKE0 = 0; +assign IRQ_P2F_SDIO0 = 0; +assign IRQ_P2F_I2C0 = 0; +assign IRQ_P2F_SPI0 = 0; +assign IRQ_P2F_UART0 = 0; +assign IRQ_P2F_CAN0 = 0; +assign IRQ_P2F_USB1 = 0; +assign IRQ_P2F_ENET1 = 0; +assign IRQ_P2F_ENET_WAKE1 = 0; +assign IRQ_P2F_SDIO1 = 0; +assign IRQ_P2F_I2C1 = 0; +assign IRQ_P2F_SPI1 = 0; +assign IRQ_P2F_UART1 = 0; +assign IRQ_P2F_CAN1 = 0; diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_atc.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_atc.v new file mode 100644 index 0000000..98caca1 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_atc.v @@ -0,0 +1,409 @@ +//----------------------------------------------------------------------------- +//-- (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. +//----------------------------------------------------------------------------- +// +// Description: ACP Transaction Checker +// +// Check for optimized ACP transactions and flag if they are broken. +// +// +// +// Verilog-standard: Verilog 2001 +//-------------------------------------------------------------------------- +// +// Structure: +// atc +// aw_atc +// w_atc +// b_atc +// +//-------------------------------------------------------------------------- +`timescale 1ps/1ps +`default_nettype none + +module processing_system7_v5_5_atc # + ( + parameter C_FAMILY = "rtl", + // FPGA Family. Current version: virtex6, spartan6 or later. + parameter integer C_AXI_ID_WIDTH = 4, + // Width of all ID signals on SI and MI side of checker. + // Range: >= 1. + parameter integer C_AXI_ADDR_WIDTH = 32, + // Width of all ADDR signals on SI and MI side of checker. + // Range: 32. + parameter integer C_AXI_DATA_WIDTH = 64, + // Width of all DATA signals on SI and MI side of checker. + // Range: 64. + parameter integer C_AXI_AWUSER_WIDTH = 1, + // Width of AWUSER signals. + // Range: >= 1. + parameter integer C_AXI_ARUSER_WIDTH = 1, + // Width of ARUSER signals. + // Range: >= 1. + parameter integer C_AXI_WUSER_WIDTH = 1, + // Width of WUSER signals. + // Range: >= 1. + parameter integer C_AXI_RUSER_WIDTH = 1, + // Width of RUSER signals. + // Range: >= 1. + parameter integer C_AXI_BUSER_WIDTH = 1 + // Width of BUSER signals. + // Range: >= 1. + ) + ( + // Global Signals + input wire ACLK, + input wire ARESETN, + + // Slave Interface Write Address Ports + input wire [C_AXI_ID_WIDTH-1:0] S_AXI_AWID, + input wire [C_AXI_ADDR_WIDTH-1:0] S_AXI_AWADDR, + input wire [4-1:0] S_AXI_AWLEN, + input wire [3-1:0] S_AXI_AWSIZE, + input wire [2-1:0] S_AXI_AWBURST, + input wire [2-1:0] S_AXI_AWLOCK, + input wire [4-1:0] S_AXI_AWCACHE, + input wire [3-1:0] S_AXI_AWPROT, + input wire [C_AXI_AWUSER_WIDTH-1:0] S_AXI_AWUSER, + input wire S_AXI_AWVALID, + output wire S_AXI_AWREADY, + // Slave Interface Write Data Ports + input wire [C_AXI_ID_WIDTH-1:0] S_AXI_WID, + input wire [C_AXI_DATA_WIDTH-1:0] S_AXI_WDATA, + input wire [C_AXI_DATA_WIDTH/8-1:0] S_AXI_WSTRB, + input wire S_AXI_WLAST, + input wire [C_AXI_WUSER_WIDTH-1:0] S_AXI_WUSER, + input wire S_AXI_WVALID, + output wire S_AXI_WREADY, + // Slave Interface Write Response Ports + output wire [C_AXI_ID_WIDTH-1:0] S_AXI_BID, + output wire [2-1:0] S_AXI_BRESP, + output wire [C_AXI_BUSER_WIDTH-1:0] S_AXI_BUSER, + output wire S_AXI_BVALID, + input wire S_AXI_BREADY, + // Slave Interface Read Address Ports + input wire [C_AXI_ID_WIDTH-1:0] S_AXI_ARID, + input wire [C_AXI_ADDR_WIDTH-1:0] S_AXI_ARADDR, + input wire [4-1:0] S_AXI_ARLEN, + input wire [3-1:0] S_AXI_ARSIZE, + input wire [2-1:0] S_AXI_ARBURST, + input wire [2-1:0] S_AXI_ARLOCK, + input wire [4-1:0] S_AXI_ARCACHE, + input wire [3-1:0] S_AXI_ARPROT, + input wire [C_AXI_ARUSER_WIDTH-1:0] S_AXI_ARUSER, + input wire S_AXI_ARVALID, + output wire S_AXI_ARREADY, + // Slave Interface Read Data Ports + output wire [C_AXI_ID_WIDTH-1:0] S_AXI_RID, + output wire [C_AXI_DATA_WIDTH-1:0] S_AXI_RDATA, + output wire [2-1:0] S_AXI_RRESP, + output wire S_AXI_RLAST, + output wire [C_AXI_RUSER_WIDTH-1:0] S_AXI_RUSER, + output wire S_AXI_RVALID, + input wire S_AXI_RREADY, + + // Master Interface Write Address Port + output wire [C_AXI_ID_WIDTH-1:0] M_AXI_AWID, + output wire [C_AXI_ADDR_WIDTH-1:0] M_AXI_AWADDR, + output wire [4-1:0] M_AXI_AWLEN, + output wire [3-1:0] M_AXI_AWSIZE, + output wire [2-1:0] M_AXI_AWBURST, + output wire [2-1:0] M_AXI_AWLOCK, + output wire [4-1:0] M_AXI_AWCACHE, + output wire [3-1:0] M_AXI_AWPROT, + output wire [C_AXI_AWUSER_WIDTH-1:0] M_AXI_AWUSER, + output wire M_AXI_AWVALID, + input wire M_AXI_AWREADY, + // Master Interface Write Data Ports + output wire [C_AXI_ID_WIDTH-1:0] M_AXI_WID, + output wire [C_AXI_DATA_WIDTH-1:0] M_AXI_WDATA, + output wire [C_AXI_DATA_WIDTH/8-1:0] M_AXI_WSTRB, + output wire M_AXI_WLAST, + output wire [C_AXI_WUSER_WIDTH-1:0] M_AXI_WUSER, + output wire M_AXI_WVALID, + input wire M_AXI_WREADY, + // Master Interface Write Response Ports + input wire [C_AXI_ID_WIDTH-1:0] M_AXI_BID, + input wire [2-1:0] M_AXI_BRESP, + input wire [C_AXI_BUSER_WIDTH-1:0] M_AXI_BUSER, + input wire M_AXI_BVALID, + output wire M_AXI_BREADY, + // Master Interface Read Address Port + output wire [C_AXI_ID_WIDTH-1:0] M_AXI_ARID, + output wire [C_AXI_ADDR_WIDTH-1:0] M_AXI_ARADDR, + output wire [4-1:0] M_AXI_ARLEN, + output wire [3-1:0] M_AXI_ARSIZE, + output wire [2-1:0] M_AXI_ARBURST, + output wire [2-1:0] M_AXI_ARLOCK, + output wire [4-1:0] M_AXI_ARCACHE, + output wire [3-1:0] M_AXI_ARPROT, + output wire [C_AXI_ARUSER_WIDTH-1:0] M_AXI_ARUSER, + output wire M_AXI_ARVALID, + input wire M_AXI_ARREADY, + // Master Interface Read Data Ports + input wire [C_AXI_ID_WIDTH-1:0] M_AXI_RID, + input wire [C_AXI_DATA_WIDTH-1:0] M_AXI_RDATA, + input wire [2-1:0] M_AXI_RRESP, + input wire M_AXI_RLAST, + input wire [C_AXI_RUSER_WIDTH-1:0] M_AXI_RUSER, + input wire M_AXI_RVALID, + output wire M_AXI_RREADY, + + output wire ERROR_TRIGGER, + output wire [C_AXI_ID_WIDTH-1:0] ERROR_TRANSACTION_ID + ); + + + ///////////////////////////////////////////////////////////////////////////// + // Functions + ///////////////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////////////// + // Local params + ///////////////////////////////////////////////////////////////////////////// + + localparam C_FIFO_DEPTH_LOG = 4; + + + ///////////////////////////////////////////////////////////////////////////// + // Internal signals + ///////////////////////////////////////////////////////////////////////////// + + // Internal reset. + reg ARESET; + + // AW->W command queue signals. + wire cmd_w_valid; + wire cmd_w_check; + wire [C_AXI_ID_WIDTH-1:0] cmd_w_id; + wire cmd_w_ready; + + // W->B command queue signals. + wire cmd_b_push; + wire cmd_b_error; + wire [C_AXI_ID_WIDTH-1:0] cmd_b_id; + wire cmd_b_full; + wire [C_FIFO_DEPTH_LOG-1:0] cmd_b_addr; + wire cmd_b_ready; + + + ///////////////////////////////////////////////////////////////////////////// + // Handle Internal Reset + ///////////////////////////////////////////////////////////////////////////// + always @ (posedge ACLK) begin + ARESET <= !ARESETN; + end + + + ///////////////////////////////////////////////////////////////////////////// + // Handle Write Channels (AW/W/B) + ///////////////////////////////////////////////////////////////////////////// + + // Write Address Channel. + processing_system7_v5_5_aw_atc # + ( + .C_FAMILY (C_FAMILY), + .C_AXI_ID_WIDTH (C_AXI_ID_WIDTH), + .C_AXI_ADDR_WIDTH (C_AXI_ADDR_WIDTH), + .C_AXI_AWUSER_WIDTH (C_AXI_AWUSER_WIDTH), + .C_FIFO_DEPTH_LOG (C_FIFO_DEPTH_LOG) + ) write_addr_inst + ( + // Global Signals + .ARESET (ARESET), + .ACLK (ACLK), + + // Command Interface (Out) + .cmd_w_valid (cmd_w_valid), + .cmd_w_check (cmd_w_check), + .cmd_w_id (cmd_w_id), + .cmd_w_ready (cmd_w_ready), + .cmd_b_addr (cmd_b_addr), + .cmd_b_ready (cmd_b_ready), + + // Slave Interface Write Address Ports + .S_AXI_AWID (S_AXI_AWID), + .S_AXI_AWADDR (S_AXI_AWADDR), + .S_AXI_AWLEN (S_AXI_AWLEN), + .S_AXI_AWSIZE (S_AXI_AWSIZE), + .S_AXI_AWBURST (S_AXI_AWBURST), + .S_AXI_AWLOCK (S_AXI_AWLOCK), + .S_AXI_AWCACHE (S_AXI_AWCACHE), + .S_AXI_AWPROT (S_AXI_AWPROT), + .S_AXI_AWUSER (S_AXI_AWUSER), + .S_AXI_AWVALID (S_AXI_AWVALID), + .S_AXI_AWREADY (S_AXI_AWREADY), + + // Master Interface Write Address Port + .M_AXI_AWID (M_AXI_AWID), + .M_AXI_AWADDR (M_AXI_AWADDR), + .M_AXI_AWLEN (M_AXI_AWLEN), + .M_AXI_AWSIZE (M_AXI_AWSIZE), + .M_AXI_AWBURST (M_AXI_AWBURST), + .M_AXI_AWLOCK (M_AXI_AWLOCK), + .M_AXI_AWCACHE (M_AXI_AWCACHE), + .M_AXI_AWPROT (M_AXI_AWPROT), + .M_AXI_AWUSER (M_AXI_AWUSER), + .M_AXI_AWVALID (M_AXI_AWVALID), + .M_AXI_AWREADY (M_AXI_AWREADY) + ); + + // Write Data channel. + processing_system7_v5_5_w_atc # + ( + .C_FAMILY (C_FAMILY), + .C_AXI_ID_WIDTH (C_AXI_ID_WIDTH), + .C_AXI_DATA_WIDTH (C_AXI_DATA_WIDTH), + .C_AXI_WUSER_WIDTH (C_AXI_WUSER_WIDTH) + ) write_data_inst + ( + // Global Signals + .ARESET (ARESET), + .ACLK (ACLK), + + // Command Interface (In) + .cmd_w_valid (cmd_w_valid), + .cmd_w_check (cmd_w_check), + .cmd_w_id (cmd_w_id), + .cmd_w_ready (cmd_w_ready), + + // Command Interface (Out) + .cmd_b_push (cmd_b_push), + .cmd_b_error (cmd_b_error), + .cmd_b_id (cmd_b_id), + .cmd_b_full (cmd_b_full), + + // Slave Interface Write Data Ports + .S_AXI_WID (S_AXI_WID), + .S_AXI_WDATA (S_AXI_WDATA), + .S_AXI_WSTRB (S_AXI_WSTRB), + .S_AXI_WLAST (S_AXI_WLAST), + .S_AXI_WUSER (S_AXI_WUSER), + .S_AXI_WVALID (S_AXI_WVALID), + .S_AXI_WREADY (S_AXI_WREADY), + + // Master Interface Write Data Ports + .M_AXI_WID (M_AXI_WID), + .M_AXI_WDATA (M_AXI_WDATA), + .M_AXI_WSTRB (M_AXI_WSTRB), + .M_AXI_WLAST (M_AXI_WLAST), + .M_AXI_WUSER (M_AXI_WUSER), + .M_AXI_WVALID (M_AXI_WVALID), + .M_AXI_WREADY (M_AXI_WREADY) + ); + + // Write Response channel. + processing_system7_v5_5_b_atc # + ( + .C_FAMILY (C_FAMILY), + .C_AXI_ID_WIDTH (C_AXI_ID_WIDTH), + .C_AXI_BUSER_WIDTH (C_AXI_BUSER_WIDTH), + .C_FIFO_DEPTH_LOG (C_FIFO_DEPTH_LOG) + ) write_response_inst + ( + // Global Signals + .ARESET (ARESET), + .ACLK (ACLK), + + // Command Interface (In) + .cmd_b_push (cmd_b_push), + .cmd_b_error (cmd_b_error), + .cmd_b_id (cmd_b_id), + .cmd_b_full (cmd_b_full), + .cmd_b_addr (cmd_b_addr), + .cmd_b_ready (cmd_b_ready), + + // Slave Interface Write Response Ports + .S_AXI_BID (S_AXI_BID), + .S_AXI_BRESP (S_AXI_BRESP), + .S_AXI_BUSER (S_AXI_BUSER), + .S_AXI_BVALID (S_AXI_BVALID), + .S_AXI_BREADY (S_AXI_BREADY), + + // Master Interface Write Response Ports + .M_AXI_BID (M_AXI_BID), + .M_AXI_BRESP (M_AXI_BRESP), + .M_AXI_BUSER (M_AXI_BUSER), + .M_AXI_BVALID (M_AXI_BVALID), + .M_AXI_BREADY (M_AXI_BREADY), + + // Trigger detection + .ERROR_TRIGGER (ERROR_TRIGGER), + .ERROR_TRANSACTION_ID (ERROR_TRANSACTION_ID) + ); + + + + ///////////////////////////////////////////////////////////////////////////// + // Handle Read Channels (AR/R) + ///////////////////////////////////////////////////////////////////////////// + // Read Address Port + assign M_AXI_ARID = S_AXI_ARID; + assign M_AXI_ARADDR = S_AXI_ARADDR; + assign M_AXI_ARLEN = S_AXI_ARLEN; + assign M_AXI_ARSIZE = S_AXI_ARSIZE; + assign M_AXI_ARBURST = S_AXI_ARBURST; + assign M_AXI_ARLOCK = S_AXI_ARLOCK; + assign M_AXI_ARCACHE = S_AXI_ARCACHE; + assign M_AXI_ARPROT = S_AXI_ARPROT; + assign M_AXI_ARUSER = S_AXI_ARUSER; + assign M_AXI_ARVALID = S_AXI_ARVALID; + assign S_AXI_ARREADY = M_AXI_ARREADY; + + // Read Data Port + assign S_AXI_RID = M_AXI_RID; + assign S_AXI_RDATA = M_AXI_RDATA; + assign S_AXI_RRESP = M_AXI_RRESP; + assign S_AXI_RLAST = M_AXI_RLAST; + assign S_AXI_RUSER = M_AXI_RUSER; + assign S_AXI_RVALID = M_AXI_RVALID; + assign M_AXI_RREADY = S_AXI_RREADY; + + +endmodule +`default_nettype wire diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_aw_atc.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_aw_atc.v new file mode 100644 index 0000000..25bbc9d --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_aw_atc.v @@ -0,0 +1,298 @@ +// -- (c) Copyright 2010 - 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. +//----------------------------------------------------------------------------- +// +// Description: Address Write Channel for ATC +// +// +// Verilog-standard: Verilog 2001 +//-------------------------------------------------------------------------- +// +// Structure: +// aw_atc +// +//-------------------------------------------------------------------------- +`timescale 1ps/1ps + + +module processing_system7_v5_5_aw_atc # + ( + parameter C_FAMILY = "rtl", + // FPGA Family. Current version: virtex6, spartan6 or later. + parameter integer C_AXI_ID_WIDTH = 4, + // Width of all ID signals on SI and MI side of checker. + // Range: >= 1. + parameter integer C_AXI_ADDR_WIDTH = 32, + // Width of all ADDR signals on SI and MI side of checker. + // Range: 32. + parameter integer C_AXI_AWUSER_WIDTH = 1, + // Width of AWUSER signals. + // Range: >= 1. + parameter integer C_FIFO_DEPTH_LOG = 4 + ) + ( + // Global Signals + input wire ARESET, + input wire ACLK, + + // Command Interface + output reg cmd_w_valid, + output wire cmd_w_check, + output wire [C_AXI_ID_WIDTH-1:0] cmd_w_id, + input wire cmd_w_ready, + input wire [C_FIFO_DEPTH_LOG-1:0] cmd_b_addr, + input wire cmd_b_ready, + + // Slave Interface Write Address Port + input wire [C_AXI_ID_WIDTH-1:0] S_AXI_AWID, + input wire [C_AXI_ADDR_WIDTH-1:0] S_AXI_AWADDR, + input wire [4-1:0] S_AXI_AWLEN, + input wire [3-1:0] S_AXI_AWSIZE, + input wire [2-1:0] S_AXI_AWBURST, + input wire [2-1:0] S_AXI_AWLOCK, + input wire [4-1:0] S_AXI_AWCACHE, + input wire [3-1:0] S_AXI_AWPROT, + input wire [C_AXI_AWUSER_WIDTH-1:0] S_AXI_AWUSER, + input wire S_AXI_AWVALID, + output wire S_AXI_AWREADY, + + // Master Interface Write Address Port + output wire [C_AXI_ID_WIDTH-1:0] M_AXI_AWID, + output wire [C_AXI_ADDR_WIDTH-1:0] M_AXI_AWADDR, + output wire [4-1:0] M_AXI_AWLEN, + output wire [3-1:0] M_AXI_AWSIZE, + output wire [2-1:0] M_AXI_AWBURST, + output wire [2-1:0] M_AXI_AWLOCK, + output wire [4-1:0] M_AXI_AWCACHE, + output wire [3-1:0] M_AXI_AWPROT, + output wire [C_AXI_AWUSER_WIDTH-1:0] M_AXI_AWUSER, + output wire M_AXI_AWVALID, + input wire M_AXI_AWREADY + ); + + + ///////////////////////////////////////////////////////////////////////////// + // Local params + ///////////////////////////////////////////////////////////////////////////// + + // Constants for burst types. + localparam [2-1:0] C_FIX_BURST = 2'b00; + localparam [2-1:0] C_INCR_BURST = 2'b01; + localparam [2-1:0] C_WRAP_BURST = 2'b10; + + // Constants for size. + localparam [3-1:0] C_OPTIMIZED_SIZE = 3'b011; + + // Constants for length. + localparam [4-1:0] C_OPTIMIZED_LEN = 4'b0011; + + // Constants for cacheline address. + localparam [4-1:0] C_NO_ADDR_OFFSET = 5'b0; + + // Command FIFO settings + localparam C_FIFO_WIDTH = C_AXI_ID_WIDTH + 1; + localparam C_FIFO_DEPTH = 2 ** C_FIFO_DEPTH_LOG; + + + ///////////////////////////////////////////////////////////////////////////// + // Variables for generating parameter controlled instances. + ///////////////////////////////////////////////////////////////////////////// + + integer index; + + + ///////////////////////////////////////////////////////////////////////////// + // Functions + ///////////////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////////////// + // Internal signals + ///////////////////////////////////////////////////////////////////////////// + + // Transaction properties. + wire access_is_incr; + wire access_is_wrap; + wire access_is_coherent; + wire access_optimized_size; + wire incr_addr_boundary; + wire incr_is_optimized; + wire wrap_is_optimized; + wire access_is_optimized; + + // Command FIFO. + wire cmd_w_push; + reg cmd_full; + reg [C_FIFO_DEPTH_LOG-1:0] addr_ptr; + wire [C_FIFO_DEPTH_LOG-1:0] all_addr_ptr; + reg [C_FIFO_WIDTH-1:0] data_srl[C_FIFO_DEPTH-1:0]; + + + ///////////////////////////////////////////////////////////////////////////// + // Transaction Decode: + // + // Detect if transaction is of correct typ, size and length to qualify as + // an optimized transaction that has to be checked for errors. + // + ///////////////////////////////////////////////////////////////////////////// + + // Transaction burst type. + assign access_is_incr = ( S_AXI_AWBURST == C_INCR_BURST ); + assign access_is_wrap = ( S_AXI_AWBURST == C_WRAP_BURST ); + + // Transaction has to be Coherent. + assign access_is_coherent = ( S_AXI_AWUSER[0] == 1'b1 ) & + ( S_AXI_AWCACHE[1] == 1'b1 ); + + // Transaction cacheline boundary address. + assign incr_addr_boundary = ( S_AXI_AWADDR[4:0] == C_NO_ADDR_OFFSET ); + + // Transaction length & size. + assign access_optimized_size = ( S_AXI_AWSIZE == C_OPTIMIZED_SIZE ) & + ( S_AXI_AWLEN == C_OPTIMIZED_LEN ); + + // Transaction is optimized. + assign incr_is_optimized = access_is_incr & access_is_coherent & access_optimized_size & incr_addr_boundary; + assign wrap_is_optimized = access_is_wrap & access_is_coherent & access_optimized_size; + assign access_is_optimized = ( incr_is_optimized | wrap_is_optimized ); + + + ///////////////////////////////////////////////////////////////////////////// + // Command FIFO: + // + // Since supported write interleaving is only 1, it is safe to use only a + // simple SRL based FIFO as a command queue. + // + ///////////////////////////////////////////////////////////////////////////// + + // Determine when transaction infromation is pushed to the FIFO. + assign cmd_w_push = S_AXI_AWVALID & M_AXI_AWREADY & ~cmd_full; + + // SRL FIFO Pointer. + always @ (posedge ACLK) begin + if (ARESET) begin + addr_ptr <= {C_FIFO_DEPTH_LOG{1'b1}}; + end else begin + if ( cmd_w_push & ~cmd_w_ready ) begin + addr_ptr <= addr_ptr + 1; + end else if ( ~cmd_w_push & cmd_w_ready ) begin + addr_ptr <= addr_ptr - 1; + end + end + end + + // Total number of buffered commands. + assign all_addr_ptr = addr_ptr + cmd_b_addr + 2; + + // FIFO Flags. + always @ (posedge ACLK) begin + if (ARESET) begin + cmd_full <= 1'b0; + cmd_w_valid <= 1'b0; + end else begin + if ( cmd_w_push & ~cmd_w_ready ) begin + cmd_w_valid <= 1'b1; + end else if ( ~cmd_w_push & cmd_w_ready ) begin + cmd_w_valid <= ( addr_ptr != 0 ); + end + if ( cmd_w_push & ~cmd_b_ready ) begin + // Going to full. + cmd_full <= ( all_addr_ptr == C_FIFO_DEPTH-3 ); + end else if ( ~cmd_w_push & cmd_b_ready ) begin + // Pop in middle of queue doesn't affect full status. + cmd_full <= ( all_addr_ptr == C_FIFO_DEPTH-2 ); + end + end + end + + // Infere SRL for storage. + always @ (posedge ACLK) begin + if ( cmd_w_push ) begin + for (index = 0; index < C_FIFO_DEPTH-1 ; index = index + 1) begin + data_srl[index+1] <= data_srl[index]; + end + data_srl[0] <= {access_is_optimized, S_AXI_AWID}; + end + end + + // Get current transaction info. + assign {cmd_w_check, cmd_w_id} = data_srl[addr_ptr]; + + + ///////////////////////////////////////////////////////////////////////////// + // Transaction Throttling: + // + // Stall commands if FIFO is full. + // + ///////////////////////////////////////////////////////////////////////////// + + // Propagate masked valid. + assign M_AXI_AWVALID = S_AXI_AWVALID & ~cmd_full; + + // Return ready with push back. + assign S_AXI_AWREADY = M_AXI_AWREADY & ~cmd_full; + + + ///////////////////////////////////////////////////////////////////////////// + // Address Write propagation: + // + // All information is simply forwarded on from the SI- to MI-Side untouched. + // + ///////////////////////////////////////////////////////////////////////////// + + // 1:1 mapping. + assign M_AXI_AWID = S_AXI_AWID; + assign M_AXI_AWADDR = S_AXI_AWADDR; + assign M_AXI_AWLEN = S_AXI_AWLEN; + assign M_AXI_AWSIZE = S_AXI_AWSIZE; + assign M_AXI_AWBURST = S_AXI_AWBURST; + assign M_AXI_AWLOCK = S_AXI_AWLOCK; + assign M_AXI_AWCACHE = S_AXI_AWCACHE; + assign M_AXI_AWPROT = S_AXI_AWPROT; + assign M_AXI_AWUSER = S_AXI_AWUSER; + + +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_b_atc.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_b_atc.v new file mode 100644 index 0000000..36f280f --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_b_atc.v @@ -0,0 +1,413 @@ +// -- (c) Copyright 2010 - 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. +//----------------------------------------------------------------------------- +// +// Description: Write Response Channel for ATC +// +// +// Verilog-standard: Verilog 2001 +//-------------------------------------------------------------------------- +// +// Structure: +// b_atc +// +//-------------------------------------------------------------------------- +`timescale 1ps/1ps + + +module processing_system7_v5_5_b_atc # + ( + parameter C_FAMILY = "rtl", + // FPGA Family. Current version: virtex6, spartan6 or later. + parameter integer C_AXI_ID_WIDTH = 4, + // Width of all ID signals on SI and MI side of checker. + // Range: >= 1. + parameter integer C_AXI_BUSER_WIDTH = 1, + // Width of AWUSER signals. + // Range: >= 1. + parameter integer C_FIFO_DEPTH_LOG = 4 + ) + ( + // Global Signals + input wire ARESET, + input wire ACLK, + + // Command Interface + input wire cmd_b_push, + input wire cmd_b_error, + input wire [C_AXI_ID_WIDTH-1:0] cmd_b_id, + output wire cmd_b_ready, + output wire [C_FIFO_DEPTH_LOG-1:0] cmd_b_addr, + output reg cmd_b_full, + + // Slave Interface Write Response Ports + output wire [C_AXI_ID_WIDTH-1:0] S_AXI_BID, + output reg [2-1:0] S_AXI_BRESP, + output wire [C_AXI_BUSER_WIDTH-1:0] S_AXI_BUSER, + output wire S_AXI_BVALID, + input wire S_AXI_BREADY, + + // Master Interface Write Response Ports + input wire [C_AXI_ID_WIDTH-1:0] M_AXI_BID, + input wire [2-1:0] M_AXI_BRESP, + input wire [C_AXI_BUSER_WIDTH-1:0] M_AXI_BUSER, + input wire M_AXI_BVALID, + output wire M_AXI_BREADY, + + // Trigger detection + output reg ERROR_TRIGGER, + output reg [C_AXI_ID_WIDTH-1:0] ERROR_TRANSACTION_ID + ); + + + ///////////////////////////////////////////////////////////////////////////// + // Local params + ///////////////////////////////////////////////////////////////////////////// + + // Constants for packing levels. + localparam [2-1:0] C_RESP_OKAY = 2'b00; + localparam [2-1:0] C_RESP_EXOKAY = 2'b01; + localparam [2-1:0] C_RESP_SLVERROR = 2'b10; + localparam [2-1:0] C_RESP_DECERR = 2'b11; + + // Command FIFO settings + localparam C_FIFO_WIDTH = C_AXI_ID_WIDTH + 1; + localparam C_FIFO_DEPTH = 2 ** C_FIFO_DEPTH_LOG; + + + ///////////////////////////////////////////////////////////////////////////// + // Variables for generating parameter controlled instances. + ///////////////////////////////////////////////////////////////////////////// + + integer index; + + + ///////////////////////////////////////////////////////////////////////////// + // Functions + ///////////////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////////////// + // Internal signals + ///////////////////////////////////////////////////////////////////////////// + + // Command Queue. + reg [C_FIFO_DEPTH_LOG-1:0] addr_ptr; + reg [C_FIFO_WIDTH-1:0] data_srl[C_FIFO_DEPTH-1:0]; + reg cmd_b_valid; + wire cmd_b_ready_i; + wire inject_error; + wire [C_AXI_ID_WIDTH-1:0] current_id; + + // Search command. + wire found_match; + wire use_match; + wire matching_id; + + // Manage valid command. + wire write_valid_cmd; + reg [C_FIFO_DEPTH-2:0] valid_cmd; + reg [C_FIFO_DEPTH-2:0] updated_valid_cmd; + reg [C_FIFO_DEPTH-2:0] next_valid_cmd; + reg [C_FIFO_DEPTH_LOG-1:0] search_addr_ptr; + reg [C_FIFO_DEPTH_LOG-1:0] collapsed_addr_ptr; + + // Pipelined data + reg [C_AXI_ID_WIDTH-1:0] M_AXI_BID_I; + reg [2-1:0] M_AXI_BRESP_I; + reg [C_AXI_BUSER_WIDTH-1:0] M_AXI_BUSER_I; + reg M_AXI_BVALID_I; + wire M_AXI_BREADY_I; + + + ///////////////////////////////////////////////////////////////////////////// + // Command Queue: + // + // Keep track of depth of Queue to generate full flag. + // + // Also generate valid to mark pressence of commands in Queue. + // + // Maintain Queue and extract data from currently searched entry. + // + ///////////////////////////////////////////////////////////////////////////// + + // SRL FIFO Pointer. + always @ (posedge ACLK) begin + if (ARESET) begin + addr_ptr <= {C_FIFO_DEPTH_LOG{1'b1}}; + end else begin + if ( cmd_b_push & ~cmd_b_ready_i ) begin + // Pushing data increase length/addr. + addr_ptr <= addr_ptr + 1; + end else if ( cmd_b_ready_i ) begin + // Collapse addr when data is popped. + addr_ptr <= collapsed_addr_ptr; + end + end + end + + // FIFO Flags. + always @ (posedge ACLK) begin + if (ARESET) begin + cmd_b_full <= 1'b0; + cmd_b_valid <= 1'b0; + end else begin + if ( cmd_b_push & ~cmd_b_ready_i ) begin + cmd_b_full <= ( addr_ptr == C_FIFO_DEPTH-3 ); + cmd_b_valid <= 1'b1; + end else if ( ~cmd_b_push & cmd_b_ready_i ) begin + cmd_b_full <= 1'b0; + cmd_b_valid <= ( collapsed_addr_ptr != C_FIFO_DEPTH-1 ); + end + end + end + + // Infere SRL for storage. + always @ (posedge ACLK) begin + if ( cmd_b_push ) begin + for (index = 0; index < C_FIFO_DEPTH-1 ; index = index + 1) begin + data_srl[index+1] <= data_srl[index]; + end + data_srl[0] <= {cmd_b_error, cmd_b_id}; + end + end + + // Get current transaction info. + assign {inject_error, current_id} = data_srl[search_addr_ptr]; + + // Assign outputs. + assign cmd_b_addr = collapsed_addr_ptr; + + + ///////////////////////////////////////////////////////////////////////////// + // Search Command Queue: + // + // Search for matching valid command in queue. + // + // A command is found when an valid entry with correct ID is found. The queue + // is search from the oldest entry, i.e. from a high value. + // When new commands are pushed the search address has to be updated to always + // start the search from the oldest available. + // + ///////////////////////////////////////////////////////////////////////////// + + // Handle search addr. + always @ (posedge ACLK) begin + if (ARESET) begin + search_addr_ptr <= {C_FIFO_DEPTH_LOG{1'b1}}; + end else begin + if ( cmd_b_ready_i ) begin + // Collapse addr when data is popped. + search_addr_ptr <= collapsed_addr_ptr; + + end else if ( M_AXI_BVALID_I & cmd_b_valid & ~found_match & ~cmd_b_push ) begin + // Skip non valid command. + search_addr_ptr <= search_addr_ptr - 1; + + end else if ( cmd_b_push ) begin + search_addr_ptr <= search_addr_ptr + 1; + + end + end + end + + // Check if searched command is valid and match ID (for existing response on MI side). + assign matching_id = ( M_AXI_BID_I == current_id ); + assign found_match = valid_cmd[search_addr_ptr] & matching_id & M_AXI_BVALID_I; + assign use_match = found_match & S_AXI_BREADY; + + + ///////////////////////////////////////////////////////////////////////////// + // Track Used Commands: + // + // Actions that affect Valid Command: + // * When a new command is pushed + // => Shift valid vector one step + // * When a command is used + // => Clear corresponding valid bit + // + ///////////////////////////////////////////////////////////////////////////// + + // Valid command status is updated when a command is used or a new one is pushed. + assign write_valid_cmd = cmd_b_push | cmd_b_ready_i; + + // Update the used command valid bit. + always @ * + begin + updated_valid_cmd = valid_cmd; + updated_valid_cmd[search_addr_ptr] = ~use_match; + end + + // Shift valid vector when command is pushed. + always @ * + begin + if ( cmd_b_push ) begin + next_valid_cmd = {updated_valid_cmd[C_FIFO_DEPTH-3:0], 1'b1}; + end else begin + next_valid_cmd = updated_valid_cmd; + end + end + + // Valid signals for next cycle. + always @ (posedge ACLK) begin + if (ARESET) begin + valid_cmd <= {C_FIFO_WIDTH{1'b0}}; + end else if ( write_valid_cmd ) begin + valid_cmd <= next_valid_cmd; + end + end + + // Detect oldest available command in Queue. + always @ * + begin + // Default to empty. + collapsed_addr_ptr = {C_FIFO_DEPTH_LOG{1'b1}}; + + for (index = 0; index < C_FIFO_DEPTH-2 ; index = index + 1) begin + if ( next_valid_cmd[index] ) begin + collapsed_addr_ptr = index; + end + end + end + + + ///////////////////////////////////////////////////////////////////////////// + // Pipe incoming data: + // + // The B channel is piped to improve timing and avoid impact in search + // mechanism due to late arriving signals. + // + ///////////////////////////////////////////////////////////////////////////// + + // Clock data. + always @ (posedge ACLK) begin + if (ARESET) begin + M_AXI_BID_I <= {C_AXI_ID_WIDTH{1'b0}}; + M_AXI_BRESP_I <= 2'b00; + M_AXI_BUSER_I <= {C_AXI_BUSER_WIDTH{1'b0}}; + M_AXI_BVALID_I <= 1'b0; + end else begin + if ( M_AXI_BREADY_I | ~M_AXI_BVALID_I ) begin + M_AXI_BVALID_I <= 1'b0; + end + if (M_AXI_BVALID & ( M_AXI_BREADY_I | ~M_AXI_BVALID_I) ) begin + M_AXI_BID_I <= M_AXI_BID; + M_AXI_BRESP_I <= M_AXI_BRESP; + M_AXI_BUSER_I <= M_AXI_BUSER; + M_AXI_BVALID_I <= 1'b1; + end + end + end + + // Generate ready to get new transaction. + assign M_AXI_BREADY = M_AXI_BREADY_I | ~M_AXI_BVALID_I; + + + ///////////////////////////////////////////////////////////////////////////// + // Inject Error: + // + // BRESP is modified according to command information. + // + ///////////////////////////////////////////////////////////////////////////// + + // Inject error in response. + always @ * + begin + if ( inject_error ) begin + S_AXI_BRESP = C_RESP_SLVERROR; + end else begin + S_AXI_BRESP = M_AXI_BRESP_I; + end + end + + // Handle interrupt generation. + always @ (posedge ACLK) begin + if (ARESET) begin + ERROR_TRIGGER <= 1'b0; + ERROR_TRANSACTION_ID <= {C_AXI_ID_WIDTH{1'b0}}; + end else begin + if ( inject_error & cmd_b_ready_i ) begin + ERROR_TRIGGER <= 1'b1; + ERROR_TRANSACTION_ID <= M_AXI_BID_I; + end else begin + ERROR_TRIGGER <= 1'b0; + end + end + end + + + ///////////////////////////////////////////////////////////////////////////// + // Transaction Throttling: + // + // Response is passed forward when a matching entry has been found in queue. + // Both ready and valid are set when the command is completed. + // + ///////////////////////////////////////////////////////////////////////////// + + // Propagate masked valid. + assign S_AXI_BVALID = M_AXI_BVALID_I & cmd_b_valid & found_match; + + // Return ready with push back. + assign M_AXI_BREADY_I = cmd_b_valid & use_match; + + // Command has been handled. + assign cmd_b_ready_i = M_AXI_BVALID_I & cmd_b_valid & use_match; + assign cmd_b_ready = cmd_b_ready_i; + + + ///////////////////////////////////////////////////////////////////////////// + // Write Response Propagation: + // + // All information is simply forwarded on from MI- to SI-Side untouched. + // + ///////////////////////////////////////////////////////////////////////////// + + // 1:1 mapping. + assign S_AXI_BID = M_AXI_BID_I; + assign S_AXI_BUSER = M_AXI_BUSER_I; + + +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_trace_buffer.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_trace_buffer.v new file mode 100644 index 0000000..0c776b3 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_trace_buffer.v @@ -0,0 +1,310 @@ +// -- (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. +//----------------------------------------------------------------------------- +// Filename: trace_buffer.v +// Description: Trace port buffer +//----------------------------------------------------------------------------- +// Structure: This section shows the hierarchical structure of +// pss_wrapper. +// +// --processing_system7 +// | +// --trace_buffer +//----------------------------------------------------------------------------- + + +module processing_system7_v5_5_trace_buffer # + ( + parameter integer FIFO_SIZE = 128, + parameter integer USE_TRACE_DATA_EDGE_DETECTOR = 0, + parameter integer C_DELAY_CLKS = 12 + ) + ( + input wire TRACE_CLK, + input wire RST, + input wire TRACE_VALID_IN, + input wire [3:0] TRACE_ATID_IN, + input wire [31:0] TRACE_DATA_IN, + output wire TRACE_VALID_OUT, + output wire [3:0] TRACE_ATID_OUT, + output wire [31:0] TRACE_DATA_OUT + ); + +//------------------------------------------------------------ +// Architecture section +//------------------------------------------------------------ + +// function called clogb2 that returns an integer which has the +// value of the ceiling of the log base 2. + +function integer clogb2 (input integer bit_depth); + integer i; + integer temp_log; + begin + temp_log = 0; + for(i=bit_depth; i > 0; i = i>>1) + clogb2 = temp_log; + temp_log=temp_log+1; + end +endfunction + +localparam DEPTH = clogb2(FIFO_SIZE-1); + +wire [31:0] reset_zeros; +reg [31:0] trace_pedge; // write enable for FIFO +reg [31:0] ti; +reg [31:0] tom; + +reg [3:0] atid; + +reg [31:0] trace_fifo [FIFO_SIZE-1:0];//Memory + +reg [4:0] dly_ctr; +reg [DEPTH-1:0] fifo_wp; +reg [DEPTH-1:0] fifo_rp; + +reg fifo_re; +wire fifo_empty; +wire fifo_full; +reg fifo_full_reg; + +assign reset_zeros = 32'h0; + + +// Pipeline Stage for Traceport ATID ports + always @(posedge TRACE_CLK) begin + // process pedge_ti + // rising clock edge + if((RST == 1'b1)) begin + atid <= reset_zeros; + end + else begin + atid <= TRACE_ATID_IN; + end + end + + assign TRACE_ATID_OUT = atid; + + ///////////////////////////////////////////// + // Generate FIFO data based on TRACE_VALID_IN + ///////////////////////////////////////////// + generate + if (USE_TRACE_DATA_EDGE_DETECTOR == 0) begin : gen_no_data_edge_detector + ///////////////////////////////////////////// + + // memory update process + // Update memory when positive edge detected and FIFO not full + always @(posedge TRACE_CLK) begin + if (TRACE_VALID_IN == 1'b1 && fifo_full_reg != 1'b1) begin + trace_fifo[fifo_wp] <= TRACE_DATA_IN; + end + end + + // fifo write pointer + always @(posedge TRACE_CLK) begin + // process + if(RST == 1'b1) begin + fifo_wp <= {DEPTH{1'b0}}; + end + else if(TRACE_VALID_IN ) begin + if(fifo_wp == (FIFO_SIZE - 1)) begin + if (fifo_empty) begin + fifo_wp <= {DEPTH{1'b0}}; + end + end + else begin + fifo_wp <= fifo_wp + 1; + end + end + end + + + ///////////////////////////////////////////// + // Generate FIFO data based on data edge + ///////////////////////////////////////////// + end else begin : gen_data_edge_detector + ///////////////////////////////////////////// + + + // purpose: check for pos edge on any trace input + always @(posedge TRACE_CLK) begin + // process pedge_ti + // rising clock edge + if((RST == 1'b1)) begin + ti <= reset_zeros; + trace_pedge <= reset_zeros; + end + else begin + ti <= TRACE_DATA_IN; + trace_pedge <= (~ti & TRACE_DATA_IN); + //trace_pedge <= ((~ti ^ TRACE_DATA_IN)) & ~ti; + // posedge only + end + end + + // memory update process + // Update memory when positive edge detected and FIFO not full + always @(posedge TRACE_CLK) begin + if(|(trace_pedge) == 1'b1 && fifo_full_reg != 1'b1) begin + trace_fifo[fifo_wp] <= trace_pedge; + end + end + + // fifo write pointer + always @(posedge TRACE_CLK) begin + // process + if(RST == 1'b1) begin + fifo_wp <= {DEPTH{1'b0}}; + end + else if(|(trace_pedge) == 1'b1) begin + if(fifo_wp == (FIFO_SIZE - 1)) begin + if (fifo_empty) begin + fifo_wp <= {DEPTH{1'b0}}; + end + end + else begin + fifo_wp <= fifo_wp + 1; + end + end + end + + + end + endgenerate + + + always @(posedge TRACE_CLK) begin + tom <= trace_fifo[fifo_rp] ; + end + + +// // fifo write pointer +// always @(posedge TRACE_CLK) begin +// // process +// if(RST == 1'b1) begin +// fifo_wp <= {DEPTH{1'b0}}; +// end +// else if(|(trace_pedge) == 1'b1) begin +// if(fifo_wp == (FIFO_SIZE - 1)) begin +// fifo_wp <= {DEPTH{1'b0}}; +// end +// else begin +// fifo_wp <= fifo_wp + 1; +// end +// end +// end + + + // fifo read pointer update + always @(posedge TRACE_CLK) begin + if(RST == 1'b1) begin + fifo_rp <= {DEPTH{1'b0}}; + fifo_re <= 1'b0; + end + else if(fifo_empty != 1'b1 && dly_ctr == 5'b00000 && fifo_re == 1'b0) begin + fifo_re <= 1'b1; + if(fifo_rp == (FIFO_SIZE - 1)) begin + fifo_rp <= {DEPTH{1'b0}}; + end + else begin + fifo_rp <= fifo_rp + 1; + end + end + else begin + fifo_re <= 1'b0; + end + end + + // delay counter update + always @(posedge TRACE_CLK) begin + if(RST == 1'b1) begin + dly_ctr <= 5'h0; + end + else if (fifo_re == 1'b1) begin + dly_ctr <= C_DELAY_CLKS-1; + end + else if(dly_ctr != 5'h0) begin + dly_ctr <= dly_ctr - 1; + end + end + + // fifo empty update + assign fifo_empty = (fifo_wp == fifo_rp) ? 1'b1 : 1'b0; + + // fifo full update + assign fifo_full = (fifo_wp == FIFO_SIZE-1)? 1'b1 : 1'b0; + + always @(posedge TRACE_CLK) begin + if(RST == 1'b1) begin + fifo_full_reg <= 1'b0; + end + else if (fifo_empty) begin + fifo_full_reg <= 1'b0; + end else begin + fifo_full_reg <= fifo_full; + end + end + +// always @(posedge TRACE_CLK) begin +// if(RST == 1'b1) begin +// fifo_full_reg <= 1'b0; +// end +// else if ((fifo_wp == FIFO_SIZE-1) && (|(trace_pedge) == 1'b1)) begin +// fifo_full_reg <= 1'b1; +// end +// else begin +// fifo_full_reg <= 1'b0; +// end +// end +// + assign TRACE_DATA_OUT = tom; + + assign TRACE_VALID_OUT = fifo_re; + + + + +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_w_atc.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_w_atc.v new file mode 100644 index 0000000..8b19a70 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/8fd3/hdl/verilog/processing_system7_v5_5_w_atc.v @@ -0,0 +1,244 @@ +// -- (c) Copyright 2010 - 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. +//----------------------------------------------------------------------------- +// +// Description: Write Channel for ATC +// +// +// Verilog-standard: Verilog 2001 +//-------------------------------------------------------------------------- +// +// Structure: +// w_atc +// +//-------------------------------------------------------------------------- +`timescale 1ps/1ps + + +module processing_system7_v5_5_w_atc # + ( + parameter C_FAMILY = "rtl", + // FPGA Family. Current version: virtex6, spartan6 or later. + parameter integer C_AXI_ID_WIDTH = 4, + // Width of all ID signals on SI and MI side of checker. + // Range: >= 1. + parameter integer C_AXI_DATA_WIDTH = 64, + // Width of all DATA signals on SI and MI side of checker. + // Range: 64. + parameter integer C_AXI_WUSER_WIDTH = 1 + // Width of AWUSER signals. + // Range: >= 1. + ) + ( + // Global Signals + input wire ARESET, + input wire ACLK, + + // Command Interface (In) + input wire cmd_w_valid, + input wire cmd_w_check, + input wire [C_AXI_ID_WIDTH-1:0] cmd_w_id, + output wire cmd_w_ready, + + // Command Interface (Out) + output wire cmd_b_push, + output wire cmd_b_error, + output reg [C_AXI_ID_WIDTH-1:0] cmd_b_id, + input wire cmd_b_full, + + // Slave Interface Write Port + input wire [C_AXI_ID_WIDTH-1:0] S_AXI_WID, + input wire [C_AXI_DATA_WIDTH-1:0] S_AXI_WDATA, + input wire [C_AXI_DATA_WIDTH/8-1:0] S_AXI_WSTRB, + input wire S_AXI_WLAST, + input wire [C_AXI_WUSER_WIDTH-1:0] S_AXI_WUSER, + input wire S_AXI_WVALID, + output wire S_AXI_WREADY, + + // Master Interface Write Address Port + output wire [C_AXI_ID_WIDTH-1:0] M_AXI_WID, + output wire [C_AXI_DATA_WIDTH-1:0] M_AXI_WDATA, + output wire [C_AXI_DATA_WIDTH/8-1:0] M_AXI_WSTRB, + output wire M_AXI_WLAST, + output wire [C_AXI_WUSER_WIDTH-1:0] M_AXI_WUSER, + output wire M_AXI_WVALID, + input wire M_AXI_WREADY + ); + + + ///////////////////////////////////////////////////////////////////////////// + // Local params + ///////////////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////////////// + // Variables for generating parameter controlled instances. + ///////////////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////////////// + // Functions + ///////////////////////////////////////////////////////////////////////////// + + + ///////////////////////////////////////////////////////////////////////////// + // Internal signals + ///////////////////////////////////////////////////////////////////////////// + + // Detecttion. + wire any_strb_deasserted; + wire incoming_strb_issue; + reg first_word; + reg strb_issue; + + // Data flow. + wire data_pop; + wire cmd_b_push_blocked; + reg cmd_b_push_i; + + + ///////////////////////////////////////////////////////////////////////////// + // Detect error: + // + // Detect and accumulate error when a transaction shall be scanned for + // potential issues. + // Accumulation of error is restarted for each ne transaction. + // + ///////////////////////////////////////////////////////////////////////////// + + // Check stobe information + assign any_strb_deasserted = ( S_AXI_WSTRB != {C_AXI_DATA_WIDTH/8{1'b1}} ); + assign incoming_strb_issue = cmd_w_valid & S_AXI_WVALID & cmd_w_check & any_strb_deasserted; + + // Keep track of first word in a transaction. + always @ (posedge ACLK) begin + if (ARESET) begin + first_word <= 1'b1; + end else if ( data_pop ) begin + first_word <= S_AXI_WLAST; + end + end + + // Keep track of error status. + always @ (posedge ACLK) begin + if (ARESET) begin + strb_issue <= 1'b0; + cmd_b_id <= {C_AXI_ID_WIDTH{1'b0}}; + end else if ( data_pop ) begin + if ( first_word ) begin + strb_issue <= incoming_strb_issue; + end else begin + strb_issue <= incoming_strb_issue | strb_issue; + end + cmd_b_id <= cmd_w_id; + end + end + + assign cmd_b_error = strb_issue; + + + ///////////////////////////////////////////////////////////////////////////// + // Control command queue to B: + // + // Push command to B queue when all data for the transaction has flowed + // through. + // Delay pipelined command until there is room in the Queue. + // + ///////////////////////////////////////////////////////////////////////////// + + // Detect when data is popped. + assign data_pop = S_AXI_WVALID & M_AXI_WREADY & cmd_w_valid & ~cmd_b_full & ~cmd_b_push_blocked; + + // Push command when last word in transfered (pipelined). + always @ (posedge ACLK) begin + if (ARESET) begin + cmd_b_push_i <= 1'b0; + end else begin + cmd_b_push_i <= ( S_AXI_WLAST & data_pop ) | cmd_b_push_blocked; + end + end + + // Detect if pipelined push is blocked. + assign cmd_b_push_blocked = cmd_b_push_i & cmd_b_full; + + // Assign output. + assign cmd_b_push = cmd_b_push_i & ~cmd_b_full; + + + ///////////////////////////////////////////////////////////////////////////// + // Transaction Throttling: + // + // Stall commands if FIFO is full or there is no valid command information + // from AW. + // + ///////////////////////////////////////////////////////////////////////////// + + // Propagate masked valid. + assign M_AXI_WVALID = S_AXI_WVALID & cmd_w_valid & ~cmd_b_full & ~cmd_b_push_blocked; + + // Return ready with push back. + assign S_AXI_WREADY = M_AXI_WREADY & cmd_w_valid & ~cmd_b_full & ~cmd_b_push_blocked; + + // End of burst. + assign cmd_w_ready = S_AXI_WVALID & M_AXI_WREADY & cmd_w_valid & ~cmd_b_full & ~cmd_b_push_blocked & S_AXI_WLAST; + + + ///////////////////////////////////////////////////////////////////////////// + // Write propagation: + // + // All information is simply forwarded on from the SI- to MI-Side untouched. + // + ///////////////////////////////////////////////////////////////////////////// + + // 1:1 mapping. + assign M_AXI_WID = S_AXI_WID; + assign M_AXI_WDATA = S_AXI_WDATA; + assign M_AXI_WSTRB = S_AXI_WSTRB; + assign M_AXI_WLAST = S_AXI_WLAST; + assign M_AXI_WUSER = S_AXI_WUSER; + + +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/ec67/hdl/axi_infrastructure_v1_1_vl_rfs.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/ec67/hdl/axi_infrastructure_v1_1_vl_rfs.v new file mode 100644 index 0000000..d6ec7f8 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ipshared/ec67/hdl/axi_infrastructure_v1_1_vl_rfs.v @@ -0,0 +1,670 @@ +// (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. +//----------------------------------------------------------------------------- +// +// axis to vector +// A generic module to merge all axi signals into one signal called payload. +// This is strictly wires, so no clk, reset, aclken, valid/ready are required. +// +// Verilog-standard: Verilog 2001 +//-------------------------------------------------------------------------- +// + +`timescale 1ps/1ps +`default_nettype none + +(* DowngradeIPIdentifiedWarnings="yes" *) +module axi_infrastructure_v1_1_0_axi2vector # +( +/////////////////////////////////////////////////////////////////////////////// +// Parameter Definitions +/////////////////////////////////////////////////////////////////////////////// + parameter integer C_AXI_PROTOCOL = 0, + parameter integer C_AXI_ID_WIDTH = 4, + parameter integer C_AXI_ADDR_WIDTH = 32, + parameter integer C_AXI_DATA_WIDTH = 32, + parameter integer C_AXI_SUPPORTS_USER_SIGNALS = 0, + parameter integer C_AXI_SUPPORTS_REGION_SIGNALS = 0, + parameter integer C_AXI_AWUSER_WIDTH = 1, + parameter integer C_AXI_WUSER_WIDTH = 1, + parameter integer C_AXI_BUSER_WIDTH = 1, + parameter integer C_AXI_ARUSER_WIDTH = 1, + parameter integer C_AXI_RUSER_WIDTH = 1, + parameter integer C_AWPAYLOAD_WIDTH = 61, + parameter integer C_WPAYLOAD_WIDTH = 73, + parameter integer C_BPAYLOAD_WIDTH = 6, + parameter integer C_ARPAYLOAD_WIDTH = 61, + parameter integer C_RPAYLOAD_WIDTH = 69 +) +( +/////////////////////////////////////////////////////////////////////////////// +// Port Declarations +/////////////////////////////////////////////////////////////////////////////// + // Slave Interface Write Address Ports + input wire [C_AXI_ID_WIDTH-1:0] s_axi_awid, + input wire [C_AXI_ADDR_WIDTH-1:0] s_axi_awaddr, + input wire [((C_AXI_PROTOCOL == 1) ? 4 : 8)-1:0] s_axi_awlen, + input wire [3-1:0] s_axi_awsize, + input wire [2-1:0] s_axi_awburst, + input wire [((C_AXI_PROTOCOL == 1) ? 2 : 1)-1:0] s_axi_awlock, + input wire [4-1:0] s_axi_awcache, + input wire [3-1:0] s_axi_awprot, + input wire [4-1:0] s_axi_awregion, + input wire [4-1:0] s_axi_awqos, + input wire [C_AXI_AWUSER_WIDTH-1:0] s_axi_awuser, + + // Slave Interface Write Data Ports + input wire [C_AXI_ID_WIDTH-1:0] s_axi_wid, + input wire [C_AXI_DATA_WIDTH-1:0] s_axi_wdata, + input wire [C_AXI_DATA_WIDTH/8-1:0] s_axi_wstrb, + input wire s_axi_wlast, + input wire [C_AXI_WUSER_WIDTH-1:0] s_axi_wuser, + + // Slave Interface Write Response Ports + output wire [C_AXI_ID_WIDTH-1:0] s_axi_bid, + output wire [2-1:0] s_axi_bresp, + output wire [C_AXI_BUSER_WIDTH-1:0] s_axi_buser, + + // Slave Interface Read Address Ports + input wire [C_AXI_ID_WIDTH-1:0] s_axi_arid, + input wire [C_AXI_ADDR_WIDTH-1:0] s_axi_araddr, + input wire [((C_AXI_PROTOCOL == 1) ? 4 : 8)-1:0] s_axi_arlen, + input wire [3-1:0] s_axi_arsize, + input wire [2-1:0] s_axi_arburst, + input wire [((C_AXI_PROTOCOL == 1) ? 2 : 1)-1:0] s_axi_arlock, + input wire [4-1:0] s_axi_arcache, + input wire [3-1:0] s_axi_arprot, + input wire [4-1:0] s_axi_arregion, + input wire [4-1:0] s_axi_arqos, + input wire [C_AXI_ARUSER_WIDTH-1:0] s_axi_aruser, + + // Slave Interface Read Data Ports + output wire [C_AXI_ID_WIDTH-1:0] s_axi_rid, + output wire [C_AXI_DATA_WIDTH-1:0] s_axi_rdata, + output wire [2-1:0] s_axi_rresp, + output wire s_axi_rlast, + output wire [C_AXI_RUSER_WIDTH-1:0] s_axi_ruser, + + // payloads + output wire [C_AWPAYLOAD_WIDTH-1:0] s_awpayload, + output wire [C_WPAYLOAD_WIDTH-1:0] s_wpayload, + input wire [C_BPAYLOAD_WIDTH-1:0] s_bpayload, + output wire [C_ARPAYLOAD_WIDTH-1:0] s_arpayload, + input wire [C_RPAYLOAD_WIDTH-1:0] s_rpayload +); + +//////////////////////////////////////////////////////////////////////////////// +// Functions +//////////////////////////////////////////////////////////////////////////////// +`include "axi_infrastructure_v1_1_0.vh" + +//////////////////////////////////////////////////////////////////////////////// +// Local parameters +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Wires/Reg declarations +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// BEGIN RTL +//////////////////////////////////////////////////////////////////////////////// + +// AXI4, AXI4LITE, AXI3 packing +assign s_awpayload[G_AXI_AWADDR_INDEX+:G_AXI_AWADDR_WIDTH] = s_axi_awaddr; +assign s_awpayload[G_AXI_AWPROT_INDEX+:G_AXI_AWPROT_WIDTH] = s_axi_awprot; + +assign s_wpayload[G_AXI_WDATA_INDEX+:G_AXI_WDATA_WIDTH] = s_axi_wdata; +assign s_wpayload[G_AXI_WSTRB_INDEX+:G_AXI_WSTRB_WIDTH] = s_axi_wstrb; + +assign s_axi_bresp = s_bpayload[G_AXI_BRESP_INDEX+:G_AXI_BRESP_WIDTH]; + +assign s_arpayload[G_AXI_ARADDR_INDEX+:G_AXI_ARADDR_WIDTH] = s_axi_araddr; +assign s_arpayload[G_AXI_ARPROT_INDEX+:G_AXI_ARPROT_WIDTH] = s_axi_arprot; + +assign s_axi_rdata = s_rpayload[G_AXI_RDATA_INDEX+:G_AXI_RDATA_WIDTH]; +assign s_axi_rresp = s_rpayload[G_AXI_RRESP_INDEX+:G_AXI_RRESP_WIDTH]; + +generate + if (C_AXI_PROTOCOL == 0 || C_AXI_PROTOCOL == 1) begin : gen_axi4_or_axi3_packing + assign s_awpayload[G_AXI_AWSIZE_INDEX+:G_AXI_AWSIZE_WIDTH] = s_axi_awsize; + assign s_awpayload[G_AXI_AWBURST_INDEX+:G_AXI_AWBURST_WIDTH] = s_axi_awburst; + assign s_awpayload[G_AXI_AWCACHE_INDEX+:G_AXI_AWCACHE_WIDTH] = s_axi_awcache; + assign s_awpayload[G_AXI_AWLEN_INDEX+:G_AXI_AWLEN_WIDTH] = s_axi_awlen; + assign s_awpayload[G_AXI_AWLOCK_INDEX+:G_AXI_AWLOCK_WIDTH] = s_axi_awlock; + assign s_awpayload[G_AXI_AWID_INDEX+:G_AXI_AWID_WIDTH] = s_axi_awid; + assign s_awpayload[G_AXI_AWQOS_INDEX+:G_AXI_AWQOS_WIDTH] = s_axi_awqos; + + assign s_wpayload[G_AXI_WLAST_INDEX+:G_AXI_WLAST_WIDTH] = s_axi_wlast; + if (C_AXI_PROTOCOL == 1) begin : gen_axi3_wid_packing + assign s_wpayload[G_AXI_WID_INDEX+:G_AXI_WID_WIDTH] = s_axi_wid; + end + else begin : gen_no_axi3_wid_packing + end + + assign s_axi_bid = s_bpayload[G_AXI_BID_INDEX+:G_AXI_BID_WIDTH]; + + assign s_arpayload[G_AXI_ARSIZE_INDEX+:G_AXI_ARSIZE_WIDTH] = s_axi_arsize; + assign s_arpayload[G_AXI_ARBURST_INDEX+:G_AXI_ARBURST_WIDTH] = s_axi_arburst; + assign s_arpayload[G_AXI_ARCACHE_INDEX+:G_AXI_ARCACHE_WIDTH] = s_axi_arcache; + assign s_arpayload[G_AXI_ARLEN_INDEX+:G_AXI_ARLEN_WIDTH] = s_axi_arlen; + assign s_arpayload[G_AXI_ARLOCK_INDEX+:G_AXI_ARLOCK_WIDTH] = s_axi_arlock; + assign s_arpayload[G_AXI_ARID_INDEX+:G_AXI_ARID_WIDTH] = s_axi_arid; + assign s_arpayload[G_AXI_ARQOS_INDEX+:G_AXI_ARQOS_WIDTH] = s_axi_arqos; + + assign s_axi_rlast = s_rpayload[G_AXI_RLAST_INDEX+:G_AXI_RLAST_WIDTH]; + assign s_axi_rid = s_rpayload[G_AXI_RID_INDEX+:G_AXI_RID_WIDTH]; + + if (C_AXI_SUPPORTS_REGION_SIGNALS == 1 && G_AXI_AWREGION_WIDTH > 0) begin : gen_region_signals + assign s_awpayload[G_AXI_AWREGION_INDEX+:G_AXI_AWREGION_WIDTH] = s_axi_awregion; + assign s_arpayload[G_AXI_ARREGION_INDEX+:G_AXI_ARREGION_WIDTH] = s_axi_arregion; + end + else begin : gen_no_region_signals + end + if (C_AXI_SUPPORTS_USER_SIGNALS == 1 && C_AXI_PROTOCOL != 2) begin : gen_user_signals + assign s_awpayload[G_AXI_AWUSER_INDEX+:G_AXI_AWUSER_WIDTH] = s_axi_awuser; + assign s_wpayload[G_AXI_WUSER_INDEX+:G_AXI_WUSER_WIDTH] = s_axi_wuser; + assign s_axi_buser = s_bpayload[G_AXI_BUSER_INDEX+:G_AXI_BUSER_WIDTH]; + assign s_arpayload[G_AXI_ARUSER_INDEX+:G_AXI_ARUSER_WIDTH] = s_axi_aruser; + assign s_axi_ruser = s_rpayload[G_AXI_RUSER_INDEX+:G_AXI_RUSER_WIDTH]; + end + else begin : gen_no_user_signals + assign s_axi_buser = 'b0; + assign s_axi_ruser = 'b0; + end + end + else begin : gen_axi4lite_packing + assign s_axi_bid = 'b0; + assign s_axi_buser = 'b0; + + assign s_axi_rlast = 1'b1; + assign s_axi_rid = 'b0; + assign s_axi_ruser = 'b0; + end +endgenerate +endmodule + +`default_nettype wire + + +// (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. +//----------------------------------------------------------------------------- +// Description: SRL based FIFO for AXIS/AXI Channels. +//-------------------------------------------------------------------------- + + +`timescale 1ps/1ps +`default_nettype none + +(* DowngradeIPIdentifiedWarnings="yes" *) +module axi_infrastructure_v1_1_0_axic_srl_fifo #( +/////////////////////////////////////////////////////////////////////////////// +// Parameter Definitions +/////////////////////////////////////////////////////////////////////////////// + parameter C_FAMILY = "virtex7", + parameter integer C_PAYLOAD_WIDTH = 1, + parameter integer C_FIFO_DEPTH = 16 // Range: 4-16. +) +( +/////////////////////////////////////////////////////////////////////////////// +// Port Declarations +/////////////////////////////////////////////////////////////////////////////// + input wire aclk, // Clock + input wire aresetn, // Reset + input wire [C_PAYLOAD_WIDTH-1:0] s_payload, // Input data + input wire s_valid, // Input data valid + output reg s_ready, // Input data ready + output wire [C_PAYLOAD_WIDTH-1:0] m_payload, // Output data + output reg m_valid, // Output data valid + input wire m_ready // Output data ready +); +//////////////////////////////////////////////////////////////////////////////// +// Functions +//////////////////////////////////////////////////////////////////////////////// +// ceiling logb2 +function integer f_clogb2 (input integer size); + integer s; + begin + s = size; + s = s - 1; + for (f_clogb2=1; s>1; f_clogb2=f_clogb2+1) + s = s >> 1; + end +endfunction // clogb2 + +//////////////////////////////////////////////////////////////////////////////// +// Local parameters +//////////////////////////////////////////////////////////////////////////////// +localparam integer LP_LOG_FIFO_DEPTH = f_clogb2(C_FIFO_DEPTH); + +//////////////////////////////////////////////////////////////////////////////// +// Wires/Reg declarations +//////////////////////////////////////////////////////////////////////////////// +reg [LP_LOG_FIFO_DEPTH-1:0] fifo_index; +wire [4-1:0] fifo_addr; +wire push; +wire pop ; +reg areset_r1; + +//////////////////////////////////////////////////////////////////////////////// +// BEGIN RTL +//////////////////////////////////////////////////////////////////////////////// + +always @(posedge aclk) begin + areset_r1 <= ~aresetn; +end + +always @(posedge aclk) begin + if (~aresetn) begin + fifo_index <= {LP_LOG_FIFO_DEPTH{1'b1}}; + end + else begin + fifo_index <= push & ~pop ? fifo_index + 1'b1 : + ~push & pop ? fifo_index - 1'b1 : + fifo_index; + end +end + +assign push = s_valid & s_ready; + +always @(posedge aclk) begin + if (~aresetn) begin + s_ready <= 1'b0; + end + else begin + s_ready <= areset_r1 ? 1'b1 : + push & ~pop && (fifo_index == (C_FIFO_DEPTH - 2'd2)) ? 1'b0 : + ~push & pop ? 1'b1 : + s_ready; + end +end + +assign pop = m_valid & m_ready; + +always @(posedge aclk) begin + if (~aresetn) begin + m_valid <= 1'b0; + end + else begin + m_valid <= ~push & pop && (fifo_index == {LP_LOG_FIFO_DEPTH{1'b0}}) ? 1'b0 : + push & ~pop ? 1'b1 : + m_valid; + end +end + +generate + if (LP_LOG_FIFO_DEPTH < 4) begin : gen_pad_fifo_addr + assign fifo_addr[0+:LP_LOG_FIFO_DEPTH] = fifo_index[LP_LOG_FIFO_DEPTH-1:0]; + assign fifo_addr[LP_LOG_FIFO_DEPTH+:(4-LP_LOG_FIFO_DEPTH)] = {4-LP_LOG_FIFO_DEPTH{1'b0}}; + end + else begin : gen_fifo_addr + assign fifo_addr[LP_LOG_FIFO_DEPTH-1:0] = fifo_index[LP_LOG_FIFO_DEPTH-1:0]; + end +endgenerate + + +generate + genvar i; + for (i = 0; i < C_PAYLOAD_WIDTH; i = i + 1) begin : gen_data_bit + SRL16E + u_srl_fifo( + .Q ( m_payload[i] ) , + .A0 ( fifo_addr[0] ) , + .A1 ( fifo_addr[1] ) , + .A2 ( fifo_addr[2] ) , + .A3 ( fifo_addr[3] ) , + .CE ( push ) , + .CLK ( aclk ) , + .D ( s_payload[i] ) + ); + end +endgenerate + +endmodule + +`default_nettype wire + + +// (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. +//----------------------------------------------------------------------------- +// +// axi to vector +// A generic module to merge all axi signals into one signal called payload. +// This is strictly wires, so no clk, reset, aclken, valid/ready are required. +// +// Verilog-standard: Verilog 2001 +//-------------------------------------------------------------------------- +// + +`timescale 1ps/1ps +`default_nettype none + +(* DowngradeIPIdentifiedWarnings="yes" *) +module axi_infrastructure_v1_1_0_vector2axi # +( +/////////////////////////////////////////////////////////////////////////////// +// Parameter Definitions +/////////////////////////////////////////////////////////////////////////////// + parameter integer C_AXI_PROTOCOL = 0, + parameter integer C_AXI_ID_WIDTH = 4, + parameter integer C_AXI_ADDR_WIDTH = 32, + parameter integer C_AXI_DATA_WIDTH = 32, + parameter integer C_AXI_SUPPORTS_USER_SIGNALS = 0, + parameter integer C_AXI_SUPPORTS_REGION_SIGNALS = 0, + parameter integer C_AXI_AWUSER_WIDTH = 1, + parameter integer C_AXI_WUSER_WIDTH = 1, + parameter integer C_AXI_BUSER_WIDTH = 1, + parameter integer C_AXI_ARUSER_WIDTH = 1, + parameter integer C_AXI_RUSER_WIDTH = 1, + parameter integer C_AWPAYLOAD_WIDTH = 61, + parameter integer C_WPAYLOAD_WIDTH = 73, + parameter integer C_BPAYLOAD_WIDTH = 6, + parameter integer C_ARPAYLOAD_WIDTH = 61, + parameter integer C_RPAYLOAD_WIDTH = 69 +) +( +/////////////////////////////////////////////////////////////////////////////// +// Port Declarations +/////////////////////////////////////////////////////////////////////////////// + // Slave Interface Write Address Ports + output wire [C_AXI_ID_WIDTH-1:0] m_axi_awid, + output wire [C_AXI_ADDR_WIDTH-1:0] m_axi_awaddr, + output wire [((C_AXI_PROTOCOL == 1) ? 4 : 8)-1:0] m_axi_awlen, + output wire [3-1:0] m_axi_awsize, + output wire [2-1:0] m_axi_awburst, + output wire [((C_AXI_PROTOCOL == 1) ? 2 : 1)-1:0] m_axi_awlock, + output wire [4-1:0] m_axi_awcache, + output wire [3-1:0] m_axi_awprot, + output wire [4-1:0] m_axi_awregion, + output wire [4-1:0] m_axi_awqos, + output wire [C_AXI_AWUSER_WIDTH-1:0] m_axi_awuser, + + // Slave Interface Write Data Ports + output wire [C_AXI_ID_WIDTH-1:0] m_axi_wid, + output wire [C_AXI_DATA_WIDTH-1:0] m_axi_wdata, + output wire [C_AXI_DATA_WIDTH/8-1:0] m_axi_wstrb, + output wire m_axi_wlast, + output wire [C_AXI_WUSER_WIDTH-1:0] m_axi_wuser, + + // Slave Interface Write Response Ports + input wire [C_AXI_ID_WIDTH-1:0] m_axi_bid, + input wire [2-1:0] m_axi_bresp, + input wire [C_AXI_BUSER_WIDTH-1:0] m_axi_buser, + + // Slave Interface Read Address Ports + output wire [C_AXI_ID_WIDTH-1:0] m_axi_arid, + output wire [C_AXI_ADDR_WIDTH-1:0] m_axi_araddr, + output wire [((C_AXI_PROTOCOL == 1) ? 4 : 8)-1:0] m_axi_arlen, + output wire [3-1:0] m_axi_arsize, + output wire [2-1:0] m_axi_arburst, + output wire [((C_AXI_PROTOCOL == 1) ? 2 : 1)-1:0] m_axi_arlock, + output wire [4-1:0] m_axi_arcache, + output wire [3-1:0] m_axi_arprot, + output wire [4-1:0] m_axi_arregion, + output wire [4-1:0] m_axi_arqos, + output wire [C_AXI_ARUSER_WIDTH-1:0] m_axi_aruser, + + // Slave Interface Read Data Ports + input wire [C_AXI_ID_WIDTH-1:0] m_axi_rid, + input wire [C_AXI_DATA_WIDTH-1:0] m_axi_rdata, + input wire [2-1:0] m_axi_rresp, + input wire m_axi_rlast, + input wire [C_AXI_RUSER_WIDTH-1:0] m_axi_ruser, + + // payloads + input wire [C_AWPAYLOAD_WIDTH-1:0] m_awpayload, + input wire [C_WPAYLOAD_WIDTH-1:0] m_wpayload, + output wire [C_BPAYLOAD_WIDTH-1:0] m_bpayload, + input wire [C_ARPAYLOAD_WIDTH-1:0] m_arpayload, + output wire [C_RPAYLOAD_WIDTH-1:0] m_rpayload +); + +//////////////////////////////////////////////////////////////////////////////// +// Functions +//////////////////////////////////////////////////////////////////////////////// +`include "axi_infrastructure_v1_1_0.vh" + +//////////////////////////////////////////////////////////////////////////////// +// Local parameters +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// Wires/Reg declarations +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// BEGIN RTL +//////////////////////////////////////////////////////////////////////////////// + +// AXI4, AXI4LITE, AXI3 packing +assign m_axi_awaddr = m_awpayload[G_AXI_AWADDR_INDEX+:G_AXI_AWADDR_WIDTH]; +assign m_axi_awprot = m_awpayload[G_AXI_AWPROT_INDEX+:G_AXI_AWPROT_WIDTH]; + +assign m_axi_wdata = m_wpayload[G_AXI_WDATA_INDEX+:G_AXI_WDATA_WIDTH]; +assign m_axi_wstrb = m_wpayload[G_AXI_WSTRB_INDEX+:G_AXI_WSTRB_WIDTH]; + +assign m_bpayload[G_AXI_BRESP_INDEX+:G_AXI_BRESP_WIDTH] = m_axi_bresp; + +assign m_axi_araddr = m_arpayload[G_AXI_ARADDR_INDEX+:G_AXI_ARADDR_WIDTH]; +assign m_axi_arprot = m_arpayload[G_AXI_ARPROT_INDEX+:G_AXI_ARPROT_WIDTH]; + +assign m_rpayload[G_AXI_RDATA_INDEX+:G_AXI_RDATA_WIDTH] = m_axi_rdata; +assign m_rpayload[G_AXI_RRESP_INDEX+:G_AXI_RRESP_WIDTH] = m_axi_rresp; + +generate + if (C_AXI_PROTOCOL == 0 || C_AXI_PROTOCOL == 1) begin : gen_axi4_or_axi3_packing + assign m_axi_awsize = m_awpayload[G_AXI_AWSIZE_INDEX+:G_AXI_AWSIZE_WIDTH] ; + assign m_axi_awburst = m_awpayload[G_AXI_AWBURST_INDEX+:G_AXI_AWBURST_WIDTH]; + assign m_axi_awcache = m_awpayload[G_AXI_AWCACHE_INDEX+:G_AXI_AWCACHE_WIDTH]; + assign m_axi_awlen = m_awpayload[G_AXI_AWLEN_INDEX+:G_AXI_AWLEN_WIDTH] ; + assign m_axi_awlock = m_awpayload[G_AXI_AWLOCK_INDEX+:G_AXI_AWLOCK_WIDTH] ; + assign m_axi_awid = m_awpayload[G_AXI_AWID_INDEX+:G_AXI_AWID_WIDTH] ; + assign m_axi_awqos = m_awpayload[G_AXI_AWQOS_INDEX+:G_AXI_AWQOS_WIDTH] ; + + assign m_axi_wlast = m_wpayload[G_AXI_WLAST_INDEX+:G_AXI_WLAST_WIDTH] ; + if (C_AXI_PROTOCOL == 1) begin : gen_axi3_wid_packing + assign m_axi_wid = m_wpayload[G_AXI_WID_INDEX+:G_AXI_WID_WIDTH] ; + end + else begin : gen_no_axi3_wid_packing + assign m_axi_wid = 1'b0; + end + + assign m_bpayload[G_AXI_BID_INDEX+:G_AXI_BID_WIDTH] = m_axi_bid; + + assign m_axi_arsize = m_arpayload[G_AXI_ARSIZE_INDEX+:G_AXI_ARSIZE_WIDTH] ; + assign m_axi_arburst = m_arpayload[G_AXI_ARBURST_INDEX+:G_AXI_ARBURST_WIDTH]; + assign m_axi_arcache = m_arpayload[G_AXI_ARCACHE_INDEX+:G_AXI_ARCACHE_WIDTH]; + assign m_axi_arlen = m_arpayload[G_AXI_ARLEN_INDEX+:G_AXI_ARLEN_WIDTH] ; + assign m_axi_arlock = m_arpayload[G_AXI_ARLOCK_INDEX+:G_AXI_ARLOCK_WIDTH] ; + assign m_axi_arid = m_arpayload[G_AXI_ARID_INDEX+:G_AXI_ARID_WIDTH] ; + assign m_axi_arqos = m_arpayload[G_AXI_ARQOS_INDEX+:G_AXI_ARQOS_WIDTH] ; + + assign m_rpayload[G_AXI_RLAST_INDEX+:G_AXI_RLAST_WIDTH] = m_axi_rlast; + assign m_rpayload[G_AXI_RID_INDEX+:G_AXI_RID_WIDTH] = m_axi_rid ; + + if (C_AXI_SUPPORTS_REGION_SIGNALS == 1 && G_AXI_AWREGION_WIDTH > 0) begin : gen_region_signals + assign m_axi_awregion = m_awpayload[G_AXI_AWREGION_INDEX+:G_AXI_AWREGION_WIDTH]; + assign m_axi_arregion = m_arpayload[G_AXI_ARREGION_INDEX+:G_AXI_ARREGION_WIDTH]; + end + else begin : gen_no_region_signals + assign m_axi_awregion = 'b0; + assign m_axi_arregion = 'b0; + end + if (C_AXI_SUPPORTS_USER_SIGNALS == 1 && C_AXI_PROTOCOL != 2) begin : gen_user_signals + assign m_axi_awuser = m_awpayload[G_AXI_AWUSER_INDEX+:G_AXI_AWUSER_WIDTH]; + assign m_axi_wuser = m_wpayload[G_AXI_WUSER_INDEX+:G_AXI_WUSER_WIDTH] ; + assign m_bpayload[G_AXI_BUSER_INDEX+:G_AXI_BUSER_WIDTH] = m_axi_buser ; + assign m_axi_aruser = m_arpayload[G_AXI_ARUSER_INDEX+:G_AXI_ARUSER_WIDTH]; + assign m_rpayload[G_AXI_RUSER_INDEX+:G_AXI_RUSER_WIDTH] = m_axi_ruser ; + end + else begin : gen_no_user_signals + assign m_axi_awuser = 'b0; + assign m_axi_wuser = 'b0; + assign m_axi_aruser = 'b0; + end + end + else begin : gen_axi4lite_packing + assign m_axi_awsize = (C_AXI_DATA_WIDTH == 32) ? 3'd2 : 3'd3; + assign m_axi_awburst = 'b0; + assign m_axi_awcache = 'b0; + assign m_axi_awlen = 'b0; + assign m_axi_awlock = 'b0; + assign m_axi_awid = 'b0; + assign m_axi_awqos = 'b0; + + assign m_axi_wlast = 1'b1; + assign m_axi_wid = 'b0; + + + assign m_axi_arsize = (C_AXI_DATA_WIDTH == 32) ? 3'd2 : 3'd3; + assign m_axi_arburst = 'b0; + assign m_axi_arcache = 'b0; + assign m_axi_arlen = 'b0; + assign m_axi_arlock = 'b0; + assign m_axi_arid = 'b0; + assign m_axi_arqos = 'b0; + + assign m_axi_awregion = 'b0; + assign m_axi_arregion = 'b0; + + assign m_axi_awuser = 'b0; + assign m_axi_wuser = 'b0; + assign m_axi_aruser = 'b0; + end +endgenerate +endmodule + +`default_nettype wire + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/sim/design_1.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/sim/design_1.v new file mode 100644 index 0000000..7005c4f --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/sim/design_1.v @@ -0,0 +1,141 @@ +//Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +//-------------------------------------------------------------------------------- +//Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +//Date : Fri Aug 17 17:41:43 2018 +//Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +//Command : generate_target design_1.bd +//Design : design_1 +//Purpose : IP block netlist +//-------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +(* CORE_GENERATION_INFO = "design_1,IP_Integrator,{x_ipVendor=xilinx.com,x_ipLibrary=BlockDiagram,x_ipName=design_1,x_ipVersion=1.00.a,x_ipLanguage=VERILOG,numBlks=2,numReposBlks=2,numNonXlnxBlks=0,numHierBlks=0,maxHierDepth=0,numSysgenBlks=0,numHlsBlks=0,numHdlrefBlks=1,numPkgbdBlks=0,bdsource=USER,da_ps7_cnt=1,synth_mode=OOC_per_IP}" *) (* HW_HANDOFF = "design_1.hwdef" *) +module design_1 + (DDR_addr, + DDR_ba, + DDR_cas_n, + DDR_ck_n, + DDR_ck_p, + DDR_cke, + DDR_cs_n, + DDR_dm, + DDR_dq, + DDR_dqs_n, + DDR_dqs_p, + DDR_odt, + DDR_ras_n, + DDR_reset_n, + DDR_we_n, + FIXED_IO_ddr_vrn, + FIXED_IO_ddr_vrp, + FIXED_IO_mio, + FIXED_IO_ps_clk, + FIXED_IO_ps_porb, + FIXED_IO_ps_srstb, + led_op); + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ADDR" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME DDR, AXI_ARBITRATION_SCHEME TDM, BURST_LENGTH 8, CAN_DEBUG false, CAS_LATENCY 11, CAS_WRITE_LATENCY 11, CS_ENABLED true, DATA_MASK_ENABLED true, DATA_WIDTH 8, MEMORY_TYPE COMPONENTS, MEM_ADDR_MAP ROW_COLUMN_BANK, SLOT Single, TIMEPERIOD_PS 1250" *) inout [14:0]DDR_addr; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR BA" *) inout [2:0]DDR_ba; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CAS_N" *) inout DDR_cas_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_N" *) inout DDR_ck_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_P" *) inout DDR_ck_p; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CKE" *) inout DDR_cke; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CS_N" *) inout DDR_cs_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DM" *) inout [1:0]DDR_dm; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQ" *) inout [15:0]DDR_dq; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_N" *) inout [1:0]DDR_dqs_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_P" *) inout [1:0]DDR_dqs_p; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ODT" *) inout DDR_odt; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RAS_N" *) inout DDR_ras_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RESET_N" *) inout DDR_reset_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR WE_N" *) inout DDR_we_n; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRN" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FIXED_IO, CAN_DEBUG false" *) inout FIXED_IO_ddr_vrn; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRP" *) inout FIXED_IO_ddr_vrp; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO MIO" *) inout [31:0]FIXED_IO_mio; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_CLK" *) inout FIXED_IO_ps_clk; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_PORB" *) inout FIXED_IO_ps_porb; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_SRSTB" *) inout FIXED_IO_ps_srstb; + (* X_INTERFACE_INFO = "xilinx.com:signal:data:1.0 DATA.LED_OP DATA" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME DATA.LED_OP, LAYERED_METADATA undef" *) output led_op; + + wire led_0_led_op; + wire [14:0]processing_system7_0_DDR_ADDR; + wire [2:0]processing_system7_0_DDR_BA; + wire processing_system7_0_DDR_CAS_N; + wire processing_system7_0_DDR_CKE; + wire processing_system7_0_DDR_CK_N; + wire processing_system7_0_DDR_CK_P; + wire processing_system7_0_DDR_CS_N; + wire [1:0]processing_system7_0_DDR_DM; + wire [15:0]processing_system7_0_DDR_DQ; + wire [1:0]processing_system7_0_DDR_DQS_N; + wire [1:0]processing_system7_0_DDR_DQS_P; + wire processing_system7_0_DDR_ODT; + wire processing_system7_0_DDR_RAS_N; + wire processing_system7_0_DDR_RESET_N; + wire processing_system7_0_DDR_WE_N; + wire processing_system7_0_FCLK_CLK0; + wire processing_system7_0_FIXED_IO_DDR_VRN; + wire processing_system7_0_FIXED_IO_DDR_VRP; + wire [31:0]processing_system7_0_FIXED_IO_MIO; + wire processing_system7_0_FIXED_IO_PS_CLK; + wire processing_system7_0_FIXED_IO_PS_PORB; + wire processing_system7_0_FIXED_IO_PS_SRSTB; + + assign led_op = led_0_led_op; + design_1_led_0_0 led_0 + (.led_op(led_0_led_op), + .m_clock(processing_system7_0_FCLK_CLK0)); + design_1_processing_system7_0_0 processing_system7_0 + (.DDR_Addr(DDR_addr[14:0]), + .DDR_BankAddr(DDR_ba[2:0]), + .DDR_CAS_n(DDR_cas_n), + .DDR_CKE(DDR_cke), + .DDR_CS_n(DDR_cs_n), + .DDR_Clk(DDR_ck_p), + .DDR_Clk_n(DDR_ck_n), + .DDR_DM(DDR_dm[1:0]), + .DDR_DQ(DDR_dq[15:0]), + .DDR_DQS(DDR_dqs_p[1:0]), + .DDR_DQS_n(DDR_dqs_n[1:0]), + .DDR_DRSTB(DDR_reset_n), + .DDR_ODT(DDR_odt), + .DDR_RAS_n(DDR_ras_n), + .DDR_VRN(FIXED_IO_ddr_vrn), + .DDR_VRP(FIXED_IO_ddr_vrp), + .DDR_WEB(DDR_we_n), + .FCLK_CLK0(processing_system7_0_FCLK_CLK0), + .GPIO_I({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .I2C0_SCL_I(1'b0), + .I2C0_SDA_I(1'b0), + .IRQ_F2P(1'b0), + .MIO(FIXED_IO_mio[31:0]), + .M_AXI_GP0_ACLK(processing_system7_0_FCLK_CLK0), + .M_AXI_GP0_ARREADY(1'b0), + .M_AXI_GP0_AWREADY(1'b0), + .M_AXI_GP0_BID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP0_BRESP({1'b0,1'b0}), + .M_AXI_GP0_BVALID(1'b0), + .M_AXI_GP0_RDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP0_RID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP0_RLAST(1'b0), + .M_AXI_GP0_RRESP({1'b0,1'b0}), + .M_AXI_GP0_RVALID(1'b0), + .M_AXI_GP0_WREADY(1'b0), + .PS_CLK(FIXED_IO_ps_clk), + .PS_PORB(FIXED_IO_ps_porb), + .PS_SRSTB(FIXED_IO_ps_srstb), + .SDIO0_CDN(1'b0), + .SDIO0_CLK_FB(1'b0), + .SDIO0_CMD_I(1'b0), + .SDIO0_DATA_I({1'b0,1'b0,1'b0,1'b0}), + .SDIO0_WP(1'b0), + .SPI0_MISO_I(1'b0), + .SPI0_MOSI_I(1'b0), + .SPI0_SCLK_I(1'b0), + .SPI0_SS_I(1'b0), + .SPI1_MISO_I(1'b0), + .SPI1_MOSI_I(1'b0), + .SPI1_SCLK_I(1'b0), + .SPI1_SS_I(1'b0), + .UART0_RX(1'b1), + .USB0_VBUS_PWRFAULT(1'b0)); +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/synth/design_1.v b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/synth/design_1.v new file mode 100644 index 0000000..7005c4f --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/synth/design_1.v @@ -0,0 +1,141 @@ +//Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. +//-------------------------------------------------------------------------------- +//Tool Version: Vivado v.2018.2 (win64) Build 2258646 Thu Jun 14 20:03:12 MDT 2018 +//Date : Fri Aug 17 17:41:43 2018 +//Host : DESKTOP-4H60MTS running 64-bit major release (build 9200) +//Command : generate_target design_1.bd +//Design : design_1 +//Purpose : IP block netlist +//-------------------------------------------------------------------------------- +`timescale 1 ps / 1 ps + +(* CORE_GENERATION_INFO = "design_1,IP_Integrator,{x_ipVendor=xilinx.com,x_ipLibrary=BlockDiagram,x_ipName=design_1,x_ipVersion=1.00.a,x_ipLanguage=VERILOG,numBlks=2,numReposBlks=2,numNonXlnxBlks=0,numHierBlks=0,maxHierDepth=0,numSysgenBlks=0,numHlsBlks=0,numHdlrefBlks=1,numPkgbdBlks=0,bdsource=USER,da_ps7_cnt=1,synth_mode=OOC_per_IP}" *) (* HW_HANDOFF = "design_1.hwdef" *) +module design_1 + (DDR_addr, + DDR_ba, + DDR_cas_n, + DDR_ck_n, + DDR_ck_p, + DDR_cke, + DDR_cs_n, + DDR_dm, + DDR_dq, + DDR_dqs_n, + DDR_dqs_p, + DDR_odt, + DDR_ras_n, + DDR_reset_n, + DDR_we_n, + FIXED_IO_ddr_vrn, + FIXED_IO_ddr_vrp, + FIXED_IO_mio, + FIXED_IO_ps_clk, + FIXED_IO_ps_porb, + FIXED_IO_ps_srstb, + led_op); + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ADDR" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME DDR, AXI_ARBITRATION_SCHEME TDM, BURST_LENGTH 8, CAN_DEBUG false, CAS_LATENCY 11, CAS_WRITE_LATENCY 11, CS_ENABLED true, DATA_MASK_ENABLED true, DATA_WIDTH 8, MEMORY_TYPE COMPONENTS, MEM_ADDR_MAP ROW_COLUMN_BANK, SLOT Single, TIMEPERIOD_PS 1250" *) inout [14:0]DDR_addr; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR BA" *) inout [2:0]DDR_ba; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CAS_N" *) inout DDR_cas_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_N" *) inout DDR_ck_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CK_P" *) inout DDR_ck_p; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CKE" *) inout DDR_cke; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR CS_N" *) inout DDR_cs_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DM" *) inout [1:0]DDR_dm; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQ" *) inout [15:0]DDR_dq; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_N" *) inout [1:0]DDR_dqs_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR DQS_P" *) inout [1:0]DDR_dqs_p; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR ODT" *) inout DDR_odt; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RAS_N" *) inout DDR_ras_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR RESET_N" *) inout DDR_reset_n; + (* X_INTERFACE_INFO = "xilinx.com:interface:ddrx:1.0 DDR WE_N" *) inout DDR_we_n; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRN" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME FIXED_IO, CAN_DEBUG false" *) inout FIXED_IO_ddr_vrn; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO DDR_VRP" *) inout FIXED_IO_ddr_vrp; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO MIO" *) inout [31:0]FIXED_IO_mio; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_CLK" *) inout FIXED_IO_ps_clk; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_PORB" *) inout FIXED_IO_ps_porb; + (* X_INTERFACE_INFO = "xilinx.com:display_processing_system7:fixedio:1.0 FIXED_IO PS_SRSTB" *) inout FIXED_IO_ps_srstb; + (* X_INTERFACE_INFO = "xilinx.com:signal:data:1.0 DATA.LED_OP DATA" *) (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME DATA.LED_OP, LAYERED_METADATA undef" *) output led_op; + + wire led_0_led_op; + wire [14:0]processing_system7_0_DDR_ADDR; + wire [2:0]processing_system7_0_DDR_BA; + wire processing_system7_0_DDR_CAS_N; + wire processing_system7_0_DDR_CKE; + wire processing_system7_0_DDR_CK_N; + wire processing_system7_0_DDR_CK_P; + wire processing_system7_0_DDR_CS_N; + wire [1:0]processing_system7_0_DDR_DM; + wire [15:0]processing_system7_0_DDR_DQ; + wire [1:0]processing_system7_0_DDR_DQS_N; + wire [1:0]processing_system7_0_DDR_DQS_P; + wire processing_system7_0_DDR_ODT; + wire processing_system7_0_DDR_RAS_N; + wire processing_system7_0_DDR_RESET_N; + wire processing_system7_0_DDR_WE_N; + wire processing_system7_0_FCLK_CLK0; + wire processing_system7_0_FIXED_IO_DDR_VRN; + wire processing_system7_0_FIXED_IO_DDR_VRP; + wire [31:0]processing_system7_0_FIXED_IO_MIO; + wire processing_system7_0_FIXED_IO_PS_CLK; + wire processing_system7_0_FIXED_IO_PS_PORB; + wire processing_system7_0_FIXED_IO_PS_SRSTB; + + assign led_op = led_0_led_op; + design_1_led_0_0 led_0 + (.led_op(led_0_led_op), + .m_clock(processing_system7_0_FCLK_CLK0)); + design_1_processing_system7_0_0 processing_system7_0 + (.DDR_Addr(DDR_addr[14:0]), + .DDR_BankAddr(DDR_ba[2:0]), + .DDR_CAS_n(DDR_cas_n), + .DDR_CKE(DDR_cke), + .DDR_CS_n(DDR_cs_n), + .DDR_Clk(DDR_ck_p), + .DDR_Clk_n(DDR_ck_n), + .DDR_DM(DDR_dm[1:0]), + .DDR_DQ(DDR_dq[15:0]), + .DDR_DQS(DDR_dqs_p[1:0]), + .DDR_DQS_n(DDR_dqs_n[1:0]), + .DDR_DRSTB(DDR_reset_n), + .DDR_ODT(DDR_odt), + .DDR_RAS_n(DDR_ras_n), + .DDR_VRN(FIXED_IO_ddr_vrn), + .DDR_VRP(FIXED_IO_ddr_vrp), + .DDR_WEB(DDR_we_n), + .FCLK_CLK0(processing_system7_0_FCLK_CLK0), + .GPIO_I({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .I2C0_SCL_I(1'b0), + .I2C0_SDA_I(1'b0), + .IRQ_F2P(1'b0), + .MIO(FIXED_IO_mio[31:0]), + .M_AXI_GP0_ACLK(processing_system7_0_FCLK_CLK0), + .M_AXI_GP0_ARREADY(1'b0), + .M_AXI_GP0_AWREADY(1'b0), + .M_AXI_GP0_BID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP0_BRESP({1'b0,1'b0}), + .M_AXI_GP0_BVALID(1'b0), + .M_AXI_GP0_RDATA({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP0_RID({1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}), + .M_AXI_GP0_RLAST(1'b0), + .M_AXI_GP0_RRESP({1'b0,1'b0}), + .M_AXI_GP0_RVALID(1'b0), + .M_AXI_GP0_WREADY(1'b0), + .PS_CLK(FIXED_IO_ps_clk), + .PS_PORB(FIXED_IO_ps_porb), + .PS_SRSTB(FIXED_IO_ps_srstb), + .SDIO0_CDN(1'b0), + .SDIO0_CLK_FB(1'b0), + .SDIO0_CMD_I(1'b0), + .SDIO0_DATA_I({1'b0,1'b0,1'b0,1'b0}), + .SDIO0_WP(1'b0), + .SPI0_MISO_I(1'b0), + .SPI0_MOSI_I(1'b0), + .SPI0_SCLK_I(1'b0), + .SPI0_SS_I(1'b0), + .SPI1_MISO_I(1'b0), + .SPI1_MOSI_I(1'b0), + .SPI1_SCLK_I(1'b0), + .SPI1_SS_I(1'b0), + .UART0_RX(1'b1), + .USB0_VBUS_PWRFAULT(1'b0)); +endmodule diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ui/bd_1f5defd0.ui b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ui/bd_1f5defd0.ui new file mode 100644 index 0000000..2114b15 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/design_1/ui/bd_1f5defd0.ui @@ -0,0 +1,19 @@ +{ + ExpandedHierarchyInLayout: "", + guistr: "# # String gsaved with Nlview 6.8.5 2018-01-30 bk=1.4354 VDI=40 GEI=35 GUI=JA:1.6 non-TLS +# -string -flagsOSRD +preplace port DDR -pg 1 -y -120 -defaultsOSRD +preplace port FIXED_IO -pg 1 -y -160 -defaultsOSRD +preplace port led_op -pg 1 -y -140 -defaultsOSRD +preplace inst led_0 -pg 1 -lvl 2 -y -210 -defaultsOSRD +preplace inst processing_system7_0 -pg 1 -lvl 1 -y -270 -defaultsOSRD +preplace netloc processing_system7_0_DDR 1 1 2 NJ -430 670J +preplace netloc processing_system7_0_FIXED_IO 1 1 2 NJ -410 680J +preplace netloc processing_system7_0_FCLK_CLK0 1 0 2 0 -510 420 +preplace netloc led_0_led_op 1 2 1 660 +levelinfo -pg 1 -20 210 550 700 -top -630 -bot 410 +", +} +{ + da_ps7_cnt: "1", +} diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/mref/led/component.xml b/LED_Blink/LED_Blink.srcs/sources_1/bd/mref/led/component.xml new file mode 100644 index 0000000..7d4dbf5 --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/mref/led/component.xml @@ -0,0 +1,130 @@ + + + xilinx.com + module_ref + led + 1.0 + + + m_clock + + + + + + + CLK + + + m_clock + + + + + + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + Verilog + led + + + viewChecksum + 0b867e83 + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + Verilog + led + + + viewChecksum + 0b867e83 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + + + m_clock + + in + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + led_op + + out + + + std_logic + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + + + xilinx_xpgui_view_fileset + + xgui/led_v1_0.tcl + tclSource + CHECKSUM_f64a5dae + XGUI_VERSION_2 + + + + xilinx.com:module_ref:led:1.0 + + + Component_Name + led_v1_0 + + + + + + zynq + + + /UserIP + + led_v1_0 + level_1 + module_ref + + IPI + + 1 + 2018-08-17T08:41:28Z + + + 2018.2 + + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/bd/mref/led/xgui/led_v1_0.tcl b/LED_Blink/LED_Blink.srcs/sources_1/bd/mref/led/xgui/led_v1_0.tcl new file mode 100644 index 0000000..66195ab --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/bd/mref/led/xgui/led_v1_0.tcl @@ -0,0 +1,10 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + ipgui::add_page $IPINST -name "Page 0" + + +} + + diff --git a/LED_Blink/LED_Blink.srcs/sources_1/new/led.v b/LED_Blink/LED_Blink.srcs/sources_1/new/led.v new file mode 100644 index 0000000..50381ba --- /dev/null +++ b/LED_Blink/LED_Blink.srcs/sources_1/new/led.v @@ -0,0 +1,41 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// Company: +// Engineer: +// +// Create Date: 2018/08/17 11:04:10 +// Design Name: +// Module Name: led +// Project Name: +// Target Devices: +// Tool Versions: +// Description: +// +// Dependencies: +// +// Revision: +// Revision 0.01 - File Created +// Additional Comments: +// +////////////////////////////////////////////////////////////////////////////////// + +`define PERIOD 25000000 + +module led( + input m_clock, + output led_op + ); + reg [31:0] cnt = 0; + reg led_op_r = 0; + + assign led_op = led_op_r; + + always @(posedge m_clock) begin + if(cnt < `PERIOD) + cnt <= cnt + 1; + else begin + cnt <= 0; + led_op_r <= ~led_op_r; + end + end +endmodule diff --git a/LED_Blink/LED_Blink.xpr b/LED_Blink/LED_Blink.xpr new file mode 100644 index 0000000..eb8babd --- /dev/null +++ b/LED_Blink/LED_Blink.xpr @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo1/_readme.txt b/zynqberrydemo1/_readme.txt new file mode 100644 index 0000000..4a7d866 --- /dev/null +++ b/zynqberrydemo1/_readme.txt @@ -0,0 +1,73 @@ +Project Description +========================================================================== +Important notes: + 1.Please use short path name on Windows OS. The OS allows only 256 characters in normal path. + 2.Please do not use space character on path name. +========================================================================== +1. Create Command Files and open documentation links: + On Windows OS: run "_create_win_setup.cmd" and follow setup instructions + On Linux OS: run "_create_linux_setup.sh" and follow setup instructions +============================== +2. Create Vivado Project on Windows OS use instructions from option 1 of: + ===== + https://wiki.trenz-electronic.de/display/PD/Vivado+Projects + ===== + 1.Modify start setting: + ===== + Edit "design_basic_settings.cmd" with text editor: + Set your vivado installation path for edit: + @set XILDIR=C:\Xilinx + @set VIVADO_VERSION=2017.1 + In this example the it search in + C:\Xilinx\Vivado\2017.1 for VIVADO + C:\Xilinx\SDK\2017.1 for SDK (optional for some functionality, HSI/SDK) + C:\Xilinx\Vivado_Lab\2017.1 for VIVADO Labtools (optional for some functionality) + Set the correct part number for your pcb variant (see board_files/TE0710_board_files.csv), edit: + @set PARTNUMBER=1 + ===== + 2.Run "vivado_create_project_guimode.cmd" +============================== +2. Create Vivado Project on Linux use instructions from option 1 of: + ===== + https://wiki.trenz-electronic.de/display/PD/Vivado+Projects + ===== + 1.Modify start setting: + ===== + Edit "design_basic_settings.sh" with text editor: + Set your vivado installation path for edit: + @set XILDIR=/opt/Xilinx + @set VIVADO_VERSION=2017.1 + In this example the it search in + /opt/Vivado/2017.1 for VIVADO + /opt/SDK/2017.1 for SDK (optional for some functionality, HSI/SDK) + /opt/Vivado_Lab/2017.1 for VIVADO Labtools (optional for some functionality) + Set the correct part number for your pcb variant (see board_files/TE0710_board_files.csv), edit: + @set PARTNUMBER=1 + ===== + 2.Run "vivado_create_project_guimode.sh" +============================== +There are also other options available: + ===== + https://wiki.trenz-electronic.de/display/PD/Vivado+Projects +============================== +Attention: + ===== + Run design_clear_design_folders.cmd/sh clear all generated files and folders (vivado, workspace(hsi & sdk), vlog,...)! +============================== +Basic documentations: + ===== + Project Delivery: + https://wiki.trenz-electronic.de/display/PD/Project+Delivery + == + VIVADO/SDK/SDSoC + https://wiki.trenz-electronic.de/pages/viewpage.action?pageId=14746264 + == + Trenz Electronic SoMs + https://wiki.trenz-electronic.de/display/PD/All+Trenz+Electronic+SoMs + == + Additional Information for the are available on the download page of the design + https://shop.trenz-electronic.de/en/Download/?path=Trenz_Electronic //Reference_Design// +============================== +===== +NOTES +===== \ No newline at end of file diff --git a/zynqberrydemo1/block_design/zsys_bd.tcl b/zynqberrydemo1/block_design/zsys_bd.tcl new file mode 100644 index 0000000..6b47c52 --- /dev/null +++ b/zynqberrydemo1/block_design/zsys_bd.tcl @@ -0,0 +1,1126 @@ +TE::UTILS::te_msg TE_BD-0 INFO "This block design tcl-file was generate with Trenz Electronic GmbH Board Part:trenz.biz:te0726_7s:part0:3.1, FPGA: xc7z007sclg225-1 at 2017-06-12T13:37:13." +TE::UTILS::te_msg TE_BD-1 INFO "This block design tcl-file was modified by TE-Scripts. Modifications are labelled with comment tag # #TE_MOD# on the Block-Design tcl-file." + +################################################################ +# This is a generated script based on design: zsys +# +# Though there are limitations about the generated script, +# the main purpose of this utility is to make learning +# IP Integrator Tcl commands easier. +################################################################ + +namespace eval _tcl { +proc get_script_folder {} { + set script_path [file normalize [info script]] + set script_folder [file dirname $script_path] + return $script_folder +} +} +variable script_folder +set script_folder [_tcl::get_script_folder] + +################################################################ +# Check if script is running in correct Vivado version. +################################################################ +set scripts_vivado_version 2017.1 +set current_vivado_version [version -short] + +if { [string first $scripts_vivado_version $current_vivado_version] == -1 } { + puts "" + catch {common::send_msg_id "BD_TCL-109" "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."} + + return 1 +} + +################################################################ +# START +################################################################ + +# To test this script, run the following commands from Vivado Tcl console: +# source zsys_script.tcl + +# If there is no project opened, this script will create a +# project, but make sure you do not have an existing project +# <./myproj/project_1.xpr> in the current working folder. + +set list_projs [get_projects -quiet] +if { $list_projs eq "" } { + create_project project_1 myproj -part xc7z007sclg225-1 + set_property BOARD_PART trenz.biz:te0726_7s:part0:3.1 [current_project] +} + + +# CHANGE DESIGN NAME HERE +set design_name zsys + +# If you do not already have an existing IP Integrator design open, +# you can create a design using the following command: +# create_bd_design $design_name + +# Creating design if needed +set errMsg "" +set nRet 0 + +set cur_design [current_bd_design -quiet] +set list_cells [get_bd_cells -quiet] + +if { ${design_name} eq "" } { + # USE CASES: + # 1) Design_name not set + + set errMsg "Please set the variable to a non-empty value." + set nRet 1 + +} elseif { ${cur_design} ne "" && ${list_cells} eq "" } { + # USE CASES: + # 2): Current design opened AND is empty AND names same. + # 3): Current design opened AND is empty AND names diff; design_name NOT in project. + # 4): Current design opened AND is empty AND names diff; design_name exists in project. + + if { $cur_design ne $design_name } { + common::send_msg_id "BD_TCL-001" "INFO" "Changing value of from <$design_name> to <$cur_design> since current design is empty." + set design_name [get_property NAME $cur_design] + } + common::send_msg_id "BD_TCL-002" "INFO" "Constructing design in IPI design <$cur_design>..." + +} elseif { ${cur_design} ne "" && $list_cells ne "" && $cur_design eq $design_name } { + # USE CASES: + # 5) Current design opened AND has components AND same names. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 1 +} elseif { [get_files -quiet ${design_name}.bd] ne "" } { + # USE CASES: + # 6) Current opened design, has components, but diff names, design_name exists in project. + # 7) No opened design, design_name exists in project. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 2 + +} else { + # USE CASES: + # 8) No opened design, design_name not in project. + # 9) Current opened design, has components, but diff names, design_name not in project. + + common::send_msg_id "BD_TCL-003" "INFO" "Currently there is no design <$design_name> in project, so creating one..." + + create_bd_design $design_name + + common::send_msg_id "BD_TCL-004" "INFO" "Making design <$design_name> as current_bd_design." + current_bd_design $design_name + +} + +common::send_msg_id "BD_TCL-005" "INFO" "Currently the variable is equal to \"$design_name\"." + +if { $nRet != 0 } { + catch {common::send_msg_id "BD_TCL-114" "ERROR" $errMsg} + return $nRet +} + +################################################################## +# DESIGN PROCs +################################################################## + + +# Hierarchical cell: video_out +proc create_hier_cell_video_out { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_msg_id "BD_TCL-102" "ERROR" "create_hier_cell_video_out() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 CLKWIZ_AXI + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 VDMA_AXI + create_bd_intf_pin -mode Master -vlnv xilinx.com:interface:aximm_rtl:1.0 VIDEO_OUT_AXI + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 VTC_AXI + + # Create pins + create_bd_pin -dir I -type clk axi_aclk + create_bd_pin -dir I -from 0 -to 0 -type rst axi_int_aresetn + create_bd_pin -dir I -from 0 -to 0 -type rst axi_per_aresetn + create_bd_pin -dir O hdmi_clk_n + create_bd_pin -dir O hdmi_clk_p + create_bd_pin -dir O -from 2 -to 0 hdmi_data_n + create_bd_pin -dir O -from 2 -to 0 hdmi_data_p + create_bd_pin -dir I -type clk ref_clk + create_bd_pin -dir O -type intr tx_dma_int + + # Create instance: Video_IO_2_HDMI_TMDS_0, and set properties + set Video_IO_2_HDMI_TMDS_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:Video_IO_2_HDMI_TMDS:1.0 Video_IO_2_HDMI_TMDS_0 ] + set_property -dict [ list \ +CONFIG.C_CLK_SWAP {true} \ +CONFIG.C_D0_SWAP {true} \ +CONFIG.C_INT_CLOCKING {false} \ +CONFIG.C_VIDEO_MODE {0} \ + ] $Video_IO_2_HDMI_TMDS_0 + + # Create instance: axi_mem_intercon, and set properties + set axi_mem_intercon [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 axi_mem_intercon ] + set_property -dict [ list \ +CONFIG.NUM_MI {1} \ + ] $axi_mem_intercon + + # Create instance: axi_vdma_0, and set properties + set axi_vdma_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_vdma:6.3 axi_vdma_0 ] + set_property -dict [ list \ +CONFIG.c_include_s2mm {0} \ +CONFIG.c_m_axi_mm2s_data_width {32} \ +CONFIG.c_mm2s_genlock_mode {0} \ +CONFIG.c_mm2s_linebuffer_depth {1024} \ +CONFIG.c_mm2s_max_burst_length {16} \ +CONFIG.c_num_fstores {1} \ +CONFIG.c_s2mm_genlock_mode {0} \ + ] $axi_vdma_0 + + # Create instance: axis_fb_conv_0, and set properties + set axis_fb_conv_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axis_fb_conv:1.0 axis_fb_conv_0 ] + + # Create instance: clk_wiz_1, and set properties + set clk_wiz_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz:5.4 clk_wiz_1 ] + set_property -dict [ list \ +CONFIG.CLKIN1_JITTER_PS {50.0} \ +CONFIG.CLKOUT1_JITTER {333.287} \ +CONFIG.CLKOUT1_PHASE_ERROR {322.999} \ +CONFIG.CLKOUT1_REQUESTED_OUT_FREQ {74.250} \ +CONFIG.CLKOUT2_JITTER {256.477} \ +CONFIG.CLKOUT2_PHASE_ERROR {322.999} \ +CONFIG.CLKOUT2_REQUESTED_OUT_FREQ {371.250} \ +CONFIG.CLKOUT2_USED {true} \ +CONFIG.CLKOUT3_JITTER {325.031} \ +CONFIG.CLKOUT3_PHASE_ERROR {569.784} \ +CONFIG.CLKOUT3_REQUESTED_OUT_FREQ {100.000} \ +CONFIG.CLKOUT3_USED {false} \ +CONFIG.CLKOUT4_JITTER {357.108} \ +CONFIG.CLKOUT4_PHASE_ERROR {569.784} \ +CONFIG.CLKOUT4_REQUESTED_OUT_FREQ {100.000} \ +CONFIG.CLKOUT4_USED {false} \ +CONFIG.JITTER_SEL {Min_O_Jitter} \ +CONFIG.MMCM_BANDWIDTH {HIGH} \ +CONFIG.MMCM_CLKFBOUT_MULT_F {37.125} \ +CONFIG.MMCM_CLKIN1_PERIOD {5.000} \ +CONFIG.MMCM_CLKIN2_PERIOD {10.0} \ +CONFIG.MMCM_CLKOUT0_DIVIDE_F {10.000} \ +CONFIG.MMCM_CLKOUT1_DIVIDE {2} \ +CONFIG.MMCM_CLKOUT2_DIVIDE {1} \ +CONFIG.MMCM_CLKOUT3_DIVIDE {1} \ +CONFIG.MMCM_DIVCLK_DIVIDE {10} \ +CONFIG.NUM_OUT_CLKS {2} \ +CONFIG.USE_DYN_RECONFIG {true} \ + ] $clk_wiz_1 + + # Create instance: v_axi4s_vid_out_0, and set properties + set v_axi4s_vid_out_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:v_axi4s_vid_out:4.0 v_axi4s_vid_out_0 ] + set_property -dict [ list \ +CONFIG.C_HAS_ASYNC_CLK {1} \ + ] $v_axi4s_vid_out_0 + + # Create instance: v_tc_0, and set properties + set v_tc_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:v_tc:6.1 v_tc_0 ] + set_property -dict [ list \ +CONFIG.GEN_F0_VBLANK_HEND {1280} \ +CONFIG.GEN_F0_VBLANK_HSTART {1280} \ +CONFIG.GEN_F0_VFRAME_SIZE {750} \ +CONFIG.GEN_F0_VSYNC_HEND {1280} \ +CONFIG.GEN_F0_VSYNC_HSTART {1280} \ +CONFIG.GEN_F0_VSYNC_VEND {729} \ +CONFIG.GEN_F0_VSYNC_VSTART {724} \ +CONFIG.GEN_F1_VBLANK_HEND {1280} \ +CONFIG.GEN_F1_VBLANK_HSTART {1280} \ +CONFIG.GEN_F1_VFRAME_SIZE {750} \ +CONFIG.GEN_F1_VSYNC_HEND {1280} \ +CONFIG.GEN_F1_VSYNC_HSTART {1280} \ +CONFIG.GEN_F1_VSYNC_VEND {729} \ +CONFIG.GEN_F1_VSYNC_VSTART {724} \ +CONFIG.GEN_HACTIVE_SIZE {1280} \ +CONFIG.GEN_HFRAME_SIZE {1650} \ +CONFIG.GEN_HSYNC_END {1430} \ +CONFIG.GEN_HSYNC_START {1390} \ +CONFIG.GEN_VACTIVE_SIZE {720} \ +CONFIG.HAS_AXI4_LITE {true} \ +CONFIG.VIDEO_MODE {720p} \ +CONFIG.enable_detection {false} \ +CONFIG.max_clocks_per_line {4096} \ +CONFIG.max_lines_per_frame {2048} \ + ] $v_tc_0 + + # Create interface connections + connect_bd_intf_net -intf_net CLKWIZ_AXI_1 [get_bd_intf_pins CLKWIZ_AXI] [get_bd_intf_pins clk_wiz_1/s_axi_lite] + connect_bd_intf_net -intf_net Conn1 [get_bd_intf_pins VIDEO_OUT_AXI] [get_bd_intf_pins axi_mem_intercon/M00_AXI] + connect_bd_intf_net -intf_net Conn2 [get_bd_intf_pins VDMA_AXI] [get_bd_intf_pins axi_vdma_0/S_AXI_LITE] + connect_bd_intf_net -intf_net Conn3 [get_bd_intf_pins VTC_AXI] [get_bd_intf_pins v_tc_0/ctrl] + connect_bd_intf_net -intf_net axi_vdma_0_M_AXIS_MM2S [get_bd_intf_pins axi_vdma_0/M_AXIS_MM2S] [get_bd_intf_pins axis_fb_conv_0/S_AXIS] + connect_bd_intf_net -intf_net axi_vdma_0_M_AXI_MM2S [get_bd_intf_pins axi_mem_intercon/S00_AXI] [get_bd_intf_pins axi_vdma_0/M_AXI_MM2S] + connect_bd_intf_net -intf_net axis_fb_conv_0_video_out [get_bd_intf_pins axis_fb_conv_0/video_out] [get_bd_intf_pins v_axi4s_vid_out_0/video_in] + connect_bd_intf_net -intf_net v_axi4s_vid_out_0_vid_io_out [get_bd_intf_pins Video_IO_2_HDMI_TMDS_0/vid_io_in] [get_bd_intf_pins v_axi4s_vid_out_0/vid_io_out] + connect_bd_intf_net -intf_net v_tc_0_vtiming_out [get_bd_intf_pins v_axi4s_vid_out_0/vtiming_in] [get_bd_intf_pins v_tc_0/vtiming_out] + + # Create port connections + connect_bd_net -net ARESETN_2 [get_bd_pins axi_int_aresetn] [get_bd_pins axi_mem_intercon/ARESETN] + connect_bd_net -net Video_IO_2_HDMI_TMDS_0_hdmi_clk_n [get_bd_pins hdmi_clk_n] [get_bd_pins Video_IO_2_HDMI_TMDS_0/hdmi_clk_n] + connect_bd_net -net Video_IO_2_HDMI_TMDS_0_hdmi_clk_p [get_bd_pins hdmi_clk_p] [get_bd_pins Video_IO_2_HDMI_TMDS_0/hdmi_clk_p] + connect_bd_net -net Video_IO_2_HDMI_TMDS_0_hdmi_data_n [get_bd_pins hdmi_data_n] [get_bd_pins Video_IO_2_HDMI_TMDS_0/hdmi_data_n] + connect_bd_net -net Video_IO_2_HDMI_TMDS_0_hdmi_data_p [get_bd_pins hdmi_data_p] [get_bd_pins Video_IO_2_HDMI_TMDS_0/hdmi_data_p] + connect_bd_net -net aclk_1 [get_bd_pins axi_aclk] [get_bd_pins axi_mem_intercon/ACLK] [get_bd_pins axi_mem_intercon/M00_ACLK] [get_bd_pins axi_mem_intercon/S00_ACLK] [get_bd_pins axi_vdma_0/m_axi_mm2s_aclk] [get_bd_pins axi_vdma_0/m_axis_mm2s_aclk] [get_bd_pins axi_vdma_0/s_axi_lite_aclk] [get_bd_pins axis_fb_conv_0/s_axis_aclk] [get_bd_pins clk_wiz_1/s_axi_aclk] [get_bd_pins v_axi4s_vid_out_0/aclk] [get_bd_pins v_tc_0/s_axi_aclk] + connect_bd_net -net aresetn_1 [get_bd_pins axi_per_aresetn] [get_bd_pins axi_mem_intercon/M00_ARESETN] [get_bd_pins axi_mem_intercon/S00_ARESETN] [get_bd_pins axi_vdma_0/axi_resetn] [get_bd_pins axis_fb_conv_0/s_axis_aresetn] [get_bd_pins clk_wiz_1/s_axi_aresetn] [get_bd_pins v_axi4s_vid_out_0/aresetn] [get_bd_pins v_tc_0/s_axi_aresetn] + connect_bd_net -net axi_vdma_0_mm2s_introut [get_bd_pins tx_dma_int] [get_bd_pins axi_vdma_0/mm2s_introut] + connect_bd_net -net clk_in1_1 [get_bd_pins ref_clk] [get_bd_pins clk_wiz_1/clk_in1] + connect_bd_net -net clk_wiz_1_clk_out2 [get_bd_pins Video_IO_2_HDMI_TMDS_0/video_clk5x_in] [get_bd_pins clk_wiz_1/clk_out2] + connect_bd_net -net clk_wiz_1_locked [get_bd_pins Video_IO_2_HDMI_TMDS_0/lock_in] [get_bd_pins clk_wiz_1/locked] + connect_bd_net -net v_axi4s_vid_out_0_vtg_ce [get_bd_pins v_axi4s_vid_out_0/vtg_ce] [get_bd_pins v_tc_0/gen_clken] + connect_bd_net -net video_clk_in_1 [get_bd_pins Video_IO_2_HDMI_TMDS_0/video_clk_in] [get_bd_pins clk_wiz_1/clk_out1] [get_bd_pins v_axi4s_vid_out_0/vid_io_out_clk] [get_bd_pins v_tc_0/clk] + + # Restore current instance + current_bd_instance $oldCurInst +} + +# Hierarchical cell: video_in +proc create_hier_cell_video_in { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_msg_id "BD_TCL-102" "ERROR" "create_hier_cell_video_in() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 VDMA_AXI + create_bd_intf_pin -mode Master -vlnv xilinx.com:interface:aximm_rtl:1.0 VIDEO_IN_AXI + + # Create pins + create_bd_pin -dir I -type clk axi_aclk + create_bd_pin -dir I -from 0 -to 0 -type rst axi_aresetn + create_bd_pin -dir I -from 0 -to 0 axi_int_aresetn + create_bd_pin -dir I colors_mode + create_bd_pin -dir I csi_clk_n + create_bd_pin -dir I csi_clk_p + create_bd_pin -dir I -from 0 -to 0 csi_data_lp_n + create_bd_pin -dir I -from 0 -to 0 csi_data_lp_p + create_bd_pin -dir I -from 1 -to 0 csi_data_n + create_bd_pin -dir I -from 1 -to 0 csi_data_p + create_bd_pin -dir I -from 0 -to 0 enable + create_bd_pin -dir I -type rst ext_reset_in + create_bd_pin -dir I processing_clk + create_bd_pin -dir I ref_clk + create_bd_pin -dir O rx_dma_int + + # Create instance: axi_interconnect_0, and set properties + set axi_interconnect_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 axi_interconnect_0 ] + set_property -dict [ list \ +CONFIG.NUM_MI {1} \ + ] $axi_interconnect_0 + + # Create instance: axi_vdma_0, and set properties + set axi_vdma_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_vdma:6.3 axi_vdma_0 ] + set_property -dict [ list \ +CONFIG.c_include_mm2s {0} \ +CONFIG.c_include_s2mm_dre {1} \ +CONFIG.c_m_axi_s2mm_data_width {64} \ +CONFIG.c_mm2s_genlock_mode {0} \ +CONFIG.c_num_fstores {1} \ +CONFIG.c_s2mm_genlock_mode {0} \ +CONFIG.c_s2mm_linebuffer_depth {4096} \ +CONFIG.c_s2mm_max_burst_length {32} \ + ] $axi_vdma_0 + + # Create instance: axis_data_fifo_0, and set properties + set axis_data_fifo_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:1.1 axis_data_fifo_0 ] + set_property -dict [ list \ +CONFIG.FIFO_DEPTH {16384} \ +CONFIG.HAS_TLAST {1} \ +CONFIG.IS_ACLK_ASYNC {1} \ +CONFIG.TDATA_NUM_BYTES {2} \ +CONFIG.TUSER_WIDTH {1} \ + ] $axis_data_fifo_0 + + # Create instance: axis_data_fifo_3, and set properties + set axis_data_fifo_3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:1.1 axis_data_fifo_3 ] + + # Create instance: axis_data_fifo_4, and set properties + set axis_data_fifo_4 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:1.1 axis_data_fifo_4 ] + set_property -dict [ list \ +CONFIG.FIFO_DEPTH {4096} \ +CONFIG.IS_ACLK_ASYNC {1} \ + ] $axis_data_fifo_4 + + # Create instance: axis_raw_demosaic_0, and set properties + set axis_raw_demosaic_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axis_raw_demosaic:1.0 axis_raw_demosaic_0 ] + set_property -dict [ list \ +CONFIG.C_COLOR_POS {2} \ +CONFIG.C_IN_TYPE {1} \ +CONFIG.C_MODE {1} \ + ] $axis_raw_demosaic_0 + + # Create instance: axis_raw_unpack_0, and set properties + set axis_raw_unpack_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axis_raw_unpack:1.0 axis_raw_unpack_0 ] + set_property -dict [ list \ +CONFIG.C_IMP_TYPE {1} \ +CONFIG.C_OUT_TYPE {1} \ + ] $axis_raw_unpack_0 + + # Create instance: csi2_d_phy_rx_0, and set properties + set csi2_d_phy_rx_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:csi2_d_phy_rx:1.0 csi2_d_phy_rx_0 ] + set_property -dict [ list \ +CONFIG.C_ADD_IDELAYCTRL {true} \ +CONFIG.C_CALIB_WAIT {8191} \ +CONFIG.C_NUM_LP_LANES {1} \ +CONFIG.C_RATE_LIMIT {50} \ +CONFIG.C_USE_DELAY {true} \ + ] $csi2_d_phy_rx_0 + + # Create instance: csi_to_axis_0, and set properties + set csi_to_axis_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:csi_to_axis:1.0 csi_to_axis_0 ] + set_property -dict [ list \ +CONFIG.C_TIMEOUT {255} \ + ] $csi_to_axis_0 + + # Create instance: proc_sys_reset_0, and set properties + set proc_sys_reset_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset_0 ] + + # Create instance: proc_sys_reset_1, and set properties + set proc_sys_reset_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset_1 ] + + # Create interface connections + connect_bd_intf_net -intf_net Conn2 [get_bd_intf_pins axis_data_fifo_0/S_AXIS] [get_bd_intf_pins csi_to_axis_0/M_AXIS] + connect_bd_intf_net -intf_net Conn3 [get_bd_intf_pins VDMA_AXI] [get_bd_intf_pins axi_vdma_0/S_AXI_LITE] + connect_bd_intf_net -intf_net Conn4 [get_bd_intf_pins VIDEO_IN_AXI] [get_bd_intf_pins axi_interconnect_0/M00_AXI] + connect_bd_intf_net -intf_net axi_vdma_0_M_AXI_S2MM [get_bd_intf_pins axi_interconnect_0/S00_AXI] [get_bd_intf_pins axi_vdma_0/M_AXI_S2MM] + connect_bd_intf_net -intf_net axis_data_fifo_0_M_AXIS [get_bd_intf_pins axis_data_fifo_0/M_AXIS] [get_bd_intf_pins axis_raw_unpack_0/S_AXIS] + connect_bd_intf_net -intf_net axis_data_fifo_3_M_AXIS [get_bd_intf_pins axis_data_fifo_3/M_AXIS] [get_bd_intf_pins axis_raw_demosaic_0/S_AXIS] + connect_bd_intf_net -intf_net axis_data_fifo_4_M_AXIS [get_bd_intf_pins axi_vdma_0/S_AXIS_S2MM] [get_bd_intf_pins axis_data_fifo_4/M_AXIS] + connect_bd_intf_net -intf_net axis_raw_demosaic_0_M_AXIS [get_bd_intf_pins axis_data_fifo_4/S_AXIS] [get_bd_intf_pins axis_raw_demosaic_0/M_AXIS] + connect_bd_intf_net -intf_net axis_raw_unpack_0_M_AXIS [get_bd_intf_pins axis_data_fifo_3/S_AXIS] [get_bd_intf_pins axis_raw_unpack_0/M_AXIS] + connect_bd_intf_net -intf_net csi2_d_phy_rx_0_RX_MIPI_PPI [get_bd_intf_pins csi2_d_phy_rx_0/RX_MIPI_PPI] [get_bd_intf_pins csi_to_axis_0/RX_MIPI_PPI] + connect_bd_intf_net -intf_net csi_to_axis_0_data_err [get_bd_intf_pins csi2_d_phy_rx_0/data_err] [get_bd_intf_pins csi_to_axis_0/data_err] + + # Create port connections + connect_bd_net -net CSI_AXIS_RSTN [get_bd_pins axis_data_fifo_0/s_axis_aresetn] [get_bd_pins csi_to_axis_0/m_axis_aresetn] [get_bd_pins proc_sys_reset_0/peripheral_aresetn] + connect_bd_net -net ENABLE_STREAM [get_bd_pins enable] [get_bd_pins csi_to_axis_0/enable_in] + connect_bd_net -net axi_int_aresetn_1 [get_bd_pins axi_int_aresetn] [get_bd_pins axi_interconnect_0/ARESETN] + connect_bd_net -net axi_vdma_0_s2mm_introut [get_bd_pins rx_dma_int] [get_bd_pins axi_vdma_0/s2mm_introut] + connect_bd_net -net colors_mode_1 [get_bd_pins colors_mode] [get_bd_pins axis_raw_demosaic_0/colors_mode] + connect_bd_net -net csi_clk_n_1 [get_bd_pins csi_clk_n] [get_bd_pins csi2_d_phy_rx_0/clk_rxn] + connect_bd_net -net csi_clk_p_1 [get_bd_pins csi_clk_p] [get_bd_pins csi2_d_phy_rx_0/clk_rxp] + connect_bd_net -net csi_data_lp_n_1 [get_bd_pins csi_data_lp_n] [get_bd_pins csi2_d_phy_rx_0/data_lp_n] + connect_bd_net -net csi_data_lp_p_1 [get_bd_pins csi_data_lp_p] [get_bd_pins csi2_d_phy_rx_0/data_lp_p] + connect_bd_net -net csi_data_n_1 [get_bd_pins csi_data_n] [get_bd_pins csi2_d_phy_rx_0/data_rxn] + connect_bd_net -net csi_data_p_1 [get_bd_pins csi_data_p] [get_bd_pins csi2_d_phy_rx_0/data_rxp] + connect_bd_net -net ext_reset_in_1 [get_bd_pins ext_reset_in] [get_bd_pins proc_sys_reset_0/ext_reset_in] [get_bd_pins proc_sys_reset_1/ext_reset_in] + connect_bd_net -net m_axi_aclk [get_bd_pins axi_aclk] [get_bd_pins axi_interconnect_0/ACLK] [get_bd_pins axi_interconnect_0/M00_ACLK] [get_bd_pins axi_interconnect_0/S00_ACLK] [get_bd_pins axi_vdma_0/m_axi_s2mm_aclk] [get_bd_pins axi_vdma_0/s_axi_lite_aclk] [get_bd_pins axi_vdma_0/s_axis_s2mm_aclk] [get_bd_pins axis_data_fifo_4/m_axis_aclk] + connect_bd_net -net m_axis_aresetn_1 [get_bd_pins axi_aresetn] [get_bd_pins axi_interconnect_0/M00_ARESETN] [get_bd_pins axi_interconnect_0/S00_ARESETN] [get_bd_pins axi_vdma_0/axi_resetn] [get_bd_pins axis_data_fifo_4/m_axis_aresetn] + connect_bd_net -net proc_sys_reset_1_peripheral_aresetn [get_bd_pins axis_data_fifo_0/m_axis_aresetn] [get_bd_pins axis_data_fifo_3/s_axis_aresetn] [get_bd_pins axis_data_fifo_4/s_axis_aresetn] [get_bd_pins axis_raw_demosaic_0/axis_aresetn] [get_bd_pins axis_raw_unpack_0/axis_aresetn] [get_bd_pins proc_sys_reset_1/peripheral_aresetn] + connect_bd_net -net processing_clk_1 [get_bd_pins processing_clk] [get_bd_pins axis_data_fifo_0/m_axis_aclk] [get_bd_pins axis_data_fifo_3/s_axis_aclk] [get_bd_pins axis_data_fifo_4/s_axis_aclk] [get_bd_pins axis_raw_demosaic_0/axis_aclk] [get_bd_pins axis_raw_unpack_0/axis_aclk] [get_bd_pins proc_sys_reset_1/slowest_sync_clk] + connect_bd_net -net ref_clk_in_1 [get_bd_pins ref_clk] [get_bd_pins csi2_d_phy_rx_0/in_delay_clk] + connect_bd_net -net s_axis_aclk_1 [get_bd_pins axis_data_fifo_0/s_axis_aclk] [get_bd_pins csi2_d_phy_rx_0/rxbyteclkhs] [get_bd_pins csi_to_axis_0/m_axis_aclk] [get_bd_pins csi_to_axis_0/rxbyteclkhs] [get_bd_pins proc_sys_reset_0/slowest_sync_clk] + + # Restore current instance + current_bd_instance $oldCurInst +} + +# Hierarchical cell: resets +proc create_hier_cell_resets { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_msg_id "BD_TCL-102" "ERROR" "create_hier_cell_resets() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + + # Create pins + create_bd_pin -dir I -type clk axi_clk + create_bd_pin -dir O -from 0 -to 0 -type rst axi_int_aresetn + create_bd_pin -dir O -from 0 -to 0 -type rst axi_per_aresetn + create_bd_pin -dir I -type rst ext_reset_in + + # Create instance: rst_processing_system7_0_50M, and set properties + set rst_processing_system7_0_50M [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 rst_processing_system7_0_50M ] + + # Create port connections + connect_bd_net -net ext_reset_in_1 [get_bd_pins ext_reset_in] [get_bd_pins rst_processing_system7_0_50M/ext_reset_in] + connect_bd_net -net rst_processing_system7_0_50M_interconnect_aresetn [get_bd_pins axi_int_aresetn] [get_bd_pins rst_processing_system7_0_50M/interconnect_aresetn] + connect_bd_net -net rst_processing_system7_0_50M_peripheral_aresetn [get_bd_pins axi_per_aresetn] [get_bd_pins rst_processing_system7_0_50M/peripheral_aresetn] + connect_bd_net -net slowest_sync_clk_1 [get_bd_pins axi_clk] [get_bd_pins rst_processing_system7_0_50M/slowest_sync_clk] + + # Restore current instance + current_bd_instance $oldCurInst +} + +# Hierarchical cell: audio +proc create_hier_cell_audio { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_msg_id "BD_TCL-102" "ERROR" "create_hier_cell_audio() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:axis_rtl:1.0 DMA_RX_ACK + create_bd_intf_pin -mode Master -vlnv xilinx.com:interface:axis_rtl:1.0 DMA_RX_REQ + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:axis_rtl:1.0 DMA_TX_ACK + create_bd_intf_pin -mode Master -vlnv xilinx.com:interface:axis_rtl:1.0 DMA_TX_REQ + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 S00_AXI + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vp_Vn + + # Create pins + create_bd_pin -dir I audio_clk + create_bd_pin -dir I -type clk axi_aclk + create_bd_pin -dir I -from 0 -to 0 -type rst axi_resetn + create_bd_pin -dir O pwm_l_out + create_bd_pin -dir O pwm_r_out + + # Create instance: axi_i2s_adi_0, and set properties + set axi_i2s_adi_0 [ create_bd_cell -type ip -vlnv digilentinc.com:user:axi_i2s_adi:1.2 axi_i2s_adi_0 ] + set_property -dict [ list \ +CONFIG.C_DMA_TYPE {1} \ + ] $axi_i2s_adi_0 + + # Create instance: axis_to_i2s_0, and set properties + set axis_to_i2s_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axis_to_i2s:1.0 axis_to_i2s_0 ] + + # Create instance: i2s_to_pwm_0, and set properties + set i2s_to_pwm_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:i2s_to_pwm:1.0 i2s_to_pwm_0 ] + + # Create instance: xadc_wiz_0, and set properties + set xadc_wiz_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xadc_wiz:3.3 xadc_wiz_0 ] + set_property -dict [ list \ +CONFIG.ADC_CONVERSION_RATE {1000} \ +CONFIG.DCLK_FREQUENCY {150} \ +CONFIG.ENABLE_AXI4STREAM {true} \ +CONFIG.ENABLE_RESET {true} \ +CONFIG.ENABLE_VCCDDRO_ALARM {false} \ +CONFIG.ENABLE_VCCPAUX_ALARM {false} \ +CONFIG.ENABLE_VCCPINT_ALARM {false} \ +CONFIG.INTERFACE_SELECTION {None} \ +CONFIG.OT_ALARM {false} \ +CONFIG.SINGLE_CHANNEL_SELECTION {VP_VN} \ +CONFIG.USER_TEMP_ALARM {false} \ +CONFIG.VCCAUX_ALARM {false} \ +CONFIG.VCCINT_ALARM {false} \ + ] $xadc_wiz_0 + + # Create interface connections + connect_bd_intf_net -intf_net Conn1 [get_bd_intf_pins Vp_Vn] [get_bd_intf_pins xadc_wiz_0/Vp_Vn] + connect_bd_intf_net -intf_net Conn2 [get_bd_intf_pins DMA_TX_ACK] [get_bd_intf_pins axi_i2s_adi_0/DMA_TX_ACK] + connect_bd_intf_net -intf_net Conn3 [get_bd_intf_pins DMA_TX_REQ] [get_bd_intf_pins axi_i2s_adi_0/DMA_TX_REQ] + connect_bd_intf_net -intf_net Conn4 [get_bd_intf_pins DMA_RX_REQ] [get_bd_intf_pins axi_i2s_adi_0/DMA_RX_REQ] + connect_bd_intf_net -intf_net Conn5 [get_bd_intf_pins DMA_RX_ACK] [get_bd_intf_pins axi_i2s_adi_0/DMA_RX_ACK] + connect_bd_intf_net -intf_net Conn6 [get_bd_intf_pins S00_AXI] [get_bd_intf_pins axi_i2s_adi_0/S00_AXI] + connect_bd_intf_net -intf_net xadc_wiz_0_M_AXIS [get_bd_intf_pins axis_to_i2s_0/s_axis] [get_bd_intf_pins xadc_wiz_0/M_AXIS] + + # Create port connections + connect_bd_net -net BCLK [get_bd_pins axi_i2s_adi_0/BCLK_O] [get_bd_pins axis_to_i2s_0/i2s_bclk] [get_bd_pins i2s_to_pwm_0/i2s_bclk] + connect_bd_net -net DATA_CLK_I_1 [get_bd_pins audio_clk] [get_bd_pins axi_i2s_adi_0/DATA_CLK_I] + connect_bd_net -net LRCLK [get_bd_pins axi_i2s_adi_0/LRCLK_O] [get_bd_pins axis_to_i2s_0/i2s_lrclk] [get_bd_pins i2s_to_pwm_0/i2s_lrclk] + connect_bd_net -net i2s_to_pwm_0_pwm_l_out [get_bd_pins pwm_l_out] [get_bd_pins i2s_to_pwm_0/pwm_l_out] + connect_bd_net -net i2s_to_pwm_0_pwm_r_out [get_bd_pins pwm_r_out] [get_bd_pins i2s_to_pwm_0/pwm_r_out] + connect_bd_net -net m_axis_resetn_1 [get_bd_pins axi_resetn] [get_bd_pins axi_i2s_adi_0/DMA_REQ_RX_RSTN] [get_bd_pins axi_i2s_adi_0/DMA_REQ_TX_RSTN] [get_bd_pins axi_i2s_adi_0/s00_axi_aresetn] [get_bd_pins axis_to_i2s_0/s_axis_aresetn] [get_bd_pins xadc_wiz_0/m_axis_resetn] + connect_bd_net -net play_sdata [get_bd_pins axi_i2s_adi_0/SDATA_O] [get_bd_pins i2s_to_pwm_0/i2s_sdata] + connect_bd_net -net rec_sdata [get_bd_pins axi_i2s_adi_0/SDATA_I] [get_bd_pins axis_to_i2s_0/i2s_sdata] + connect_bd_net -net s_axis_aclk_1 [get_bd_pins axi_aclk] [get_bd_pins axi_i2s_adi_0/DMA_REQ_RX_ACLK] [get_bd_pins axi_i2s_adi_0/DMA_REQ_TX_ACLK] [get_bd_pins axi_i2s_adi_0/s00_axi_aclk] [get_bd_pins axis_to_i2s_0/s_axis_aclk] [get_bd_pins i2s_to_pwm_0/clk_in] [get_bd_pins xadc_wiz_0/m_axis_aclk] [get_bd_pins xadc_wiz_0/s_axis_aclk] + + # Restore current instance + current_bd_instance $oldCurInst +} + + +# Procedure to create entire design; Provide argument to make +# procedure reusable. If parentCell is "", will use root. +proc create_root_design { parentCell } { + + variable script_folder + + if { $parentCell eq "" } { + set parentCell [get_bd_cells /] + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + + # Create interface ports +# #TE_MOD# set DDR [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:ddrx_rtl:1.0 DDR ] +# #TE_MOD# set FIXED_IO [ create_bd_intf_port -mode Master -vlnv xilinx.com:display_processing_system7:fixedio_rtl:1.0 FIXED_IO ] + set GPIO_1 [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:gpio_rtl:1.0 GPIO_1 ] + set Vp_Vn [ create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vp_Vn ] + + # Create ports + set PWM_L [ create_bd_port -dir O PWM_L ] + set PWM_R [ create_bd_port -dir O PWM_R ] + set csi_c_clk_n [ create_bd_port -dir I csi_c_clk_n ] + set csi_c_clk_p [ create_bd_port -dir I csi_c_clk_p ] + set csi_d_lp_n [ create_bd_port -dir I -from 0 -to 0 csi_d_lp_n ] + set csi_d_lp_p [ create_bd_port -dir I -from 0 -to 0 csi_d_lp_p ] + set csi_d_n [ create_bd_port -dir I -from 1 -to 0 csi_d_n ] + set csi_d_p [ create_bd_port -dir I -from 1 -to 0 csi_d_p ] + set hdmi_clk_n [ create_bd_port -dir O hdmi_clk_n ] + set hdmi_clk_p [ create_bd_port -dir O hdmi_clk_p ] + set hdmi_data_n [ create_bd_port -dir O -from 2 -to 0 hdmi_data_n ] + set hdmi_data_p [ create_bd_port -dir O -from 2 -to 0 hdmi_data_p ] + + # Create instance: audio + create_hier_cell_audio [current_bd_instance .] audio + + # Create instance: axi_reg32_0, and set properties + set axi_reg32_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axi_reg32:1.0 axi_reg32_0 ] + set_property -dict [ list \ +CONFIG.C_NUM_RO_REG {1} \ +CONFIG.C_NUM_WR_REG {1} \ + ] $axi_reg32_0 + + # Create instance: processing_system7_0, and set properties + set processing_system7_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 ] +# #TE_MOD#_Add next line# + apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1"} [get_bd_cells processing_system7_0] +# #TE_MOD#_Add next line# + set tcl_ext [];if { [catch {set tcl_ext [glob -join -dir ${TE::BOARDDEF_PATH}/carrier_extension/ *_preset.tcl]}] } {};foreach carrier_ext $tcl_ext { source $carrier_ext}; + set_property -dict [ list \ +CONFIG.PCW_ACT_ENET0_PERIPHERAL_FREQMHZ {125.000000} \ +CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {160.000000} \ +CONFIG.PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ {100.000000} \ +CONFIG.PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ {200.000000} \ +CONFIG.PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ {12.307692} \ +CONFIG.PCW_ACT_QSPI_PERIPHERAL_FREQMHZ {200.000000} \ +CONFIG.PCW_ACT_SDIO_PERIPHERAL_FREQMHZ {100.000000} \ +CONFIG.PCW_ACT_UART_PERIPHERAL_FREQMHZ {100.000000} \ +CONFIG.PCW_CLK0_FREQ {160000000} \ +CONFIG.PCW_CLK1_FREQ {100000000} \ +CONFIG.PCW_CLK2_FREQ {200000000} \ +CONFIG.PCW_CLK3_FREQ {12307692} \ +CONFIG.PCW_CPU_CPU_6X4X_MAX_RANGE {667} \ +CONFIG.PCW_DCI_PERIPHERAL_DIVISOR0 {15} \ +CONFIG.PCW_DCI_PERIPHERAL_DIVISOR1 {7} \ +CONFIG.PCW_DM_WIDTH {2} \ +CONFIG.PCW_DQS_WIDTH {2} \ +CONFIG.PCW_DQ_WIDTH {16} \ +CONFIG.PCW_ENET0_PERIPHERAL_CLKSRC {External} \ +CONFIG.PCW_EN_CLK1_PORT {1} \ +CONFIG.PCW_EN_CLK2_PORT {1} \ +CONFIG.PCW_EN_CLK3_PORT {1} \ +CONFIG.PCW_EN_EMIO_CD_SDIO0 {0} \ +CONFIG.PCW_EN_EMIO_GPIO {1} \ +CONFIG.PCW_EN_EMIO_I2C0 {1} \ +CONFIG.PCW_EN_EMIO_PJTAG {0} \ +CONFIG.PCW_EN_EMIO_SDIO0 {0} \ +CONFIG.PCW_EN_EMIO_SPI0 {0} \ +CONFIG.PCW_EN_EMIO_SPI1 {0} \ +CONFIG.PCW_EN_EMIO_TTC0 {1} \ +CONFIG.PCW_EN_EMIO_TTC1 {0} \ +CONFIG.PCW_EN_EMIO_UART0 {0} \ +CONFIG.PCW_EN_EMIO_WP_SDIO0 {0} \ +CONFIG.PCW_EN_GPIO {1} \ +CONFIG.PCW_EN_I2C0 {1} \ +CONFIG.PCW_EN_I2C1 {1} \ +CONFIG.PCW_EN_QSPI {1} \ +CONFIG.PCW_EN_SDIO0 {0} \ +CONFIG.PCW_EN_SDIO1 {1} \ +CONFIG.PCW_EN_SPI0 {0} \ +CONFIG.PCW_EN_SPI1 {0} \ +CONFIG.PCW_EN_TTC0 {1} \ +CONFIG.PCW_EN_TTC1 {0} \ +CONFIG.PCW_EN_UART0 {0} \ +CONFIG.PCW_EN_UART1 {1} \ +CONFIG.PCW_EN_USB0 {1} \ +CONFIG.PCW_FCLK0_PERIPHERAL_CLKSRC {IO PLL} \ +CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR0 {5} \ +CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR1 {2} \ +CONFIG.PCW_FCLK1_PERIPHERAL_CLKSRC {IO PLL} \ +CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR0 {4} \ +CONFIG.PCW_FCLK2_PERIPHERAL_CLKSRC {IO PLL} \ +CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR0 {4} \ +CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR0 {26} \ +CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR1 {5} \ +CONFIG.PCW_FCLK_CLK1_BUF {TRUE} \ +CONFIG.PCW_FCLK_CLK2_BUF {TRUE} \ +CONFIG.PCW_FCLK_CLK3_BUF {TRUE} \ +CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {160} \ +CONFIG.PCW_FPGA1_PERIPHERAL_FREQMHZ {100} \ +CONFIG.PCW_FPGA2_PERIPHERAL_FREQMHZ {200} \ +CONFIG.PCW_FPGA3_PERIPHERAL_FREQMHZ {12.288} \ +CONFIG.PCW_FPGA_FCLK1_ENABLE {1} \ +CONFIG.PCW_FPGA_FCLK2_ENABLE {1} \ +CONFIG.PCW_FPGA_FCLK3_ENABLE {1} \ +CONFIG.PCW_FTM_CTI_IN0 {} \ +CONFIG.PCW_FTM_CTI_IN2 {} \ +CONFIG.PCW_FTM_CTI_OUT0 {} \ +CONFIG.PCW_FTM_CTI_OUT2 {} \ +CONFIG.PCW_GPIO_EMIO_GPIO_ENABLE {1} \ +CONFIG.PCW_GPIO_EMIO_GPIO_IO {24} \ +CONFIG.PCW_GPIO_EMIO_GPIO_WIDTH {24} \ +CONFIG.PCW_GPIO_MIO_GPIO_ENABLE {1} \ +CONFIG.PCW_GPIO_MIO_GPIO_IO {MIO} \ +CONFIG.PCW_I2C0_GRP_INT_ENABLE {1} \ +CONFIG.PCW_I2C0_GRP_INT_IO {EMIO} \ +CONFIG.PCW_I2C0_I2C0_IO {EMIO} \ +CONFIG.PCW_I2C0_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_I2C1_GRP_INT_ENABLE {1} \ +CONFIG.PCW_I2C1_GRP_INT_IO {EMIO} \ +CONFIG.PCW_I2C1_I2C1_IO {MIO 48 .. 49} \ +CONFIG.PCW_I2C1_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_I2C_PERIPHERAL_FREQMHZ {111.111115} \ +CONFIG.PCW_I2C_RESET_ENABLE {0} \ +CONFIG.PCW_I2C_RESET_SELECT {} \ +CONFIG.PCW_SD0_GRP_WP_ENABLE {0} \ +CONFIG.PCW_SD0_GRP_WP_IO {} \ +CONFIG.PCW_SD1_GRP_CD_ENABLE {1} \ +CONFIG.PCW_SD1_GRP_CD_IO {MIO 0} \ +CONFIG.PCW_SD1_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_SD1_SD1_IO {MIO 10 .. 15} \ +CONFIG.PCW_SDIO_PERIPHERAL_CLKSRC {IO PLL} \ +CONFIG.PCW_SDIO_PERIPHERAL_DIVISOR0 {16} \ +CONFIG.PCW_SDIO_PERIPHERAL_VALID {1} \ +CONFIG.PCW_SPI0_GRP_SS0_ENABLE {0} \ +CONFIG.PCW_SPI0_GRP_SS0_IO {} \ +CONFIG.PCW_SPI0_GRP_SS2_ENABLE {0} \ +CONFIG.PCW_SPI0_GRP_SS2_IO {} \ +CONFIG.PCW_SPI1_GRP_SS0_ENABLE {0} \ +CONFIG.PCW_SPI1_GRP_SS0_IO {} \ +CONFIG.PCW_SPI1_GRP_SS2_ENABLE {0} \ +CONFIG.PCW_SPI1_GRP_SS2_IO {} \ +CONFIG.PCW_SPI_PERIPHERAL_DIVISOR0 {1} \ +CONFIG.PCW_SPI_PERIPHERAL_VALID {0} \ +CONFIG.PCW_S_AXI_HP0_DATA_WIDTH {32} \ +CONFIG.PCW_TTC0_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_TTC0_TTC0_IO {EMIO} \ +CONFIG.PCW_TTC1_TTC1_IO {} \ +CONFIG.PCW_UART1_GRP_FULL_ENABLE {0} \ +CONFIG.PCW_UART1_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_UART1_UART1_IO {MIO 8 .. 9} \ +CONFIG.PCW_UART_PERIPHERAL_DIVISOR0 {16} \ +CONFIG.PCW_UART_PERIPHERAL_VALID {1} \ +CONFIG.PCW_UIPARAM_GENERATE_SUMMARY {NONE} \ +CONFIG.PCW_USB0_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_USB0_RESET_ENABLE {1} \ +CONFIG.PCW_USB0_RESET_IO {MIO 7} \ +CONFIG.PCW_USB0_USB0_IO {MIO 28 .. 39} \ +CONFIG.PCW_USB_RESET_ENABLE {1} \ +CONFIG.PCW_USB_RESET_SELECT {Share reset pin} \ +CONFIG.PCW_USE_DMA0 {1} \ +CONFIG.PCW_USE_DMA1 {1} \ +CONFIG.PCW_USE_FABRIC_INTERRUPT {1} \ +CONFIG.PCW_USE_M_AXI_GP0 {1} \ +CONFIG.PCW_USE_S_AXI_HP0 {1} \ +CONFIG.PCW_USE_S_AXI_HP1 {1} \ + ] $processing_system7_0 + +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_T_RC {48.91} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_T_FAW {40.0} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_ROW_ADDR_COUNT {15} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_PARTNO {MT41J256M16 RE-125} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_MEMORY_TYPE {DDR 3 (Low Voltage)} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DRAM_WIDTH {16 Bits} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQ_3_PACKAGE_LENGTH {780} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQ_2_PACKAGE_LENGTH {550} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQ_1_PACKAGE_LENGTH {53.995} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQ_0_PACKAGE_LENGTH {77.166} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQS_3_PACKAGE_LENGTH {700} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQS_2_PACKAGE_LENGTH {520} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQS_1_PACKAGE_LENGTH {57.044} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQS_0_PACKAGE_LENGTH {81.244} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DEVICE_CAPACITY {4096 MBits} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_CLOCK_3_PACKAGE_LENGTH {86.1835} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_CLOCK_2_PACKAGE_LENGTH {86.1835} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_CLOCK_1_PACKAGE_LENGTH {86.1835} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_CLOCK_0_PACKAGE_LENGTH {86.1835} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_BUS_WIDTH {16 Bit} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_3 {-0.614} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_2 {-0.434} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_1 {0.029} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_0 {0.005} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY3 {0.433} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY2 {0.318} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY1 {0.070} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY0 {0.082} \ +# #TE_MOD# #Empty Line + # Create instance: processing_system7_0_axi_periph, and set properties + set processing_system7_0_axi_periph [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 processing_system7_0_axi_periph ] + set_property -dict [ list \ +CONFIG.NUM_MI {6} \ + ] $processing_system7_0_axi_periph + + # Create instance: resets + create_hier_cell_resets [current_bd_instance .] resets + + # Create instance: video_in + create_hier_cell_video_in [current_bd_instance .] video_in + + # Create instance: video_out + create_hier_cell_video_out [current_bd_instance .] video_out + + # Create instance: xlconcat_0, and set properties + set xlconcat_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 xlconcat_0 ] + set_property -dict [ list \ +CONFIG.NUM_PORTS {2} \ + ] $xlconcat_0 + + # Create instance: xlslice_0, and set properties + set xlslice_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_0 ] + set_property -dict [ list \ +CONFIG.DIN_FROM {0} \ +CONFIG.DIN_TO {0} \ +CONFIG.DIN_WIDTH {32} \ + ] $xlslice_0 + + # Create instance: xlslice_1, and set properties + set xlslice_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_1 ] + set_property -dict [ list \ +CONFIG.DIN_FROM {1} \ +CONFIG.DIN_TO {1} \ +CONFIG.DIN_WIDTH {32} \ +CONFIG.DOUT_WIDTH {1} \ + ] $xlslice_1 + + # Create interface connections + connect_bd_intf_net -intf_net Vp_Vn_1 [get_bd_intf_ports Vp_Vn] [get_bd_intf_pins audio/Vp_Vn] + connect_bd_intf_net -intf_net audio_DMA_RX_REQ [get_bd_intf_pins audio/DMA_RX_REQ] [get_bd_intf_pins processing_system7_0/DMA1_REQ] + connect_bd_intf_net -intf_net audio_DMA_TX_REQ [get_bd_intf_pins audio/DMA_TX_REQ] [get_bd_intf_pins processing_system7_0/DMA0_REQ] +# #TE_MOD# connect_bd_intf_net -intf_net processing_system7_0_DDR [get_bd_intf_ports DDR] [get_bd_intf_pins processing_system7_0/DDR] + connect_bd_intf_net -intf_net processing_system7_0_DMA0_ACK [get_bd_intf_pins audio/DMA_TX_ACK] [get_bd_intf_pins processing_system7_0/DMA0_ACK] + connect_bd_intf_net -intf_net processing_system7_0_DMA1_ACK [get_bd_intf_pins audio/DMA_RX_ACK] [get_bd_intf_pins processing_system7_0/DMA1_ACK] +# #TE_MOD# connect_bd_intf_net -intf_net processing_system7_0_FIXED_IO [get_bd_intf_ports FIXED_IO] [get_bd_intf_pins processing_system7_0/FIXED_IO] + connect_bd_intf_net -intf_net processing_system7_0_GPIO_0 [get_bd_intf_ports GPIO_1] [get_bd_intf_pins processing_system7_0/GPIO_0] + connect_bd_intf_net -intf_net processing_system7_0_M_AXI_GP0 [get_bd_intf_pins processing_system7_0/M_AXI_GP0] [get_bd_intf_pins processing_system7_0_axi_periph/S00_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M00_AXI [get_bd_intf_pins processing_system7_0_axi_periph/M00_AXI] [get_bd_intf_pins video_out/VDMA_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M01_AXI [get_bd_intf_pins processing_system7_0_axi_periph/M01_AXI] [get_bd_intf_pins video_in/VDMA_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M02_AXI [get_bd_intf_pins audio/S00_AXI] [get_bd_intf_pins processing_system7_0_axi_periph/M02_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M03_AXI [get_bd_intf_pins axi_reg32_0/S_AXI] [get_bd_intf_pins processing_system7_0_axi_periph/M03_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M04_AXI [get_bd_intf_pins processing_system7_0_axi_periph/M04_AXI] [get_bd_intf_pins video_out/VTC_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M05_AXI [get_bd_intf_pins processing_system7_0_axi_periph/M05_AXI] [get_bd_intf_pins video_out/CLKWIZ_AXI] + connect_bd_intf_net -intf_net video_in_M00_AXI [get_bd_intf_pins processing_system7_0/S_AXI_HP1] [get_bd_intf_pins video_in/VIDEO_IN_AXI] + connect_bd_intf_net -intf_net video_out_M00_AXI [get_bd_intf_pins processing_system7_0/S_AXI_HP0] [get_bd_intf_pins video_out/VIDEO_OUT_AXI] + + # Create port connections + connect_bd_net -net audio_pwm_l_out [get_bd_ports PWM_L] [get_bd_pins audio/pwm_l_out] + connect_bd_net -net audio_pwm_r_out [get_bd_ports PWM_R] [get_bd_pins audio/pwm_r_out] + connect_bd_net -net axi_reg32_0_WR0 [get_bd_pins axi_reg32_0/WR0] [get_bd_pins xlslice_0/Din] [get_bd_pins xlslice_1/Din] + connect_bd_net -net csi_c_clk_n_1 [get_bd_ports csi_c_clk_n] [get_bd_pins video_in/csi_clk_n] + connect_bd_net -net csi_c_clk_p_1 [get_bd_ports csi_c_clk_p] [get_bd_pins video_in/csi_clk_p] + connect_bd_net -net csi_d_lp_n_1 [get_bd_ports csi_d_lp_n] [get_bd_pins video_in/csi_data_lp_n] + connect_bd_net -net csi_d_lp_p_1 [get_bd_ports csi_d_lp_p] [get_bd_pins video_in/csi_data_lp_p] + connect_bd_net -net csi_d_n_1 [get_bd_ports csi_d_n] [get_bd_pins video_in/csi_data_n] + connect_bd_net -net csi_d_p_1 [get_bd_ports csi_d_p] [get_bd_pins video_in/csi_data_p] + connect_bd_net -net processing_system7_0_FCLK_CLK0 [get_bd_pins audio/axi_aclk] [get_bd_pins axi_reg32_0/s_axi_aclk] [get_bd_pins processing_system7_0/DMA0_ACLK] [get_bd_pins processing_system7_0/DMA1_ACLK] [get_bd_pins processing_system7_0/FCLK_CLK0] [get_bd_pins processing_system7_0/M_AXI_GP0_ACLK] [get_bd_pins processing_system7_0/S_AXI_HP0_ACLK] [get_bd_pins processing_system7_0/S_AXI_HP1_ACLK] [get_bd_pins processing_system7_0_axi_periph/ACLK] [get_bd_pins processing_system7_0_axi_periph/M00_ACLK] [get_bd_pins processing_system7_0_axi_periph/M01_ACLK] [get_bd_pins processing_system7_0_axi_periph/M02_ACLK] [get_bd_pins processing_system7_0_axi_periph/M03_ACLK] [get_bd_pins processing_system7_0_axi_periph/M04_ACLK] [get_bd_pins processing_system7_0_axi_periph/M05_ACLK] [get_bd_pins processing_system7_0_axi_periph/S00_ACLK] [get_bd_pins resets/axi_clk] [get_bd_pins video_in/axi_aclk] [get_bd_pins video_in/processing_clk] [get_bd_pins video_out/axi_aclk] + connect_bd_net -net processing_system7_0_FCLK_CLK2 [get_bd_pins processing_system7_0/FCLK_CLK2] [get_bd_pins video_in/ref_clk] [get_bd_pins video_out/ref_clk] + connect_bd_net -net processing_system7_0_FCLK_CLK3 [get_bd_pins audio/audio_clk] [get_bd_pins processing_system7_0/FCLK_CLK3] + connect_bd_net -net processing_system7_0_FCLK_RESET0_N [get_bd_pins processing_system7_0/FCLK_RESET0_N] [get_bd_pins resets/ext_reset_in] [get_bd_pins video_in/ext_reset_in] + connect_bd_net -net rst_processing_system7_0_50M_interconnect_aresetn [get_bd_pins processing_system7_0_axi_periph/ARESETN] [get_bd_pins resets/axi_int_aresetn] [get_bd_pins video_in/axi_int_aresetn] [get_bd_pins video_out/axi_int_aresetn] + connect_bd_net -net rst_processing_system7_0_50M_peripheral_aresetn [get_bd_pins audio/axi_resetn] [get_bd_pins axi_reg32_0/s_axi_aresetn] [get_bd_pins processing_system7_0_axi_periph/M00_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M01_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M02_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M03_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M04_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M05_ARESETN] [get_bd_pins processing_system7_0_axi_periph/S00_ARESETN] [get_bd_pins resets/axi_per_aresetn] [get_bd_pins video_in/axi_aresetn] [get_bd_pins video_out/axi_per_aresetn] + connect_bd_net -net video_in_rx_dma_int [get_bd_pins video_in/rx_dma_int] [get_bd_pins xlconcat_0/In1] + connect_bd_net -net video_out_hdmi_clk_n [get_bd_ports hdmi_clk_n] [get_bd_pins video_out/hdmi_clk_n] + connect_bd_net -net video_out_hdmi_clk_p [get_bd_ports hdmi_clk_p] [get_bd_pins video_out/hdmi_clk_p] + connect_bd_net -net video_out_hdmi_data_n [get_bd_ports hdmi_data_n] [get_bd_pins video_out/hdmi_data_n] + connect_bd_net -net video_out_hdmi_data_p [get_bd_ports hdmi_data_p] [get_bd_pins video_out/hdmi_data_p] + connect_bd_net -net video_out_mm2s_introut [get_bd_pins video_out/tx_dma_int] [get_bd_pins xlconcat_0/In0] + connect_bd_net -net xlconcat_0_dout [get_bd_pins processing_system7_0/IRQ_F2P] [get_bd_pins xlconcat_0/dout] + connect_bd_net -net xlslice_0_Dout [get_bd_pins video_in/enable] [get_bd_pins xlslice_0/Dout] + connect_bd_net -net xlslice_1_Dout [get_bd_pins video_in/colors_mode] [get_bd_pins xlslice_1/Dout] + + # Create address segments + create_bd_addr_seg -range 0x00010000 -offset 0x43C00000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs audio/axi_i2s_adi_0/S00_AXI/S00_AXI_reg] SEG_axi_i2s_adi_0_S00_AXI_reg + create_bd_addr_seg -range 0x00010000 -offset 0x43C10000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs axi_reg32_0/S_AXI/S_AXI_reg] SEG_axi_reg32_0_S_AXI_reg + create_bd_addr_seg -range 0x00010000 -offset 0x43000000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs video_out/axi_vdma_0/S_AXI_LITE/Reg] SEG_axi_vdma_0_Reg + create_bd_addr_seg -range 0x00010000 -offset 0x43010000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs video_in/axi_vdma_0/S_AXI_LITE/Reg] SEG_axi_vdma_0_Reg1 + create_bd_addr_seg -range 0x00010000 -offset 0x43C30000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs video_out/clk_wiz_1/s_axi_lite/Reg] SEG_clk_wiz_1_Reg + create_bd_addr_seg -range 0x00010000 -offset 0x43C20000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs video_out/v_tc_0/ctrl/Reg] SEG_v_tc_0_Reg + create_bd_addr_seg -range 0x20000000 -offset 0x00000000 [get_bd_addr_spaces video_in/axi_vdma_0/Data_S2MM] [get_bd_addr_segs processing_system7_0/S_AXI_HP1/HP1_DDR_LOWOCM] SEG_processing_system7_0_HP1_DDR_LOWOCM + create_bd_addr_seg -range 0x20000000 -offset 0x00000000 [get_bd_addr_spaces video_out/axi_vdma_0/Data_MM2S] [get_bd_addr_segs processing_system7_0/S_AXI_HP0/HP0_DDR_LOWOCM] SEG_processing_system7_0_HP0_DDR_LOWOCM + + + # Restore current instance + current_bd_instance $oldCurInst + + save_bd_design +} +# End of create_root_design() + + +################################################################## +# MAIN FLOW +################################################################## + +create_root_design "" + + + diff --git a/zynqberrydemo1/board_files/TE0726/1.0/board.xml b/zynqberrydemo1/board_files/TE0726/1.0/board.xml new file mode 100644 index 0000000..01bb3f3 --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726/1.0/board.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + ZYNQ-7 TE0726_01 Board File Image + + + + + + + 0.1 + + + + + 1.0 + + + ZYNQ-7 TE0726-01 ZynqBerry Board (form factor Raspberry Pi) with 128MB Memory and 100MBit Ethernet, speed grade -1 and commercial temperature range. Supported PCB Revisions: REV01. Note: primary boot device is QSPI, SD can be used as secondary boot device only. + + + + + + + FPGA part on the board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726/1.0/part0_pins.xml b/zynqberrydemo1/board_files/TE0726/1.0/part0_pins.xml new file mode 100644 index 0000000..f7ce2ba --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726/1.0/part0_pins.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726/1.0/preset.xml b/zynqberrydemo1/board_files/TE0726/1.0/preset.xml new file mode 100644 index 0000000..aa55c3d --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726/1.0/preset.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726/2.1/board.xml b/zynqberrydemo1/board_files/TE0726/2.1/board.xml new file mode 100644 index 0000000..5fe89cf --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726/2.1/board.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + ZYNQ-7 TE0726_R Board File Image + + + + + + + 0.3 + 0.2 + + + + + 2.1 + + + ZYNQ-7 TE0726-R ZynqBerry Board (form factor Raspberry Pi) with 128MB Memory and 100MBit Ethernet, speed grade -1 and commercial temperature range. Supported PCB Revisions: REV03 and REV02. Note: primary boot device is QSPI, SD can be used as secondary boot device only. + + + + + + + FPGA part on the board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726/2.1/part0_pins.xml b/zynqberrydemo1/board_files/TE0726/2.1/part0_pins.xml new file mode 100644 index 0000000..1d0deec --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726/2.1/part0_pins.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726/2.1/preset.xml b/zynqberrydemo1/board_files/TE0726/2.1/preset.xml new file mode 100644 index 0000000..e6f98eb --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726/2.1/preset.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726/3.1/board.xml b/zynqberrydemo1/board_files/TE0726/3.1/board.xml new file mode 100644 index 0000000..7facc84 --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726/3.1/board.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + ZYNQ-7 TE0726_M Board File Image + + + + + + + 0.3 + 0.2 + + + + + 3.1 + + + ZYNQ-7 TE0726-M ZynqBerry Board (form factor Raspberry Pi) with 512MB Memory and 100MBit Ethernet, speed grade -1 and commercial temperature range. Supported PCB Revisions: REV03 and REV02. Note: primary boot device is QSPI, SD can be used as secondary boot device only. + + + + + + + FPGA part on the board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726/3.1/part0_pins.xml b/zynqberrydemo1/board_files/TE0726/3.1/part0_pins.xml new file mode 100644 index 0000000..2c43aef --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726/3.1/part0_pins.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726/3.1/preset.xml b/zynqberrydemo1/board_files/TE0726/3.1/preset.xml new file mode 100644 index 0000000..c9afaf8 --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726/3.1/preset.xml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726_7S/3.1/board.xml b/zynqberrydemo1/board_files/TE0726_7S/3.1/board.xml new file mode 100644 index 0000000..14d4db1 --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726_7S/3.1/board.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + ZYNQ-7 TE0726_M Board File Image + + + + + + + 0.3 + 0.2 + + + + + 3.1 + + + ZYNQ-7S TE0726-07S ZynqBerry Board (form factor Raspberry Pi) with single ARM Cortex-A9, 512MB Memory, 100MBit Ethernet, speed grade -1 and commercial temperature range. Supported PCB Revisions: REV03 and REV02. Note: primary boot device is QSPI, SD can be used as secondary boot device only. + + + + + + + FPGA part on the board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726_7S/3.1/part0_pins.xml b/zynqberrydemo1/board_files/TE0726_7S/3.1/part0_pins.xml new file mode 100644 index 0000000..0449cdd --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726_7S/3.1/part0_pins.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/zynqberrydemo1/board_files/TE0726_7S/3.1/preset.xml b/zynqberrydemo1/board_files/TE0726_7S/3.1/preset.xml new file mode 100644 index 0000000..764f8c6 --- /dev/null +++ b/zynqberrydemo1/board_files/TE0726_7S/3.1/preset.xml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo1/console/readme.txt b/zynqberrydemo1/console/readme.txt new file mode 100644 index 0000000..922ccd0 --- /dev/null +++ b/zynqberrydemo1/console/readme.txt @@ -0,0 +1,4 @@ +Console command files for reference design root directory. +Use console command file for generation: +_create_linux_setup.sh +_create_win_setup.cmd \ No newline at end of file diff --git a/zynqberrydemo1/constraints/_i_bitgen_common.xdc b/zynqberrydemo1/constraints/_i_bitgen_common.xdc new file mode 100644 index 0000000..5c862d0 --- /dev/null +++ b/zynqberrydemo1/constraints/_i_bitgen_common.xdc @@ -0,0 +1,7 @@ +# +# Common BITGEN related settings for TE0726 +# +set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] +set_property CONFIG_VOLTAGE 3.3 [current_design] +set_property CFGBVS VCCO [current_design] + diff --git a/zynqberrydemo1/constraints/_i_common.xdc b/zynqberrydemo1/constraints/_i_common.xdc new file mode 100644 index 0000000..3077d50 --- /dev/null +++ b/zynqberrydemo1/constraints/_i_common.xdc @@ -0,0 +1,5 @@ +# +# +# +set_property BITSTREAM.CONFIG.UNUSEDPIN PULLUP [current_design] + diff --git a/zynqberrydemo1/constraints/_i_csi.xdc b/zynqberrydemo1/constraints/_i_csi.xdc new file mode 100644 index 0000000..77d913e --- /dev/null +++ b/zynqberrydemo1/constraints/_i_csi.xdc @@ -0,0 +1,18 @@ +set_property PACKAGE_PIN N11 [get_ports csi_c_clk_p] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_p] +set_property PACKAGE_PIN M9 [get_ports {csi_d_lp_n[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_n[0]}] +set_property PACKAGE_PIN N9 [get_ports {csi_d_lp_p[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_p[0]}] +set_property PACKAGE_PIN M10 [get_ports {csi_d_p[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[0]}] +set_property PACKAGE_PIN P13 [get_ports {csi_d_p[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[1]}] +set_property INTERNAL_VREF 0.6 [get_iobanks 34] +set_property PULLDOWN true [get_ports {csi_d_lp_p[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_n[0]}] +# RPI Camera 1 +create_clock -period 6.250 -name csi_clk -add [get_ports csi_c_clk_p] +# RPI Camera 2.1 +#create_clock -period 1.875 -name csi_clk -add [get_ports csi_c_clk_p] + diff --git a/zynqberrydemo1/constraints/_i_hdmi.xdc b/zynqberrydemo1/constraints/_i_hdmi.xdc new file mode 100644 index 0000000..39b9707 --- /dev/null +++ b/zynqberrydemo1/constraints/_i_hdmi.xdc @@ -0,0 +1,7 @@ +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_p] +set_property PACKAGE_PIN R7 [get_ports hdmi_clk_p] + +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[*]}] +set_property PACKAGE_PIN P8 [get_ports {hdmi_data_p[0]}] +set_property PACKAGE_PIN P10 [get_ports {hdmi_data_p[1]}] +set_property PACKAGE_PIN P11 [get_ports {hdmi_data_p[2]}] diff --git a/zynqberrydemo1/constraints/_i_te0726.xdc b/zynqberrydemo1/constraints/_i_te0726.xdc new file mode 100644 index 0000000..c259487 --- /dev/null +++ b/zynqberrydemo1/constraints/_i_te0726.xdc @@ -0,0 +1,90 @@ +#set_property IOSTANDARD LVCMOS33 [get_ports spdif_tx_o] +#set_property PACKAGE_PIN K15 [get_ports spdif_tx_o] + +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[*]}] +# GPIO Pins +# GPIO2 +set_property PACKAGE_PIN K15 [get_ports {gpio_1_tri_io[0]}] +# GPIO3 +set_property PACKAGE_PIN J14 [get_ports {gpio_1_tri_io[1]}] +# GPIO4 +set_property PACKAGE_PIN H12 [get_ports {gpio_1_tri_io[2]}] +# GPIO5 +set_property PACKAGE_PIN N14 [get_ports {gpio_1_tri_io[3]}] +# GPIO6 +set_property PACKAGE_PIN R15 [get_ports {gpio_1_tri_io[4]}] +# GPIO7 +set_property PACKAGE_PIN L14 [get_ports {gpio_1_tri_io[5]}] +# GPIO8 +set_property PACKAGE_PIN L15 [get_ports {gpio_1_tri_io[6]}] +# GPIO9 +set_property PACKAGE_PIN J13 [get_ports {gpio_1_tri_io[7]}] +# GPIO10 +set_property PACKAGE_PIN H14 [get_ports {gpio_1_tri_io[8]}] +# GPIO11 +set_property PACKAGE_PIN J15 [get_ports {gpio_1_tri_io[9]}] +# GPIO12 +set_property PACKAGE_PIN M15 [get_ports {gpio_1_tri_io[10]}] +# GPIO13 +set_property PACKAGE_PIN R13 [get_ports {gpio_1_tri_io[11]}] +# GPIO16 +set_property PACKAGE_PIN L13 [get_ports {gpio_1_tri_io[12]}] +# GPIO17 +set_property PACKAGE_PIN G11 [get_ports {gpio_1_tri_io[13]}] +# GPIO18 +set_property PACKAGE_PIN H11 [get_ports {gpio_1_tri_io[14]}] +# GPIO19 +set_property PACKAGE_PIN R12 [get_ports {gpio_1_tri_io[15]}] +# GPIO20 +set_property PACKAGE_PIN M14 [get_ports {gpio_1_tri_io[16]}] +# GPIO21 +set_property PACKAGE_PIN P15 [get_ports {gpio_1_tri_io[17]}] +# GPIO22 +set_property PACKAGE_PIN H13 [get_ports {gpio_1_tri_io[18]}] +# GPIO23 +set_property PACKAGE_PIN J11 [get_ports {gpio_1_tri_io[19]}] +# GPIO24 +set_property PACKAGE_PIN K11 [get_ports {gpio_1_tri_io[20]}] +# GPIO25 +set_property PACKAGE_PIN K13 [get_ports {gpio_1_tri_io[21]}] +# GPIO26 +set_property PACKAGE_PIN L12 [get_ports {gpio_1_tri_io[22]}] +# GPIO27 +set_property PACKAGE_PIN G12 [get_ports {gpio_1_tri_io[23]}] + +## DSI_D0_N +#set_property PACKAGE_PIN F13 [get_ports {gpio_1_tri_io[24]}] +## DSI_D0_P +#set_property PACKAGE_PIN F14 [get_ports {gpio_1_tri_io[25]}] +## DSI_D1_N +#set_property PACKAGE_PIN F12 [get_ports {gpio_1_tri_io[26]}] +## DSI_D1_P +#set_property PACKAGE_PIN E13 [get_ports {gpio_1_tri_io[27]}] +## DSI_C_N +#set_property PACKAGE_PIN E11 [get_ports {gpio_1_tri_io[28]}] +## DSI_C_P +#set_property PACKAGE_PIN E12 [get_ports {gpio_1_tri_io[29]}] + +## CSI_D0_N +#set_property PACKAGE_PIN M11 [get_ports {gpio_1_tri_io[30]}] +## CSI_D0_P +#set_property PACKAGE_PIN M10 [get_ports {gpio_1_tri_io[31]}] +## CSI_D1_N +#set_property PACKAGE_PIN P14 [get_ports {gpio_1_tri_io[32]}] +## CSI_D2_P +#set_property PACKAGE_PIN P13 [get_ports {gpio_1_tri_io[33]}] +## CSI_C_N +#set_property PACKAGE_PIN N12 [get_ports {gpio_1_tri_io[34]}] +## CSI_C_P +#set_property PACKAGE_PIN N11 [get_ports {gpio_1_tri_io[35]}] +## PWM_R +##set_property PACKAGE_PIN N8 [get_ports {gpio_1_tri_io[36]}] +## PWM_L +##set_property PACKAGE_PIN N7 [get_ports {gpio_1_tri_io[37]}] + +# PWM_R +set_property PACKAGE_PIN N8 [get_ports PWM_R] +# PWM_L +set_property PACKAGE_PIN N7 [get_ports PWM_L] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_*] + diff --git a/zynqberrydemo1/constraints/_i_timing.xdc b/zynqberrydemo1/constraints/_i_timing.xdc new file mode 100644 index 0000000..07325db --- /dev/null +++ b/zynqberrydemo1/constraints/_i_timing.xdc @@ -0,0 +1,10 @@ +#set_clock_groups -asynchronous -group [get_clocks clk_fpga_3] -group [get_clocks clk_fpga_0] +#set_property ASYNC_REG true [get_cells {zsys_i/audio/axi_i2s_adi_0/U0/ctrl/tx_sync/out_data_reg[4]}] +#set_property ASYNC_REG true [get_cells {zsys_i/audio/axi_i2s_adi_0/U0/ctrl/SDATA_O_reg[0]}] +#set_clock_groups -asynchronous -group [get_clocks clk_fpga_0] -group [get_clocks clk_fpga_3] + +#set_false_path -from [get_pins {zsys_i/axi_reg32_0/U0/axi_reg32_v1_0_S_AXI_inst/slv_reg16_reg[1]/C}] -to [get_pins zsys_i/video_in/axis_raw_demosaic_0/U0/colors_mode_i_reg/D] +#set_false_path -from [get_pins zsys_i/video_in/csi_to_axis_0/U0/lane_align_inst/err_req_reg/C] -to [get_pins zsys_i/video_in/csi2_d_phy_rx_0/U0/clock_upd_req_reg/D] + +#set_false_path -from [get_pins {zsys_i/video_in/axi_vdma_0/U0/I_PRMRY_DATAMOVER/GEN_S2MM_FULL.I_S2MM_FULL_WRAPPER/GEN_INCLUDE_REALIGNER.I_S2MM_REALIGNER/GEN_INCLUDE_SCATTER.I_S2MM_SCATTER/sig_max_first_increment_reg[2]/C}] -to [get_pins zsys_i/video_in/axi_vdma_0/U0/I_PRMRY_DATAMOVER/GEN_S2MM_FULL.I_S2MM_FULL_WRAPPER/GEN_INCLUDE_REALIGNER.I_S2MM_REALIGNER/GEN_INCLUDE_SCATTER.I_S2MM_SCATTER/sig_btt_eq_0_reg/D] +#set_false_path -from [get_pins {zsys_i/video_in/axi_vdma_0/U0/I_PRMRY_DATAMOVER/GEN_S2MM_FULL.I_S2MM_FULL_WRAPPER/GEN_INCLUDE_REALIGNER.I_S2MM_REALIGNER/GEN_INCLUDE_SCATTER.I_S2MM_SCATTER/sig_btt_cntr_dup_reg[1]/C}] -to [get_pins zsys_i/video_in/axi_vdma_0/U0/I_PRMRY_DATAMOVER/GEN_S2MM_FULL.I_S2MM_FULL_WRAPPER/GEN_INCLUDE_REALIGNER.I_S2MM_REALIGNER/GEN_INCLUDE_SCATTER.I_S2MM_SCATTER/sig_btt_eq_0_reg/D] \ No newline at end of file diff --git a/zynqberrydemo1/constraints/vivado_target.xdc b/zynqberrydemo1/constraints/vivado_target.xdc new file mode 100644 index 0000000..e69de29 diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/component.xml b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/component.xml new file mode 100644 index 0000000..5d57029 --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/component.xml @@ -0,0 +1,545 @@ + + + trenz.biz + user + Video_IO_2_HDMI_TMDS + 1.0 + + + vid_io_in + + + + + + + VBLANK + + + vid_vblank + + + + + ACTIVE_VIDEO + + + vid_active_video + + + + + VSYNC + + + vid_vsync + + + + + DATA + + + vid_data + + + + + HBLANK + + + vid_hblank + + + + + HSYNC + + + vid_hsync + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + Video_IO_2_HDMI_TMDS_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 1224790b + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + Video_IO_2_HDMI_TMDS_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + 1224790b + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 35d6fe5d + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + xilinx_utilityxitfiles + Utility XIT/TTCL + :vivado.xilinx.com:xit.util + + xilinx_utilityxitfiles_view_fileset + + + + viewChecksum + 799cb8bb + + + + + + + video_clk_in + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_clk5x_in + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + lock_in + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + vid_data + + in + + 23 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_active_video + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_hblank + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_vblank + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_hsync + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_vsync + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + hdmi_data_p + + out + + 2 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + hdmi_data_n + + out + + 2 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + hdmi_clk_p + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + hdmi_clk_n + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_CLK_SWAP + HDMI CLK P/N Swap + FALSE + + + C_D0_SWAP + HDMI D0 P/N Swap + FALSE + + + C_D1_SWAP + HDMI D1 P/N Swap + FALSE + + + C_D2_SWAP + HDMI D2 P/N Swap + FALSE + + + C_INT_CLOCKING + C Int Clocking + true + + + C_VIDEO_MODE + Video Mode + 0 + + + + + + choice_pairs_c4f3a1c9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/tmds_encoder.vhd + vhdlSource + + + src/serdes_ddr.vhd + vhdlSource + + + hdl/dvi_encoder.vhd + vhdlSource + + + hdl/clock_system.vhd + vhdlSource + + + hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd + vhdlSource + CHECKSUM_e3ad9cc9 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/tmds_encoder.vhd + vhdlSource + USED_IN_ipstatic + + + src/serdes_ddr.vhd + vhdlSource + + + hdl/dvi_encoder.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/clock_system.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl + tclSource + CHECKSUM_60af6022 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + xilinx_utilityxitfiles_view_fileset + + gui/Video_IO_2_HDMI_TMDS_v1_0.gtcl + GTCL + + + + Video_IO_2_HDMI_TMDS + + + Component_Name + Video_IO_2_HDMI_TMDS_v1_0 + + + C_CLK_SWAP + HDMI CLK P/N Swap + FALSE + + + C_D0_SWAP + HDMI D0 P/N Swap + FALSE + + + C_D1_SWAP + HDMI D1 P/N Swap + FALSE + + + C_D2_SWAP + HDMI D2 P/N Swap + FALSE + + + C_VIDEO_MODE + Video Mode + 0 + + + + true + + + + + + C_INT_CLOCKING + Internal Clocks System + true + + + + + + virtex7 + artix7 + kintex7 + zynq + + + /Video_&_Image_Processing + + Video IO to HDMI TMDS Interface v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 26 + + xilinx.com:user:Video_IO_2_HDMI_TMDS:1.0 + + 2017-05-12T14:48:23Z + + b:/cores/2015.4/design/te0726/iotest/ip_lib/video_io_2_hdmi_tmds_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd new file mode 100644 index 0000000..71e5f47 --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd @@ -0,0 +1,229 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity Video_IO_2_HDMI_TMDS_v1_0 is +generic ( + -- Pin swap options + C_CLK_SWAP : boolean := FALSE; + C_D0_SWAP : boolean := FALSE; + C_D1_SWAP : boolean := FALSE; + C_D2_SWAP : boolean := FALSE; + + -- Clocking options + C_INT_CLOCKING : BOOLEAN := TRUE; + C_VIDEO_MODE : integer range 0 to 8 := 2 +-- 0 = VGA (640x480 @ 60 Hz) 25 250 24b +-- 1 = 480p (720x480 @ 60 Hz) 27 270 24b +-- 2 = SVGA (800x600 @ 60 Hz) 40 400 24b +-- 3 = XGA (1024x768 @ 60 Hz) 65 650 24b +-- 4 = HD (1366x768 @ 60 Hz) 85.5 855 24b +-- 5 = WXGA (1280x800 @ 60 Hz) 71 710 24b +-- 6 = HDTV 720p (1280x720 @ 60 Hz) 74.25 742.5 24b +-- 7 = HDTV 1080i (1920x1080 @ 60 Hz interlaced) 74.25 742.5 24b +-- 8 = SXGA (1280x1024 @ 60 Hz) 108 1080 24b +); +port ( + -- Clocks + video_clk_in : in STD_LOGIC; -- Main clock Input + video_clk5x_in : in STD_LOGIC; -- SERDES clock Input + lock_in : in STD_LOGIC; -- External PLL locking + -- Video IO Interface + vid_data : in STD_LOGIC_VECTOR(23 downto 0); + vid_active_video : in STD_LOGIC; + vid_hblank : in STD_LOGIC; + vid_vblank : in STD_LOGIC; + vid_hsync : in STD_LOGIC; + vid_vsync : in STD_LOGIC; + -- HDMI Interface + hdmi_data_p : out STD_LOGIC_VECTOR(2 downto 0); + hdmi_data_n : out STD_LOGIC_VECTOR(2 downto 0); + hdmi_clk_p : out STD_LOGIC; + hdmi_clk_n : out STD_LOGIC +); +end Video_IO_2_HDMI_TMDS_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of Video_IO_2_HDMI_TMDS_v1_0 is +---------------------------------------------------------------------------------- +component clock_system is +generic( + C_VIDEO_MODE : integer range 0 to 9 := 2 +); +port ( + clk_in : in STD_LOGIC; + pclk1x : out STD_LOGIC; + pclk5x : out STD_LOGIC; + lock : out STD_LOGIC +); +end component; + +component serdes_ddr is +port ( + clk_in : in STD_LOGIC; + clk_dv_in : in STD_LOGIC; + reset_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(9 downto 0); + data_out : out STD_LOGIC +); +end component; + +component dvi_encoder is +port ( + clkin : in STD_LOGIC; + rstin : in STD_LOGIC; + blue_din : in STD_LOGIC_VECTOR(7 downto 0); + green_din : in STD_LOGIC_VECTOR(7 downto 0); + red_din : in STD_LOGIC_VECTOR(7 downto 0); + hsync : in STD_LOGIC; + vsync : in STD_LOGIC; + de : in STD_LOGIC; + blue_dout : out STD_LOGIC_VECTOR(9 downto 0); + green_dout : out STD_LOGIC_VECTOR(9 downto 0); + red_dout : out STD_LOGIC_VECTOR(9 downto 0) +); +end component; +---------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +-- Clock system +signal pclk5x : STD_LOGIC; +signal pclk1x : STD_LOGIC; +signal lock : STD_LOGIC; +signal reset : STD_LOGIC; +signal serdes_rst : STD_LOGIC; +-- Video system +signal red_data : STD_LOGIC_VECTOR(7 downto 0); +signal green_data : STD_LOGIC_VECTOR(7 downto 0); +signal blue_data : STD_LOGIC_VECTOR(7 downto 0); +type s_data_type is array (5 downto 0) of STD_LOGIC_VECTOR(9 downto 0); +signal s_data_r : s_data_type; +signal s_data_o : s_data_type; +signal tmds_out : STD_LOGIC_VECTOR(3 downto 0); +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +int_clock_sys: if C_INT_CLOCKING = TRUE generate +begin + -- Clock system + clock_system_inst: clock_system + generic map( + C_VIDEO_MODE => C_VIDEO_MODE + ) + port map( + clk_in => video_clk_in, + pclk1x => pclk1x, + pclk5x => pclk5x, + lock => lock + ); +end generate; +ext_clock_sys: if C_INT_CLOCKING = FALSE generate +begin + lock <= lock_in; + pclk1x <= video_clk_in; + pclk5x <= video_clk5x_in; +end generate; +---------------------------------------------------------------------------------- +serdes_rst <= not lock; +reset <= net_gnd; +---------------------------------------------------------------------------------- +-- Video system +red_data <= vid_data(23 downto 16); +green_data <= vid_data( 7 downto 0); +blue_data <= vid_data(15 downto 8); +-- Encoder +enc_inst: dvi_encoder +port map( + clkin => pclk1x, + rstin => reset, + blue_din => blue_data, + green_din => green_data, + red_din => red_data, + hsync => vid_hsync, + vsync => vid_vsync, + de => vid_active_video, + blue_dout => s_data_r(0), + green_dout => s_data_r(1), + red_dout => s_data_r(2) +); +-- HDMI Clock generation +s_data_r(3) <= b"11111_00000"; +---------------------------------------------------------------------------------- +-- Bitswap +---------------------------------------------------------------------------------- +d0_direct: if C_D0_SWAP = FALSE generate + s_data_o(0) <= s_data_r(0); +end generate; +d0_inv: if C_D0_SWAP = TRUE generate + s_data_o(0) <= not s_data_r(0); +end generate; + +d1_direct: if C_D1_SWAP = FALSE generate + s_data_o(1) <= s_data_r(1); +end generate; +d1_inv: if C_D1_SWAP = TRUE generate + s_data_o(1) <= not s_data_r(1); +end generate; + +d2_direct: if C_D2_SWAP = FALSE generate + s_data_o(2) <= s_data_r(2); +end generate; +d2_inv: if C_D2_SWAP = TRUE generate + s_data_o(2) <= not s_data_r(2); +end generate; + +clk_direct: if C_CLK_SWAP = FALSE generate + s_data_o(3) <= s_data_r(3); +end generate; +clk_inv: if C_CLK_SWAP = TRUE generate + s_data_o(3) <= not s_data_r(3); +end generate; +---------------------------------------------------------------------------------- +-- Serdes +---------------------------------------------------------------------------------- +HDMI_ddr_lines_gen: for i in 0 to 3 generate +begin + serdes_ddr_inst: serdes_ddr + port map( + clk_in => pclk5x, + clk_dv_in => pclk1x, + reset_in => serdes_rst, + data_in => s_data_o(i), + data_out => tmds_out(i) + ); +end generate; +---------------------------------------------------------------------------------- +-- Output buffers +---------------------------------------------------------------------------------- +obufds_d0_inst: OBUFDS +port map( + I => tmds_out(0), + O => hdmi_data_p(0), + OB => hdmi_data_n(0) +); +obufds_d1_inst: OBUFDS +port map( + I => tmds_out(1), + O => hdmi_data_p(1), + OB => hdmi_data_n(1) +); +obufds_d2_inst: OBUFDS +port map( + I => tmds_out(2), + O => hdmi_data_p(2), + OB => hdmi_data_n(2) +); +obufds_clk_inst: OBUFDS +port map( + I => tmds_out(3), + O => hdmi_clk_p, + OB => hdmi_clk_n +); +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/clock_system.vhd b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/clock_system.vhd new file mode 100644 index 0000000..b0e23a8 --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/clock_system.vhd @@ -0,0 +1,282 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity clock_system is +generic( + C_VIDEO_MODE : integer range 0 to 8 := 2 +-- 0 = VGA (640x480 @ 60 Hz) 25 250 24b +-- 1 = 480p (720x480 @ 60 Hz) 27 270 24b +-- 2 = SVGA (800x600 @ 60 Hz) 40 400 24b +-- 3 = XGA (1024x768 @ 60 Hz) 65 650 24b +-- 4 = HD (1366x768 @ 60 Hz) 85.5 855 24b +-- 5 = WXGA (1280x800 @ 60 Hz) 71 710 24b +-- 6 = HDTV 720p (1280x720 @ 60 Hz) 74.25 742.5 24b +-- 7 = HDTV 1080i (1920x1080 @ 60 Hz interlaced) 74.25 742.5 24b +-- 8 = SXGA (1280x1024 @ 60 Hz) 108 1080 24b +); +port ( + clk_in : in STD_LOGIC; + pclk1x : out STD_LOGIC; + pclk5x : out STD_LOGIC; + lock : out STD_LOGIC +); +end clock_system; +------------------------------------------------------------------------------- +architecture Behavioral of clock_system is +------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +-- Clock system +signal clkfbout : STD_LOGIC; +signal pllclk5x_pll : STD_LOGIC; +signal pllclk5x_pll_g : STD_LOGIC; +signal pllclk1x_pll : STD_LOGIC; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +VGA_gen: if C_VIDEO_MODE = 0 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 40.0, + CLKFBOUT_MULT => 20, -- x10 clock + CLKOUT0_DIVIDE => 4, -- x5 clock + CLKOUT1_DIVIDE => 20, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +m480p_gen: if C_VIDEO_MODE = 1 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 37.037, + CLKFBOUT_MULT => 20, -- x10 clock + CLKOUT0_DIVIDE => 4, -- x5 clock + CLKOUT1_DIVIDE => 20, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +SVGA_gen: if C_VIDEO_MODE = 2 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 25.0, + CLKFBOUT_MULT => 20, -- x10 clock + CLKOUT0_DIVIDE => 4, -- x5 clock + CLKOUT1_DIVIDE => 20, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +XGA_gen: if C_VIDEO_MODE = 3 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 15.3846, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +HD_gen: if C_VIDEO_MODE = 4 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 11.6959, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +WXGA_gen: if C_VIDEO_MODE = 5 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 14.0845, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +HDTV_720p_gen: if C_VIDEO_MODE = 6 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 13.468, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +HDTV_1080p_gen: if C_VIDEO_MODE = 7 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 13.468, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +SXGA_gen: if C_VIDEO_MODE = 8 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 9.2592, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +dclk_BUFIO_inst : BUFIO +port map ( + I => pllclk5x_pll, + O => pclk5x +); + +out_clk_BUFG_inst : BUFG +port map ( + I => pllclk1x_pll, + O => pclk1x +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/convert_30to15_fifo.vhd b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/convert_30to15_fifo.vhd new file mode 100644 index 0000000..cdcde89 --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/convert_30to15_fifo.vhd @@ -0,0 +1,194 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity convert_30to15_fifo is +port ( + rst : in STD_LOGIC; -- reset + clk : in STD_LOGIC; -- clock input + clkx2 : in STD_LOGIC; -- 2x clock input + datain : in STD_LOGIC_VECTOR(29 downto 0); -- input data for 2:1 serialisation + dataout : out STD_LOGIC_VECTOR(14 downto 0) +); +end convert_30to15_fifo; +------------------------------------------------------------------------------- +architecture Behavioral of convert_30to15_fifo is +------------------------------------------------------------------------------- +constant net_vcc : STD_LOGIC := '1'; + +component dram16xn is +generic( + DATA_WIDTH : integer := 20 +); +port ( + clk : in STD_LOGIC; + write_en : in STD_LOGIC; + address : in STD_LOGIC_VECTOR(3 downto 0); + address_dp : in STD_LOGIC_VECTOR(3 downto 0); + data_in : in STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0); + o_data_out : out STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0); + o_data_out_dp : out STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0) +); +end component; + +---------------------------------------------------- +-- Here we instantiate a 16x10 Dual Port RAM +-- and fill first it with data aligned to +-- clk domain +---------------------------------------------------- +signal wa : STD_LOGIC_VECTOR( 3 downto 0); -- RAM read address +signal wa_d : STD_LOGIC_VECTOR( 3 downto 0); -- RAM read address +signal ra : STD_LOGIC_VECTOR( 3 downto 0); -- RAM read address +signal ra_d : STD_LOGIC_VECTOR( 3 downto 0); -- RAM read address +signal dataint : STD_LOGIC_VECTOR(29 downto 0); -- RAM output + +constant ADDR0 : STD_LOGIC_VECTOR(3 downto 0) := "0000"; +constant ADDR1 : STD_LOGIC_VECTOR(3 downto 0) := "0001"; +constant ADDR2 : STD_LOGIC_VECTOR(3 downto 0) := "0010"; +constant ADDR3 : STD_LOGIC_VECTOR(3 downto 0) := "0011"; +constant ADDR4 : STD_LOGIC_VECTOR(3 downto 0) := "0100"; +constant ADDR5 : STD_LOGIC_VECTOR(3 downto 0) := "0101"; +constant ADDR6 : STD_LOGIC_VECTOR(3 downto 0) := "0110"; +constant ADDR7 : STD_LOGIC_VECTOR(3 downto 0) := "0111"; +constant ADDR8 : STD_LOGIC_VECTOR(3 downto 0) := "1000"; +constant ADDR9 : STD_LOGIC_VECTOR(3 downto 0) := "1001"; +constant ADDR10 : STD_LOGIC_VECTOR(3 downto 0) := "1010"; +constant ADDR11 : STD_LOGIC_VECTOR(3 downto 0) := "1011"; +constant ADDR12 : STD_LOGIC_VECTOR(3 downto 0) := "1100"; +constant ADDR13 : STD_LOGIC_VECTOR(3 downto 0) := "1101"; +constant ADDR14 : STD_LOGIC_VECTOR(3 downto 0) := "1110"; +constant ADDR15 : STD_LOGIC_VECTOR(3 downto 0) := "1111"; + +signal rstsync : STD_LOGIC; +signal rstsync_q : STD_LOGIC; +signal rstp : STD_LOGIC; +signal sync : STD_LOGIC; +signal db : STD_LOGIC_VECTOR(29 downto 0); +signal mux : STD_LOGIC_VECTOR(14 downto 0); +------------------------------------------------------------------------------- +attribute ASYNC_REG : string; +attribute ASYNC_REG of rstsync : signal is "true"; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +process(wa) +begin + case wa is + when ADDR0 => wa_d <= ADDR1 ; + when ADDR1 => wa_d <= ADDR2 ; + when ADDR2 => wa_d <= ADDR3 ; + when ADDR3 => wa_d <= ADDR4 ; + when ADDR4 => wa_d <= ADDR5 ; + when ADDR5 => wa_d <= ADDR6 ; + when ADDR6 => wa_d <= ADDR7 ; + when ADDR7 => wa_d <= ADDR8 ; + when ADDR8 => wa_d <= ADDR9 ; + when ADDR9 => wa_d <= ADDR10; + when ADDR10 => wa_d <= ADDR11; + when ADDR11 => wa_d <= ADDR12; + when ADDR12 => wa_d <= ADDR13; + when ADDR13 => wa_d <= ADDR14; + when ADDR14 => wa_d <= ADDR15; + when others => wa_d <= ADDR0; + end case; +end process; + +process(clk, rst) +begin + if(rst = '1')then + wa <= (others => '0'); + elsif(clk = '1' and clk'event)then + wa <= wa_d; + end if; +end process; + +-- Dual Port fifo to bridge data from clk to clkx2 +fifo_inst: dram16xn +generic map( + DATA_WIDTH => 30 +) +port map( + clk => clk, + write_en => net_vcc, + address => wa, + address_dp => ra, + data_in => datain, + o_data_out => open, + o_data_out_dp => dataint +); + +----------------------------------------------------------------/ +-- Here starts clk2x domain for fifo read out +-- FIFO read is set to be once every 2 cycles of clk2x in order +-- to keep up pace with the fifo write speed +-- Also FIFO read reset is delayed a bit in order to avoid +-- underflow. +----------------------------------------------------------------/ +process(ra) +begin + case ra is + when ADDR0 => ra_d <= ADDR1 ; + when ADDR1 => ra_d <= ADDR2 ; + when ADDR2 => ra_d <= ADDR3 ; + when ADDR3 => ra_d <= ADDR4 ; + when ADDR4 => ra_d <= ADDR5 ; + when ADDR5 => ra_d <= ADDR6 ; + when ADDR6 => ra_d <= ADDR7 ; + when ADDR7 => ra_d <= ADDR8 ; + when ADDR8 => ra_d <= ADDR9 ; + when ADDR9 => ra_d <= ADDR10; + when ADDR10 => ra_d <= ADDR11; + when ADDR11 => ra_d <= ADDR12; + when ADDR12 => ra_d <= ADDR13; + when ADDR13 => ra_d <= ADDR14; + when ADDR14 => ra_d <= ADDR15; + when others => ra_d <= ADDR0; + end case; +end process; + +fdp_rst: FDP +port map( + C => clkx2, + D => rst, + PRE => rst, + Q => rstsync +); + +fd_rstsync: FD +port map( + C => clkx2, + D => rstsync, + Q => rstsync_q +); + +fd_rstp: FD +port map( + C => clkx2, + D => rstsync_q, + Q => rstp +); + +mux <= db(14 downto 0) when (sync = '0') else db(29 downto 15); + +process(clkx2, rstp) +begin + if(rstp = '1')then + sync <= '0'; + ra <= (others => '0'); + elsif(clkx2 = '1' and clkx2'event)then + sync <= not sync; + if(sync = '1')then + ra <= ra_d; + db <= dataint; + end if; + dataout <= mux; + end if; +end process; +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd new file mode 100644 index 0000000..e7d15c0 --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd @@ -0,0 +1,51 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity dram16xn is +generic( + DATA_WIDTH : integer := 20 +); +port ( + clk : in STD_LOGIC; + write_en : in STD_LOGIC; + address : in STD_LOGIC_VECTOR(3 downto 0); + address_dp : in STD_LOGIC_VECTOR(3 downto 0); + data_in : in STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0); + o_data_out : out STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0); + o_data_out_dp : out STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0) +); +end dram16xn; +------------------------------------------------------------------------------- +architecture Behavioral of dram16xn is +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +bit_gen: for i in 0 to DATA_WIDTH-1 generate +begin + ram_inst: RAM16X1D + port map( + D => data_in(i), --insert input signal + WE => write_en, --insert Write Enable signal + WCLK => clk, --insert Write Clock signal + A0 => address(0), --insert Address 0 signal port SPO + A1 => address(1), --insert Address 1 signal port SPO + A2 => address(2), --insert Address 2 signal port SPO + A3 => address(3), --insert Address 3 signal port SPO + DPRA0 => address_dp(0), --insert Address 0 signal dual port DPO + DPRA1 => address_dp(1), --insert Address 1 signal dual port DPO + DPRA2 => address_dp(2), --insert Address 2 signal dual port DPO + DPRA3 => address_dp(3), --insert Address 3 signal dual port DPO + SPO => o_data_out(i), --insert output signal SPO + DPO => o_data_out_dp(i) --insert output signal DPO + ); +end generate; +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dvi_encoder.vhd b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dvi_encoder.vhd new file mode 100644 index 0000000..6f2154a --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dvi_encoder.vhd @@ -0,0 +1,75 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +---------------------------------------------------------------------------------- +entity dvi_encoder is +port ( + clkin : in STD_LOGIC; -- pixel clock + rstin : in STD_LOGIC; -- reset + blue_din : in STD_LOGIC_VECTOR(7 downto 0); -- Blue data in + green_din : in STD_LOGIC_VECTOR(7 downto 0); -- Green data in + red_din : in STD_LOGIC_VECTOR(7 downto 0); -- Red data in + hsync : in STD_LOGIC; -- hsync data + vsync : in STD_LOGIC; -- vsync data + de : in STD_LOGIC; -- data enable + blue_dout : out STD_LOGIC_VECTOR(9 downto 0); + green_dout : out STD_LOGIC_VECTOR(9 downto 0); + red_dout : out STD_LOGIC_VECTOR(9 downto 0) +); +end dvi_encoder; +------------------------------------------------------------------------------- +architecture Behavioral of dvi_encoder is +------------------------------------------------------------------------------- +constant net_gnd : STD_LOGIC := '0'; +component tmds_encoder is +port ( + clk_in : in STD_LOGIC; + rst_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(7 downto 0); + c0_in : in STD_LOGIC; + c1_in : in STD_LOGIC; + de_in : in STD_LOGIC; + data_out : out STD_LOGIC_VECTOR(9 downto 0) +); +end component; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +encb_inst: tmds_encoder +port map( + clk_in => clkin, + rst_in => rstin, + data_in => blue_din, + c0_in => hsync, + c1_in => vsync, + de_in => de, + data_out => blue_dout +); + +encg_inst: tmds_encoder +port map( + clk_in => clkin, + rst_in => rstin, + data_in => green_din, + c0_in => net_gnd, + c1_in => net_gnd, + de_in => de, + data_out => green_dout +); + +encr_inst: tmds_encoder +port map( + clk_in => clkin, + rst_in => rstin, + data_in => red_din, + c0_in => net_gnd, + c1_in => net_gnd, + de_in => de, + data_out => red_dout +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd new file mode 100644 index 0000000..44d7c3c --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd @@ -0,0 +1,79 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity serdes is +port ( + clk_in : in STD_LOGIC; + clk_dv_in : in STD_LOGIC; + reset_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(4 downto 0); + data_out : out STD_LOGIC +); +end serdes; +------------------------------------------------------------------------------- +architecture Behavioral of serdes is +------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +OSERDESE2_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "SDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "SDR", -- "BUF", "SDR" or "DDR" + -- DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + -- DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 5, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "MASTER", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => data_out, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => open, + SHIFTOUT2 => open, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => data_in(0), + D2 => data_in(1), + D3 => data_in(2), + D4 => data_in(3), + D5 => data_in(4), + D6 => net_gnd, + D7 => net_gnd, + D8 => net_gnd, + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => net_gnd, + SHIFTIN2 => net_gnd, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes_ddr.vhd b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes_ddr.vhd new file mode 100644 index 0000000..df0dd2c --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes_ddr.vhd @@ -0,0 +1,128 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity serdes_ddr is +port ( + clk_in : in STD_LOGIC; + clk_dv_in : in STD_LOGIC; + reset_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(9 downto 0); + data_out : out STD_LOGIC +); +end serdes_ddr; +------------------------------------------------------------------------------- +architecture Behavioral of serdes_ddr is +------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +-- Signals +signal shift_a : STD_LOGIC; +signal shift_b : STD_LOGIC; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +OSERDESE2_m_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 10, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "MASTER", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => data_out, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => open, + SHIFTOUT2 => open, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => data_in(0), + D2 => data_in(1), + D3 => data_in(2), + D4 => data_in(3), + D5 => data_in(4), + D6 => data_in(5), + D7 => data_in(6), + D8 => data_in(7), + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => shift_a, + SHIFTIN2 => shift_b, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); + +OSERDESE2_s_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 10, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "SLAVE", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => open, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => shift_a, + SHIFTOUT2 => shift_b, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => net_gnd, + D2 => net_gnd, + D3 => data_in(8), + D4 => data_in(9), + D5 => net_gnd, + D6 => net_gnd, + D7 => net_gnd, + D8 => net_gnd, + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => net_gnd, + SHIFTIN2 => net_gnd, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/tmds_encoder.vhd b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/tmds_encoder.vhd new file mode 100644 index 0000000..468dddb --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/tmds_encoder.vhd @@ -0,0 +1,180 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +---------------------------------------------------------------------------------- +entity tmds_encoder is +port ( + clk_in : in STD_LOGIC; + rst_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(7 downto 0); + c0_in : in STD_LOGIC; + c1_in : in STD_LOGIC; + de_in : in STD_LOGIC; + data_out : out STD_LOGIC_VECTOR(9 downto 0) +); +end tmds_encoder; +------------------------------------------------------------------------------- +architecture Behavioral of tmds_encoder is +------------------------------------------------------------------------------- +signal n1d : UNSIGNED(3 downto 0); -- number of 1s in din +signal din_q : STD_LOGIC_VECTOR(7 downto 0); +signal decision_a : STD_LOGIC; +signal decision_b : STD_LOGIC; +signal decision_c : STD_LOGIC; +signal q_m : STD_LOGIC_VECTOR(8 downto 0); +signal n1q_m : UNSIGNED(3 downto 0); -- number of 1s and 0s for q_m +signal n0q_m : UNSIGNED(3 downto 0); +signal cnt : UNSIGNED(4 downto 0); -- disparity counter, MSB is the sign bit + +constant CTRLTOKEN0 : STD_LOGIC_VECTOR(9 downto 0) := b"1101010100"; +constant CTRLTOKEN1 : STD_LOGIC_VECTOR(9 downto 0) := b"0010101011"; +constant CTRLTOKEN2 : STD_LOGIC_VECTOR(9 downto 0) := b"0101010100"; +constant CTRLTOKEN3 : STD_LOGIC_VECTOR(9 downto 0) := b"1010101011"; + +signal de_q : STD_LOGIC; +signal de_reg : STD_LOGIC; +signal c0_q : STD_LOGIC; +signal c1_q : STD_LOGIC; +signal c_reg : STD_LOGIC_VECTOR(1 downto 0); +signal q_m_reg : STD_LOGIC_VECTOR(8 downto 0); +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + n1d <= + resize(UNSIGNED(data_in(0 downto 0)),4) + + resize(UNSIGNED(data_in(1 downto 1)),4) + + resize(UNSIGNED(data_in(2 downto 2)),4) + + resize(UNSIGNED(data_in(3 downto 3)),4) + + resize(UNSIGNED(data_in(4 downto 4)),4) + + resize(UNSIGNED(data_in(5 downto 5)),4) + + resize(UNSIGNED(data_in(6 downto 6)),4) + + resize(UNSIGNED(data_in(7 downto 7)),4); + din_q <= data_in; + end if; +end process; + +--assign decision1 = (n1d > 4'h4) | ((n1d == 4'h4) & (din_q(0] == 1'b0)); +decision_a <= '1' when ((n1d > to_unsigned(4,4)) or ((n1d = to_unsigned(4,4)) and (din_q(0) = '0'))) else '0'; + +q_m(0) <= din_q(0); +q_m(1) <= (q_m(0) xnor din_q(1)) when (decision_a = '1') else (q_m(0) xor din_q(1)); +q_m(2) <= (q_m(1) xnor din_q(2)) when (decision_a = '1') else (q_m(1) xor din_q(2)); +q_m(3) <= (q_m(2) xnor din_q(3)) when (decision_a = '1') else (q_m(2) xor din_q(3)); +q_m(4) <= (q_m(3) xnor din_q(4)) when (decision_a = '1') else (q_m(3) xor din_q(4)); +q_m(5) <= (q_m(4) xnor din_q(5)) when (decision_a = '1') else (q_m(4) xor din_q(5)); +q_m(6) <= (q_m(5) xnor din_q(6)) when (decision_a = '1') else (q_m(5) xor din_q(6)); +q_m(7) <= (q_m(6) xnor din_q(7)) when (decision_a = '1') else (q_m(6) xor din_q(7)); +q_m(8) <= '0' when (decision_a = '1') else '1'; +------------------------------------------------------------------------------- +-- Stage 2: 9 bit -> 10 bit +-- Refer to DVI 1.0 Specification, page 29, Figure 3-5 +------------------------------------------------------------------------------- +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + n1q_m <= + resize(UNSIGNED(q_m(0 downto 0)),4) + + resize(UNSIGNED(q_m(1 downto 1)),4) + + resize(UNSIGNED(q_m(2 downto 2)),4) + + resize(UNSIGNED(q_m(3 downto 3)),4) + + resize(UNSIGNED(q_m(4 downto 4)),4) + + resize(UNSIGNED(q_m(5 downto 5)),4) + + resize(UNSIGNED(q_m(6 downto 6)),4) + + resize(UNSIGNED(q_m(7 downto 7)),4); + n0q_m <= + to_unsigned(8,4) - ( + resize(UNSIGNED(q_m(0 downto 0)),4) + + resize(UNSIGNED(q_m(1 downto 1)),4) + + resize(UNSIGNED(q_m(2 downto 2)),4) + + resize(UNSIGNED(q_m(3 downto 3)),4) + + resize(UNSIGNED(q_m(4 downto 4)),4) + + resize(UNSIGNED(q_m(5 downto 5)),4) + + resize(UNSIGNED(q_m(6 downto 6)),4) + + resize(UNSIGNED(q_m(7 downto 7)),4)); + end if; +end process; + +decision_b <= '1' when ((cnt = to_unsigned(0,5)) or (n1q_m = n0q_m)) else '0'; +------------------------------------------------------------------------------- +-- [(cnt > 0) and (N1q_m > N0q_m)] or [(cnt < 0) and (N0q_m > N1q_m)] +------------------------------------------------------------------------------- +decision_c <= '1' when ((cnt(4) = '0') and (n1q_m > n0q_m)) or ((cnt(4) = '1') and (n0q_m > n1q_m)) else '0'; +------------------------------------------------------------------------------- +-- pipe line alignment +------------------------------------------------------------------------------- +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + de_q <= de_in; + de_reg <= de_q; + c0_q <= c0_in; + c1_q <= c1_in; + q_m_reg <= q_m; + c_reg <= c1_q & c0_q; + end if; +end process; +------------------------------------------------------------------------------- +-- 10-bit out +-- disparity counter +------------------------------------------------------------------------------- +process(clk_in, rst_in) +begin + if(rst_in = '1')then + data_out <= (others => '0'); + cnt <= (others => '0'); + elsif(clk_in = '1' and clk_in'event)then + if(de_reg = '1')then + if(decision_b = '1')then + data_out(9) <= not q_m_reg(8); + data_out(8) <= q_m_reg(8); + if(q_m_reg(8) = '1')then + data_out(7 downto 0) <= q_m_reg(7 downto 0); + else + data_out(7 downto 0) <= not q_m_reg(7 downto 0); + end if; + if(q_m_reg(8) = '0')then + cnt <= cnt + resize(n0q_m,5) - resize(n1q_m,5); + else + cnt <= cnt + resize(n1q_m,5) - resize(n0q_m,5); + end if; + else + if(decision_c = '1')then + data_out(9) <= '1'; + data_out(8) <= q_m_reg(8); + data_out(7 downto 0) <= not q_m_reg(7 downto 0); + if(q_m_reg(8) = '1')then + cnt <= cnt + to_unsigned(2,5) + (resize(n0q_m,5) - resize(n1q_m,5)); + else + cnt <= cnt + (resize(n0q_m,5) - resize(n1q_m,5)); + end if; + else + data_out(9) <= '0'; + data_out(8) <= q_m_reg(8); + data_out(7 downto 0) <= q_m_reg(7 downto 0); + if(q_m_reg(8) = '0')then + cnt <= cnt - to_unsigned(2,5) + (resize(n1q_m,5) - resize(n0q_m,5)); + else + cnt <= cnt + (resize(n1q_m,5) - resize(n0q_m,5)); + end if; + end if; + end if; + else + case(c_reg)is + when "00" => data_out <= CTRLTOKEN0; + when "01" => data_out <= CTRLTOKEN1; + when "10" => data_out <= CTRLTOKEN2; + when others => data_out <= CTRLTOKEN3; + end case; + cnt <= (others => '0'); + end if; + end if; +end process; +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/src/serdes_ddr.vhd b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/src/serdes_ddr.vhd new file mode 100644 index 0000000..df0dd2c --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/src/serdes_ddr.vhd @@ -0,0 +1,128 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity serdes_ddr is +port ( + clk_in : in STD_LOGIC; + clk_dv_in : in STD_LOGIC; + reset_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(9 downto 0); + data_out : out STD_LOGIC +); +end serdes_ddr; +------------------------------------------------------------------------------- +architecture Behavioral of serdes_ddr is +------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +-- Signals +signal shift_a : STD_LOGIC; +signal shift_b : STD_LOGIC; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +OSERDESE2_m_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 10, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "MASTER", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => data_out, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => open, + SHIFTOUT2 => open, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => data_in(0), + D2 => data_in(1), + D3 => data_in(2), + D4 => data_in(3), + D5 => data_in(4), + D6 => data_in(5), + D7 => data_in(6), + D8 => data_in(7), + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => shift_a, + SHIFTIN2 => shift_b, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); + +OSERDESE2_s_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 10, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "SLAVE", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => open, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => shift_a, + SHIFTOUT2 => shift_b, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => net_gnd, + D2 => net_gnd, + D3 => data_in(8), + D4 => data_in(9), + D5 => net_gnd, + D6 => net_gnd, + D7 => net_gnd, + D8 => net_gnd, + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => net_gnd, + SHIFTIN2 => net_gnd, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl new file mode 100644 index 0000000..02321a4 --- /dev/null +++ b/zynqberrydemo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0/xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl @@ -0,0 +1,119 @@ + +# Loading additional proc with user specified bodies to compute parameter values. +source [file join [file dirname [file dirname [info script]]] gui/Video_IO_2_HDMI_TMDS_v1_0.gtcl] + +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + #Adding Group + set Clocking [ipgui::add_group $IPINST -name "Clocking" -parent ${Page_0} -display_name {Clocking Options}] + ipgui::add_param $IPINST -name "C_INT_CLOCKING" -parent ${Clocking} + ipgui::add_param $IPINST -name "C_VIDEO_MODE" -parent ${Clocking} -widget comboBox + + #Adding Group + set Pins_swap [ipgui::add_group $IPINST -name "Pins swap" -parent ${Page_0}] + ipgui::add_param $IPINST -name "C_CLK_SWAP" -parent ${Pins_swap} + ipgui::add_param $IPINST -name "C_D0_SWAP" -parent ${Pins_swap} + ipgui::add_param $IPINST -name "C_D1_SWAP" -parent ${Pins_swap} + ipgui::add_param $IPINST -name "C_D2_SWAP" -parent ${Pins_swap} + + + +} + +proc update_PARAM_VALUE.C_VIDEO_MODE { PARAM_VALUE.C_VIDEO_MODE PARAM_VALUE.C_INT_CLOCKING } { + # Procedure called to update C_VIDEO_MODE when any of the dependent parameters in the arguments change + + set C_VIDEO_MODE ${PARAM_VALUE.C_VIDEO_MODE} + set C_INT_CLOCKING ${PARAM_VALUE.C_INT_CLOCKING} + set values(C_INT_CLOCKING) [get_property value $C_INT_CLOCKING] + if { [gen_USERPARAMETER_C_VIDEO_MODE_ENABLEMENT $values(C_INT_CLOCKING)] } { + set_property enabled true $C_VIDEO_MODE + } else { + set_property enabled false $C_VIDEO_MODE + } +} + +proc validate_PARAM_VALUE.C_VIDEO_MODE { PARAM_VALUE.C_VIDEO_MODE } { + # Procedure called to validate C_VIDEO_MODE + return true +} + +proc update_PARAM_VALUE.C_CLK_SWAP { PARAM_VALUE.C_CLK_SWAP } { + # Procedure called to update C_CLK_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_CLK_SWAP { PARAM_VALUE.C_CLK_SWAP } { + # Procedure called to validate C_CLK_SWAP + return true +} + +proc update_PARAM_VALUE.C_D0_SWAP { PARAM_VALUE.C_D0_SWAP } { + # Procedure called to update C_D0_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D0_SWAP { PARAM_VALUE.C_D0_SWAP } { + # Procedure called to validate C_D0_SWAP + return true +} + +proc update_PARAM_VALUE.C_D1_SWAP { PARAM_VALUE.C_D1_SWAP } { + # Procedure called to update C_D1_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D1_SWAP { PARAM_VALUE.C_D1_SWAP } { + # Procedure called to validate C_D1_SWAP + return true +} + +proc update_PARAM_VALUE.C_D2_SWAP { PARAM_VALUE.C_D2_SWAP } { + # Procedure called to update C_D2_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D2_SWAP { PARAM_VALUE.C_D2_SWAP } { + # Procedure called to validate C_D2_SWAP + return true +} + +proc update_PARAM_VALUE.C_INT_CLOCKING { PARAM_VALUE.C_INT_CLOCKING } { + # Procedure called to update C_INT_CLOCKING when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_INT_CLOCKING { PARAM_VALUE.C_INT_CLOCKING } { + # Procedure called to validate C_INT_CLOCKING + return true +} + + +proc update_MODELPARAM_VALUE.C_CLK_SWAP { MODELPARAM_VALUE.C_CLK_SWAP PARAM_VALUE.C_CLK_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_CLK_SWAP}] ${MODELPARAM_VALUE.C_CLK_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D0_SWAP { MODELPARAM_VALUE.C_D0_SWAP PARAM_VALUE.C_D0_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D0_SWAP}] ${MODELPARAM_VALUE.C_D0_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D1_SWAP { MODELPARAM_VALUE.C_D1_SWAP PARAM_VALUE.C_D1_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D1_SWAP}] ${MODELPARAM_VALUE.C_D1_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D2_SWAP { MODELPARAM_VALUE.C_D2_SWAP PARAM_VALUE.C_D2_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D2_SWAP}] ${MODELPARAM_VALUE.C_D2_SWAP} +} + +proc update_MODELPARAM_VALUE.C_INT_CLOCKING { MODELPARAM_VALUE.C_INT_CLOCKING PARAM_VALUE.C_INT_CLOCKING } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_INT_CLOCKING}] ${MODELPARAM_VALUE.C_INT_CLOCKING} +} + +proc update_MODELPARAM_VALUE.C_VIDEO_MODE { MODELPARAM_VALUE.C_VIDEO_MODE PARAM_VALUE.C_VIDEO_MODE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_VIDEO_MODE}] ${MODELPARAM_VALUE.C_VIDEO_MODE} +} + diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/bd/bd.tcl b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/bd/bd.tcl new file mode 100644 index 0000000..4804aeb --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/component.xml b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/component.xml new file mode 100644 index 0000000..dc899b3 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/component.xml @@ -0,0 +1,1973 @@ + + + digilentinc.com + user + axi_i2s_adi + 1.2 + + + S00_AXI + + + + + + + + + AWADDR + + + s00_axi_awaddr + + + + + AWPROT + + + s00_axi_awprot + + + + + AWVALID + + + s00_axi_awvalid + + + + + AWREADY + + + s00_axi_awready + + + + + WDATA + + + s00_axi_wdata + + + + + WSTRB + + + s00_axi_wstrb + + + + + WVALID + + + s00_axi_wvalid + + + + + WREADY + + + s00_axi_wready + + + + + BRESP + + + s00_axi_bresp + + + + + BVALID + + + s00_axi_bvalid + + + + + BREADY + + + s00_axi_bready + + + + + ARADDR + + + s00_axi_araddr + + + + + ARPROT + + + s00_axi_arprot + + + + + ARVALID + + + s00_axi_arvalid + + + + + ARREADY + + + s00_axi_arready + + + + + RDATA + + + s00_axi_rdata + + + + + RRESP + + + s00_axi_rresp + + + + + RVALID + + + s00_axi_rvalid + + + + + RREADY + + + s00_axi_rready + + + + + + WIZ.DATA_WIDTH + 32 + + + WIZ.NUM_REG + 12 + + + SUPPORTS_NARROW_BURST + 0 + + + + + S00_AXI_RST + + + + + + + RST + + + s00_axi_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + S00_AXI_CLK + + + + + + + CLK + + + s00_axi_aclk + + + + + + ASSOCIATED_BUSIF + S00_AXI + + + ASSOCIATED_RESET + s00_axi_aresetn + + + + + S_AXIS + + + + + + + TVALID + + + S_AXIS_TVALID + + + + + TLAST + + + S_AXIS_TLAST + + + + + TDATA + + + S_AXIS_TDATA + + + + + TREADY + + + S_AXIS_TREADY + + + + + + + optional + true + + + + + + S_AXIS_CLK + + + + + + + CLK + + + S_AXIS_ACLK + + + + + + ASSOCIATED_BUSIF + S_AXIS + + + + + + optional + true + + + + + + M_AXIS + + + + + + + TVALID + + + M_AXIS_TVALID + + + + + TLAST + + + M_AXIS_TLAST + + + + + TDATA + + + M_AXIS_TDATA + + + + + TKEEP + + + M_AXIS_TKEEP + + + + + TREADY + + + M_AXIS_TREADY + + + + + + + optional + true + + + + + + M_AXIS_CLK + + + + + + + CLK + + + M_AXIS_ACLK + + + + + + ASSOCIATED_BUSIF + M_AXIS + + + + + + optional + true + + + + + + DMA_TX_REQ + + + + + + + TUSER + + + DMA_REQ_TX_DRTYPE + + + + + TVALID + + + DMA_REQ_TX_DRVALID + + + + + TLAST + + + DMA_REQ_TX_DRLAST + + + + + TREADY + + + DMA_REQ_TX_DRREADY + + + + + + + optional + false + + + + + + DMA_TX_ACK + + + + + + + TUSER + + + DMA_REQ_TX_DATYPE + + + + + TVALID + + + DMA_REQ_TX_DAVALID + + + + + TREADY + + + DMA_REQ_TX_DAREADY + + + + + + + optional + false + + + + + + DMA_RX_REQ + + + + + + + TUSER + + + DMA_REQ_RX_DRTYPE + + + + + TVALID + + + DMA_REQ_RX_DRVALID + + + + + TLAST + + + DMA_REQ_RX_DRLAST + + + + + TREADY + + + DMA_REQ_RX_DRREADY + + + + + + + optional + false + + + + + + DMA_RX_ACK + + + + + + + TUSER + + + DMA_REQ_RX_DATYPE + + + + + TVALID + + + DMA_REQ_RX_DAVALID + + + + + TREADY + + + DMA_REQ_RX_DAREADY + + + + + + + optional + false + + + + + + DMA_TX_CLK + + + + + + + CLK + + + DMA_REQ_TX_ACLK + + + + + + ASSOCIATED_BUSIF + DMA_TX_REQ:DMA_TX_ACK + + + ASSOCIATED_RESET + DMA_REQ_TX_RSTN + + + + + + optional + false + + + + + + DMA_TX_RST + + + + + + + RST + + + DMA_REQ_TX_RSTN + + + + + + POLARITY + ACTIVE_LOW + + + + + + optional + false + + + + + + DMA_RX_CLK + + + + + + + CLK + + + DMA_REQ_RX_ACLK + + + + + + ASSOCIATED_BUSIF + DMA_RX_REQ:DMA_RX_ACK + + + ASSOCIATED_RESET + DMA_REQ_RX_RSTN + + + + + + optional + false + + + + + + DMA_RX_RST + + + + + + + RST + + + DMA_REQ_RX_RSTN + + + + + + POLARITY + ACTIVE_LOW + + + + + + optional + false + + + + + + + + S00_AXI + + S00_AXI_reg + 0 + 4096 + 32 + register + + + OFFSET_BASE_PARAM + C_S00_AXI_BASEADDR + + + OFFSET_HIGH_PARAM + C_S00_AXI_HIGHADDR + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axi_i2s_adi_v1_2 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + c5577600 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axi_i2s_adi_v1_2 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + c5577600 + + + + + xilinx_softwaredriver + Software Driver + :vivado.xilinx.com:sw.driver + + xilinx_softwaredriver_view_fileset + + + + viewChecksum + d0fc4f4c + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + e9171d0c + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + DATA_CLK_I + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + BCLK_O + + out + + 0 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + LRCLK_O + + out + + 0 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + SDATA_O + + out + + 0 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + SDATA_I + + in + + 0 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + MUTEN_O + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_ACLK + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_TREADY + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_TDATA + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_TLAST + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_TVALID + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_ACLK + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TREADY + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TDATA + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TLAST + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TVALID + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TKEEP + + out + + 3 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_ACLK + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_RSTN + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DAVALID + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DATYPE + + in + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DAREADY + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DRVALID + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DRTYPE + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DRLAST + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DRREADY + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_ACLK + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_RSTN + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DAVALID + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DATYPE + + in + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DAREADY + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DRVALID + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DRTYPE + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DRLAST + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DRREADY + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_awaddr + + in + + 5 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_awprot + + in + + 2 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_awvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_awready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_wdata + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_wstrb + + in + + 3 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_wvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_wready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_bresp + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_bvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_bready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_araddr + + in + + 5 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_arprot + + in + + 2 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_arvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_arready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_rdata + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_rresp + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_rvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_rready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_aclk + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_aresetn + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_S00_AXI_DATA_WIDTH + C S00 AXI DATA WIDTH + Width of S_AXI data bus + 32 + + + C_S00_AXI_ADDR_WIDTH + C S00 AXI ADDR WIDTH + Width of S_AXI address bus + 6 + + + C_SLOT_WIDTH + C Slot Width + 24 + + + C_LRCLK_POL + C Lrclk Pol + 0 + + + C_BCLK_POL + C Bclk Pol + 0 + + + C_DMA_TYPE + C Dma Type + 0 + + + C_NUM_CH + C Num Ch + 1 + + + C_HAS_TX + C Has Tx + 1 + + + C_HAS_RX + C Has Rx + 1 + + + + + + choices_0 + 32 + + + choices_1 + 1 + 0 + + + choices_2 + 0 + 1 + + + choices_3 + 0 + 1 + + + choices_4 + 0 + 1 + + + choices_5 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + choices_6 + 0 + 1 + + + choices_7 + 0 + 1 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axi_i2s_adi_v1_2.vhd + vhdlSource + CHECKSUM_c1ef5310 + + + hdl/i2s_rx.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/i2s_tx.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/i2s_clkgen.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/fifo_synchronizer.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/i2s_controller.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/adi_common/axi_ctrlif.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/adi_common/axi_streaming_dma_rx_fifo.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/adi_common/pl330_dma_fifo.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/adi_common/axi_streaming_dma_tx_fifo.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/adi_common/dma_fifo.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/axi_i2s_adi_S_AXI.vhd + vhdlSource + CHECKSUM_8dec4efa + xil_defaultlib + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axi_i2s_adi_v1_2.vhd + vhdlSource + + + hdl/i2s_rx.vhd + vhdlSource + + + hdl/i2s_tx.vhd + vhdlSource + + + hdl/i2s_clkgen.vhd + vhdlSource + + + hdl/fifo_synchronizer.vhd + vhdlSource + + + hdl/i2s_controller.vhd + vhdlSource + + + hdl/adi_common/axi_ctrlif.vhd + vhdlSource + + + hdl/adi_common/axi_streaming_dma_rx_fifo.vhd + vhdlSource + + + hdl/adi_common/pl330_dma_fifo.vhd + vhdlSource + + + hdl/adi_common/axi_streaming_dma_tx_fifo.vhd + vhdlSource + + + hdl/adi_common/dma_fifo.vhd + vhdlSource + + + hdl/axi_i2s_adi_S_AXI.vhd + vhdlSource + + + + xilinx_softwaredriver_view_fileset + + drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.mdd + mdd + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl + tclSource + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/src/Makefile + unknown + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h + cSource + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c + cSource + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c + cSource + USED_IN_hw_handoff + + + + xilinx_xpgui_view_fileset + + xgui/axi_i2s_adi_v1_2.tcl + tclSource + XGUI_VERSION_2 + CHECKSUM_70145134 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + Sends and receives audio data to/from an ADI I2S audio codec + + + C_S00_AXI_BASEADDR + AXI BASEADDR + 0xFFFFFFFF + + + + false + + + + + + C_S00_AXI_HIGHADDR + AXI HIGHADDR + 0x00000000 + + + + false + + + + + + Component_Name + axi_i2s_adi_v1_2 + + + C_LRCLK_POL + LRCLK Polarity + 0 + + + C_BCLK_POL + BCLK Polarity + 0 + + + C_DMA_TYPE + DMA Type + 0 + + + C_HAS_TX + Enable Audio Output + 1 + + + C_HAS_RX + Enable Audio Input + 1 + + + + + + virtex7 + qvirtex7 + kintex7 + kintex7l + qkintex7 + qkintex7l + artix7 + artix7l + aartix7 + qartix7 + zynq + qzynq + azynq + virtexu + kintexu + + + AXI_Peripheral + + AXI I2S Audio + Digilent + http://www.digilentinc.com + 1 + + natinst.com:user:axi_i2s_adi:1.2 + + 2015-03-05T05:38:11Z + + C:/sam_work/Vivado_projects/14_4/ip_repo/axi_i2s_adi_1.2 + C:/sam_work/Vivado_projects/14_4/ip_repo/axi_i2s_adi_1.2 + + + + 2014.4 + + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl new file mode 100644 index 0000000..25ef87e --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl @@ -0,0 +1,5 @@ + + +proc generate {drv_handle} { + xdefine_include_file $drv_handle "xparameters.h" "axi_i2s_adi" "NUM_INSTANCES" "DEVICE_ID" "C_S00_AXI_BASEADDR" "C_S00_AXI_HIGHADDR" +} diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c new file mode 100644 index 0000000..f950fdd --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c @@ -0,0 +1,6 @@ + + +/***************************** Include Files *******************************/ +#include "axi_i2s_adi.h" + +/************************** Function Definitions ***************************/ diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h new file mode 100644 index 0000000..d13f29d --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h @@ -0,0 +1,87 @@ + +#ifndef AXI_I2S_ADI_H +#define AXI_I2S_ADI_H + + +/****************** Include Files ********************/ +#include "xil_types.h" +#include "xstatus.h" + +#define AXI_I2S_ADI_S00_AXI_SLV_REG0_OFFSET 0 +#define AXI_I2S_ADI_S00_AXI_SLV_REG1_OFFSET 4 +#define AXI_I2S_ADI_S00_AXI_SLV_REG2_OFFSET 8 +#define AXI_I2S_ADI_S00_AXI_SLV_REG3_OFFSET 12 +#define AXI_I2S_ADI_S00_AXI_SLV_REG4_OFFSET 16 +#define AXI_I2S_ADI_S00_AXI_SLV_REG5_OFFSET 20 +#define AXI_I2S_ADI_S00_AXI_SLV_REG6_OFFSET 24 +#define AXI_I2S_ADI_S00_AXI_SLV_REG7_OFFSET 28 +#define AXI_I2S_ADI_S00_AXI_SLV_REG8_OFFSET 32 +#define AXI_I2S_ADI_S00_AXI_SLV_REG9_OFFSET 36 +#define AXI_I2S_ADI_S00_AXI_SLV_REG10_OFFSET 40 +#define AXI_I2S_ADI_S00_AXI_SLV_REG11_OFFSET 44 + + +/**************************** Type Definitions *****************************/ +/** + * + * Write a value to a AXI_I2S_ADI register. A 32 bit write is performed. + * If the component is implemented in a smaller width, only the least + * significant data is written. + * + * @param BaseAddress is the base address of the AXI_I2S_ADIdevice. + * @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 AXI_I2S_ADI_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data) + * + */ +#define AXI_I2S_ADI_mWriteReg(BaseAddress, RegOffset, Data) \ + Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data)) + +/** + * + * Read a value from a AXI_I2S_ADI register. A 32 bit read is performed. + * If the component 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 AXI_I2S_ADI device. + * @param RegOffset is the register offset from the base to write to. + * + * @return Data is the data from the register. + * + * @note + * C-style signature: + * u32 AXI_I2S_ADI_mReadReg(u32 BaseAddress, unsigned RegOffset) + * + */ +#define AXI_I2S_ADI_mReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/************************** Function Prototypes ****************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_I2S_ADI instance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_I2S_ADI_Reg_SelfTest(void * baseaddr_p); + +#endif // AXI_I2S_ADI_H diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c new file mode 100644 index 0000000..3fe1e5a --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c @@ -0,0 +1,60 @@ + +/***************************** Include Files *******************************/ +#include "axi_i2s_adi.h" +#include "xparameters.h" +#include "stdio.h" +#include "xil_io.h" + +/************************** Constant Definitions ***************************/ +#define READ_WRITE_MUL_FACTOR 0x10 + +/************************** Function Definitions ***************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_I2S_ADIinstance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_I2S_ADI_Reg_SelfTest(void * baseaddr_p) +{ + u32 baseaddr; + int write_loop_index; + int read_loop_index; + int Index; + + baseaddr = (u32) baseaddr_p; + + xil_printf("******************************\n\r"); + xil_printf("* User Peripheral Self Test\n\r"); + xil_printf("******************************\n\n\r"); + + /* + * Write to user logic slave module register(s) and read back + */ + xil_printf("User logic slave module test...\n\r"); + + for (write_loop_index = 0 ; write_loop_index < 4; write_loop_index++) + AXI_I2S_ADI_mWriteReg (baseaddr, write_loop_index*4, (write_loop_index+1)*READ_WRITE_MUL_FACTOR); + for (read_loop_index = 0 ; read_loop_index < 4; read_loop_index++) + if ( AXI_I2S_ADI_mReadReg (baseaddr, read_loop_index*4) != (read_loop_index+1)*READ_WRITE_MUL_FACTOR){ + xil_printf ("Error reading register value at address %x\n", (int)baseaddr + read_loop_index*4); + return XST_FAILURE; + } + + xil_printf(" - slave register write/read passed\n\n\r"); + + return XST_SUCCESS; +} diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v new file mode 100644 index 0000000..34f4457 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v @@ -0,0 +1,184 @@ + +`timescale 1 ns / 1 ps + +`include "axi_i2s_adi_v1_2_tb_include.vh" + +// lite_response Type Defines +`define RESPONSE_OKAY 2'b00 +`define RESPONSE_EXOKAY 2'b01 +`define RESP_BUS_WIDTH 2 +`define BURST_TYPE_INCR 2'b01 +`define BURST_TYPE_WRAP 2'b10 + +// AMBA AXI4 Lite Range Constants +`define S00_AXI_MAX_BURST_LENGTH 1 +`define S00_AXI_DATA_BUS_WIDTH 32 +`define S00_AXI_ADDRESS_BUS_WIDTH 32 +`define S00_AXI_MAX_DATA_SIZE (`S00_AXI_DATA_BUS_WIDTH*`S00_AXI_MAX_BURST_LENGTH)/8 + +module axi_i2s_adi_v1_2_tb; + reg tb_ACLK; + reg tb_ARESETn; + + // Create an instance of the example tb + `BD_WRAPPER dut (.ACLK(tb_ACLK), + .ARESETN(tb_ARESETn)); + + // Local Variables + + // AMBA S00_AXI AXI4 Lite Local Reg + reg [`S00_AXI_DATA_BUS_WIDTH-1:0] S00_AXI_rd_data_lite; + reg [`S00_AXI_DATA_BUS_WIDTH-1:0] S00_AXI_test_data_lite [3:0]; + reg [`RESP_BUS_WIDTH-1:0] S00_AXI_lite_response; + reg [`S00_AXI_ADDRESS_BUS_WIDTH-1:0] S00_AXI_mtestAddress; + reg [3-1:0] S00_AXI_mtestProtection_lite; + integer S00_AXI_mtestvectorlite; // Master side testvector + integer S00_AXI_mtestdatasizelite; + integer result_slave_lite; + + + // Simple Reset Generator and test + initial begin + tb_ARESETn = 1'b0; + #500; + // Release the reset on the posedge of the clk. + @(posedge tb_ACLK); + tb_ARESETn = 1'b1; + @(posedge tb_ACLK); + end + + // Simple Clock Generator + initial tb_ACLK = 1'b0; + always #10 tb_ACLK = !tb_ACLK; + + //------------------------------------------------------------------------ + // TEST LEVEL API: CHECK_RESPONSE_OKAY + //------------------------------------------------------------------------ + // Description: + // CHECK_RESPONSE_OKAY(lite_response) + // This task checks if the return lite_response is equal to OKAY + //------------------------------------------------------------------------ + task automatic CHECK_RESPONSE_OKAY; + input [`RESP_BUS_WIDTH-1:0] response; + begin + if (response !== `RESPONSE_OKAY) begin + $display("TESTBENCH ERROR! lite_response is not OKAY", + "\n expected = 0x%h",`RESPONSE_OKAY, + "\n actual = 0x%h",response); + $stop; + end + end + endtask + + //------------------------------------------------------------------------ + // TEST LEVEL API: COMPARE_LITE_DATA + //------------------------------------------------------------------------ + // Description: + // COMPARE_LITE_DATA(expected,actual) + // This task checks if the actual data is equal to the expected data. + // X is used as don't care but it is not permitted for the full vector + // to be don't care. + //------------------------------------------------------------------------ + task automatic COMPARE_LITE_DATA; + input expected; + input actual; + begin + if (expected === 'hx || actual === 'hx) begin + $display("TESTBENCH ERROR! COMPARE_LITE_DATA cannot be performed with an expected or actual vector that is all 'x'!"); + result_slave_lite = 0; + $stop; + end + + if (actual != expected) begin + $display("TESTBENCH ERROR! Data expected is not equal to actual.", + "\nexpected = 0x%h",expected, + "\nactual = 0x%h",actual); + result_slave_lite = 0; + $stop; + end + else + begin + $display("TESTBENCH Passed! Data expected is equal to actual.", + "\n expected = 0x%h",expected, + "\n actual = 0x%h",actual); + end + end + endtask + + task automatic S00_AXI_TEST; + begin + $display("---------------------------------------------------------"); + $display("EXAMPLE TEST : S00_AXI"); + $display("Simple register write and read example"); + $display("---------------------------------------------------------"); + + S00_AXI_mtestvectorlite = 0; + S00_AXI_mtestAddress = `S00_AXI_SLAVE_ADDRESS; + S00_AXI_mtestProtection_lite = 0; + S00_AXI_mtestdatasizelite = `S00_AXI_MAX_DATA_SIZE; + + result_slave_lite = 1; + + for (S00_AXI_mtestvectorlite = 0; S00_AXI_mtestvectorlite <= 3; S00_AXI_mtestvectorlite = S00_AXI_mtestvectorlite + 1) + begin + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.WRITE_BURST_CONCURRENT( S00_AXI_mtestAddress, + S00_AXI_mtestProtection_lite, + S00_AXI_test_data_lite[S00_AXI_mtestvectorlite], + S00_AXI_mtestdatasizelite, + S00_AXI_lite_response); + $display("EXAMPLE TEST %d write : DATA = 0x%h, lite_response = 0x%h",S00_AXI_mtestvectorlite,S00_AXI_test_data_lite[S00_AXI_mtestvectorlite],S00_AXI_lite_response); + CHECK_RESPONSE_OKAY(S00_AXI_lite_response); + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.READ_BURST(S00_AXI_mtestAddress, + S00_AXI_mtestProtection_lite, + S00_AXI_rd_data_lite, + S00_AXI_lite_response); + $display("EXAMPLE TEST %d read : DATA = 0x%h, lite_response = 0x%h",S00_AXI_mtestvectorlite,S00_AXI_rd_data_lite,S00_AXI_lite_response); + CHECK_RESPONSE_OKAY(S00_AXI_lite_response); + COMPARE_LITE_DATA(S00_AXI_test_data_lite[S00_AXI_mtestvectorlite],S00_AXI_rd_data_lite); + $display("EXAMPLE TEST %d : Sequential write and read burst transfers complete from the master side. %d",S00_AXI_mtestvectorlite,S00_AXI_mtestvectorlite); + S00_AXI_mtestAddress = S00_AXI_mtestAddress + 32'h00000004; + end + + $display("---------------------------------------------------------"); + $display("EXAMPLE TEST S00_AXI: PTGEN_TEST_FINISHED!"); + if ( result_slave_lite ) begin + $display("PTGEN_TEST: PASSED!"); + end else begin + $display("PTGEN_TEST: FAILED!"); + end + $display("---------------------------------------------------------"); + end + endtask + + // Create the test vectors + initial begin + // When performing debug enable all levels of INFO messages. + wait(tb_ARESETn === 0) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.set_channel_level_info(1); + + // Create test data vectors + S00_AXI_test_data_lite[0] = 32'h0101FFFF; + S00_AXI_test_data_lite[1] = 32'habcd0001; + S00_AXI_test_data_lite[2] = 32'hdead0011; + S00_AXI_test_data_lite[3] = 32'hbeef0011; + end + + // Drive the BFM + initial begin + // Wait for end of reset + wait(tb_ARESETn === 0) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + + S00_AXI_TEST(); + + end + +endmodule diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/design.tcl b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/design.tcl new file mode 100644 index 0000000..28acdfc --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/design.tcl @@ -0,0 +1,91 @@ +proc create_ipi_design { offsetfile design_name } { + create_bd_design $design_name + open_bd_design $design_name + + # Create Clock and Reset Ports + set ACLK [ create_bd_port -dir I -type clk ACLK ] + set_property -dict [ list CONFIG.FREQ_HZ {100000000} CONFIG.PHASE {0.000} CONFIG.CLK_DOMAIN "${design_name}_ACLK" ] $ACLK + set ARESETN [ create_bd_port -dir I -type rst ARESETN ] + set_property -dict [ list CONFIG.POLARITY {ACTIVE_LOW} ] $ARESETN + set_property CONFIG.ASSOCIATED_RESET ARESETN $ACLK + + # Create instance: axi_i2s_adi_0, and set properties + set axi_i2s_adi_0 [ create_bd_cell -type ip -vlnv natinst.com:user:axi_i2s_adi:1.2 axi_i2s_adi_0] + + # Create instance: master_0, and set properties + set master_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:cdn_axi_bfm master_0] + set_property -dict [ list CONFIG.C_PROTOCOL_SELECTION {2} ] $master_0 + + # Create interface connections + connect_bd_intf_net [get_bd_intf_pins master_0/M_AXI_LITE] [get_bd_intf_pins axi_i2s_adi_0/S00_AXI] + + # Create port connections + connect_bd_net -net aclk_net [get_bd_ports ACLK] [get_bd_pins master_0/M_AXI_LITE_ACLK] [get_bd_pins axi_i2s_adi_0/S00_AXI_ACLK] + connect_bd_net -net aresetn_net [get_bd_ports ARESETN] [get_bd_pins master_0/M_AXI_LITE_ARESETN] [get_bd_pins axi_i2s_adi_0/S00_AXI_ARESETN] + + # Auto assign address + assign_bd_address + + # Copy all address to interface_address.vh file + set bd_path [file dirname [get_property NAME [get_files ${design_name}.bd]]] + upvar 1 $offsetfile offset_file + set offset_file "${bd_path}/axi_i2s_adi_v1_2_tb_include.vh" + set fp [open $offset_file "w"] + puts $fp "`ifndef axi_i2s_adi_v1_2_tb_include_vh_" + puts $fp "`define axi_i2s_adi_v1_2_tb_include_vh_\n" + puts $fp "//Configuration current bd names" + puts $fp "`define BD_INST_NAME ${design_name}_i" + puts $fp "`define BD_WRAPPER ${design_name}_wrapper\n" + puts $fp "//Configuration address parameters" + + set offset [get_property OFFSET [get_bd_addr_segs -of_objects [get_bd_addr_spaces master_0/Data_lite]]] + set offset_hex [string replace $offset 0 1 "32'h"] + puts $fp "`define S00_AXI_SLAVE_ADDRESS ${offset_hex}" + + puts $fp "`endif" + close $fp +} + +set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores natinst.com:user:axi_i2s_adi:1.2]]]] +set test_bench_file ${ip_path}/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v +set interface_address_vh_file "" + +# Set IP Repository and Update IP Catalogue +set repo_paths [get_property ip_repo_paths [current_fileset]] +if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } { + set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset] + update_ip_catalog +} + +set design_name "" +set all_bd {} +set all_bd_files [get_files *.bd -quiet] +foreach file $all_bd_files { +set file_name [string range $file [expr {[string last "/" $file] + 1}] end] +set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]] +lappend all_bd $bd_name +} + +for { set i 1 } { 1 } { incr i } { + set design_name "axi_i2s_adi_v1_2_bfm_${i}" + if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } { + break + } +} + +create_ipi_design interface_address_vh_file ${design_name} +validate_bd_design + +set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force] +import_files -force -norecurse $wrapper_file + +set_property SOURCE_SET sources_1 [get_filesets sim_1] +import_files -fileset sim_1 -norecurse -force $test_bench_file +remove_files -quiet -fileset sim_1 axi_i2s_adi_v1_2_tb_include.vh +import_files -fileset sim_1 -norecurse -force $interface_address_vh_file +set_property top axi_i2s_adi_v1_2_tb [get_filesets sim_1] +set_property top_lib {} [get_filesets sim_1] +set_property top_file {} [get_filesets sim_1] +launch_xsim -simset sim_1 -mode behavioral +restart +run 1000 us diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl new file mode 100644 index 0000000..21eba43 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl @@ -0,0 +1,45 @@ +# Runtime Tcl commands to interact with - axi_i2s_adi_v1_2 + +# Sourcing design address info tcl +set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd +source ${bd_path}/axi_i2s_adi_v1_2_include.tcl + +# jtag axi master interface hardware name, change as per your design. +set jtag_axi_master hw_axi_1 +set ec 0 + +# hw test script +# Delete all previous axis transactions +if { [llength [get_hw_axi_txns -quiet]] } { + delete_hw_axi_txn [get_hw_axi_txns -quiet] +} + + +# Test all lite slaves. +set wdata_1 abcd1234 + +# Test: S00_AXI +# Create a write transaction at s00_axi_addr address +create_hw_axi_txn w_s00_axi_addr [get_hw_axis $jtag_axi_master] -type write -address $s00_axi_addr -data $wdata_1 +# Create a read transaction at s00_axi_addr address +create_hw_axi_txn r_s00_axi_addr [get_hw_axis $jtag_axi_master] -type read -address $s00_axi_addr +# Initiate transactions +run_hw_axi r_s00_axi_addr +run_hw_axi w_s00_axi_addr +run_hw_axi r_s00_axi_addr +set rdata_tmp [get_property DATA [get_hw_axi_txn r_s00_axi_addr]] +# Compare read data +if { $rdata_tmp == $wdata_1 } { + puts "Data comparison test pass for - S00_AXI" +} else { + puts "Data comparison test fail for - S00_AXI, expected-$wdata_1 actual-$rdata_tmp" + inc ec +} + +# Check error flag +if { $ec == 0 } { + puts "PTGEN_TEST: PASSED!" +} else { + puts "PTGEN_TEST: FAILED!" +} + diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/design.tcl b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/design.tcl new file mode 100644 index 0000000..254844c --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/design.tcl @@ -0,0 +1,175 @@ + +proc create_ipi_design { offsetfile design_name } { + + create_bd_design $design_name + open_bd_design $design_name + + # Create and configure Clock/Reset + create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz sys_clk_0 + create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset sys_reset_0 + + #check if current_board is set, if true - figure out required clocks. + set is_board_clock_found 0 + set is_board_reset_found 0 + set external_reset_port "" + set external_clock_port "" + + if { [current_board_part -quiet] != "" } { + + #check if any reset interface exists in board. + set board_reset [lindex [get_board_part_interfaces -filter { BUSDEF_NAME == reset_rtl && MODE == slave }] 0 ] + if { $board_reset ne "" } { + set is_board_reset_found 1 + apply_board_connection -board_interface $board_reset -ip_intf sys_clk_0/reset -diagram [current_bd_design] + apply_board_connection -board_interface $board_reset -ip_intf sys_reset_0/ext_reset -diagram [current_bd_design] + set external_rst [get_bd_ports -quiet -of_objects [get_bd_nets -quiet -of_objects [get_bd_pins -quiet sys_clk_0/reset]]] + if { $external_rst ne "" } { + set external_reset_port [get_property NAME $external_rst] + } + } else { + send_msg "ptgen 51-200" WARNING "No reset interface found in current_board, Users may need to specify the location constraints manually." + } + + # check for differential clock, exclude any special clocks which has TYPE property. + set board_clock_busifs "" + foreach busif [get_board_part_interfaces -filter "BUSDEF_NAME == diff_clock_rtl"] { + set type [get_property PARAM.TYPE $busif] + if { $type == "" } { + set board_clock_busifs $busif + break + } + } + if { $board_clock_busifs ne "" } { + apply_board_connection -board_interface $board_clock_busifs -ip_intf sys_clk_0/CLK_IN1_D -diagram [current_bd_design] + set is_board_clock_found 1 + } else { + # check for single ended clock + set board_sclock_busifs [lindex [get_board_part_interfaces -filter "BUSDEF_NAME == clock_rtl"] 0 ] + if { $board_sclock_busifs ne "" } { + apply_board_connection -board_interface $board_sclock_busifs -ip_intf sys_clk_0/clock_CLK_IN1 -diagram [current_bd_design] + set external_clk [get_bd_ports -quiet -of_objects [get_bd_nets -quiet -of_objects [get_bd_pins -quiet sys_clk_0/clk_in1]]] + if { $external_clk ne "" } { + set external_clock_port [get_property NAME $external_clk] + } + set is_board_clock_found 1 + } else { + send_msg "ptgen 51-200" WARNING "No clock interface found in current_board, Users may need to specify the location constraints manually." + } + } + + } else { + send_msg "ptgen 51-201" WARNING "No board selected in current_project. Users may need to specify the location constraints manually." + } + + #if there is no corresponding board interface found, assume constraints will be provided manually while pin planning. + if { $is_board_reset_found == 0 } { + create_bd_port -dir I -type rst reset_rtl + set_property CONFIG.POLARITY [get_property CONFIG.POLARITY [get_bd_pins sys_clk_0/reset]] [get_bd_ports reset_rtl] + connect_bd_net [get_bd_pins sys_reset_0/ext_reset_in] [get_bd_ports reset_rtl] + connect_bd_net [get_bd_ports reset_rtl] [get_bd_pins sys_clk_0/reset] + set external_reset_port reset_rtl + } + if { $is_board_clock_found == 0 } { + create_bd_port -dir I -type clk clock_rtl + connect_bd_net [get_bd_pins sys_clk_0/clk_in1] [get_bd_ports clock_rtl] + set external_clock_port clock_rtl + } + + #Avoid IPI DRC, make clock port synchronous to reset + if { $external_clock_port ne "" && $external_reset_port ne "" } { + set_property CONFIG.ASSOCIATED_RESET $external_reset_port [get_bd_ports $external_clock_port] + } + + # Connect other sys_reset pins + connect_bd_net [get_bd_pins sys_reset_0/slowest_sync_clk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins sys_clk_0/locked] [get_bd_pins sys_reset_0/dcm_locked] + + # Create instance: axi_i2s_adi_0, and set properties + set axi_i2s_adi_0 [ create_bd_cell -type ip -vlnv natinst.com:user:axi_i2s_adi:1.2 axi_i2s_adi_0 ] + + # Create instance: jtag_axi_0, and set properties + set jtag_axi_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:jtag_axi jtag_axi_0 ] + set_property -dict [list CONFIG.PROTOCOL {0}] [get_bd_cells jtag_axi_0] + connect_bd_net [get_bd_pins jtag_axi_0/aclk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins jtag_axi_0/aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn] + + # Create instance: axi_peri_interconnect, and set properties + set axi_peri_interconnect [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect axi_peri_interconnect ] + connect_bd_net [get_bd_pins axi_peri_interconnect/ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/ARESETN] [get_bd_pins sys_reset_0/interconnect_aresetn] + set_property -dict [ list CONFIG.NUM_SI {1} ] $axi_peri_interconnect + connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn] + connect_bd_intf_net [get_bd_intf_pins jtag_axi_0/M_AXI] [get_bd_intf_pins axi_peri_interconnect/S00_AXI] + + set_property -dict [ list CONFIG.NUM_MI {1} ] $axi_peri_interconnect + connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn] + + # Connect all clock & reset of axi_i2s_adi_0 slave interfaces.. + connect_bd_intf_net [get_bd_intf_pins axi_peri_interconnect/M00_AXI] [get_bd_intf_pins axi_i2s_adi_0/S00_AXI] + connect_bd_net [get_bd_pins axi_i2s_adi_0/s00_axi_aclk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_i2s_adi_0/s00_axi_aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn] + + + # Auto assign address + assign_bd_address + + # Copy all address to axi_i2s_adi_v1_2_include.tcl file + set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd + upvar 1 $offsetfile offset_file + set offset_file "${bd_path}/axi_i2s_adi_v1_2_include.tcl" + set fp [open $offset_file "w"] + puts $fp "# Configuration address parameters" + + set offset [get_property OFFSET [get_bd_addr_segs /jtag_axi_0/Data/SEG_axi_i2s_adi_0_S00_AXI_* ]] + puts $fp "set s00_axi_addr ${offset}" + + close $fp +} + +# Set IP Repository and Update IP Catalogue +set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores natinst.com:user:axi_i2s_adi:1.2]]]] +set hw_test_file ${ip_path}/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl + +set repo_paths [get_property ip_repo_paths [current_fileset]] +if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } { + set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset] + update_ip_catalog +} + +set design_name "" +set all_bd {} +set all_bd_files [get_files *.bd -quiet] +foreach file $all_bd_files { +set file_name [string range $file [expr {[string last "/" $file] + 1}] end] +set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]] +lappend all_bd $bd_name +} + +for { set i 1 } { 1 } { incr i } { + set design_name "axi_i2s_adi_v1_2_hw_${i}" + if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } { + break + } +} + +set intf_address_include_file "" +create_ipi_design intf_address_include_file ${design_name} +save_bd_design +validate_bd_design + +set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force] +import_files -force -norecurse $wrapper_file + +puts "-------------------------------------------------------------------------------------------------" +puts "INFO NEXT STEPS : Until this stage, debug hardware design has been created, " +puts " please perform following steps to test design in targeted board." +puts "1. Generate bitstream" +puts "2. Setup your targeted board, open hardware manager and open new(or existing) hardware target" +puts "3. Download generated bitstream" +puts "4. Run generated hardware test using below command, this invokes basic read/write operation" +puts " to every interface present in the peripheral : xilinx.com:user:myip:1.0" +puts " : source -notrace ${hw_test_file}" +puts "-------------------------------------------------------------------------------------------------" + diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_ctrlif.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_ctrlif.vhd new file mode 100644 index 0000000..972b2c2 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_ctrlif.vhd @@ -0,0 +1,151 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity axi_ctrlif is + generic + ( + C_NUM_REG : integer := 32; + C_S_AXI_DATA_WIDTH : integer := 32; + C_S_AXI_ADDR_WIDTH : integer := 32; + C_FAMILY : string := "virtex6" + ); + port + ( + -- AXI bus interface + S_AXI_ACLK : in std_logic; + S_AXI_ARESETN : in std_logic; + S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + S_AXI_AWVALID : in std_logic; + S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + S_AXI_WVALID : in std_logic; + S_AXI_BREADY : in std_logic; + S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + S_AXI_ARVALID : in std_logic; + S_AXI_RREADY : in std_logic; + S_AXI_ARREADY : out std_logic; + S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + S_AXI_RRESP : out std_logic_vector(1 downto 0); + S_AXI_RVALID : out std_logic; + S_AXI_WREADY : out std_logic; + S_AXI_BRESP : out std_logic_vector(1 downto 0); + S_AXI_BVALID : out std_logic; + S_AXI_AWREADY : out std_logic; + + rd_addr : out integer range 0 to C_NUM_REG - 1; + rd_data : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + rd_ack : out std_logic; + rd_stb : in std_logic; + + wr_addr : out integer range 0 to C_NUM_REG - 1; + wr_data : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + wr_ack : in std_logic; + wr_stb : out std_logic + ); +end entity axi_ctrlif; + + +architecture Behavioral of axi_ctrlif is + type state_type is (IDLE, RESP, ACK); + signal rd_state : state_type; + signal wr_state : state_type; +begin + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + rd_state <= IDLE; + else + case rd_state is + when IDLE => + if S_AXI_ARVALID = '1' then + rd_state <= RESP; + rd_addr <= to_integer(unsigned(S_AXI_ARADDR(31 downto 2))); + end if; + when RESP => + if rd_stb = '1' and S_AXI_RREADY = '1' then + rd_state <= IDLE; + end if; + when others => null; + end case; + end if; + end if; + end process; + + S_AXI_ARREADY <= '1' when rd_state = IDLE else '0'; + S_AXI_RVALID <= '1' when rd_state = RESP and rd_stb = '1' else '0'; + S_AXI_RRESP <= "00"; + rd_ack <= '1' when rd_state = RESP and S_AXI_RREADY = '1' else '0'; + S_AXI_RDATA <= rd_data; + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + wr_state <= IDLE; + else + case wr_state is + when IDLE => + if S_AXI_AWVALID = '1' and S_AXI_WVALID = '1' and wr_ack = '1' then + wr_state <= ACK; + end if; + when ACK => + wr_state <= RESP; + when RESP => + if S_AXI_BREADY = '1' then + wr_state <= IDLE; + end if; + end case; + end if; + end if; + end process; + + wr_stb <= '1' when S_AXI_AWVALID = '1' and S_AXI_WVALID = '1' and wr_state = IDLE else '0'; + wr_data <= S_AXI_WDATA; + wr_addr <= to_integer(unsigned(S_AXI_AWADDR(31 downto 2))); + + S_AXI_AWREADY <= '1' when wr_state = ACK else '0'; + S_AXI_WREADY <= '1' when wr_state = ACK else '0'; + + S_AXI_BRESP <= "00"; + S_AXI_BVALID <= '1' when wr_state = RESP else '0'; +end; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_rx_fifo.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_rx_fifo.vhd new file mode 100644 index 0000000..99154a2 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_rx_fifo.vhd @@ -0,0 +1,80 @@ +library ieee; +use ieee.std_logic_1164.all; + +library adi_common_v1_00_a; +use adi_common_v1_00_a.dma_fifo; + +entity axi_streaming_dma_rx_fifo is + generic ( + RAM_ADDR_WIDTH : integer := 3; + FIFO_DWIDTH : integer := 32 + ); + port ( + clk : in std_logic; + resetn : in std_logic; + fifo_reset : in std_logic; + + -- Enable DMA interface + enable : in Boolean; + + period_len : in integer range 0 to 65535; + + -- Read port + M_AXIS_ACLK : in std_logic; + M_AXIS_TREADY : in std_logic; + M_AXIS_TDATA : out std_logic_vector(FIFO_DWIDTH-1 downto 0); + M_AXIS_TLAST : out std_logic; + M_AXIS_TVALID : out std_logic; + M_AXIS_TKEEP : out std_logic_vector(3 downto 0); + + -- Write port + in_stb : in std_logic; + in_ack : out std_logic; + in_data : in std_logic_vector(FIFO_DWIDTH-1 downto 0) + ); +end; + +architecture imp of axi_streaming_dma_rx_fifo is + signal out_stb : std_logic; + + signal period_count : integer range 0 to 65535; + signal last : std_logic; +begin + + M_AXIS_TVALID <= out_stb; + + fifo: entity dma_fifo + generic map ( + RAM_ADDR_WIDTH => RAM_ADDR_WIDTH, + FIFO_DWIDTH => FIFO_DWIDTH + ) + port map ( + clk => clk, + resetn => resetn, + fifo_reset => fifo_reset, + in_stb => in_stb, + in_ack => in_ack, + in_data => in_data, + out_stb => out_stb, + out_ack => M_AXIS_TREADY, + out_data => M_AXIS_TDATA + ); + + M_AXIS_TKEEP <= "1111"; + M_AXIS_TLAST <= '1' when period_count = 0 else '0'; + + period_counter: process(M_AXIS_ACLK) is + begin + if resetn = '0' then + period_count <= period_len; + else + if out_stb = '1' and M_AXIS_TREADY = '1' then + if period_count = 0 then + period_count <= period_len; + else + period_count <= period_count - 1; + end if; + end if; + end if; + end process; +end; \ No newline at end of file diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_tx_fifo.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_tx_fifo.vhd new file mode 100644 index 0000000..5d50208 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_tx_fifo.vhd @@ -0,0 +1,74 @@ +library ieee; +use ieee.std_logic_1164.all; + +library adi_common_v1_00_a; +use adi_common_v1_00_a.dma_fifo; + +entity axi_streaming_dma_tx_fifo is + generic ( + RAM_ADDR_WIDTH : integer := 3; + FIFO_DWIDTH : integer := 32 + ); + port ( + clk : in std_logic; + resetn : in std_logic; + fifo_reset : in std_logic; + + -- Enable DMA interface + enable : in Boolean; + + -- Write port + S_AXIS_ACLK : in std_logic; + S_AXIS_TREADY : out std_logic; + S_AXIS_TDATA : in std_logic_vector(FIFO_DWIDTH-1 downto 0); + S_AXIS_TLAST : in std_logic; + S_AXIS_TVALID : in std_logic; + + -- Read port + out_stb : out std_logic; + out_ack : in std_logic; + out_data : out std_logic_vector(FIFO_DWIDTH-1 downto 0) + ); +end; + +architecture imp of axi_streaming_dma_tx_fifo is + signal in_ack : std_logic; + signal drain_dma : Boolean; +begin + + fifo: entity dma_fifo + generic map ( + RAM_ADDR_WIDTH => RAM_ADDR_WIDTH, + FIFO_DWIDTH => FIFO_DWIDTH + ) + port map ( + clk => clk, + resetn => resetn, + fifo_reset => fifo_reset, + in_stb => S_AXIS_TVALID, + in_ack => in_ack, + in_data => S_AXIS_TDATA, + out_stb => out_stb, + out_ack => out_ack, + out_data => out_data + ); + + drain_process: process (S_AXIS_ACLK) is + variable enable_d1 : Boolean; + begin + if rising_edge(S_AXIS_ACLK) then + if resetn = '0' then + drain_dma <= False; + else + if S_AXIS_TLAST = '1' then + drain_dma <= False; + elsif enable_d1 and enable then + drain_dma <= True; + end if; + enable_d1 := enable; + end if; + end if; + end process; + + S_AXIS_TREADY <= '1' when in_ack = '1' or drain_dma else '0'; +end; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/dma_fifo.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/dma_fifo.vhd new file mode 100644 index 0000000..5339d73 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/dma_fifo.vhd @@ -0,0 +1,69 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity dma_fifo is + generic ( + RAM_ADDR_WIDTH : integer := 3; + FIFO_DWIDTH : integer := 32 + ); + port ( + clk : in std_logic; + resetn : in std_logic; + fifo_reset : in std_logic; + + -- Write port + in_stb : in std_logic; + in_ack : out std_logic; + in_data : in std_logic_vector(FIFO_DWIDTH-1 downto 0); + + -- Read port + out_stb : out std_logic; + out_ack : in std_logic; + out_data : out std_logic_vector(FIFO_DWIDTH-1 downto 0) + ); +end; + +architecture imp of dma_fifo is + + constant FIFO_MAX : natural := 2**RAM_ADDR_WIDTH -1; + type MEM is array (0 to FIFO_MAX) of std_logic_vector(FIFO_DWIDTH - 1 downto 0); + signal data_fifo : MEM; + signal wr_addr : natural range 0 to FIFO_MAX; + signal rd_addr : natural range 0 to FIFO_MAX; + signal full, empty : Boolean; + +begin + in_ack <= '0' when full else '1'; + + out_stb <= '0' when empty else '1'; + out_data <= data_fifo(rd_addr); + + fifo: process (clk) is + variable free_cnt : integer range 0 to FIFO_MAX + 1; + begin + if rising_edge(clk) then + if (resetn = '0') or (fifo_reset = '1') then + wr_addr <= 0; + rd_addr <= 0; + free_cnt := FIFO_MAX + 1; + empty <= True; + full <= False; + else + if in_stb = '1' and not full then + data_fifo(wr_addr) <= in_data; + wr_addr <= (wr_addr + 1) mod (FIFO_MAX + 1); + free_cnt := free_cnt - 1; + end if; + + if out_ack = '1' and not empty then + rd_addr <= (rd_addr + 1) mod (FIFO_MAX + 1); + free_cnt := free_cnt + 1; + end if; + + full <= free_cnt = 0; + empty <= free_cnt = FIFO_MAX + 1; + end if; + end if; + end process; +end; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/pl330_dma_fifo.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/pl330_dma_fifo.vhd new file mode 100644 index 0000000..2e53bbc --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/pl330_dma_fifo.vhd @@ -0,0 +1,140 @@ +library ieee; +use ieee.std_logic_1164.all; + +library adi_common_v1_00_a; +use adi_common_v1_00_a.dma_fifo; + +entity pl330_dma_fifo is + generic ( + RAM_ADDR_WIDTH : integer := 3; + FIFO_DWIDTH : integer := 32; + FIFO_DIRECTION : integer := 0 -- 0 = write FIFO, 1 = read FIFO + ); + port ( + clk : in std_logic; + resetn : in std_logic; + fifo_reset : in std_logic; + + -- Enable DMA interface + enable : in Boolean; + + -- Write port + in_stb : in std_logic; + in_ack : out std_logic; + in_data : in std_logic_vector(FIFO_DWIDTH-1 downto 0); + + -- Read port + out_stb : out std_logic; + out_ack : in std_logic; + out_data : out std_logic_vector(FIFO_DWIDTH-1 downto 0); + + -- PL330 DMA interface + dclk : in std_logic; + dresetn : in std_logic; + davalid : in std_logic; + daready : out std_logic; + datype : in std_logic_vector(1 downto 0); + drvalid : out std_logic; + drready : in std_logic; + drtype : out std_logic_vector(1 downto 0); + drlast : out std_logic; + + DBG : out std_logic_vector(7 downto 0) + ); +end; + +architecture imp of pl330_dma_fifo is + signal request_data : Boolean; + + type state_type is (IDLE, REQUEST, WAITING, FLUSH); + signal state : state_type; + signal i_in_ack : std_logic; + signal i_out_stb : std_logic; +begin + + in_ack <= i_in_ack; + out_stb <= i_out_stb; + + fifo: entity dma_fifo + generic map ( + RAM_ADDR_WIDTH => RAM_ADDR_WIDTH, + FIFO_DWIDTH => FIFO_DWIDTH + ) + port map ( + clk => clk, + resetn => resetn, + fifo_reset => fifo_reset, + in_stb => in_stb, + in_ack => i_in_ack, + in_data => in_data, + out_stb => i_out_stb, + out_ack => out_ack, + out_data => out_data + ); + + request_data <= i_in_ack = '1' when FIFO_DIRECTION = 0 else i_out_stb = '1'; + + drlast <= '0'; + daready <= '1'; + + drvalid <= '1' when (state = REQUEST) or (state = FLUSH) else '0'; + drtype <= "00" when state = REQUEST else "10"; + + DBG(0) <= davalid; + DBG(2 downto 1) <= datype; + DBG(3) <= '1' when request_data else '0'; + + process (state) + begin + case state is + when IDLE => DBG(5 downto 4) <= "00"; + when REQUEST => DBG(5 downto 4) <= "01"; + when WAITING => DBG(5 downto 4) <= "10"; + when FLUSH => DBG(5 downto 4) <= "11"; + end case; + end process; + + pl330_req_fsm: process (dclk) is + begin + if rising_edge(dclk) then + if dresetn = '0' then + state <= IDLE; + else + -- The controller may send a FLUSH request at any time and it won't + -- respond to any of our requests until we've ack the FLUSH request. + -- The FLUSH request is also supposed to reset our state machine, so + -- go back to idle after having acked the FLUSH. + if davalid = '1' and datype = "10" then + state <= FLUSH; + else + case state is + -- Nothing to do, wait for the fifo to run empty + when IDLE => + if request_data and enable then + state <= REQUEST; + end if; + -- Send out a request to the PL330 + when REQUEST => + if drready = '1' then + state <= WAITING; + end if; + -- Wait for a ACK from the PL330 that it did transfer the data + when WAITING => + if fifo_reset = '1' then + state <= IDLE; + elsif davalid = '1' then + if datype = "00" then + state <= IDLE; + end if; + end if; + -- Send out an ACK for the flush + when FLUSH => + if drready = '1' then + state <= IDLE; + end if; + end case; + end if; + end if; + end if; + end process; +end; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd new file mode 100644 index 0000000..26c72ae --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd @@ -0,0 +1,361 @@ +-------------------------------------------------------------------------------- +-- +-- File: +-- axi_i2s_adi_S_AXI.vhd +-- +-- Module: +-- AXIS I2S Controller AXI Slave Interface +-- +-- Author: +-- Tinghui Wang (Steve) +-- Sam Bobrowicz +-- +-- Description: +-- AXI-Lite Register Interface for AXI I2S Controller +-- +-- Copyright notice: +-- Copyright (C) 2014 Digilent Inc. +-- +-- License: +-- This program is free software; distributed under the terms of +-- BSD 3-clause license ("Revised BSD License", "New BSD License", or "Modified BSD License") +-- +-- 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 above 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. Neither the name(s) of the above-listed copyright holder(s) nor the names +-- of its contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. +-- +-------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.math_real.all; + +entity axi_i2s_adi_S_AXI is + generic ( + -- Users to add parameters here + + -- User parameters ends + -- Do not modify the parameters beyond this line + + -- Width of S_AXI data bus + C_S_AXI_DATA_WIDTH : integer := 32; + -- Width of S_AXI address bus + C_S_AXI_ADDR_WIDTH : integer := 6 + ); + port ( + rd_addr : out integer range 0 to 12 - 1; + rd_data : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + rd_ack : out std_logic; + + wr_addr : out integer range 0 to 12 - 1; + wr_data : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + wr_stb : out std_logic; + -- User ports ends + -- Do not modify the ports beyond this line + + -- Global Clock Signal + S_AXI_ACLK : in std_logic; + -- Global Reset Signal. This Signal is Active LOW + S_AXI_ARESETN : in std_logic; + -- Write address (issued by master, acceped by Slave) + S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + -- Write channel Protection type. This signal indicates the + -- privilege and security level of the transaction, and whether + -- the transaction is a data access or an instruction access. + S_AXI_AWPROT : in std_logic_vector(2 downto 0); + -- Write address valid. This signal indicates that the master signaling + -- valid write address and control information. + S_AXI_AWVALID : in std_logic; + -- Write address ready. This signal indicates that the slave is ready + -- to accept an address and associated control signals. + S_AXI_AWREADY : out std_logic; + -- Write data (issued by master, acceped by Slave) + S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + -- Write strobes. This signal indicates which byte lanes hold + -- valid data. There is one write strobe bit for each eight + -- bits of the write data bus. + S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + -- Write valid. This signal indicates that valid write + -- data and strobes are available. + S_AXI_WVALID : in std_logic; + -- Write ready. This signal indicates that the slave + -- can accept the write data. + S_AXI_WREADY : out std_logic; + -- Write response. This signal indicates the status + -- of the write transaction. + S_AXI_BRESP : out std_logic_vector(1 downto 0); + -- Write response valid. This signal indicates that the channel + -- is signaling a valid write response. + S_AXI_BVALID : out std_logic; + -- Response ready. This signal indicates that the master + -- can accept a write response. + S_AXI_BREADY : in std_logic; + -- Read address (issued by master, acceped by Slave) + S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + -- Protection type. This signal indicates the privilege + -- and security level of the transaction, and whether the + -- transaction is a data access or an instruction access. + S_AXI_ARPROT : in std_logic_vector(2 downto 0); + -- Read address valid. This signal indicates that the channel + -- is signaling valid read address and control information. + S_AXI_ARVALID : in std_logic; + -- Read address ready. This signal indicates that the slave is + -- ready to accept an address and associated control signals. + S_AXI_ARREADY : out std_logic; + -- Read data (issued by slave) + S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + -- Read response. This signal indicates the status of the + -- read transfer. + S_AXI_RRESP : out std_logic_vector(1 downto 0); + -- Read valid. This signal indicates that the channel is + -- signaling the required read data. + S_AXI_RVALID : out std_logic; + -- Read ready. This signal indicates that the master can + -- accept the read data and response information. + S_AXI_RREADY : in std_logic + ); +end axi_i2s_adi_S_AXI; + +architecture arch_imp of axi_i2s_adi_S_AXI is + + -- AXI4LITE signals + signal axi_awaddr : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + signal axi_awready : std_logic; + signal axi_wready : std_logic; + signal axi_bresp : std_logic_vector(1 downto 0); + signal axi_bvalid : std_logic; + signal axi_araddr : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + signal axi_arready : std_logic; + signal axi_rdata : std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal axi_rresp : std_logic_vector(1 downto 0); + signal axi_rvalid : std_logic; + + -- Example-specific design signals + -- local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH + -- ADDR_LSB is used for addressing 32/64 bit registers/memories + -- ADDR_LSB = 2 for 32 bits (n downto 2) + -- ADDR_LSB = 3 for 64 bits (n downto 3) + constant ADDR_LSB : integer := (C_S_AXI_DATA_WIDTH/32)+ 1; + constant OPT_MEM_ADDR_BITS : integer := 3; + ------------------------------------------------ + ---- Signals for user logic register space example + -------------------------------------------------- + signal slv_reg_rden : std_logic; + signal slv_reg_wren : std_logic; + signal reg_data_out :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + +begin + -- I/O Connections assignments + + S_AXI_AWREADY <= axi_awready; + S_AXI_WREADY <= axi_wready; + S_AXI_BRESP <= axi_bresp; + S_AXI_BVALID <= axi_bvalid; + S_AXI_ARREADY <= axi_arready; + S_AXI_RDATA <= axi_rdata; + S_AXI_RRESP <= axi_rresp; + S_AXI_RVALID <= axi_rvalid; + -- Implement axi_awready generation + -- axi_awready is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is + -- de-asserted when reset is low. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_awready <= '0'; + else + if (axi_awready = '0' and S_AXI_AWVALID = '1' and S_AXI_WVALID = '1') then + -- slave is ready to accept write address when + -- there is a valid write address and write data + -- on the write address and data bus. This design + -- expects no outstanding transactions. + axi_awready <= '1'; + else + axi_awready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement axi_awaddr latching + -- This process is used to latch the address when both + -- S_AXI_AWVALID and S_AXI_WVALID are valid. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_awaddr <= (others => '0'); + else + if (axi_awready = '0' and S_AXI_AWVALID = '1' and S_AXI_WVALID = '1') then + -- Write Address latching + axi_awaddr <= S_AXI_AWADDR; + end if; + end if; + end if; + end process; + + -- Implement axi_wready generation + -- axi_wready is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is + -- de-asserted when reset is low. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_wready <= '0'; + else + if (axi_wready = '0' and S_AXI_WVALID = '1' and S_AXI_AWVALID = '1') then + -- slave is ready to accept write data when + -- there is a valid write address and write data + -- on the write address and data bus. This design + -- expects no outstanding transactions. + axi_wready <= '1'; + else + axi_wready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement memory mapped register select and write logic generation + -- The write data is accepted and written to memory mapped registers when + -- axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to + -- select byte enables of slave registers while writing. + -- These registers are cleared when reset (active low) is applied. + -- Slave register write enable is asserted when valid address and data are available + -- and the slave is ready to accept the write address and write data. + slv_reg_wren <= axi_wready and S_AXI_WVALID and axi_awready and S_AXI_AWVALID ; + + wr_data <= S_AXI_WDATA; + wr_addr <= to_integer(unsigned(axi_awaddr((C_S_AXI_ADDR_WIDTH - 1) downto 2))); + wr_stb <= slv_reg_wren; + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_bvalid <= '0'; + axi_bresp <= "00"; --need to work more on the responses + else + if (axi_awready = '1' and S_AXI_AWVALID = '1' and axi_wready = '1' and S_AXI_WVALID = '1' and axi_bvalid = '0' ) then + axi_bvalid <= '1'; + axi_bresp <= "00"; + elsif (S_AXI_BREADY = '1' and axi_bvalid = '1') then --check if bready is asserted while bvalid is high) + axi_bvalid <= '0'; -- (there is a possibility that bready is always asserted high) + end if; + end if; + end if; + end process; + + -- Implement axi_arready generation + -- axi_arready is asserted for one S_AXI_ACLK clock cycle when + -- S_AXI_ARVALID is asserted. axi_awready is + -- de-asserted when reset (active low) is asserted. + -- The read address is also latched when S_AXI_ARVALID is + -- asserted. axi_araddr is reset to zero on reset assertion. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_arready <= '0'; + axi_araddr <= (others => '1'); + else + if (axi_arready = '0' and S_AXI_ARVALID = '1') then + -- indicates that the slave has acceped the valid read address + axi_arready <= '1'; + -- Read Address latching + axi_araddr <= S_AXI_ARADDR; + else + axi_arready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement axi_arvalid generation + -- axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_ARVALID and axi_arready are asserted. The slave registers + -- data are available on the axi_rdata bus at this instance. The + -- assertion of axi_rvalid marks the validity of read data on the + -- bus and axi_rresp indicates the status of read transaction.axi_rvalid + -- is deasserted on reset (active low). axi_rresp and axi_rdata are + -- cleared to zero on reset (active low). + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_rvalid <= '0'; + axi_rresp <= "00"; + else + if (axi_arready = '1' and S_AXI_ARVALID = '1' and axi_rvalid = '0') then + -- Valid read data is available at the read data bus + axi_rvalid <= '1'; + axi_rresp <= "00"; -- 'OKAY' response + elsif (axi_rvalid = '1' and S_AXI_RREADY = '1') then + -- Read data is accepted by the master + axi_rvalid <= '0'; + end if; + end if; + end if; + end process; + + -- Implement memory mapped register select and read logic generation + -- Slave register read enable is asserted when valid address is available + -- and the slave is ready to accept the read address. + slv_reg_rden <= axi_arready and S_AXI_ARVALID and (not axi_rvalid) ; + + rd_ack <= slv_reg_rden; + reg_data_out <= rd_data; + rd_addr <= to_integer(unsigned(axi_araddr((C_S_AXI_ADDR_WIDTH - 1) downto 2))); + + -- Output register or memory read data + process( S_AXI_ACLK ) is + begin + if (rising_edge (S_AXI_ACLK)) then + if ( S_AXI_ARESETN = '0' ) then + axi_rdata <= (others => '0'); + else + if (slv_reg_rden = '1') then + -- When there is a valid read address (S_AXI_ARVALID) with + -- acceptance of read address by the slave (axi_arready), + -- output the read dada + -- Read address mux + axi_rdata <= reg_data_out; -- register read data + end if; + end if; + end if; + end process; + + + -- Add user logic here + + + -- User logic ends + +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd new file mode 100644 index 0000000..83c3f39 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd @@ -0,0 +1,469 @@ + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.math_real.all; + +library axi_i2s_adi_v1_00_a; +use axi_i2s_adi_v1_00_a.i2s_controller; + +library adi_common_v1_00_a; +use adi_common_v1_00_a.axi_streaming_dma_rx_fifo; +use adi_common_v1_00_a.axi_streaming_dma_tx_fifo; +use adi_common_v1_00_a.pl330_dma_fifo; +use adi_common_v1_00_a.axi_ctrlif; + + +entity axi_i2s_adi_v1_2 is + generic ( + -- Users to add parameters here + C_SLOT_WIDTH : integer := 24; + C_LRCLK_POL : integer := 0; -- LRCLK Polarity (0 - Falling edge, 1 - Rising edge) + C_BCLK_POL : integer := 0; -- BCLK Polarity (0 - Falling edge, 1 - Rising edge) + C_DMA_TYPE : integer := 0; + C_NUM_CH : integer := 1; + C_HAS_TX : integer := 1; + C_HAS_RX : integer := 1; + -- User parameters ends + -- Do not modify the parameters beyond this line + + + -- Parameters of Axi Slave Bus Interface S00_AXI + C_S00_AXI_DATA_WIDTH : integer := 32; + C_S00_AXI_ADDR_WIDTH : integer := 6 + ); + port ( + -- Users to add ports here + -- Serial Data interface + DATA_CLK_I : in std_logic; + BCLK_O : out std_logic_vector(C_NUM_CH - 1 downto 0); + LRCLK_O : out std_logic_vector(C_NUM_CH - 1 downto 0); + SDATA_O : out std_logic_vector(C_NUM_CH - 1 downto 0); + SDATA_I : in std_logic_vector(C_NUM_CH - 1 downto 0); + MUTEN_O : out std_logic; + + -- AXI Streaming DMA TX interface + S_AXIS_ACLK : in std_logic; + S_AXIS_TREADY : out std_logic; + S_AXIS_TDATA : in std_logic_vector(31 downto 0); + S_AXIS_TLAST : in std_logic; + S_AXIS_TVALID : in std_logic; + + -- AXI Streaming DMA RX interface + M_AXIS_ACLK : in std_logic; + M_AXIS_TREADY : in std_logic; + M_AXIS_TDATA : out std_logic_vector(31 downto 0); + M_AXIS_TLAST : out std_logic; + M_AXIS_TVALID : out std_logic; + M_AXIS_TKEEP : out std_logic_vector(3 downto 0); + + --PL330 DMA TX interface + DMA_REQ_TX_ACLK : in std_logic; + DMA_REQ_TX_RSTN : in std_logic; + DMA_REQ_TX_DAVALID : in std_logic; + DMA_REQ_TX_DATYPE : in std_logic_vector(1 downto 0); + DMA_REQ_TX_DAREADY : out std_logic; + DMA_REQ_TX_DRVALID : out std_logic; + DMA_REQ_TX_DRTYPE : out std_logic_vector(1 downto 0); + DMA_REQ_TX_DRLAST : out std_logic; + DMA_REQ_TX_DRREADY : in std_logic; + + -- PL330 DMA RX interface + DMA_REQ_RX_ACLK : in std_logic; + DMA_REQ_RX_RSTN : in std_logic; + DMA_REQ_RX_DAVALID : in std_logic; + DMA_REQ_RX_DATYPE : in std_logic_vector(1 downto 0); + DMA_REQ_RX_DAREADY : out std_logic; + DMA_REQ_RX_DRVALID : out std_logic; + DMA_REQ_RX_DRTYPE : out std_logic_vector(1 downto 0); + DMA_REQ_RX_DRLAST : out std_logic; + DMA_REQ_RX_DRREADY : in std_logic; + -- User ports ends + -- Do not modify the ports beyond this line + + + -- Ports of Axi Slave Bus Interface S00_AXI + s00_axi_aclk : in std_logic; + s00_axi_aresetn : in std_logic; + s00_axi_awaddr : in std_logic_vector(C_S00_AXI_ADDR_WIDTH-1 downto 0); + s00_axi_awprot : in std_logic_vector(2 downto 0); + s00_axi_awvalid : in std_logic; + s00_axi_awready : out std_logic; + s00_axi_wdata : in std_logic_vector(C_S00_AXI_DATA_WIDTH-1 downto 0); + s00_axi_wstrb : in std_logic_vector((C_S00_AXI_DATA_WIDTH/8)-1 downto 0); + s00_axi_wvalid : in std_logic; + s00_axi_wready : out std_logic; + s00_axi_bresp : out std_logic_vector(1 downto 0); + s00_axi_bvalid : out std_logic; + s00_axi_bready : in std_logic; + s00_axi_araddr : in std_logic_vector(C_S00_AXI_ADDR_WIDTH-1 downto 0); + s00_axi_arprot : in std_logic_vector(2 downto 0); + s00_axi_arvalid : in std_logic; + s00_axi_arready : out std_logic; + s00_axi_rdata : out std_logic_vector(C_S00_AXI_DATA_WIDTH-1 downto 0); + s00_axi_rresp : out std_logic_vector(1 downto 0); + s00_axi_rvalid : out std_logic; + s00_axi_rready : in std_logic + ); +end axi_i2s_adi_v1_2; + +architecture arch_imp of axi_i2s_adi_v1_2 is + + -- component declaration + component axi_i2s_adi_S_AXI is + generic ( + C_S_AXI_DATA_WIDTH : integer := 32; + C_S_AXI_ADDR_WIDTH : integer := 6 + ); + port ( + rd_addr : out integer range 0 to 12 - 1; + rd_data : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + rd_ack : out std_logic; + + wr_addr : out integer range 0 to 12 - 1; + wr_data : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + wr_stb : out std_logic; + S_AXI_ACLK : in std_logic; + S_AXI_ARESETN : in std_logic; + S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + S_AXI_AWPROT : in std_logic_vector(2 downto 0); + S_AXI_AWVALID : in std_logic; + S_AXI_AWREADY : out std_logic; + S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + S_AXI_WVALID : in std_logic; + S_AXI_WREADY : out std_logic; + S_AXI_BRESP : out std_logic_vector(1 downto 0); + S_AXI_BVALID : out std_logic; + S_AXI_BREADY : in std_logic; + S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + S_AXI_ARPROT : in std_logic_vector(2 downto 0); + S_AXI_ARVALID : in std_logic; + S_AXI_ARREADY : out std_logic; + S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + S_AXI_RRESP : out std_logic_vector(1 downto 0); + S_AXI_RVALID : out std_logic; + S_AXI_RREADY : in std_logic + ); + end component axi_i2s_adi_S_AXI; + + signal i2s_reset : std_logic; +signal tx_fifo_reset : std_logic; +signal tx_enable : Boolean; +signal tx_data : std_logic_vector(C_SLOT_WIDTH - 1 downto 0); +signal tx_ack : std_logic; +signal tx_stb : std_logic; +signal tx_fifo_full : std_logic; +signal tx_fifo_empty : std_logic; +signal tx_in_ack : std_logic; + + +signal rx_enable : Boolean; +signal rx_fifo_reset : std_logic; +signal rx_data : std_logic_vector(C_SLOT_WIDTH - 1 downto 0); +signal rx_ack : std_logic; +signal rx_stb : std_logic; +signal rx_fifo_full : std_logic; +signal rx_fifo_empty : std_logic; +signal rx_out_stb : std_logic; + +signal bclk_div_rate : natural range 0 to 255; +signal lrclk_div_rate : natural range 0 to 255; + +signal period_len : integer range 0 to 65535; + +signal I2S_RESET_REG : std_logic_vector(31 downto 0); +signal I2S_CONTROL_REG : std_logic_vector(31 downto 0); +signal I2S_CLK_CONTROL_REG : std_logic_vector(31 downto 0); +signal PERIOD_LEN_REG : std_logic_vector(31 downto 0); + +constant FIFO_AWIDTH : integer := integer(ceil(log2(real(C_NUM_CH * 8)))); + +-- Audio samples FIFO +constant RAM_ADDR_WIDTH : integer := 7; +type RAM_TYPE is array (0 to (2**RAM_ADDR_WIDTH - 1)) of std_logic_vector(31 downto 0); + +-- RX FIFO signals +signal audio_fifo_rx : RAM_TYPE; +signal audio_fifo_rx_wr_addr : integer range 0 to 2**RAM_ADDR_WIDTH-1; +signal audio_fifo_rx_rd_addr : integer range 0 to 2**RAM_ADDR_WIDTH-1; +signal tvalid : std_logic := '0'; +signal rx_tlast : std_logic; +signal drain_tx_dma : std_logic; + +signal rx_sample : std_logic_vector(23 downto 0); + +signal wr_data : std_logic_vector(31 downto 0); +signal rd_data : std_logic_vector(31 downto 0); +signal wr_addr : integer range 0 to 11; +signal rd_addr : integer range 0 to 11; +signal wr_stb : std_logic; +signal rd_ack : std_logic; +signal tx_fifo_stb : std_logic; +signal rx_fifo_ack : std_logic; +signal cnt : integer range 0 to 2**16-1; + +begin + +-- Instantiation of Axi Bus Interface S00_AXI +axi_i2s_adi_S_AXI_inst : axi_i2s_adi_S_AXI + generic map ( + C_S_AXI_DATA_WIDTH => C_S00_AXI_DATA_WIDTH, + C_S_AXI_ADDR_WIDTH => C_S00_AXI_ADDR_WIDTH + ) + port map ( + rd_addr => rd_addr, + rd_data => rd_data, + rd_ack => rd_ack, + + wr_addr => wr_addr, + wr_data => wr_data, + wr_stb => wr_stb, + S_AXI_ACLK => s00_axi_aclk, + S_AXI_ARESETN => s00_axi_aresetn, + S_AXI_AWADDR => s00_axi_awaddr, + S_AXI_AWPROT => s00_axi_awprot, + S_AXI_AWVALID => s00_axi_awvalid, + S_AXI_AWREADY => s00_axi_awready, + S_AXI_WDATA => s00_axi_wdata, + S_AXI_WSTRB => s00_axi_wstrb, + S_AXI_WVALID => s00_axi_wvalid, + S_AXI_WREADY => s00_axi_wready, + S_AXI_BRESP => s00_axi_bresp, + S_AXI_BVALID => s00_axi_bvalid, + S_AXI_BREADY => s00_axi_bready, + S_AXI_ARADDR => s00_axi_araddr, + S_AXI_ARPROT => s00_axi_arprot, + S_AXI_ARVALID => s00_axi_arvalid, + S_AXI_ARREADY => s00_axi_arready, + S_AXI_RDATA => s00_axi_rdata, + S_AXI_RRESP => s00_axi_rresp, + S_AXI_RVALID => s00_axi_rvalid, + S_AXI_RREADY => s00_axi_rready + ); + + -- Add user logic here +process (s00_axi_aclk) + begin + if rising_edge(s00_axi_aclk) then + if s00_axi_aresetn = '0' then + cnt <= 0; + else + cnt <= (cnt + 1) mod 2**16; + end if; + end if; + end process; + + streaming_dma_tx_gen: if C_DMA_TYPE = 0 and C_HAS_TX = 1 generate + tx_fifo : entity axi_streaming_dma_tx_fifo + generic map( + RAM_ADDR_WIDTH => FIFO_AWIDTH, + FIFO_DWIDTH => 24 + ) + port map( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + fifo_reset => tx_fifo_reset, + enable => tx_enable, + + S_AXIS_ACLK => S_AXIS_ACLK, + S_AXIS_TREADY => S_AXIS_TREADY, + S_AXIS_TDATA => S_AXIS_TDATA(31 downto 8), + S_AXIS_TLAST => S_AXIS_TLAST, + S_AXIS_TVALID => S_AXIS_TVALID, + + out_stb => tx_stb, + out_ack => tx_ack, + out_data => tx_data + ); + end generate; + + streaming_dma_rx_gen: if C_DMA_TYPE = 0 and C_HAS_RX = 1 generate + rx_fifo : entity axi_streaming_dma_rx_fifo + generic map( + RAM_ADDR_WIDTH => FIFO_AWIDTH, + FIFO_DWIDTH => 24 + ) + port map( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + fifo_reset => tx_fifo_reset, + enable => tx_enable, + + period_len => period_len, + + in_stb => rx_stb, + in_ack => rx_ack, + in_data => rx_data, + + M_AXIS_ACLK => M_AXIS_ACLK, + M_AXIS_TREADY => M_AXIS_TREADY, + M_AXIS_TDATA => M_AXIS_TDATA(31 downto 8), + M_AXIS_TLAST => M_AXIS_TLAST, + M_AXIS_TVALID => M_AXIS_TVALID, + M_AXIS_TKEEP => M_AXIS_TKEEP + ); + + M_AXIS_TDATA(7 downto 0) <= (others => '0'); + end generate; + + pl330_dma_tx_gen: if C_DMA_TYPE = 1 and C_HAS_TX = 1 generate + tx_fifo_stb <= '1' when wr_addr = 11 and wr_stb = '1' else '0'; + + tx_fifo: entity pl330_dma_fifo + generic map( + RAM_ADDR_WIDTH => FIFO_AWIDTH, + FIFO_DWIDTH => 24, + FIFO_DIRECTION => 0 + ) + port map ( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + fifo_reset => tx_fifo_reset, + enable => tx_enable, + + in_data => wr_data(31 downto 8), + in_stb => tx_fifo_stb, + in_ack => tx_in_ack, + + out_ack => tx_ack, + out_stb => tx_stb, + out_data => tx_data, + + dclk => DMA_REQ_TX_ACLK, + dresetn => DMA_REQ_TX_RSTN, + davalid => DMA_REQ_TX_DAVALID, + daready => DMA_REQ_TX_DAREADY, + datype => DMA_REQ_TX_DATYPE, + drvalid => DMA_REQ_TX_DRVALID, + drready => DMA_REQ_TX_DRREADY, + drtype => DMA_REQ_TX_DRTYPE, + drlast => DMA_REQ_TX_DRLAST + ); + end generate; + + + pl330_dma_rx_gen: if C_DMA_TYPE = 1 and C_HAS_RX = 1 generate + rx_fifo_ack <= '1' when rd_addr = 10 and rd_ack = '1' else '0'; + + rx_fifo: entity pl330_dma_fifo + generic map( + RAM_ADDR_WIDTH => FIFO_AWIDTH, + FIFO_DWIDTH => 24, + FIFO_DIRECTION => 1 + ) + port map ( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + fifo_reset => rx_fifo_reset, + enable => rx_enable, + + in_ack => rx_ack, + in_stb => rx_stb, + in_data => rx_data, + + out_data => rx_sample, + out_ack => rx_fifo_ack, + out_stb => rx_out_stb, + + dclk => DMA_REQ_RX_ACLK, + dresetn => DMA_REQ_RX_RSTN, + davalid => DMA_REQ_RX_DAVALID, + daready => DMA_REQ_RX_DAREADY, + datype => DMA_REQ_RX_DATYPE, + drvalid => DMA_REQ_RX_DRVALID, + drready => DMA_REQ_RX_DRREADY, + drtype => DMA_REQ_RX_DRTYPE, + drlast => DMA_REQ_RX_DRLAST + ); + end generate; + + ctrl : entity i2s_controller + generic map ( + C_SLOT_WIDTH => C_SLOT_WIDTH, + C_BCLK_POL => C_BCLK_POL, + C_LRCLK_POL => C_LRCLK_POL, + C_NUM_CH => C_NUM_CH, + C_HAS_TX => C_HAS_TX, + C_HAS_RX => C_HAS_RX + ) + port map ( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + + data_clk => DATA_CLK_I, + BCLK_O => BCLK_O, + LRCLK_O => LRCLK_O, + SDATA_O => SDATA_O, + SDATA_I => SDATA_I, + + tx_enable => tx_enable, + tx_ack => tx_ack, + tx_stb => tx_stb, + tx_data => tx_data, + + rx_enable => rx_enable, + rx_ack => rx_ack, + rx_stb => rx_stb, + rx_data => rx_data, + + bclk_div_rate => bclk_div_rate, + lrclk_div_rate => lrclk_div_rate + ); + + + + tx_fifo_full <= not(tx_in_ack); + tx_fifo_empty <= not(tx_stb); + rx_fifo_full <= not(rx_ack); + rx_fifo_empty <= not(rx_out_stb); + i2s_reset <= I2S_RESET_REG(0); + tx_fifo_reset <= I2S_RESET_REG(1); + rx_fifo_reset <= I2S_RESET_REG(2); + tx_enable <= I2S_CONTROL_REG(0) = '1'; + rx_enable <= I2S_CONTROL_REG(1) = '1'; + MUTEN_O <= not(I2S_CONTROL_REG(2)); + bclk_div_rate <= to_integer(unsigned(I2S_CLK_CONTROL_REG(7 downto 0))); + lrclk_div_rate <= to_integer(unsigned(I2S_CLK_CONTROL_REG(23 downto 16))); + period_len <= to_integer(unsigned(PERIOD_LEN_REG(15 downto 0))); + + process(rd_addr) + begin + case rd_addr is + when 1 => rd_data <= I2S_CONTROL_REG and x"00000007"; + when 2 => rd_data <= I2S_CLK_CONTROL_REG and x"00ff00ff"; + when 6 => rd_data <= PERIOD_LEN_REG and x"0000ffff"; + when 8 => rd_data <= x"0000000" & rx_fifo_full & rx_fifo_empty & tx_fifo_full & tx_fifo_empty; + when 10 => rd_data <= rx_sample & std_logic_vector(to_unsigned(cnt, 8)); + when others => rd_data <= (others => '0'); + end case; + end process; + + process(s00_axi_aclk) is + begin + if rising_edge(s00_axi_aclk) then + if s00_axi_aresetn = '0' then + I2S_RESET_REG <= (others => '0'); + I2S_CONTROL_REG <= (others => '0'); + I2S_CLK_CONTROL_REG <= (others => '0'); + PERIOD_LEN_REG <= (others => '0'); + else + -- Auto-clear the Reset Register bits + I2S_RESET_REG(0) <= '0'; + I2S_RESET_REG(1) <= '0'; + I2S_RESET_REG(2) <= '0'; + if wr_stb = '1' then + case wr_addr is + when 0 => I2S_RESET_REG <= wr_data; + when 1 => I2S_CONTROL_REG <= wr_data; + when 2 => I2S_CLK_CONTROL_REG <= wr_data; + when 6 => PERIOD_LEN_REG <= wr_data; + when others => null; + end case; + end if; + end if; + end if; + end process; + -- User logic ends + +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd new file mode 100644 index 0000000..0218f34 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd @@ -0,0 +1,108 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; + +entity fifo_synchronizer is + generic ( + DEPTH : integer := 4; + WIDTH : integer := 2 + ); + port ( + resetn : in std_logic; + + in_clk : in std_logic; + in_data : in std_logic_vector(WIDTH - 1 downto 0); + in_tick : in std_logic; + + out_clk : in std_logic; + out_data : out std_logic_vector(WIDTH - 1 downto 0); + out_tick : out std_logic + ); + +end fifo_synchronizer; + +architecture impl of fifo_synchronizer is + type DATA_SYNC_FIFO_TYPE is array (0 to DEPTH - 1) of std_logic_vector(WIDTH - 1 downto 0); + signal fifo: DATA_SYNC_FIFO_TYPE; + + signal rd_addr : natural range 0 to DEPTH - 1; + signal wr_addr : natural range 0 to DEPTH - 1; + + signal tick : std_logic; + signal tick_d1 : std_logic; + signal tick_d2 : std_logic; +begin + + process (in_clk) + begin + if rising_edge(in_clk) then + if resetn = '0' then + wr_addr <= 0; + tick <= '0'; + else + if in_tick = '1' then + fifo(wr_addr) <= in_data; + wr_addr <= (wr_addr + 1) mod DEPTH; + tick <= not tick; + end if; + end if; + end if; + end process; + + process (out_clk) + begin + if rising_edge(out_clk) then + if resetn = '0' then + rd_addr <= 0; + tick_d1 <= '0'; + tick_d2 <= '0'; + else + tick_d1 <= tick; + tick_d2 <= tick_d1; + out_tick <= tick_d1 xor tick_d2; + if (tick_d1 xor tick_d2) = '1' then + rd_addr <= (rd_addr + 1) mod DEPTH; + out_data <= fifo(rd_addr); + end if; + end if; + end if; + end process; + +end; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd new file mode 100644 index 0000000..874099a --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd @@ -0,0 +1,133 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; + +entity i2s_clkgen is + port( + clk : in std_logic; -- System clock + resetn : in std_logic; -- System reset + + enable : in Boolean ; -- Enable clockgen + + tick : in std_logic; + + bclk_div_rate : in natural range 0 to 255; + lrclk_div_rate : in natural range 0 to 255; + + bclk : out std_logic; -- Bit Clock + lrclk : out std_logic; -- Frame Clock + channel_sync : out std_logic; + frame_sync : out std_logic + ); +end i2s_clkgen; + +architecture Behavioral of i2s_clkgen is + signal reset_int : Boolean; + + signal prev_bclk_div_rate : natural range 0 to 255; + signal prev_lrclk_div_rate : natural range 0 to 255; + + signal bclk_count : natural range 0 to 255; + signal lrclk_count : natural range 0 to 255; + + signal bclk_int : std_logic; + signal lrclk_int : std_logic; + + signal lrclk_tick : Boolean; +begin + + reset_int <= resetn = '0' or not enable; + + bclk <= bclk_int; + lrclk <= lrclk_int; + +----------------------------------------------------------------------------------- +-- Serial clock generation BCLK_O +----------------------------------------------------------------------------------- + bclk_gen: process(clk) + begin + if rising_edge(clk) then + prev_bclk_div_rate <= bclk_div_rate; + if reset_int then -- or (bclk_div_rate /= prev_bclk_div_rate) then + bclk_int <= '1'; + bclk_count <= bclk_div_rate; + else + if tick = '1' then + if bclk_count = bclk_div_rate then + bclk_count <= 0; + bclk_int <= not bclk_int; + else + bclk_count <= bclk_count + 1; + end if; + end if; + end if; + end if; + end process bclk_gen; + + lrclk_tick <= tick = '1' and bclk_count = bclk_div_rate and bclk_int = '1'; + + channel_sync <= '1' when lrclk_count = 1 else '0'; + frame_sync <= '1' when lrclk_count = 1 and lrclk_int = '0' else '0'; + +----------------------------------------------------------------------------------- +-- Frame clock generator LRCLK_O +----------------------------------------------------------------------------------- + lrclk_gen: process(clk) + begin + if rising_edge(clk) then + prev_lrclk_div_rate <= lrclk_div_rate; + -- Reset + if reset_int then -- or lrclk_div_rate /= prev_lrclk_div_rate then + lrclk_int <= '1'; + lrclk_count <= lrclk_div_rate; + else + if lrclk_tick then + if lrclk_count = lrclk_div_rate then + lrclk_count <= 0; + lrclk_int <= not lrclk_int; + else + lrclk_count <= lrclk_count + 1; + end if; + end if; + end if; + end if; + end process lrclk_gen; + +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_controller.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_controller.vhd new file mode 100644 index 0000000..59bde04 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_controller.vhd @@ -0,0 +1,282 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; + +library axi_i2s_adi_v1_00_a; +use axi_i2s_adi_v1_00_a.fifo_synchronizer; +use axi_i2s_adi_v1_00_a.i2s_clkgen; +use axi_i2s_adi_v1_00_a.i2s_tx; +use axi_i2s_adi_v1_00_a.i2s_rx; + +entity i2s_controller is + generic( + C_SLOT_WIDTH : integer := 24; -- Width of one Slot + C_BCLK_POL : integer := 0; -- BCLK Polarity (0 - Falling edge, 1 - Rising edge) + C_LRCLK_POL : integer := 0; -- LRCLK Polarity (0 - Falling edge, 1 - Rising edge) + C_NUM_CH : integer := 1; + C_HAS_TX : integer := 1; + C_HAS_RX : integer := 1 + ); + port( + clk : in std_logic; -- System clock + resetn : in std_logic; -- System reset + + data_clk : in std_logic; -- Data clock should be less than clk / 4 + BCLK_O : out std_logic_vector(C_NUM_CH - 1 downto 0); -- Bit Clock + LRCLK_O : out std_logic_vector(C_NUM_CH - 1 downto 0); -- Frame Clock + SDATA_O : out std_logic_vector(C_NUM_CH - 1 downto 0); -- Serial Data Output + SDATA_I : in std_logic_vector(C_NUM_CH - 1 downto 0); -- Serial Data Input + + tx_enable : in Boolean; -- Enable TX + tx_ack : out std_logic; -- Request new Slot Data + tx_stb : in std_logic; -- Request new Slot Data + tx_data : in std_logic_vector(C_SLOT_WIDTH-1 downto 0); -- Slot Data in + + rx_enable : in Boolean; -- Enable RX + rx_ack : in std_logic; + rx_stb : out std_logic; -- Valid Slot Data + rx_data : out std_logic_vector(C_SLOT_WIDTH-1 downto 0); -- Slot Data out + + -- Runtime parameter + bclk_div_rate : in natural range 0 to 255; + lrclk_div_rate : in natural range 0 to 255 + ); +end i2s_controller; + +architecture Behavioral of i2s_controller is +constant NUM_TX : integer := C_HAS_TX * C_NUM_CH; +constant NUM_RX : integer := C_HAS_RX * C_NUM_CH; + +signal enable : Boolean; + +signal tick : std_logic; +signal tick_d1 : std_logic; +signal tick_d2 : std_logic; + +signal BCLK_O_int : std_logic; +signal LRCLK_O_int : std_logic; + +signal tx_bclk : std_logic; +signal tx_lrclk : std_logic; +signal tx_sdata : std_logic_vector(C_NUM_CH - 1 downto 0); +signal tx_tick : std_logic; +signal tx_channel_sync : std_logic; +signal tx_frame_sync : std_logic; + +signal bclk_tick : std_logic; + +signal rx_bclk : std_logic; +signal rx_lrclk : std_logic; +signal rx_sdata : std_logic_vector(NUM_RX - 1 downto 0); +signal rx_channel_sync : std_logic; +signal rx_frame_sync : std_logic; + +signal tx_sync_fifo_out : std_logic_vector(3 + NUM_TX downto 0); +signal tx_sync_fifo_in : std_logic_vector(3 + NUM_TX downto 0); +signal rx_sync_fifo_out : std_logic_vector(3 + NUM_RX downto 0); +signal rx_sync_fifo_in : std_logic_vector(3 + NUM_RX downto 0); + +begin + enable <= rx_enable or tx_enable; + + -- Generate tick signal in the DATA_CLK_I domain + process (data_clk) + begin + if rising_edge(data_clk) then + if resetn = '0' then + tick <= '0'; + else + tick <= not tick; + end if; + end if; + end process; + + process (clk) + begin + if rising_edge(clk) then + if resetn = '0' then + tick_d1 <= '0'; + tick_d2 <= '0'; + else + tick_d1 <= tick; + tick_d2 <= tick_d1; + end if; + end if; + end process; + + tx_tick <= tick_d2 xor tick_d1; + + tx_sync_fifo_in(0) <= tx_channel_sync; + tx_sync_fifo_in(1) <= tx_frame_sync; + tx_sync_fifo_in(2) <= tx_bclk; + tx_sync_fifo_in(3) <= tx_lrclk; + tx_sync_fifo_in(3 + NUM_TX downto 4) <= tx_sdata; + + process (data_clk) + begin + if rising_edge(data_clk) then + if resetn = '0' then + BCLK_O <= (others => '1'); + LRCLK_O <= (others => '1'); + SDATA_O <= (others => '0'); + else + if C_BCLK_POL = 0 then + BCLK_O <= (others => tx_sync_fifo_out(2)); + else + BCLK_O <= (others => not tx_sync_fifo_out(2)); + end if; + + if C_LRCLK_POL = 0 then + LRCLK_O <= (others => tx_sync_fifo_out(3)); + else + LRCLK_O <= (others => not tx_sync_fifo_out(3)); + end if; + + if C_HAS_TX = 1 then + SDATA_O <= tx_sync_fifo_out(3 + NUM_TX downto 4); + end if; + + if C_HAS_RX = 1 then + rx_sync_fifo_in(3 downto 0) <= tx_sync_fifo_out(3 downto 0); + rx_sync_fifo_in(3 + NUM_RX downto 4) <= SDATA_I; + end if; + end if; + end if; + end process; + + tx_sync: entity fifo_synchronizer + generic map ( + DEPTH => 4, + WIDTH => NUM_TX + 4 + ) + port map ( + resetn => resetn, + in_clk => clk, + in_data => tx_sync_fifo_in, + in_tick => tx_tick, + + out_clk => data_clk, + out_data => tx_sync_fifo_out + ); + + clkgen: entity i2s_clkgen + port map( + clk => clk, + resetn => resetn, + enable => enable, + tick => tx_tick, + + bclk_div_rate => bclk_div_rate, + lrclk_div_rate => lrclk_div_rate, + + channel_sync => tx_channel_sync, + frame_sync => tx_frame_sync, + + bclk => tx_bclk, + lrclk => tx_lrclk + ); + + tx_gen: if C_HAS_TX = 1 generate + tx: entity i2s_tx + generic map ( + C_SLOT_WIDTH => C_SLOT_WIDTH, + C_NUM => NUM_TX + ) + port map ( + clk => clk, + resetn => resetn, + enable => tx_enable, + + channel_sync => tx_channel_sync, + frame_sync => tx_frame_sync, + bclk => tx_bclk, + sdata => tx_sdata, + + ack => tx_ack, + stb => tx_stb, + data => tx_data + ); + end generate; + + rx_gen: if C_HAS_RX = 1 generate + rx: entity i2s_rx + generic map ( + C_SLOT_WIDTH => C_SLOT_WIDTH, + C_NUM => NUM_RX + ) + port map ( + clk => clk, + resetn => resetn, + enable => rx_enable, + + channel_sync => rx_channel_sync, + frame_sync => rx_frame_sync, + bclk => rx_bclk, + sdata => rx_sdata, + + ack => rx_ack, + stb => rx_stb, + data => rx_data + ); + + rx_channel_sync <= rx_sync_fifo_out(0); + rx_frame_sync <= rx_sync_fifo_out(1); + rx_bclk <= rx_sync_fifo_out(2); + rx_lrclk <= rx_sync_fifo_out(3); + rx_sdata <= rx_sync_fifo_out(3 + NUM_RX downto 4); + + rx_sync: entity fifo_synchronizer + generic map ( + DEPTH => 4, + WIDTH => NUM_RX + 4 + ) + port map ( + resetn => resetn, + in_clk => data_clk, + in_data => rx_sync_fifo_in, + in_tick => '1', + + out_clk => clk, + out_data => rx_sync_fifo_out + ); + + end generate; + +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd new file mode 100644 index 0000000..aa4e584 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd @@ -0,0 +1,180 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity i2s_rx is + generic( + C_SLOT_WIDTH : integer := 24; -- Width of one Slot + C_NUM : integer := 1 + ); + port( + clk : in std_logic; -- System clock + resetn : in std_logic; -- System reset + enable : in Boolean; -- Enable RX + + bclk : in std_logic; -- Bit Clock + channel_sync : in std_logic; -- Channel Sync + frame_sync : in std_logic; -- Frame Sync + sdata : in std_logic_vector(C_NUM - 1 downto 0); -- Serial Data Output + + stb : out std_logic; -- Data available + ack : in std_logic; -- Data has been consumed + data : out std_logic_vector(C_SLOT_WIDTH-1 downto 0) -- Slot Data in + ); +end i2s_rx; + +architecture Behavioral of i2s_rx is + type mem is array (0 to C_NUM - 1) of std_logic_vector(31 downto 0); + type mem_latched is array (0 to C_NUM - 1) of std_logic_vector(C_SLOT_WIDTH - 1 downto 0); + signal data_int : mem; + signal data_latched : mem_latched; + signal reset_int : Boolean; + signal enable_int : Boolean; + + signal bit_sync : std_logic; + signal channel_sync_int : std_logic; + signal frame_sync_int : std_logic; + + signal bclk_d1 : std_logic; + + type sequencer_state_type is (IDLE, ACTIVE); + signal sequencer_state : sequencer_state_type; + signal seq : natural range 0 to C_NUM - 1; + + signal ovf_frame_cnt : natural range 0 to 1; +begin + + reset_int <= (resetn = '0') or not enable; + + process (clk) + begin + if rising_edge(clk) then + if resetn = '0' then + bclk_d1 <= '0'; + else + bclk_d1 <= bclk; + end if; + end if; + end process; + + bit_sync <= (bclk xor bclk_d1) and bclk; + channel_sync_int <= channel_sync and bit_sync; + frame_sync_int <= frame_sync and bit_sync; + + stb <= '1' when sequencer_state = ACTIVE else '0'; + + sequencer: process (clk) + begin + if rising_edge(clk) then + if reset_int or not enable_int then + sequencer_state <= IDLE; + ovf_frame_cnt <= 0; + seq <= 0; + else + case sequencer_state is + when IDLE => + if channel_sync_int = '1' then + if ovf_frame_cnt = 0 then + sequencer_state <= ACTIVE; + else + ovf_frame_cnt <= (ovf_frame_cnt + 1) mod 2; + end if; + end if; + when ACTIVE => + -- The unlikely event the last ack came in in the same clock + -- cyclce as the channel sync signal will still be treated + -- as an overflow. This keeps the logic simple + if ack = '1' then + if seq = C_NUM - 1 then + sequencer_state <= IDLE; + seq <= 0; + else + seq <= seq + 1; + end if; + end if; + if channel_sync_int = '1' then + ovf_frame_cnt <= (ovf_frame_cnt + 1) mod 2; + end if; + end case; + end if; + end if; + end process; + + data <= data_latched(seq); + + gen: for i in 0 to C_NUM - 1 generate + + unserialize_data: process(clk) + begin + if rising_edge(clk) then + if reset_int then + data_int(i) <= (others => '0'); + elsif bit_sync = '1' then + if channel_sync = '1' then + if sequencer_state = IDLE then + data_latched(i) <= data_int(i)(31 downto 32 - C_SLOT_WIDTH); +-- data_latched(i) <= data_int(i)(31 downto 32 - +-- C_SLOT_WIDTH + 8) & +-- std_logic_vector(to_unsigned(i+1,8)); + end if; + end if; + data_int(i) <= data_int(i)(30 downto 0) & sdata(i); + end if; + end if; + end process unserialize_data; + end generate; + + enable_sync: process (clk) + begin + if rising_edge(clk) then + if reset_int then + enable_int <= False; + else + if enable and frame_sync_int = '1' then + enable_int <= True; + elsif not enable then + enable_int <= False; + end if; + end if; + end if; + end process enable_sync; + +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd new file mode 100644 index 0000000..a055d15 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd @@ -0,0 +1,134 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; + +entity i2s_tx is + generic( + C_SLOT_WIDTH : integer := 24; -- Width of one Slot + C_NUM : integer := 1 + ); + port( + clk : in std_logic; -- System clock + resetn : in std_logic; -- System reset + enable : in Boolean; -- Enable TX + + bclk : in std_logic; -- Bit Clock + channel_sync : in std_logic; -- Channel Sync + frame_sync : in std_logic; -- Frame Sync + sdata : out std_logic_vector(C_NUM - 1 downto 0); -- Serial Data Output + + ack : out std_logic; -- Request new Slot Data + stb : in std_logic; -- Request new Slot Data + data : in std_logic_vector(C_SLOT_WIDTH-1 downto 0) -- Slot Data in + ); +end i2s_tx; + +architecture Behavioral of i2s_tx is + type mem is array (0 to C_NUM - 1) of std_logic_vector(31 downto 0); + signal data_int : mem; + signal reset_int : Boolean; + signal enable_int : Boolean; + + signal bit_sync : std_logic; + signal channel_sync_int : std_logic; + signal frame_sync_int : std_logic; + signal channel_sync_int_d1 : std_logic; + + signal bclk_d1 : std_logic; +begin + + reset_int <= resetn = '0' or not enable; + + process (clk) + begin + if rising_edge(clk) then + if resetn = '0' then + bclk_d1 <= '0'; + channel_sync_int_d1 <= '0'; + else + bclk_d1 <= bclk; + channel_sync_int_d1 <= channel_sync_int; + end if; + end if; + end process; + + bit_sync <= (bclk xor bclk_d1) and not bclk; + channel_sync_int <= channel_sync and bit_sync; + frame_sync_int <= frame_sync and bit_sync; + + ack <= '1' when channel_sync_int_d1 = '1' and enable_int else '0'; + + gen: for i in 0 to C_NUM - 1 generate + + serialize_data: process(clk) + begin + if rising_edge(clk) then + if reset_int then + data_int(i)(31 downto 0) <= (others => '0'); + elsif bit_sync = '1' then + if channel_sync_int = '1' then + data_int(i)(31 downto 32-C_SLOT_WIDTH) <= data; + data_int(i)(31-C_SLOT_WIDTH downto 0) <= (others => '0'); + else + data_int(i) <= data_int(i)(30 downto 0) & '0'; + end if; + end if; + end if; + end process serialize_data; + sdata(i) <= data_int(i)(31) when enable_int else '0'; + + end generate; + + enable_sync: process (clk) + begin + if rising_edge(clk) then + if reset_int then + enable_int <= False; + else + if enable and frame_sync_int = '1' and stb = '1' then + enable_int <= True; + elsif not enable then + enable_int <= False; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl new file mode 100644 index 0000000..df0c86f --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl @@ -0,0 +1,105 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_S00_AXI_BASEADDR" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_S00_AXI_HIGHADDR" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_LRCLK_POL" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_BCLK_POL" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_DMA_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_HAS_TX" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_HAS_RX" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_BCLK_POL { PARAM_VALUE.C_BCLK_POL } { + # Procedure called to update C_BCLK_POL when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_BCLK_POL { PARAM_VALUE.C_BCLK_POL } { + # Procedure called to validate C_BCLK_POL + return true +} + +proc update_PARAM_VALUE.C_DMA_TYPE { PARAM_VALUE.C_DMA_TYPE } { + # Procedure called to update C_DMA_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_DMA_TYPE { PARAM_VALUE.C_DMA_TYPE } { + # Procedure called to validate C_DMA_TYPE + return true +} + +proc update_PARAM_VALUE.C_HAS_RX { PARAM_VALUE.C_HAS_RX } { + # Procedure called to update C_HAS_RX when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_HAS_RX { PARAM_VALUE.C_HAS_RX } { + # Procedure called to validate C_HAS_RX + return true +} + +proc update_PARAM_VALUE.C_HAS_TX { PARAM_VALUE.C_HAS_TX } { + # Procedure called to update C_HAS_TX when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_HAS_TX { PARAM_VALUE.C_HAS_TX } { + # Procedure called to validate C_HAS_TX + return true +} + +proc update_PARAM_VALUE.C_LRCLK_POL { PARAM_VALUE.C_LRCLK_POL } { + # Procedure called to update C_LRCLK_POL when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_LRCLK_POL { PARAM_VALUE.C_LRCLK_POL } { + # Procedure called to validate C_LRCLK_POL + return true +} + +proc update_PARAM_VALUE.C_S00_AXI_BASEADDR { PARAM_VALUE.C_S00_AXI_BASEADDR } { + # Procedure called to update C_S00_AXI_BASEADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S00_AXI_BASEADDR { PARAM_VALUE.C_S00_AXI_BASEADDR } { + # Procedure called to validate C_S00_AXI_BASEADDR + return true +} + +proc update_PARAM_VALUE.C_S00_AXI_HIGHADDR { PARAM_VALUE.C_S00_AXI_HIGHADDR } { + # Procedure called to update C_S00_AXI_HIGHADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S00_AXI_HIGHADDR { PARAM_VALUE.C_S00_AXI_HIGHADDR } { + # Procedure called to validate C_S00_AXI_HIGHADDR + return true +} + + +proc update_MODELPARAM_VALUE.C_LRCLK_POL { MODELPARAM_VALUE.C_LRCLK_POL PARAM_VALUE.C_LRCLK_POL } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_LRCLK_POL}] ${MODELPARAM_VALUE.C_LRCLK_POL} +} + +proc update_MODELPARAM_VALUE.C_BCLK_POL { MODELPARAM_VALUE.C_BCLK_POL PARAM_VALUE.C_BCLK_POL } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_BCLK_POL}] ${MODELPARAM_VALUE.C_BCLK_POL} +} + +proc update_MODELPARAM_VALUE.C_DMA_TYPE { MODELPARAM_VALUE.C_DMA_TYPE PARAM_VALUE.C_DMA_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_DMA_TYPE}] ${MODELPARAM_VALUE.C_DMA_TYPE} +} + +proc update_MODELPARAM_VALUE.C_HAS_TX { MODELPARAM_VALUE.C_HAS_TX PARAM_VALUE.C_HAS_TX } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_HAS_TX}] ${MODELPARAM_VALUE.C_HAS_TX} +} + +proc update_MODELPARAM_VALUE.C_HAS_RX { MODELPARAM_VALUE.C_HAS_RX PARAM_VALUE.C_HAS_RX } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_HAS_RX}] ${MODELPARAM_VALUE.C_HAS_RX} +} + diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/bd/bd.tcl b/zynqberrydemo1/ip_lib/axi_reg32_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/component.xml b/zynqberrydemo1/ip_lib/axi_reg32_1.0/component.xml new file mode 100644 index 0000000..f1f9721 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/component.xml @@ -0,0 +1,2288 @@ + + + trenz.biz + user + axi_reg32 + 1.0 + + + S_AXI + + + + + + + + + AWADDR + + + s_axi_awaddr + + + + + AWPROT + + + s_axi_awprot + + + + + AWVALID + + + s_axi_awvalid + + + + + AWREADY + + + s_axi_awready + + + + + WDATA + + + s_axi_wdata + + + + + WSTRB + + + s_axi_wstrb + + + + + WVALID + + + s_axi_wvalid + + + + + WREADY + + + s_axi_wready + + + + + BRESP + + + s_axi_bresp + + + + + BVALID + + + s_axi_bvalid + + + + + BREADY + + + s_axi_bready + + + + + ARADDR + + + s_axi_araddr + + + + + ARPROT + + + s_axi_arprot + + + + + ARVALID + + + s_axi_arvalid + + + + + ARREADY + + + s_axi_arready + + + + + RDATA + + + s_axi_rdata + + + + + RRESP + + + s_axi_rresp + + + + + RVALID + + + s_axi_rvalid + + + + + RREADY + + + s_axi_rready + + + + + + WIZ.DATA_WIDTH + 32 + + + WIZ.NUM_REG + 32 + + + SUPPORTS_NARROW_BURST + 0 + + + + + S_AXI_RST + + + + + + + RST + + + s_axi_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + S_AXI_CLK + + + + + + + CLK + + + s_axi_aclk + + + + + + ASSOCIATED_BUSIF + S_AXI + + + ASSOCIATED_RESET + s_axi_aresetn + + + + + + + S_AXI + + S_AXI_reg + 0 + 4096 + 32 + register + + + OFFSET_BASE_PARAM + C_S_AXI_BASEADDR + + + OFFSET_HIGH_PARAM + C_S_AXI_HIGHADDR + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axi_reg32_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + e1c055d0 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axi_reg32_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + e1c055d0 + + + + + xilinx_softwaredriver + Software Driver + :vivado.xilinx.com:sw.driver + + xilinx_softwaredriver_view_fileset + + + + viewChecksum + 61d40803 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + c9c5ebb6 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + xilinx_utilityxitfiles + Utility XIT/TTCL + :vivado.xilinx.com:xit.util + + xilinx_utilityxitfiles_view_fileset + + + + viewChecksum + a8354ffc + + + + + + + RR0 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + true + + + + + + RR1 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + true + + + + + + RR2 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR3 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR4 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR5 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR6 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR7 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR8 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR9 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR10 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR11 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR12 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR13 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR14 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR15 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + WR0 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + true + + + + + + WR1 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + true + + + + + + WR2 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR3 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR4 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR5 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR6 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR7 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR8 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR9 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR10 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR11 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR12 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR13 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR14 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR15 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + s_axi_awaddr + + in + + 6 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_awprot + + in + + 2 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_awvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_awready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_wdata + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_wstrb + + in + + 3 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_wvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_wready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_bresp + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_bvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_bready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_araddr + + in + + 6 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_arprot + + in + + 2 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_arvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_arready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_rdata + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_rresp + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_rvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_rready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_aclk + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_aresetn + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + + C_S_AXI_DATA_WIDTH + C S AXI DATA WIDTH + Width of S_AXI data bus + 32 + + + C_S_AXI_ADDR_WIDTH + C S AXI ADDR WIDTH + Width of S_AXI address bus + 7 + + + C_REG_WIDTH + C Reg Width + 32 + + + + false + + + + + + C_NUM_RO_REG + C Num Ro Reg + 2 + + + C_NUM_WR_REG + C Num Wr Reg + 2 + + + C_WR_READABLE + C Wr Readable + true + + + C_RR0_ALIAS + C Rr0 Alias + RR0 + + + C_RR1_ALIAS + C Rr1 Alias + RR1 + + + C_WR0_ALIAS + C Wr0 Alias + WR0 + + + C_WR1_ALIAS + C Wr1 Alias + WR1 + + + C_RR2_ALIAS + C Rr2 Alias + RR2 + + + C_RR3_ALIAS + C Rr3 Alias + RR3 + + + C_RR4_ALIAS + C Rr4 Alias + RR4 + + + C_RR5_ALIAS + C Rr5 Alias + RR5 + + + C_RR6_ALIAS + C Rr6 Alias + RR6 + + + C_RR7_ALIAS + C Rr7 Alias + RR7 + + + C_RR8_ALIAS + C Rr8 Alias + RR8 + + + C_RR9_ALIAS + C Rr9 Alias + RR9 + + + C_RR10_ALIAS + C Rr10 Alias + RR10 + + + C_RR11_ALIAS + C Rr11 Alias + RR11 + + + C_RR12_ALIAS + C Rr12 Alias + RR12 + + + C_RR13_ALIAS + C Rr13 Alias + RR13 + + + C_RR14_ALIAS + C Rr14 Alias + RR14 + + + C_RR15_ALIAS + C Rr15 Alias + RR15 + + + C_WR2_ALIAS + C Wr2 Alias + WR2 + + + C_WR3_ALIAS + C Wr3 Alias + WR3 + + + C_WR4_ALIAS + C Wr4 Alias + WR4 + + + C_WR5_ALIAS + C Wr5 Alias + WR5 + + + C_WR6_ALIAS + C Wr6 Alias + WR6 + + + C_WR7_ALIAS + C Wr7 Alias + WR7 + + + C_WR8_ALIAS + C Wr8 Alias + WR8 + + + C_WR9_ALIAS + C Wr9 Alias + WR9 + + + C_WR10_ALIAS + C Wr10 Alias + WR10 + + + C_WR11_ALIAS + C Wr11 Alias + WR11 + + + C_WR12_ALIAS + C Wr12 Alias + WR12 + + + C_WR13_ALIAS + C Wr13 Alias + WR13 + + + C_WR14_ALIAS + C Wr14 Alias + WR14 + + + C_WR15_ALIAS + C Wr15 Alias + WR15 + + + C_WR0_DEFAULT + C Wr0 Default + 0 + + + C_WR1_DEFAULT + C Wr1 Default + 0 + + + C_WR2_DEFAULT + C Wr2 Default + 0 + + + C_WR3_DEFAULT + C Wr3 Default + 0 + + + C_WR4_DEFAULT + C Wr4 Default + 0 + + + C_WR5_DEFAULT + C Wr5 Default + 0 + + + C_WR6_DEFAULT + C Wr6 Default + 0 + + + C_WR7_DEFAULT + C Wr7 Default + 0 + + + C_WR8_DEFAULT + C Wr8 Default + 0 + + + C_WR9_DEFAULT + C Wr9 Default + 0 + + + C_WR10_DEFAULT + C Wr10 Default + 0 + + + C_WR11_DEFAULT + C Wr11 Default + 0 + + + C_WR12_DEFAULT + C Wr12 Default + 0 + + + C_WR13_DEFAULT + C Wr13 Default + 0 + + + C_WR14_DEFAULT + C Wr14 Default + 0 + + + C_WR15_DEFAULT + C Wr15 Default + 0 + + + + + + choices_0 + 32 + + + choices_1 + 1 + 0 + + + choices_2 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + + + choices_3 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axi_reg32_v1_0_S_AXI.vhd + vhdlSource + axi_lib + + + hdl/axi_reg32_v1_0.vhd + vhdlSource + CHECKSUM_99fe5a45 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axi_reg32_v1_0_S_AXI.vhd + vhdlSource + axi_lib + + + hdl/axi_reg32_v1_0.vhd + vhdlSource + + + + xilinx_softwaredriver_view_fileset + + drivers/axi_reg32_v1_0/data/axi_reg32.mdd + mdd + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/data/axi_reg32.tcl + tclSource + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/src/Makefile + unknown + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/src/axi_reg32.h + cSource + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/src/axi_reg32.c + cSource + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c + cSource + USED_IN_hw_handoff + + + + xilinx_xpgui_view_fileset + + xgui/axi_reg32_v1_0.tcl + tclSource + XGUI_VERSION_2 + CHECKSUM_11b62932 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + xilinx_utilityxitfiles_view_fileset + + gui/axi_reg32_v1_0.gtcl + GTCL + + + + AXI Register Bank 16/16 v1.0 + + + C_S_AXI_DATA_WIDTH + C S AXI DATA WIDTH + Width of S_AXI data bus + 32 + + + + false + + + + + + C_S_AXI_ADDR_WIDTH + C S AXI ADDR WIDTH + Width of S_AXI address bus + 7 + + + + false + + + + + + C_S_AXI_BASEADDR + C S AXI BASEADDR + 0xFFFFFFFF + + + + false + + + + + + C_S_AXI_HIGHADDR + C S AXI HIGHADDR + 0x00000000 + + + + false + + + + + + Component_Name + axi_reg32_v1_0 + + + C_NUM_RO_REG + Number of input registers + 2 + + + C_NUM_WR_REG + Number of output registers + 2 + + + C_WR_READABLE + Output registers are readable + true + + + C_RR0_ALIAS + RR0 + RR0 + + + + true + + + + + + C_RR1_ALIAS + RR1 + RR1 + + + + true + + + + + + C_WR0_ALIAS + WR0 + WR0 + + + C_WR1_ALIAS + WR1 + WR1 + + + C_RR2_ALIAS + RR2 + RR2 + + + C_RR3_ALIAS + RR3 + RR3 + + + C_RR4_ALIAS + RR4 + RR4 + + + C_RR5_ALIAS + RR5 + RR5 + + + C_RR6_ALIAS + RR6 + RR6 + + + C_RR7_ALIAS + RR7 + RR7 + + + C_RR8_ALIAS + RR8 + RR8 + + + C_RR9_ALIAS + RR9 + RR9 + + + C_RR10_ALIAS + RR10 + RR10 + + + C_RR11_ALIAS + RR11 + RR11 + + + C_RR12_ALIAS + RR12 + RR12 + + + C_RR13_ALIAS + RR13 + RR13 + + + C_RR14_ALIAS + RR14 + RR14 + + + C_RR15_ALIAS + RR15 + RR15 + + + C_WR2_ALIAS + WR2 + WR2 + + + C_WR3_ALIAS + WR3 + WR3 + + + C_WR4_ALIAS + WR4 + WR4 + + + C_WR5_ALIAS + WR5 + WR5 + + + C_WR6_ALIAS + WR6 + WR6 + + + C_WR7_ALIAS + WR7 + WR7 + + + C_WR8_ALIAS + WR8 + WR8 + + + C_WR9_ALIAS + WR9 + WR9 + + + C_WR10_ALIAS + WR10 + WR10 + + + C_WR11_ALIAS + WR11 + WR11 + + + C_WR12_ALIAS + WR12 + WR12 + + + C_WR13_ALIAS + WR13 + WR13 + + + C_WR14_ALIAS + WR14 + WR14 + + + C_WR15_ALIAS + WR15 + WR15 + + + C_WR0_DEFAULT + WR0 Value + 0 + + + C_WR1_DEFAULT + WR1 Value + 0 + + + C_WR2_DEFAULT + WR2 Value + 0 + + + C_WR3_DEFAULT + WR3 Value + 0 + + + C_WR4_DEFAULT + WR4 Value + 0 + + + C_WR5_DEFAULT + WR5 Value + 0 + + + C_WR6_DEFAULT + WR6 Value + 0 + + + C_WR7_DEFAULT + WR7 Value + 0 + + + C_WR8_DEFAULT + WR8 Value + 0 + + + C_WR9_DEFAULT + WR9 Value + 0 + + + C_WR10_DEFAULT + WR10 Value + 0 + + + C_WR11_DEFAULT + WR11 Value + 0 + + + C_WR12_DEFAULT + WR12 Value + 0 + + + C_WR13_DEFAULT + WR13 Value + 0 + + + C_WR14_DEFAULT + WR14 Value + 0 + + + C_WR15_DEFAULT + WR15 Value + 0 + + + + + + virtex7 + qvirtex7 + kintex7 + kintex7l + qkintex7 + qkintex7l + artix7 + artix7l + aartix7 + qartix7 + zynq + qzynq + azynq + virtexu + kintexu + + + AXI_Peripheral + + AXI Register Bank 16/16 v1.0 + Trenz Electronic GmbH + 13 + 2015-12-03T08:47:21Z + + b:/cores/2014.4/ip/axi_reg32_1.0 + + + + 2014.4 + + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/data/axi_reg32.tcl b/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/data/axi_reg32.tcl new file mode 100644 index 0000000..9044b7c --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/data/axi_reg32.tcl @@ -0,0 +1,5 @@ + + +proc generate {drv_handle} { + xdefine_include_file $drv_handle "xparameters.h" "axi_reg32" "NUM_INSTANCES" "DEVICE_ID" "C_S_AXI_BASEADDR" "C_S_AXI_HIGHADDR" +} diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.c b/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.c new file mode 100644 index 0000000..1db5c5c --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.c @@ -0,0 +1,6 @@ + + +/***************************** Include Files *******************************/ +#include "axi_reg32.h" + +/************************** Function Definitions ***************************/ diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.h b/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.h new file mode 100644 index 0000000..58bb7b4 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.h @@ -0,0 +1,107 @@ + +#ifndef AXI_REG32_H +#define AXI_REG32_H + + +/****************** Include Files ********************/ +#include "xil_types.h" +#include "xstatus.h" + +#define RR0_OFFSET 0 +#define RR1_OFFSET 4 +#define RR2_OFFSET 8 +#define RR3_OFFSET 12 +#define RR4_OFFSET 16 +#define RR5_OFFSET 20 +#define RR6_OFFSET 24 +#define RR7_OFFSET 28 +#define RR8_OFFSET 32 +#define RR9_OFFSET 36 +#define RR10_OFFSET 40 +#define RR11_OFFSET 44 +#define RR12_OFFSET 48 +#define RR13_OFFSET 52 +#define RR14_OFFSET 56 +#define RR15_OFFSET 60 +#define WR0_OFFSET 64 +#define WR1_OFFSET 68 +#define WR2_OFFSET 72 +#define WR3_OFFSET 76 +#define WR4_OFFSET 80 +#define WR5_OFFSET 84 +#define WR6_OFFSET 88 +#define WR7_OFFSET 92 +#define WR8_OFFSET 96 +#define WR9_OFFSET 100 +#define WR10_OFFSET 104 +#define WR11_OFFSET 108 +#define WR12_OFFSET 112 +#define WR13_OFFSET 116 +#define WR14_OFFSET 120 +#define WR15_OFFSET 124 + + +/**************************** Type Definitions *****************************/ +/** + * + * Write a value to a AXI_REG32 register. A 32 bit write is performed. + * If the component is implemented in a smaller width, only the least + * significant data is written. + * + * @param BaseAddress is the base address of the AXI_REG32device. + * @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 AXI_REG32_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data) + * + */ +#define AXI_REG32_mWriteReg(BaseAddress, RegOffset, Data) \ + Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data)) + +/** + * + * Read a value from a AXI_REG32 register. A 32 bit read is performed. + * If the component 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 AXI_REG32 device. + * @param RegOffset is the register offset from the base to write to. + * + * @return Data is the data from the register. + * + * @note + * C-style signature: + * u32 AXI_REG32_mReadReg(u32 BaseAddress, unsigned RegOffset) + * + */ +#define AXI_REG32_mReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/************************** Function Prototypes ****************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_REG32 instance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_REG32_Reg_SelfTest(void * baseaddr_p); + +#endif // AXI_REG32_H diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c b/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c new file mode 100644 index 0000000..dc45655 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c @@ -0,0 +1,60 @@ + +/***************************** Include Files *******************************/ +#include "axi_reg32.h" +#include "xparameters.h" +#include "stdio.h" +#include "xil_io.h" + +/************************** Constant Definitions ***************************/ +#define READ_WRITE_MUL_FACTOR 0x10 + +/************************** Function Definitions ***************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_REG32instance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_REG32_Reg_SelfTest(void * baseaddr_p) +{ + u32 baseaddr; + int write_loop_index; + int read_loop_index; + int Index; + + baseaddr = (u32) baseaddr_p; + + xil_printf("******************************\n\r"); + xil_printf("* User Peripheral Self Test\n\r"); + xil_printf("******************************\n\n\r"); + + /* + * Write to user logic slave module register(s) and read back + */ + xil_printf("User logic slave module test...\n\r"); + + for (write_loop_index = 0 ; write_loop_index < 4; write_loop_index++) + AXI_REG32_mWriteReg (baseaddr, write_loop_index*4, (write_loop_index+1)*READ_WRITE_MUL_FACTOR); + for (read_loop_index = 0 ; read_loop_index < 4; read_loop_index++) + if ( AXI_REG32_mReadReg (baseaddr, read_loop_index*4) != (read_loop_index+1)*READ_WRITE_MUL_FACTOR){ + xil_printf ("Error reading register value at address %x\n", (int)baseaddr + read_loop_index*4); + return XST_FAILURE; + } + + xil_printf(" - slave register write/read passed\n\n\r"); + + return XST_SUCCESS; +} diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/bfm_design/axi_reg32_v1_0_tb.v b/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/bfm_design/axi_reg32_v1_0_tb.v new file mode 100644 index 0000000..a2b9560 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/bfm_design/axi_reg32_v1_0_tb.v @@ -0,0 +1,184 @@ + +`timescale 1 ns / 1 ps + +`include "axi_reg32_v1_0_tb_include.vh" + +// lite_response Type Defines +`define RESPONSE_OKAY 2'b00 +`define RESPONSE_EXOKAY 2'b01 +`define RESP_BUS_WIDTH 2 +`define BURST_TYPE_INCR 2'b01 +`define BURST_TYPE_WRAP 2'b10 + +// AMBA AXI4 Lite Range Constants +`define S_AXI_MAX_BURST_LENGTH 1 +`define S_AXI_DATA_BUS_WIDTH 32 +`define S_AXI_ADDRESS_BUS_WIDTH 32 +`define S_AXI_MAX_DATA_SIZE (`S_AXI_DATA_BUS_WIDTH*`S_AXI_MAX_BURST_LENGTH)/8 + +module axi_reg32_v1_0_tb; + reg tb_ACLK; + reg tb_ARESETn; + + // Create an instance of the example tb + `BD_WRAPPER dut (.ACLK(tb_ACLK), + .ARESETN(tb_ARESETn)); + + // Local Variables + + // AMBA S_AXI AXI4 Lite Local Reg + reg [`S_AXI_DATA_BUS_WIDTH-1:0] S_AXI_rd_data_lite; + reg [`S_AXI_DATA_BUS_WIDTH-1:0] S_AXI_test_data_lite [3:0]; + reg [`RESP_BUS_WIDTH-1:0] S_AXI_lite_response; + reg [`S_AXI_ADDRESS_BUS_WIDTH-1:0] S_AXI_mtestAddress; + reg [3-1:0] S_AXI_mtestProtection_lite; + integer S_AXI_mtestvectorlite; // Master side testvector + integer S_AXI_mtestdatasizelite; + integer result_slave_lite; + + + // Simple Reset Generator and test + initial begin + tb_ARESETn = 1'b0; + #500; + // Release the reset on the posedge of the clk. + @(posedge tb_ACLK); + tb_ARESETn = 1'b1; + @(posedge tb_ACLK); + end + + // Simple Clock Generator + initial tb_ACLK = 1'b0; + always #10 tb_ACLK = !tb_ACLK; + + //------------------------------------------------------------------------ + // TEST LEVEL API: CHECK_RESPONSE_OKAY + //------------------------------------------------------------------------ + // Description: + // CHECK_RESPONSE_OKAY(lite_response) + // This task checks if the return lite_response is equal to OKAY + //------------------------------------------------------------------------ + task automatic CHECK_RESPONSE_OKAY; + input [`RESP_BUS_WIDTH-1:0] response; + begin + if (response !== `RESPONSE_OKAY) begin + $display("TESTBENCH ERROR! lite_response is not OKAY", + "\n expected = 0x%h",`RESPONSE_OKAY, + "\n actual = 0x%h",response); + $stop; + end + end + endtask + + //------------------------------------------------------------------------ + // TEST LEVEL API: COMPARE_LITE_DATA + //------------------------------------------------------------------------ + // Description: + // COMPARE_LITE_DATA(expected,actual) + // This task checks if the actual data is equal to the expected data. + // X is used as don't care but it is not permitted for the full vector + // to be don't care. + //------------------------------------------------------------------------ + task automatic COMPARE_LITE_DATA; + input expected; + input actual; + begin + if (expected === 'hx || actual === 'hx) begin + $display("TESTBENCH ERROR! COMPARE_LITE_DATA cannot be performed with an expected or actual vector that is all 'x'!"); + result_slave_lite = 0; + $stop; + end + + if (actual != expected) begin + $display("TESTBENCH ERROR! Data expected is not equal to actual.", + "\nexpected = 0x%h",expected, + "\nactual = 0x%h",actual); + result_slave_lite = 0; + $stop; + end + else + begin + $display("TESTBENCH Passed! Data expected is equal to actual.", + "\n expected = 0x%h",expected, + "\n actual = 0x%h",actual); + end + end + endtask + + task automatic S_AXI_TEST; + begin + $display("---------------------------------------------------------"); + $display("EXAMPLE TEST : S_AXI"); + $display("Simple register write and read example"); + $display("---------------------------------------------------------"); + + S_AXI_mtestvectorlite = 0; + S_AXI_mtestAddress = `S_AXI_SLAVE_ADDRESS; + S_AXI_mtestProtection_lite = 0; + S_AXI_mtestdatasizelite = `S_AXI_MAX_DATA_SIZE; + + result_slave_lite = 1; + + for (S_AXI_mtestvectorlite = 0; S_AXI_mtestvectorlite <= 3; S_AXI_mtestvectorlite = S_AXI_mtestvectorlite + 1) + begin + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.WRITE_BURST_CONCURRENT( S_AXI_mtestAddress, + S_AXI_mtestProtection_lite, + S_AXI_test_data_lite[S_AXI_mtestvectorlite], + S_AXI_mtestdatasizelite, + S_AXI_lite_response); + $display("EXAMPLE TEST %d write : DATA = 0x%h, lite_response = 0x%h",S_AXI_mtestvectorlite,S_AXI_test_data_lite[S_AXI_mtestvectorlite],S_AXI_lite_response); + CHECK_RESPONSE_OKAY(S_AXI_lite_response); + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.READ_BURST(S_AXI_mtestAddress, + S_AXI_mtestProtection_lite, + S_AXI_rd_data_lite, + S_AXI_lite_response); + $display("EXAMPLE TEST %d read : DATA = 0x%h, lite_response = 0x%h",S_AXI_mtestvectorlite,S_AXI_rd_data_lite,S_AXI_lite_response); + CHECK_RESPONSE_OKAY(S_AXI_lite_response); + COMPARE_LITE_DATA(S_AXI_test_data_lite[S_AXI_mtestvectorlite],S_AXI_rd_data_lite); + $display("EXAMPLE TEST %d : Sequential write and read burst transfers complete from the master side. %d",S_AXI_mtestvectorlite,S_AXI_mtestvectorlite); + S_AXI_mtestAddress = S_AXI_mtestAddress + 32'h00000004; + end + + $display("---------------------------------------------------------"); + $display("EXAMPLE TEST S_AXI: PTGEN_TEST_FINISHED!"); + if ( result_slave_lite ) begin + $display("PTGEN_TEST: PASSED!"); + end else begin + $display("PTGEN_TEST: FAILED!"); + end + $display("---------------------------------------------------------"); + end + endtask + + // Create the test vectors + initial begin + // When performing debug enable all levels of INFO messages. + wait(tb_ARESETn === 0) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.set_channel_level_info(1); + + // Create test data vectors + S_AXI_test_data_lite[0] = 32'h0101FFFF; + S_AXI_test_data_lite[1] = 32'habcd0001; + S_AXI_test_data_lite[2] = 32'hdead0011; + S_AXI_test_data_lite[3] = 32'hbeef0011; + end + + // Drive the BFM + initial begin + // Wait for end of reset + wait(tb_ARESETn === 0) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + + S_AXI_TEST(); + + end + +endmodule diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/bfm_design/design.tcl b/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/bfm_design/design.tcl new file mode 100644 index 0000000..019686e --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/bfm_design/design.tcl @@ -0,0 +1,91 @@ +proc create_ipi_design { offsetfile design_name } { + create_bd_design $design_name + open_bd_design $design_name + + # Create Clock and Reset Ports + set ACLK [ create_bd_port -dir I -type clk ACLK ] + set_property -dict [ list CONFIG.FREQ_HZ {100000000} CONFIG.PHASE {0.000} CONFIG.CLK_DOMAIN "${design_name}_ACLK" ] $ACLK + set ARESETN [ create_bd_port -dir I -type rst ARESETN ] + set_property -dict [ list CONFIG.POLARITY {ACTIVE_LOW} ] $ARESETN + set_property CONFIG.ASSOCIATED_RESET ARESETN $ACLK + + # Create instance: axi_reg32_0, and set properties + set axi_reg32_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axi_reg32:1.0 axi_reg32_0] + + # Create instance: master_0, and set properties + set master_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:cdn_axi_bfm master_0] + set_property -dict [ list CONFIG.C_PROTOCOL_SELECTION {2} ] $master_0 + + # Create interface connections + connect_bd_intf_net [get_bd_intf_pins master_0/M_AXI_LITE] [get_bd_intf_pins axi_reg32_0/S_AXI] + + # Create port connections + connect_bd_net -net aclk_net [get_bd_ports ACLK] [get_bd_pins master_0/M_AXI_LITE_ACLK] [get_bd_pins axi_reg32_0/S_AXI_ACLK] + connect_bd_net -net aresetn_net [get_bd_ports ARESETN] [get_bd_pins master_0/M_AXI_LITE_ARESETN] [get_bd_pins axi_reg32_0/S_AXI_ARESETN] + + # Auto assign address + assign_bd_address + + # Copy all address to interface_address.vh file + set bd_path [file dirname [get_property NAME [get_files ${design_name}.bd]]] + upvar 1 $offsetfile offset_file + set offset_file "${bd_path}/axi_reg32_v1_0_tb_include.vh" + set fp [open $offset_file "w"] + puts $fp "`ifndef axi_reg32_v1_0_tb_include_vh_" + puts $fp "`define axi_reg32_v1_0_tb_include_vh_\n" + puts $fp "//Configuration current bd names" + puts $fp "`define BD_INST_NAME ${design_name}_i" + puts $fp "`define BD_WRAPPER ${design_name}_wrapper\n" + puts $fp "//Configuration address parameters" + + set offset [get_property OFFSET [get_bd_addr_segs -of_objects [get_bd_addr_spaces master_0/Data_lite]]] + set offset_hex [string replace $offset 0 1 "32'h"] + puts $fp "`define S_AXI_SLAVE_ADDRESS ${offset_hex}" + + puts $fp "`endif" + close $fp +} + +set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores trenz.biz:user:axi_reg32:1.0]]]] +set test_bench_file ${ip_path}/example_designs/bfm_design/axi_reg32_v1_0_tb.v +set interface_address_vh_file "" + +# Set IP Repository and Update IP Catalogue +set repo_paths [get_property ip_repo_paths [current_fileset]] +if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } { + set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset] + update_ip_catalog +} + +set design_name "" +set all_bd {} +set all_bd_files [get_files *.bd -quiet] +foreach file $all_bd_files { +set file_name [string range $file [expr {[string last "/" $file] + 1}] end] +set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]] +lappend all_bd $bd_name +} + +for { set i 1 } { 1 } { incr i } { + set design_name "axi_reg32_v1_0_bfm_${i}" + if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } { + break + } +} + +create_ipi_design interface_address_vh_file ${design_name} +validate_bd_design + +set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force] +import_files -force -norecurse $wrapper_file + +set_property SOURCE_SET sources_1 [get_filesets sim_1] +import_files -fileset sim_1 -norecurse -force $test_bench_file +remove_files -quiet -fileset sim_1 axi_reg32_v1_0_tb_include.vh +import_files -fileset sim_1 -norecurse -force $interface_address_vh_file +set_property top axi_reg32_v1_0_tb [get_filesets sim_1] +set_property top_lib {} [get_filesets sim_1] +set_property top_file {} [get_filesets sim_1] +launch_xsim -simset sim_1 -mode behavioral +restart +run 1000 us diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl b/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl new file mode 100644 index 0000000..2f63ccb --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl @@ -0,0 +1,45 @@ +# Runtime Tcl commands to interact with - axi_reg32_v1_0 + +# Sourcing design address info tcl +set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd +source ${bd_path}/axi_reg32_v1_0_include.tcl + +# jtag axi master interface hardware name, change as per your design. +set jtag_axi_master hw_axi_1 +set ec 0 + +# hw test script +# Delete all previous axis transactions +if { [llength [get_hw_axi_txns -quiet]] } { + delete_hw_axi_txn [get_hw_axi_txns -quiet] +} + + +# Test all lite slaves. +set wdata_1 abcd1234 + +# Test: S_AXI +# Create a write transaction at s_axi_addr address +create_hw_axi_txn w_s_axi_addr [get_hw_axis $jtag_axi_master] -type write -address $s_axi_addr -data $wdata_1 +# Create a read transaction at s_axi_addr address +create_hw_axi_txn r_s_axi_addr [get_hw_axis $jtag_axi_master] -type read -address $s_axi_addr +# Initiate transactions +run_hw_axi r_s_axi_addr +run_hw_axi w_s_axi_addr +run_hw_axi r_s_axi_addr +set rdata_tmp [get_property DATA [get_hw_axi_txn r_s_axi_addr]] +# Compare read data +if { $rdata_tmp == $wdata_1 } { + puts "Data comparison test pass for - S_AXI" +} else { + puts "Data comparison test fail for - S_AXI, expected-$wdata_1 actual-$rdata_tmp" + inc ec +} + +# Check error flag +if { $ec == 0 } { + puts "PTGEN_TEST: PASSED!" +} else { + puts "PTGEN_TEST: FAILED!" +} + diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/design.tcl b/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/design.tcl new file mode 100644 index 0000000..77acc83 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/design.tcl @@ -0,0 +1,175 @@ + +proc create_ipi_design { offsetfile design_name } { + + create_bd_design $design_name + open_bd_design $design_name + + # Create and configure Clock/Reset + create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz sys_clk_0 + create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset sys_reset_0 + + #check if current_board is set, if true - figure out required clocks. + set is_board_clock_found 0 + set is_board_reset_found 0 + set external_reset_port "" + set external_clock_port "" + + if { [current_board_part -quiet] != "" } { + + #check if any reset interface exists in board. + set board_reset [lindex [get_board_part_interfaces -filter { BUSDEF_NAME == reset_rtl && MODE == slave }] 0 ] + if { $board_reset ne "" } { + set is_board_reset_found 1 + apply_board_connection -board_interface $board_reset -ip_intf sys_clk_0/reset -diagram [current_bd_design] + apply_board_connection -board_interface $board_reset -ip_intf sys_reset_0/ext_reset -diagram [current_bd_design] + set external_rst [get_bd_ports -quiet -of_objects [get_bd_nets -quiet -of_objects [get_bd_pins -quiet sys_clk_0/reset]]] + if { $external_rst ne "" } { + set external_reset_port [get_property NAME $external_rst] + } + } else { + send_msg "ptgen 51-200" WARNING "No reset interface found in current_board, Users may need to specify the location constraints manually." + } + + # check for differential clock, exclude any special clocks which has TYPE property. + set board_clock_busifs "" + foreach busif [get_board_part_interfaces -filter "BUSDEF_NAME == diff_clock_rtl"] { + set type [get_property PARAM.TYPE $busif] + if { $type == "" } { + set board_clock_busifs $busif + break + } + } + if { $board_clock_busifs ne "" } { + apply_board_connection -board_interface $board_clock_busifs -ip_intf sys_clk_0/CLK_IN1_D -diagram [current_bd_design] + set is_board_clock_found 1 + } else { + # check for single ended clock + set board_sclock_busifs [lindex [get_board_part_interfaces -filter "BUSDEF_NAME == clock_rtl"] 0 ] + if { $board_sclock_busifs ne "" } { + apply_board_connection -board_interface $board_sclock_busifs -ip_intf sys_clk_0/clock_CLK_IN1 -diagram [current_bd_design] + set external_clk [get_bd_ports -quiet -of_objects [get_bd_nets -quiet -of_objects [get_bd_pins -quiet sys_clk_0/clk_in1]]] + if { $external_clk ne "" } { + set external_clock_port [get_property NAME $external_clk] + } + set is_board_clock_found 1 + } else { + send_msg "ptgen 51-200" WARNING "No clock interface found in current_board, Users may need to specify the location constraints manually." + } + } + + } else { + send_msg "ptgen 51-201" WARNING "No board selected in current_project. Users may need to specify the location constraints manually." + } + + #if there is no corresponding board interface found, assume constraints will be provided manually while pin planning. + if { $is_board_reset_found == 0 } { + create_bd_port -dir I -type rst reset_rtl + set_property CONFIG.POLARITY [get_property CONFIG.POLARITY [get_bd_pins sys_clk_0/reset]] [get_bd_ports reset_rtl] + connect_bd_net [get_bd_pins sys_reset_0/ext_reset_in] [get_bd_ports reset_rtl] + connect_bd_net [get_bd_ports reset_rtl] [get_bd_pins sys_clk_0/reset] + set external_reset_port reset_rtl + } + if { $is_board_clock_found == 0 } { + create_bd_port -dir I -type clk clock_rtl + connect_bd_net [get_bd_pins sys_clk_0/clk_in1] [get_bd_ports clock_rtl] + set external_clock_port clock_rtl + } + + #Avoid IPI DRC, make clock port synchronous to reset + if { $external_clock_port ne "" && $external_reset_port ne "" } { + set_property CONFIG.ASSOCIATED_RESET $external_reset_port [get_bd_ports $external_clock_port] + } + + # Connect other sys_reset pins + connect_bd_net [get_bd_pins sys_reset_0/slowest_sync_clk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins sys_clk_0/locked] [get_bd_pins sys_reset_0/dcm_locked] + + # Create instance: axi_reg32_0, and set properties + set axi_reg32_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axi_reg32:1.0 axi_reg32_0 ] + + # Create instance: jtag_axi_0, and set properties + set jtag_axi_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:jtag_axi jtag_axi_0 ] + set_property -dict [list CONFIG.PROTOCOL {0}] [get_bd_cells jtag_axi_0] + connect_bd_net [get_bd_pins jtag_axi_0/aclk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins jtag_axi_0/aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn] + + # Create instance: axi_peri_interconnect, and set properties + set axi_peri_interconnect [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect axi_peri_interconnect ] + connect_bd_net [get_bd_pins axi_peri_interconnect/ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/ARESETN] [get_bd_pins sys_reset_0/interconnect_aresetn] + set_property -dict [ list CONFIG.NUM_SI {1} ] $axi_peri_interconnect + connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn] + connect_bd_intf_net [get_bd_intf_pins jtag_axi_0/M_AXI] [get_bd_intf_pins axi_peri_interconnect/S00_AXI] + + set_property -dict [ list CONFIG.NUM_MI {1} ] $axi_peri_interconnect + connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn] + + # Connect all clock & reset of axi_reg32_0 slave interfaces.. + connect_bd_intf_net [get_bd_intf_pins axi_peri_interconnect/M00_AXI] [get_bd_intf_pins axi_reg32_0/S_AXI] + connect_bd_net [get_bd_pins axi_reg32_0/s_axi_aclk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_reg32_0/s_axi_aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn] + + + # Auto assign address + assign_bd_address + + # Copy all address to axi_reg32_v1_0_include.tcl file + set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd + upvar 1 $offsetfile offset_file + set offset_file "${bd_path}/axi_reg32_v1_0_include.tcl" + set fp [open $offset_file "w"] + puts $fp "# Configuration address parameters" + + set offset [get_property OFFSET [get_bd_addr_segs /jtag_axi_0/Data/SEG_axi_reg32_0_S_AXI_* ]] + puts $fp "set s_axi_addr ${offset}" + + close $fp +} + +# Set IP Repository and Update IP Catalogue +set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores trenz.biz:user:axi_reg32:1.0]]]] +set hw_test_file ${ip_path}/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl + +set repo_paths [get_property ip_repo_paths [current_fileset]] +if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } { + set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset] + update_ip_catalog +} + +set design_name "" +set all_bd {} +set all_bd_files [get_files *.bd -quiet] +foreach file $all_bd_files { +set file_name [string range $file [expr {[string last "/" $file] + 1}] end] +set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]] +lappend all_bd $bd_name +} + +for { set i 1 } { 1 } { incr i } { + set design_name "axi_reg32_v1_0_hw_${i}" + if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } { + break + } +} + +set intf_address_include_file "" +create_ipi_design intf_address_include_file ${design_name} +save_bd_design +validate_bd_design + +set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force] +import_files -force -norecurse $wrapper_file + +puts "-------------------------------------------------------------------------------------------------" +puts "INFO NEXT STEPS : Until this stage, debug hardware design has been created, " +puts " please perform following steps to test design in targeted board." +puts "1. Generate bitstream" +puts "2. Setup your targeted board, open hardware manager and open new(or existing) hardware target" +puts "3. Download generated bitstream" +puts "4. Run generated hardware test using below command, this invokes basic read/write operation" +puts " to every interface present in the peripheral : xilinx.com:user:myip:1.0" +puts " : source -notrace ${hw_test_file}" +puts "-------------------------------------------------------------------------------------------------" + diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd b/zynqberrydemo1/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd new file mode 100644 index 0000000..7cc74c8 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd @@ -0,0 +1,263 @@ +---------------------------------------------------------------------------------------------------- +--! @file axi_reg32_v1_0.vhd +--! @brief xxx +--! @author Antti Lukats +--! @version 1.0 +--! @date 2015 +--! @copyright Copyright 2015 Trenz Electronic GmbH +--! @license MIT License +--! @pre Vivado 2014.4+ +---------------------------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +library axi_lib; + use axi_lib.all; + + +entity axi_reg32_v1_0 is + generic ( + -- Users to add parameters here + C_NUM_RO_REG : integer range 0 to 16 := 16; + C_NUM_WR_REG : integer range 0 to 16 := 16; + + C_WR_READABLE: boolean := true; + + C_RR0_ALIAS : string := "RR0"; + C_RR1_ALIAS : string := "RR1"; + C_RR2_ALIAS : string := "RR2"; + C_RR3_ALIAS : string := "RR3"; + + C_RR4_ALIAS : string := "RR4"; + C_RR5_ALIAS : string := "RR5"; + C_RR6_ALIAS : string := "RR6"; + C_RR7_ALIAS : string := "RR7"; + + C_RR8_ALIAS : string := "RR8"; + C_RR9_ALIAS : string := "RR9"; + C_RR10_ALIAS : string := "RR10"; + C_RR11_ALIAS : string := "RR11"; + + C_RR12_ALIAS : string := "RR12"; + C_RR13_ALIAS : string := "RR13"; + C_RR14_ALIAS : string := "RR14"; + C_RR15_ALIAS : string := "RR15"; + + -- + C_WR0_ALIAS : string := "WR0"; + C_WR1_ALIAS : string := "WR1"; + C_WR2_ALIAS : string := "WR2"; + C_WR3_ALIAS : string := "WR3"; + + C_WR4_ALIAS : string := "WR4"; + C_WR5_ALIAS : string := "WR5"; + C_WR6_ALIAS : string := "WR6"; + C_WR7_ALIAS : string := "WR7"; + + C_WR8_ALIAS : string := "WR8"; + C_WR9_ALIAS : string := "WR9"; + C_WR10_ALIAS : string := "WR10"; + C_WR11_ALIAS : string := "WR11"; + + C_WR12_ALIAS : string := "WR12"; + C_WR13_ALIAS : string := "WR13"; + C_WR14_ALIAS : string := "WR14"; + C_WR15_ALIAS : string := "WR15"; + + C_WR0_DEFAULT : integer := 0; + C_WR1_DEFAULT : integer := 0; + C_WR2_DEFAULT : integer := 0; + C_WR3_DEFAULT : integer := 0; + C_WR4_DEFAULT : integer := 0; + C_WR5_DEFAULT : integer := 0; + C_WR6_DEFAULT : integer := 0; + C_WR7_DEFAULT : integer := 0; + C_WR8_DEFAULT : integer := 0; + C_WR9_DEFAULT : integer := 0; + C_WR10_DEFAULT : integer := 0; + C_WR11_DEFAULT : integer := 0; + C_WR12_DEFAULT : integer := 0; + C_WR13_DEFAULT : integer := 0; + C_WR14_DEFAULT : integer := 0; + C_WR15_DEFAULT : integer := 0; + + + C_REG_WIDTH : integer range 8 to 32 := 32; + -- User parameters ends + -- Do not modify the parameters beyond this line + + + -- Parameters of Axi Slave Bus Interface S_AXI + C_S_AXI_DATA_WIDTH : integer := 32; + C_S_AXI_ADDR_WIDTH : integer := 7 + ); + port ( + -- Users to add ports here + + RR0 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR1 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR2 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR3 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR4 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR5 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR6 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR7 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR8 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR9 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR10 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR11 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR12 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR13 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR14 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR15 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR0 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR1 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR2 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR3 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR4 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR5 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR6 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR7 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR8 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR9 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR10 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR11 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR12 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR13 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR14 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR15 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + + -- User ports ends + -- Do not modify the ports beyond this line + + + -- Ports of Axi Slave Bus Interface S_AXI + s_axi_aclk : in std_logic; + s_axi_aresetn : in std_logic; + s_axi_awaddr : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + s_axi_awprot : in std_logic_vector(2 downto 0); + s_axi_awvalid : in std_logic; + s_axi_awready : out std_logic; + s_axi_wdata : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + s_axi_wstrb : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + s_axi_wvalid : in std_logic; + s_axi_wready : out std_logic; + s_axi_bresp : out std_logic_vector(1 downto 0); + s_axi_bvalid : out std_logic; + s_axi_bready : in std_logic; + s_axi_araddr : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + s_axi_arprot : in std_logic_vector(2 downto 0); + s_axi_arvalid : in std_logic; + s_axi_arready : out std_logic; + s_axi_rdata : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + s_axi_rresp : out std_logic_vector(1 downto 0); + s_axi_rvalid : out std_logic; + s_axi_rready : in std_logic + ); +end axi_reg32_v1_0; + +architecture arch_imp of axi_reg32_v1_0 is + +begin + +-- Instantiation of Axi Bus Interface S_AXI +axi_reg32_v1_0_S_AXI_inst : entity axi_lib.axi_reg32_v1_0_S_AXI + generic map ( + C_NUM_RO_REG => C_NUM_RO_REG, + C_NUM_WR_REG => C_NUM_WR_REG, + C_WR_READABLE => C_WR_READABLE, + + C_WR0_DEFAULT => C_WR0_DEFAULT, + C_WR1_DEFAULT => C_WR1_DEFAULT, + C_WR2_DEFAULT => C_WR2_DEFAULT, + C_WR3_DEFAULT => C_WR3_DEFAULT, + C_WR4_DEFAULT => C_WR4_DEFAULT, + C_WR5_DEFAULT => C_WR5_DEFAULT, + C_WR6_DEFAULT => C_WR6_DEFAULT, + C_WR7_DEFAULT => C_WR7_DEFAULT, + C_WR8_DEFAULT => C_WR8_DEFAULT, + C_WR9_DEFAULT => C_WR9_DEFAULT, + C_WR10_DEFAULT => C_WR10_DEFAULT, + C_WR11_DEFAULT => C_WR11_DEFAULT, + C_WR12_DEFAULT => C_WR12_DEFAULT, + C_WR13_DEFAULT => C_WR13_DEFAULT, + C_WR14_DEFAULT => C_WR14_DEFAULT, + C_WR15_DEFAULT => C_WR15_DEFAULT, + + C_REG_WIDTH => C_REG_WIDTH, + C_S_AXI_DATA_WIDTH => C_S_AXI_DATA_WIDTH, + C_S_AXI_ADDR_WIDTH => C_S_AXI_ADDR_WIDTH + ) + port map ( + RR0 => RR0, + RR1 => RR1, + RR2 => RR2, + RR3 => RR3, + RR4 => RR4, + RR5 => RR5, + RR6 => RR6, + RR7 => RR7, + RR8 => RR8, + RR9 => RR9, + RR10 => RR10, + RR11 => RR11, + RR12 => RR12, + RR13 => RR13, + RR14 => RR14, + RR15 => RR15, + + WR0 => WR0, + WR1 => WR1, + WR2 => WR2, + WR3 => WR3, + WR4 => WR4, + WR5 => WR5, + WR6 => WR6, + WR7 => WR7, + WR8 => WR8, + WR9 => WR9, + WR10 => WR10, + WR11 => WR11, + WR12 => WR12, + WR13 => WR13, + WR14 => WR14, + WR15 => WR15, + + S_AXI_ACLK => s_axi_aclk, + S_AXI_ARESETN => s_axi_aresetn, + S_AXI_AWADDR => s_axi_awaddr, + S_AXI_AWPROT => s_axi_awprot, + S_AXI_AWVALID => s_axi_awvalid, + S_AXI_AWREADY => s_axi_awready, + S_AXI_WDATA => s_axi_wdata, + S_AXI_WSTRB => s_axi_wstrb, + S_AXI_WVALID => s_axi_wvalid, + S_AXI_WREADY => s_axi_wready, + S_AXI_BRESP => s_axi_bresp, + S_AXI_BVALID => s_axi_bvalid, + S_AXI_BREADY => s_axi_bready, + S_AXI_ARADDR => s_axi_araddr, + S_AXI_ARPROT => s_axi_arprot, + S_AXI_ARVALID => s_axi_arvalid, + S_AXI_ARREADY => s_axi_arready, + S_AXI_RDATA => s_axi_rdata, + S_AXI_RRESP => s_axi_rresp, + S_AXI_RVALID => s_axi_rvalid, + S_AXI_RREADY => s_axi_rready + ); + + -- Add user logic here + + -- User logic ends + +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0_S_AXI.vhd b/zynqberrydemo1/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0_S_AXI.vhd new file mode 100644 index 0000000..670d6f0 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0_S_AXI.vhd @@ -0,0 +1,766 @@ +---------------------------------------------------------------------------------------------------- +--! @file axi_reg32_v1_0_S_AXI.vhd +--! @brief xxx +--! @author Antti Lukats +--! @version 1.0 +--! @date 2015 +--! @copyright Copyright 2015 Trenz Electronic GmbH +--! @license MIT License +--! @pre Vivado 2014.4+ +---------------------------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +library axi_lib; + use axi_lib.all; + +entity axi_reg32_v1_0_S_AXI is + generic ( + -- Users to add parameters here + C_NUM_RO_REG : integer range 0 to 16 := 2; + C_NUM_WR_REG : integer range 0 to 16 := 2; + C_WR_READABLE: boolean := true; + + + C_WR0_DEFAULT : integer := 0; + C_WR1_DEFAULT : integer := 0; + C_WR2_DEFAULT : integer := 0; + C_WR3_DEFAULT : integer := 0; + C_WR4_DEFAULT : integer := 0; + C_WR5_DEFAULT : integer := 0; + C_WR6_DEFAULT : integer := 0; + C_WR7_DEFAULT : integer := 0; + C_WR8_DEFAULT : integer := 0; + C_WR9_DEFAULT : integer := 0; + C_WR10_DEFAULT : integer := 0; + C_WR11_DEFAULT : integer := 0; + C_WR12_DEFAULT : integer := 0; + C_WR13_DEFAULT : integer := 0; + C_WR14_DEFAULT : integer := 0; + C_WR15_DEFAULT : integer := 0; + + C_REG_WIDTH : integer range 8 to 32 := 32; + -- User parameters ends + -- Do not modify the parameters beyond this line + + -- Width of S_AXI data bus + C_S_AXI_DATA_WIDTH : integer := 32; + -- Width of S_AXI address bus + C_S_AXI_ADDR_WIDTH : integer := 7 + ); + port ( + -- Users to add ports here + + RR0 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR1 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR2 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR3 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR4 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR5 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR6 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR7 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR8 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR9 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR10 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR11 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR12 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR13 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR14 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR15 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR0 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR1 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR2 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR3 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR4 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR5 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR6 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR7 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR8 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR9 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR10 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR11 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR12 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR13 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR14 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR15 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + + -- User ports ends + -- Do not modify the ports beyond this line + + -- Global Clock Signal + S_AXI_ACLK : in std_logic; + -- Global Reset Signal. This Signal is Active LOW + S_AXI_ARESETN : in std_logic; + -- Write address (issued by master, acceped by Slave) + S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + -- Write channel Protection type. This signal indicates the + -- privilege and security level of the transaction, and whether + -- the transaction is a data access or an instruction access. + S_AXI_AWPROT : in std_logic_vector(2 downto 0); + -- Write address valid. This signal indicates that the master signaling + -- valid write address and control information. + S_AXI_AWVALID : in std_logic; + -- Write address ready. This signal indicates that the slave is ready + -- to accept an address and associated control signals. + S_AXI_AWREADY : out std_logic; + -- Write data (issued by master, acceped by Slave) + S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + -- Write strobes. This signal indicates which byte lanes hold + -- valid data. There is one write strobe bit for each eight + -- bits of the write data bus. + S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + -- Write valid. This signal indicates that valid write + -- data and strobes are available. + S_AXI_WVALID : in std_logic; + -- Write ready. This signal indicates that the slave + -- can accept the write data. + S_AXI_WREADY : out std_logic; + -- Write response. This signal indicates the status + -- of the write transaction. + S_AXI_BRESP : out std_logic_vector(1 downto 0); + -- Write response valid. This signal indicates that the channel + -- is signaling a valid write response. + S_AXI_BVALID : out std_logic; + -- Response ready. This signal indicates that the master + -- can accept a write response. + S_AXI_BREADY : in std_logic; + -- Read address (issued by master, acceped by Slave) + S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + -- Protection type. This signal indicates the privilege + -- and security level of the transaction, and whether the + -- transaction is a data access or an instruction access. + S_AXI_ARPROT : in std_logic_vector(2 downto 0); + -- Read address valid. This signal indicates that the channel + -- is signaling valid read address and control information. + S_AXI_ARVALID : in std_logic; + -- Read address ready. This signal indicates that the slave is + -- ready to accept an address and associated control signals. + S_AXI_ARREADY : out std_logic; + -- Read data (issued by slave) + S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + -- Read response. This signal indicates the status of the + -- read transfer. + S_AXI_RRESP : out std_logic_vector(1 downto 0); + -- Read valid. This signal indicates that the channel is + -- signaling the required read data. + S_AXI_RVALID : out std_logic; + -- Read ready. This signal indicates that the master can + -- accept the read data and response information. + S_AXI_RREADY : in std_logic + ); +end axi_reg32_v1_0_S_AXI; + +architecture arch_imp of axi_reg32_v1_0_S_AXI is + + -- AXI4LITE signals + signal axi_awaddr : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + signal axi_awready : std_logic; + signal axi_wready : std_logic; + signal axi_bresp : std_logic_vector(1 downto 0); + signal axi_bvalid : std_logic; + signal axi_araddr : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + signal axi_arready : std_logic; + signal axi_rdata : std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal axi_rresp : std_logic_vector(1 downto 0); + signal axi_rvalid : std_logic; + + -- Example-specific design signals + -- local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH + -- ADDR_LSB is used for addressing 32/64 bit registers/memories + -- ADDR_LSB = 2 for 32 bits (n downto 2) + -- ADDR_LSB = 3 for 64 bits (n downto 3) + constant ADDR_LSB : integer := (C_S_AXI_DATA_WIDTH/32)+ 1; + constant OPT_MEM_ADDR_BITS : integer := 4; + ------------------------------------------------ + ---- Signals for user logic register space example + -------------------------------------------------- + ---- Number of Slave Registers 32 + signal slv_reg0 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg1 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg2 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg3 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg4 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg5 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg6 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg7 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg8 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg9 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg10 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg11 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg12 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg13 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg14 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg15 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg16 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg17 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg18 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg19 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg20 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg21 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg22 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg23 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg24 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg25 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg26 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg27 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg28 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg29 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg30 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg31 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + + signal slv_reg16r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg17r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg18r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg19r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg20r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg21r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg22r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg23r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg24r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg25r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg26r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg27r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg28r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg29r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg30r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg31r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + + signal slv_reg_rden : std_logic; + signal slv_reg_wren : std_logic; + signal reg_data_out :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal byte_index : integer; + +begin + -- I/O Connections assignments + + S_AXI_AWREADY <= axi_awready; + S_AXI_WREADY <= axi_wready; + S_AXI_BRESP <= axi_bresp; + S_AXI_BVALID <= axi_bvalid; + S_AXI_ARREADY <= axi_arready; + S_AXI_RDATA <= axi_rdata; + S_AXI_RRESP <= axi_rresp; + S_AXI_RVALID <= axi_rvalid; + -- Implement axi_awready generation + -- axi_awready is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is + -- de-asserted when reset is low. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_awready <= '0'; + else + if (axi_awready = '0' and S_AXI_AWVALID = '1' and S_AXI_WVALID = '1') then + -- slave is ready to accept write address when + -- there is a valid write address and write data + -- on the write address and data bus. This design + -- expects no outstanding transactions. + axi_awready <= '1'; + else + axi_awready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement axi_awaddr latching + -- This process is used to latch the address when both + -- S_AXI_AWVALID and S_AXI_WVALID are valid. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_awaddr <= (others => '0'); + else + if (axi_awready = '0' and S_AXI_AWVALID = '1' and S_AXI_WVALID = '1') then + -- Write Address latching + axi_awaddr <= S_AXI_AWADDR; + end if; + end if; + end if; + end process; + + -- Implement axi_wready generation + -- axi_wready is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is + -- de-asserted when reset is low. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_wready <= '0'; + else + if (axi_wready = '0' and S_AXI_WVALID = '1' and S_AXI_AWVALID = '1') then + -- slave is ready to accept write data when + -- there is a valid write address and write data + -- on the write address and data bus. This design + -- expects no outstanding transactions. + axi_wready <= '1'; + else + axi_wready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement memory mapped register select and write logic generation + -- The write data is accepted and written to memory mapped registers when + -- axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to + -- select byte enables of slave registers while writing. + -- These registers are cleared when reset (active low) is applied. + -- Slave register write enable is asserted when valid address and data are available + -- and the slave is ready to accept the write address and write data. + slv_reg_wren <= axi_wready and S_AXI_WVALID and axi_awready and S_AXI_AWVALID ; + + process (S_AXI_ACLK) + variable loc_addr :std_logic_vector(OPT_MEM_ADDR_BITS downto 0); + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + slv_reg16 <= STD_LOGIC_VECTOR(to_unsigned(C_WR0_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg17 <= STD_LOGIC_VECTOR(to_unsigned(C_WR1_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg18 <= STD_LOGIC_VECTOR(to_unsigned(C_WR2_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg19 <= STD_LOGIC_VECTOR(to_unsigned(C_WR3_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg20 <= STD_LOGIC_VECTOR(to_unsigned(C_WR4_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg21 <= STD_LOGIC_VECTOR(to_unsigned(C_WR5_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg22 <= STD_LOGIC_VECTOR(to_unsigned(C_WR6_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg23 <= STD_LOGIC_VECTOR(to_unsigned(C_WR7_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg24 <= STD_LOGIC_VECTOR(to_unsigned(C_WR8_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg25 <= STD_LOGIC_VECTOR(to_unsigned(C_WR9_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg26 <= STD_LOGIC_VECTOR(to_unsigned(C_WR10_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg27 <= STD_LOGIC_VECTOR(to_unsigned(C_WR11_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg28 <= STD_LOGIC_VECTOR(to_unsigned(C_WR12_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg29 <= STD_LOGIC_VECTOR(to_unsigned(C_WR13_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg30 <= STD_LOGIC_VECTOR(to_unsigned(C_WR14_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg31 <= STD_LOGIC_VECTOR(to_unsigned(C_WR15_DEFAULT,C_S_AXI_DATA_WIDTH)); + else + loc_addr := axi_awaddr(ADDR_LSB + OPT_MEM_ADDR_BITS downto ADDR_LSB); + if (slv_reg_wren = '1') then + case loc_addr is + when b"10000" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 16 + slv_reg16(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10001" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 17 + slv_reg17(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10010" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 18 + slv_reg18(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10011" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 19 + slv_reg19(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10100" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 20 + slv_reg20(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10101" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 21 + slv_reg21(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10110" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 22 + slv_reg22(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10111" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 23 + slv_reg23(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11000" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 24 + slv_reg24(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11001" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 25 + slv_reg25(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11010" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 26 + slv_reg26(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11011" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 27 + slv_reg27(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11100" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 28 + slv_reg28(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11101" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 29 + slv_reg29(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11110" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 30 + slv_reg30(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11111" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 31 + slv_reg31(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when others => + slv_reg16 <= slv_reg16; + slv_reg17 <= slv_reg17; + slv_reg18 <= slv_reg18; + slv_reg19 <= slv_reg19; + slv_reg20 <= slv_reg20; + slv_reg21 <= slv_reg21; + slv_reg22 <= slv_reg22; + slv_reg23 <= slv_reg23; + slv_reg24 <= slv_reg24; + slv_reg25 <= slv_reg25; + slv_reg26 <= slv_reg26; + slv_reg27 <= slv_reg27; + slv_reg28 <= slv_reg28; + slv_reg29 <= slv_reg29; + slv_reg30 <= slv_reg30; + slv_reg31 <= slv_reg31; + end case; + end if; + end if; + end if; + end process; + + -- Implement write response logic generation + -- The write response and response valid signals are asserted by the slave + -- when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. + -- This marks the acceptance of address and indicates the status of + -- write transaction. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_bvalid <= '0'; + axi_bresp <= "00"; --need to work more on the responses + else + if (axi_awready = '1' and S_AXI_AWVALID = '1' and axi_wready = '1' and S_AXI_WVALID = '1' and axi_bvalid = '0' ) then + axi_bvalid <= '1'; + axi_bresp <= "00"; + elsif (S_AXI_BREADY = '1' and axi_bvalid = '1') then --check if bready is asserted while bvalid is high) + axi_bvalid <= '0'; -- (there is a possibility that bready is always asserted high) + end if; + end if; + end if; + end process; + + -- Implement axi_arready generation + -- axi_arready is asserted for one S_AXI_ACLK clock cycle when + -- S_AXI_ARVALID is asserted. axi_awready is + -- de-asserted when reset (active low) is asserted. + -- The read address is also latched when S_AXI_ARVALID is + -- asserted. axi_araddr is reset to zero on reset assertion. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_arready <= '0'; + axi_araddr <= (others => '1'); + else + if (axi_arready = '0' and S_AXI_ARVALID = '1') then + -- indicates that the slave has acceped the valid read address + axi_arready <= '1'; + -- Read Address latching + axi_araddr <= S_AXI_ARADDR; + else + axi_arready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement axi_arvalid generation + -- axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_ARVALID and axi_arready are asserted. The slave registers + -- data are available on the axi_rdata bus at this instance. The + -- assertion of axi_rvalid marks the validity of read data on the + -- bus and axi_rresp indicates the status of read transaction.axi_rvalid + -- is deasserted on reset (active low). axi_rresp and axi_rdata are + -- cleared to zero on reset (active low). + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_rvalid <= '0'; + axi_rresp <= "00"; + else + if (axi_arready = '1' and S_AXI_ARVALID = '1' and axi_rvalid = '0') then + -- Valid read data is available at the read data bus + axi_rvalid <= '1'; + axi_rresp <= "00"; -- 'OKAY' response + elsif (axi_rvalid = '1' and S_AXI_RREADY = '1') then + -- Read data is accepted by the master + axi_rvalid <= '0'; + end if; + end if; + end if; + end process; + + -- Implement memory mapped register select and read logic generation + -- Slave register read enable is asserted when valid address is available + -- and the slave is ready to accept the read address. + slv_reg_rden <= axi_arready and S_AXI_ARVALID and (not axi_rvalid) ; + + process (slv_reg0, slv_reg1, slv_reg2, slv_reg3, slv_reg4, slv_reg5, slv_reg6, slv_reg7, slv_reg8, slv_reg9, slv_reg10, slv_reg11, slv_reg12, slv_reg13, slv_reg14, slv_reg15, slv_reg16r, slv_reg17r, slv_reg18r, slv_reg19r, slv_reg20r, slv_reg21r, slv_reg22r, slv_reg23r, slv_reg24r, slv_reg25r, slv_reg26r, slv_reg27r, slv_reg28r, slv_reg29r, slv_reg30r, slv_reg31r, axi_araddr, S_AXI_ARESETN, slv_reg_rden) + variable loc_addr :std_logic_vector(OPT_MEM_ADDR_BITS downto 0); + begin + -- Address decoding for reading registers + loc_addr := axi_araddr(ADDR_LSB + OPT_MEM_ADDR_BITS downto ADDR_LSB); + case loc_addr is + when b"00000" => + reg_data_out <= slv_reg0; + when b"00001" => + reg_data_out <= slv_reg1; + when b"00010" => + reg_data_out <= slv_reg2; + when b"00011" => + reg_data_out <= slv_reg3; + when b"00100" => + reg_data_out <= slv_reg4; + when b"00101" => + reg_data_out <= slv_reg5; + when b"00110" => + reg_data_out <= slv_reg6; + when b"00111" => + reg_data_out <= slv_reg7; + when b"01000" => + reg_data_out <= slv_reg8; + when b"01001" => + reg_data_out <= slv_reg9; + when b"01010" => + reg_data_out <= slv_reg10; + when b"01011" => + reg_data_out <= slv_reg11; + when b"01100" => + reg_data_out <= slv_reg12; + when b"01101" => + reg_data_out <= slv_reg13; + when b"01110" => + reg_data_out <= slv_reg14; + when b"01111" => + reg_data_out <= slv_reg15; + + when b"10000" => + reg_data_out <= slv_reg16r; + when b"10001" => + reg_data_out <= slv_reg17r; + when b"10010" => + reg_data_out <= slv_reg18r; + when b"10011" => + reg_data_out <= slv_reg19r; + when b"10100" => + reg_data_out <= slv_reg20r; + when b"10101" => + reg_data_out <= slv_reg21r; + when b"10110" => + reg_data_out <= slv_reg22r; + when b"10111" => + reg_data_out <= slv_reg23r; + when b"11000" => + reg_data_out <= slv_reg24r; + when b"11001" => + reg_data_out <= slv_reg25r; + when b"11010" => + reg_data_out <= slv_reg26r; + when b"11011" => + reg_data_out <= slv_reg27r; + when b"11100" => + reg_data_out <= slv_reg28r; + when b"11101" => + reg_data_out <= slv_reg29r; + when b"11110" => + reg_data_out <= slv_reg30r; + when b"11111" => + reg_data_out <= slv_reg31r; + when others => + reg_data_out <= (others => '0'); + end case; + end process; + + -- Output register or memory read data + process( S_AXI_ACLK ) is + begin + if (rising_edge (S_AXI_ACLK)) then + if ( S_AXI_ARESETN = '0' ) then + axi_rdata <= (others => '0'); + else + if (slv_reg_rden = '1') then + -- When there is a valid read address (S_AXI_ARVALID) with + -- acceptance of read address by the slave (axi_arready), + -- output the read dada + -- Read address mux + axi_rdata <= reg_data_out; -- register read data + end if; + end if; + end if; + end process; + + + slv_reg0 <= RR0; + slv_reg1 <= RR1; + slv_reg2 <= RR2; + slv_reg3 <= RR3; + slv_reg4 <= RR4; + slv_reg5 <= RR5; + slv_reg6 <= RR6; + slv_reg7 <= RR7; + slv_reg8 <= RR8; + slv_reg9 <= RR9; + slv_reg10 <= RR10; + slv_reg11 <= RR11; + slv_reg12 <= RR12; + slv_reg13 <= RR13; + slv_reg14 <= RR14; + slv_reg15 <= RR15; + + WR0 <= slv_reg16; + WR1 <= slv_reg17; + WR2 <= slv_reg18; + WR3 <= slv_reg19; + WR4 <= slv_reg20; + WR5 <= slv_reg21; + WR6 <= slv_reg22; + WR7 <= slv_reg23; + WR8 <= slv_reg24; + WR9 <= slv_reg25; + WR10 <= slv_reg26; + WR11 <= slv_reg27; + WR12 <= slv_reg28; + WR13 <= slv_reg29; + WR14 <= slv_reg30; + WR15 <= slv_reg31; + + +WR_readable_Gen: if C_WR_READABLE = true generate + slv_reg16r <= slv_reg16; +WR17_Gen: if C_NUM_WR_REG > 1 generate + slv_reg17r <= slv_reg17; +end generate; +WR18_Gen: if C_NUM_WR_REG > 2 generate + slv_reg18r <= slv_reg18; +end generate; +WR19_Gen: if C_NUM_WR_REG > 3 generate + slv_reg19r <= slv_reg19; +end generate; +WR20_Gen: if C_NUM_WR_REG > 4 generate + slv_reg20r <= slv_reg20; +end generate; +WR21_Gen: if C_NUM_WR_REG > 5 generate + slv_reg21r <= slv_reg21; +end generate; +WR22_Gen: if C_NUM_WR_REG > 6 generate + slv_reg22r <= slv_reg22; +end generate; +WR23_Gen: if C_NUM_WR_REG > 7 generate + slv_reg23r <= slv_reg23; +end generate; +WR24_Gen: if C_NUM_WR_REG > 8 generate + slv_reg24r <= slv_reg24; +end generate; +WR25_Gen: if C_NUM_WR_REG > 9 generate + slv_reg25r <= slv_reg25; +end generate; +WR26_Gen: if C_NUM_WR_REG > 10 generate + slv_reg26r <= slv_reg26; +end generate; +WR27_Gen: if C_NUM_WR_REG > 11 generate + slv_reg27r <= slv_reg27; +end generate; +WR28_Gen: if C_NUM_WR_REG > 12 generate + slv_reg28r <= slv_reg28; +end generate; +WR29_Gen: if C_NUM_WR_REG > 13 generate + slv_reg29r <= slv_reg29; +end generate; +WR30_Gen: if C_NUM_WR_REG > 14 generate + slv_reg30r <= slv_reg30; +end generate; +WR31_Gen: if C_NUM_WR_REG > 15 generate + slv_reg31r <= slv_reg31; +end generate; + +end generate WR_readable_Gen; + +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl b/zynqberrydemo1/ip_lib/axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl new file mode 100644 index 0000000..631cdd0 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl @@ -0,0 +1,853 @@ + +# Loading additional proc with user specified bodies to compute parameter values. +source [file join [file dirname [file dirname [info script]]] gui/axi_reg32_v1_0.gtcl] + +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0" -display_name {AXI}] + ipgui::add_param $IPINST -name "C_S_AXI_DATA_WIDTH" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_S_AXI_ADDR_WIDTH" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_S_AXI_BASEADDR" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_S_AXI_HIGHADDR" -parent ${Page_0} + + #Adding Page + set Read_Registers [ipgui::add_page $IPINST -name "Read Registers" -display_name {Input Registers}] + ipgui::add_param $IPINST -name "C_NUM_RO_REG" -parent ${Read_Registers} -widget comboBox + #Adding Group + set Input_Registe_Alias [ipgui::add_group $IPINST -name "Input Registe Alias" -parent ${Read_Registers} -display_name {Input Register Alias}] + ipgui::add_param $IPINST -name "C_RR0_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR1_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR2_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR3_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR4_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR5_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR6_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR7_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR8_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR9_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR10_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR11_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR12_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR13_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR14_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR15_ALIAS" -parent ${Input_Registe_Alias} + + + #Adding Page + set Output_Registers [ipgui::add_page $IPINST -name "Output Registers"] + ipgui::add_param $IPINST -name "C_WR_READABLE" -parent ${Output_Registers} + ipgui::add_param $IPINST -name "C_NUM_WR_REG" -parent ${Output_Registers} -widget comboBox + #Adding Group + set Registers [ipgui::add_group $IPINST -name "Registers" -parent ${Output_Registers} -layout horizontal] + #Adding Group + set Register_Aliases [ipgui::add_group $IPINST -name "Register Aliases" -parent ${Registers} -display_name {Aliases}] + ipgui::add_param $IPINST -name "C_WR0_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR1_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR2_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR3_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR4_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR5_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR6_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR7_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR8_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR9_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR10_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR11_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR12_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR13_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR14_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR15_ALIAS" -parent ${Register_Aliases} + + #Adding Group + set Default [ipgui::add_group $IPINST -name "Default" -parent ${Registers}] + ipgui::add_param $IPINST -name "C_WR0_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR1_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR2_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR3_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR4_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR5_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR6_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR7_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR8_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR9_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR10_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR11_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR12_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR13_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR14_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR15_DEFAULT" -parent ${Default} + + + + +} + +proc update_PARAM_VALUE.C_NUM_RO_REG { PARAM_VALUE.C_NUM_RO_REG } { + # Procedure called to update C_NUM_RO_REG when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_NUM_RO_REG { PARAM_VALUE.C_NUM_RO_REG } { + # Procedure called to validate C_NUM_RO_REG + return true +} + +proc update_PARAM_VALUE.C_NUM_WR_REG { PARAM_VALUE.C_NUM_WR_REG } { + # Procedure called to update C_NUM_WR_REG when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_NUM_WR_REG { PARAM_VALUE.C_NUM_WR_REG } { + # Procedure called to validate C_NUM_WR_REG + return true +} + +proc update_PARAM_VALUE.C_RR0_ALIAS { PARAM_VALUE.C_RR0_ALIAS } { + # Procedure called to update C_RR0_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR0_ALIAS { PARAM_VALUE.C_RR0_ALIAS } { + # Procedure called to validate C_RR0_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR10_ALIAS { PARAM_VALUE.C_RR10_ALIAS } { + # Procedure called to update C_RR10_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR10_ALIAS { PARAM_VALUE.C_RR10_ALIAS } { + # Procedure called to validate C_RR10_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR11_ALIAS { PARAM_VALUE.C_RR11_ALIAS } { + # Procedure called to update C_RR11_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR11_ALIAS { PARAM_VALUE.C_RR11_ALIAS } { + # Procedure called to validate C_RR11_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR12_ALIAS { PARAM_VALUE.C_RR12_ALIAS } { + # Procedure called to update C_RR12_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR12_ALIAS { PARAM_VALUE.C_RR12_ALIAS } { + # Procedure called to validate C_RR12_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR13_ALIAS { PARAM_VALUE.C_RR13_ALIAS } { + # Procedure called to update C_RR13_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR13_ALIAS { PARAM_VALUE.C_RR13_ALIAS } { + # Procedure called to validate C_RR13_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR14_ALIAS { PARAM_VALUE.C_RR14_ALIAS } { + # Procedure called to update C_RR14_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR14_ALIAS { PARAM_VALUE.C_RR14_ALIAS } { + # Procedure called to validate C_RR14_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR15_ALIAS { PARAM_VALUE.C_RR15_ALIAS } { + # Procedure called to update C_RR15_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR15_ALIAS { PARAM_VALUE.C_RR15_ALIAS } { + # Procedure called to validate C_RR15_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR1_ALIAS { PARAM_VALUE.C_RR1_ALIAS } { + # Procedure called to update C_RR1_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR1_ALIAS { PARAM_VALUE.C_RR1_ALIAS } { + # Procedure called to validate C_RR1_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR2_ALIAS { PARAM_VALUE.C_RR2_ALIAS } { + # Procedure called to update C_RR2_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR2_ALIAS { PARAM_VALUE.C_RR2_ALIAS } { + # Procedure called to validate C_RR2_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR3_ALIAS { PARAM_VALUE.C_RR3_ALIAS } { + # Procedure called to update C_RR3_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR3_ALIAS { PARAM_VALUE.C_RR3_ALIAS } { + # Procedure called to validate C_RR3_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR4_ALIAS { PARAM_VALUE.C_RR4_ALIAS } { + # Procedure called to update C_RR4_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR4_ALIAS { PARAM_VALUE.C_RR4_ALIAS } { + # Procedure called to validate C_RR4_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR5_ALIAS { PARAM_VALUE.C_RR5_ALIAS } { + # Procedure called to update C_RR5_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR5_ALIAS { PARAM_VALUE.C_RR5_ALIAS } { + # Procedure called to validate C_RR5_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR6_ALIAS { PARAM_VALUE.C_RR6_ALIAS } { + # Procedure called to update C_RR6_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR6_ALIAS { PARAM_VALUE.C_RR6_ALIAS } { + # Procedure called to validate C_RR6_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR7_ALIAS { PARAM_VALUE.C_RR7_ALIAS } { + # Procedure called to update C_RR7_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR7_ALIAS { PARAM_VALUE.C_RR7_ALIAS } { + # Procedure called to validate C_RR7_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR8_ALIAS { PARAM_VALUE.C_RR8_ALIAS } { + # Procedure called to update C_RR8_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR8_ALIAS { PARAM_VALUE.C_RR8_ALIAS } { + # Procedure called to validate C_RR8_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR9_ALIAS { PARAM_VALUE.C_RR9_ALIAS } { + # Procedure called to update C_RR9_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR9_ALIAS { PARAM_VALUE.C_RR9_ALIAS } { + # Procedure called to validate C_RR9_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR0_ALIAS { PARAM_VALUE.C_WR0_ALIAS } { + # Procedure called to update C_WR0_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR0_ALIAS { PARAM_VALUE.C_WR0_ALIAS } { + # Procedure called to validate C_WR0_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR0_DEFAULT { PARAM_VALUE.C_WR0_DEFAULT } { + # Procedure called to update C_WR0_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR0_DEFAULT { PARAM_VALUE.C_WR0_DEFAULT } { + # Procedure called to validate C_WR0_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR10_ALIAS { PARAM_VALUE.C_WR10_ALIAS } { + # Procedure called to update C_WR10_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR10_ALIAS { PARAM_VALUE.C_WR10_ALIAS } { + # Procedure called to validate C_WR10_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR10_DEFAULT { PARAM_VALUE.C_WR10_DEFAULT } { + # Procedure called to update C_WR10_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR10_DEFAULT { PARAM_VALUE.C_WR10_DEFAULT } { + # Procedure called to validate C_WR10_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR11_ALIAS { PARAM_VALUE.C_WR11_ALIAS } { + # Procedure called to update C_WR11_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR11_ALIAS { PARAM_VALUE.C_WR11_ALIAS } { + # Procedure called to validate C_WR11_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR11_DEFAULT { PARAM_VALUE.C_WR11_DEFAULT } { + # Procedure called to update C_WR11_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR11_DEFAULT { PARAM_VALUE.C_WR11_DEFAULT } { + # Procedure called to validate C_WR11_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR12_ALIAS { PARAM_VALUE.C_WR12_ALIAS } { + # Procedure called to update C_WR12_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR12_ALIAS { PARAM_VALUE.C_WR12_ALIAS } { + # Procedure called to validate C_WR12_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR12_DEFAULT { PARAM_VALUE.C_WR12_DEFAULT } { + # Procedure called to update C_WR12_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR12_DEFAULT { PARAM_VALUE.C_WR12_DEFAULT } { + # Procedure called to validate C_WR12_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR13_ALIAS { PARAM_VALUE.C_WR13_ALIAS } { + # Procedure called to update C_WR13_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR13_ALIAS { PARAM_VALUE.C_WR13_ALIAS } { + # Procedure called to validate C_WR13_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR13_DEFAULT { PARAM_VALUE.C_WR13_DEFAULT } { + # Procedure called to update C_WR13_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR13_DEFAULT { PARAM_VALUE.C_WR13_DEFAULT } { + # Procedure called to validate C_WR13_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR14_ALIAS { PARAM_VALUE.C_WR14_ALIAS } { + # Procedure called to update C_WR14_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR14_ALIAS { PARAM_VALUE.C_WR14_ALIAS } { + # Procedure called to validate C_WR14_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR14_DEFAULT { PARAM_VALUE.C_WR14_DEFAULT } { + # Procedure called to update C_WR14_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR14_DEFAULT { PARAM_VALUE.C_WR14_DEFAULT } { + # Procedure called to validate C_WR14_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR15_ALIAS { PARAM_VALUE.C_WR15_ALIAS } { + # Procedure called to update C_WR15_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR15_ALIAS { PARAM_VALUE.C_WR15_ALIAS } { + # Procedure called to validate C_WR15_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR15_DEFAULT { PARAM_VALUE.C_WR15_DEFAULT } { + # Procedure called to update C_WR15_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR15_DEFAULT { PARAM_VALUE.C_WR15_DEFAULT } { + # Procedure called to validate C_WR15_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR1_ALIAS { PARAM_VALUE.C_WR1_ALIAS } { + # Procedure called to update C_WR1_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR1_ALIAS { PARAM_VALUE.C_WR1_ALIAS } { + # Procedure called to validate C_WR1_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR1_DEFAULT { PARAM_VALUE.C_WR1_DEFAULT } { + # Procedure called to update C_WR1_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR1_DEFAULT { PARAM_VALUE.C_WR1_DEFAULT } { + # Procedure called to validate C_WR1_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR2_ALIAS { PARAM_VALUE.C_WR2_ALIAS } { + # Procedure called to update C_WR2_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR2_ALIAS { PARAM_VALUE.C_WR2_ALIAS } { + # Procedure called to validate C_WR2_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR2_DEFAULT { PARAM_VALUE.C_WR2_DEFAULT } { + # Procedure called to update C_WR2_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR2_DEFAULT { PARAM_VALUE.C_WR2_DEFAULT } { + # Procedure called to validate C_WR2_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR3_ALIAS { PARAM_VALUE.C_WR3_ALIAS } { + # Procedure called to update C_WR3_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR3_ALIAS { PARAM_VALUE.C_WR3_ALIAS } { + # Procedure called to validate C_WR3_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR3_DEFAULT { PARAM_VALUE.C_WR3_DEFAULT } { + # Procedure called to update C_WR3_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR3_DEFAULT { PARAM_VALUE.C_WR3_DEFAULT } { + # Procedure called to validate C_WR3_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR4_ALIAS { PARAM_VALUE.C_WR4_ALIAS } { + # Procedure called to update C_WR4_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR4_ALIAS { PARAM_VALUE.C_WR4_ALIAS } { + # Procedure called to validate C_WR4_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR4_DEFAULT { PARAM_VALUE.C_WR4_DEFAULT } { + # Procedure called to update C_WR4_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR4_DEFAULT { PARAM_VALUE.C_WR4_DEFAULT } { + # Procedure called to validate C_WR4_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR5_ALIAS { PARAM_VALUE.C_WR5_ALIAS } { + # Procedure called to update C_WR5_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR5_ALIAS { PARAM_VALUE.C_WR5_ALIAS } { + # Procedure called to validate C_WR5_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR5_DEFAULT { PARAM_VALUE.C_WR5_DEFAULT } { + # Procedure called to update C_WR5_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR5_DEFAULT { PARAM_VALUE.C_WR5_DEFAULT } { + # Procedure called to validate C_WR5_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR6_ALIAS { PARAM_VALUE.C_WR6_ALIAS } { + # Procedure called to update C_WR6_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR6_ALIAS { PARAM_VALUE.C_WR6_ALIAS } { + # Procedure called to validate C_WR6_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR6_DEFAULT { PARAM_VALUE.C_WR6_DEFAULT } { + # Procedure called to update C_WR6_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR6_DEFAULT { PARAM_VALUE.C_WR6_DEFAULT } { + # Procedure called to validate C_WR6_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR7_ALIAS { PARAM_VALUE.C_WR7_ALIAS } { + # Procedure called to update C_WR7_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR7_ALIAS { PARAM_VALUE.C_WR7_ALIAS } { + # Procedure called to validate C_WR7_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR7_DEFAULT { PARAM_VALUE.C_WR7_DEFAULT } { + # Procedure called to update C_WR7_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR7_DEFAULT { PARAM_VALUE.C_WR7_DEFAULT } { + # Procedure called to validate C_WR7_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR8_ALIAS { PARAM_VALUE.C_WR8_ALIAS } { + # Procedure called to update C_WR8_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR8_ALIAS { PARAM_VALUE.C_WR8_ALIAS } { + # Procedure called to validate C_WR8_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR8_DEFAULT { PARAM_VALUE.C_WR8_DEFAULT } { + # Procedure called to update C_WR8_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR8_DEFAULT { PARAM_VALUE.C_WR8_DEFAULT } { + # Procedure called to validate C_WR8_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR9_ALIAS { PARAM_VALUE.C_WR9_ALIAS } { + # Procedure called to update C_WR9_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR9_ALIAS { PARAM_VALUE.C_WR9_ALIAS } { + # Procedure called to validate C_WR9_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR9_DEFAULT { PARAM_VALUE.C_WR9_DEFAULT } { + # Procedure called to update C_WR9_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR9_DEFAULT { PARAM_VALUE.C_WR9_DEFAULT } { + # Procedure called to validate C_WR9_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR_READABLE { PARAM_VALUE.C_WR_READABLE } { + # Procedure called to update C_WR_READABLE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR_READABLE { PARAM_VALUE.C_WR_READABLE } { + # Procedure called to validate C_WR_READABLE + return true +} + +proc update_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to update C_S_AXI_DATA_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to validate C_S_AXI_DATA_WIDTH + return true +} + +proc update_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to update C_S_AXI_ADDR_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to validate C_S_AXI_ADDR_WIDTH + return true +} + +proc update_PARAM_VALUE.C_S_AXI_BASEADDR { PARAM_VALUE.C_S_AXI_BASEADDR } { + # Procedure called to update C_S_AXI_BASEADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_BASEADDR { PARAM_VALUE.C_S_AXI_BASEADDR } { + # Procedure called to validate C_S_AXI_BASEADDR + return true +} + +proc update_PARAM_VALUE.C_S_AXI_HIGHADDR { PARAM_VALUE.C_S_AXI_HIGHADDR } { + # Procedure called to update C_S_AXI_HIGHADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_HIGHADDR { PARAM_VALUE.C_S_AXI_HIGHADDR } { + # Procedure called to validate C_S_AXI_HIGHADDR + return true +} + + +proc update_MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH { MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_S_AXI_DATA_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH { MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_S_AXI_ADDR_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_REG_WIDTH { MODELPARAM_VALUE.C_REG_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + # WARNING: There is no corresponding user parameter named "C_REG_WIDTH". Setting updated value from the model parameter. +set_property value 32 ${MODELPARAM_VALUE.C_REG_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_NUM_RO_REG { MODELPARAM_VALUE.C_NUM_RO_REG PARAM_VALUE.C_NUM_RO_REG } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_NUM_RO_REG}] ${MODELPARAM_VALUE.C_NUM_RO_REG} +} + +proc update_MODELPARAM_VALUE.C_NUM_WR_REG { MODELPARAM_VALUE.C_NUM_WR_REG PARAM_VALUE.C_NUM_WR_REG } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_NUM_WR_REG}] ${MODELPARAM_VALUE.C_NUM_WR_REG} +} + +proc update_MODELPARAM_VALUE.C_WR_READABLE { MODELPARAM_VALUE.C_WR_READABLE PARAM_VALUE.C_WR_READABLE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR_READABLE}] ${MODELPARAM_VALUE.C_WR_READABLE} +} + +proc update_MODELPARAM_VALUE.C_RR0_ALIAS { MODELPARAM_VALUE.C_RR0_ALIAS PARAM_VALUE.C_RR0_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR0_ALIAS}] ${MODELPARAM_VALUE.C_RR0_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR1_ALIAS { MODELPARAM_VALUE.C_RR1_ALIAS PARAM_VALUE.C_RR1_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR1_ALIAS}] ${MODELPARAM_VALUE.C_RR1_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR0_ALIAS { MODELPARAM_VALUE.C_WR0_ALIAS PARAM_VALUE.C_WR0_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR0_ALIAS}] ${MODELPARAM_VALUE.C_WR0_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR1_ALIAS { MODELPARAM_VALUE.C_WR1_ALIAS PARAM_VALUE.C_WR1_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR1_ALIAS}] ${MODELPARAM_VALUE.C_WR1_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR2_ALIAS { MODELPARAM_VALUE.C_RR2_ALIAS PARAM_VALUE.C_RR2_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR2_ALIAS}] ${MODELPARAM_VALUE.C_RR2_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR3_ALIAS { MODELPARAM_VALUE.C_RR3_ALIAS PARAM_VALUE.C_RR3_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR3_ALIAS}] ${MODELPARAM_VALUE.C_RR3_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR4_ALIAS { MODELPARAM_VALUE.C_RR4_ALIAS PARAM_VALUE.C_RR4_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR4_ALIAS}] ${MODELPARAM_VALUE.C_RR4_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR5_ALIAS { MODELPARAM_VALUE.C_RR5_ALIAS PARAM_VALUE.C_RR5_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR5_ALIAS}] ${MODELPARAM_VALUE.C_RR5_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR6_ALIAS { MODELPARAM_VALUE.C_RR6_ALIAS PARAM_VALUE.C_RR6_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR6_ALIAS}] ${MODELPARAM_VALUE.C_RR6_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR7_ALIAS { MODELPARAM_VALUE.C_RR7_ALIAS PARAM_VALUE.C_RR7_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR7_ALIAS}] ${MODELPARAM_VALUE.C_RR7_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR8_ALIAS { MODELPARAM_VALUE.C_RR8_ALIAS PARAM_VALUE.C_RR8_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR8_ALIAS}] ${MODELPARAM_VALUE.C_RR8_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR9_ALIAS { MODELPARAM_VALUE.C_RR9_ALIAS PARAM_VALUE.C_RR9_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR9_ALIAS}] ${MODELPARAM_VALUE.C_RR9_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR10_ALIAS { MODELPARAM_VALUE.C_RR10_ALIAS PARAM_VALUE.C_RR10_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR10_ALIAS}] ${MODELPARAM_VALUE.C_RR10_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR11_ALIAS { MODELPARAM_VALUE.C_RR11_ALIAS PARAM_VALUE.C_RR11_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR11_ALIAS}] ${MODELPARAM_VALUE.C_RR11_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR12_ALIAS { MODELPARAM_VALUE.C_RR12_ALIAS PARAM_VALUE.C_RR12_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR12_ALIAS}] ${MODELPARAM_VALUE.C_RR12_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR13_ALIAS { MODELPARAM_VALUE.C_RR13_ALIAS PARAM_VALUE.C_RR13_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR13_ALIAS}] ${MODELPARAM_VALUE.C_RR13_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR14_ALIAS { MODELPARAM_VALUE.C_RR14_ALIAS PARAM_VALUE.C_RR14_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR14_ALIAS}] ${MODELPARAM_VALUE.C_RR14_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR15_ALIAS { MODELPARAM_VALUE.C_RR15_ALIAS PARAM_VALUE.C_RR15_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR15_ALIAS}] ${MODELPARAM_VALUE.C_RR15_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR2_ALIAS { MODELPARAM_VALUE.C_WR2_ALIAS PARAM_VALUE.C_WR2_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR2_ALIAS}] ${MODELPARAM_VALUE.C_WR2_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR3_ALIAS { MODELPARAM_VALUE.C_WR3_ALIAS PARAM_VALUE.C_WR3_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR3_ALIAS}] ${MODELPARAM_VALUE.C_WR3_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR4_ALIAS { MODELPARAM_VALUE.C_WR4_ALIAS PARAM_VALUE.C_WR4_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR4_ALIAS}] ${MODELPARAM_VALUE.C_WR4_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR5_ALIAS { MODELPARAM_VALUE.C_WR5_ALIAS PARAM_VALUE.C_WR5_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR5_ALIAS}] ${MODELPARAM_VALUE.C_WR5_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR6_ALIAS { MODELPARAM_VALUE.C_WR6_ALIAS PARAM_VALUE.C_WR6_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR6_ALIAS}] ${MODELPARAM_VALUE.C_WR6_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR7_ALIAS { MODELPARAM_VALUE.C_WR7_ALIAS PARAM_VALUE.C_WR7_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR7_ALIAS}] ${MODELPARAM_VALUE.C_WR7_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR8_ALIAS { MODELPARAM_VALUE.C_WR8_ALIAS PARAM_VALUE.C_WR8_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR8_ALIAS}] ${MODELPARAM_VALUE.C_WR8_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR9_ALIAS { MODELPARAM_VALUE.C_WR9_ALIAS PARAM_VALUE.C_WR9_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR9_ALIAS}] ${MODELPARAM_VALUE.C_WR9_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR10_ALIAS { MODELPARAM_VALUE.C_WR10_ALIAS PARAM_VALUE.C_WR10_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR10_ALIAS}] ${MODELPARAM_VALUE.C_WR10_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR11_ALIAS { MODELPARAM_VALUE.C_WR11_ALIAS PARAM_VALUE.C_WR11_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR11_ALIAS}] ${MODELPARAM_VALUE.C_WR11_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR12_ALIAS { MODELPARAM_VALUE.C_WR12_ALIAS PARAM_VALUE.C_WR12_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR12_ALIAS}] ${MODELPARAM_VALUE.C_WR12_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR13_ALIAS { MODELPARAM_VALUE.C_WR13_ALIAS PARAM_VALUE.C_WR13_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR13_ALIAS}] ${MODELPARAM_VALUE.C_WR13_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR14_ALIAS { MODELPARAM_VALUE.C_WR14_ALIAS PARAM_VALUE.C_WR14_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR14_ALIAS}] ${MODELPARAM_VALUE.C_WR14_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR15_ALIAS { MODELPARAM_VALUE.C_WR15_ALIAS PARAM_VALUE.C_WR15_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR15_ALIAS}] ${MODELPARAM_VALUE.C_WR15_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR0_DEFAULT { MODELPARAM_VALUE.C_WR0_DEFAULT PARAM_VALUE.C_WR0_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR0_DEFAULT}] ${MODELPARAM_VALUE.C_WR0_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR1_DEFAULT { MODELPARAM_VALUE.C_WR1_DEFAULT PARAM_VALUE.C_WR1_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR1_DEFAULT}] ${MODELPARAM_VALUE.C_WR1_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR2_DEFAULT { MODELPARAM_VALUE.C_WR2_DEFAULT PARAM_VALUE.C_WR2_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR2_DEFAULT}] ${MODELPARAM_VALUE.C_WR2_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR3_DEFAULT { MODELPARAM_VALUE.C_WR3_DEFAULT PARAM_VALUE.C_WR3_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR3_DEFAULT}] ${MODELPARAM_VALUE.C_WR3_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR4_DEFAULT { MODELPARAM_VALUE.C_WR4_DEFAULT PARAM_VALUE.C_WR4_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR4_DEFAULT}] ${MODELPARAM_VALUE.C_WR4_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR5_DEFAULT { MODELPARAM_VALUE.C_WR5_DEFAULT PARAM_VALUE.C_WR5_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR5_DEFAULT}] ${MODELPARAM_VALUE.C_WR5_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR6_DEFAULT { MODELPARAM_VALUE.C_WR6_DEFAULT PARAM_VALUE.C_WR6_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR6_DEFAULT}] ${MODELPARAM_VALUE.C_WR6_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR7_DEFAULT { MODELPARAM_VALUE.C_WR7_DEFAULT PARAM_VALUE.C_WR7_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR7_DEFAULT}] ${MODELPARAM_VALUE.C_WR7_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR8_DEFAULT { MODELPARAM_VALUE.C_WR8_DEFAULT PARAM_VALUE.C_WR8_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR8_DEFAULT}] ${MODELPARAM_VALUE.C_WR8_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR9_DEFAULT { MODELPARAM_VALUE.C_WR9_DEFAULT PARAM_VALUE.C_WR9_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR9_DEFAULT}] ${MODELPARAM_VALUE.C_WR9_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR10_DEFAULT { MODELPARAM_VALUE.C_WR10_DEFAULT PARAM_VALUE.C_WR10_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR10_DEFAULT}] ${MODELPARAM_VALUE.C_WR10_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR11_DEFAULT { MODELPARAM_VALUE.C_WR11_DEFAULT PARAM_VALUE.C_WR11_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR11_DEFAULT}] ${MODELPARAM_VALUE.C_WR11_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR12_DEFAULT { MODELPARAM_VALUE.C_WR12_DEFAULT PARAM_VALUE.C_WR12_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR12_DEFAULT}] ${MODELPARAM_VALUE.C_WR12_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR13_DEFAULT { MODELPARAM_VALUE.C_WR13_DEFAULT PARAM_VALUE.C_WR13_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR13_DEFAULT}] ${MODELPARAM_VALUE.C_WR13_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR14_DEFAULT { MODELPARAM_VALUE.C_WR14_DEFAULT PARAM_VALUE.C_WR14_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR14_DEFAULT}] ${MODELPARAM_VALUE.C_WR14_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR15_DEFAULT { MODELPARAM_VALUE.C_WR15_DEFAULT PARAM_VALUE.C_WR15_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR15_DEFAULT}] ${MODELPARAM_VALUE.C_WR15_DEFAULT} +} + diff --git a/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/bd/bd.tcl b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/component.xml b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/component.xml new file mode 100644 index 0000000..3affb02 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/component.xml @@ -0,0 +1,369 @@ + + + trenz.biz + user + axis_audio_pwm + 1.0 + + + S00_AXIS + + + + + + + TDATA + + + s00_axis_tdata + + + + + TVALID + + + s00_axis_tvalid + + + + + TREADY + + + s00_axis_tready + + + + + + WIZ_DATA_WIDTH + 32 + + + + + S00_AXIS_RST + + + + + + + RST + + + s00_axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + S00_AXIS_CLK + + + + + + + CLK + + + s00_axis_aclk + + + + + + ASSOCIATED_BUSIF + S00_AXIS + + + ASSOCIATED_RESET + s00_axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_audio_pwm_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + e37e5f7b + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_audio_pwm_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + e37e5f7b + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 85d97987 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + pwm_l_out + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + pwm_r_out + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_tdata + + in + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_SYS_FREQ + C Sys Freq + 150000000 + + + C_PWM_FREQ + C Pwm Freq + 100000 + + + + + + choice_list_6fc15197 + 32 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd + vhdlSource + + + hdl/axis_audio_pwm_v1_0.vhd + vhdlSource + CHECKSUM_b42f8d78 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/axis_audio_pwm_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_audio_pwm_v1_0.tcl + tclSource + CHECKSUM_8d217f22 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + AXI4-Stream Audio PWM v1.0 + + + Component_Name + axis_audio_pwm_v1_0 + + + C_SYS_FREQ + Clock Frequency + 150000000 + + + C_PWM_FREQ + PWM Frequency + 100000 + + + + + + virtex7 + artix7 + kintex7 + zynq + + + /AXI_Peripheral + /Digital_Signal_Processing/Modulation + /Embedded_Processing/AXI_Peripheral/Low_Speed_Peripheral + + AXI4-Stream Audio PWM v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 4 + + xilinx.com:user:axis_audio_pwm:1.0 + + 2016-04-01T12:30:24Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_audio_pwm_1.0 + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_audio_pwm_1.0 + + + + 2015.4.2 + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0.vhd b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0.vhd new file mode 100644 index 0000000..0d849c6 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0.vhd @@ -0,0 +1,86 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity axis_audio_pwm_v1_0 is +generic ( + C_SYS_FREQ : INTEGER := 150000000; + C_PWM_FREQ : INTEGER := 100000 -- Usually from 50 to 100 kHz +); +port ( + -- PWM Outs + pwm_l_out : out STD_LOGIC; + pwm_r_out : out STD_LOGIC; + -- Ports of Axi Slave Bus Interface S00_AXIS + s00_axis_aclk : in STD_LOGIC; + s00_axis_aresetn : in STD_LOGIC; + s00_axis_tready : out STD_LOGIC; + s00_axis_tdata : in STD_LOGIC_VECTOR(31 downto 0); + s00_axis_tvalid : in STD_LOGIC +); +end axis_audio_pwm_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_audio_pwm_v1_0 is +---------------------------------------------------------------------------------- +constant C_CNT_MAX : INTEGER := 32767; +constant C_CNT_MIN : INTEGER := -32767; +constant C_STEP : INTEGER := 131072 / (C_SYS_FREQ/C_PWM_FREQ); +---------------------------------------------------------------------------------- +signal left_ch_val : SIGNED(15 downto 0); -- Data latches +signal right_ch_val : SIGNED(15 downto 0); +signal pwm_cnt : SIGNED(15 downto 0); -- Reference signal +signal pwm_cnt_dir : STD_LOGIC; -- Saw direction +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +s00_axis_tready <= '1'; -- Always ready +-- Data latch +process(s00_axis_aclk) +begin + if(s00_axis_aclk = '1' and s00_axis_aclk'event)then + if(s00_axis_tvalid = '1')then + left_ch_val <= SIGNED(s00_axis_tdata(15 downto 0)); + right_ch_val <= SIGNED(s00_axis_tdata(31 downto 16)); + end if; + end if; +end process; + +-- PWM Coding +process(s00_axis_aclk) +begin + if(s00_axis_aclk = '1' and s00_axis_aclk'event)then + -- Triangle reference signal + if(pwm_cnt_dir = '0')then -- Up count + if(pwm_cnt >= TO_SIGNED((C_CNT_MAX - C_STEP),16))then + pwm_cnt_dir <= '1'; + pwm_cnt <= pwm_cnt - C_STEP; + else + pwm_cnt <= pwm_cnt + C_STEP; + end if; + else -- Down count + if(pwm_cnt <= TO_SIGNED((C_CNT_MIN + C_STEP),16))then + pwm_cnt_dir <= '0'; + pwm_cnt <= pwm_cnt + C_STEP; + else + pwm_cnt <= pwm_cnt - C_STEP; + end if; + end if; + -- Comparators + if(left_ch_val > pwm_cnt)then + pwm_l_out <= '1'; + else + pwm_l_out <= '0'; + end if; + if(right_ch_val > pwm_cnt)then + pwm_r_out <= '1'; + else + pwm_r_out <= '0'; + end if; + end if; +end process; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd new file mode 100644 index 0000000..227c142 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd @@ -0,0 +1,177 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity axis_audio_pwm_v1_0_S00_AXIS is + generic ( + -- Users to add parameters here + + -- User parameters ends + -- Do not modify the parameters beyond this line + + -- AXI4Stream sink: Data Width + C_S_AXIS_TDATA_WIDTH : integer := 32 + ); + port ( + -- Users to add ports here + + -- User ports ends + -- Do not modify the ports beyond this line + + -- AXI4Stream sink: Clock + S_AXIS_ACLK : in std_logic; + -- AXI4Stream sink: Reset + S_AXIS_ARESETN : in std_logic; + -- Ready to accept data in + S_AXIS_TREADY : out std_logic; + -- Data in + S_AXIS_TDATA : in std_logic_vector(C_S_AXIS_TDATA_WIDTH-1 downto 0); + -- Byte qualifier + S_AXIS_TSTRB : in std_logic_vector((C_S_AXIS_TDATA_WIDTH/8)-1 downto 0); + -- Indicates boundary of last packet + S_AXIS_TLAST : in std_logic; + -- Data is in valid + S_AXIS_TVALID : in std_logic + ); +end axis_audio_pwm_v1_0_S00_AXIS; + +architecture arch_imp of axis_audio_pwm_v1_0_S00_AXIS is + -- function called clogb2 that returns an integer which has the + -- value of the ceiling of the log base 2. + function clogb2 (bit_depth : integer) return integer is + variable depth : integer := bit_depth; + begin + if (depth = 0) then + return(0); + else + for clogb2 in 1 to bit_depth loop -- Works for up to 32 bit integers + if(depth <= 1) then + return(clogb2); + else + depth := depth / 2; + end if; + end loop; + end if; + end; + + -- Total number of input data. + constant NUMBER_OF_INPUT_WORDS : integer := 8; + -- bit_num gives the minimum number of bits needed to address 'NUMBER_OF_INPUT_WORDS' size of FIFO. + constant bit_num : integer := clogb2(NUMBER_OF_INPUT_WORDS-1); + -- Define the states of state machine + -- The control state machine oversees the writing of input streaming data to the FIFO, + -- and outputs the streaming data from the FIFO + type state is ( IDLE, -- This is the initial/idle state + WRITE_FIFO); -- In this state FIFO is written with the + -- input stream data S_AXIS_TDATA + signal axis_tready : std_logic; + -- State variable + signal mst_exec_state : state; + -- FIFO implementation signals + signal byte_index : integer; + -- FIFO write enable + signal fifo_wren : std_logic; + -- FIFO full flag + signal fifo_full_flag : std_logic; + -- FIFO write pointer + signal write_pointer : integer range 0 to bit_num-1 ; + -- sink has accepted all the streaming data and stored in FIFO + signal writes_done : std_logic; + + type BYTE_FIFO_TYPE is array (0 to (NUMBER_OF_INPUT_WORDS-1)) of std_logic_vector(((C_S_AXIS_TDATA_WIDTH/4)-1)downto 0); +begin + -- I/O Connections assignments + + S_AXIS_TREADY <= axis_tready; + -- Control state machine implementation + process(S_AXIS_ACLK) + begin + if (rising_edge (S_AXIS_ACLK)) then + if(S_AXIS_ARESETN = '0') then + -- Synchronous reset (active low) + mst_exec_state <= IDLE; + else + case (mst_exec_state) is + when IDLE => + -- The sink starts accepting tdata when + -- there tvalid is asserted to mark the + -- presence of valid streaming data + if (S_AXIS_TVALID = '1')then + mst_exec_state <= WRITE_FIFO; + else + mst_exec_state <= IDLE; + end if; + + when WRITE_FIFO => + -- When the sink has accepted all the streaming input data, + -- the interface swiches functionality to a streaming master + if (writes_done = '1') then + mst_exec_state <= IDLE; + else + -- The sink accepts and stores tdata + -- into FIFO + mst_exec_state <= WRITE_FIFO; + end if; + + when others => + mst_exec_state <= IDLE; + + end case; + end if; + end if; + end process; + -- AXI Streaming Sink + -- + -- The example design sink is always ready to accept the S_AXIS_TDATA until + -- the FIFO is not filled with NUMBER_OF_INPUT_WORDS number of input words. + axis_tready <= '1' when ((mst_exec_state = WRITE_FIFO) and (write_pointer <= NUMBER_OF_INPUT_WORDS-1)) else '0'; + + process(S_AXIS_ACLK) + begin + if (rising_edge (S_AXIS_ACLK)) then + if(S_AXIS_ARESETN = '0') then + write_pointer <= 0; + writes_done <= '0'; + else + if (write_pointer <= NUMBER_OF_INPUT_WORDS-1) then + if (fifo_wren = '1') then + -- write pointer is incremented after every write to the FIFO + -- when FIFO write signal is enabled. + write_pointer <= write_pointer + 1; + writes_done <= '0'; + end if; + if ((write_pointer = NUMBER_OF_INPUT_WORDS-1) or S_AXIS_TLAST = '1') then + -- reads_done is asserted when NUMBER_OF_INPUT_WORDS numbers of streaming data + -- has been written to the FIFO which is also marked by S_AXIS_TLAST(kept for optional usage). + writes_done <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- FIFO write enable generation + fifo_wren <= S_AXIS_TVALID and axis_tready; + + -- FIFO Implementation + FIFO_GEN: for byte_index in 0 to (C_S_AXIS_TDATA_WIDTH/8-1) generate + + signal stream_data_fifo : BYTE_FIFO_TYPE; + begin + -- Streaming input data is stored in FIFO + process(S_AXIS_ACLK) + begin + if (rising_edge (S_AXIS_ACLK)) then + if (fifo_wren = '1') then + stream_data_fifo(write_pointer) <= S_AXIS_TDATA((byte_index*8+7) downto (byte_index*8)); + end if; + end if; + end process; + + end generate FIFO_GEN; + + -- Add user logic here + + -- User logic ends + +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/xgui/axis_audio_pwm_v1_0.tcl b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/xgui/axis_audio_pwm_v1_0.tcl new file mode 100644 index 0000000..3fa319f --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_audio_pwm_1.0/xgui/axis_audio_pwm_v1_0.tcl @@ -0,0 +1,40 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_PWM_FREQ" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_SYS_FREQ" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_PWM_FREQ { PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to update C_PWM_FREQ when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_PWM_FREQ { PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to validate C_PWM_FREQ + return true +} + +proc update_PARAM_VALUE.C_SYS_FREQ { PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to update C_SYS_FREQ when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_SYS_FREQ { PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to validate C_SYS_FREQ + return true +} + + +proc update_MODELPARAM_VALUE.C_SYS_FREQ { MODELPARAM_VALUE.C_SYS_FREQ PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_SYS_FREQ}] ${MODELPARAM_VALUE.C_SYS_FREQ} +} + +proc update_MODELPARAM_VALUE.C_PWM_FREQ { MODELPARAM_VALUE.C_PWM_FREQ PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_PWM_FREQ}] ${MODELPARAM_VALUE.C_PWM_FREQ} +} + diff --git a/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/bd/bd.tcl b/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/component.xml b/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/component.xml new file mode 100644 index 0000000..e02e2b6 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/component.xml @@ -0,0 +1,515 @@ + + + trenz.biz + user + axis_fb_conv + 1.0 + + + S_AXIS + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + TUSER + + + s_axis_tuser + + + + + + WIZ.DATA_WIDTH + 32 + + + + + video_out + + + + + + + TDATA + + + video_out_tdata + + + + + TLAST + + + video_out_tlast + + + + + TVALID + + + video_out_tvalid + + + + + TREADY + + + video_out_tready + + + + + TUSER + + + video_out_tuser + + + + + + WIZ.DATA_WIDTH + 32 + + + + + S_AXIS_RST + + + + + + + RST + + + s_axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + S_AXIS_CLK + + + + + + + CLK + + + s_axis_aclk + + + + + + ASSOCIATED_BUSIF + S_AXIS:video_out + + + ASSOCIATED_RESET + s_axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_fb_conv_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + c2b53453 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_fb_conv_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + c2b53453 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + e24204be + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + s_axis_tdata + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_aclk + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_aresetn + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tdata + + out + + 23 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tlast + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tuser + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_FB_MODE + C Fb Mode + 1 + + + + false + + + + + + + + + choices_0 + 32 + + + choices_1 + 32 + + + choices_2 + 0 + 1 + + + + + xilinx_vhdlsynthesis_view_fileset + + src/axis_fb_conv_v1_0.vhd + vhdlSource + CHECKSUM_6e7698d9 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + src/axis_fb_conv_v1_0.vhd + vhdlSource + + + + xilinx_xpgui_view_fileset + + xgui/axis_fb_conv_v1_0.tcl + tclSource + XGUI_VERSION_2 + CHECKSUM_bc827756 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + axis_fb_conv_v1.0 + + + Component_Name + axis_fb_conv_v1_0 + + + C_FB_MODE + Framebuffer Mode + 1 + + + + false + + + + + + + + + virtex7 + qvirtex7 + kintex7 + kintex7l + qkintex7 + qkintex7l + artix7 + artix7l + aartix7 + qartix7 + zynq + qzynq + azynq + virtexu + kintexu + + + AXI_Peripheral + + axis_fb_conv_v1.0 + Trenz Electronic GmbH + 5 + 2015-06-04T13:44:40Z + + b:/cores/2014.4/ip/axis_fb_conv_1.0 + + + + 2014.4 + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/src/axis_fb_conv_v1_0.vhd b/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/src/axis_fb_conv_v1_0.vhd new file mode 100644 index 0000000..6177079 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/src/axis_fb_conv_v1_0.vhd @@ -0,0 +1,78 @@ +---------------------------------------------------------------------------------------------------- +--! @file axis_fb_conv_v1_0.vhd +--! @brief Simple remapper to convert 16 or 32 bit AXI4-Stream into Xilinx 24 bit Video Stream +--! @author Antti Lukats +--! @version 1.0 +--! @date 2015 +--! @copyright Copyright 2015 Trenz Electronic GmbH +--! @license BSD +--! @pre Vivado 2014.4+ +--! @pre Xilinx VDMA configured with 16 or 32 bit output +---------------------------------------------------------------------------------------------------- + +--! Use standard library +library ieee; +--! Use logic elements + use ieee.std_logic_1164.all; + +--! AXI4-Stream Remapper to be used with: +--! Linux Simple Frame Buffer driver, +--! Xilinx VDMA and Xilinx AXI4-stream to Video Out IP Cores. +entity axis_fb_conv_v1_0 is + generic ( + --! Format: The format of the framebuffer surface. Valid values are: + --! r5g6b5 (16-bit pixels, d[15:11]=r, d[10:5]=g, d[4:0]=b). + --! a8b8g8r8 (32-bit pixels, d[31:24]=a, d[23:16]=b, d[15:8]=g, d[7:0]=r). + C_FB_MODE : integer range 0 to 1 := 1 --! Mode is set as: 0 = r5g6b5, 1 = a8b8g8r8 + ); + port ( + s_axis_aclk : in std_logic; --! not used + s_axis_aresetn : in std_logic; --! not used + --------------------------------------------------------------------- + s_axis_tready : out std_logic; --! direct bypass + s_axis_tdata : in std_logic_vector(C_FB_MODE*16+16-1 downto 0); --! Pixel data from VDMA IP Core + s_axis_tlast : in std_logic; --! end of line: direct bypass + s_axis_tuser : in std_logic; --! SOF: direct bypass + s_axis_tvalid : in std_logic; --! direct bypass + --------------------------------------------------------------------- + video_out_tvalid : out std_logic; --! direct from input Stream TVALID + video_out_tdata : out std_logic_vector(23 downto 0); --! Remapped TDATA + video_out_tlast : out std_logic; --! direct from input Stream TLAST + video_out_tuser : out std_logic; --! direct from input Stream TUSER + video_out_tready : in std_logic --! direct to input Stream TREADY + ); +end axis_fb_conv_v1_0; + +--! Simple remapper, only function is remap, there is no other logic used +architecture arch_imp of axis_fb_conv_v1_0 is + +signal r : std_logic_vector(7 downto 0) := (others => '0'); --! Red Component +signal g : std_logic_vector(7 downto 0) := (others => '0'); --! Green Component +signal b : std_logic_vector(7 downto 0) := (others => '0'); --! Blue Component +signal a : std_logic_vector(7 downto 0) := (others => '0'); --! Transparency, not used currently + +begin + video_out_tvalid <= s_axis_tvalid; -- Direct bypass + video_out_tlast <= s_axis_tlast; -- Direct bypass + video_out_tuser <= s_axis_tuser; -- Direct bypass + s_axis_tready <= video_out_tready; -- Direct bypass + +-- r5g6b5 (16-bit pixels, d[15:11]=r, d[10:5]=g, d[4:0]=b). +Video_16_bit_Gen: if C_FB_MODE = 0 generate + r(7 downto 3) <= s_axis_tdata(15 downto 11); + g(7 downto 2) <= s_axis_tdata(10 downto 5); + b(7 downto 3) <= s_axis_tdata(4 downto 0); +end generate Video_16_bit_Gen; + +-- a8b8g8r8 (32-bit pixels, d[31:24]=a, d[23:16]=b, d[15:8]=g, d[7:0]=r). +Video_32_bit_Gen: if C_FB_MODE = 1 generate + b(7 downto 0) <= s_axis_tdata(23 downto 16); + g(7 downto 0) <= s_axis_tdata(15 downto 8); + r(7 downto 0) <= s_axis_tdata(7 downto 0); +end generate Video_32_bit_Gen; + +-- construct Xilinx Video RGB format +-- R B G, see PG044 +video_out_tdata(23 downto 0) <= r & b & g; + +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/xgui/axis_fb_conv_v1_0.tcl b/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/xgui/axis_fb_conv_v1_0.tcl new file mode 100644 index 0000000..a29491b --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_fb_conv_1.0/xgui/axis_fb_conv_v1_0.tcl @@ -0,0 +1,25 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_FB_MODE" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_FB_MODE { PARAM_VALUE.C_FB_MODE } { + # Procedure called to update C_FB_MODE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_FB_MODE { PARAM_VALUE.C_FB_MODE } { + # Procedure called to validate C_FB_MODE + return true +} + + +proc update_MODELPARAM_VALUE.C_FB_MODE { MODELPARAM_VALUE.C_FB_MODE PARAM_VALUE.C_FB_MODE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_FB_MODE}] ${MODELPARAM_VALUE.C_FB_MODE} +} + diff --git a/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/component.xml b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/component.xml new file mode 100644 index 0000000..3956dca --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/component.xml @@ -0,0 +1,586 @@ + + + trenz.biz + user + axis_raw_demosaic + 1.0 + + + S_AXIS + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + TUSER + + + s_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + M_AXIS + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + TUSER + + + m_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + axis_aresetn + + + + + + + RST + + + axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + axis_aclk + + + + + + + CLK + + + axis_aclk + + + + + + ASSOCIATED_BUSIF + S_AXIS:M_AXIS + + + ASSOCIATED_RESET + axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_raw_demosaic_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 340c8292 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_raw_demosaic_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + 340c8292 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 766ecffa + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + colors_mode + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + m_axis_tdata + + out + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tdata + + in + + 15 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_RAW_WIDTH + C Raw Width + 10 + + + C_MODE + C Mode + 1 + + + C_IN_TYPE + C In Type + 1 + + + C_COLOR_POS + C Color Pos + 0 + + + + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_list_f5adc799 + 10 + 8 + + + choice_pairs_719c03b1 + 1 + 4 + + + choice_pairs_8aadb9bc + 0 + 1 + 2 + + + choice_pairs_e37d2356 + 0 + 1 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/dualport_ram.vhd + vhdlSource + + + hdl/gamma_rom.vhd + vhdlSource + + + hdl/axis_raw_demosaic_v1_0.vhd + vhdlSource + CHECKSUM_d52eb58c + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/dualport_ram.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/gamma_rom.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/axis_raw_demosaic_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_raw_demosaic_v1_0.tcl + tclSource + CHECKSUM_6e4393c6 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + RAW format demosaic + + + Component_Name + axis_raw_demosaic_v1_0 + + + C_RAW_WIDTH + Raw Width + 10 + + + C_MODE + Mode + 1 + + + C_IN_TYPE + Input Type + 1 + + + C_COLOR_POS + Colors Position + 0 + + + + + + virtex7 + artix7 + kintex7 + qzynq + zynq + + + /AXI_Peripheral + /Video_&_Image_Processing + + RAW Demosaic v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 20 + + xilinx.com:user:axis_raw_demosaic:1.0 + + 2017-05-18T06:15:26Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_raw_demosaic_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_raw_demosaic_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/axis_raw_demosaic_v1_0.vhd b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/axis_raw_demosaic_v1_0.vhd new file mode 100644 index 0000000..f7b861b --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/axis_raw_demosaic_v1_0.vhd @@ -0,0 +1,252 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity axis_raw_demosaic_v1_0 is +generic ( + C_MODE : integer range 0 to 1 := 1; + C_COLOR_POS : integer range 0 to 2 := 0; + C_IN_TYPE : integer range 1 to 4 := 1; + C_RAW_WIDTH : integer := 10 +); +port ( + axis_aclk : in STD_LOGIC; + axis_aresetn : in STD_LOGIC; + + colors_mode : in STD_LOGIC; + + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_IN_TYPE*16-1 downto 0); + s_axis_tuser : in STD_LOGIC; + s_axis_tlast : in STD_LOGIC; + s_axis_tvalid : in STD_LOGIC; + + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_IN_TYPE*32-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC +); +end axis_raw_demosaic_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_raw_demosaic_v1_0 is +---------------------------------------------------------------------------------- +component dualport_ram is +port ( + clk : in STD_LOGIC; + wea : in STD_LOGIC; + addra : in STD_LOGIC_VECTOR(10 downto 0); + addrb : in STD_LOGIC_VECTOR(10 downto 0); + dia : in STD_LOGIC_VECTOR(9 downto 0); + dob : out STD_LOGIC_VECTOR(9 downto 0) +); +end component; + +component gamma_rom is +port( + addra : in STD_LOGIC_VECTOR(9 downto 0); + clka : in STD_LOGIC; + douta : out STD_LOGIC_VECTOR(7 downto 0) +); +end component; +---------------------------------------------------------------------------------- +signal tx_alpha : STD_LOGIC_VECTOR(7 downto 0); +signal tx_blue : STD_LOGIC_VECTOR(7 downto 0); +signal tx_green : STD_LOGIC_VECTOR(7 downto 0); +signal tx_red : STD_LOGIC_VECTOR(7 downto 0); +signal x_cnt : UNSIGNED(15 downto 0); +signal y_cnt : UNSIGNED(15 downto 0); +type sm_state_type is (ST_IDLE, ST_PROCESS, ST_SEND); +signal sm_state : sm_state_type := ST_IDLE; +signal up_pixel_data : STD_LOGIC_VECTOR(C_RAW_WIDTH-1 downto 0); +signal pixel_data : STD_LOGIC_VECTOR(C_RAW_WIDTH-1 downto 0); +signal position : STD_LOGIC_VECTOR(1 downto 0); +signal tx_valid : STD_LOGIC; +signal tx_user : STD_LOGIC; +signal tx_last : STD_LOGIC; +signal x_wr_addr : UNSIGNED(15 downto 0); +signal x_rd_addr : UNSIGNED(15 downto 0); +signal ram_write : STD_LOGIC; +signal ram_wr_addr : STD_LOGIC_VECTOR(10 downto 0); +signal ram_rd_addr : STD_LOGIC_VECTOR(10 downto 0); +signal ram_wr_data : STD_LOGIC_VECTOR( 9 downto 0); +signal ram_rd_data : STD_LOGIC_VECTOR( 9 downto 0); +type raw_pixel is array (3 downto 0) of STD_LOGIC_VECTOR(C_RAW_WIDTH-1 downto 0); +signal pixel : raw_pixel; +type std_pixel is array (3 downto 0) of STD_LOGIC_VECTOR(7 downto 0); +signal pixel_gamma : std_pixel; +signal colors_mode_i : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +ram_wr_addr <= STD_LOGIC_VECTOR(x_wr_addr(10 downto 0)); +ram_rd_addr <= STD_LOGIC_VECTOR(x_rd_addr(10 downto 0)); +ram_wr_data <= pixel(0); +up_pixel_data <= ram_rd_data; +pixel_data <= s_axis_tdata(C_RAW_WIDTH-1 downto 0); +---------------------------------------------------------------------------------- +ram_inst: dualport_ram +port map( + clk => axis_aclk, + wea => ram_write, + addra => ram_wr_addr, + addrb => ram_rd_addr, + dia => ram_wr_data, + dob => ram_rd_data +); +---------------------------------------------------------------------------------- +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_state is + when ST_IDLE => + if(s_axis_tvalid = '1')then + sm_state <= ST_PROCESS; + pixel(0) <= pixel_data; + pixel(1) <= pixel(0); + pixel(2) <= up_pixel_data; + pixel(3) <= pixel(2); + tx_user <= s_axis_tuser; + tx_last <= s_axis_tlast; + x_wr_addr <= x_cnt; + ram_write <= '1'; + position <= y_cnt(0) & x_cnt(0); + if(s_axis_tlast = '1')then + x_cnt <= (others => '0'); + x_rd_addr <= (others => '0'); + else + x_cnt <= x_cnt + 1; + x_rd_addr <= x_cnt + 1; + end if; + if(s_axis_tuser = '1')then + y_cnt <= (others => '0'); + elsif(s_axis_tlast = '1')then + y_cnt <= y_cnt + 1; + end if; + else + ram_write <= '0'; + end if; + when ST_PROCESS => + ram_write <= '0'; + sm_state <= ST_SEND; + when ST_SEND => + if(m_axis_tready = '1')then + if(s_axis_tvalid = '0')then + sm_state <= ST_IDLE; + ram_write <= '0'; + else + sm_state <= ST_PROCESS; + pixel(0) <= pixel_data; + pixel(1) <= pixel(0); + pixel(2) <= up_pixel_data; + pixel(3) <= pixel(2); + tx_user <= s_axis_tuser; + tx_last <= s_axis_tlast; + x_wr_addr <= x_cnt; + ram_write <= '1'; + position <= y_cnt(0) & x_cnt(0); + if(s_axis_tlast = '1')then + x_cnt <= (others => '0'); + x_rd_addr <= (others => '0'); + else + x_cnt <= x_cnt + 1; + x_rd_addr <= x_cnt + 1; + end if; + if(s_axis_tuser = '1')then + y_cnt <= (others => '0'); + elsif(s_axis_tlast = '1')then + y_cnt <= y_cnt + 1; + end if; + end if; + end if; + end case; + end if; +end process; +---------------------------------------------------------------------------------- +gamma_rom_gen: for i in 0 to 3 generate +begin + pa_gamma_inst: gamma_rom + port map( + addra => pixel(i), + clka => axis_aclk, + douta => pixel_gamma(i) + ); +end generate; +---------------------------------------------------------------------------------- +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + if(C_COLOR_POS = 0)then + colors_mode_i <= '0'; + elsif(C_COLOR_POS = 1)then + colors_mode_i <= '1'; + else -- C_COLOR_POS = 2 + colors_mode_i <= colors_mode; + end if; + end if; +end process; +---------------------------------------------------------------------------------- +tx_alpha <= (others => '0'); +-- Demosaic (Color) +demosaic_gen: if C_MODE = 1 generate +begin + + process(sm_state, m_axis_tready) + begin + case sm_state is + when ST_IDLE => s_axis_tready <= '1'; + when ST_PROCESS => s_axis_tready <= '0'; + when ST_SEND => s_axis_tready <= m_axis_tready; + end case; + end process; + + m_axis_tvalid <= '1' when (sm_state = ST_SEND) else '0'; + m_axis_tuser <= tx_user; + m_axis_tlast <= tx_last; + + process(position, tx_alpha, pixel_gamma, colors_mode_i) + begin + if(colors_mode_i = '0')then + case position is + when "01" => m_axis_tdata <= tx_alpha & pixel_gamma(1) & pixel_gamma(0) & pixel_gamma(2); + when "00" => m_axis_tdata <= tx_alpha & pixel_gamma(0) & pixel_gamma(1) & pixel_gamma(3); + when "11" => m_axis_tdata <= tx_alpha & pixel_gamma(3) & pixel_gamma(1) & pixel_gamma(0); + when "10" => m_axis_tdata <= tx_alpha & pixel_gamma(2) & pixel_gamma(0) & pixel_gamma(1); + when others => null; + end case; + else + case position is + when "01" => m_axis_tdata <= tx_alpha & pixel_gamma(2) & pixel_gamma(0) & pixel_gamma(1); + when "00" => m_axis_tdata <= tx_alpha & pixel_gamma(3) & pixel_gamma(1) & pixel_gamma(0); + when "11" => m_axis_tdata <= tx_alpha & pixel_gamma(0) & pixel_gamma(1) & pixel_gamma(3); + when "10" => m_axis_tdata <= tx_alpha & pixel_gamma(1) & pixel_gamma(0) & pixel_gamma(2); + when others => null; + end case; + end if; + end process; + +end generate; +---------------------------------------------------------------------------------- +-- Bypass (Raw grayscale) +bypass_gen: if C_MODE = 0 generate +begin + s_axis_tready <= m_axis_tready; + m_axis_tvalid <= s_axis_tvalid; + m_axis_tuser <= s_axis_tuser; + m_axis_tlast <= s_axis_tlast; + data_gen: for i in 0 to C_IN_TYPE-1 generate + begin + m_axis_tdata(i*32+31 downto i*32) <= x"00" & + s_axis_tdata(i*16+9 downto i*16+2) & + s_axis_tdata(i*16+9 downto i*16+2) & + s_axis_tdata(i*16+9 downto i*16+2); + end generate; +end generate; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/dualport_ram.vhd b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/dualport_ram.vhd new file mode 100644 index 0000000..85042bc --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/dualport_ram.vhd @@ -0,0 +1,39 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.STD_LOGIC_unsigned.all; +---------------------------------------------------------------------------------- +entity dualport_ram is +port ( + clk : in STD_LOGIC; + wea : in STD_LOGIC; + addra : in STD_LOGIC_VECTOR(10 downto 0); + addrb : in STD_LOGIC_VECTOR(10 downto 0); + dia : in STD_LOGIC_VECTOR(9 downto 0); + dob : out STD_LOGIC_VECTOR(9 downto 0) +); +end dualport_ram; +---------------------------------------------------------------------------------- +architecture dualport_ram_arch of dualport_ram is +type ram_type is array (2047 downto 0) of STD_LOGIC_VECTOR (9 downto 0); +signal ram : ram_type; +---------------------------------------------------------------------------------- +attribute block_ram : boolean; +attribute block_ram of ram : signal is TRUE; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process (clk) +begin + if (clk'event and clk = '1') then + if (wea = '1') then + ram(conv_integer(addra)) <= dia; + end if; + dob <= ram(conv_integer(addrb)); + end if; +end process; +---------------------------------------------------------------------------------- +end dualport_ram_arch; diff --git a/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/gamma_rom.vhd b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/gamma_rom.vhd new file mode 100644 index 0000000..fc84945 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/hdl/gamma_rom.vhd @@ -0,0 +1,98 @@ +---------------------------------------------------------------------------------- +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use ieee.STD_LOGIC_arith.all; +use ieee.STD_LOGIC_unsigned.all; +---------------------------------------------------------------------------------- +entity gamma_rom is +port( + addra : in STD_LOGIC_VECTOR(9 downto 0); + clka : in STD_LOGIC; + douta : out STD_LOGIC_VECTOR(7 downto 0) +); +end gamma_rom; +---------------------------------------------------------------------------------- +architecture Behavioral of gamma_rom is +---------------------------------------------------------------------------------- +type rom_type is array (1023 downto 0) of std_logic_vector (7 downto 0); +signal rom : rom_type := ( +x"ff", x"ff", x"ff", x"ff", x"fe", x"fe", x"fe", x"fe", x"fe", x"fe", x"fe", x"fd", x"fd", x"fd", x"fd", x"fd", +x"fd", x"fd", x"fc", x"fc", x"fc", x"fc", x"fc", x"fc", x"fc", x"fc", x"fb", x"fb", x"fb", x"fb", x"fb", x"fb", +x"fb", x"fa", x"fa", x"fa", x"fa", x"fa", x"fa", x"fa", x"f9", x"f9", x"f9", x"f9", x"f9", x"f9", x"f9", x"f8", +x"f8", x"f8", x"f8", x"f8", x"f8", x"f8", x"f7", x"f7", x"f7", x"f7", x"f7", x"f7", x"f7", x"f6", x"f6", x"f6", +x"f6", x"f6", x"f6", x"f6", x"f5", x"f5", x"f5", x"f5", x"f5", x"f5", x"f5", x"f4", x"f4", x"f4", x"f4", x"f4", +x"f4", x"f4", x"f3", x"f3", x"f3", x"f3", x"f3", x"f3", x"f3", x"f2", x"f2", x"f2", x"f2", x"f2", x"f2", x"f2", +x"f1", x"f1", x"f1", x"f1", x"f1", x"f1", x"f1", x"f0", x"f0", x"f0", x"f0", x"f0", x"f0", x"f0", x"ef", x"ef", +x"ef", x"ef", x"ef", x"ef", x"ef", x"ee", x"ee", x"ee", x"ee", x"ee", x"ee", x"ed", x"ed", x"ed", x"ed", x"ed", +x"ed", x"ed", x"ec", x"ec", x"ec", x"ec", x"ec", x"ec", x"ec", x"eb", x"eb", x"eb", x"eb", x"eb", x"eb", x"eb", +x"ea", x"ea", x"ea", x"ea", x"ea", x"ea", x"e9", x"e9", x"e9", x"e9", x"e9", x"e9", x"e9", x"e8", x"e8", x"e8", +x"e8", x"e8", x"e8", x"e8", x"e7", x"e7", x"e7", x"e7", x"e7", x"e7", x"e7", x"e6", x"e6", x"e6", x"e6", x"e6", +x"e6", x"e5", x"e5", x"e5", x"e5", x"e5", x"e5", x"e5", x"e4", x"e4", x"e4", x"e4", x"e4", x"e4", x"e3", x"e3", +x"e3", x"e3", x"e3", x"e3", x"e3", x"e2", x"e2", x"e2", x"e2", x"e2", x"e2", x"e2", x"e1", x"e1", x"e1", x"e1", +x"e1", x"e1", x"e0", x"e0", x"e0", x"e0", x"e0", x"e0", x"e0", x"df", x"df", x"df", x"df", x"df", x"df", x"de", +x"de", x"de", x"de", x"de", x"de", x"de", x"dd", x"dd", x"dd", x"dd", x"dd", x"dd", x"dc", x"dc", x"dc", x"dc", +x"dc", x"dc", x"db", x"db", x"db", x"db", x"db", x"db", x"db", x"da", x"da", x"da", x"da", x"da", x"da", x"d9", +x"d9", x"d9", x"d9", x"d9", x"d9", x"d9", x"d8", x"d8", x"d8", x"d8", x"d8", x"d8", x"d7", x"d7", x"d7", x"d7", +x"d7", x"d7", x"d6", x"d6", x"d6", x"d6", x"d6", x"d6", x"d5", x"d5", x"d5", x"d5", x"d5", x"d5", x"d5", x"d4", +x"d4", x"d4", x"d4", x"d4", x"d4", x"d3", x"d3", x"d3", x"d3", x"d3", x"d3", x"d2", x"d2", x"d2", x"d2", x"d2", +x"d2", x"d1", x"d1", x"d1", x"d1", x"d1", x"d1", x"d0", x"d0", x"d0", x"d0", x"d0", x"d0", x"d0", x"cf", x"cf", +x"cf", x"cf", x"cf", x"cf", x"ce", x"ce", x"ce", x"ce", x"ce", x"ce", x"cd", x"cd", x"cd", x"cd", x"cd", x"cd", +x"cc", x"cc", x"cc", x"cc", x"cc", x"cc", x"cb", x"cb", x"cb", x"cb", x"cb", x"cb", x"ca", x"ca", x"ca", x"ca", +x"ca", x"ca", x"c9", x"c9", x"c9", x"c9", x"c9", x"c9", x"c8", x"c8", x"c8", x"c8", x"c8", x"c8", x"c7", x"c7", +x"c7", x"c7", x"c7", x"c7", x"c6", x"c6", x"c6", x"c6", x"c6", x"c6", x"c5", x"c5", x"c5", x"c5", x"c5", x"c5", +x"c4", x"c4", x"c4", x"c4", x"c4", x"c3", x"c3", x"c3", x"c3", x"c3", x"c3", x"c2", x"c2", x"c2", x"c2", x"c2", +x"c2", x"c1", x"c1", x"c1", x"c1", x"c1", x"c1", x"c0", x"c0", x"c0", x"c0", x"c0", x"c0", x"bf", x"bf", x"bf", +x"bf", x"bf", x"be", x"be", x"be", x"be", x"be", x"be", x"bd", x"bd", x"bd", x"bd", x"bd", x"bd", x"bc", x"bc", +x"bc", x"bc", x"bc", x"bb", x"bb", x"bb", x"bb", x"bb", x"bb", x"ba", x"ba", x"ba", x"ba", x"ba", x"ba", x"b9", +x"b9", x"b9", x"b9", x"b9", x"b8", x"b8", x"b8", x"b8", x"b8", x"b8", x"b7", x"b7", x"b7", x"b7", x"b7", x"b6", +x"b6", x"b6", x"b6", x"b6", x"b6", x"b5", x"b5", x"b5", x"b5", x"b5", x"b4", x"b4", x"b4", x"b4", x"b4", x"b4", +x"b3", x"b3", x"b3", x"b3", x"b3", x"b2", x"b2", x"b2", x"b2", x"b2", x"b2", x"b1", x"b1", x"b1", x"b1", x"b1", +x"b0", x"b0", x"b0", x"b0", x"b0", x"af", x"af", x"af", x"af", x"af", x"af", x"ae", x"ae", x"ae", x"ae", x"ae", +x"ad", x"ad", x"ad", x"ad", x"ad", x"ac", x"ac", x"ac", x"ac", x"ac", x"ac", x"ab", x"ab", x"ab", x"ab", x"ab", +x"aa", x"aa", x"aa", x"aa", x"aa", x"a9", x"a9", x"a9", x"a9", x"a9", x"a8", x"a8", x"a8", x"a8", x"a8", x"a7", +x"a7", x"a7", x"a7", x"a7", x"a7", x"a6", x"a6", x"a6", x"a6", x"a6", x"a5", x"a5", x"a5", x"a5", x"a5", x"a4", +x"a4", x"a4", x"a4", x"a4", x"a3", x"a3", x"a3", x"a3", x"a3", x"a2", x"a2", x"a2", x"a2", x"a2", x"a1", x"a1", +x"a1", x"a1", x"a1", x"a0", x"a0", x"a0", x"a0", x"a0", x"9f", x"9f", x"9f", x"9f", x"9f", x"9e", x"9e", x"9e", +x"9e", x"9e", x"9d", x"9d", x"9d", x"9d", x"9d", x"9c", x"9c", x"9c", x"9c", x"9c", x"9b", x"9b", x"9b", x"9b", +x"9a", x"9a", x"9a", x"9a", x"9a", x"99", x"99", x"99", x"99", x"99", x"98", x"98", x"98", x"98", x"98", x"97", +x"97", x"97", x"97", x"97", x"96", x"96", x"96", x"96", x"95", x"95", x"95", x"95", x"95", x"94", x"94", x"94", +x"94", x"94", x"93", x"93", x"93", x"93", x"92", x"92", x"92", x"92", x"92", x"91", x"91", x"91", x"91", x"90", +x"90", x"90", x"90", x"90", x"8f", x"8f", x"8f", x"8f", x"8f", x"8e", x"8e", x"8e", x"8e", x"8d", x"8d", x"8d", +x"8d", x"8d", x"8c", x"8c", x"8c", x"8c", x"8b", x"8b", x"8b", x"8b", x"8b", x"8a", x"8a", x"8a", x"8a", x"89", +x"89", x"89", x"89", x"88", x"88", x"88", x"88", x"88", x"87", x"87", x"87", x"87", x"86", x"86", x"86", x"86", +x"85", x"85", x"85", x"85", x"85", x"84", x"84", x"84", x"84", x"83", x"83", x"83", x"83", x"82", x"82", x"82", +x"82", x"81", x"81", x"81", x"81", x"81", x"80", x"80", x"80", x"80", x"7f", x"7f", x"7f", x"7f", x"7e", x"7e", +x"7e", x"7e", x"7d", x"7d", x"7d", x"7d", x"7c", x"7c", x"7c", x"7c", x"7b", x"7b", x"7b", x"7b", x"7a", x"7a", +x"7a", x"7a", x"79", x"79", x"79", x"79", x"78", x"78", x"78", x"78", x"77", x"77", x"77", x"77", x"76", x"76", +x"76", x"76", x"75", x"75", x"75", x"75", x"74", x"74", x"74", x"74", x"73", x"73", x"73", x"72", x"72", x"72", +x"72", x"71", x"71", x"71", x"71", x"70", x"70", x"70", x"70", x"6f", x"6f", x"6f", x"6e", x"6e", x"6e", x"6e", +x"6d", x"6d", x"6d", x"6d", x"6c", x"6c", x"6c", x"6b", x"6b", x"6b", x"6b", x"6a", x"6a", x"6a", x"6a", x"69", +x"69", x"69", x"68", x"68", x"68", x"68", x"67", x"67", x"67", x"66", x"66", x"66", x"66", x"65", x"65", x"65", +x"64", x"64", x"64", x"63", x"63", x"63", x"63", x"62", x"62", x"62", x"61", x"61", x"61", x"61", x"60", x"60", +x"60", x"5f", x"5f", x"5f", x"5e", x"5e", x"5e", x"5d", x"5d", x"5d", x"5d", x"5c", x"5c", x"5c", x"5b", x"5b", +x"5b", x"5a", x"5a", x"5a", x"59", x"59", x"59", x"58", x"58", x"58", x"57", x"57", x"57", x"56", x"56", x"56", +x"55", x"55", x"55", x"54", x"54", x"54", x"53", x"53", x"53", x"52", x"52", x"52", x"51", x"51", x"51", x"50", +x"50", x"50", x"4f", x"4f", x"4f", x"4e", x"4e", x"4e", x"4d", x"4d", x"4c", x"4c", x"4c", x"4b", x"4b", x"4b", +x"4a", x"4a", x"4a", x"49", x"49", x"48", x"48", x"48", x"47", x"47", x"46", x"46", x"46", x"45", x"45", x"44", +x"44", x"44", x"43", x"43", x"42", x"42", x"42", x"41", x"41", x"40", x"40", x"40", x"3f", x"3f", x"3e", x"3e", +x"3d", x"3d", x"3d", x"3c", x"3c", x"3b", x"3b", x"3a", x"3a", x"39", x"39", x"39", x"38", x"38", x"37", x"37", +x"36", x"36", x"35", x"35", x"34", x"34", x"33", x"33", x"32", x"32", x"31", x"31", x"30", x"30", x"2f", x"2f", +x"2e", x"2e", x"2d", x"2c", x"2c", x"2b", x"2b", x"2a", x"2a", x"29", x"28", x"28", x"27", x"26", x"26", x"25", +x"25", x"24", x"23", x"23", x"22", x"21", x"20", x"20", x"1f", x"1e", x"1d", x"1d", x"1c", x"1b", x"1a", x"19", +x"18", x"18", x"17", x"16", x"15", x"13", x"12", x"11", x"10", x"0f", x"0d", x"0c", x"0a", x"08", x"05", x"00" +); +attribute rom_style : string; +attribute rom_style of rom : signal is "block"; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process (clka) +begin + if rising_edge(clka) then + douta <= rom(conv_integer(addra)); + end if; +end process; +---------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/xgui/axis_raw_demosaic_v1_0.tcl b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/xgui/axis_raw_demosaic_v1_0.tcl new file mode 100644 index 0000000..b4dad42 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_demosaic_1.0/xgui/axis_raw_demosaic_v1_0.tcl @@ -0,0 +1,70 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_MODE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_IN_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_RAW_WIDTH" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_COLOR_POS" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_COLOR_POS { PARAM_VALUE.C_COLOR_POS } { + # Procedure called to update C_COLOR_POS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_COLOR_POS { PARAM_VALUE.C_COLOR_POS } { + # Procedure called to validate C_COLOR_POS + return true +} + +proc update_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to update C_IN_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to validate C_IN_TYPE + return true +} + +proc update_PARAM_VALUE.C_MODE { PARAM_VALUE.C_MODE } { + # Procedure called to update C_MODE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_MODE { PARAM_VALUE.C_MODE } { + # Procedure called to validate C_MODE + return true +} + +proc update_PARAM_VALUE.C_RAW_WIDTH { PARAM_VALUE.C_RAW_WIDTH } { + # Procedure called to update C_RAW_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RAW_WIDTH { PARAM_VALUE.C_RAW_WIDTH } { + # Procedure called to validate C_RAW_WIDTH + return true +} + + +proc update_MODELPARAM_VALUE.C_RAW_WIDTH { MODELPARAM_VALUE.C_RAW_WIDTH PARAM_VALUE.C_RAW_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RAW_WIDTH}] ${MODELPARAM_VALUE.C_RAW_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_MODE { MODELPARAM_VALUE.C_MODE PARAM_VALUE.C_MODE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_MODE}] ${MODELPARAM_VALUE.C_MODE} +} + +proc update_MODELPARAM_VALUE.C_IN_TYPE { MODELPARAM_VALUE.C_IN_TYPE PARAM_VALUE.C_IN_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IN_TYPE}] ${MODELPARAM_VALUE.C_IN_TYPE} +} + +proc update_MODELPARAM_VALUE.C_COLOR_POS { MODELPARAM_VALUE.C_COLOR_POS PARAM_VALUE.C_COLOR_POS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_COLOR_POS}] ${MODELPARAM_VALUE.C_COLOR_POS} +} + diff --git a/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/bd/bd.tcl b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/component.xml b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/component.xml new file mode 100644 index 0000000..7574af6 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/component.xml @@ -0,0 +1,524 @@ + + + trenz.biz + user + axis_raw_unpack + 1.0 + + + S_AXIS + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + TUSER + + + s_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + M_AXIS + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + TUSER + + + m_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + axis_aresetn + + + + + + + RST + + + axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + axis_aclk + + + + + + + CLK + + + axis_aclk + + + + + + ASSOCIATED_BUSIF + S_AXIS:M_AXIS + + + ASSOCIATED_RESET + axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_raw_unpack_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 71a3a0ad + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_raw_unpack_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + 71a3a0ad + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 18ee627c + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tdata + + in + + 15 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tdata + + out + + 63 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + + C_IMP_TYPE + C Imp Type + 0 + + + C_OUT_TYPE + C Out Type + 4 + + + + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_pairs_719c03b1 + 1 + 4 + + + choice_pairs_a91bb82a + 0 + 1 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/srl_fifo.vhd + vhdlSource + + + hdl/axis_raw_unpack_v1_0.vhd + vhdlSource + CHECKSUM_4d998fbe + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/srl_fifo.vhd + vhdlSource + + + hdl/axis_raw_unpack_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_raw_unpack_v1_0.tcl + tclSource + CHECKSUM_13a7b1e1 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + RAW10 2 Lanes format unpack + + + Component_Name + axis_raw_unpack_v1_0 + + + C_IMP_TYPE + Implementation Type + 0 + + + C_OUT_TYPE + Output Type + 4 + + + + + + virtex7 + artix7 + zynq + kintex7 + + + /AXI_Peripheral + /Video_&_Image_Processing + + RAW10 Unpack v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 17 + + xilinx.com:user:axis_raw_unpack:1.0 + + 2017-05-17T15:02:49Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_raw_unpack_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_raw_unpack_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/hdl/axis_raw_unpack_v1_0.vhd b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/hdl/axis_raw_unpack_v1_0.vhd new file mode 100644 index 0000000..82940b6 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/hdl/axis_raw_unpack_v1_0.vhd @@ -0,0 +1,288 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +Library UNISIM; +use UNISIM.vcomponents.all; +Library UNIMACRO; +use UNIMACRO.vcomponents.all; +---------------------------------------------------------------------------------- +entity axis_raw_unpack_v1_0 is +generic ( + C_IMP_TYPE : integer range 0 to 1 := 0; + C_OUT_TYPE : integer range 1 to 4 := 4 +); +port ( + axis_aclk : in STD_LOGIC; + axis_aresetn : in STD_LOGIC; + -- Ports of Axi Slave Bus Interface S_AXIS + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(15 downto 0); + s_axis_tuser : in STD_LOGIC; + s_axis_tlast : in STD_LOGIC; + s_axis_tvalid : in STD_LOGIC; + -- Ports of Axi Master Bus Interface M_AXIS + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_OUT_TYPE*16-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC +); +end axis_raw_unpack_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_raw_unpack_v1_0 is +---------------------------------------------------------------------------------- +constant C_DEVICE : STRING := "7SERIES"; +constant C_FIFO_SIZE : STRING := "18Kb"; +type sm_rx_state_type is (ST_IDLE, ST_PA, ST_PB, ST_PC, ST_PD); +signal sm_rx_state : sm_rx_state_type := ST_IDLE; +type sm_tx_state_type is (ST_WAIT, ST_TXA, ST_TXB, ST_TXC, ST_TXD); +signal sm_tx_state : sm_tx_state_type := ST_WAIT; +type sm_rxp_state_type is (ST_PIDLE, ST_PPA, ST_PPB, ST_PPC, ST_PPD, ST_PPW); +signal sm_rxp_state : sm_rxp_state_type := ST_PIDLE; + +signal pixels_data : STD_LOGIC_VECTOR(39 downto 0); +signal last : STD_LOGIC; +signal user : STD_LOGIC; +signal pixel_a : STD_LOGIC_VECTOR(9 downto 0); +signal pixel_b : STD_LOGIC_VECTOR(9 downto 0); +signal pixel_c : STD_LOGIC_VECTOR(9 downto 0); +signal pixel_d : STD_LOGIC_VECTOR(9 downto 0); +signal pixels_valid : STD_LOGIC; +signal buffer_we : STD_LOGIC; +signal buffer_re : STD_LOGIC; +signal buffer_full : STD_LOGIC; +signal buffer_empty : STD_LOGIC; +signal buffer_in_data : STD_LOGIC_VECTOR(41 downto 0); +signal buffer_out_data : STD_LOGIC_VECTOR(41 downto 0); + +component srl_fifo is +generic( + C_DEPTH : integer := 32; + C_WIDTH : integer := 8 +); +port ( + clk_in : in STD_LOGIC; + we_in : in STD_LOGIC; + re_in : in STD_LOGIC; + full_out : out STD_LOGIC; + empty_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0) +); +end component; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +-- 16 bit input implementation +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_rx_state is + when ST_IDLE => + buffer_we <= '0'; + if(s_axis_tvalid = '1')then + pixels_data( 9 downto 2) <= s_axis_tdata( 7 downto 0); -- P0 + pixels_data(19 downto 12) <= s_axis_tdata(15 downto 8); -- P1 + user <= s_axis_tuser; + if(s_axis_tlast /= '1')then + sm_rx_state <= ST_PA; + end if; + end if; + + when ST_PA => + buffer_we <= '0'; + if(s_axis_tvalid = '1')then + pixels_data(29 downto 22) <= s_axis_tdata( 7 downto 0); -- P2 + pixels_data(39 downto 32) <= s_axis_tdata(15 downto 8); -- P3 + if(s_axis_tuser = '1')then -- Problem + sm_rx_state <= ST_PA; + elsif(s_axis_tlast /= '1')then + sm_rx_state <= ST_PB; + else + sm_rx_state <= ST_IDLE; + end if; + end if; + + when ST_PB => + if((s_axis_tvalid = '1') and (buffer_full = '0'))then + pixel_a( 9 downto 2) <= pixels_data( 9 downto 2); + pixel_a( 1 downto 0) <= s_axis_tdata( 1 downto 0); + pixel_b( 9 downto 2) <= pixels_data(19 downto 12); + pixel_b( 1 downto 0) <= s_axis_tdata( 3 downto 2); + pixel_c( 9 downto 2) <= pixels_data(29 downto 22); + pixel_c( 1 downto 0) <= s_axis_tdata( 5 downto 4); + pixel_d( 9 downto 2) <= pixels_data(39 downto 32); + pixel_d( 1 downto 0) <= s_axis_tdata( 7 downto 6); + last <= s_axis_tlast; + buffer_we <= '1'; + pixels_data( 9 downto 2) <= s_axis_tdata(15 downto 8); + if(s_axis_tuser = '1')then -- Problem + sm_rx_state <= ST_PA; + elsif(s_axis_tlast /= '1')then + sm_rx_state <= ST_PC; + else + sm_rx_state <= ST_IDLE; + end if; + end if; + + when ST_PC => + buffer_we <= '0'; + if(s_axis_tvalid = '1')then + pixels_data(19 downto 12) <= s_axis_tdata( 7 downto 0); -- P1 + pixels_data(29 downto 22) <= s_axis_tdata(15 downto 8); -- P2 + if(s_axis_tuser = '1')then -- Problem + sm_rx_state <= ST_PA; + elsif(s_axis_tlast /= '1')then + sm_rx_state <= ST_PD; + else + sm_rx_state <= ST_IDLE; + end if; + end if; + + when ST_PD => + if((s_axis_tvalid = '1') and (buffer_full = '0'))then + pixel_a( 9 downto 2) <= pixels_data( 9 downto 2); + pixel_a( 1 downto 0) <= s_axis_tdata( 9 downto 8); + pixel_b( 9 downto 2) <= pixels_data(19 downto 12); + pixel_b( 1 downto 0) <= s_axis_tdata(11 downto 10); + pixel_c( 9 downto 2) <= pixels_data(29 downto 22); + pixel_c( 1 downto 0) <= s_axis_tdata(13 downto 12); + pixel_d( 9 downto 2) <= s_axis_tdata( 7 downto 0); + pixel_d( 1 downto 0) <= s_axis_tdata(15 downto 14); + buffer_we <= '1'; + user <= '0'; + last <= s_axis_tlast; + if(s_axis_tuser = '1')then -- Problem + sm_rx_state <= ST_PA; + else + sm_rx_state <= ST_IDLE; + end if; + end if; + end case; + end if; +end process; + +process(sm_rx_state, pixels_valid) +begin + case sm_rx_state is + when ST_IDLE => s_axis_tready <= '1'; + when ST_PA => s_axis_tready <= '1'; + when ST_PB => s_axis_tready <= not buffer_full; + when ST_PC => s_axis_tready <= '1'; + when ST_PD => s_axis_tready <= not buffer_full; + end case; +end process; +---------------------------------------------------------------------------------- +reg_buf_gen: if C_IMP_TYPE = 0 generate +begin + process(axis_aclk) + begin + if(axis_aclk = '1' and axis_aclk'event)then + if(pixels_valid = '0')then + if(((sm_rx_state = ST_PB) or (sm_rx_state = ST_PD)) and (s_axis_tvalid = '1'))then + pixels_valid <= '1'; + end if; + else + if(buffer_re = '1')then + pixels_valid <= '0'; + end if; + end if; + end if; + end process; + + buffer_full <= pixels_valid; + buffer_empty <= not pixels_valid; + buffer_out_data <= last & user & pixel_d & pixel_c & pixel_b & pixel_a; + +end generate; +---------------------------------------------------------------------------------- +fifo_buf_gen: if C_IMP_TYPE = 1 generate +begin + buffer_in_data <= last & user & pixel_d & pixel_c & pixel_b & pixel_a; + + FIFO_inst: srl_fifo + generic map( + C_DEPTH => 32, + C_WIDTH => 42 + ) + port map( + clk_in => axis_aclk, + we_in => buffer_we, + re_in => buffer_re, + full_out => buffer_full, + empty_out => buffer_empty, + data_in => buffer_in_data, + data_out => buffer_out_data + ); +end generate; +---------------------------------------------------------------------------------- +serial_out_gen: if C_OUT_TYPE = 1 generate +begin + process(axis_aclk) + begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_tx_state is + when ST_WAIT => + if(buffer_empty = '0')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data( 9 downto 0); + m_axis_tuser <= buffer_out_data(40); + m_axis_tlast <= '0'; + sm_tx_state <= ST_TXA; + end if; + when ST_TXA => + if(m_axis_tready = '1')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data(19 downto 10); + m_axis_tuser <= '0'; + m_axis_tlast <= '0'; + sm_tx_state <= ST_TXB; + end if; + when ST_TXB => + if(m_axis_tready = '1')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data(29 downto 20); + m_axis_tuser <= '0'; + m_axis_tlast <= '0'; + sm_tx_state <= ST_TXC; + end if; + when ST_TXC => + if(m_axis_tready = '1')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data(39 downto 30); + m_axis_tuser <= '0'; + m_axis_tlast <= buffer_out_data(41); + sm_tx_state <= ST_TXD; + end if; + when ST_TXD => + if(m_axis_tready = '1')then + if(buffer_empty = '0')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data( 9 downto 0); + m_axis_tuser <= buffer_out_data(40); + m_axis_tlast <= '0'; + sm_tx_state <= ST_TXA; + else + sm_tx_state <= ST_WAIT; + m_axis_tlast <= '0'; + end if; + end if; + end case; + end if; + end process; + buffer_re <= '1' when ((sm_tx_state = ST_TXC) and (m_axis_tready = '1')) else '0'; + m_axis_tvalid <= '1' when (sm_tx_state /= ST_WAIT) else '0'; +end generate; -- serial_out_gen + +parallel4_out_gen: if C_OUT_TYPE = 4 generate +begin + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data( 9 downto 0); + m_axis_tdata(31 downto 16) <= "000000" & buffer_out_data(19 downto 10); + m_axis_tdata(47 downto 32) <= "000000" & buffer_out_data(29 downto 20); + m_axis_tdata(63 downto 48) <= "000000" & buffer_out_data(39 downto 30); + m_axis_tuser <= buffer_out_data(40); + m_axis_tlast <= buffer_out_data(41); + m_axis_tvalid <= not buffer_empty; + buffer_re <= m_axis_tready; +end generate; -- parallel4_out_gen +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/hdl/srl_fifo.vhd b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/hdl/srl_fifo.vhd new file mode 100644 index 0000000..4330b33 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/hdl/srl_fifo.vhd @@ -0,0 +1,113 @@ +------------------------------------------------------------------------------- +-- Company: Trenz Electronic +-- Engineer: Oleksandr Kiyenko +-- +-- SRL based FWPT FIFO +------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VComponents.all; +------------------------------------------------------------------------------- +entity srl_fifo is +generic( + C_DEPTH : integer := 64; + C_WIDTH : integer := 8 +); +port ( + clk_in : in STD_LOGIC; + we_in : in STD_LOGIC; + re_in : in STD_LOGIC; + full_out : out STD_LOGIC; + empty_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0) +); +end srl_fifo; +------------------------------------------------------------------------------- +architecture Behavioral of srl_fifo is +------------------------------------------------------------------------------- +type arr_type is array(C_DEPTH/32 downto 0) of STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); +signal ddata : arr_type; +type arrp_type is array(C_DEPTH/32+1 downto 0) of STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); +signal cdata : arrp_type; +signal word_cnt : UNSIGNED(5 downto 0); +signal addr_cnt : UNSIGNED(4 downto 0); +signal srl_addr : STD_LOGIC_VECTOR(4 downto 0); +signal srl_ce : STD_LOGIC; +type fifo_state_type is (ST_EMPTY, ST_NOT_EMPTY, ST_FULL); +signal fifo_state : fifo_state_type := ST_EMPTY; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +cdata(0) <= data_in; +width_gen: for i in C_WIDTH - 1 downto 0 generate +begin + depth_gen: for j in (C_DEPTH/32)-1 downto 0 generate + begin + SRLC32E_1 : SRLC32E + port map ( + D => cdata(j)(i), + Q => ddata(j)(i), + Q31 => cdata(j+1)(i), + A => srl_addr(4 downto 0), + CE => srl_ce, + CLK => clk_in + ); + end generate; +end generate; +srl_addr <= STD_LOGIC_VECTOR(addr_cnt); + +full_out <= '1' when (fifo_state = ST_FULL ) else '0'; +empty_out <= '1' when (fifo_state = ST_EMPTY) else '0'; +srl_ce <= '1' when ((we_in = '1') and (fifo_state /= ST_FULL)) else '0'; + +single_stage_gen: if C_DEPTH = 32 generate +begin + data_out <= ddata(0); +end generate; +multi_stage_gen: if C_DEPTH > 32 generate +begin + data_out <= ddata(TO_INTEGER(addr_cnt(addr_cnt'high downto 5))); +end generate; + +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + case fifo_state is + when ST_EMPTY => + addr_cnt <= (others => '0'); + if(we_in = '1')then + word_cnt <= TO_UNSIGNED(1, word_cnt'length); + fifo_state <= ST_NOT_EMPTY; + end if; + when ST_NOT_EMPTY => + if(we_in = '1')then + if(re_in = '0')then -- Write + if(word_cnt = TO_UNSIGNED((C_DEPTH-1), word_cnt'length))then + fifo_state <= ST_FULL; + end if; + word_cnt <= word_cnt + 1; + addr_cnt <= addr_cnt + 1; + end if; + elsif(re_in = '1')then + if(word_cnt = TO_UNSIGNED(1, word_cnt'length))then + fifo_state <= ST_EMPTY; + word_cnt <= word_cnt - 1; + else + word_cnt <= word_cnt - 1; + addr_cnt <= addr_cnt - 1; + end if; + end if; + when ST_FULL => + if(re_in = '1')then + word_cnt <= word_cnt - 1; + addr_cnt <= addr_cnt - 1; + fifo_state <= ST_NOT_EMPTY; + end if; + end case; + end if; +end process; +------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/src/srl_fifo.vhd b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/src/srl_fifo.vhd new file mode 100644 index 0000000..a853ac4 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/src/srl_fifo.vhd @@ -0,0 +1,111 @@ +------------------------------------------------------------------------------- +-- Company: Trenz Electronic +-- Engineer: Oleksandr Kiyenko +-- +-- SRL based FWPT FIFO +------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VComponents.all; +------------------------------------------------------------------------------- +entity srl_fifo is +generic( + C_DEPTH : integer := 32; + C_WIDTH : integer := 8 +); +port ( + clk_in : in STD_LOGIC; + we_in : in STD_LOGIC; + re_in : in STD_LOGIC; + full_out : out STD_LOGIC; + empty_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0) +); +end srl_fifo; +------------------------------------------------------------------------------- +architecture Behavioral of srl_fifo is +------------------------------------------------------------------------------- +type arr_type is array(C_DEPTH/32 downto 0) of STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); +signal ddata : arr_type; +type arrp_type is array(C_DEPTH/32+1 downto 0) of STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); +signal cdata : arrp_type; +signal word_cnt : UNSIGNED(5 downto 0); +signal addr_cnt : UNSIGNED(4 downto 0); +signal srl_addr : STD_LOGIC_VECTOR(4 downto 0); +signal srl_ce : STD_LOGIC; +type fifo_state_type is (ST_EMPTY, ST_NOT_EMPTY, ST_FULL); +signal fifo_state : fifo_state_type := ST_EMPTY; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +cdata(0) <= data_in; +width_gen: for i in C_WIDTH - 1 downto 0 generate +begin + depth_gen: for j in C_DEPTH/32 downto 0 generate + begin + SRLC32E_1 : SRLC32E + port map ( + D => cdata(j)(i), + Q => ddata(j)(i), + Q31 => cdata(j+1)(i), + A => srl_addr(4 downto 0), + CE => srl_ce, + CLK => clk_in + ); + end generate; +end generate; +srl_addr <= STD_LOGIC_VECTOR(addr_cnt); + +full_out <= '1' when (fifo_state = ST_FULL ) else '0'; +empty_out <= '1' when (fifo_state = ST_EMPTY) else '0'; +srl_ce <= '1' when ((we_in = '1') and ((fifo_state /= ST_FULL) or (re_in = '1'))) else '0'; + +single_stage_gen: if C_DEPTH = 32 generate +begin + data_out <= ddata(0); +end generate; +-- multi_stage_gen: if C_DEPTH > 32 generate +-- begin + -- data_out <= ddata(TO_INTEGER(addr_cnt(addr_cnt'high downto 5))); +-- end generate; + +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + case fifo_state is + when ST_EMPTY => + if(we_in = '1')then + word_cnt <= word_cnt + 1; + fifo_state <= ST_NOT_EMPTY; + end if; + when ST_NOT_EMPTY => + if(we_in = '1')then + if(re_in = '0')then -- Write + if(word_cnt = TO_UNSIGNED((C_DEPTH-1), word_cnt'width))then + fifo_state <= ST_FULL; + end if; + word_cnt <= word_cnt + 1; + addr_cnt <= addr_cnt + 1; + end if; + elsif(re_in = '1')then + if(word_cnt = TO_UNSIGNED(1, word_cnt'width))then + fifo_state <= ST_EMPTY; + word_cnt <= word_cnt - 1; + else + word_cnt <= word_cnt - 1; + addr_cnt <= addr_cnt - 1; + end if; + end if; + when ST_FULL => + if((re_in = '1') and (we_in = '0'))then + word_cnt <= word_cnt - 1; + addr_cnt <= addr_cnt - 1; + end if; + end case; + end if; +end process; +------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/xgui/axis_raw_unpack_v1_0.tcl b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/xgui/axis_raw_unpack_v1_0.tcl new file mode 100644 index 0000000..cbb2c6c --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_raw_unpack_1.0/xgui/axis_raw_unpack_v1_0.tcl @@ -0,0 +1,40 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_IMP_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_OUT_TYPE" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_IMP_TYPE { PARAM_VALUE.C_IMP_TYPE } { + # Procedure called to update C_IMP_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IMP_TYPE { PARAM_VALUE.C_IMP_TYPE } { + # Procedure called to validate C_IMP_TYPE + return true +} + +proc update_PARAM_VALUE.C_OUT_TYPE { PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to update C_OUT_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_OUT_TYPE { PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to validate C_OUT_TYPE + return true +} + + +proc update_MODELPARAM_VALUE.C_IMP_TYPE { MODELPARAM_VALUE.C_IMP_TYPE PARAM_VALUE.C_IMP_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IMP_TYPE}] ${MODELPARAM_VALUE.C_IMP_TYPE} +} + +proc update_MODELPARAM_VALUE.C_OUT_TYPE { MODELPARAM_VALUE.C_OUT_TYPE PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_OUT_TYPE}] ${MODELPARAM_VALUE.C_OUT_TYPE} +} + diff --git a/zynqberrydemo1/ip_lib/axis_to_i2s_1.0/component.xml b/zynqberrydemo1/ip_lib/axis_to_i2s_1.0/component.xml new file mode 100644 index 0000000..b9448e0 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_to_i2s_1.0/component.xml @@ -0,0 +1,324 @@ + + + trenz.biz + user + axis_to_i2s + 1.0 + + + s_axis + + + + + + + TDATA + + + s_axis_tdata + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + + s_axis_aresetn + + + + + + + RST + + + s_axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + s_axis_aclk + + + + + + + CLK + + + s_axis_aclk + + + + + + ASSOCIATED_BUSIF + s_axis + + + ASSOCIATED_RESET + s_axis_aresetn + + + + + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + VHDL + axis_to_i2s + + xilinx_anylanguagesynthesis_view_fileset + + + + viewChecksum + 5b9a2668 + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + VHDL + axis_to_i2s + + xilinx_anylanguagebehavioralsimulation_view_fileset + + + + viewChecksum + 5b9a2668 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + f64a5dae + + + + + + + s_axis_aclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + s_axis_aresetn + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + s_axis_tdata + + in + + 15 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_bclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_lrclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_sdata + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + + + xilinx_anylanguagesynthesis_view_fileset + + hdl/axis_to_i2s.vhd + vhdlSource + CHECKSUM_5b9a2668 + + + + xilinx_anylanguagebehavioralsimulation_view_fileset + + hdl/axis_to_i2s.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_to_i2s_v1_0.tcl + tclSource + CHECKSUM_f92e9879 + XGUI_VERSION_2 + + + + AXI4-Stream to I2S v1.0 + + + Component_Name + axis_to_i2s_v1_0 + + + + + + virtex7 + kintex7 + artix7 + zynq + + + /Embedded_Processing/AXI_Peripheral + /Embedded_Processing/AXI_Peripheral/Low_Speed_Peripheral + /UserIP + + AXI4-Stream to I2S v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 4 + + xilinx.com:user:axis_to_i2s:1.0 + + 2016-04-29T07:00:54Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_to_i2s_1.0 + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_to_i2s_1.0 + + + + 2015.4.2 + + + + + + + diff --git a/zynqberrydemo1/ip_lib/axis_to_i2s_1.0/hdl/axis_to_i2s.vhd b/zynqberrydemo1/ip_lib/axis_to_i2s_1.0/hdl/axis_to_i2s.vhd new file mode 100644 index 0000000..fa14fc3 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_to_i2s_1.0/hdl/axis_to_i2s.vhd @@ -0,0 +1,66 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity axis_to_i2s is +port ( + -- Ports of Axi Slave Bus Interface S_AXIS + s_axis_aclk : in STD_LOGIC; + s_axis_aresetn : in STD_LOGIC; + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(15 downto 0); + s_axis_tvalid : in STD_LOGIC; + -- I2S Signals + i2s_bclk : in STD_LOGIC; + i2s_lrclk : in STD_LOGIC; + i2s_sdata : out STD_LOGIC +); +end axis_to_i2s; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_to_i2s is +---------------------------------------------------------------------------------- +signal input_data : STD_LOGIC_VECTOR(15 downto 0); +signal bclk_sr : STD_LOGIC_VECTOR( 1 downto 0); +signal lrclk_sr : STD_LOGIC_VECTOR( 1 downto 0); +signal data_sr : STD_LOGIC_VECTOR(31 downto 0); +signal load_flag : STD_LOGIC; +signal channel_flag : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +s_axis_tready <= '1'; +process(s_axis_aclk) +begin + if(s_axis_aclk = '1' and s_axis_aclk'event)then + bclk_sr <= bclk_sr(0) & i2s_bclk; + lrclk_sr <= lrclk_sr(0) & i2s_lrclk; + if(s_axis_tvalid = '1')then + input_data <= s_axis_tdata; + end if; + + if((lrclk_sr = "10") or (lrclk_sr = "01"))then -- LR Edge + channel_flag <= '1'; + elsif(bclk_sr = "01")then -- Rising edge + channel_flag <= '0'; + end if; + + if(bclk_sr = "01")then -- Rising edge + load_flag <= channel_flag; + end if; + + if(bclk_sr = "10")then -- Falling edge + if(load_flag = '1')then + data_sr <= input_data & x"0000"; + else + data_sr <= data_sr(30 downto 0) & '0'; + end if; + end if; + end if; +end process; +i2s_sdata <= data_sr(31); +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl b/zynqberrydemo1/ip_lib/axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl new file mode 100644 index 0000000..66195ab --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl @@ -0,0 +1,10 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + ipgui::add_page $IPINST -name "Page 0" + + +} + + diff --git a/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/bd/bd.tcl b/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/component.xml b/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/component.xml new file mode 100644 index 0000000..8c3a78c --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/component.xml @@ -0,0 +1,535 @@ + + + trenz.biz + user + axis_video_dwidth_converter + 1.0 + + + s_axis + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TUSER + + + s_axis_tuser + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + + WIZ_DATA_WIDTH + 32 + + + + + axis_aresetn + + + + + + + RST + + + axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + axis_aclk + + + + + + + CLK + + + axis_aclk + + + + + + ASSOCIATED_BUSIF + s_axis:m_axis + + + ASSOCIATED_RESET + axis_aresetn + + + + + m_axis + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TUSER + + + m_axis_tuser + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_video_dwidth_converter_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + c5686eda + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_video_dwidth_converter_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + c5686eda + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 6001f6d0 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tdata + + in + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tdata + + out + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_IN_TYPE + C In Type + 1 + + + C_OUT_TYPE + C Out Type + 1 + + + C_DATA_WIDTH + C Data Width + 32 + + + + + + choice_list_07c83d4f + 16 + 32 + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_pairs_719c03b1 + 1 + 4 + + + choice_pairs_95e1d6c3 + 1 + 2 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axis_video_dwidth_converter_v1_0.vhd + vhdlSource + CHECKSUM_c5686eda + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axis_video_dwidth_converter_v1_0.vhd + vhdlSource + + + + xilinx_xpgui_view_fileset + + xgui/axis_video_dwidth_converter_v1_0.tcl + tclSource + CHECKSUM_7e8a0bf1 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + AXI4-Stream Video Data Width Converter + + + Component_Name + axis_video_dwidth_converter_v1_0 + + + C_IN_TYPE + Input Type + 1 + + + C_OUT_TYPE + Output Type + 1 + + + C_DATA_WIDTH + Data Width + 32 + + + + + + zynq + virtex7 + qvirtex7 + kintex7 + kintex7l + qkintex7 + qkintex7l + artix7 + artix7l + aartix7 + qartix7 + qzynq + azynq + virtexu + virtexuplus + kintexuplus + zynquplus + kintexu + + + /AXI_Peripheral + /Video_&_Image_Processing + + AXI4-Stream Video Data Width Converter v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 9 + + xilinx.com:user:axis_video_dwidth_converter:1.0 + + 2017-05-17T13:30:41Z + + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_video_dwidth_converter_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_video_dwidth_converter_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/hdl/axis_video_dwidth_converter_v1_0.vhd b/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/hdl/axis_video_dwidth_converter_v1_0.vhd new file mode 100644 index 0000000..723cbee --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/hdl/axis_video_dwidth_converter_v1_0.vhd @@ -0,0 +1,146 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity axis_video_dwidth_converter_v1_0 is +generic ( + C_DATA_WIDTH : integer := 32; + C_IN_TYPE : integer range 1 to 4 := 4; + C_OUT_TYPE : integer range 1 to 4 := 1 +); +port ( + axis_aclk : in STD_LOGIC; + axis_aresetn : in STD_LOGIC; + -- Ports of Axi Slave Bus Interface S_AXIS + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_IN_TYPE*C_DATA_WIDTH-1 downto 0); + s_axis_tuser : in STD_LOGIC; + s_axis_tlast : in STD_LOGIC; + s_axis_tvalid : in STD_LOGIC; + -- Ports of Axi Master Bus Interface M_AXIS + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC +); +end axis_video_dwidth_converter_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_video_dwidth_converter_v1_0 is +---------------------------------------------------------------------------------- +type sm_state_type is (ST_IDLE, ST_1W, ST_2W, ST_3W); +signal sm_state : sm_state_type := ST_IDLE; +signal tdata_buffer : STD_LOGIC_VECTOR((C_IN_TYPE-C_OUT_TYPE)*C_DATA_WIDTH-1 downto 0); +signal tlast_buffer : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +bypass_gen: if ((C_IN_TYPE = 1) and (C_OUT_TYPE = 1))generate +begin + m_axis_tvalid <= s_axis_tvalid; + m_axis_tdata <= s_axis_tdata; + m_axis_tuser <= s_axis_tuser; + m_axis_tlast <= s_axis_tlast; + s_axis_tready <= m_axis_tready; +end generate; +---------------------------------------------------------------------------------- +repack_gen: if ((C_IN_TYPE /= 1) or (C_OUT_TYPE /= 1)) generate +begin + process(sm_state, s_axis_tvalid) + begin + case sm_state is + when ST_IDLE => m_axis_tvalid <= s_axis_tvalid; + when ST_1W => m_axis_tvalid <= '1'; + when ST_2W => m_axis_tvalid <= '1'; + when ST_3W => m_axis_tvalid <= '1'; + end case; + end process; + + process(sm_state, s_axis_tuser) + begin + case sm_state is + when ST_IDLE => m_axis_tuser <= s_axis_tuser; + when ST_1W => m_axis_tuser <= '0'; + when ST_2W => m_axis_tuser <= '0'; + when ST_3W => m_axis_tuser <= '0'; + end case; + end process; + + process(sm_state, s_axis_tuser) + begin + case sm_state is + when ST_IDLE => m_axis_tlast <= '0'; + when ST_1W => + if(C_OUT_TYPE = 2)then + m_axis_tlast <= tlast_buffer; + else + m_axis_tlast <= '0'; + end if; + when ST_2W => m_axis_tlast <= '0'; + when ST_3W => m_axis_tlast <= tlast_buffer; + end case; + end process; + + out_1p_gen: if C_OUT_TYPE = 1 generate + begin + process(sm_state, s_axis_tdata, tdata_buffer) + begin + case sm_state is + when ST_IDLE => m_axis_tdata <= s_axis_tdata(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + when ST_1W => m_axis_tdata <= tdata_buffer(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + when ST_2W => m_axis_tdata <= tdata_buffer(C_OUT_TYPE*C_DATA_WIDTH*2-1 downto C_OUT_TYPE*C_DATA_WIDTH*1); + when ST_3W => m_axis_tdata <= tdata_buffer(C_OUT_TYPE*C_DATA_WIDTH*3-1 downto C_OUT_TYPE*C_DATA_WIDTH*2); + end case; + end process; + end generate; + + out_2p_gen: if C_OUT_TYPE = 2 generate + begin + process(sm_state, s_axis_tdata, tdata_buffer) + begin + case sm_state is + when ST_IDLE => m_axis_tdata <= s_axis_tdata(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + when ST_1W => m_axis_tdata <= tdata_buffer(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + when others => null; + end case; + end process; + end generate; + + process(axis_aclk) + begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_state is + when ST_IDLE => + if((s_axis_tvalid = '1') and (m_axis_tready = '1'))then + tdata_buffer <= s_axis_tdata(s_axis_tdata'left downto C_OUT_TYPE*C_DATA_WIDTH); + tlast_buffer <= s_axis_tlast; + sm_state <= ST_1W; + end if; + when ST_1W => + if(m_axis_tready = '1')then + if(C_OUT_TYPE = 2)then + sm_state <= ST_IDLE; + else + sm_state <= ST_2W; + end if; + end if; + when ST_2W => + if(m_axis_tready = '1')then + sm_state <= ST_3W; + end if; + when ST_3W => + if(m_axis_tready = '1')then + sm_state <= ST_IDLE; + end if; + end case; + end if; + end process; + + s_axis_tready <= m_axis_tready when sm_state = ST_IDLE else '0'; +end generate; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/xgui/axis_video_dwidth_converter_v1_0.tcl b/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/xgui/axis_video_dwidth_converter_v1_0.tcl new file mode 100644 index 0000000..6b5cb6a --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_video_dwidth_converter_1.0/xgui/axis_video_dwidth_converter_v1_0.tcl @@ -0,0 +1,55 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_IN_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_OUT_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_DATA_WIDTH" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_DATA_WIDTH { PARAM_VALUE.C_DATA_WIDTH } { + # Procedure called to update C_DATA_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_DATA_WIDTH { PARAM_VALUE.C_DATA_WIDTH } { + # Procedure called to validate C_DATA_WIDTH + return true +} + +proc update_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to update C_IN_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to validate C_IN_TYPE + return true +} + +proc update_PARAM_VALUE.C_OUT_TYPE { PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to update C_OUT_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_OUT_TYPE { PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to validate C_OUT_TYPE + return true +} + + +proc update_MODELPARAM_VALUE.C_IN_TYPE { MODELPARAM_VALUE.C_IN_TYPE PARAM_VALUE.C_IN_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IN_TYPE}] ${MODELPARAM_VALUE.C_IN_TYPE} +} + +proc update_MODELPARAM_VALUE.C_OUT_TYPE { MODELPARAM_VALUE.C_OUT_TYPE PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_OUT_TYPE}] ${MODELPARAM_VALUE.C_OUT_TYPE} +} + +proc update_MODELPARAM_VALUE.C_DATA_WIDTH { MODELPARAM_VALUE.C_DATA_WIDTH PARAM_VALUE.C_DATA_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_DATA_WIDTH}] ${MODELPARAM_VALUE.C_DATA_WIDTH} +} + diff --git a/zynqberrydemo1/ip_lib/axis_video_resize_1.0/bd/bd.tcl b/zynqberrydemo1/ip_lib/axis_video_resize_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_video_resize_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/axis_video_resize_1.0/component.xml b/zynqberrydemo1/ip_lib/axis_video_resize_1.0/component.xml new file mode 100644 index 0000000..8183acb --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_video_resize_1.0/component.xml @@ -0,0 +1,521 @@ + + + trenz.biz + user + axis_video_resize + 1.0 + + + S_AXIS + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + TUSER + + + s_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + M_AXIS + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + TUSER + + + m_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + axis_aresetn + + + + + + + RST + + + axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + axis_aclk + + + + + + + CLK + + + axis_aclk + + + + + + ASSOCIATED_BUSIF + S_AXIS:M_AXIS + + + ASSOCIATED_RESET + axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_video_resize_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 3d0341d7 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_video_resize_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + 3d0341d7 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + b9a712e9 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tdata + + out + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + s_axis_tdata + + in + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_HORISONTAL_RES + C Horisontal Res + 1280 + + + C_VERTICAL_RES + C Vertical Res + 720 + + + C_IN_TYPE + C In Type + 1 + + + + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_pairs_719c03b1 + 1 + 4 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axis_video_resize_v1_0.vhd + vhdlSource + CHECKSUM_3d0341d7 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axis_video_resize_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_video_resize_v1_0.tcl + tclSource + CHECKSUM_ea8138be + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + Resize video stream + + + Component_Name + axis_video_resize_v1_0 + + + C_HORISONTAL_RES + Horisontal Resolution + 1280 + + + C_VERTICAL_RES + Vertical Resolution + 720 + + + C_IN_TYPE + Input Type + 1 + + + + + + virtex7 + artix7 + kintex7 + zynq + + + /AXI_Peripheral + /Video_&_Image_Processing + + Video Resize v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 5 + + xilinx.com:user:axis_video_resize:1.0 + + 2017-05-16T12:54:08Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_video_resize_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_video_resize_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/axis_video_resize_1.0/hdl/axis_video_resize_v1_0.vhd b/zynqberrydemo1/ip_lib/axis_video_resize_1.0/hdl/axis_video_resize_v1_0.vhd new file mode 100644 index 0000000..a70a46e --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_video_resize_1.0/hdl/axis_video_resize_v1_0.vhd @@ -0,0 +1,115 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity axis_video_resize_v1_0 is +generic ( + C_IN_TYPE : integer range 1 to 4 := 1; + C_HORISONTAL_RES : integer := 1280; + C_VERTICAL_RES : integer := 720 +); +port ( + axis_aclk : in STD_LOGIC; + axis_aresetn : in STD_LOGIC; + -- Ports of Axi Slave Bus Interface S_AXIS + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_IN_TYPE*32-1 downto 0); + s_axis_tuser : in STD_LOGIC; + s_axis_tlast : in STD_LOGIC; + s_axis_tvalid : in STD_LOGIC; + + -- Ports of Axi Master Bus Interface M_AXIS + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_IN_TYPE*32-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC + ); +end axis_video_resize_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_video_resize_v1_0 is +---------------------------------------------------------------------------------- +signal hor_cnt : UNSIGNED(15 downto 0); +signal ver_cnt : UNSIGNED(15 downto 0); +type sm_state_type is (ST_IDLE, ST_HOR_LINE, ST_HOR_CROP); +signal sm_state : sm_state_type := ST_IDLE; +signal vert_pass : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +s_axis_tready <= m_axis_tready; +m_axis_tdata <= s_axis_tdata; +m_axis_tuser <= s_axis_tuser; +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_state is + when ST_IDLE => -- Wait for start of frame + vert_pass <= '1'; + ver_cnt <= TO_UNSIGNED(0,16); + hor_cnt <= TO_UNSIGNED(C_IN_TYPE,16); + if((s_axis_tvalid = '1') and (m_axis_tready = '1') and (s_axis_tuser = '1'))then + sm_state <= ST_HOR_LINE; + end if; + when ST_HOR_LINE => + if((s_axis_tvalid = '1') and (m_axis_tready = '1'))then + if(s_axis_tuser = '1')then + ver_cnt <= TO_UNSIGNED(0,16); + vert_pass <= '1'; + elsif(s_axis_tlast = '1')then + if(ver_cnt >= TO_UNSIGNED((C_VERTICAL_RES-1),16))then + vert_pass <= '0'; + end if; + ver_cnt <= ver_cnt + 1; + end if; + + if(s_axis_tlast = '1')then + hor_cnt <= TO_UNSIGNED(0,16); + else + if(hor_cnt >= TO_UNSIGNED((C_HORISONTAL_RES - C_IN_TYPE),16))then + sm_state <= ST_HOR_CROP; + end if; + hor_cnt <= hor_cnt + TO_UNSIGNED(C_IN_TYPE, 16); + end if; + end if; + when ST_HOR_CROP => + if((s_axis_tvalid = '1') and (m_axis_tready = '1') and (s_axis_tlast = '1'))then + hor_cnt <= TO_UNSIGNED(0,16); + sm_state <= ST_HOR_LINE; + if(ver_cnt >= TO_UNSIGNED((C_VERTICAL_RES-1),16))then + vert_pass <= '0'; + end if; + ver_cnt <= ver_cnt + 1; + end if; + end case; + end if; +end process; + +process(sm_state, s_axis_tvalid, s_axis_tuser, vert_pass) +begin + case sm_state is + when ST_IDLE => m_axis_tvalid <= s_axis_tvalid and s_axis_tuser; + when ST_HOR_LINE => m_axis_tvalid <= s_axis_tvalid and (vert_pass or s_axis_tuser); + when ST_HOR_CROP => m_axis_tvalid <= '0'; + end case; +end process; + +process(sm_state, hor_cnt) +begin + case sm_state is + when ST_IDLE => m_axis_tlast <= '0'; + when ST_HOR_LINE => + if(hor_cnt >= TO_UNSIGNED((C_HORISONTAL_RES - C_IN_TYPE),16))then + m_axis_tlast <= '1'; + else + m_axis_tlast <= '0'; + end if; + when ST_HOR_CROP => m_axis_tlast <= '0'; + end case; +end process; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/axis_video_resize_1.0/xgui/axis_video_resize_v1_0.tcl b/zynqberrydemo1/ip_lib/axis_video_resize_1.0/xgui/axis_video_resize_v1_0.tcl new file mode 100644 index 0000000..75490a1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/axis_video_resize_1.0/xgui/axis_video_resize_v1_0.tcl @@ -0,0 +1,55 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_IN_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_HORISONTAL_RES" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_VERTICAL_RES" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_HORISONTAL_RES { PARAM_VALUE.C_HORISONTAL_RES } { + # Procedure called to update C_HORISONTAL_RES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_HORISONTAL_RES { PARAM_VALUE.C_HORISONTAL_RES } { + # Procedure called to validate C_HORISONTAL_RES + return true +} + +proc update_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to update C_IN_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to validate C_IN_TYPE + return true +} + +proc update_PARAM_VALUE.C_VERTICAL_RES { PARAM_VALUE.C_VERTICAL_RES } { + # Procedure called to update C_VERTICAL_RES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_VERTICAL_RES { PARAM_VALUE.C_VERTICAL_RES } { + # Procedure called to validate C_VERTICAL_RES + return true +} + + +proc update_MODELPARAM_VALUE.C_HORISONTAL_RES { MODELPARAM_VALUE.C_HORISONTAL_RES PARAM_VALUE.C_HORISONTAL_RES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_HORISONTAL_RES}] ${MODELPARAM_VALUE.C_HORISONTAL_RES} +} + +proc update_MODELPARAM_VALUE.C_VERTICAL_RES { MODELPARAM_VALUE.C_VERTICAL_RES PARAM_VALUE.C_VERTICAL_RES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_VERTICAL_RES}] ${MODELPARAM_VALUE.C_VERTICAL_RES} +} + +proc update_MODELPARAM_VALUE.C_IN_TYPE { MODELPARAM_VALUE.C_IN_TYPE PARAM_VALUE.C_IN_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IN_TYPE}] ${MODELPARAM_VALUE.C_IN_TYPE} +} + diff --git a/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/component.xml b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/component.xml new file mode 100644 index 0000000..c91798f --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/component.xml @@ -0,0 +1,1035 @@ + + + trenz.biz + user + csi2_d_phy_rx + 1.0 + + + RX_MIPI_PPI + RX_MIPI_PPI + RX_MIPI_PPI + + + + + + + DL1_RXACTIVEHS + + + dl1_rxactivehs + + + + + CL_ENABLE + + + cl_enable + + + + + DL1_RXDATAHS + + + dl1_datahs + + + + + CL_STOPSTATE + + + cl_stopstate + + + + + DL0_RXSYNCHS + + + dl0_rxsynchs + + + + + DL1_RXVALIDHS + + + dl1_rxvalidhs + + + + + DL0_RXACTIVEHS + + + dl0_rxactivehs + + + + + DL1_RXSYNCHS + + + dl1_rxsynchs + + + + + CL_RXCLKACTIVEHS + + + cl_rxclkactivehs + + + + + DL0_ENABLE + + + dl0_enable + + + + + DL0_RXDATAHS + + + dl0_datahs + + + + + DL1_ENABLE + + + dl1_enable + + + + + DL0_RXVALIDHS + + + dl0_rxvalidhs + + + + + DL2_RXSYNCHS + + + dl2_rxsynchs + + + + + DL3_RXACTIVEHS + + + dl3_rxactivehs + + + + + DL3_RXDATAHS + + + dl3_datahs + + + + + DL2_RXDATAHS + + + dl2_datahs + + + + + DL3_RXSYNCHS + + + dl3_rxsynchs + + + + + DL3_RXVALIDHS + + + dl3_rxvalidhs + + + + + DL3_ENABLE + + + dl3_enable + + + + + DL2_RXVALIDHS + + + dl2_rxvalidhs + + + + + DL2_RXACTIVEHS + + + dl2_rxactivehs + + + + + DL2_ENABLE + + + dl2_enable + + + + + + in_delay_clk + + + + + + + CLK + + + in_delay_clk + + + + + + data_err + + + + + + + ACK + + + trig_ack + + + + + TRIG + + + trig_req + + + + + + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + VHDL + csi2_d_phy_rx + + xilinx_anylanguagesynthesis_view_fileset + + + + viewChecksum + 705bfa8d + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + VHDL + csi2_d_phy_rx + + xilinx_anylanguagebehavioralsimulation_view_fileset + + + + viewChecksum + f9df0448 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + b6781f17 + + + + + + + in_delay_clk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + clk_rxp + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + clk_rxn + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + data_rxp + + in + + 1 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + data_rxn + + in + + 1 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + data_lp_p + + in + + 0 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + + true + + + + + + data_lp_n + + in + + 0 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + + true + + + + + + trig_req + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + trig_ack + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + rxbyteclkhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + cl_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0x1 + + + + + cl_stopstate + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + cl_rxclkactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl0_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0x1 + + + + + dl0_rxactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl0_rxvalidhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl0_rxsynchs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl0_datahs + + out + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl1_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0x1 + + + + + dl1_rxactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl1_rxvalidhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl1_rxsynchs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl1_datahs + + out + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl2_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + dl2_rxactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl2_rxvalidhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl2_rxsynchs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl2_datahs + + out + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl3_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + dl3_rxactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl3_rxvalidhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl3_rxsynchs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl3_datahs + + out + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + + C_NUM_LANES + C Num Lanes + 2 + + + C_NUM_LP_LANES + C Num Lp Lanes + 1 + + + C_D0_SWAP + C D0 Swap + FALSE + + + C_D1_SWAP + C D1 Swap + FALSE + + + C_D2_SWAP + C D2 Swap + FALSE + + + C_D3_SWAP + C D3 Swap + FALSE + + + C_DIFF_TERM + C Diff Term + FALSE + + + C_ADD_IDELAYCTRL + C Add Idelayctrl + FALSE + + + C_IODELAY_GROUP + C Iodelay Group + csi_dly_grp + + + C_USE_DELAY + C Use Delay + TRUE + + + C_CALIB_WAIT + C Calib Wait + 2047 + + + C_RATE_LIMIT + C Rate Limit + 10 + + + + + + choice_list_e6469819 + 1 + 2 + 4 + + + choice_list_f5166eba + 0 + 1 + 2 + 4 + + + + + xilinx_anylanguagesynthesis_view_fileset + + hdl/csi2_d_phy_rx.xdc + xdc + USED_IN_implementation + USED_IN_synthesis + + + hdl/phy_clock_system.vhd + vhdlSource + + + hdl/line_if.vhd + vhdlSource + + + hdl/csi2_d_phy_rx.vhd + vhdlSource + CHECKSUM_8021b24b + + + + xilinx_anylanguagebehavioralsimulation_view_fileset + + hdl/phy_clock_system.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/line_if.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/csi2_d_phy_rx.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/csi2_d_phy_rx_v1_0.tcl + tclSource + CHECKSUM_30433af4 + XGUI_VERSION_2 + + + + CSI-2 D-PHY RX Interface + + + C_NUM_LANES + Data Lanes + 2 + + + C_NUM_LP_LANES + LP Lanes + 1 + + + C_D0_SWAP + D0 P/N Swap + FALSE + + + C_D1_SWAP + D1 P/N Swap + FALSE + + + C_D2_SWAP + D2 P/N Swap + FALSE + + + C_D3_SWAP + D3 P/N Swap + FALSE + + + C_DIFF_TERM + Add Differential Termination + FALSE + + + C_ADD_IDELAYCTRL + Add Idelayctrl + FALSE + + + C_IODELAY_GROUP + Iodelay Group Name + csi_dly_grp + + + Component_Name + csi2_d_phy_rx_v1_0 + + + C_USE_DELAY + Use Delay + TRUE + + + C_CALIB_WAIT + Calibration Cycle + 2047 + + + C_RATE_LIMIT + Error Rate Limit + 10 + + + + + + virtex7 + artix7 + kintex7 + zynq + qzynq + + + /UserIP + /Video_&_Image_Processing + + CSI-2 D-PHY RX v1_0 + Trenz Electronic GmbH + http://www.trenz.biz + 35 + + xilinx.com:user:csi2_d_phy_rx:1.0 + + 2017-05-24T13:20:36Z + + + b:/cores/2015.4/design/te0726/demo/ip_lib/csi2_d_phy_rx_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/csi2_d_phy_rx_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd new file mode 100644 index 0000000..0d0bf83 --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd @@ -0,0 +1,293 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use ieee.numeric_std.all; +Library UNISIM; +use UNISIM.vcomponents.all; +---------------------------------------------------------------------------------- +entity csi2_d_phy_rx is +generic ( + C_NUM_LANES : integer range 1 to 4 := 2; -- Number of data lanes + C_NUM_LP_LANES : integer range 0 to 4 := 1; -- Number of lanes that support LP input + C_D0_SWAP : BOOLEAN := FALSE; + C_D1_SWAP : BOOLEAN := FALSE; + C_D2_SWAP : BOOLEAN := FALSE; + C_D3_SWAP : BOOLEAN := FALSE; + ------------------------------------------------------------------------------- + C_USE_DELAY : BOOLEAN := TRUE; + C_DIFF_TERM : BOOLEAN := FALSE; + C_ADD_IDELAYCTRL : BOOLEAN := FALSE; + C_IODELAY_GROUP : STRING := "csi_dly_grp"; + C_CALIB_WAIT : INTEGER := 2047; + C_RATE_LIMIT : INTEGER := 10 +); +port ( + in_delay_clk : in STD_LOGIC; + -- Camera physical interface + clk_rxp : in STD_LOGIC; + clk_rxn : in STD_LOGIC; + data_rxp : in STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); + data_rxn : in STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); + data_lp_p : in STD_LOGIC_VECTOR(C_NUM_LP_LANES-1 downto 0); + data_lp_n : in STD_LOGIC_VECTOR(C_NUM_LP_LANES-1 downto 0); + -- Calibration + trig_req : in STD_LOGIC; + trig_ack : out STD_LOGIC; + -- MIPI PPI + rxbyteclkhs : out STD_LOGIC; -- Main byte clock bitrate/8 + cl_enable : in STD_LOGIC := '1'; -- PPI ShutDown ? + cl_stopstate : out STD_LOGIC; -- PPI StopState + cl_rxclkactivehs : out STD_LOGIC; -- optional, PPI RxClkActiveHS + dl0_enable : in STD_LOGIC; + dl0_rxactivehs : out STD_LOGIC; + dl0_rxvalidhs : out STD_LOGIC; + dl0_rxsynchs : out STD_LOGIC; + dl0_datahs : out STD_LOGIC_VECTOR(7 downto 0); + dl1_enable : in STD_LOGIC; + dl1_rxactivehs : out STD_LOGIC; + dl1_rxvalidhs : out STD_LOGIC; + dl1_rxsynchs : out STD_LOGIC; + dl1_datahs : out STD_LOGIC_VECTOR(7 downto 0); + dl2_enable : in STD_LOGIC; + dl2_rxactivehs : out STD_LOGIC; + dl2_rxvalidhs : out STD_LOGIC; + dl2_rxsynchs : out STD_LOGIC; + dl2_datahs : out STD_LOGIC_VECTOR(7 downto 0); + dl3_enable : in STD_LOGIC; + dl3_rxactivehs : out STD_LOGIC; + dl3_rxvalidhs : out STD_LOGIC; + dl3_rxsynchs : out STD_LOGIC; + dl3_datahs : out STD_LOGIC_VECTOR(7 downto 0) +); +end csi2_d_phy_rx; +---------------------------------------------------------------------------------- +architecture Behavioral of csi2_d_phy_rx is +---------------------------------------------------------------------------------- +component phy_clock_system is +generic ( + C_USE_DELAY : BOOLEAN := FALSE; + C_DIFF_TERM : BOOLEAN := FALSE; + C_IODELAY_GROUP : STRING := "csi_dly_grp"; + C_CALIB_WAIT : INTEGER := 2047; + C_ACC_LIMIT : INTEGER := 100000; + C_RATE_LIMIT : INTEGER := 5 +); +port ( + clock_upd_req : in STD_LOGIC; + clock_upd_ack : out STD_LOGIC; + in_clk_p : in STD_LOGIC; + in_clk_n : in STD_LOGIC; + in_ref_clk : in STD_LOGIC; + out_dclk : out STD_LOGIC; + out_pclk : out STD_LOGIC; + out_uclk : out STD_LOGIC +); +end component; + +component line_if is +generic ( + C_DIFF_TERM : BOOLEAN := FALSE +); +port ( + in_d_p : in STD_LOGIC; + in_d_n : in STD_LOGIC; + in_pclk : in STD_LOGIC; + in_dclk : in STD_LOGIC; + in_rst : in STD_LOGIC; + out_data : out STD_LOGIC_VECTOR(7 downto 0) +); +end component; +---------------------------------------------------------------------------------- +constant C_ACC_LIMIT : INTEGER := 1000000; +attribute IODELAY_GROUP : STRING; +signal rst_iserdes : STD_LOGIC; +signal dclk : STD_LOGIC; +signal pclk : STD_LOGIC; +signal uclk : STD_LOGIC; +signal prev_raw_valid : STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); +signal line_raw_sync : STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); +signal line_raw_out : STD_LOGIC_VECTOR(C_NUM_LANES*8-1 downto 0); +signal raw_valid : STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); +signal raw_fe_data : STD_LOGIC_VECTOR(C_NUM_LANES*8-1 downto 0); +signal raw_fe_valid : STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); +signal swap_vec : STD_LOGIC_VECTOR(3 downto 0); +signal clock_upd_req : STD_LOGIC; +signal clock_upd_ack : STD_LOGIC; +signal data_err_i : UNSIGNED(C_NUM_LANES-1 downto 0); +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +swap_vec(0) <= '1' when C_D0_SWAP = TRUE else '0'; +swap_vec(1) <= '1' when C_D1_SWAP = TRUE else '0'; +swap_vec(2) <= '1' when C_D2_SWAP = TRUE else '0'; +swap_vec(3) <= '1' when C_D3_SWAP = TRUE else '0'; +---------------------------------------------------------------------------------- +IDELAYCTRL_gen: if (C_ADD_IDELAYCTRL = TRUE) and (C_USE_DELAY = TRUE) generate +attribute IODELAY_GROUP of IdlyCtrl_inst_0 : label is C_IODELAY_GROUP; +begin + IdlyCtrl_inst_0 : IDELAYCTRL + port map ( + REFCLK => in_delay_clk, + RST => '0', + RDY => open + ); +end generate; +---------------------------------------------------------------------------------- +process(in_delay_clk) +begin + if(in_delay_clk = '1' and in_delay_clk'event)then + clock_upd_req <= trig_req; + end if; +end process; +---------------------------------------------------------------------------------- +clock_system_inst: phy_clock_system +generic map( + C_USE_DELAY => C_USE_DELAY, + C_DIFF_TERM => C_DIFF_TERM, + C_IODELAY_GROUP => C_IODELAY_GROUP, + C_CALIB_WAIT => C_CALIB_WAIT, + C_ACC_LIMIT => C_ACC_LIMIT, + C_RATE_LIMIT => C_RATE_LIMIT +) +port map( + clock_upd_req => clock_upd_req, + clock_upd_ack => clock_upd_ack, + in_clk_p => clk_rxp, + in_clk_n => clk_rxn, + in_ref_clk => in_delay_clk, + out_dclk => dclk, + out_pclk => pclk, + out_uclk => uclk +); +rst_iserdes <= '0'; + +bits_gen: for i in 0 to C_NUM_LANES-1 generate +begin + line_if_inst: line_if + generic map( + C_DIFF_TERM => C_DIFF_TERM + ) + port map( + in_d_p => data_rxp(i), + in_d_n => data_rxn(i), + in_pclk => pclk, + in_dclk => dclk, + in_rst => rst_iserdes, + out_data => line_raw_out(i*8+7 downto i*8) + ); +end generate; + +without_lp_gen: if C_NUM_LP_LANES = 0 generate +begin + raw_valid <= (others => '1'); + line_raw_sync <= (others => '0'); +end generate; + +with_lp_gen: if C_NUM_LP_LANES > 0 generate +begin +process(pclk) +begin + if(pclk = '1' and pclk'event)then + for i in 0 to C_NUM_LP_LANES-1 loop + raw_valid(i) <= not (data_lp_p(i) or data_lp_n(i)); + prev_raw_valid(i) <= raw_valid(i); + if((prev_raw_valid(i) = '0') and ((data_lp_p(i) or data_lp_n(i)) = '0'))then + line_raw_sync(i) <= '1'; + else + line_raw_sync(i) <= '0'; + end if; + end loop; + end if; +end process; + +ext_lp_gen: if C_NUM_LP_LANES < C_NUM_LANES generate +begin + process(pclk) + begin + if(pclk = '1' and pclk'event)then + for i in C_NUM_LP_LANES to C_NUM_LANES-1 loop + raw_valid(i) <= not (data_lp_p(0) or data_lp_n(0)); + prev_raw_valid(i) <= raw_valid(i); + if((prev_raw_valid(i) = '0') and ((data_lp_p(0) or data_lp_n(0)) = '0'))then + line_raw_sync(i) <= '1'; + else + line_raw_sync(i) <= '0'; + end if; + end loop; + end if; + end process; +end generate; +end generate; + +process(uclk) +begin + if(uclk = '0' and uclk'event)then + for i in 0 to C_NUM_LANES-1 loop + if(swap_vec(i) = '0')then + raw_fe_data(i*8+7 downto i*8) <= line_raw_out(i*8+7 downto i*8); + else + raw_fe_data(i*8+7 downto i*8) <= not line_raw_out(i*8+7 downto i*8); + end if; + end loop; + raw_fe_valid <= raw_valid; + end if; +end process; + +process(uclk) +begin + if(uclk = '1' and uclk'event)then + dl0_rxvalidhs <= raw_fe_valid(0); + dl0_rxactivehs <= raw_fe_valid(0); + dl0_datahs <= raw_fe_data(7 downto 0); + dl0_rxsynchs <= line_raw_sync(0); + end if; +end process; + +lane_1_gen: if C_NUM_LANES > 1 generate +begin + process(uclk) + begin + if(uclk = '1' and uclk'event)then + dl1_rxvalidhs <= raw_fe_valid(1); + dl1_rxactivehs <= raw_fe_valid(1); + dl1_datahs <= raw_fe_data(15 downto 8); + dl1_rxsynchs <= line_raw_sync(1); + end if; + end process; +end generate; + +lane_2_gen: if C_NUM_LANES > 2 generate +begin + process(uclk) + begin + if(uclk = '1' and uclk'event)then + dl2_rxvalidhs <= raw_fe_valid(2); + dl2_rxactivehs <= raw_fe_valid(2); + dl2_datahs <= raw_fe_data(23 downto 16); + dl2_rxsynchs <= line_raw_sync(2); + end if; + end process; +end generate; + +lane_3_gen: if C_NUM_LANES > 3 generate +begin + process(uclk) + begin + if(uclk = '1' and uclk'event)then + dl3_rxvalidhs <= raw_fe_valid(3); + dl3_rxactivehs <= raw_fe_valid(3); + dl3_datahs <= raw_fe_data(31 downto 24); + dl3_rxsynchs <= line_raw_sync(3); + end if; + end process; +end generate; + +rxbyteclkhs <= uclk; -- Main byte clock bitrate/8 +cl_stopstate <= '0'; -- PPI StopState +cl_rxclkactivehs <= '1'; -- optional, PPI RxClkActiveHS +---------------------------------------------------------------------------------- +end Behavioral; + diff --git a/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc new file mode 100644 index 0000000..c7c796f --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc @@ -0,0 +1,4 @@ +set_false_path -from [get_pins clock_system_inst/invers_clk_s_reg/C] -to [get_pins clock_system_inst/dly_gen.BUFGCTRL_inst/S1] +set_false_path -from [get_pins clock_system_inst/invers_clk_c_reg/C] -to [get_pins clock_system_inst/dly_gen.BUFGCTRL_inst/CE1] +set_false_path -from [get_pins clock_system_inst/direct_clk_s_reg/C] -to [get_pins clock_system_inst/dly_gen.BUFGCTRL_inst/S0] +set_false_path -from [get_pins clock_system_inst/direct_clk_c_reg/C] -to [get_pins clock_system_inst/dly_gen.BUFGCTRL_inst/CE0] diff --git a/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd new file mode 100644 index 0000000..0e879fb --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd @@ -0,0 +1,97 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity line_if is +generic ( + C_DIFF_TERM : BOOLEAN := FALSE +); +port ( + in_d_p : in STD_LOGIC; + in_d_n : in STD_LOGIC; + in_pclk : in STD_LOGIC; + in_dclk : in STD_LOGIC; + in_rst : in STD_LOGIC; + out_data : out STD_LOGIC_VECTOR(7 downto 0) +); +end line_if; +---------------------------------------------------------------------------------- +architecture arch_imp of line_if is +---------------------------------------------------------------------------------- +signal data_s : STD_LOGIC; +signal data_iserdes : STD_LOGIC_VECTOR(7 downto 0); +signal dclk_n : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +d_ibufds_inst : IBUFDS +generic map ( + DIFF_TERM => C_DIFF_TERM +) +port map ( + I => in_d_p, + IB => in_d_n, + O => data_s +); + +dclk_n <= not in_dclk; +ISERDESE2_inst : ISERDESE2 +generic map ( + DATA_RATE => "DDR", -- DDR, SDR + DATA_WIDTH => 8, -- Parallel data width (2-8,10,14) + DYN_CLKDIV_INV_EN => "FALSE", -- Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE) + DYN_CLK_INV_EN => "FALSE", -- Enable DYNCLKINVSEL inversion (FALSE, TRUE) + INIT_Q1 => '0', + INIT_Q2 => '0', + INIT_Q3 => '0', + INIT_Q4 => '0', + INTERFACE_TYPE => "NETWORKING", -- MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE + IOBDELAY => "NONE", -- NONE, BOTH, IBUF, IFD + NUM_CE => 2, -- Number of clock enables (1,2) + OFB_USED => "FALSE", -- Select OFB path (FALSE, TRUE) + SERDES_MODE => "MASTER", -- MASTER, SLAVE + SRVAL_Q1 => '0', + SRVAL_Q2 => '0', + SRVAL_Q3 => '0', + SRVAL_Q4 => '0' +) +port map ( + O => open, -- 1-bit output: Combinatorial output + Q1 => data_iserdes(7), + Q2 => data_iserdes(6), + Q3 => data_iserdes(5), + Q4 => data_iserdes(4), + Q5 => data_iserdes(3), + Q6 => data_iserdes(2), + Q7 => data_iserdes(1), + Q8 => data_iserdes(0), + SHIFTOUT1 => open, + SHIFTOUT2 => open, + BITSLIP => '0', -- 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to + CE1 => '1', + CE2 => '1', + CLKDIVP => '0', -- 1-bit input: TBD + CLK => in_dclk, -- 1-bit input: High-speed clock + CLKB => dclk_n, -- 1-bit input: High-speed secondary clock + CLKDIV => in_pclk, -- 1-bit input: Divided clock + OCLK => '0', -- 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY" + DYNCLKDIVSEL => '0', -- 1-bit input: Dynamic CLKDIV inversion + DYNCLKSEL => '0', -- 1-bit input: Dynamic CLK/CLKB inversion + D => data_s, -- 1-bit input: Data input + DDLY => '0', -- 1-bit input: Serial data from IDELAYE2 + OFB => '0', -- 1-bit input: Data feedback from OSERDESE2 + OCLKB => '0', -- 1-bit input: High speed negative edge output clock + RST => in_rst, -- 1-bit input: Active high asynchronous reset + SHIFTIN1 => '0', + SHIFTIN2 => '0' +); + +out_data <= data_iserdes; +--------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/phy_clock_system.vhd b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/phy_clock_system.vhd new file mode 100644 index 0000000..942a2c1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/hdl/phy_clock_system.vhd @@ -0,0 +1,316 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity phy_clock_system is +generic ( + C_USE_DELAY : BOOLEAN := FALSE; + C_DIFF_TERM : BOOLEAN := FALSE; + C_IDELAY_TYPE : STRING := "FIXED"; + C_IODELAY_GROUP : STRING := "csi_dly_grp"; + C_ACC_LIMIT : INTEGER := 100000; + C_RATE_LIMIT : INTEGER := 5; + C_CALIB_WAIT : INTEGER := 2047 +); +port ( + -- Debug + --cntvalue_out : out STD_LOGIC_VECTOR(4 downto 0); + --state_out : out STD_LOGIC_VECTOR(3 downto 0); + + clock_upd_req : in STD_LOGIC; + clock_upd_ack : out STD_LOGIC; + in_clk_p : in STD_LOGIC; + in_clk_n : in STD_LOGIC; + in_ref_clk : in STD_LOGIC; + out_dclk : out STD_LOGIC; + out_pclk : out STD_LOGIC; + out_uclk : out STD_LOGIC +); +end phy_clock_system; +---------------------------------------------------------------------------------- +architecture arch_imp of phy_clock_system is +---------------------------------------------------------------------------------- +attribute IODELAY_GROUP : STRING; +---------------------------------------------------------------------------------- +signal clk_g : STD_LOGIC; -- Clock after IBUFGDS +signal clk_d : STD_LOGIC; -- Clock after IDELAYE2 +signal clk_dn : STD_LOGIC; -- Clock after IDELAYE2 +signal clk_dg : STD_LOGIC; -- Clock after IBUFGDS +signal clk_bufmr : STD_LOGIC; +signal clk_bufio : STD_LOGIC; +signal clk_bufr : STD_LOGIC; +signal rst_bufmr : STD_LOGIC; +type sm_state_type is (ST_CHECK, ST_FIND_GOOD, ST_GOOD_WAIT, + ST_FIND_BAD, ST_BAD_WAIT, ST_CALK_DLY, ST_SET_DLY, ST_SET_WAIT); +signal sm_state : sm_state_type; +signal wait_cnt : integer range 0 to C_CALIB_WAIT; +signal delay_ce : STD_LOGIC; +signal delay_rst : STD_LOGIC; +signal delay_set : STD_LOGIC; +signal delay_set_val : STD_LOGIC_VECTOR(4 downto 0); +signal curr_delay : UNSIGNED(4 downto 0); +signal start_dly : UNSIGNED(5 downto 0); +signal end_dly : UNSIGNED(5 downto 0); +signal sum_dly : UNSIGNED(5 downto 0); +signal invers_clk : STD_LOGIC := '0'; +signal direct_clk : STD_LOGIC := '1'; +signal direct_clk_s : STD_LOGIC; +signal invers_clk_s : STD_LOGIC := '0'; +signal direct_clk_c : STD_LOGIC; +signal invers_clk_c : STD_LOGIC := '0'; +signal req_i : STD_LOGIC; +signal err_sr : STD_LOGIC_VECTOR(1 downto 0); +signal acc_cnt : INTEGER range 0 to C_ACC_LIMIT-1; +signal acc_val : INTEGER range 0 to C_ACC_LIMIT-1; +signal err_rate : INTEGER range 0 to C_ACC_LIMIT-1; +---------------------------------------------------------------------------------- +attribute ASYNC_REG : string; +attribute ASYNC_REG of req_i : signal is "true"; +attribute keep : string; +attribute keep of direct_clk_s : signal is "true"; +attribute keep of direct_clk_c : signal is "true"; +attribute keep of invers_clk_s : signal is "true"; +attribute keep of invers_clk_c : signal is "true"; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +-- Test +clk_ibufgds_inst : IBUFGDS +generic map ( + DIFF_TERM => C_DIFF_TERM +) +port map ( + I => in_clk_p, + IB => in_clk_n, + O => clk_g +); + +process(in_ref_clk) +begin + if(in_ref_clk = '1' and in_ref_clk'event)then + direct_clk_s <= not invers_clk; + invers_clk_s <= invers_clk; + direct_clk_c <= not invers_clk; + invers_clk_c <= invers_clk; + end if; +end process; +--direct_clk <= not invers_clk; + +dly_gen: if C_USE_DELAY = TRUE generate +attribute IODELAY_GROUP of IDELAYE2_inst : label is C_IODELAY_GROUP; +begin + IDELAYE2_inst : IDELAYE2 + generic map ( + CINVCTRL_SEL => "FALSE", -- Enable dynamic clock inversion (FALSE, TRUE) + DELAY_SRC => "IDATAIN", -- Delay input (IDATAIN, DATAIN) + HIGH_PERFORMANCE_MODE => "TRUE", -- Reduced jitter ("TRUE"), Reduced power ("FALSE") + IDELAY_TYPE => "VAR_LOAD", -- FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE + IDELAY_VALUE => 0, -- Input delay tap setting (0-31) + PIPE_SEL => "FALSE", -- Select pipelined mode, FALSE, TRUE + REFCLK_FREQUENCY => 200.0, -- IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0). + SIGNAL_PATTERN => "CLOCK" -- DATA, CLOCK input signal + ) + port map ( + --CNTVALUEOUT => cntvalue_out,-- 5-bit output: Counter value output + CNTVALUEOUT => open, -- 5-bit output: Counter value output + DATAOUT => clk_d, -- 1-bit output: Delayed data output + C => in_ref_clk, -- 1-bit input: Clock input + CE => '0', -- 1-bit input: Active high enable increment/decrement input + CINVCTRL => '0', -- 1-bit input: Dynamic clock inversion input + CNTVALUEIN => delay_set_val, -- 5-bit input: Counter value input + DATAIN => '0', -- 1-bit input: Internal delay data input + IDATAIN => clk_g, -- 1-bit input: Data input from the I/O + INC => '1', -- 1-bit input: Increment / Decrement tap delay input + LD => delay_set, -- 1-bit input: Load IDELAY_VALUE input + LDPIPEEN => '0', -- 1-bit input: Enable PIPELINE register to load data input + REGRST => '0' -- 1-bit input: Active-high reset tap-delay input + ); + clk_dn <= not clk_d; + + BUFGCTRL_inst : BUFGCTRL + generic map ( + INIT_OUT => 0, -- Initial value of BUFGCTRL output (0/1) + PRESELECT_I0 => FALSE, -- BUFGCTRL output uses I0 input (TRUE/FALSE) + PRESELECT_I1 => FALSE -- BUFGCTRL output uses I1 input (TRUE/FALSE) + ) + port map ( + O => clk_dg, -- 1-bit output: Clock Output pin + CE0 => direct_clk_c, -- 1-bit input: Clock enable input for I0 input + CE1 => invers_clk_c, -- 1-bit input: Clock enable input for I1 input + I0 => clk_d, -- 1-bit input: Primary clock input + I1 => clk_dn, -- 1-bit input: Secondary clock input + IGNORE0 => '0', -- 1-bit input: Clock ignore input for I0 + IGNORE1 => '0', -- 1-bit input: Clock ignore input for I1 + S0 => direct_clk_s, -- 1-bit input: Clock select input for I0 + S1 => invers_clk_s -- 1-bit input: Clock select input for I1 + ); + + process(in_ref_clk) + begin + if(in_ref_clk = '1' and in_ref_clk'event)then + req_i <= clock_upd_req; + clock_upd_ack <= req_i; + err_sr <= err_sr(0) & req_i; + if(acc_cnt = C_ACC_LIMIT-1)then + acc_cnt <= 0; + err_rate <= acc_val; + acc_val <= 0; + else + if(err_sr = "01")then + acc_val <= acc_val + 1; + end if; + acc_cnt <= acc_cnt + 1; + end if; + end if; + end process; + + process(in_ref_clk) + begin + if(in_ref_clk = '1' and in_ref_clk'event)then + case sm_state is + when ST_CHECK => + if(err_rate > C_RATE_LIMIT)then + sm_state <= ST_GOOD_WAIT; + curr_delay <= (others => '0'); + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + else + delay_set <= '0'; + end if; + + when ST_FIND_GOOD => + if(req_i = '0')then -- We found start of the eye + sm_state <= ST_FIND_BAD; + start_dly <= resize(curr_delay,6); + else + if(curr_delay < TO_UNSIGNED(31,5))then + curr_delay <= curr_delay + 1; + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + sm_state <= ST_GOOD_WAIT; + else -- Data not found + invers_clk <= not invers_clk; + curr_delay <= (others => '0'); + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + sm_state <= ST_GOOD_WAIT; + end if; + end if; + + when ST_GOOD_WAIT => + delay_set <= '0'; + if(wait_cnt = 0)then + sm_state <= ST_FIND_GOOD; + else + wait_cnt <= wait_cnt - 1; + end if; + + when ST_FIND_BAD => + if((req_i = '1') or (curr_delay = TO_UNSIGNED(31,5)))then -- We found end of the eye + sm_state <= ST_CALK_DLY; + end_dly <= resize(curr_delay,6); + else + curr_delay <= curr_delay + 1; + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + sm_state <= ST_BAD_WAIT; + end if; + + when ST_BAD_WAIT => + delay_set <= '0'; + if(wait_cnt = 0)then + sm_state <= ST_FIND_BAD; + else + wait_cnt <= wait_cnt - 1; + end if; + + when ST_CALK_DLY => + sum_dly <= start_dly + end_dly; + sm_state <= ST_SET_DLY; + + when ST_SET_DLY => + curr_delay <= sum_dly(5 downto 1); + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + sm_state <= ST_SET_WAIT; + + when ST_SET_WAIT => + delay_set <= '0'; + if(wait_cnt = 0)then + sm_state <= ST_CHECK; + else + wait_cnt <= wait_cnt - 1; + end if; + end case; + end if; + end process; + delay_set_val <= STD_LOGIC_VECTOR(curr_delay); + + -- process(in_ref_clk) + -- begin + -- if(in_ref_clk = '1' and in_ref_clk'event)then + -- case sm_state is + -- when ST_CHECK => state_out <= x"0"; + -- when ST_FIND_GOOD => state_out <= x"2"; + -- when ST_GOOD_WAIT => state_out <= x"3"; + -- when ST_FIND_BAD => state_out <= x"4"; + -- when ST_BAD_WAIT => state_out <= x"5"; + -- when ST_CALK_DLY => state_out <= x"6"; + -- when ST_SET_DLY => state_out <= x"7"; + -- when ST_SET_WAIT => state_out <= x"8"; + -- end case; + -- end if; + -- end process; + +end generate; + +no_dly_gen: if C_USE_DELAY = FALSE generate +begin + clk_dg <= clk_g; +end generate; + +BUFMRCE_inst : BUFMRCE +generic map ( + CE_TYPE => "ASYNC", -- SYNC, ASYNC + INIT_OUT => 0 -- Initial output and stopped polarity, (0-1) +) +port map ( + O => clk_bufmr, -- 1-bit output: Clock output (connect to BUFIOs/BUFRs) + CE => '1', -- 1-bit input: Active high buffer enable + I => clk_dg -- 1-bit input: Clock input (Connect to IBUF) +); + +BUFIO_inst : BUFIO +port map ( + O => clk_bufio, -- 1-bit output: Clock output (connect to I/O clock loads). + I => clk_bufmr -- 1-bit input: Clock input (connect to an IBUF or BUFMR). +); +out_dclk <= clk_bufio; + +rst_bufmr <= '0'; +BUFR_inst : BUFR +generic map ( + BUFR_DIVIDE => "4", -- Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8" + SIM_DEVICE => "7SERIES" -- Must be set to "7SERIES" +) +port map ( + O => clk_bufr, -- 1-bit output: Clock output port + CE => '1', -- 1-bit input: Active high, clock enable (Divided modes only) + CLR => rst_bufmr, -- 1-bit input: Active high, asynchronous clear (Divided modes only) + I => clk_bufmr -- 1-bit input: Clock buffer input driven by an IBUF, MMCM or local interconnect +); +out_pclk <= clk_bufr; + +usr_BUFG_inst : BUFG +port map ( + O => out_uclk, -- 1-bit output: Clock output + I => clk_bufr -- 1-bit input: Clock input +); +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/xgui/csi2_d_phy_rx_v1_0.tcl b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/xgui/csi2_d_phy_rx_v1_0.tcl new file mode 100644 index 0000000..ad3c5bd --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi2_d_phy_rx_1.0/xgui/csi2_d_phy_rx_v1_0.tcl @@ -0,0 +1,198 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_NUM_LANES" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_NUM_LP_LANES" -parent ${Page_0} -widget comboBox + #Adding Group + set Camera_Interface [ipgui::add_group $IPINST -name "Camera Interface" -parent ${Page_0}] + ipgui::add_param $IPINST -name "C_DIFF_TERM" -parent ${Camera_Interface} + ipgui::add_param $IPINST -name "C_D0_SWAP" -parent ${Camera_Interface} + ipgui::add_param $IPINST -name "C_D1_SWAP" -parent ${Camera_Interface} + ipgui::add_param $IPINST -name "C_D2_SWAP" -parent ${Camera_Interface} + set C_D3_SWAP [ipgui::add_param $IPINST -name "C_D3_SWAP" -parent ${Camera_Interface}] + set_property tooltip {D3 P/N Swap} ${C_D3_SWAP} + + #Adding Group + set Clocking_System [ipgui::add_group $IPINST -name "Clocking System" -parent ${Page_0}] + ipgui::add_param $IPINST -name "C_USE_DELAY" -parent ${Clocking_System} + set C_IODELAY_GROUP [ipgui::add_param $IPINST -name "C_IODELAY_GROUP" -parent ${Clocking_System}] + set_property tooltip {Iodelay Group} ${C_IODELAY_GROUP} + ipgui::add_param $IPINST -name "C_ADD_IDELAYCTRL" -parent ${Clocking_System} + ipgui::add_param $IPINST -name "C_CALIB_WAIT" -parent ${Clocking_System} + ipgui::add_param $IPINST -name "C_RATE_LIMIT" -parent ${Clocking_System} + + + +} + +proc update_PARAM_VALUE.C_ADD_IDELAYCTRL { PARAM_VALUE.C_ADD_IDELAYCTRL } { + # Procedure called to update C_ADD_IDELAYCTRL when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_ADD_IDELAYCTRL { PARAM_VALUE.C_ADD_IDELAYCTRL } { + # Procedure called to validate C_ADD_IDELAYCTRL + return true +} + +proc update_PARAM_VALUE.C_CALIB_WAIT { PARAM_VALUE.C_CALIB_WAIT } { + # Procedure called to update C_CALIB_WAIT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_CALIB_WAIT { PARAM_VALUE.C_CALIB_WAIT } { + # Procedure called to validate C_CALIB_WAIT + return true +} + +proc update_PARAM_VALUE.C_D0_SWAP { PARAM_VALUE.C_D0_SWAP } { + # Procedure called to update C_D0_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D0_SWAP { PARAM_VALUE.C_D0_SWAP } { + # Procedure called to validate C_D0_SWAP + return true +} + +proc update_PARAM_VALUE.C_D1_SWAP { PARAM_VALUE.C_D1_SWAP } { + # Procedure called to update C_D1_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D1_SWAP { PARAM_VALUE.C_D1_SWAP } { + # Procedure called to validate C_D1_SWAP + return true +} + +proc update_PARAM_VALUE.C_D2_SWAP { PARAM_VALUE.C_D2_SWAP } { + # Procedure called to update C_D2_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D2_SWAP { PARAM_VALUE.C_D2_SWAP } { + # Procedure called to validate C_D2_SWAP + return true +} + +proc update_PARAM_VALUE.C_D3_SWAP { PARAM_VALUE.C_D3_SWAP } { + # Procedure called to update C_D3_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D3_SWAP { PARAM_VALUE.C_D3_SWAP } { + # Procedure called to validate C_D3_SWAP + return true +} + +proc update_PARAM_VALUE.C_DIFF_TERM { PARAM_VALUE.C_DIFF_TERM } { + # Procedure called to update C_DIFF_TERM when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_DIFF_TERM { PARAM_VALUE.C_DIFF_TERM } { + # Procedure called to validate C_DIFF_TERM + return true +} + +proc update_PARAM_VALUE.C_IODELAY_GROUP { PARAM_VALUE.C_IODELAY_GROUP } { + # Procedure called to update C_IODELAY_GROUP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IODELAY_GROUP { PARAM_VALUE.C_IODELAY_GROUP } { + # Procedure called to validate C_IODELAY_GROUP + return true +} + +proc update_PARAM_VALUE.C_NUM_LANES { PARAM_VALUE.C_NUM_LANES } { + # Procedure called to update C_NUM_LANES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_NUM_LANES { PARAM_VALUE.C_NUM_LANES } { + # Procedure called to validate C_NUM_LANES + return true +} + +proc update_PARAM_VALUE.C_NUM_LP_LANES { PARAM_VALUE.C_NUM_LP_LANES } { + # Procedure called to update C_NUM_LP_LANES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_NUM_LP_LANES { PARAM_VALUE.C_NUM_LP_LANES } { + # Procedure called to validate C_NUM_LP_LANES + return true +} + +proc update_PARAM_VALUE.C_RATE_LIMIT { PARAM_VALUE.C_RATE_LIMIT } { + # Procedure called to update C_RATE_LIMIT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RATE_LIMIT { PARAM_VALUE.C_RATE_LIMIT } { + # Procedure called to validate C_RATE_LIMIT + return true +} + +proc update_PARAM_VALUE.C_USE_DELAY { PARAM_VALUE.C_USE_DELAY } { + # Procedure called to update C_USE_DELAY when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_USE_DELAY { PARAM_VALUE.C_USE_DELAY } { + # Procedure called to validate C_USE_DELAY + return true +} + + +proc update_MODELPARAM_VALUE.C_NUM_LANES { MODELPARAM_VALUE.C_NUM_LANES PARAM_VALUE.C_NUM_LANES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_NUM_LANES}] ${MODELPARAM_VALUE.C_NUM_LANES} +} + +proc update_MODELPARAM_VALUE.C_NUM_LP_LANES { MODELPARAM_VALUE.C_NUM_LP_LANES PARAM_VALUE.C_NUM_LP_LANES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_NUM_LP_LANES}] ${MODELPARAM_VALUE.C_NUM_LP_LANES} +} + +proc update_MODELPARAM_VALUE.C_D0_SWAP { MODELPARAM_VALUE.C_D0_SWAP PARAM_VALUE.C_D0_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D0_SWAP}] ${MODELPARAM_VALUE.C_D0_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D1_SWAP { MODELPARAM_VALUE.C_D1_SWAP PARAM_VALUE.C_D1_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D1_SWAP}] ${MODELPARAM_VALUE.C_D1_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D2_SWAP { MODELPARAM_VALUE.C_D2_SWAP PARAM_VALUE.C_D2_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D2_SWAP}] ${MODELPARAM_VALUE.C_D2_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D3_SWAP { MODELPARAM_VALUE.C_D3_SWAP PARAM_VALUE.C_D3_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D3_SWAP}] ${MODELPARAM_VALUE.C_D3_SWAP} +} + +proc update_MODELPARAM_VALUE.C_DIFF_TERM { MODELPARAM_VALUE.C_DIFF_TERM PARAM_VALUE.C_DIFF_TERM } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_DIFF_TERM}] ${MODELPARAM_VALUE.C_DIFF_TERM} +} + +proc update_MODELPARAM_VALUE.C_ADD_IDELAYCTRL { MODELPARAM_VALUE.C_ADD_IDELAYCTRL PARAM_VALUE.C_ADD_IDELAYCTRL } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_ADD_IDELAYCTRL}] ${MODELPARAM_VALUE.C_ADD_IDELAYCTRL} +} + +proc update_MODELPARAM_VALUE.C_IODELAY_GROUP { MODELPARAM_VALUE.C_IODELAY_GROUP PARAM_VALUE.C_IODELAY_GROUP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IODELAY_GROUP}] ${MODELPARAM_VALUE.C_IODELAY_GROUP} +} + +proc update_MODELPARAM_VALUE.C_USE_DELAY { MODELPARAM_VALUE.C_USE_DELAY PARAM_VALUE.C_USE_DELAY } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_USE_DELAY}] ${MODELPARAM_VALUE.C_USE_DELAY} +} + +proc update_MODELPARAM_VALUE.C_CALIB_WAIT { MODELPARAM_VALUE.C_CALIB_WAIT PARAM_VALUE.C_CALIB_WAIT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_CALIB_WAIT}] ${MODELPARAM_VALUE.C_CALIB_WAIT} +} + +proc update_MODELPARAM_VALUE.C_RATE_LIMIT { MODELPARAM_VALUE.C_RATE_LIMIT PARAM_VALUE.C_RATE_LIMIT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RATE_LIMIT}] ${MODELPARAM_VALUE.C_RATE_LIMIT} +} + diff --git a/zynqberrydemo1/ip_lib/csi_to_axis_1.0/bd/bd.tcl b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo1/ip_lib/csi_to_axis_1.0/component.xml b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/component.xml new file mode 100644 index 0000000..f123cdd --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/component.xml @@ -0,0 +1,1180 @@ + + + trenz.biz + user + csi_to_axis + 1.0 + + + M_AXIS + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TUSER + + + m_axis_tuser + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + + WIZ_DATA_WIDTH + 32 + + + + + RX_MIPI_PPI + RX_MIPI_PPI + RX_MIPI_PPI + + + + + + + DL1_RXACTIVEHS + + + dl1_rxactivehs + + + + + DL0_RXSYNCHS + + + dl0_rxsynchs + + + + + DL1_RXVALIDHS + + + dl1_rxvalidhs + + + + + CL_ENABLE + + + cl_enable + + + + + DL1_RXDATAHS + + + dl1_datahs + + + + + DL0_RXACTIVEHS + + + dl0_rxactivehs + + + + + CL_STOPSTATE + + + cl_stopstate + + + + + DL1_RXSYNCHS + + + dl1_rxsynchs + + + + + DL0_ENABLE + + + dl0_enable + + + + + DL0_RXDATAHS + + + dl0_datahs + + + + + DL1_ENABLE + + + dl1_enable + + + + + DL0_RXVALIDHS + + + dl0_rxvalidhs + + + + + CL_RXCLKACTIVEHS + + + cl_rxclkactivehs + + + + + DL2_RXSYNCHS + + + dl2_rxsynchs + + + + + DL3_RXACTIVEHS + + + dl3_rxactivehs + + + + + DL3_RXDATAHS + + + dl3_datahs + + + + + DL2_RXDATAHS + + + dl2_datahs + + + + + DL3_RXSYNCHS + + + dl3_rxsynchs + + + + + DL3_RXVALIDHS + + + dl3_rxvalidhs + + + + + DL3_ENABLE + + + dl3_enable + + + + + DL2_RXVALIDHS + + + dl2_rxvalidhs + + + + + DL2_RXACTIVEHS + + + dl2_rxactivehs + + + + + DL2_ENABLE + + + dl2_enable + + + + + + m_axis_aresetn + + + + + + + RST + + + m_axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + m_axis_aclk + + + + + + + CLK + + + m_axis_aclk + + + + + + ASSOCIATED_BUSIF + M_AXIS + + + ASSOCIATED_RESET + m_axis_aresetn + + + + + data_err + + + + + + + ACK + + + trig_ack + + + + + TRIG + + + trig_req + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + csi_to_axis_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 86b17c2f + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + csi_to_axis_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + c5d94c0e + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 3bb3a441 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + enable_in + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + rxbyteclkhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + cl_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0x1 + + + + + cl_stopstate + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + cl_rxclkactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl0_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0x1 + + + + + dl0_rxactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl0_rxvalidhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl0_rxsynchs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl0_datahs + + in + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl1_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0x1 + + + + + + true + + + + + + dl1_rxactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + true + + + + + + dl1_rxvalidhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + true + + + + + + dl1_rxsynchs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + true + + + + + + dl1_datahs + + in + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + true + + + + + + dl2_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + false + + + + + + dl2_rxactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + dl2_rxvalidhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + dl2_rxsynchs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + dl2_datahs + + in + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + dl3_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + false + + + + + + dl3_rxactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + dl3_rxvalidhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + dl3_rxsynchs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + dl3_datahs + + in + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + trig_req + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + trig_ack + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + m_axis_tdata + + out + + 15 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + m_axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_M_AXIS_TDATA_WIDTH + C M AXIS TDATA WIDTH + Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH. + 32 + + + C_LANES + C Lanes + 2 + + + C_TIMEOUT + C Timeout + 127 + + + + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_list_e6469819 + 1 + 2 + 4 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/csi_to_axis.xdc + xdc + USED_IN_implementation + USED_IN_synthesis + + + hdl/csi2_parser.vhd + vhdlSource + + + hdl/lane_align.vhd + vhdlSource + + + hdl/lane_merge.vhd + vhdlSource + + + hdl/csi_to_axis_v1_0.vhd + vhdlSource + CHECKSUM_9c64e067 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/csi2_parser.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/lane_align.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/lane_merge.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/csi_to_axis_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/csi_to_axis_v1_0.tcl + tclSource + CHECKSUM_67ac9fac + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + CSI-2 to AXI4-Stream + + + C_M_AXIS_TDATA_WIDTH + C M AXIS TDATA WIDTH + Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH. + 32 + + + + false + + + + + + Component_Name + csi_to_axis_v1_0 + + + C_LANES + Data Lanes + 2 + + + C_TIMEOUT + Line Align Timeout + 127 + + + + + + virtex7 + artix7 + kintex7 + zynq + qzynq + + + /AXI_Peripheral + /Video_&_Image_Processing + + CSI-2 to AXI4-Stream v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 46 + + xilinx.com:user:csi_to_axis:1.0 + + 2017-05-17T10:14:06Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/csi_to_axis_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/csi_to_axis_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi2_parser.vhd b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi2_parser.vhd new file mode 100644 index 0000000..6b76fdb --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi2_parser.vhd @@ -0,0 +1,147 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity csi2_parser is +generic( + C_LANES : INTEGER range 1 to 4 := 2 +); +port ( + enable_in : in STD_LOGIC; + resync_out : out STD_LOGIC; + axis_aclk : in STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + s_axis_tvalid : in STD_LOGIC; + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + + frame_start_dbg : out STD_LOGIC; + line_start_dbg : out STD_LOGIC; + packet_id_dbg : out STD_LOGIC_VECTOR(7 downto 0); + packet_id_upd : out STD_LOGIC; + packet_size_dbg : out STD_LOGIC_VECTOR(15 downto 0); + transfer_cnt_dbg : out STD_LOGIC_VECTOR(15 downto 0) +); +end csi2_parser; +---------------------------------------------------------------------------------- +architecture arch_imp of csi2_parser is +---------------------------------------------------------------------------------- +constant C_SOT : STD_LOGIC_VECTOR(7 downto 0) := x"B8"; +constant C_RAW10 : STD_LOGIC_VECTOR(7 downto 0) := x"2B"; +constant C_EOF : STD_LOGIC_VECTOR(7 downto 0) := x"01"; +constant C_WAIT : INTEGER := 15; +---------------------------------------------------------------------------------- +type sm_state_type is (ST_IDLE, ST_HDRA, ST_HDRB, ST_TRANSFER, ST_RESYNC); +signal sm_state : sm_state_type := ST_IDLE; +---------------------------------------------------------------------------------- +signal packet_size : STD_LOGIC_VECTOR(15 downto 0); +signal packet_cs : STD_LOGIC_VECTOR( 7 downto 0); +signal packet_id : STD_LOGIC_VECTOR( 7 downto 0); +signal transfer_cnt : UNSIGNED(15 downto 0); +signal start_of_frame : STD_LOGIC; +signal start_of_line : STD_LOGIC; +signal enable_req : STD_LOGIC; +signal enable : STD_LOGIC; +signal wait_cnt : INTEGER range 0 to C_WAIT-1 := 0; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + m_axis_tdata <= s_axis_tdata; + enable_req <= enable_in; + case sm_state is + when ST_IDLE => + m_axis_tvalid <= '0'; + m_axis_tlast <= '0'; + packet_id_upd <= '0'; + if(s_axis_tvalid = '1')then + if((s_axis_tdata(7 downto 0) = C_SOT) and (s_axis_tdata(15 downto 8) = C_SOT))then + sm_state <= ST_HDRA; + else + sm_state <= ST_RESYNC; + end if; + end if; + when ST_RESYNC => + m_axis_tvalid <= '0'; + m_axis_tlast <= '0'; + if(s_axis_tvalid = '0')then + sm_state <= ST_IDLE; + end if; + when ST_HDRA => + if(s_axis_tvalid = '1')then + packet_size( 7 downto 0) <= s_axis_tdata(15 downto 8); + packet_id <= s_axis_tdata( 7 downto 0); + if((s_axis_tdata( 7 downto 0) = C_RAW10) or (s_axis_tdata( 7 downto 0) = C_EOF))then -- Correct ID + sm_state <= ST_HDRB; + else + sm_state <= ST_RESYNC; + end if; + else + sm_state <= ST_RESYNC; + end if; + when ST_HDRB => + if(s_axis_tvalid = '1')then + packet_cs <= s_axis_tdata(15 downto 8); + packet_size(15 downto 8) <= s_axis_tdata( 7 downto 0); + if(packet_id = C_RAW10)then + sm_state <= ST_TRANSFER; + transfer_cnt <= (others => '0'); + start_of_line <= '1'; + else + sm_state <= ST_RESYNC; + packet_id_dbg <= packet_id; + packet_id_upd <= '1'; + end if; + if(packet_id = C_EOF)then + start_of_frame <= '1'; + enable <= enable_req; + end if; + else + sm_state <= ST_RESYNC; + end if; + when ST_TRANSFER => + if(s_axis_tvalid = '1')then + start_of_frame <= '0'; + start_of_line <= '0'; + m_axis_tuser <= start_of_frame; + m_axis_tvalid <= enable; + if(transfer_cnt >= (UNSIGNED(packet_size)-2))then + m_axis_tlast <= '1'; + sm_state <= ST_RESYNC; + else + transfer_cnt <= transfer_cnt + 2; + end if; + else + m_axis_tlast <= '1'; + sm_state <= ST_IDLE; + end if; + end case; + end if; +end process; + +frame_start_dbg <= start_of_frame; +line_start_dbg <= start_of_line; +packet_size_dbg <= packet_size; +transfer_cnt_dbg <= STD_LOGIC_VECTOR(transfer_cnt); + +process(sm_state) +begin + if( + ((sm_state = ST_IDLE) and (s_axis_tvalid = '1') and ((s_axis_tdata(7 downto 0) /= C_SOT) or (s_axis_tdata(15 downto 8) /= C_SOT))) or + ((sm_state = ST_HDRA) and not ((s_axis_tdata( 7 downto 0) = C_RAW10) or (s_axis_tdata( 7 downto 0) = C_EOF))) + )then + resync_out <= '1'; + else + resync_out <= '0'; + end if; +end process; +--------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis.xdc b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis.xdc new file mode 100644 index 0000000..d270ab4 --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis.xdc @@ -0,0 +1 @@ +set_false_path -to [get_pins parser_inst/enable_req_reg/D] \ No newline at end of file diff --git a/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd new file mode 100644 index 0000000..a475d76 --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd @@ -0,0 +1,272 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity csi_to_axis_v1_0 is +generic ( + C_M_AXIS_TDATA_WIDTH : INTEGER := 32; + C_LANES : INTEGER range 1 to 4 := 2; + C_TIMEOUT : INTEGER := 127 +); +port ( + -- Transfer enable + enable_in : in STD_LOGIC; + -- MIPI PPI + rxbyteclkhs : in STD_LOGIC; + cl_enable : out STD_LOGIC := '1'; + cl_stopstate : in STD_LOGIC; + cl_rxclkactivehs : in STD_LOGIC; + dl0_enable : out STD_LOGIC := '1'; + dl0_rxactivehs : in STD_LOGIC; + dl0_rxvalidhs : in STD_LOGIC; + dl0_rxsynchs : in STD_LOGIC; + dl0_datahs : in STD_LOGIC_VECTOR(7 downto 0); + dl1_enable : out STD_LOGIC; + dl1_rxactivehs : in STD_LOGIC; + dl1_rxvalidhs : in STD_LOGIC; + dl1_rxsynchs : in STD_LOGIC; + dl1_datahs : in STD_LOGIC_VECTOR(7 downto 0); + dl2_enable : out STD_LOGIC; + dl2_rxactivehs : in STD_LOGIC; + dl2_rxvalidhs : in STD_LOGIC; + dl2_rxsynchs : in STD_LOGIC; + dl2_datahs : in STD_LOGIC_VECTOR(7 downto 0); + dl3_enable : out STD_LOGIC; + dl3_rxactivehs : in STD_LOGIC; + dl3_rxvalidhs : in STD_LOGIC; + dl3_rxsynchs : in STD_LOGIC; + dl3_datahs : in STD_LOGIC_VECTOR(7 downto 0); + -- Status + trig_req : out STD_LOGIC; + trig_ack : in STD_LOGIC; + -- AXIS + m_axis_aclk : in STD_LOGIC; + m_axis_aresetn : in STD_LOGIC; + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC + -- -- Debug +-- raw_data_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- raw_valid_dbg : out STD_LOGIC_VECTOR( 1 downto 0); +-- align_data_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- align_valid_dbg : out STD_LOGIC_VECTOR( 1 downto 0); +-- merge_data_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- merge_valid_dbg : out STD_LOGIC; +-- frame_start_dbg : out STD_LOGIC; +-- line_start_dbg : out STD_LOGIC; +-- parse_data_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- parse_valid_dbg : out STD_LOGIC; +-- parse_user_dbg : out STD_LOGIC; +-- parse_last_dbg : out STD_LOGIC; +-- packet_id_dbg : out STD_LOGIC_VECTOR( 7 downto 0); +-- packet_id_upd_dbd : out STD_LOGIC; +-- packet_size_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- transfer_cnt_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- align_resync_dbg : out STD_LOGIC; +-- merge_resync_dbg : out STD_LOGIC +); +end csi_to_axis_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of csi_to_axis_v1_0 is +---------------------------------------------------------------------------------- +component lane_align is +generic( + C_LANES : INTEGER range 1 to 4 := 2; + C_TIMEOUT : INTEGER := 127 +); +port ( + clk_in : in STD_LOGIC; + resync : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_in : in STD_LOGIC_VECTOR(C_LANES-1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_out : out STD_LOGIC_VECTOR(C_LANES-1 downto 0); + err_req : out STD_LOGIC; + err_ack : in STD_LOGIC +); +end component; + +component lane_merge is +generic( + C_LANES : INTEGER range 1 to 4 := 2 +); +port( + clk_in : in STD_LOGIC; + resync_in : in STD_LOGIC; + resync_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_in : in STD_LOGIC_VECTOR(C_LANES-1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_out : out STD_LOGIC +); +end component; + +component csi2_parser is +generic( + C_LANES : INTEGER range 1 to 4 := 2 +); +port ( + enable_in : in STD_LOGIC; + resync_out : out STD_LOGIC; + axis_aclk : in STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + s_axis_tvalid : in STD_LOGIC; + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + -- Debug + frame_start_dbg : out STD_LOGIC; + line_start_dbg : out STD_LOGIC; + packet_id_dbg : out STD_LOGIC_VECTOR(7 downto 0); + packet_id_upd : out STD_LOGIC; + packet_size_dbg : out STD_LOGIC_VECTOR(15 downto 0); + transfer_cnt_dbg : out STD_LOGIC_VECTOR(15 downto 0) +); +end component; +---------------------------------------------------------------------------------- +signal pclk : STD_LOGIC; +signal raw_data : STD_LOGIC_VECTOR(8*C_LANES-1 downto 0); +signal align_data : STD_LOGIC_VECTOR(8*C_LANES-1 downto 0); +signal merge_data : STD_LOGIC_VECTOR(8*C_LANES-1 downto 0); +signal raw_valid : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +signal align_valid : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +signal merge_valid : STD_LOGIC; +signal tuser_drv : STD_LOGIC; +signal tlast_drv : STD_LOGIC; +signal tvalid_drv : STD_LOGIC; +signal tdata_drv : STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); +signal frame_start : STD_LOGIC; +signal line_start : STD_LOGIC; +signal packet_id : STD_LOGIC_VECTOR(7 downto 0); +signal packet_id_upd : STD_LOGIC; +signal packet_size : STD_LOGIC_VECTOR(15 downto 0); +signal transfer_cnt : STD_LOGIC_VECTOR(15 downto 0); +signal align_resync : STD_LOGIC; +signal merge_resync : STD_LOGIC; +signal parse_resync : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +pclk <= rxbyteclkhs; -- Main byte clock bitrate/8 +cl_enable <= '1'; -- PPI ShutDown ? +---------------------------------------------------------------------------------- +-- Lane 0 +dl0_enable <= '1'; +raw_valid(0) <= dl0_rxvalidhs; +raw_data( 7 downto 0) <= dl0_datahs; +---------------------------------------------------------------------------------- +-- Lane 1 +lane_1_gen: if C_LANES > 1 generate +begin + dl1_enable <= '1'; + raw_valid(1) <= dl1_rxvalidhs; + raw_data(15 downto 8) <= dl1_datahs; +end generate; +---------------------------------------------------------------------------------- +-- Lane 2 +lane_2_gen: if C_LANES > 2 generate +begin + dl2_enable <= '1'; + raw_valid(2) <= dl2_rxvalidhs; + raw_data(23 downto 16) <= dl2_datahs; +end generate; +---------------------------------------------------------------------------------- +-- Lane 3 +lane_3_gen: if C_LANES > 3 generate +begin + dl3_enable <= '1'; + raw_valid(3) <= dl3_rxvalidhs; + raw_data(31 downto 24) <= dl3_datahs; +end generate; +---------------------------------------------------------------------------------- +lane_align_inst: lane_align +generic map( + C_LANES => C_LANES, + C_TIMEOUT => C_TIMEOUT +) +port map( + clk_in => pclk, + resync => align_resync, + data_in => raw_data, + valid_in => raw_valid, + data_out => align_data, + valid_out => align_valid, + err_req => trig_req, + err_ack => trig_ack +); +---------------------------------------------------------------------------------- +lane_merge_inst: lane_merge +generic map( + C_LANES => C_LANES +) +port map( + clk_in => pclk, + resync_in => parse_resync, + resync_out => merge_resync, + data_in => align_data, + valid_in => align_valid, + data_out => merge_data, + valid_out => merge_valid +); +---------------------------------------------------------------------------------- +align_resync <= merge_resync or parse_resync; +---------------------------------------------------------------------------------- +parser_inst: csi2_parser +generic map( + C_LANES => C_LANES +) +port map( + enable_in => enable_in, + resync_out => parse_resync, + axis_aclk => pclk, + s_axis_tdata => merge_data, + s_axis_tvalid => merge_valid, + m_axis_tvalid => tvalid_drv, + m_axis_tdata => tdata_drv, + m_axis_tuser => tuser_drv, + m_axis_tlast => tlast_drv, + + frame_start_dbg => frame_start, + line_start_dbg => line_start, + packet_id_dbg => packet_id, + packet_id_upd => packet_id_upd, + packet_size_dbg => packet_size, + transfer_cnt_dbg => transfer_cnt +); +---------------------------------------------------------------------------------- +m_axis_tvalid <= tvalid_drv; +m_axis_tdata <= tdata_drv; +m_axis_tuser <= tuser_drv; +m_axis_tlast <= tlast_drv; +---------------------------------------------------------------------------------- +-- Debug +---------------------------------------------------------------------------------- +--raw_data_dbg <= raw_data; +--raw_valid_dbg <= raw_valid; +--align_data_dbg <= align_data; +--align_valid_dbg <= align_valid; +--merge_data_dbg <= merge_data; +--merge_valid_dbg <= merge_valid; +--frame_start_dbg <= frame_start; +--line_start_dbg <= line_start; +--parse_data_dbg <= tdata_drv; +--parse_valid_dbg <= tvalid_drv; +--parse_user_dbg <= tuser_drv; +--parse_last_dbg <= tlast_drv; +--packet_id_dbg <= packet_id; +--packet_id_upd_dbd <= packet_id_upd; +--packet_size_dbg <= packet_size; +--transfer_cnt_dbg <= transfer_cnt; +--align_resync_dbg <= align_resync; +--merge_resync_dbg <= merge_resync; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd new file mode 100644 index 0000000..40ddf67 --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd @@ -0,0 +1,123 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity lane_align is +generic( + C_LANES : INTEGER range 1 to 4 := 2; + C_TIMEOUT : INTEGER := 127 +); +port ( + clk_in : in STD_LOGIC; + resync : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_in : in STD_LOGIC_VECTOR(C_LANES-1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_out : out STD_LOGIC_VECTOR(C_LANES-1 downto 0); + err_req : out STD_LOGIC; + err_ack : in STD_LOGIC +); +end lane_align; +---------------------------------------------------------------------------------- +architecture arch_imp of lane_align is +---------------------------------------------------------------------------------- +constant C_SOT : STD_LOGIC_VECTOR(15 downto 0) := x"B800"; +constant ones_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0) := (others => '1'); +constant zero_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0) := (others => '0'); +constant C_CNT_LIMIT : integer := 1; +---------------------------------------------------------------------------------- +type sr_data_type is array (0 to C_LANES-1) of STD_LOGIC_VECTOR(23 downto 0); +signal data_sr : sr_data_type; +type buf_data_type is array (0 to C_LANES-1) of STD_LOGIC_VECTOR(15 downto 0); +signal data_dly : buf_data_type; +signal sot_found : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +type shift_type is array (0 to C_LANES-1) of integer range 0 to 8; +signal data_shift_det : shift_type; +signal data_shift : shift_type; +signal transfer : STD_LOGIC_VECTOR(C_LANES-1 downto 0); + +type to_cnt_type is array (0 to C_LANES-1) of integer range 0 to C_TIMEOUT; +signal to_cnt : to_cnt_type; +signal to_flag : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +---------------------------------------------------------------------------------- +signal err_ack_i : STD_LOGIC; +attribute ASYNC_REG : string; +attribute ASYNC_REG of err_ack_i : signal is "true"; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process(data_sr) +begin + sot_found <= (others => '0'); + data_shift_det <= (others => 0); + for j in 0 to C_LANES-1 loop + for i in 0 to 8 loop + if(data_sr(j)(i+15 downto i) = C_SOT)then + sot_found(j) <= '1'; + data_shift_det(j) <= i; + end if; + end loop; + end loop; +end process; + +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + --err_ack_i <= err_ack; + err_req <= '0'; + for i in 0 to C_LANES-1 loop + + if(valid_in(i) = '1')then + data_sr(i) <= data_in(i*8+7 downto i*8) & data_sr(i)(23 downto 8); + end if; + data_dly(i) <= data_sr(i)(23 downto 8); + + if(transfer(i) = '0')then + if((valid_in(i) = '1') and (sot_found(i) = '1'))then + data_shift <= data_shift_det; + transfer(i) <= '1'; + end if; + if(valid_in(i) = '1')then + if(sot_found(i) = '1')then + to_flag(i) <= '0'; + to_cnt(i) <= 0; + else + if(to_cnt(i) /= C_TIMEOUT)then + to_cnt(i) <= to_cnt(i) + 1; + else + to_flag(i) <= '1'; + end if; + end if; + end if; + else + if((valid_in(i) = '0') or (resync = '1'))then + transfer(i) <= '0'; + to_cnt(i) <= 0; + end if; + end if; + + -- if(to_cnt(i) = C_TIMEOUT-1)then + -- err_req <= '1'; + -- elsif(err_ack_i)then + -- err_req <= '0'; + -- end if; + end loop; + if(UNSIGNED(to_flag) /= TO_UNSIGNED(0,C_LANES))then + err_req <= '1'; + else + err_req <= '0'; + end if; + end if; +end process; + +out_gen: for i in 0 to C_LANES-1 generate +begin + data_out(i*8+7 downto i*8) <= data_dly(i)(data_shift(i)+7 downto data_shift(i)); + valid_out(i) <= transfer(i); +end generate; +--------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd new file mode 100644 index 0000000..6906471 --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd @@ -0,0 +1,118 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity lane_merge is +generic( + C_LANES : INTEGER range 1 to 4 := 2 +); +port ( + clk_in : in STD_LOGIC; + resync_in : in STD_LOGIC; + resync_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_in : in STD_LOGIC_VECTOR(C_LANES-1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_out : out STD_LOGIC +); +end lane_merge; +---------------------------------------------------------------------------------- +architecture arch_imp of lane_merge is +---------------------------------------------------------------------------------- +constant C_SOT : STD_LOGIC_VECTOR(7 downto 0) := x"B8"; +constant ones_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0) := (others => '1'); +constant zero_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0) := (others => '0'); +---------------------------------------------------------------------------------- +type sm_state_type is (ST_IDLE, ST_FIRST, ST_TRANSFER, ST_RESYNC); +signal sm_state : sm_state_type := ST_IDLE; +---------------------------------------------------------------------------------- +signal data_dl : STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); +signal valid_dl : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +signal align_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + data_dl <= data_in; + valid_dl <= valid_in; + case sm_state is + when ST_IDLE => + if(valid_in /= zero_vec)then + align_vec <= valid_in; + sm_state <= ST_FIRST; + -- valid_out <= '1'; + -- else + -- valid_out <= '0'; + end if; + when ST_FIRST => + if((valid_in /= ones_vec) or (resync_in = '1'))then + align_vec <= (others => '0'); + sm_state <= ST_RESYNC; + resync_out <= '1'; + else + sm_state <= ST_TRANSFER; + valid_out <= '1'; + for i in 0 to C_LANES-1 loop + if(data_in(i*8+7 downto i*8) = C_SOT)then + align_vec(i) <= '0'; -- Not delayed + else + align_vec(i) <= '1'; -- Delayed + end if; + end loop; + end if; + + when ST_TRANSFER => + -- if((valid_in /= ones_vec) or (resync_in = '1'))then + -- align_vec <= (others => '0'); + -- sm_state <= ST_RESYNC; + -- resync_out <= '1'; + -- valid_out <= '0'; + -- end if; + if(valid_in /= ones_vec)then + align_vec <= (others => '0'); + sm_state <= ST_IDLE; + valid_out <= '0'; + elsif(resync_in = '1')then + align_vec <= (others => '0'); + sm_state <= ST_RESYNC; + resync_out <= '1'; + valid_out <= '0'; + end if; + when ST_RESYNC => + resync_out <= '0'; + if(valid_in = zero_vec)then + sm_state <= ST_IDLE; + end if; + end case; + + --valid_out <= '0'; + --valid_out <= '1'; + for i in 0 to C_LANES-1 loop + --if(valid_dl(i) = '1')then + -- valid_out <= '1'; + --end if; + -- if(align_vec(i) = '1')then + -- if(valid_dl(i) = '0')then + -- valid_out <= '0'; + -- end if; + -- else + -- if(valid_in(i) = '0')then + -- valid_out <= '0'; + -- end if; + -- end if; + if(align_vec(i) = '1')then + data_out(i*8+7 downto i*8) <= data_dl(i*8+7 downto i*8); + else + data_out(i*8+7 downto i*8) <= data_in(i*8+7 downto i*8); + end if; + end loop; + end if; +end process; +--------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl new file mode 100644 index 0000000..bea5392 --- /dev/null +++ b/zynqberrydemo1/ip_lib/csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl @@ -0,0 +1,56 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + set C_M_AXIS_TDATA_WIDTH [ipgui::add_param $IPINST -name "C_M_AXIS_TDATA_WIDTH" -parent ${Page_0} -widget comboBox] + set_property tooltip {Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH.} ${C_M_AXIS_TDATA_WIDTH} + ipgui::add_param $IPINST -name "C_LANES" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_TIMEOUT" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_LANES { PARAM_VALUE.C_LANES } { + # Procedure called to update C_LANES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_LANES { PARAM_VALUE.C_LANES } { + # Procedure called to validate C_LANES + return true +} + +proc update_PARAM_VALUE.C_TIMEOUT { PARAM_VALUE.C_TIMEOUT } { + # Procedure called to update C_TIMEOUT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_TIMEOUT { PARAM_VALUE.C_TIMEOUT } { + # Procedure called to validate C_TIMEOUT + return true +} + +proc update_PARAM_VALUE.C_M_AXIS_TDATA_WIDTH { PARAM_VALUE.C_M_AXIS_TDATA_WIDTH } { + # Procedure called to update C_M_AXIS_TDATA_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_M_AXIS_TDATA_WIDTH { PARAM_VALUE.C_M_AXIS_TDATA_WIDTH } { + # Procedure called to validate C_M_AXIS_TDATA_WIDTH + return true +} + + +proc update_MODELPARAM_VALUE.C_M_AXIS_TDATA_WIDTH { MODELPARAM_VALUE.C_M_AXIS_TDATA_WIDTH PARAM_VALUE.C_M_AXIS_TDATA_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_M_AXIS_TDATA_WIDTH}] ${MODELPARAM_VALUE.C_M_AXIS_TDATA_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_LANES { MODELPARAM_VALUE.C_LANES PARAM_VALUE.C_LANES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_LANES}] ${MODELPARAM_VALUE.C_LANES} +} + +proc update_MODELPARAM_VALUE.C_TIMEOUT { MODELPARAM_VALUE.C_TIMEOUT PARAM_VALUE.C_TIMEOUT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_TIMEOUT}] ${MODELPARAM_VALUE.C_TIMEOUT} +} + diff --git a/zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/component.xml b/zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/component.xml new file mode 100644 index 0000000..8e19f3e --- /dev/null +++ b/zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/component.xml @@ -0,0 +1,228 @@ + + + trenz.biz + user + i2s_to_pwm + 1.0 + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + VHDL + i2s_to_pwm + + xilinx_anylanguagesynthesis_view_fileset + + + + viewChecksum + 560fdf3f + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + VHDL + i2s_to_pwm + + xilinx_anylanguagebehavioralsimulation_view_fileset + + + + viewChecksum + 560fdf3f + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 85d97987 + + + + + + + clk_in + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_bclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_lrclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_sdata + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + pwm_l_out + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + pwm_r_out + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + + C_SYS_FREQ + C Sys Freq + 150000000 + + + C_PWM_FREQ + C Pwm Freq + 100000 + + + + + + xilinx_anylanguagesynthesis_view_fileset + + hdl/i2s_to_pwm.vhd + vhdlSource + CHECKSUM_560fdf3f + + + + xilinx_anylanguagebehavioralsimulation_view_fileset + + hdl/i2s_to_pwm.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/i2s_to_pwm_v1_0.tcl + tclSource + CHECKSUM_8d217f22 + XGUI_VERSION_2 + + + + I2S to PWM v1.0 + + + C_SYS_FREQ + Clock Frequency + 150000000 + + + C_PWM_FREQ + PWM Frequency + 100000 + + + Component_Name + i2s_to_pwm_v1_0 + + + + + + virtex7 + artix7 + kintex7 + zynq + + + /Communication_&_Networking/Serial_Interfaces + /Digital_Signal_Processing/Modulation + /UserIP + + I2S to PWM v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 7 + + xilinx.com:user:i2s_to_pwm:1.0 + + 2016-04-04T15:47:26Z + + + b:/cores/2015.4/design/te0726/demo/ip_lib/i2s_to_pwm_1.0 + b:/cores/2015.4/design/te0726/demo/ip_lib/i2s_to_pwm_1.0 + + + + 2015.4.2 + + + + + + + diff --git a/zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd b/zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd new file mode 100644 index 0000000..1e989ba --- /dev/null +++ b/zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd @@ -0,0 +1,133 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity i2s_to_pwm is +generic ( + C_SYS_FREQ : INTEGER := 150000000; + C_PWM_FREQ : INTEGER := 100000 -- Usually from 50 to 100 kHz +); +port ( + -- General + clk_in : in STD_LOGIC; + -- I2S Signals + i2s_bclk : in STD_LOGIC; + i2s_lrclk : in STD_LOGIC; + i2s_sdata : in STD_LOGIC; + -- PWM Outs + pwm_l_out : out STD_LOGIC; + pwm_r_out : out STD_LOGIC +); +end i2s_to_pwm; +---------------------------------------------------------------------------------- +architecture arch_imp of i2s_to_pwm is +---------------------------------------------------------------------------------- +-- For 16 bit sound +constant C_S_CNT_MAX : INTEGER := 32767; +constant C_S_CNT_MIN : INTEGER := -32767; +constant C_STEP : INTEGER := 131072 / (C_SYS_FREQ/C_PWM_FREQ); +---------------------------------------------------------------------------------- +signal left_s_ch_val : SIGNED(15 downto 0); -- Data latches +signal right_s_ch_val : SIGNED(15 downto 0); +signal pwm_s_cnt : SIGNED(15 downto 0); -- Reference signal +signal pwm_s_cnt_dir : STD_LOGIC; -- Saw direction +---------------------------------------------------------------------------------- +signal bclk_sr : STD_LOGIC_VECTOR(1 downto 0); +signal lrclk_sr : STD_LOGIC_VECTOR(1 downto 0); +signal sdata : STD_LOGIC; +---------------------------------------------------------------------------------- +signal bit_addr : INTEGER range 0 to 31; +signal data_reg : STD_LOGIC_VECTOR(31 downto 0); +signal lsb_left : STD_LOGIC; +signal lsb_right : STD_LOGIC; +signal update_left : STD_LOGIC; +signal update_right : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +-- I2S Decode +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + bclk_sr <= bclk_sr(0) & i2s_bclk; + lrclk_sr <= lrclk_sr(0) & i2s_lrclk; + sdata <= i2s_sdata; + if(lrclk_sr = "01")then -- End of left + lsb_left <= '1'; + elsif(bclk_sr = "01")then -- Rising edge + lsb_left <= '0'; + end if; + if(lrclk_sr = "10")then -- End of rigth + lsb_right <= '1'; + elsif(bclk_sr = "01")then -- Rising edge + lsb_right <= '0'; + end if; + + if(bclk_sr = "01")then -- Rising edge + if((lsb_left = '1') or (lsb_right = '1'))then + bit_addr <= 31; + elsif(bit_addr /= 0)then + bit_addr <= bit_addr - 1; + end if; + data_reg(bit_addr) <= sdata; + update_left <= lsb_left; + update_right <= lsb_right; + else + update_left <= '0'; + update_right <= '0'; + end if; + + if(update_left = '1')then + left_s_ch_val <= SIGNED(data_reg(31 downto 16)); + end if; + if(update_right = '1')then + right_s_ch_val <= SIGNED(data_reg(31 downto 16)); + end if; + end if; +end process; + +-- PWM Coding +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + -- Triangle reference signal + if(pwm_s_cnt_dir = '0')then -- Up count + if(pwm_s_cnt >= TO_SIGNED((C_S_CNT_MAX - C_STEP),16))then + pwm_s_cnt_dir <= '1'; + pwm_s_cnt <= pwm_s_cnt - C_STEP; + else + pwm_s_cnt <= pwm_s_cnt + C_STEP; + end if; + else -- Down count + if(pwm_s_cnt <= TO_SIGNED((C_S_CNT_MIN + C_STEP),16))then + pwm_s_cnt_dir <= '0'; + pwm_s_cnt <= pwm_s_cnt + C_STEP; + else + pwm_s_cnt <= pwm_s_cnt - C_STEP; + end if; + end if; + end if; +end process; + +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + -- Comparators + if(left_s_ch_val > pwm_s_cnt)then + pwm_l_out <= '1'; + else + pwm_l_out <= '0'; + end if; + if(right_s_ch_val > pwm_s_cnt)then + pwm_r_out <= '1'; + else + pwm_r_out <= '0'; + end if; + end if; +end process; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl b/zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl new file mode 100644 index 0000000..3fa319f --- /dev/null +++ b/zynqberrydemo1/ip_lib/i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl @@ -0,0 +1,40 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_PWM_FREQ" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_SYS_FREQ" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_PWM_FREQ { PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to update C_PWM_FREQ when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_PWM_FREQ { PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to validate C_PWM_FREQ + return true +} + +proc update_PARAM_VALUE.C_SYS_FREQ { PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to update C_SYS_FREQ when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_SYS_FREQ { PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to validate C_SYS_FREQ + return true +} + + +proc update_MODELPARAM_VALUE.C_SYS_FREQ { MODELPARAM_VALUE.C_SYS_FREQ PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_SYS_FREQ}] ${MODELPARAM_VALUE.C_SYS_FREQ} +} + +proc update_MODELPARAM_VALUE.C_PWM_FREQ { MODELPARAM_VALUE.C_PWM_FREQ PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_PWM_FREQ}] ${MODELPARAM_VALUE.C_PWM_FREQ} +} + diff --git a/zynqberrydemo1/os/petalinux/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h b/zynqberrydemo1/os/petalinux/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h new file mode 100644 index 0000000..18e88e0 --- /dev/null +++ b/zynqberrydemo1/os/petalinux/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h @@ -0,0 +1,175 @@ +/* + * This file is auto-generated by PetaLinux SDK + * DO NOT MODIFY this file, the modification will not persist + */ + +#ifndef __PLNX_CONFIG_H +#define __PLNX_CONFIG_H + +/* Board oscillator frequency */ +#define CONFIG_ZYNQ_PS_CLK_FREQ 33333333UL + +/* The following table includes the supported baudrates */ +#define CONFIG_SYS_BAUDRATE_TABLE {9600, 19200, 38400, 57600, 115200, 230400} + +/* use serial multi for all serial devices */ +#define CONFIG_SERIAL_MULTI +#define CONFIG_SYS_CONSOLE_IS_IN_ENV 1 + +/* Board name */ + +/* processor - ps7_cortexa9_0 */ +#define CONFIG_CPU_FREQ_HZ 666666687 +#define CONFIG_CLOCKS +#define CONFIG_CMD_CLK +#define CONFIG_SYS_CACHELINE_SIZE 32 +#define CONFIG_SYS_LDSCRIPT "arch/arm/mach-zynq/u-boot.lds" + +/* main_memory - ps7_ddr_0 */ + +/* Memory testing handling */ +#define CONFIG_SYS_MEMTEST_START 0x0 +#define CONFIG_SYS_MEMTEST_END (0x0 + 0x1000) +#define CONFIG_SYS_TEXT_BASE 0x00400000 +#define CONFIG_SYS_LOAD_ADDR 0x0 /* default load address */ +#define CONFIG_NR_DRAM_BANKS 1 + +/* Size of malloc() pool */ +#define SIZE 0xC00000 +#define CONFIG_SYS_MALLOC_LEN SIZE + +/* Physical Memory Map */ +#define CONFIG_SYS_INIT_RAM_ADDR 0xFFFF0000 +#define CONFIG_SYS_INIT_RAM_SIZE 0x1000 +#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_INIT_RAM_ADDR + \ + CONFIG_SYS_INIT_RAM_SIZE - \ + GENERATED_GBL_DATA_SIZE) + +/* uart - ps7_uart_1 */ +#define CONFIG_ZYNQ_SERIAL +#define PSSERIAL0 "psserial0=setenv stdout ttyPS0;setenv stdin ttyPS0\0" +#define SERIAL_MULTI "serial=setenv stdout serial;setenv stdin serial\0" +#define CONSOLE_ARG "console=console=ttyPS0,115200\0" +#define SERIAL_MULTI "serial=setenv stdout serial;setenv stdin serial\0" +#define CONFIG_BAUDRATE 115200 + +/* spi_flash - ps7_qspi_0 */ +#define XILINX_PS7_QSPI_CLK_FREQ_HZ 190476196 +#define CONFIG_SF_DEFAULT_SPEED (XILINX_PS7_QSPI_CLK_FREQ_HZ / 4) +#define CONFIG_SF_DUAL_FLASH +#define CONFIG_SYS_NO_FLASH +#define CONFIG_ENV_IS_IN_SPI_FLASH +#define CONFIG_ENV_OFFSET 0x500000 +#define CONFIG_ENV_SIZE 0x20000 +#define CONFIG_ENV_SECT_SIZE 0x20000 + +/* sdio - ps7_sd_1 */ +#define CONFIG_ZYNQ_SDHCI1 0xE0101000 +#define CONFIG_MMC +#define CONFIG_GENERIC_MMC +#define CONFIG_SUPPORT_VFAT +#define CONFIG_DOS_PARTITION +#define CONFIG_FAT_WRITE +#define CONFIG_ZYNQ_SDHCI_MAX_FREQ 52000000 + +/* devcfg - ps7_dev_cfg_0 */ +#define CONFIG_FPGA +#define CONFIG_FPGA_XILINX +#define CONFIG_FPGA_ZYNQPL +#define CONFIG_CMD_FPGA_LOADFS + +/* ps7_scutimer_0 */ +#define ZYNQ_SCUTIMER_BASEADDR 0xF8F00600 +#define CONFIG_SYS_TIMER_COUNTS_DOWN +#define CONFIG_SYS_TIMERBASE ZYNQ_SCUTIMER_BASEADDR +#define CONFIG_SYS_TIMER_COUNTER (CONFIG_SYS_TIMERBASE + 0x4) + +/* FPGA */ + +/* Make the BOOTM LEN big enough for the compressed image */ +#define CONFIG_SYS_BOOTM_LEN 0xF000000 + + +/* BOOTP options */ +#define CONFIG_BOOTP_SERVERIP +#define CONFIG_BOOTP_BOOTFILESIZE +#define CONFIG_BOOTP_BOOTPATH +#define CONFIG_BOOTP_GATEWAY +#define CONFIG_BOOTP_HOSTNAME + +/*Command line configuration.*/ +#define CONFIG_CMDLINE_EDITING +#define CONFIG_CMD_SAVES + +/* Miscellaneous configurable options */ +#define CONFIG_SYS_CBSIZE 2048/* Console I/O Buffer Size */ +#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16) + +/* Boot Argument Buffer Size */ +#define CONFIG_SYS_MAXARGS 32 /* max number of command args */ +#define CONFIG_SYS_LONGHELP + +/* architecture dependent code */ +#define CONFIG_SYS_USR_EXCEP /* user exception */ +#define CONFIG_SYS_HZ 1000 + +/* Use the HUSH parser */ +#define CONFIG_SYS_PROMPT_HUSH_PS2 "> " + +/* Don't define BOOTARGS, we get it from the DTB chosen fragment */ +#undef CONFIG_BOOTARGS + +#define CONFIG_ENV_OVERWRITE /* Allow to overwrite the u-boot environment variables */ + +#define CONFIG_LMB + +/* Initial memory map for Linux */ +#define CONFIG_SYS_BOOTMAPSZ 0x08000000 + +/* PREBOOT */ +#define CONFIG_PREBOOT "echo U-BOOT for petalinux;setenv preboot; echo; " + +/* Extra U-Boot Env settings */ +#define CONFIG_EXTRA_ENV_SETTINGS \ + SERIAL_MULTI \ + CONSOLE_ARG \ + PSSERIAL0 \ + "importbootenv=echo \"Importing environment from SD ...\"; " \ + "env import -t ${loadbootenv_addr} $filesize\0" \ + "loadbootenv=load mmc $sdbootdev:$partid ${loadbootenv_addr} ${bootenv}\0" \ + "sd_uEnvtxt_existence_test=test -e mmc $sdbootdev:$partid /uEnv.txt\0" \ + "uenvboot=" \ + "if run sd_uEnvtxt_existence_test; then" \ + "run loadbootenv" \ + "echo Loaded environment from ${bootenv};" \ + "run importbootenv; \0" \ + "sdboot=echo boot Petalinux; run uenvboot ; mmcinfo && fatload mmc 0 ${netstart} ${kernel_img} && bootm \0" \ + "autoload=no\0" \ + "clobstart=0x10000000\0" \ + "netstart=0x10000000\0" \ + "dtbnetstart=0x11800000\0" \ + "loadaddr=0x10000000\0" \ + "boot_img=BOOT.BIN\0" \ + "install_boot=mmcinfo && fatwrite mmc 0 ${clobstart} ${boot_img} ${filesize}\0" \ + "bootenvsize=0x20000\0" \ + "bootenvstart=0x500000\0" \ + "eraseenv=sf probe 0 && sf erase ${bootenvstart} ${bootenvsize}\0" \ + "jffs2_img=rootfs.jffs2\0" \ + "sd_update_jffs2=echo Updating jffs2 from SD; mmcinfo && fatload mmc 0:1 ${clobstart} ${jffs2_img} && run install_jffs2\0" \ + "install_jffs2=sf probe 0 && sf erase ${jffs2start} ${jffs2size} && " \ + "sf write ${clobstart} ${jffs2start} ${filesize}\0" \ + "kernel_img=image.ub\0" \ + "install_kernel=mmcinfo && fatwrite mmc 0 ${clobstart} ${kernel_img} ${filesize}\0" \ + "cp_kernel2ram=mmcinfo && fatload mmc 0 ${netstart} ${kernel_img}\0" \ + "dtb_img=system.dtb\0" \ + "sd_update_dtb=echo Updating dtb from SD; mmcinfo && fatload mmc 0:1 ${clobstart} ${dtb_img} && run install_dtb\0" \ + "fault=echo ${img} image size is greater than allocated place - partition ${img} is NOT UPDATED\0" \ + "test_crc=if imi ${clobstart}; then run test_img; else echo ${img} Bad CRC - ${img} is NOT UPDATED; fi\0" \ + "test_img=setenv var \"if test ${filesize} -gt ${psize}\\; then run fault\\; else run ${installcmd}\\; fi\"; run var; setenv var\0" \ + "default_bootcmd=run cp_kernel2ram && bootm ${netstart}\0" \ +"" + +/* BOOTCOMMAND */ +#define CONFIG_BOOTCOMMAND "run default_bootcmd" + +#endif /* __PLNX_CONFIG_H */ diff --git a/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/gpio-demo/files/gpio-demo.c b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/gpio-demo/files/gpio-demo.c new file mode 100644 index 0000000..4456768 --- /dev/null +++ b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/gpio-demo/files/gpio-demo.c @@ -0,0 +1,359 @@ +/* +* +* gpio-demo app +* +* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, +* subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or (b) that interact +* with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in this +* Software without prior written authorization from Xilinx. +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +#define GPIO_ROOT "/sys/class/gpio" +#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) + +static enum {NONE, IN, OUT, CYLON, KIT} gpio_opt = NONE; + +static const unsigned long cylon[] = { + 0x00000080, 0x00000040, 0x00000020, 0x00000010, + 0x00000008, 0x00000004, 0x00000002, 0x00000001, + 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, +}; + +static const unsigned long kit[] = { + 0x000000e0, 0x00000070, 0x00000038, 0x0000001c, + 0x0000000e, 0x00000007, 0x00000003, 0x00000001, + 0x00000003, 0x00000007, 0x0000000e, + 0x0000001c, 0x00000038, 0x00000070, 0x000000e0, +}; + +static int gl_gpio_base = 0; + +static void usage (char *argv0) +{ + char *basename = strrchr(argv0, '/'); + if (!basename) + basename = argv0; + + fprintf(stderr, + "Usage: %s [-g GPIO_BASE] COMMAND\n" + "\twhere COMMAND is one of:\n" + "\t\t-i\t\tInput value from GPIO and print it\n" + "\t\t-o\tVALUE\tOutput value to GPIO\n" + "\t\t-c\t\tCylon test pattern\n" + "\t\t-k\t\t KIT test pattern\n" + "\tGPIO_BASE indicates which GPIO chip to talk to (The number can be \n" + "\tfound at /sys/class/gpio/gpiochipN).\n" + "\tThe highest gpiochipN is the first gpio listed in the dts file, \n" + "\tand the lowest gpiochipN is the last gpio listed in the dts file.\n" + "\tE.g.If the gpiochip240 is the LED_8bit gpio, and I want to output '1' \n" + "\tto the LED_8bit gpio, the command should be:\n" + "\t\tgpio-demo -g 240 -o 1\n" + "\n" + "\tgpio-demo written by Xilinx Inc.\n" + "\n" + , basename); + exit(-2); +} + +static int open_gpio_channel(int gpio_base) +{ + char gpio_nchan_file[128]; + int gpio_nchan_fd; + int gpio_max; + int nchannel; + char nchannel_str[5]; + char *cptr; + int c; + char channel_str[5]; + + char *gpio_export_file = "/sys/class/gpio/export"; + int export_fd=0; + + /* Check how many channels the GPIO chip has */ + sprintf(gpio_nchan_file, "%s/gpiochip%d/ngpio", GPIO_ROOT, gpio_base); + gpio_nchan_fd = open(gpio_nchan_file, O_RDONLY); + if (gpio_nchan_fd < 0) { + fprintf(stderr, "Failed to open %s: %s\n", gpio_nchan_file, strerror(errno)); + return -1; + } + read(gpio_nchan_fd, nchannel_str, sizeof(nchannel_str)); + close(gpio_nchan_fd); + nchannel=(int)strtoul(nchannel_str, &cptr, 0); + if (cptr == nchannel_str) { + fprintf(stderr, "Failed to change %s into GPIO channel number\n", nchannel_str); + exit(1); + } + + /* Open files for each GPIO channel */ + export_fd=open(gpio_export_file, O_WRONLY); + if (export_fd < 0) { + fprintf(stderr, "Cannot open GPIO to export %d\n", gpio_base); + return -1; + } + + gpio_max = gpio_base + nchannel; + for(c = gpio_base; c < gpio_max; c++) { + sprintf(channel_str, "%d", c); + write(export_fd, channel_str, (strlen(channel_str)+1)); + } + close(export_fd); + return nchannel; +} + +static int close_gpio_channel(int gpio_base) +{ + char gpio_nchan_file[128]; + int gpio_nchan_fd; + int gpio_max; + int nchannel; + char nchannel_str[5]; + char *cptr; + int c; + char channel_str[5]; + + char *gpio_unexport_file = "/sys/class/gpio/unexport"; + int unexport_fd=0; + + /* Check how many channels the GPIO chip has */ + sprintf(gpio_nchan_file, "%s/gpiochip%d/ngpio", GPIO_ROOT, gpio_base); + gpio_nchan_fd = open(gpio_nchan_file, O_RDONLY); + if (gpio_nchan_fd < 0) { + fprintf(stderr, "Failed to open %s: %s\n", gpio_nchan_file, strerror(errno)); + return -1; + } + read(gpio_nchan_fd, nchannel_str, sizeof(nchannel_str)); + close(gpio_nchan_fd); + nchannel=(int)strtoul(nchannel_str, &cptr, 0); + if (cptr == nchannel_str) { + fprintf(stderr, "Failed to change %s into GPIO channel number\n", nchannel_str); + exit(1); + } + + /* Close opened files for each GPIO channel */ + unexport_fd=open(gpio_unexport_file, O_WRONLY); + if (unexport_fd < 0) { + fprintf(stderr, "Cannot close GPIO by writing unexport %d\n", gpio_base); + return -1; + } + + gpio_max = gpio_base + nchannel; + for(c = gpio_base; c < gpio_max; c++) { + sprintf(channel_str, "%d", c); + write(unexport_fd, channel_str, (strlen(channel_str)+1)); + } + close(unexport_fd); + return 0; +} + +static int set_gpio_direction(int gpio_base, int nchannel, char *direction) +{ + char gpio_dir_file[128]; + int direction_fd=0; + int gpio_max; + int c; + + gpio_max = gpio_base + nchannel; + for(c = gpio_base; c < gpio_max; c++) { + sprintf(gpio_dir_file, "/sys/class/gpio/gpio%d/direction",c); + direction_fd=open(gpio_dir_file, O_RDWR); + if (direction_fd < 0) { + fprintf(stderr, "Cannot open the direction file for GPIO %d\n", c); + return 1; + } + write(direction_fd, direction, (strlen(direction)+1)); + close(direction_fd); + } + return 0; +} + +static int set_gpio_value(int gpio_base, int nchannel, int value) +{ + char gpio_val_file[128]; + int val_fd=0; + int gpio_max; + char val_str[2]; + int c; + + gpio_max = gpio_base + nchannel; + + for(c = gpio_base; c < gpio_max; c++) { + sprintf(gpio_val_file, "/sys/class/gpio/gpio%d/value",c); + val_fd=open(gpio_val_file, O_RDWR); + if (val_fd < 0) { + fprintf(stderr, "Cannot open the value file of GPIO %d\n", c); + return -1; + } + sprintf(val_str,"%d", (value & 1)); + write(val_fd, val_str, sizeof(val_str)); + close(val_fd); + value >>= 1; + } + return 0; +} + +static int get_gpio_value(int gpio_base, int nchannel) +{ + char gpio_val_file[128]; + int val_fd=0; + int gpio_max; + char val_str[2]; + char *cptr; + int value = 0; + int c; + + gpio_max = gpio_base + nchannel; + + for(c = gpio_max-1; c >= gpio_base; c--) { + sprintf(gpio_val_file, "/sys/class/gpio/gpio%d/value",c); + val_fd=open(gpio_val_file, O_RDWR); + if (val_fd < 0) { + fprintf(stderr, "Cannot open GPIO to export %d\n", c); + return -1; + } + read(val_fd, val_str, sizeof(val_str)); + value <<= 1; + value += (int)strtoul(val_str, &cptr, 0); + if (cptr == optarg) { + fprintf(stderr, "Failed to change %s into integer", val_str); + } + close(val_fd); + } + return value; +} + +void signal_handler(int sig) +{ + switch (sig) { + case SIGTERM: + case SIGHUP: + case SIGQUIT: + case SIGINT: + close_gpio_channel(gl_gpio_base); + exit(0) ; + default: + break; + } +} + +int main(int argc, char *argv[]) +{ + extern char *optarg; + char *cptr; + int gpio_value = 0; + int nchannel = 0; + + int c; + int i; + + opterr = 0; + + while ((c = getopt(argc, argv, "g:io:ck")) != -1) { + switch (c) { + case 'g': + gl_gpio_base = (int)strtoul(optarg, &cptr, 0); + if (cptr == optarg) + usage(argv[0]); + break; + case 'i': + gpio_opt = IN; + break; + case 'o': + gpio_opt = OUT; + gpio_value = (int)strtoul(optarg, &cptr, 0); + if (cptr == optarg) + usage(argv[0]); + break; + case 'c': + gpio_opt = CYLON; + break; + case 'k': + gpio_opt = KIT; + break; + case '?': + usage(argv[0]); + default: + usage(argv[0]); + + } + } + + if (gl_gpio_base == 0) { + usage(argv[0]); + } + + nchannel = open_gpio_channel(gl_gpio_base); + signal(SIGTERM, signal_handler); /* catch kill signal */ + signal(SIGHUP, signal_handler); /* catch hang up signal */ + signal(SIGQUIT, signal_handler); /* catch quit signal */ + signal(SIGINT, signal_handler); /* catch a CTRL-c signal */ + switch (gpio_opt) { + case IN: + set_gpio_direction(gl_gpio_base, nchannel, "in"); + gpio_value=get_gpio_value(gl_gpio_base, nchannel); + fprintf(stdout,"0x%08X\n", gpio_value); + break; + case OUT: + set_gpio_direction(gl_gpio_base, nchannel, "out"); + set_gpio_value(gl_gpio_base, nchannel, gpio_value); + break; + case CYLON: +#define CYLON_DELAY_USECS (10000) + set_gpio_direction(gl_gpio_base, nchannel, "out"); + for (;;) { + for(i=0; i < ARRAY_SIZE(cylon); i++) { + gpio_value=(int)cylon[i]; + set_gpio_value(gl_gpio_base, nchannel, gpio_value); + } + usleep(CYLON_DELAY_USECS); + } + case KIT: +#define KIT_DELAY_USECS (10000) + set_gpio_direction(gl_gpio_base, nchannel, "out"); + for (;;) { + for (i=0; i +#include +#include +#include +#include + +void usage(char *prog) +{ + printf("usage: %s ADDR\n",prog); + printf("\n"); + printf("ADDR may be specified as hex values\n"); +} + + +int main(int argc, char *argv[]) +{ + int fd; + void *ptr; + unsigned addr, page_addr, page_offset; + unsigned page_size=sysconf(_SC_PAGESIZE); + + if(argc!=2) { + usage(argv[0]); + exit(-1); + } + + fd=open("/dev/mem",O_RDONLY); + if(fd<1) { + perror(argv[0]); + exit(-1); + } + + addr=strtoul(argv[1],NULL,0); + page_addr=(addr & ~(page_size-1)); + page_offset=addr-page_addr; + + ptr=mmap(NULL,page_size,PROT_READ,MAP_SHARED,fd,(addr & ~(page_size-1))); + if((int)ptr==-1) { + perror(argv[0]); + exit(-1); + } + + printf("0x%08x\n",*((unsigned *)(ptr+page_offset))); + return 0; +} + + diff --git a/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/poke.c b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/poke.c new file mode 100644 index 0000000..e1b2f16 --- /dev/null +++ b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/poke.c @@ -0,0 +1,81 @@ +/* +* poke utility - for those who remember the good old days! +* + +* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, +* subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or (b) that interact +* with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in this +* Software without prior written authorization from Xilinx. +* +*/ + +#include +#include +#include +#include +#include + +void usage(char *prog) +{ + printf("usage: %s ADDR VAL\n",prog); + printf("\n"); + printf("ADDR and VAL may be specified as hex values\n"); +} + +int main(int argc, char *argv[]) +{ + int fd; + void *ptr; + unsigned val; + unsigned addr, page_addr, page_offset; + unsigned page_size=sysconf(_SC_PAGESIZE); + + fd=open("/dev/mem",O_RDWR); + if(fd<1) { + perror(argv[0]); + exit(-1); + } + + if(argc!=3) { + usage(argv[0]); + exit(-1); + } + + addr=strtoul(argv[1],NULL,0); + val=strtoul(argv[2],NULL,0); + + page_addr=(addr & ~(page_size-1)); + page_offset=addr-page_addr; + + ptr=mmap(NULL,page_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,(addr & ~(page_size-1))); + if((int)ptr==-1) { + perror(argv[0]); + exit(-1); + } + + *((unsigned *)(ptr+page_offset))=val; + return 0; +} diff --git a/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/rpicam.c b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/rpicam.c new file mode 100644 index 0000000..24cd13c --- /dev/null +++ b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/rpicam.c @@ -0,0 +1,191 @@ +/* +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko + */ +#include +#include +#include +#include +#include +#include +#include +#include "sensor_config.h" + +#define CAMERA_V1_3_IIC_ADDRESS 0x36 +#define CAMERA_V2_1_IIC_ADDRESS 0x10 + +#define CS_CMMN_CHIP_ID_H 0x300A +#define CS_CMMN_CHIP_ID_L 0x300B + +unsigned char i2c_reg_read(int dev_file, unsigned char dev_addr, const unsigned short reg_addr){ + __u8 inbuf[2]; + __u8 outbuf[2]; + struct i2c_rdwr_ioctl_data packets; + struct i2c_msg messages[2]; + + /* + * In order to read a register, we first do a "dummy write" by writing + * 0 bytes to the register we want to read from. This is similar to + * the packet in set_i2c_register, except it's 1 byte rather than 2. + */ + outbuf[0] = reg_addr >> 8; + outbuf[1] = reg_addr & 0xFF; + messages[0].addr = dev_addr; + messages[0].flags = 0; + messages[0].len = 2, //sizeof(outbuf); + messages[0].buf = &outbuf; + /* The data will get returned in this structure */ + messages[1].addr = dev_addr; + messages[1].flags = I2C_M_RD; /* | I2C_M_NOSTART*/ + messages[1].len = 1, //sizeof(inbuf); + messages[1].buf = inbuf; + + /* Send the request to the kernel and get the result back */ + packets.msgs = messages; + packets.nmsgs = 2; + if(ioctl(dev_file, I2C_RDWR, &packets) < 0) { + perror("Unable to send data"); + return 1; + } + + return inbuf[0]; +} + +int i2c_reg_write(int dev_file, unsigned char dev_addr, unsigned short reg_addr, unsigned char reg_data) +{ + unsigned char outbuf[3]; + struct i2c_rdwr_ioctl_data packets; + struct i2c_msg messages[1]; + + messages[0].addr = dev_addr; + messages[0].flags = 0; + messages[0].len = sizeof(outbuf); + messages[0].buf = &outbuf; + /* The first byte indicates which register we'll write */ + outbuf[0] = reg_addr >> 8; + outbuf[1] = reg_addr & 0xFF; + outbuf[2] = reg_data; + /* Transfer the i2c packets to the kernel and verify it worked */ + packets.msgs = messages; + packets.nmsgs = 1; + if(ioctl(dev_file, I2C_RDWR, &packets) < 0) { + perror("Unable to send data"); + return 1; + } + + return 0; +} + +static void i2c_set_write(int dev_file, unsigned char dev_addr, struct sensor_cmd *set){ + int i; + for(i=0; set[i].reg != TABLE_END; i++){ + i2c_reg_write(dev_file, dev_addr, set[i].reg, set[i].val); + } +} + +static void imx219_crop(int dev_file, unsigned char dev_addr, struct sensor_rect crop_rect){ + i2c_reg_write(dev_file, dev_addr, 0x0164, crop_rect.left >> 8); + i2c_reg_write(dev_file, dev_addr, 0x0165, crop_rect.left & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x0166, (crop_rect.width - 1) >> 8); + i2c_reg_write(dev_file, dev_addr, 0x0167, (crop_rect.width - 1) & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x0168, crop_rect.top >> 8); + i2c_reg_write(dev_file, dev_addr, 0x0169, crop_rect.top & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x016A, (crop_rect.height - 1) >> 8); + i2c_reg_write(dev_file, dev_addr, 0x016B, (crop_rect.height - 1) & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x016C, crop_rect.width >> 8); + i2c_reg_write(dev_file, dev_addr, 0x016D, crop_rect.width & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x016E, crop_rect.height >> 8); + i2c_reg_write(dev_file, dev_addr, 0x016F, crop_rect.height & 0xff); +} + + +int main(int argc, char *argv[]) +{ + int i2c_file; + unsigned short model_id; + unsigned int lot_id; + unsigned short chip_id; + unsigned char ret; + + printf("Raspberry Pi Camera Init v1.3\n"); + if(argc < 2){ + printf("%s /dev/i2c-X [mode]\n",argv[0]); + return 0; + } + + if ((i2c_file = open(argv[1], O_RDWR)) < 0) { + perror("Unable to open i2c control file"); + return 0; + } + + if(!((i2c_reg_read(i2c_file, CAMERA_V1_3_IIC_ADDRESS, CS_CMMN_CHIP_ID_H) != 0x56) || (i2c_reg_read(i2c_file, CAMERA_V1_3_IIC_ADDRESS, CS_CMMN_CHIP_ID_L) != 0x47))){ + printf("Camera V1.X configuration\n"); + i2c_reg_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, 0x0100, 0x00); // Disable + i2c_reg_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, 0x0103, 0x01); // Reset + usleep(1); // Wait + i2c_reg_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, 0x0103, 0x00); // Reset + usleep(10 * 1000); // Wait + i2c_set_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, ov5647_sensor_common_10bit); // Load common configuration + i2c_set_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, ov5647_sensor_1296_968_30); // Load specific configuration + i2c_reg_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, 0x0100, 0x01); // Enable + printf("Camera init complete.\n"); + close(i2c_file); + return 1; + } + + printf("Camera V2.X configuration\n"); + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0000); + if (ret < 0) { + perror("Failure to read Model ID (high byte)\n"); + return 0; + } + model_id = ret << 8; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0001); + if (ret < 0) { + perror("Failure to read Model ID (low byte)\n"); + return 0; + } + model_id |= ret; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0004); + if (ret < 0) { + perror("Failure to read Lot ID (high byte)\n"); + return 0; + } + lot_id = ret << 16; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0005); + if (ret < 0) { + perror("Failure to read Lot ID (mid byte)\n"); + return 0; + } + lot_id |= ret << 8; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0006); + if (ret < 0) { + perror("Failure to read Lot ID (low byte)\n"); + return 0; + } + lot_id |= ret; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x000D); + if (ret < 0) { + perror("Failure to read Chip ID (high byte)\n"); + return 0; + } + chip_id = ret << 8; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x000E); + if (ret < 0) { + perror("Failure to read Chip ID (low byte)\n"); + return 0; + } + chip_id |= ret; + if (model_id != 0x0219) { + perror("Model not supported!\n"); + return 0; + } + + printf("Found 2.X Camera Model ID 0x%04x, Lot ID 0x%06x, Chip ID 0x%04x\n", model_id, lot_id, chip_id); + i2c_set_write(i2c_file, CAMERA_V2_1_IIC_ADDRESS, imx219_720p_regs); + printf("Camera init complete.\n"); + + close(i2c_file); + return 3; +} + diff --git a/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/sensor_config.h b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/sensor_config.h new file mode 100644 index 0000000..8f062a5 --- /dev/null +++ b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/sensor_config.h @@ -0,0 +1,705 @@ + +#ifndef SENSOR_CONFIG_H_ +#define SENSOR_CONFIG_H_ + + +#define TABLE_END 0xffff + +//----------------------------------------------------------------------------------------- + +// atomar register element +struct sensor_cmd { + unsigned short reg; + unsigned char val; +}; + +//----------------------------------------------------------------------------------------- + +static struct sensor_cmd ov5647_sensor_common_10bit[] = { + { 0x3034, 0x1A }, // 10 bit mode +// { 0x3034, 0x10 }, // 8 bit mode + { 0x503D, 0x00 }, // Test Pattern + { 0x3035, 0x21 }, // CLK DIV + { 0x3036, 0x46 }, // PLL MULT + { 0x303c, 0x11 }, // PLLS CP + { 0x3106, 0xf5 }, // PLL DIV + { 0x3821, 0x07 }, // TIMING TC + { 0x3820, 0x41 }, // TIMING TC + { 0x3827, 0xec }, + { 0x370c, 0x0f }, + { 0x3612, 0x59 }, + { 0x3503, 0x00 }, // AEC/AGC + { 0x5000, 0x89 }, // Lens Correction + { 0x5001, 0x01 }, // AWB + { 0x5002, 0x41 }, // AWB GAIN, OPT, WIN + { 0x5003, 0x0A }, // BIN + { 0x5a00, 0x08 }, + { 0x3000, 0x00 }, + { 0x3001, 0x00 }, + { 0x3002, 0x00 }, + { 0x3016, 0x08 }, + { 0x3017, 0xe0 }, + { 0x3018, 0x44 }, + { 0x301c, 0xf8 }, + { 0x301d, 0xf0 }, + { 0x3a18, 0x00 }, + { 0x3a19, 0xf8 }, + { 0x3c01, 0x80 }, // 50/60HZ Detection + { 0x3b07, 0x0c }, + { 0x380c, 0x07 }, + { 0x380d, 0x68 }, + { 0x380e, 0x03 }, + { 0x380f, 0xd8 }, + { 0x3814, 0x31 }, + { 0x3815, 0x31 }, + { 0x3708, 0x64 }, + { 0x3709, 0x52 }, + { 0x3630, 0x2e }, + { 0x3632, 0xe2 }, + { 0x3633, 0x23 }, + { 0x3634, 0x44 }, + { 0x3636, 0x06 }, + { 0x3620, 0x65 }, // V BINNING + { 0x3621, 0xe1 }, // H BINNING + { 0x3600, 0x37 }, + { 0x3704, 0xa0 }, + { 0x3703, 0x5a }, + { 0x3715, 0x78 }, + { 0x3717, 0x01 }, + { 0x3731, 0x02 }, + { 0x370b, 0x60 }, + { 0x3705, 0x1a }, + { 0x3f05, 0x02 }, + { 0x3f06, 0x10 }, + { 0x3f01, 0x0a }, + { 0x3a08, 0x01 }, + { 0x3a09, 0x27 }, + { 0x3a0a, 0x00 }, + { 0x3a0b, 0xf6 }, + { 0x3a0d, 0x04 }, + { 0x3a0e, 0x03 }, + { 0x3a0f, 0x58 }, + { 0x3a10, 0x50 }, + { 0x3a1b, 0x58 }, + { 0x3a1e, 0x50 }, + { 0x3a11, 0x60 }, + { 0x3a1f, 0x28 }, + { 0x4001, 0x02 }, + { 0x4004, 0x02 }, + { 0x4000, 0x09 }, + { 0x4837, 0x24 }, + { 0x4050, 0x6e }, + { 0x4051, 0x8f }, + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +static struct sensor_cmd ov5647_sensor_common_test[] = { + { 0x3034, 0x1A }, // 10 bit mode + { 0x503D, 0x80 }, +// { 0x3035, 0x21 }, +// { 0x3036, 0x46 }, +// { 0x303c, 0x11 }, + { 0x3106, 0xf5 }, +// { 0x3821, 0x07 }, +// { 0x3820, 0x41 }, + { 0x3827, 0xec }, + { 0x370c, 0x0f }, +// { 0x3612, 0x59 }, +// { 0x3618, 0x00 }, + { 0x5000, 0x06 }, + { 0x5001, 0x00 }, + { 0x5002, 0x40 }, + { 0x5003, 0x08 }, + { 0x5a00, 0x08 }, + { 0x3000, 0x00 }, + { 0x3001, 0x00 }, + { 0x3002, 0x00 }, + { 0x3016, 0x08 }, + { 0x3017, 0xe0 }, + { 0x3018, 0x44 }, + { 0x301c, 0xf8 }, + { 0x301d, 0xf0 }, + { 0x3a18, 0x00 }, + { 0x3a19, 0xf8 }, + { 0x3c01, 0x80 }, + { 0x3b07, 0x0c }, +// { 0x380c, 0x07 }, +// { 0x380d, 0x68 }, +// { 0x380e, 0x03 }, +// { 0x380f, 0xd8 }, +// { 0x3814, 0x31 }, +// { 0x3815, 0x31 }, +// { 0x3708, 0x64 }, +// { 0x3709, 0x52 }, + { 0x3630, 0x2e }, + { 0x3632, 0xe2 }, + { 0x3633, 0x23 }, + { 0x3634, 0x44 }, + { 0x3636, 0x06 }, + { 0x3620, 0x64 }, + { 0x3621, 0xe0 }, + { 0x3600, 0x37 }, + { 0x3704, 0xa0 }, + { 0x3703, 0x5a }, + { 0x3715, 0x78 }, + { 0x3717, 0x01 }, + { 0x3731, 0x02 }, + { 0x370b, 0x60 }, + { 0x3705, 0x1a }, + { 0x3f05, 0x02 }, + { 0x3f06, 0x10 }, + { 0x3f01, 0x0a }, +// { 0x3a08, 0x01 }, +// { 0x3a09, 0x27 }, +// { 0x3a0a, 0x00 }, +// { 0x3a0b, 0xf6 }, +// { 0x3a0d, 0x04 }, +// { 0x3a0e, 0x03 }, + { 0x3a0f, 0x58 }, + { 0x3a10, 0x50 }, + { 0x3a1b, 0x58 }, + { 0x3a1e, 0x50 }, + { 0x3a11, 0x60 }, + { 0x3a1f, 0x28 }, + { 0x4001, 0x02 }, +// { 0x4004, 0x02 }, + { 0x4000, 0x09 }, +// { 0x4837, 0x24 }, + { 0x4050, 0x6e }, + { 0x4051, 0x8f }, + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +/* 2592 x 1944 @ 15 fps */ + /* + * MIPI Link : 425.000 Mbps + * Pixel clock : 85.000 MHz + * Timing zone : 2752 x 1974 + * FPS : 15.6 + */ +static struct sensor_cmd ov5647_sensor_2592_1944_15[] = { + { 0x3035, 0x21 }, + { 0x3036, 0x66 }, + { 0x303c, 0x11 }, + { 0x3821, 0x06 }, + { 0x3820, 0x00 }, + { 0x3612, 0x5b }, + { 0x3618, 0x04 }, + { 0x380c, 0x0a }, + { 0x380d, 0xc0 }, + { 0x380e, 0x07 }, + { 0x380f, 0xb6 }, + { 0x3814, 0x11 }, + { 0x3815, 0x11 }, + { 0x3708, 0x64 }, + { 0x3709, 0x12 }, + { 0x3808, 0x0a }, + { 0x3809, 0x20 }, + { 0x380a, 0x07 }, + { 0x380b, 0x98 }, + { 0x3800, 0x00 }, + { 0x3801, 0x0c }, + { 0x3802, 0x00 }, + { 0x3803, 0x02 }, + { 0x3804, 0x0a }, + { 0x3805, 0x33 }, + { 0x3806, 0x07 }, + { 0x3807, 0xa1 }, + { 0x3a08, 0x01 }, + { 0x3a09, 0x28 }, + { 0x3a0a, 0x00 }, + { 0x3a0b, 0xf6 }, + { 0x3a0d, 0x07 }, + { 0x3a0e, 0x06 }, + { 0x4004, 0x04 }, + { 0x4837, 0x19 }, + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +/* 1936 x 1088 @ 30 fps */ + /* + * MIPI Link : 416.667 Mbps + * Pixel clock : 83.333 MHz + * Timing zone : 2416 x 1104 + * FPS : 31.2 + */ +static struct sensor_cmd ov5647_sensor_1936_1088_30[] = { + { 0x3035, 0x21 }, + { 0x3036, 0x64 }, + { 0x303c, 0x11 }, + { 0x3821, 0x06 }, + { 0x3820, 0x00 }, + { 0x3612, 0x5b }, + { 0x3618, 0x04 }, + { 0x380c, 0x09 }, + { 0x380d, 0x70 }, + { 0x380e, 0x04 }, + { 0x380f, 0x50 }, + { 0x3814, 0x11 }, + { 0x3815, 0x11 }, + { 0x3708, 0x64 }, + { 0x3709, 0x12 }, + { 0x3808, 0x07 }, + { 0x3809, 0x90 }, /* 80 */ + { 0x380a, 0x04 }, + { 0x380b, 0x40 }, /* 38 */ + { 0x3800, 0x01 }, + { 0x3801, 0x54 }, /* 5c */ + { 0x3802, 0x01 }, + { 0x3803, 0xb0 }, /* b2 */ + { 0x3804, 0x08 }, + { 0x3805, 0xeb }, /* e3 */ + { 0x3806, 0x05 }, + { 0x3807, 0xf3 }, /* f1 */ + { 0x3a08, 0x01 }, + { 0x3a09, 0x4b }, + { 0x3a0a, 0x01 }, + { 0x3a0b, 0x13 }, + { 0x3a0d, 0x04 }, + { 0x3a0e, 0x03 }, + { 0x4004, 0x04 }, + { 0x4837, 0x19 }, + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +/* 1296 x 968 @ 30 fps */ + /* + * MIPI Link : 291.667 Mbps + * Pixel clock : 58.333 MHz + * Timing zone : 1896 x 984 + * FPS : 31.3 + */ +static struct sensor_cmd ov5647_sensor_1296_968_30[] = { + { 0x3035, 0x21 }, + { 0x3036, 0x46 }, + { 0x303c, 0x11 }, + { 0x3821, 0x07 }, + { 0x3820, 0x41 }, + { 0x3612, 0x59 }, + { 0x3618, 0x00 }, + { 0x380c, 0x07 }, + { 0x380d, 0x68 }, + { 0x380e, 0x03 }, + { 0x380f, 0xd8 }, + { 0x3814, 0x31 }, + { 0x3815, 0x31 }, + { 0x3708, 0x64 }, + { 0x3709, 0x52 }, + { 0x3808, 0x05 }, + { 0x3809, 0x10 }, /* 00 */ + { 0x380a, 0x03 }, + { 0x380b, 0xc8 }, /* c0 */ + { 0x3800, 0x00 }, + { 0x3801, 0x00 }, /* 18 */ + { 0x3802, 0x00 }, + { 0x3803, 0x08 }, /* 0e */ + { 0x3804, 0x0a }, + { 0x3805, 0x3b }, /* 27 */ + { 0x3806, 0x07 }, + { 0x3807, 0x9b }, /* 95 */ + { 0x3a08, 0x01 }, + { 0x3a09, 0x27 }, + { 0x3a0a, 0x00 }, + { 0x3a0b, 0xf6 }, + { 0x3a0d, 0x04 }, + { 0x3a0e, 0x03 }, + { 0x4004, 0x02 }, + { 0x4837, 0x24 }, + + { 0x5001, 0x01 }, // AWB on + { 0x5002, 0x41 }, // AWB on + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +/* 1280 x 720 @ 30 fps */ + /* + * MIPI Link : 291.667 Mbps + * Pixel clock : 58.333 MHz + * Timing zone : 1896 x 984 + * FPS : 31.3 + */ +static struct sensor_cmd ov5647_sensor_1280_720_30[] = { + { 0x3035, 0x21 }, // * + { 0x3036, 0x46 }, // * PLL multiplier + { 0x303c, 0x11 }, // * PLL div + { 0x3821, 0x07 }, // * Timing + { 0x3820, 0x41 }, // * Timing + { 0x3612, 0x59 }, // ? + { 0x3618, 0x00 }, // ? + { 0x380c, 0x07 }, // * Horisontal size [12:8] 1896 + { 0x380d, 0x68 }, // * Horisontal size [7:0] + { 0x380e, 0x03 }, // * total vertical size [9:8] 984 + { 0x380f, 0xd8 }, // * total vertical size [7:0] + { 0x3814, 0x31 }, // * timing x inc + { 0x3815, 0x31 }, // * timing y inc + { 0x3708, 0x64 }, // + { 0x3709, 0x52 }, // + { 0x3808, 0x05 }, // out horisontal [11:8] 1280 + { 0x3809, 0x00 }, // out horisontal [7:0] + { 0x380a, 0x02 }, // out vertical [11:8] 720 + { 0x380b, 0xd0 }, // out vertical [7:0] + { 0x3800, 0x00 }, // + X start [11:8] + { 0x3801, 0x00 }, // + X start [7:0] /* 18 */ + { 0x3802, 0x00 }, // + Y start [11:8] + { 0x3803, 0x08 }, // + Y start [7:0] /* 0e */ + { 0x3804, 0x0a }, // + X end [11:8] + { 0x3805, 0x3b }, // + X end [7:0] /* 27 */ + { 0x3806, 0x07 }, // + Y end [11:8] + { 0x3807, 0x9b }, // + Y end [7:0] /* 95 */ + { 0x3a08, 0x01 }, // + { 0x3a09, 0x27 }, // + { 0x3a0a, 0x00 }, // + { 0x3a0b, 0xf6 }, // + { 0x3a0d, 0x04 }, // + { 0x3a0e, 0x03 }, // + { 0x4004, 0x02 }, // + { 0x4837, 0x24 }, // * PCLK period + + { 0x5001, 0x01 }, // AWB on + { 0x5002, 0x41 }, // AWB on + + { TABLE_END, 0x00 }, // +}; + +//----------------------------------------------------------------------------------------- + +static struct sensor_cmd ov5647_sensor_640_480_90[] = { + { 0x3035, 0x11 }, + { 0x3036, 0x2a }, + { 0x3821, 0x07 }, + { 0x3820, 0x41 }, + { 0x3612, 0x49 }, + { 0x3618, 0x00 }, + { 0x380c, 0x07 }, + { 0x380d, 0x30 }, + { 0x380e, 0x01 }, + { 0x380f, 0x78 }, + { 0x3814, 0x71 }, + { 0x3815, 0x31 }, + { 0x3709, 0x52 }, + { 0x3808, 0x02 }, + { 0x3809, 0x80 }, + { 0x380a, 0x01 }, + { 0x380b, 0xe8 }, + { 0x3800, 0x00 }, + { 0x3801, 0x10 }, + { 0x3802, 0x00 }, + { 0x3803, 0x00 }, + { 0x3804, 0x0a }, + { 0x3805, 0x2f }, + { 0x3806, 0x07 }, + { 0x3807, 0x9f }, + { 0x4004, 0x02 }, + { TABLE_END, 0x00 }, // +}; + +//----------------------------------------------------------------------------------------- +static const struct sensor_cmd imx219_miscellaneous[] = { + { 0x30EB, 0x05 }, /* Access Code for address over 0x3000 */ + { 0x30EB, 0x0C }, /* Access Code for address over 0x3000 */ + { 0x300A, 0xFF }, /* Access Code for address over 0x3000 */ + { 0x300B, 0xFF }, /* Access Code for address over 0x3000 */ + { 0x30EB, 0x05 }, /* Access Code for address over 0x3000 */ + { 0x30EB, 0x09 }, /* Access Code for address over 0x3000 */ + { 0x0114, 0x03 }, /* CSI_LANE_MODE[1:0} */ + { 0x0128, 0x00 }, /* DPHY_CNTRL */ + { 0x012A, 0x18 }, /* EXCK_FREQ[15:8] */ + { 0x012B, 0x00 }, /* EXCK_FREQ[7:0] */ + { 0x0160, 0x0A }, /* FRM_LENGTH_A[15:8] */ + { 0x0161, 0x83 }, /* FRM_LENGTH_A[7:0] */ + { 0x0162, 0x0D }, /* LINE_LENGTH_A[15:8] */ + { 0x0163, 0x78 }, /* LINE_LENGTH_A[7:0] */ + { 0x0170, 0x01 }, /* X_ODD_INC_A[2:0] */ + { 0x0171, 0x01 }, /* Y_ODD_INC_A[2:0] */ + { 0x0174, 0x00 }, /* BINNING_MODE_H_A */ + { 0x0175, 0x00 }, /* BINNING_MODE_V_A */ + { 0x018C, 0x0A }, /* CSI_DATA_FORMAT_A[15:8] */ + { 0x018D, 0x0A }, /* CSI_DATA_FORMAT_A[7:0] */ + { 0x0301, 0x05 }, /* VTPXCK_DIV */ + { 0x0303, 0x01 }, /* VTSYCK_DIV */ + { 0x0304, 0x03 }, /* PREPLLCK_VT_DIV[3:0] */ + { 0x0305, 0x03 }, /* PREPLLCK_OP_DIV[3:0] */ + { 0x0306, 0x00 }, /* PLL_VT_MPY[10:8] */ + { 0x0307, 0x57 }, /* PLL_VT_MPY[7:0] */ + { 0x0309, 0x0A }, /* OPPXCK_DIV[4:0] */ + { 0x030B, 0x01 }, /* OPSYCK_DIV */ + { 0x030C, 0x00 }, /* PLL_OP_MPY[10:8] */ + { 0x030D, 0x5A }, /* PLL_OP_MPY[7:0] */ + { 0x455E, 0x00 }, /* CIS Tuning */ + { 0x471E, 0x4B }, /* CIS Tuning */ + { 0x4767, 0x0F }, /* CIS Tuning */ + { 0x4750, 0x14 }, /* CIS Tuning */ + { 0x4540, 0x00 }, /* CIS Tuning */ + { 0x47B4, 0x14 }, /* CIS Tuning */ + { 0x4713, 0x30 }, /* CIS Tuning */ + { 0x478B, 0x10 }, /* CIS Tuning */ + { 0x478F, 0x10 }, /* CIS Tuning */ + { 0x4793, 0x10 }, /* CIS Tuning */ + { 0x4797, 0x0E }, /* CIS Tuning */ + { 0x479B, 0x0E }, /* CIS Tuning */ + { TABLE_END, 0x00 } +}; +/* 3280x2464@15 FPS */ +static const struct sensor_cmd imx219_1test[] = { + {0x0100, 0x00}, // 0=OFF, 1=Stream, 2=MAX + {0x30EB, 0x05}, + {0x30EB, 0x0C}, + {0x300A, 0xFF}, + {0x300B, 0xFF}, + {0x30EB, 0x05}, + {0x30EB, 0x09}, + {0x0114, 0x01}, // CSI MIPI Lanes [1:0] (0x01=2, 0x03=4) + {0x0128, 0x00}, // DPHY_CNTRL + {0x012A, 0x18}, // EXCK_FREQ [15:8] + {0x012B, 0x00}, // EXCK_FREQ [7:0] + {0x0157, 0x00}, // Analog Gain + {0x0158, 0x00}, // Digital Gain [15:8] + {0x0159, 0x00}, // Digital Gain [7:0] + // {0x015A, 0x01}, // Shutter/Integration Time [15:8] + // {0x015B, 0x00}, // Shutter/Integration Time [7:0] + {0x0160, 0x09}, // Frame Length [15:8] + {0x0161, 0xC8}, // Frame Length [7:0] + {0x0162, 0x0D}, // Line Length [15:8] + {0x0163, 0x78}, // Line Length [7:0] + {0x0164, 0x00}, + {0x0165, 0x00}, + {0x0166, 0x0C}, + {0x0167, 0xCF}, + {0x0168, 0x00}, + {0x0169, 0x00}, + {0x016A, 0x09}, + {0x016B, 0x9F}, + {0x016C, 0x0C}, + {0x016D, 0xD0}, + {0x016E, 0x09}, + {0x016F, 0xA0}, + {0x0170, 0x01}, // X_ODD_INC [2:0] + {0x0171, 0x01}, // Y_ODD_INC [2:0] + {0x0172, 0x03}, + {0x0174, 0x00}, // Binning Mode H_A + {0x0175, 0x00}, // Binning Mode V_A + {0x018C, 0x0A}, // CSI Data Format [15:8] + {0x018D, 0x0A}, // CSI Data Format [7:0] + {0x0301, 0x05}, // VTPXCK_DIV + {0x0303, 0x01}, // VTSYCK_DIV + {0x0304, 0x03}, // PREPLLCK_VT_DIV [3:0] + {0x0305, 0x03}, // PREPLLCK_OP_DIV [3:0] + {0x0306, 0x00}, // PLL_VT_MPY [10:8] + {0x0307, 0x2B}, // PLL_VT_MPY [7:0] + {0x0309, 0x0A}, // OPPXCK_DIV [4:0] + {0x030B, 0x01}, // OPSYCK_DIV + {0x030C, 0x00}, // PLL_OP_MPY [10:8] + {0x030D, 0x55}, // PLL_OP_MPY [7:0] + {0x455E, 0x00}, // CIS Tuning ? + {0x471E, 0x4B}, // CIS Tuning ? + {0x4767, 0x0F}, // CIS Tuning ? + {0x4750, 0x14}, // CIS Tuning ? + {0x4540, 0x00}, // CIS Tuning ? + {0x47B4, 0x14}, // CIS Tuning ? + {0x4713, 0x30}, // CIS Tuning ? + {0x478B, 0x10}, // CIS Tuning ? + {0x478F, 0x10}, // CIS Tuning ? + {0x4797, 0x0E}, // CIS Tuning ? + {0x479B, 0x0E}, // CIS Tuning ? + {TABLE_END, 0x00} +}; + +static struct sensor_cmd imx219_720p_regs[] = { //720: 1280*720@30fps + {0x30EB, 0x05}, + {0x30EB, 0x0C}, + {0x300A, 0xFF}, + {0x300B, 0xFF}, + {0x30EB, 0x05}, + {0x30EB, 0x09}, + + {0x0114, 0x01}, // CSI_LANE_MODE = 2-lane + {0x0128, 0x00}, // DPHY_CTRL = auto mode + + {0x012A, 0x13}, // EXCLK_FREQ[15:8] + {0x012B, 0x34}, // EXCLK_FREQ[7:0] = 4916 MHz + + {0x0160, 0x04}, // FRM_LENGTH_A[15:8] + {0x0161, 0x60}, // FRM_LENGTH_A[7:0] = 1120 + {0x0162, 0x0D}, // LINE_LENGTH_A[15:8] + {0x0163, 0x78}, // LINE_LENGTH_A[7:0] = 3448 + {0x0164, 0x01}, // XADD_STA_A[11:8] + {0x0165, 0x58}, // XADD_STA_A[7:0] = X top left = 344 + {0x0166, 0x0B}, // XADD_END_A[11:8] + {0x0167, 0x77}, // XADD_END_A[7:0] = X bottom right = 2935 + {0x0168, 0x01}, // YADD_STA_A[11:8] + {0x0169, 0xF0}, // YADD_STA_A[7:0] = Y top left = 496 + {0x016A, 0x07}, // YADD_END_A[11:8] + {0x016B, 0xAF}, // YADD_END_A[7:0] = Y bottom right = 1967 + {0x016C, 0x05}, // x_output_size[11:8] + {0x016D, 0x10}, // x_output_size[7:0] = 1296 + {0x016E, 0x02}, // y_output_size[11:8] + {0x016F, 0xE0}, // y_output_size[7:0] = 736 + {0x0170, 0x01}, // X_ODD_INC_A + {0x0171, 0x01}, // Y_ODD_INC_A + {0x0174, 0x01}, // BINNING_MODE_H_A = x2-binning + {0x0175, 0x01}, // BINNING_MODE_V_A = x2-binning +// {0x0174, 0x00}, // BINNING_MODE_H_A = no-binning +// {0x0175, 0x00}, // BINNING_MODE_V_A = no-binning + {0x0176, 0x01}, // BINNING_CAL_MODE_H_A + {0x0177, 0x01}, // BINNING_CAL_MODE_V_A + {0x018C, 0x0A}, // CSI_DATA_FORMAT_A[15:8] + {0x018D, 0x0A}, // CSI_DATA_FORMAT_A[7:0] + {0x0301, 0x05}, + {0x0303, 0x01}, + {0x0304, 0x02}, + {0x0305, 0x02}, + {0x0309, 0x0A}, // OPPXCK_DIV + {0x030B, 0x01}, // OPSYCK_DIV + + {0x0306, 0x00}, // PLL_VT_MPY[10:8] + //{0x0307, 0x2E}, // PLL_VT_MPY[7:0] = 46 + {0x0307, 0x17}, // PLL_VT_MPY[7:0] = 23 + //{0x0307, 0x0F}, // PLL_VT_MPY[7:0] = 15 + + {0x030C, 0x00}, // PLL_OP_MPY[10:8] + //{0x030D, 0x5C}, // PLL_OP_MPY[7:0] = 92 + {0x030D, 0x2E}, // PLL_OP_MPY[7:0] = 46 + //{0x030D, 0x1E}, // PLL_OP_MPY[7:0] = 30 + + {0x455E, 0x00}, + {0x471E, 0x4B}, + {0x4767, 0x0F}, + {0x4750, 0x14}, + {0x4540, 0x00}, + {0x47B4, 0x14}, + {0x4713, 0x30}, + {0x478B, 0x10}, + {0x478F, 0x10}, + {0x4793, 0x10}, + {0x4797, 0x0E}, + {0x479B, 0x0E}, + //{0x0601, 0x02}, // Test pattern = Color bar + {0x0601, 0x00}, // Test pattern = Normal work + {0x0620, 0x00}, // TP_WINDOW_X_OFFSET[11:8] + {0x0621, 0x00}, // TP_WINDOW_X_OFFSET[7:0] + {0x0621, 0x00}, // TP_WINDOW_Y_OFFSET[11:8] + {0x0623, 0x00}, // TP_WINDOW_Y_OFFSET[7:0] + {0x0624, 0x05}, // TP_WINDOW_WIDTH[11:8] + {0x0625, 0x00}, // TP_WINDOW_WIDTH[7:0] = 1280 + {0x0626, 0x02}, // TP_WINDOW_HEIGHT[11:8] + {0x0627, 0xD0}, // TP_WINDOW_HEIGHT[7:0] = 720 + {0x0100, 0x01}, /* mode select streaming on */ + {TABLE_END, 0x00} +}; + +static struct sensor_cmd imx219_720p_45fps_regs[] = { //720: 1280*720@45fps + {0x30EB, 0x05}, + {0x30EB, 0x0C}, + {0x300A, 0xFF}, + {0x300B, 0xFF}, + {0x30EB, 0x05}, + {0x30EB, 0x09}, + + {0x0114, 0x01}, + {0x0128, 0x00}, + + {0x012A, 0x13}, // EXCLK_FREQ[15:8] + {0x012B, 0x34}, // EXCLK_FREQ[7:0] = 4916 MHz + +// {0x012A, 0x09}, // EXCLK_FREQ[15:8] +// {0x012B, 0x9A}, // EXCLK_FREQ[7:0] = 2458 MHz + +// {0x012A, 0x26}, // * EXCLK_FREQ[15:8] +// {0x012B, 0x68}, // * EXCLK_FREQ[7:0] = 4916 MHz +// {0x012A, 0x18}, // * EXCLK_FREQ[15:8] +// {0x012B, 0x00}, // * EXCLK_FREQ[7:0] = 4916 MHz + + {0x0160, 0x04}, + {0x0161, 0x60}, + {0x0162, 0x0D}, + {0x0163, 0x78}, + {0x0164, 0x01}, + {0x0165, 0x58}, + {0x0166, 0x0B}, + {0x0167, 0x77}, + {0x0168, 0x01}, + {0x0169, 0xF0}, + {0x016A, 0x07}, + {0x016B, 0xAF}, + {0x016C, 0x05}, + {0x016D, 0x10}, + {0x016E, 0x02}, + {0x016F, 0xE0}, + {0x0170, 0x01}, + {0x0171, 0x01}, + {0x0174, 0x01}, + {0x0175, 0x01}, + {0x0176, 0x01}, + {0x0177, 0x01}, + {0x018C, 0x0A}, + {0x018D, 0x0A}, + {0x0301, 0x05}, + {0x0303, 0x01}, + {0x0304, 0x02}, + {0x0305, 0x02}, + {0x0306, 0x00}, + {0x0307, 0x2E}, + {0x0309, 0x0A}, + {0x030B, 0x01}, + + //{0x030C, 0x00}, // PLL_OP_MPY[10:8] + //{0x030D, 0x5C}, // PLL_OP_MPY[7:0] = 92 + + {0x030C, 0x00}, // PLL_OP_MPY[10:8] + {0x030D, 0xB8}, // PLL_OP_MPY[7:0] = 184 + + {0x455E, 0x00}, + {0x471E, 0x4B}, + {0x4767, 0x0F}, + {0x4750, 0x14}, + {0x4540, 0x00}, + {0x47B4, 0x14}, + {0x4713, 0x30}, + {0x478B, 0x10}, + {0x478F, 0x10}, + {0x4793, 0x10}, + {0x4797, 0x0E}, + {0x479B, 0x0E}, + {0x0100, 0x01}, /* mode select streaming on */ + {TABLE_END, 0x00} +}; + + + +static const struct sensor_cmd imx219_start[] = { + {0x0100, 0x01}, /* mode select streaming on */ + {TABLE_END, 0x00} +}; +static const struct sensor_cmd imx219_stop[] = { + {0x0100, 0x00}, /* mode select streaming off */ + {TABLE_END, 0x00} +}; +static const struct sensor_cmd imx219_test_color_bar[] = { + {0x0600, 0x00}, + {0x0601, 0x02}, + {TABLE_END, 0x00} +}; + +struct sensor_rect { + unsigned short left; + unsigned short top; + unsigned short width; + unsigned short height; +}; + +static const struct sensor_rect imx219_center_1280x720_rect = { + 1000, 872, 1280, 720 +}; + + +#endif diff --git a/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/startup/files/startup.c b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/startup/files/startup.c new file mode 100644 index 0000000..62523b0 --- /dev/null +++ b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-apps/startup/files/startup.c @@ -0,0 +1,39 @@ +/* +* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, +* subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or (b) that interact +* with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in this +* Software without prior written authorization from Xilinx. +* +*/ + +#include + +int main(int argc, char **argv) +{ + printf("Hello World!\n"); + + return 0; +} diff --git a/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h new file mode 100644 index 0000000..918e64b --- /dev/null +++ b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h @@ -0,0 +1,5 @@ + +#include + +#define CONFIG_PREBOOT "echo U-BOOT for ${hostname};setenv preboot; echo; fatload mmc 0 0x1FC00000 u-boot.rgba" + diff --git a/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-modules/te-audio-codec/files/te-audio-codec.c b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-modules/te-audio-codec/files/te-audio-codec.c new file mode 100644 index 0000000..5b9575d --- /dev/null +++ b/zynqberrydemo1/os/petalinux/project-spec/meta-user/recipes-modules/te-audio-codec/files/te-audio-codec.c @@ -0,0 +1,99 @@ +/* + * ALSA SoC SPDIF DIT driver + * + * This driver is used by controllers which can operate in DIT (SPDI/F) where + * no codec is needed. This file provides stub codec that can be used + * in these configurations. TI DaVinci Audio controller uses this driver. + * + * Author: Steve Chen, + * Copyright: (C) 2009 MontaVista Software, Inc., + * Copyright: (C) 2009 Texas Instruments, India + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "te-audio-codec" + +#define STUB_RATES (SNDRV_PCM_RATE_8000_192000 | \ + SNDRV_PCM_RATE_32000 | \ + SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | \ + SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \ + SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000) +#define STUB_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ + SNDRV_PCM_FMTBIT_S20_3LE | \ + SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) + +static const struct snd_soc_dapm_widget dit_widgets[] = { + SND_SOC_DAPM_OUTPUT("te-out"), +}; + +static const struct snd_soc_dapm_route dit_routes[] = { + { "te-out", NULL, "Playback" }, +}; + +static struct snd_soc_codec_driver soc_codec_spdif_dit = { + .component_driver = { + .dapm_widgets = dit_widgets, + .num_dapm_widgets = ARRAY_SIZE(dit_widgets), + .dapm_routes = dit_routes, + .num_dapm_routes = ARRAY_SIZE(dit_routes), + }, +}; + +static struct snd_soc_dai_driver dit_stub_dai = { + .name = "dit-hifi", + .playback = { + .stream_name = "Playback", + .channels_min = 1, + .channels_max = 384, + .rates = STUB_RATES, + .formats = STUB_FORMATS, + }, +}; + +static int spdif_dit_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, &soc_codec_spdif_dit, + &dit_stub_dai, 1); +} + +static int spdif_dit_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id spdif_dit_dt_ids[] = { + { .compatible = "te,te-audio", }, + { } +}; +MODULE_DEVICE_TABLE(of, spdif_dit_dt_ids); +#endif + +static struct platform_driver spdif_dit_driver = { + .probe = spdif_dit_probe, + .remove = spdif_dit_remove, + .driver = { + .name = DRV_NAME, + .of_match_table = of_match_ptr(spdif_dit_dt_ids), + }, +}; + +module_platform_driver(spdif_dit_driver); + +MODULE_AUTHOR("Steve Chen "); +MODULE_DESCRIPTION("SPDIF dummy codec driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRV_NAME); + diff --git a/zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_io_report.txt b/zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_io_report.txt new file mode 100644 index 0000000..12a90a6 --- /dev/null +++ b/zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_io_report.txt @@ -0,0 +1,267 @@ +Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2017.1 (win64) Build 1846317 Fri Apr 14 18:55:03 MDT 2017 +| Date : Mon Jun 12 14:19:13 2017 +| Host : W8-64-02 running 64-bit major release (build 9200) +| Command : report_io -force -file B:/Design/cores/2017.1/design/TE0726/zynqberrydemo1/vivado/zynqberrydemo1.runs/impl_1/zynqberrydemo1_io_report.txt -format text +| Design : zsys_wrapper +| Device : xc7z007s +| Speed File : -1 +| Package : clg225 +| Package Version : FINAL 2012-11-02 +| Package Pin Delay Version : VERS. 2.0 2012-11-02 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +IO Information + +Table of Contents +----------------- +1. Summary +2. IO Assignments by Package Pin + +1. Summary +---------- + ++---------------+ +| Total User IO | ++---------------+ +| 130 | ++---------------+ + + +2. IO Assignments by Package Pin +-------------------------------- + ++------------+-------------------+------------+-------------------------+-------------+-------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +| Pin Number | Signal Name | Bank Type | Pin Name | Use | IO Standard | IO Bank | Drive (mA) | Slew | On-Chip Termination | Off-Chip Termination | Voltage | Constraint | Pull Type | DQS Bias | Vref | Signal Integrity | ++------------+-------------------+------------+-------------------------+-------------+-------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +| A1 | | | GND | GND | | | | | | | 0.0 | | | | | | +| A2 | DDR_dq[1] | | PS_DDR_DQ1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A3 | DDR_dq[7] | | PS_DDR_DQ7_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A4 | DDR_dq[5] | | PS_DDR_DQ5_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A5 | FIXED_IO_mio[1] | | PS_MIO1_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A6 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | +| A7 | FIXED_IO_mio[3] | | PS_MIO3_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A8 | FIXED_IO_mio[2] | | PS_MIO2_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A9 | FIXED_IO_mio[5] | | PS_MIO5_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A10 | FIXED_IO_mio[6] | | PS_MIO6_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A11 | | | GND | GND | | | | | | | 0.0 | | | | | | +| A12 | FIXED_IO_mio[30] | | PS_MIO52_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A13 | FIXED_IO_mio[26] | | PS_MIO38_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A14 | FIXED_IO_mio[23] | | PS_MIO35_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A15 | FIXED_IO_mio[16] | | PS_MIO28_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B1 | DDR_dm[0] | | PS_DDR_DM0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B2 | DDR_dqs_n[0] | | PS_DDR_DQS_N0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| B4 | DDR_dq[4] | | PS_DDR_DQ4_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B5 | FIXED_IO_mio[9] | | PS_MIO9_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B6 | FIXED_IO_mio[8] | | PS_MIO8_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B7 | FIXED_IO_mio[12] | | PS_MIO12_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B8 | | | GND | GND | | | | | | | 0.0 | | | | | | +| B9 | FIXED_IO_mio[14] | | PS_MIO14_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B10 | FIXED_IO_mio[11] | | PS_MIO11_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B11 | FIXED_IO_ps_srstb | | PS_SRST_B_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B12 | FIXED_IO_mio[28] | | PS_MIO48_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B13 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| B14 | FIXED_IO_mio[24] | | PS_MIO36_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B15 | FIXED_IO_mio[18] | | PS_MIO30_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C1 | DDR_dq[3] | | PS_DDR_DQ3_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C2 | DDR_dqs_p[0] | | PS_DDR_DQS_P0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C3 | DDR_dq[6] | | PS_DDR_DQ6_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C4 | DDR_dq[2] | | PS_DDR_DQ2_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| C6 | FIXED_IO_mio[13] | | PS_MIO13_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C7 | FIXED_IO_ps_clk | | PS_CLK_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C8 | FIXED_IO_mio[4] | | PS_MIO4_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C9 | FIXED_IO_ps_porb | | PS_POR_B_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C10 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| C11 | FIXED_IO_mio[21] | | PS_MIO33_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C12 | FIXED_IO_mio[19] | | PS_MIO31_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C13 | FIXED_IO_mio[31] | | PS_MIO53_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C14 | FIXED_IO_mio[25] | | PS_MIO37_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C15 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D1 | DDR_dq[9] | | PS_DDR_DQ9_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D2 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D3 | DDR_dm[1] | | PS_DDR_DM1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D4 | DDR_dq[0] | | PS_DDR_DQ0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D5 | | Dedicated | INIT_B_0 | Config | | 0 | | | | | | | | | | | +| D6 | FIXED_IO_mio[10] | | PS_MIO10_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D7 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | +| D8 | FIXED_IO_mio[0] | | PS_MIO0_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D9 | FIXED_IO_mio[7] | | PS_MIO7_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D10 | FIXED_IO_mio[15] | | PS_MIO15_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D11 | FIXED_IO_mio[17] | | PS_MIO29_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D12 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D13 | FIXED_IO_mio[29] | | PS_MIO49_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D14 | FIXED_IO_mio[27] | | PS_MIO39_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D15 | FIXED_IO_mio[22] | | PS_MIO34_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| E1 | DDR_dq[8] | | PS_DDR_DQ8_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| E2 | DDR_dq[10] | | PS_DDR_DQ10_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| E3 | DDR_dq[11] | | PS_DDR_DQ11_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| E4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| E5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E6 | | Dedicated | VCCBATT_0 | Config | | 0 | | | | | | | | | | | +| E7 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E8 | | | RSVDGND | GND | | | | | | | | | | | | | +| E9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| E11 | | High Range | IO_L2P_T0_AD8P_35 | User IO | | 35 | | | | | | | | | | | +| E12 | | High Range | IO_L2N_T0_AD8N_35 | User IO | | 35 | | | | | | | | | | | +| E13 | | High Range | IO_L1N_T0_AD0N_35 | User IO | | 35 | | | | | | | | | | | +| E14 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| E15 | FIXED_IO_mio[20] | | PS_MIO32_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| F1 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| F2 | DDR_dqs_n[1] | | PS_DDR_DQS_N1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| F3 | DDR_dq[12] | | PS_DDR_DQ12_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| F4 | | | PS_DDR_VREF0_502 | PSS IO | | | | | | | | | | | | | +| F5 | | | VCCPLL | PSS VCCPLL | | | | | | | | | | | | | +| F6 | | Dedicated | CFGBVS_0 | Config | | 0 | | | | | 3.30 | | | | | | +| F7 | | Dedicated | VCCADC_0 | XADC | | 0 | | | | | | | | | | | +| F8 | | Dedicated | GNDADC_0 | XADC | | 0 | | | | | | | | | | | +| F9 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| F10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| F11 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | +| F12 | | High Range | IO_L1P_T0_AD0P_35 | User IO | | 35 | | | | | | | | | | | +| F13 | | High Range | IO_L3P_T0_DQS_AD1P_35 | User IO | | 35 | | | | | | | | | | | +| F14 | | High Range | IO_L3N_T0_DQS_AD1N_35 | User IO | | 35 | | | | | | | | | | | +| F15 | | High Range | IO_L5N_T0_AD9N_35 | User IO | | 35 | | | | | | | | | | | +| G1 | DDR_dq[13] | | PS_DDR_DQ13_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| G2 | DDR_dqs_p[1] | | PS_DDR_DQS_P1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| G3 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G4 | | | RSVDVCC1 | Reserved | | | | | | | | | | | | | +| G5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G6 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| G7 | Vp_Vn_v_p | Dedicated | VP_0 | INPUT | LVCMOS18* | 0 | | | | NONE | | UNFIXED | | | | NONE | +| G8 | | Dedicated | VREFN_0 | XADC | | 0 | | | | | | | | | | | +| G9 | | Dedicated | TCK_0 | Config | | 0 | | | | | | | | | | | +| G10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| G11 | gpio_1_tri_io[13] | High Range | IO_L1P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| G12 | gpio_1_tri_io[23] | High Range | IO_L2P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| G13 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G14 | | High Range | IO_L3P_T0_DQS_PUDC_B_34 | User IO | | 34 | | | | | | | | | | | +| G15 | | High Range | IO_L5P_T0_AD9P_35 | User IO | | 35 | | | | | | | | | | | +| H1 | DDR_dq[14] | | PS_DDR_DQ14_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| H2 | DDR_dq[15] | | PS_DDR_DQ15_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| H3 | FIXED_IO_ddr_vrp | | PS_DDR_VRP_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| H4 | | | RSVDVCC3 | Reserved | | | | | | | | | | | | | +| H5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| H6 | | | GND | GND | | | | | | | 0.0 | | | | | | +| H7 | | Dedicated | VREFP_0 | XADC | | 0 | | | | | | | | | | | +| H8 | Vp_Vn_v_n | Dedicated | VN_0 | INPUT | LVCMOS18* | 0 | | | | NONE | | UNFIXED | | | | NONE | +| H9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| H10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| H11 | gpio_1_tri_io[14] | High Range | IO_L6P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H12 | gpio_1_tri_io[2] | High Range | IO_L1N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H13 | gpio_1_tri_io[18] | High Range | IO_L2N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H14 | gpio_1_tri_io[8] | High Range | IO_L3N_T0_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H15 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | +| J1 | DDR_addr[10] | | PS_DDR_A10_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| J2 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| J3 | FIXED_IO_ddr_vrn | | PS_DDR_VRN_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| J4 | | | RSVDVCC2 | Reserved | | | | | | | | | | | | | +| J5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| J6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | +| J7 | | Dedicated | DXP_0 | Temp Sensor | | 0 | | | | | | | | | | | +| J8 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| J9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| J10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| J11 | gpio_1_tri_io[19] | High Range | IO_L6N_T0_VREF_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J12 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| J13 | gpio_1_tri_io[7] | High Range | IO_L5P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J14 | gpio_1_tri_io[1] | High Range | IO_L5N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J15 | gpio_1_tri_io[9] | High Range | IO_L4P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K1 | DDR_addr[14] | | PS_DDR_A14_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| K2 | DDR_addr[13] | | PS_DDR_A13_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| K3 | DDR_odt | | PS_DDR_ODT_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| K4 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| K6 | | Dedicated | PROGRAM_B_0 | Config | | 0 | | | | | | | | | | | +| K7 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K8 | | Dedicated | VCCO_0 | VCCO | | 0 | | | | | 3.30 | | | | | | +| K9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| K10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K11 | gpio_1_tri_io[20] | High Range | IO_L11P_T1_SRCC_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K12 | | High Range | IO_L11N_T1_SRCC_34 | User IO | | 34 | | | | | | | | | | | +| K13 | gpio_1_tri_io[21] | High Range | IO_L10P_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K14 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K15 | gpio_1_tri_io[0] | High Range | IO_L4N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L1 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L2 | DDR_addr[11] | | PS_DDR_A11_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| L3 | DDR_cke | | PS_DDR_CKE_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| L4 | DDR_reset_n | | PS_DDR_DRST_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| L5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | +| L7 | | Dedicated | TDI_0 | Config | | 0 | | | | | | | | | | | +| L8 | | Dedicated | TDO_0 | Config | | 0 | | | | | | | | | | | +| L9 | | Dedicated | TMS_0 | Config | | 0 | | | | | | | | | | | +| L10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| L11 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L12 | gpio_1_tri_io[22] | High Range | IO_L12P_T1_MRCC_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L13 | gpio_1_tri_io[12] | High Range | IO_L10N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L14 | gpio_1_tri_io[5] | High Range | IO_L9P_T1_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L15 | gpio_1_tri_io[6] | High Range | IO_L8P_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M1 | DDR_addr[2] | | PS_DDR_A2_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M2 | DDR_addr[12] | | PS_DDR_A12_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| M4 | DDR_addr[3] | | PS_DDR_A3_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M5 | DDR_addr[7] | | PS_DDR_A7_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M6 | DDR_ba[0] | | PS_DDR_BA0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M7 | | Dedicated | DONE_0 | Config | | 0 | | | | | | | | | | | +| M8 | | | GND | GND | | | | | | | 0.0 | | | | | | +| M9 | csi_d_lp_n[0] | High Range | IO_L19P_T3_34 | INPUT | HSUL_12 | 34 | | | | NONE | | FIXED | PULLDOWN | | Internal | NONE | +| M10 | csi_d_p[0] | High Range | IO_L21P_T3_DQS_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| M11 | csi_d_n[0] | High Range | IO_L21N_T3_DQS_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| M12 | | High Range | IO_L12N_T1_MRCC_34 | User IO | | 34 | | | | | | | | | | | +| M13 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| M14 | gpio_1_tri_io[16] | High Range | IO_L9N_T1_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M15 | gpio_1_tri_io[10] | High Range | IO_L8N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N1 | DDR_addr[1] | | PS_DDR_A1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N2 | DDR_ck_n | | PS_DDR_CKN_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N3 | DDR_ck_p | | PS_DDR_CKP_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N4 | DDR_addr[9] | | PS_DDR_A9_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| N6 | DDR_ba[2] | | PS_DDR_BA2_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N7 | PWM_L | High Range | IO_L22P_T3_34 | OUTPUT | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N8 | PWM_R | High Range | IO_L22N_T3_34 | OUTPUT | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N9 | csi_d_lp_p[0] | High Range | IO_L19N_T3_VREF_34 | INPUT | HSUL_12 | 34 | | | | NONE | | FIXED | PULLDOWN | | Internal | NONE | +| N10 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| N11 | csi_c_clk_p | High Range | IO_L13P_T2_MRCC_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| N12 | csi_c_clk_n | High Range | IO_L13N_T2_MRCC_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| N13 | | High Range | IO_L7P_T1_34 | User IO | | 34 | | | | | | | | | | | +| N14 | gpio_1_tri_io[3] | High Range | IO_L7N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N15 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P1 | DDR_addr[0] | | PS_DDR_A0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P2 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P3 | DDR_addr[4] | | PS_DDR_A4_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P4 | DDR_addr[5] | | PS_DDR_A5_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P5 | DDR_addr[6] | | PS_DDR_A6_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P6 | DDR_addr[8] | | PS_DDR_A8_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P7 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| P8 | hdmi_data_p[0] | High Range | IO_L23P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P9 | hdmi_data_n[0] | High Range | IO_L23N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P10 | hdmi_data_p[1] | High Range | IO_L24P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P11 | hdmi_data_p[2] | High Range | IO_L16P_T2_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P12 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P13 | csi_d_p[1] | High Range | IO_L18P_T2_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| P14 | csi_d_n[1] | High Range | IO_L18N_T2_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| P15 | gpio_1_tri_io[17] | High Range | IO_L15P_T2_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R1 | DDR_ba[1] | | PS_DDR_BA1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R2 | DDR_cs_n | | PS_DDR_CS_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R3 | DDR_we_n | | PS_DDR_WE_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| R5 | DDR_cas_n | | PS_DDR_CAS_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R6 | DDR_ras_n | | PS_DDR_RAS_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R7 | hdmi_clk_p | High Range | IO_L20P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R8 | hdmi_clk_n | High Range | IO_L20N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| R10 | hdmi_data_n[1] | High Range | IO_L24N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R11 | hdmi_data_n[2] | High Range | IO_L16N_T2_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R12 | gpio_1_tri_io[15] | High Range | IO_L17P_T2_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R13 | gpio_1_tri_io[11] | High Range | IO_L17N_T2_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R14 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| R15 | gpio_1_tri_io[4] | High Range | IO_L15N_T2_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | ++------------+-------------------+------------+-------------------------+-------------+-------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +* Default value +** Special VCCO requirements may apply. Please consult the device family datasheet for specific guideline on VCCO requirements. + + diff --git a/zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_io_report.xdc b/zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_io_report.xdc new file mode 100644 index 0000000..1bc805c --- /dev/null +++ b/zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_io_report.xdc @@ -0,0 +1,535 @@ +set_property DIRECTION IN [get_ports {csi_d_lp_p[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_p[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_p[0]}] +set_property DIRECTION IN [get_ports {csi_d_n[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_n[1]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_n[1]}] +set_property DIRECTION IN [get_ports {csi_d_n[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_n[0]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_n[0]}] +set_property DIRECTION IN [get_ports {csi_d_p[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[1]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_p[1]}] +set_property DIRECTION IN [get_ports {csi_d_p[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[0]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_p[0]}] +set_property DIRECTION IN [get_ports {csi_d_lp_n[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_n[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_n[0]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[2]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[2]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[1]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[1]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[0]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[0]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[2]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[2]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[1]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[1]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[0]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[0]}] +set_property DIRECTION OUT [get_ports hdmi_clk_p] +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_p] +set_property DIRECTION OUT [get_ports hdmi_clk_n] +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_n] +set_property DIRECTION IN [get_ports csi_c_clk_p] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_p] +set_property DIFF_TERM FALSE [get_ports csi_c_clk_p] +set_property DIRECTION IN [get_ports csi_c_clk_n] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_n] +set_property DIFF_TERM FALSE [get_ports csi_c_clk_n] +set_property DIRECTION IN [get_ports Vp_Vn_v_p] +set_property DIRECTION IN [get_ports Vp_Vn_v_n] +set_property DIRECTION OUT [get_ports PWM_R] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_R] +set_property DRIVE 12 [get_ports PWM_R] +set_property SLEW SLOW [get_ports PWM_R] +set_property DIRECTION OUT [get_ports PWM_L] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_L] +set_property DRIVE 12 [get_ports PWM_L] +set_property SLEW SLOW [get_ports PWM_L] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[23]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[23]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[23]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[23]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[22]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[22]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[22]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[22]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[21]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[21]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[21]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[21]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[20]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[20]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[20]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[20]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[19]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[19]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[19]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[19]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[18]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[18]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[18]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[18]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[17]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[17]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[17]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[17]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[16]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[16]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[16]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[16]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[15]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[15]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[15]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[15]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[14]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[14]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[14]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[13]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[13]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[13]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[12]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[12]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[12]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[11]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[11]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[11]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[10]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[10]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[10]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[9]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[9]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[9]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[8]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[8]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[8]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[7]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[7]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[7]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[6]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[6]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[6]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[5]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[5]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[5]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[4]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[4]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[4]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[3]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[3]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[3]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[2]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[2]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[2]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[1]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[1]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[1]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[0]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[0]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[0]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[31]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[31]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[31]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[31]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[30]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[30]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[30]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[30]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[29]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[29]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[29]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[29]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[28]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[28]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[28]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[28]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[27]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[27]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[27]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[27]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[26]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[26]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[26]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[26]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[25]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[25]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[25]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[25]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[24]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[24]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[24]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[24]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[23]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[23]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[23]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[23]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[22]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[22]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[22]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[22]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[21]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[21]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[21]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[21]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[20]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[20]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[20]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[20]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[19]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[19]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[19]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[19]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[18]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[18]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[18]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[18]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[17]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[17]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[17]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[17]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[16]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[16]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[16]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[16]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[15]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[15]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[15]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[15]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[14]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[14]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[14]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[14]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[13]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[13]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[13]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[13]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[12]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[12]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[12]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[12]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[11]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[11]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[11]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[11]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[10]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[10]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[10]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[10]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[9]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[9]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[9]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[9]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[8]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[8]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[8]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[8]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[7]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[7]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[7]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[7]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[6]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[6]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[6]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[6]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[5]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[5]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[5]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[5]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[4]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[4]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[4]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[4]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[3]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[3]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[3]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[2]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[2]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[2]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[1]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[1]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[1]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[0]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[0]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[0]}] +set_property DIRECTION INOUT [get_ports FIXED_IO_ddr_vrn] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ddr_vrn] +set_property DRIVE 12 [get_ports FIXED_IO_ddr_vrn] +set_property SLEW SLOW [get_ports FIXED_IO_ddr_vrn] +set_property DIRECTION INOUT [get_ports FIXED_IO_ddr_vrp] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ddr_vrp] +set_property DRIVE 12 [get_ports FIXED_IO_ddr_vrp] +set_property SLEW SLOW [get_ports FIXED_IO_ddr_vrp] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_clk] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ps_clk] +set_property DRIVE 12 [get_ports FIXED_IO_ps_clk] +set_property SLEW SLOW [get_ports FIXED_IO_ps_clk] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_porb] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ps_porb] +set_property DRIVE 12 [get_ports FIXED_IO_ps_porb] +set_property SLEW SLOW [get_ports FIXED_IO_ps_porb] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_srstb] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ps_srstb] +set_property DRIVE 12 [get_ports FIXED_IO_ps_srstb] +set_property SLEW SLOW [get_ports FIXED_IO_ps_srstb] +set_property DIRECTION INOUT [get_ports {DDR_dqs_p[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dqs_p[1]}] +set_property DRIVE 12 [get_ports {DDR_dqs_p[1]}] +set_property SLEW SLOW [get_ports {DDR_dqs_p[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_p[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dqs_p[0]}] +set_property DRIVE 12 [get_ports {DDR_dqs_p[0]}] +set_property SLEW SLOW [get_ports {DDR_dqs_p[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_n[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dqs_n[1]}] +set_property DRIVE 12 [get_ports {DDR_dqs_n[1]}] +set_property SLEW SLOW [get_ports {DDR_dqs_n[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_n[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dqs_n[0]}] +set_property DRIVE 12 [get_ports {DDR_dqs_n[0]}] +set_property SLEW SLOW [get_ports {DDR_dqs_n[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[15]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[15]}] +set_property DRIVE 12 [get_ports {DDR_dq[15]}] +set_property SLEW SLOW [get_ports {DDR_dq[15]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[14]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[14]}] +set_property DRIVE 12 [get_ports {DDR_dq[14]}] +set_property SLEW SLOW [get_ports {DDR_dq[14]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[13]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[13]}] +set_property DRIVE 12 [get_ports {DDR_dq[13]}] +set_property SLEW SLOW [get_ports {DDR_dq[13]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[12]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[12]}] +set_property DRIVE 12 [get_ports {DDR_dq[12]}] +set_property SLEW SLOW [get_ports {DDR_dq[12]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[11]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[11]}] +set_property DRIVE 12 [get_ports {DDR_dq[11]}] +set_property SLEW SLOW [get_ports {DDR_dq[11]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[10]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[10]}] +set_property DRIVE 12 [get_ports {DDR_dq[10]}] +set_property SLEW SLOW [get_ports {DDR_dq[10]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[9]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[9]}] +set_property DRIVE 12 [get_ports {DDR_dq[9]}] +set_property SLEW SLOW [get_ports {DDR_dq[9]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[8]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[8]}] +set_property DRIVE 12 [get_ports {DDR_dq[8]}] +set_property SLEW SLOW [get_ports {DDR_dq[8]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[7]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[7]}] +set_property DRIVE 12 [get_ports {DDR_dq[7]}] +set_property SLEW SLOW [get_ports {DDR_dq[7]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[6]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[6]}] +set_property DRIVE 12 [get_ports {DDR_dq[6]}] +set_property SLEW SLOW [get_ports {DDR_dq[6]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[5]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[5]}] +set_property DRIVE 12 [get_ports {DDR_dq[5]}] +set_property SLEW SLOW [get_ports {DDR_dq[5]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[4]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[4]}] +set_property DRIVE 12 [get_ports {DDR_dq[4]}] +set_property SLEW SLOW [get_ports {DDR_dq[4]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[3]}] +set_property DRIVE 12 [get_ports {DDR_dq[3]}] +set_property SLEW SLOW [get_ports {DDR_dq[3]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[2]}] +set_property DRIVE 12 [get_ports {DDR_dq[2]}] +set_property SLEW SLOW [get_ports {DDR_dq[2]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[1]}] +set_property DRIVE 12 [get_ports {DDR_dq[1]}] +set_property SLEW SLOW [get_ports {DDR_dq[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[0]}] +set_property DRIVE 12 [get_ports {DDR_dq[0]}] +set_property SLEW SLOW [get_ports {DDR_dq[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dm[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dm[1]}] +set_property DRIVE 12 [get_ports {DDR_dm[1]}] +set_property SLEW SLOW [get_ports {DDR_dm[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dm[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dm[0]}] +set_property DRIVE 12 [get_ports {DDR_dm[0]}] +set_property SLEW SLOW [get_ports {DDR_dm[0]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_ba[2]}] +set_property DRIVE 12 [get_ports {DDR_ba[2]}] +set_property SLEW SLOW [get_ports {DDR_ba[2]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_ba[1]}] +set_property DRIVE 12 [get_ports {DDR_ba[1]}] +set_property SLEW SLOW [get_ports {DDR_ba[1]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_ba[0]}] +set_property DRIVE 12 [get_ports {DDR_ba[0]}] +set_property SLEW SLOW [get_ports {DDR_ba[0]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[14]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[14]}] +set_property DRIVE 12 [get_ports {DDR_addr[14]}] +set_property SLEW SLOW [get_ports {DDR_addr[14]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[13]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[13]}] +set_property DRIVE 12 [get_ports {DDR_addr[13]}] +set_property SLEW SLOW [get_ports {DDR_addr[13]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[12]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[12]}] +set_property DRIVE 12 [get_ports {DDR_addr[12]}] +set_property SLEW SLOW [get_ports {DDR_addr[12]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[11]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[11]}] +set_property DRIVE 12 [get_ports {DDR_addr[11]}] +set_property SLEW SLOW [get_ports {DDR_addr[11]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[10]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[10]}] +set_property DRIVE 12 [get_ports {DDR_addr[10]}] +set_property SLEW SLOW [get_ports {DDR_addr[10]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[9]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[9]}] +set_property DRIVE 12 [get_ports {DDR_addr[9]}] +set_property SLEW SLOW [get_ports {DDR_addr[9]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[8]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[8]}] +set_property DRIVE 12 [get_ports {DDR_addr[8]}] +set_property SLEW SLOW [get_ports {DDR_addr[8]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[7]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[7]}] +set_property DRIVE 12 [get_ports {DDR_addr[7]}] +set_property SLEW SLOW [get_ports {DDR_addr[7]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[6]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[6]}] +set_property DRIVE 12 [get_ports {DDR_addr[6]}] +set_property SLEW SLOW [get_ports {DDR_addr[6]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[5]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[5]}] +set_property DRIVE 12 [get_ports {DDR_addr[5]}] +set_property SLEW SLOW [get_ports {DDR_addr[5]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[4]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[4]}] +set_property DRIVE 12 [get_ports {DDR_addr[4]}] +set_property SLEW SLOW [get_ports {DDR_addr[4]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[3]}] +set_property DRIVE 12 [get_ports {DDR_addr[3]}] +set_property SLEW SLOW [get_ports {DDR_addr[3]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[2]}] +set_property DRIVE 12 [get_ports {DDR_addr[2]}] +set_property SLEW SLOW [get_ports {DDR_addr[2]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[1]}] +set_property DRIVE 12 [get_ports {DDR_addr[1]}] +set_property SLEW SLOW [get_ports {DDR_addr[1]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[0]}] +set_property DRIVE 12 [get_ports {DDR_addr[0]}] +set_property SLEW SLOW [get_ports {DDR_addr[0]}] +set_property DIRECTION INOUT [get_ports DDR_cas_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_cas_n] +set_property DRIVE 12 [get_ports DDR_cas_n] +set_property SLEW SLOW [get_ports DDR_cas_n] +set_property DIRECTION INOUT [get_ports DDR_ck_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_ck_n] +set_property DRIVE 12 [get_ports DDR_ck_n] +set_property SLEW SLOW [get_ports DDR_ck_n] +set_property DIRECTION INOUT [get_ports DDR_ck_p] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_ck_p] +set_property DRIVE 12 [get_ports DDR_ck_p] +set_property SLEW SLOW [get_ports DDR_ck_p] +set_property DIRECTION INOUT [get_ports DDR_cke] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_cke] +set_property DRIVE 12 [get_ports DDR_cke] +set_property SLEW SLOW [get_ports DDR_cke] +set_property DIRECTION INOUT [get_ports DDR_cs_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_cs_n] +set_property DRIVE 12 [get_ports DDR_cs_n] +set_property SLEW SLOW [get_ports DDR_cs_n] +set_property DIRECTION INOUT [get_ports DDR_odt] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_odt] +set_property DRIVE 12 [get_ports DDR_odt] +set_property SLEW SLOW [get_ports DDR_odt] +set_property DIRECTION INOUT [get_ports DDR_ras_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_ras_n] +set_property DRIVE 12 [get_ports DDR_ras_n] +set_property SLEW SLOW [get_ports DDR_ras_n] +set_property DIRECTION INOUT [get_ports DDR_reset_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_reset_n] +set_property DRIVE 12 [get_ports DDR_reset_n] +set_property SLEW SLOW [get_ports DDR_reset_n] +set_property DIRECTION INOUT [get_ports DDR_we_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_we_n] +set_property DRIVE 12 [get_ports DDR_we_n] +set_property SLEW SLOW [get_ports DDR_we_n] +set_property PACKAGE_PIN N12 [get_ports csi_c_clk_n] +set_property PACKAGE_PIN N11 [get_ports csi_c_clk_p] +set_property PACKAGE_PIN M9 [get_ports {csi_d_lp_n[0]}] +set_property PACKAGE_PIN N9 [get_ports {csi_d_lp_p[0]}] +set_property PACKAGE_PIN M10 [get_ports {csi_d_p[0]}] +set_property PACKAGE_PIN M11 [get_ports {csi_d_n[0]}] +set_property PACKAGE_PIN P14 [get_ports {csi_d_n[1]}] +set_property PACKAGE_PIN P13 [get_ports {csi_d_p[1]}] +set_property INTERNAL_VREF 0.6 [get_iobanks 34] +set_property PACKAGE_PIN R8 [get_ports hdmi_clk_n] +set_property PACKAGE_PIN R7 [get_ports hdmi_clk_p] +set_property PACKAGE_PIN P8 [get_ports {hdmi_data_p[0]}] +set_property PACKAGE_PIN P9 [get_ports {hdmi_data_n[0]}] +set_property PACKAGE_PIN P10 [get_ports {hdmi_data_p[1]}] +set_property PACKAGE_PIN R10 [get_ports {hdmi_data_n[1]}] +set_property PACKAGE_PIN R11 [get_ports {hdmi_data_n[2]}] +set_property PACKAGE_PIN P11 [get_ports {hdmi_data_p[2]}] +set_property PACKAGE_PIN K15 [get_ports {gpio_1_tri_io[0]}] +set_property PACKAGE_PIN J14 [get_ports {gpio_1_tri_io[1]}] +set_property PACKAGE_PIN H12 [get_ports {gpio_1_tri_io[2]}] +set_property PACKAGE_PIN N14 [get_ports {gpio_1_tri_io[3]}] +set_property PACKAGE_PIN R15 [get_ports {gpio_1_tri_io[4]}] +set_property PACKAGE_PIN L14 [get_ports {gpio_1_tri_io[5]}] +set_property PACKAGE_PIN L15 [get_ports {gpio_1_tri_io[6]}] +set_property PACKAGE_PIN J13 [get_ports {gpio_1_tri_io[7]}] +set_property PACKAGE_PIN H14 [get_ports {gpio_1_tri_io[8]}] +set_property PACKAGE_PIN J15 [get_ports {gpio_1_tri_io[9]}] +set_property PACKAGE_PIN M15 [get_ports {gpio_1_tri_io[10]}] +set_property PACKAGE_PIN R13 [get_ports {gpio_1_tri_io[11]}] +set_property PACKAGE_PIN L13 [get_ports {gpio_1_tri_io[12]}] +set_property PACKAGE_PIN G11 [get_ports {gpio_1_tri_io[13]}] +set_property PACKAGE_PIN H11 [get_ports {gpio_1_tri_io[14]}] +set_property PACKAGE_PIN R12 [get_ports {gpio_1_tri_io[15]}] +set_property PACKAGE_PIN M14 [get_ports {gpio_1_tri_io[16]}] +set_property PACKAGE_PIN P15 [get_ports {gpio_1_tri_io[17]}] +set_property PACKAGE_PIN H13 [get_ports {gpio_1_tri_io[18]}] +set_property PACKAGE_PIN J11 [get_ports {gpio_1_tri_io[19]}] +set_property PACKAGE_PIN K11 [get_ports {gpio_1_tri_io[20]}] +set_property PACKAGE_PIN K13 [get_ports {gpio_1_tri_io[21]}] +set_property PACKAGE_PIN L12 [get_ports {gpio_1_tri_io[22]}] +set_property PACKAGE_PIN G12 [get_ports {gpio_1_tri_io[23]}] +set_property PACKAGE_PIN N8 [get_ports PWM_R] +set_property PACKAGE_PIN N7 [get_ports PWM_L] +#revert back to original instance +current_instance -quiet diff --git a/zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_ip_status_report.txt b/zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_ip_status_report.txt new file mode 100644 index 0000000..8278b7d --- /dev/null +++ b/zynqberrydemo1/prebuilt/hardware/te0726_7s/reports/zynqberrydemo1_ip_status_report.txt @@ -0,0 +1,152 @@ +Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. +------------------------------------------------------------------------------------ +| Tool Version : Vivado v.2017.1 (win64) Build 1846317 Fri Apr 14 18:55:03 MDT 2017 +| Date : Mon Jun 12 14:19:13 2017 +| Host : W8-64-02 running 64-bit major release (build 9200) +| Command : report_ip_status +------------------------------------------------------------------------------------ + +IP Status Summary + +1. Project IP Status +-------------------- +Your project uses 29 IP. Some of these IP may have undergone changes in this release of the software. Please review the recommended actions. + +More information on the Xilinx versioning policy is available at www.xilinx.com. + +Project IP Instances ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| Instance Name | Status | Recommendation | Change | IP Name | IP | New Version | New | Original Part | +| | | | Log | | Version | | License | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_Video_IO_2_HDMI_TMDS_0_0 | Up-to-date | No changes required | Change | Video IO to HDMI | 1.0 | 1.0 (Rev. 26) | Included | xc7z007sclg225-1 | +| | | | Log not | TMDS Interface | (Rev. | | | | +| | | | available | v1.0 | 26) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_i2s_adi_0_0 | Up-to-date | No changes required | Change | AXI I2S Audio | 1.2 | 1.2 (Rev. 1) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_interconnect_0_0 | Up-to-date | No changes required | *(1) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_mem_intercon_0 | Up-to-date | No changes required | *(2) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_reg32_0_0 | Up-to-date | No changes required | Change | AXI Register Bank | 1.0 | 1.0 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | Log not | 16/16 v1.0 | (Rev. | | | | +| | | | available | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_vdma_0_0 | Up-to-date | No changes required | *(3) | AXI Video Direct | 6.3 | 6.3 | Included | xc7z007sclg225-1 | +| | | | | Memory Access | | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_vdma_0_1 | Up-to-date | No changes required | *(4) | AXI Video Direct | 6.3 | 6.3 | Included | xc7z007sclg225-1 | +| | | | | Memory Access | | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_0_0 | Up-to-date | No changes required | *(5) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_3_0 | Up-to-date | No changes required | *(6) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_4_0 | Up-to-date | No changes required | *(7) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_fb_conv_0_0 | Up-to-date | No changes required | Change | axis_fb_conv_v1.0 | 1.0 | 1.0 (Rev. 5) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 5) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_raw_demosaic_0_0 | Up-to-date | No changes required | Change | RAW Demosaic v1.0 | 1.0 | 1.0 (Rev. 20) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 20) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_raw_unpack_0_0 | Up-to-date | No changes required | Change | RAW10 Unpack v1.0 | 1.0 | 1.0 (Rev. 17) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 17) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_to_i2s_0_0 | Up-to-date | No changes required | Change | AXI4-Stream to I2S | 1.0 | 1.0 (Rev. 4) | Included | xc7z007sclg225-1 | +| | | | Log not | v1.0 | (Rev. | | | | +| | | | available | | 4) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_clk_wiz_1_0 | Up-to-date | No changes required | *(8) | Clocking Wizard | 5.4 | 5.4 | Included | xc7z007sclg225-1 | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_csi2_d_phy_rx_0_0 | Up-to-date | No changes required | Change | CSI-2 D-PHY RX | 1.0 | 1.0 (Rev. 35) | Included | xc7z007sclg225-1 | +| | | | Log not | v1_0 | (Rev. | | | | +| | | | available | | 35) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_csi_to_axis_0_0 | Up-to-date | No changes required | Change | CSI-2 to | 1.0 | 1.0 (Rev. 46) | Included | xc7z007sclg225-1 | +| | | | Log not | AXI4-Stream v1.0 | (Rev. | | | | +| | | | available | | 46) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_i2s_to_pwm_0_0 | Up-to-date | No changes required | Change | I2S to PWM v1.0 | 1.0 | 1.0 (Rev. 7) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 7) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_proc_sys_reset_0_0 | Up-to-date | No changes required | *(9) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z007sclg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_proc_sys_reset_1_0 | Up-to-date | No changes required | *(10) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z007sclg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_processing_system7_0_0 | Up-to-date | No changes required | *(11) | ZYNQ7 Processing | 5.5 | 5.5 (Rev. 5) | Included | xc7z007sclg225-1 | +| | | | | System | (Rev. | | | | +| | | | | | 5) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_processing_system7_0_axi_periph_0 | Up-to-date | No changes required | *(12) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_rst_processing_system7_0_50M_0 | Up-to-date | No changes required | *(13) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z007sclg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_v_axi4s_vid_out_0_0 | Up-to-date | No changes required | *(14) | AXI4-Stream to | 4.0 | 4.0 (Rev. 6) | Included | xc7z007sclg225-1 | +| | | | | Video Out | (Rev. | | | | +| | | | | | 6) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_v_tc_0_0 | Up-to-date | No changes required | *(15) | Video Timing | 6.1 | 6.1 (Rev. 10) | Included | xc7z007sclg225-1 | +| | | | | Controller | (Rev. | | | | +| | | | | | 10) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xadc_wiz_0_0 | Up-to-date | No changes required | *(16) | XADC Wizard | 3.3 | 3.3 (Rev. 3) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 3) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlconcat_0_0 | Up-to-date | No changes required | *(17) | Concat | 2.1 | 2.1 (Rev. 1) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlslice_0_0 | Up-to-date | No changes required | Change | Slice | 1.0 | 1.0 (Rev. 1) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlslice_1_0 | Up-to-date | No changes required | Change | Slice | 1.0 | 1.0 (Rev. 1) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +*(1) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(2) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(3) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_vdma_v6_3/doc/axi_vdma_v6_3_changelog.txt +*(4) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_vdma_v6_3/doc/axi_vdma_v6_3_changelog.txt +*(5) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(6) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(7) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(8) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/clk_wiz_v5_4/doc/clk_wiz_v5_4_changelog.txt +*(9) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(10) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(11) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/processing_system7_v5_5/doc/processing_system7_v5_5_changelog.txt +*(12) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(13) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(14) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/v_axi4s_vid_out_v4_0/doc/v_axi4s_vid_out_v4_0_changelog.txt +*(15) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/v_tc_v6_1/doc/v_tc_v6_1_changelog.txt +*(16) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/xadc_wiz_v3_3/doc/xadc_wiz_v3_3_changelog.txt +*(17) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/xlconcat_v2_1/doc/xlconcat_v2_1_changelog.txt + + diff --git a/zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_io_report.txt b/zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_io_report.txt new file mode 100644 index 0000000..40d7498 --- /dev/null +++ b/zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_io_report.txt @@ -0,0 +1,267 @@ +Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2017.1 (win64) Build 1846317 Fri Apr 14 18:55:03 MDT 2017 +| Date : Mon Jun 12 13:57:38 2017 +| Host : W8-64-02 running 64-bit major release (build 9200) +| Command : report_io -force -file B:/Design/cores/2017.1/design/TE0726/zynqberrydemo1/vivado/zynqberrydemo1.runs/impl_1/zynqberrydemo1_io_report.txt -format text +| Design : zsys_wrapper +| Device : xc7z010 +| Speed File : -1 +| Package : clg225 +| Package Version : FINAL 2012-11-02 +| Package Pin Delay Version : VERS. 2.0 2012-11-02 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +IO Information + +Table of Contents +----------------- +1. Summary +2. IO Assignments by Package Pin + +1. Summary +---------- + ++---------------+ +| Total User IO | ++---------------+ +| 130 | ++---------------+ + + +2. IO Assignments by Package Pin +-------------------------------- + ++------------+-------------------+------------+-------------------------+-------------+--------------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +| Pin Number | Signal Name | Bank Type | Pin Name | Use | IO Standard | IO Bank | Drive (mA) | Slew | On-Chip Termination | Off-Chip Termination | Voltage | Constraint | Pull Type | DQS Bias | Vref | Signal Integrity | ++------------+-------------------+------------+-------------------------+-------------+--------------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +| A1 | | | GND | GND | | | | | | | 0.0 | | | | | | +| A2 | DDR_dq[1] | | PS_DDR_DQ1_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| A3 | DDR_dq[7] | | PS_DDR_DQ7_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| A4 | DDR_dq[5] | | PS_DDR_DQ5_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| A5 | FIXED_IO_mio[1] | | PS_MIO1_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| A6 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | +| A7 | FIXED_IO_mio[3] | | PS_MIO3_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| A8 | FIXED_IO_mio[2] | | PS_MIO2_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| A9 | FIXED_IO_mio[5] | | PS_MIO5_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| A10 | FIXED_IO_mio[6] | | PS_MIO6_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| A11 | | | GND | GND | | | | | | | 0.0 | | | | | | +| A12 | FIXED_IO_mio[30] | | PS_MIO52_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| A13 | FIXED_IO_mio[26] | | PS_MIO38_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| A14 | FIXED_IO_mio[23] | | PS_MIO35_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| A15 | FIXED_IO_mio[16] | | PS_MIO28_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| B1 | DDR_dm[0] | | PS_DDR_DM0_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| B2 | DDR_dqs_n[0] | | PS_DDR_DQS_N0_502 | BIDIR | DIFF_SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| B3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| B4 | DDR_dq[4] | | PS_DDR_DQ4_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| B5 | FIXED_IO_mio[9] | | PS_MIO9_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| B6 | FIXED_IO_mio[8] | | PS_MIO8_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| B7 | FIXED_IO_mio[12] | | PS_MIO12_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| B8 | | | GND | GND | | | | | | | 0.0 | | | | | | +| B9 | FIXED_IO_mio[14] | | PS_MIO14_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| B10 | FIXED_IO_mio[11] | | PS_MIO11_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| B11 | FIXED_IO_ps_srstb | | PS_SRST_B_501 | BIDIR | LVCMOS33 | | 12 | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| B12 | FIXED_IO_mio[28] | | PS_MIO48_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| B13 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| B14 | FIXED_IO_mio[24] | | PS_MIO36_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| B15 | FIXED_IO_mio[18] | | PS_MIO30_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C1 | DDR_dq[3] | | PS_DDR_DQ3_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| C2 | DDR_dqs_p[0] | | PS_DDR_DQS_P0_502 | BIDIR | DIFF_SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| C3 | DDR_dq[6] | | PS_DDR_DQ6_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| C4 | DDR_dq[2] | | PS_DDR_DQ2_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| C5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| C6 | FIXED_IO_mio[13] | | PS_MIO13_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| C7 | FIXED_IO_ps_clk | | PS_CLK_500 | BIDIR | LVCMOS33 | | 12 | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| C8 | FIXED_IO_mio[4] | | PS_MIO4_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| C9 | FIXED_IO_ps_porb | | PS_POR_B_500 | BIDIR | LVCMOS33 | | 12 | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| C10 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| C11 | FIXED_IO_mio[21] | | PS_MIO33_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C12 | FIXED_IO_mio[19] | | PS_MIO31_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C13 | FIXED_IO_mio[31] | | PS_MIO53_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C14 | FIXED_IO_mio[25] | | PS_MIO37_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C15 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D1 | DDR_dq[9] | | PS_DDR_DQ9_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| D2 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D3 | DDR_dm[1] | | PS_DDR_DM1_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| D4 | DDR_dq[0] | | PS_DDR_DQ0_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| D5 | | Dedicated | INIT_B_0 | Config | | 0 | | | | | | | | | | | +| D6 | FIXED_IO_mio[10] | | PS_MIO10_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| D7 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | +| D8 | FIXED_IO_mio[0] | | PS_MIO0_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| D9 | FIXED_IO_mio[7] | | PS_MIO7_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| D10 | FIXED_IO_mio[15] | | PS_MIO15_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| D11 | FIXED_IO_mio[17] | | PS_MIO29_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| D12 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D13 | FIXED_IO_mio[29] | | PS_MIO49_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| D14 | FIXED_IO_mio[27] | | PS_MIO39_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| D15 | FIXED_IO_mio[22] | | PS_MIO34_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| E1 | DDR_dq[8] | | PS_DDR_DQ8_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| E2 | DDR_dq[10] | | PS_DDR_DQ10_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| E3 | DDR_dq[11] | | PS_DDR_DQ11_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| E4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| E5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E6 | | Dedicated | VCCBATT_0 | Config | | 0 | | | | | | | | | | | +| E7 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E8 | | | RSVDGND | GND | | | | | | | | | | | | | +| E9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| E11 | | High Range | IO_L2P_T0_AD8P_35 | User IO | | 35 | | | | | | | | | | | +| E12 | | High Range | IO_L2N_T0_AD8N_35 | User IO | | 35 | | | | | | | | | | | +| E13 | | High Range | IO_L1N_T0_AD0N_35 | User IO | | 35 | | | | | | | | | | | +| E14 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| E15 | FIXED_IO_mio[20] | | PS_MIO32_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| F1 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| F2 | DDR_dqs_n[1] | | PS_DDR_DQS_N1_502 | BIDIR | DIFF_SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| F3 | DDR_dq[12] | | PS_DDR_DQ12_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| F4 | | | PS_DDR_VREF0_502 | PSS IO | | | | | | | | | | | | | +| F5 | | | VCCPLL | PSS VCCPLL | | | | | | | | | | | | | +| F6 | | Dedicated | CFGBVS_0 | Config | | 0 | | | | | 3.30 | | | | | | +| F7 | | Dedicated | VCCADC_0 | XADC | | 0 | | | | | | | | | | | +| F8 | | Dedicated | GNDADC_0 | XADC | | 0 | | | | | | | | | | | +| F9 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| F10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| F11 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | +| F12 | | High Range | IO_L1P_T0_AD0P_35 | User IO | | 35 | | | | | | | | | | | +| F13 | | High Range | IO_L3P_T0_DQS_AD1P_35 | User IO | | 35 | | | | | | | | | | | +| F14 | | High Range | IO_L3N_T0_DQS_AD1N_35 | User IO | | 35 | | | | | | | | | | | +| F15 | | High Range | IO_L5N_T0_AD9N_35 | User IO | | 35 | | | | | | | | | | | +| G1 | DDR_dq[13] | | PS_DDR_DQ13_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| G2 | DDR_dqs_p[1] | | PS_DDR_DQS_P1_502 | BIDIR | DIFF_SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| G3 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G4 | | | RSVDVCC1 | Reserved | | | | | | | | | | | | | +| G5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G6 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| G7 | Vp_Vn_v_p | Dedicated | VP_0 | INPUT | LVCMOS18* | 0 | | | | NONE | | UNFIXED | | | | NONE | +| G8 | | Dedicated | VREFN_0 | XADC | | 0 | | | | | | | | | | | +| G9 | | Dedicated | TCK_0 | Config | | 0 | | | | | | | | | | | +| G10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| G11 | gpio_1_tri_io[13] | High Range | IO_L1P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| G12 | gpio_1_tri_io[23] | High Range | IO_L2P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| G13 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G14 | | High Range | IO_L3P_T0_DQS_PUDC_B_34 | User IO | | 34 | | | | | | | | | | | +| G15 | | High Range | IO_L5P_T0_AD9P_35 | User IO | | 35 | | | | | | | | | | | +| H1 | DDR_dq[14] | | PS_DDR_DQ14_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| H2 | DDR_dq[15] | | PS_DDR_DQ15_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| H3 | FIXED_IO_ddr_vrp | | PS_DDR_VRP_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| H4 | | | RSVDVCC3 | Reserved | | | | | | | | | | | | | +| H5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| H6 | | | GND | GND | | | | | | | 0.0 | | | | | | +| H7 | | Dedicated | VREFP_0 | XADC | | 0 | | | | | | | | | | | +| H8 | Vp_Vn_v_n | Dedicated | VN_0 | INPUT | LVCMOS18* | 0 | | | | NONE | | UNFIXED | | | | NONE | +| H9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| H10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| H11 | gpio_1_tri_io[14] | High Range | IO_L6P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H12 | gpio_1_tri_io[2] | High Range | IO_L1N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H13 | gpio_1_tri_io[18] | High Range | IO_L2N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H14 | gpio_1_tri_io[8] | High Range | IO_L3N_T0_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H15 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | +| J1 | DDR_addr[10] | | PS_DDR_A10_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J2 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| J3 | FIXED_IO_ddr_vrn | | PS_DDR_VRN_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| J4 | | | RSVDVCC2 | Reserved | | | | | | | | | | | | | +| J5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| J6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | +| J7 | | Dedicated | DXP_0 | Temp Sensor | | 0 | | | | | | | | | | | +| J8 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| J9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| J10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| J11 | gpio_1_tri_io[19] | High Range | IO_L6N_T0_VREF_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J12 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| J13 | gpio_1_tri_io[7] | High Range | IO_L5P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J14 | gpio_1_tri_io[1] | High Range | IO_L5N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J15 | gpio_1_tri_io[9] | High Range | IO_L4P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K1 | DDR_addr[14] | | PS_DDR_A14_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K2 | DDR_addr[13] | | PS_DDR_A13_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K3 | DDR_odt | | PS_DDR_ODT_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K4 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| K6 | | Dedicated | PROGRAM_B_0 | Config | | 0 | | | | | | | | | | | +| K7 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K8 | | Dedicated | VCCO_0 | VCCO | | 0 | | | | | 3.30 | | | | | | +| K9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| K10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K11 | gpio_1_tri_io[20] | High Range | IO_L11P_T1_SRCC_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K12 | | High Range | IO_L11N_T1_SRCC_34 | User IO | | 34 | | | | | | | | | | | +| K13 | gpio_1_tri_io[21] | High Range | IO_L10P_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K14 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K15 | gpio_1_tri_io[0] | High Range | IO_L4N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L1 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L2 | DDR_addr[11] | | PS_DDR_A11_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L3 | DDR_cke | | PS_DDR_CKE_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L4 | DDR_reset_n | | PS_DDR_DRST_B_502 | BIDIR | SSTL135 | | | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| L5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | +| L7 | | Dedicated | TDI_0 | Config | | 0 | | | | | | | | | | | +| L8 | | Dedicated | TDO_0 | Config | | 0 | | | | | | | | | | | +| L9 | | Dedicated | TMS_0 | Config | | 0 | | | | | | | | | | | +| L10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| L11 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L12 | gpio_1_tri_io[22] | High Range | IO_L12P_T1_MRCC_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L13 | gpio_1_tri_io[12] | High Range | IO_L10N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L14 | gpio_1_tri_io[5] | High Range | IO_L9P_T1_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L15 | gpio_1_tri_io[6] | High Range | IO_L8P_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M1 | DDR_addr[2] | | PS_DDR_A2_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M2 | DDR_addr[12] | | PS_DDR_A12_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| M4 | DDR_addr[3] | | PS_DDR_A3_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M5 | DDR_addr[7] | | PS_DDR_A7_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M6 | DDR_ba[0] | | PS_DDR_BA0_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M7 | | Dedicated | DONE_0 | Config | | 0 | | | | | | | | | | | +| M8 | | | GND | GND | | | | | | | 0.0 | | | | | | +| M9 | csi_d_lp_n[0] | High Range | IO_L19P_T3_34 | INPUT | HSUL_12 | 34 | | | | NONE | | FIXED | PULLDOWN | | Internal | NONE | +| M10 | csi_d_p[0] | High Range | IO_L21P_T3_DQS_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| M11 | csi_d_n[0] | High Range | IO_L21N_T3_DQS_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| M12 | | High Range | IO_L12N_T1_MRCC_34 | User IO | | 34 | | | | | | | | | | | +| M13 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| M14 | gpio_1_tri_io[16] | High Range | IO_L9N_T1_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M15 | gpio_1_tri_io[10] | High Range | IO_L8N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N1 | DDR_addr[1] | | PS_DDR_A1_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N2 | DDR_ck_n | | PS_DDR_CKN_502 | BIDIR | DIFF_SSTL135 | | | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| N3 | DDR_ck_p | | PS_DDR_CKP_502 | BIDIR | DIFF_SSTL135 | | | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| N4 | DDR_addr[9] | | PS_DDR_A9_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| N6 | DDR_ba[2] | | PS_DDR_BA2_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N7 | PWM_L | High Range | IO_L22P_T3_34 | OUTPUT | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N8 | PWM_R | High Range | IO_L22N_T3_34 | OUTPUT | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N9 | csi_d_lp_p[0] | High Range | IO_L19N_T3_VREF_34 | INPUT | HSUL_12 | 34 | | | | NONE | | FIXED | PULLDOWN | | Internal | NONE | +| N10 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| N11 | csi_c_clk_p | High Range | IO_L13P_T2_MRCC_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| N12 | csi_c_clk_n | High Range | IO_L13N_T2_MRCC_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| N13 | | High Range | IO_L7P_T1_34 | User IO | | 34 | | | | | | | | | | | +| N14 | gpio_1_tri_io[3] | High Range | IO_L7N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N15 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P1 | DDR_addr[0] | | PS_DDR_A0_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P2 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P3 | DDR_addr[4] | | PS_DDR_A4_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P4 | DDR_addr[5] | | PS_DDR_A5_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P5 | DDR_addr[6] | | PS_DDR_A6_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P6 | DDR_addr[8] | | PS_DDR_A8_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P7 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| P8 | hdmi_data_p[0] | High Range | IO_L23P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P9 | hdmi_data_n[0] | High Range | IO_L23N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P10 | hdmi_data_p[1] | High Range | IO_L24P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P11 | hdmi_data_p[2] | High Range | IO_L16P_T2_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P12 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P13 | csi_d_p[1] | High Range | IO_L18P_T2_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| P14 | csi_d_n[1] | High Range | IO_L18N_T2_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| P15 | gpio_1_tri_io[17] | High Range | IO_L15P_T2_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R1 | DDR_ba[1] | | PS_DDR_BA1_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R2 | DDR_cs_n | | PS_DDR_CS_B_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R3 | DDR_we_n | | PS_DDR_WE_B_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| R5 | DDR_cas_n | | PS_DDR_CAS_B_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R6 | DDR_ras_n | | PS_DDR_RAS_B_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R7 | hdmi_clk_p | High Range | IO_L20P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R8 | hdmi_clk_n | High Range | IO_L20N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| R10 | hdmi_data_n[1] | High Range | IO_L24N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R11 | hdmi_data_n[2] | High Range | IO_L16N_T2_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R12 | gpio_1_tri_io[15] | High Range | IO_L17P_T2_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R13 | gpio_1_tri_io[11] | High Range | IO_L17N_T2_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R14 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| R15 | gpio_1_tri_io[4] | High Range | IO_L15N_T2_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | ++------------+-------------------+------------+-------------------------+-------------+--------------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +* Default value +** Special VCCO requirements may apply. Please consult the device family datasheet for specific guideline on VCCO requirements. + + diff --git a/zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_io_report.xdc b/zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_io_report.xdc new file mode 100644 index 0000000..bf8968b --- /dev/null +++ b/zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_io_report.xdc @@ -0,0 +1,589 @@ +set_property PACKAGE_PIN C9 [get_ports FIXED_IO_ps_porb] +set_property PACKAGE_PIN K3 [get_ports DDR_odt] +set_property PACKAGE_PIN C7 [get_ports FIXED_IO_ps_clk] +set_property PACKAGE_PIN G2 [get_ports {DDR_dqs_p[1]}] +set_property PACKAGE_PIN A12 [get_ports {FIXED_IO_mio[30]}] +set_property PACKAGE_PIN A8 [get_ports {FIXED_IO_mio[2]}] +set_property PACKAGE_PIN B12 [get_ports {FIXED_IO_mio[28]}] +set_property PACKAGE_PIN D14 [get_ports {FIXED_IO_mio[27]}] +set_property PACKAGE_PIN A13 [get_ports {FIXED_IO_mio[26]}] +set_property PACKAGE_PIN C14 [get_ports {FIXED_IO_mio[25]}] +set_property PACKAGE_PIN B14 [get_ports {FIXED_IO_mio[24]}] +set_property PACKAGE_PIN A14 [get_ports {FIXED_IO_mio[23]}] +set_property PACKAGE_PIN D15 [get_ports {FIXED_IO_mio[22]}] +set_property PACKAGE_PIN C11 [get_ports {FIXED_IO_mio[21]}] +set_property PACKAGE_PIN E15 [get_ports {FIXED_IO_mio[20]}] +set_property PACKAGE_PIN A5 [get_ports {FIXED_IO_mio[1]}] +set_property PACKAGE_PIN B15 [get_ports {FIXED_IO_mio[18]}] +set_property PACKAGE_PIN D11 [get_ports {FIXED_IO_mio[17]}] +set_property PACKAGE_PIN A15 [get_ports {FIXED_IO_mio[16]}] +set_property PACKAGE_PIN D10 [get_ports {FIXED_IO_mio[15]}] +set_property PACKAGE_PIN B9 [get_ports {FIXED_IO_mio[14]}] +set_property PACKAGE_PIN C6 [get_ports {FIXED_IO_mio[13]}] +set_property PACKAGE_PIN B7 [get_ports {FIXED_IO_mio[12]}] +set_property PACKAGE_PIN B10 [get_ports {FIXED_IO_mio[11]}] +set_property PACKAGE_PIN D6 [get_ports {FIXED_IO_mio[10]}] +set_property PACKAGE_PIN D8 [get_ports {FIXED_IO_mio[0]}] +set_property PACKAGE_PIN B6 [get_ports {FIXED_IO_mio[8]}] +set_property PACKAGE_PIN D9 [get_ports {FIXED_IO_mio[7]}] +set_property PACKAGE_PIN A10 [get_ports {FIXED_IO_mio[6]}] +set_property PACKAGE_PIN A9 [get_ports {FIXED_IO_mio[5]}] +set_property PACKAGE_PIN C8 [get_ports {FIXED_IO_mio[4]}] +set_property PACKAGE_PIN A7 [get_ports {FIXED_IO_mio[3]}] +set_property PACKAGE_PIN C13 [get_ports {FIXED_IO_mio[31]}] +set_property PACKAGE_PIN D13 [get_ports {FIXED_IO_mio[29]}] +set_property PACKAGE_PIN C12 [get_ports {FIXED_IO_mio[19]}] +set_property PACKAGE_PIN H3 [get_ports FIXED_IO_ddr_vrp] +set_property PACKAGE_PIN R6 [get_ports DDR_ras_n] +set_property PACKAGE_PIN L4 [get_ports DDR_reset_n] +set_property PACKAGE_PIN R3 [get_ports DDR_we_n] +set_property PACKAGE_PIN J3 [get_ports FIXED_IO_ddr_vrn] +set_property PACKAGE_PIN B11 [get_ports FIXED_IO_ps_srstb] +set_property PACKAGE_PIN K1 [get_ports {DDR_addr[14]}] +set_property PACKAGE_PIN N1 [get_ports {DDR_addr[1]}] +set_property PACKAGE_PIN M1 [get_ports {DDR_addr[2]}] +set_property PACKAGE_PIN M4 [get_ports {DDR_addr[3]}] +set_property PACKAGE_PIN P3 [get_ports {DDR_addr[4]}] +set_property PACKAGE_PIN P4 [get_ports {DDR_addr[5]}] +set_property PACKAGE_PIN P5 [get_ports {DDR_addr[6]}] +set_property PACKAGE_PIN M5 [get_ports {DDR_addr[7]}] +set_property PACKAGE_PIN P6 [get_ports {DDR_addr[8]}] +set_property PACKAGE_PIN P1 [get_ports {DDR_addr[0]}] +set_property PACKAGE_PIN J1 [get_ports {DDR_addr[10]}] +set_property PACKAGE_PIN L2 [get_ports {DDR_addr[11]}] +set_property PACKAGE_PIN K2 [get_ports {DDR_addr[13]}] +set_property PACKAGE_PIN M2 [get_ports {DDR_addr[12]}] +set_property PACKAGE_PIN N4 [get_ports {DDR_addr[9]}] +set_property PACKAGE_PIN M6 [get_ports {DDR_ba[0]}] +set_property PACKAGE_PIN R1 [get_ports {DDR_ba[1]}] +set_property PACKAGE_PIN N6 [get_ports {DDR_ba[2]}] +set_property PACKAGE_PIN N3 [get_ports DDR_ck_p] +set_property PACKAGE_PIN R5 [get_ports DDR_cas_n] +set_property PACKAGE_PIN N2 [get_ports DDR_ck_n] +set_property PACKAGE_PIN B5 [get_ports {FIXED_IO_mio[9]}] +set_property PACKAGE_PIN L3 [get_ports DDR_cke] +set_property PACKAGE_PIN R2 [get_ports DDR_cs_n] +set_property PACKAGE_PIN B1 [get_ports {DDR_dm[0]}] +set_property PACKAGE_PIN D3 [get_ports {DDR_dm[1]}] +set_property PACKAGE_PIN H2 [get_ports {DDR_dq[15]}] +set_property PACKAGE_PIN A2 [get_ports {DDR_dq[1]}] +set_property PACKAGE_PIN C4 [get_ports {DDR_dq[2]}] +set_property PACKAGE_PIN C1 [get_ports {DDR_dq[3]}] +set_property PACKAGE_PIN B4 [get_ports {DDR_dq[4]}] +set_property PACKAGE_PIN A4 [get_ports {DDR_dq[5]}] +set_property PACKAGE_PIN C3 [get_ports {DDR_dq[6]}] +set_property PACKAGE_PIN A3 [get_ports {DDR_dq[7]}] +set_property PACKAGE_PIN E1 [get_ports {DDR_dq[8]}] +set_property PACKAGE_PIN D4 [get_ports {DDR_dq[0]}] +set_property PACKAGE_PIN E2 [get_ports {DDR_dq[10]}] +set_property PACKAGE_PIN E3 [get_ports {DDR_dq[11]}] +set_property PACKAGE_PIN F3 [get_ports {DDR_dq[12]}] +set_property PACKAGE_PIN G1 [get_ports {DDR_dq[13]}] +set_property PACKAGE_PIN H1 [get_ports {DDR_dq[14]}] +set_property PACKAGE_PIN D1 [get_ports {DDR_dq[9]}] +set_property PACKAGE_PIN B2 [get_ports {DDR_dqs_n[0]}] +set_property PACKAGE_PIN F2 [get_ports {DDR_dqs_n[1]}] +set_property PACKAGE_PIN C2 [get_ports {DDR_dqs_p[0]}] +set_property PACKAGE_PIN N12 [get_ports csi_c_clk_n] +set_property PACKAGE_PIN N11 [get_ports csi_c_clk_p] +set_property PACKAGE_PIN M9 [get_ports {csi_d_lp_n[0]}] +set_property PACKAGE_PIN N9 [get_ports {csi_d_lp_p[0]}] +set_property PACKAGE_PIN M10 [get_ports {csi_d_p[0]}] +set_property PACKAGE_PIN M11 [get_ports {csi_d_n[0]}] +set_property PACKAGE_PIN P14 [get_ports {csi_d_n[1]}] +set_property PACKAGE_PIN P13 [get_ports {csi_d_p[1]}] +set_property INTERNAL_VREF 0.6 [get_iobanks 34] +set_property PACKAGE_PIN R8 [get_ports hdmi_clk_n] +set_property PACKAGE_PIN R7 [get_ports hdmi_clk_p] +set_property PACKAGE_PIN P8 [get_ports {hdmi_data_p[0]}] +set_property PACKAGE_PIN P9 [get_ports {hdmi_data_n[0]}] +set_property PACKAGE_PIN P10 [get_ports {hdmi_data_p[1]}] +set_property PACKAGE_PIN R10 [get_ports {hdmi_data_n[1]}] +set_property PACKAGE_PIN R11 [get_ports {hdmi_data_n[2]}] +set_property PACKAGE_PIN P11 [get_ports {hdmi_data_p[2]}] +set_property PACKAGE_PIN K15 [get_ports {gpio_1_tri_io[0]}] +set_property PACKAGE_PIN J14 [get_ports {gpio_1_tri_io[1]}] +set_property PACKAGE_PIN H12 [get_ports {gpio_1_tri_io[2]}] +set_property PACKAGE_PIN N14 [get_ports {gpio_1_tri_io[3]}] +set_property PACKAGE_PIN R15 [get_ports {gpio_1_tri_io[4]}] +set_property PACKAGE_PIN L14 [get_ports {gpio_1_tri_io[5]}] +set_property PACKAGE_PIN L15 [get_ports {gpio_1_tri_io[6]}] +set_property PACKAGE_PIN J13 [get_ports {gpio_1_tri_io[7]}] +set_property PACKAGE_PIN H14 [get_ports {gpio_1_tri_io[8]}] +set_property PACKAGE_PIN J15 [get_ports {gpio_1_tri_io[9]}] +set_property PACKAGE_PIN M15 [get_ports {gpio_1_tri_io[10]}] +set_property PACKAGE_PIN R13 [get_ports {gpio_1_tri_io[11]}] +set_property PACKAGE_PIN L13 [get_ports {gpio_1_tri_io[12]}] +set_property PACKAGE_PIN G11 [get_ports {gpio_1_tri_io[13]}] +set_property PACKAGE_PIN H11 [get_ports {gpio_1_tri_io[14]}] +set_property PACKAGE_PIN R12 [get_ports {gpio_1_tri_io[15]}] +set_property PACKAGE_PIN M14 [get_ports {gpio_1_tri_io[16]}] +set_property PACKAGE_PIN P15 [get_ports {gpio_1_tri_io[17]}] +set_property PACKAGE_PIN H13 [get_ports {gpio_1_tri_io[18]}] +set_property PACKAGE_PIN J11 [get_ports {gpio_1_tri_io[19]}] +set_property PACKAGE_PIN K11 [get_ports {gpio_1_tri_io[20]}] +set_property PACKAGE_PIN K13 [get_ports {gpio_1_tri_io[21]}] +set_property PACKAGE_PIN L12 [get_ports {gpio_1_tri_io[22]}] +set_property PACKAGE_PIN G12 [get_ports {gpio_1_tri_io[23]}] +set_property PACKAGE_PIN N8 [get_ports PWM_R] +set_property PACKAGE_PIN N7 [get_ports PWM_L] +set_property DIRECTION IN [get_ports {csi_d_lp_p[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_p[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_p[0]}] +set_property DIRECTION IN [get_ports {csi_d_n[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_n[1]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_n[1]}] +set_property DIRECTION IN [get_ports {csi_d_n[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_n[0]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_n[0]}] +set_property DIRECTION IN [get_ports {csi_d_p[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[1]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_p[1]}] +set_property DIRECTION IN [get_ports {csi_d_p[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[0]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_p[0]}] +set_property DIRECTION IN [get_ports {csi_d_lp_n[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_n[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_n[0]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[2]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[2]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[1]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[1]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[0]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[0]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[2]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[2]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[1]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[1]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[0]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[0]}] +set_property DIRECTION OUT [get_ports hdmi_clk_p] +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_p] +set_property DIRECTION OUT [get_ports hdmi_clk_n] +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_n] +set_property DIRECTION IN [get_ports csi_c_clk_p] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_p] +set_property DIFF_TERM FALSE [get_ports csi_c_clk_p] +set_property DIRECTION IN [get_ports csi_c_clk_n] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_n] +set_property DIFF_TERM FALSE [get_ports csi_c_clk_n] +set_property DIRECTION IN [get_ports Vp_Vn_v_p] +set_property DIRECTION IN [get_ports Vp_Vn_v_n] +set_property DIRECTION OUT [get_ports PWM_R] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_R] +set_property DRIVE 12 [get_ports PWM_R] +set_property SLEW SLOW [get_ports PWM_R] +set_property DIRECTION OUT [get_ports PWM_L] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_L] +set_property DRIVE 12 [get_ports PWM_L] +set_property SLEW SLOW [get_ports PWM_L] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[23]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[23]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[23]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[23]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[22]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[22]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[22]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[22]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[21]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[21]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[21]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[21]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[20]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[20]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[20]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[20]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[19]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[19]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[19]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[19]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[18]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[18]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[18]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[18]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[17]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[17]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[17]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[17]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[16]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[16]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[16]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[16]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[15]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[15]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[15]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[15]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[14]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[14]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[14]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[13]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[13]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[13]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[12]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[12]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[12]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[11]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[11]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[11]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[10]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[10]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[10]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[9]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[9]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[9]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[8]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[8]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[8]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[7]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[7]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[7]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[6]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[6]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[6]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[5]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[5]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[5]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[4]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[4]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[4]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[3]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[3]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[3]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[2]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[2]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[2]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[1]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[1]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[1]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[0]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[0]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[0]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[31]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[31]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[31]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[31]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[31]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[30]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[30]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[30]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[30]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[30]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[29]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[29]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[29]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[29]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[29]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[28]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[28]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[28]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[28]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[28]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[27]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[27]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[27]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[27]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[27]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[26]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[26]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[26]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[26]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[26]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[25]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[25]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[25]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[25]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[25]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[24]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[24]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[24]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[24]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[24]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[23]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[23]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[23]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[23]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[23]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[22]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[22]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[22]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[22]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[22]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[21]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[21]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[21]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[21]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[21]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[20]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[20]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[20]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[20]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[20]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[19]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[19]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[19]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[19]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[19]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[18]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[18]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[18]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[18]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[18]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[17]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[17]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[17]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[17]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[17]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[16]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[16]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[16]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[16]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[16]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[15]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[15]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[15]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[15]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[14]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[14]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[14]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[13]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[13]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[13]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[12]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[12]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[12]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[11]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[11]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[11]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[10]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[10]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[10]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[9]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[9]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[9]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[9]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[8]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[8]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[8]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[7]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[7]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[7]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[6]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[6]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[6]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[5]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[5]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[5]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[4]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[4]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[4]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[3]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[3]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[3]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[2]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[2]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[2]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[1]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[1]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[1]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[1]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[0]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[0]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[0]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[0]}] +set_property DIRECTION INOUT [get_ports FIXED_IO_ddr_vrn] +set_property IOSTANDARD SSTL135_T_DCI [get_ports FIXED_IO_ddr_vrn] +set_property SLEW FAST [get_ports FIXED_IO_ddr_vrn] +set_property DIRECTION INOUT [get_ports FIXED_IO_ddr_vrp] +set_property IOSTANDARD SSTL135_T_DCI [get_ports FIXED_IO_ddr_vrp] +set_property SLEW FAST [get_ports FIXED_IO_ddr_vrp] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_clk] +set_property IOSTANDARD LVCMOS33 [get_ports FIXED_IO_ps_clk] +set_property DRIVE 12 [get_ports FIXED_IO_ps_clk] +set_property SLEW FAST [get_ports FIXED_IO_ps_clk] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_porb] +set_property IOSTANDARD LVCMOS33 [get_ports FIXED_IO_ps_porb] +set_property DRIVE 12 [get_ports FIXED_IO_ps_porb] +set_property SLEW FAST [get_ports FIXED_IO_ps_porb] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_srstb] +set_property IOSTANDARD LVCMOS33 [get_ports FIXED_IO_ps_srstb] +set_property DRIVE 12 [get_ports FIXED_IO_ps_srstb] +set_property SLEW FAST [get_ports FIXED_IO_ps_srstb] +set_property DIRECTION INOUT [get_ports {DDR_dqs_p[1]}] +set_property IOSTANDARD DIFF_SSTL135_T_DCI [get_ports {DDR_dqs_p[1]}] +set_property SLEW FAST [get_ports {DDR_dqs_p[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_p[0]}] +set_property IOSTANDARD DIFF_SSTL135_T_DCI [get_ports {DDR_dqs_p[0]}] +set_property SLEW FAST [get_ports {DDR_dqs_p[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_n[1]}] +set_property IOSTANDARD DIFF_SSTL135_T_DCI [get_ports {DDR_dqs_n[1]}] +set_property SLEW FAST [get_ports {DDR_dqs_n[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_n[0]}] +set_property IOSTANDARD DIFF_SSTL135_T_DCI [get_ports {DDR_dqs_n[0]}] +set_property SLEW FAST [get_ports {DDR_dqs_n[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[15]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[15]}] +set_property SLEW FAST [get_ports {DDR_dq[15]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[14]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[14]}] +set_property SLEW FAST [get_ports {DDR_dq[14]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[13]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[13]}] +set_property SLEW FAST [get_ports {DDR_dq[13]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[12]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[12]}] +set_property SLEW FAST [get_ports {DDR_dq[12]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[11]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[11]}] +set_property SLEW FAST [get_ports {DDR_dq[11]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[10]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[10]}] +set_property SLEW FAST [get_ports {DDR_dq[10]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[9]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[9]}] +set_property SLEW FAST [get_ports {DDR_dq[9]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[8]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[8]}] +set_property SLEW FAST [get_ports {DDR_dq[8]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[7]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[7]}] +set_property SLEW FAST [get_ports {DDR_dq[7]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[6]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[6]}] +set_property SLEW FAST [get_ports {DDR_dq[6]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[5]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[5]}] +set_property SLEW FAST [get_ports {DDR_dq[5]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[4]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[4]}] +set_property SLEW FAST [get_ports {DDR_dq[4]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[3]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[3]}] +set_property SLEW FAST [get_ports {DDR_dq[3]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[2]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[2]}] +set_property SLEW FAST [get_ports {DDR_dq[2]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[1]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[1]}] +set_property SLEW FAST [get_ports {DDR_dq[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[0]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[0]}] +set_property SLEW FAST [get_ports {DDR_dq[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dm[1]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dm[1]}] +set_property SLEW FAST [get_ports {DDR_dm[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dm[0]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dm[0]}] +set_property SLEW FAST [get_ports {DDR_dm[0]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[2]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_ba[2]}] +set_property SLEW SLOW [get_ports {DDR_ba[2]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[1]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_ba[1]}] +set_property SLEW SLOW [get_ports {DDR_ba[1]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[0]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_ba[0]}] +set_property SLEW SLOW [get_ports {DDR_ba[0]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[14]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[14]}] +set_property SLEW SLOW [get_ports {DDR_addr[14]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[13]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[13]}] +set_property SLEW SLOW [get_ports {DDR_addr[13]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[12]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[12]}] +set_property SLEW SLOW [get_ports {DDR_addr[12]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[11]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[11]}] +set_property SLEW SLOW [get_ports {DDR_addr[11]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[10]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[10]}] +set_property SLEW SLOW [get_ports {DDR_addr[10]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[9]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[9]}] +set_property SLEW SLOW [get_ports {DDR_addr[9]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[8]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[8]}] +set_property SLEW SLOW [get_ports {DDR_addr[8]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[7]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[7]}] +set_property SLEW SLOW [get_ports {DDR_addr[7]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[6]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[6]}] +set_property SLEW SLOW [get_ports {DDR_addr[6]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[5]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[5]}] +set_property SLEW SLOW [get_ports {DDR_addr[5]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[4]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[4]}] +set_property SLEW SLOW [get_ports {DDR_addr[4]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[3]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[3]}] +set_property SLEW SLOW [get_ports {DDR_addr[3]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[2]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[2]}] +set_property SLEW SLOW [get_ports {DDR_addr[2]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[1]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[1]}] +set_property SLEW SLOW [get_ports {DDR_addr[1]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[0]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[0]}] +set_property SLEW SLOW [get_ports {DDR_addr[0]}] +set_property DIRECTION INOUT [get_ports DDR_cas_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_cas_n] +set_property SLEW SLOW [get_ports DDR_cas_n] +set_property DIRECTION INOUT [get_ports DDR_ck_n] +set_property IOSTANDARD DIFF_SSTL135 [get_ports DDR_ck_n] +set_property SLEW FAST [get_ports DDR_ck_n] +set_property DIRECTION INOUT [get_ports DDR_ck_p] +set_property IOSTANDARD DIFF_SSTL135 [get_ports DDR_ck_p] +set_property SLEW FAST [get_ports DDR_ck_p] +set_property DIRECTION INOUT [get_ports DDR_cke] +set_property IOSTANDARD SSTL135 [get_ports DDR_cke] +set_property SLEW SLOW [get_ports DDR_cke] +set_property DIRECTION INOUT [get_ports DDR_cs_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_cs_n] +set_property SLEW SLOW [get_ports DDR_cs_n] +set_property DIRECTION INOUT [get_ports DDR_odt] +set_property IOSTANDARD SSTL135 [get_ports DDR_odt] +set_property SLEW SLOW [get_ports DDR_odt] +set_property DIRECTION INOUT [get_ports DDR_ras_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_ras_n] +set_property SLEW SLOW [get_ports DDR_ras_n] +set_property DIRECTION INOUT [get_ports DDR_reset_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_reset_n] +set_property SLEW FAST [get_ports DDR_reset_n] +set_property DIRECTION INOUT [get_ports DDR_we_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_we_n] +set_property SLEW SLOW [get_ports DDR_we_n] +#revert back to original instance +current_instance -quiet diff --git a/zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_ip_status_report.txt b/zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_ip_status_report.txt new file mode 100644 index 0000000..d728eff --- /dev/null +++ b/zynqberrydemo1/prebuilt/hardware/te0726_m/reports/zynqberrydemo1_ip_status_report.txt @@ -0,0 +1,152 @@ +Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. +------------------------------------------------------------------------------------ +| Tool Version : Vivado v.2017.1 (win64) Build 1846317 Fri Apr 14 18:55:03 MDT 2017 +| Date : Mon Jun 12 13:57:38 2017 +| Host : W8-64-02 running 64-bit major release (build 9200) +| Command : report_ip_status +------------------------------------------------------------------------------------ + +IP Status Summary + +1. Project IP Status +-------------------- +Your project uses 29 IP. Some of these IP may have undergone changes in this release of the software. Please review the recommended actions. + +More information on the Xilinx versioning policy is available at www.xilinx.com. + +Project IP Instances ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| Instance Name | Status | Recommendation | Change | IP Name | IP | New Version | New | Original Part | +| | | | Log | | Version | | License | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_Video_IO_2_HDMI_TMDS_0_0 | Up-to-date | No changes required | Change | Video IO to HDMI | 1.0 | 1.0 (Rev. 26) | Included | xc7z010clg225-1 | +| | | | Log not | TMDS Interface | (Rev. | | | | +| | | | available | v1.0 | 26) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_i2s_adi_0_0 | Up-to-date | No changes required | Change | AXI I2S Audio | 1.2 | 1.2 (Rev. 1) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_interconnect_0_0 | Up-to-date | No changes required | *(1) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_mem_intercon_0 | Up-to-date | No changes required | *(2) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_reg32_0_0 | Up-to-date | No changes required | Change | AXI Register Bank | 1.0 | 1.0 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | Log not | 16/16 v1.0 | (Rev. | | | | +| | | | available | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_vdma_0_0 | Up-to-date | No changes required | *(3) | AXI Video Direct | 6.3 | 6.3 | Included | xc7z010clg225-1 | +| | | | | Memory Access | | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_vdma_0_1 | Up-to-date | No changes required | *(4) | AXI Video Direct | 6.3 | 6.3 | Included | xc7z010clg225-1 | +| | | | | Memory Access | | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_0_0 | Up-to-date | No changes required | *(5) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_3_0 | Up-to-date | No changes required | *(6) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_4_0 | Up-to-date | No changes required | *(7) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_fb_conv_0_0 | Up-to-date | No changes required | Change | axis_fb_conv_v1.0 | 1.0 | 1.0 (Rev. 5) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 5) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_raw_demosaic_0_0 | Up-to-date | No changes required | Change | RAW Demosaic v1.0 | 1.0 | 1.0 (Rev. 20) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 20) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_raw_unpack_0_0 | Up-to-date | No changes required | Change | RAW10 Unpack v1.0 | 1.0 | 1.0 (Rev. 17) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 17) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_to_i2s_0_0 | Up-to-date | No changes required | Change | AXI4-Stream to I2S | 1.0 | 1.0 (Rev. 4) | Included | xc7z010clg225-1 | +| | | | Log not | v1.0 | (Rev. | | | | +| | | | available | | 4) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_clk_wiz_1_0 | Up-to-date | No changes required | *(8) | Clocking Wizard | 5.4 | 5.4 | Included | xc7z010clg225-1 | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_csi2_d_phy_rx_0_0 | Up-to-date | No changes required | Change | CSI-2 D-PHY RX | 1.0 | 1.0 (Rev. 35) | Included | xc7z010clg225-1 | +| | | | Log not | v1_0 | (Rev. | | | | +| | | | available | | 35) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_csi_to_axis_0_0 | Up-to-date | No changes required | Change | CSI-2 to | 1.0 | 1.0 (Rev. 46) | Included | xc7z010clg225-1 | +| | | | Log not | AXI4-Stream v1.0 | (Rev. | | | | +| | | | available | | 46) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_i2s_to_pwm_0_0 | Up-to-date | No changes required | Change | I2S to PWM v1.0 | 1.0 | 1.0 (Rev. 7) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 7) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_proc_sys_reset_0_0 | Up-to-date | No changes required | *(9) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z010clg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_proc_sys_reset_1_0 | Up-to-date | No changes required | *(10) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z010clg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_processing_system7_0_0 | Up-to-date | No changes required | *(11) | ZYNQ7 Processing | 5.5 | 5.5 (Rev. 5) | Included | xc7z010clg225-1 | +| | | | | System | (Rev. | | | | +| | | | | | 5) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_processing_system7_0_axi_periph_0 | Up-to-date | No changes required | *(12) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_rst_processing_system7_0_50M_0 | Up-to-date | No changes required | *(13) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z010clg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_v_axi4s_vid_out_0_0 | Up-to-date | No changes required | *(14) | AXI4-Stream to | 4.0 | 4.0 (Rev. 6) | Included | xc7z010clg225-1 | +| | | | | Video Out | (Rev. | | | | +| | | | | | 6) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_v_tc_0_0 | Up-to-date | No changes required | *(15) | Video Timing | 6.1 | 6.1 (Rev. 10) | Included | xc7z010clg225-1 | +| | | | | Controller | (Rev. | | | | +| | | | | | 10) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xadc_wiz_0_0 | Up-to-date | No changes required | *(16) | XADC Wizard | 3.3 | 3.3 (Rev. 3) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 3) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlconcat_0_0 | Up-to-date | No changes required | *(17) | Concat | 2.1 | 2.1 (Rev. 1) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlslice_0_0 | Up-to-date | No changes required | Change | Slice | 1.0 | 1.0 (Rev. 1) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlslice_1_0 | Up-to-date | No changes required | Change | Slice | 1.0 | 1.0 (Rev. 1) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +*(1) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(2) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(3) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_vdma_v6_3/doc/axi_vdma_v6_3_changelog.txt +*(4) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_vdma_v6_3/doc/axi_vdma_v6_3_changelog.txt +*(5) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(6) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(7) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(8) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/clk_wiz_v5_4/doc/clk_wiz_v5_4_changelog.txt +*(9) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(10) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(11) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/processing_system7_v5_5/doc/processing_system7_v5_5_changelog.txt +*(12) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(13) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(14) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/v_axi4s_vid_out_v4_0/doc/v_axi4s_vid_out_v4_0_changelog.txt +*(15) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/v_tc_v6_1/doc/v_tc_v6_1_changelog.txt +*(16) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/xadc_wiz_v3_3/doc/xadc_wiz_v3_3_changelog.txt +*(17) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/xlconcat_v2_1/doc/xlconcat_v2_1_changelog.txt + + diff --git a/zynqberrydemo1/prebuilt/os/petalinux/default/u-boot.elf b/zynqberrydemo1/prebuilt/os/petalinux/default/u-boot.elf new file mode 100644 index 0000000000000000000000000000000000000000..875569c83bb43fe8c0d02d0c364021ba06c40433 GIT binary patch literal 2791052 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
    + *        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
    + *
    + * 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:
    + * 
    + *        * 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),
    + * 
    + * + * 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. + * + *****************************************************************************/ +LONG XEmacPs_BdRingAlloc(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd ** BdSetPtr) +{ + LONG Status; + /* Enough free BDs available for the request? */ + if (RingPtr->FreeCnt < NumBd) { + Status = (LONG)(XST_FAILURE); + } else { + /* Set the return argument and move FreeHead forward */ + *BdSetPtr = RingPtr->FreeHead; + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->FreeHead, NumBd); + RingPtr->FreeCnt -= NumBd; + RingPtr->PreCnt += NumBd; + Status = (LONG)(XST_SUCCESS); + } + return Status; +} + +/*****************************************************************************/ +/** + * 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: + * + *
    + *    Status = XEmacPs_BdRingAlloc(MyRingPtr, 10, &BdPtr),
    + *        ...
    + *    if (Error)
    + *    {
    + *        Status = XEmacPs_BdRingUnAlloc(MyRingPtr, 10, &BdPtr),
    + *    }
    + * 
    + * + * A partial UnAlloc means some of the BDs Alloc'd will be returned: + * + *
    + *    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--,
    + *    }
    + * 
    + * + * 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. + * + *****************************************************************************/ +LONG XEmacPs_BdRingUnAlloc(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd * BdSetPtr) +{ + LONG Status; + (void) BdSetPtr; + Xil_AssertNonvoid(RingPtr != NULL); + Xil_AssertNonvoid(BdSetPtr != NULL); + + /* Enough BDs in the free state for the request? */ + if (RingPtr->PreCnt < NumBd) { + Status = (LONG)(XST_FAILURE); + } else { + /* Set the return argument and move FreeHead backward */ + XEMACPS_RING_SEEKBACK(RingPtr, (RingPtr->FreeHead), NumBd); + RingPtr->FreeCnt += NumBd; + RingPtr->PreCnt -= NumBd; + Status = (LONG)(XST_SUCCESS); + } + return Status; +} + + +/*****************************************************************************/ +/** + * 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. + * + *****************************************************************************/ +LONG XEmacPs_BdRingToHw(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd * BdSetPtr) +{ + XEmacPs_Bd *CurBdPtr; + u32 i; + LONG Status; + /* if no bds to process, simply return. */ + if (0U == NumBd){ + Status = (LONG)(XST_SUCCESS); + } else { + /* Make sure we are in sync with XEmacPs_BdRingAlloc() */ + if ((RingPtr->PreCnt < NumBd) || (RingPtr->PreHead != BdSetPtr)) { + Status = (LONG)(XST_DMA_SG_LIST_ERROR); + } else { + CurBdPtr = BdSetPtr; + for (i = 0U; i < NumBd; i++) { + CurBdPtr = (XEmacPs_Bd *)((void *)XEmacPs_BdRingNext(RingPtr, CurBdPtr)); + } + /* Adjust ring pointers & counters */ + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->PreHead, NumBd); + RingPtr->PreCnt -= NumBd; + RingPtr->HwTail = CurBdPtr; + RingPtr->HwCnt += NumBd; + + Status = (LONG)(XST_SUCCESS); + } + } + return Status; +} + + +/*****************************************************************************/ +/** + * 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: + * + *
    + *        NumBd = XEmacPs_BdRingFromHwTx(MyRingPtr, MaxBd, &MyBdSet),
    + *        if (NumBd == 0)
    + *        {
    + *           * hardware has nothing ready for us yet*
    + *        }
    + *
    + *        CurBd = MyBdSet,
    + *        for (i=0; i
    + *
    + * 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:
    + * 
    + *        * 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),
    + * 
    + * + * 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. + * + *****************************************************************************/ +u32 XEmacPs_BdRingFromHwTx(XEmacPs_BdRing * RingPtr, u32 BdLimit, + XEmacPs_Bd ** BdSetPtr) +{ + XEmacPs_Bd *CurBdPtr; + u32 BdStr = 0U; + u32 BdCount; + u32 BdPartialCount; + u32 Sop = 0U; + u32 Status; + u32 BdLimitLoc = BdLimit; + CurBdPtr = RingPtr->HwHead; + BdCount = 0U; + BdPartialCount = 0U; + + /* If no BDs in work group, then there's nothing to search */ + if (RingPtr->HwCnt == 0x00000000U) { + *BdSetPtr = NULL; + Status = 0U; + } else { + + if (BdLimitLoc > RingPtr->HwCnt){ + BdLimitLoc = 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 < BdLimitLoc) { + /* Read the status */ + if(CurBdPtr != NULL){ + BdStr = XEmacPs_BdRead(CurBdPtr, XEMACPS_BD_STAT_OFFSET); + } + + if ((Sop == 0x00000000U) && ((BdStr & XEMACPS_TXBUF_USED_MASK)!=0x00000000U)){ + Sop = 1U; + } + if (Sop == 0x00000001U) { + 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 == 0x00000001U) && ((BdStr & XEMACPS_TXBUF_LAST_MASK)!=0x00000000U)) { + Sop = 0U; + BdPartialCount = 0U; + } + + /* 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 > 0x00000000U) { + *BdSetPtr = RingPtr->HwHead; + RingPtr->HwCnt -= BdCount; + RingPtr->PostCnt += BdCount; + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->HwHead, BdCount); + Status = (BdCount); + } else { + *BdSetPtr = NULL; + Status = 0U; + } + } + return Status; +} + + +/*****************************************************************************/ +/** + * 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: + * + *
    + *        NumBd = XEmacPs_BdRingFromHwRx(MyRingPtr, MaxBd, &MyBdSet),
    + *
    + *        if (NumBd == 0)
    + *        {
    + *           *hardware has nothing ready for us yet*
    + *        }
    + *
    + *        CurBd = MyBdSet,
    + *        for (i=0; i
    + *
    + * 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:
    + * 
    + *        * 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),
    + * 
    + * + * 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. + * + *****************************************************************************/ +u32 XEmacPs_BdRingFromHwRx(XEmacPs_BdRing * RingPtr, u32 BdLimit, + XEmacPs_Bd ** BdSetPtr) +{ + XEmacPs_Bd *CurBdPtr; + u32 BdStr = 0U; + u32 BdCount; + u32 BdPartialCount; + u32 Status; + + CurBdPtr = RingPtr->HwHead; + BdCount = 0U; + BdPartialCount = 0U; + + /* If no BDs in work group, then there's nothing to search */ + if (RingPtr->HwCnt == 0x00000000U) { + *BdSetPtr = NULL; + Status = 0U; + } else { + + /* 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 */ + if(CurBdPtr!=NULL){ + BdStr = XEmacPs_BdRead(CurBdPtr, XEMACPS_BD_STAT_OFFSET); + } + if ((!(XEmacPs_BdIsRxNew(CurBdPtr)))==TRUE) { + 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)!=0x00000000U) { + BdPartialCount = 0U; + } 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 > 0x00000000U) { + *BdSetPtr = RingPtr->HwHead; + RingPtr->HwCnt -= BdCount; + RingPtr->PostCnt += BdCount; + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->HwHead, BdCount); + Status = (BdCount); + } + else { + *BdSetPtr = NULL; + Status = 0U; + } +} + return Status; +} + + +/*****************************************************************************/ +/** + * 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. + * + *****************************************************************************/ +LONG XEmacPs_BdRingFree(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd * BdSetPtr) +{ + LONG Status; + /* if no bds to process, simply return. */ + if (0x00000000U == NumBd){ + Status = (LONG)(XST_SUCCESS); + } else { + /* Make sure we are in sync with XEmacPs_BdRingFromHw() */ + if ((RingPtr->PostCnt < NumBd) || (RingPtr->PostHead != BdSetPtr)) { + Status = (LONG)(XST_DMA_SG_LIST_ERROR); + } else { + /* Update pointers and counters */ + RingPtr->FreeCnt += NumBd; + RingPtr->PostCnt -= NumBd; + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->PostHead, NumBd); + Status = (LONG)(XST_SUCCESS); + } + } + return Status; +} + + +/*****************************************************************************/ +/** + * 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. + * + *****************************************************************************/ +LONG XEmacPs_BdRingCheck(XEmacPs_BdRing * RingPtr, u8 Direction) +{ + UINTPTR AddrV, AddrP; + u32 i; + + if ((Direction != (u8)XEMACPS_SEND) && (Direction != (u8)XEMACPS_RECV)) { + return (LONG)(XST_INVALID_PARAM); + } + + /* Is the list created */ + if (RingPtr->AllCnt == 0x00000000U) { + return (LONG)(XST_DMA_SG_NO_LIST); + } + + /* Can't check if channel is running */ + if (RingPtr->RunState == (u32)XST_DMA_SG_IS_STARTED) { + return (LONG)(XST_IS_STARTED); + } + + /* RunState doesn't make sense */ + if (RingPtr->RunState != (u32)XST_DMA_SG_IS_STOPPED) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + + /* Verify internal pointers point to correct memory space */ + AddrV = (UINTPTR) RingPtr->FreeHead; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + + AddrV = (UINTPTR) RingPtr->PreHead; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + + AddrV = (UINTPTR) RingPtr->HwHead; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + + AddrV = (UINTPTR) RingPtr->HwTail; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + + AddrV = (UINTPTR) RingPtr->PostHead; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + + /* Verify internal counters add up */ + if ((RingPtr->HwCnt + RingPtr->PreCnt + RingPtr->FreeCnt + + RingPtr->PostCnt) != RingPtr->AllCnt) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + + /* Verify BDs are linked correctly */ + AddrV = RingPtr->BaseBdAddr; + AddrP = RingPtr->PhysBaseAddr + RingPtr->Separation; + + for (i = 1U; 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 (LONG)(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))==TRUE) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + } + else { /* XEMACPS_RECV */ + if ((!XEmacPs_BdIsRxWrap(AddrV))==TRUE) { + return (LONG)(XST_DMA_SG_LIST_ERROR); + } + } + + /* No problems found */ + return (LONG)(XST_SUCCESS); +} + +/*****************************************************************************/ +/** + * 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) + * + *****************************************************************************/ +static void XEmacPs_BdSetRxWrap(UINTPTR BdPtr) +{ + u32 DataValueRx; + u32 *TempPtr; + + BdPtr += (u32)(XEMACPS_BD_ADDR_OFFSET); + TempPtr = (u32 *)BdPtr; + if(TempPtr != NULL) { + DataValueRx = *TempPtr; + DataValueRx |= XEMACPS_RXBUF_WRAP_MASK; + *TempPtr = DataValueRx; + } +} + +/*****************************************************************************/ +/** + * 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) + * + *****************************************************************************/ +static void XEmacPs_BdSetTxWrap(UINTPTR BdPtr) +{ + u32 DataValueTx; + u32 *TempPtr; + + BdPtr += (u32)(XEMACPS_BD_STAT_OFFSET); + TempPtr = (u32 *)BdPtr; + if(TempPtr != NULL) { + DataValueTx = *TempPtr; + DataValueTx |= XEMACPS_TXBUF_WRAP_MASK; + *TempPtr = DataValueTx; + } +} + +/*****************************************************************************/ +/** + * Reset BD ring head and tail pointers. + * + * @param RingPtr is the instance to be worked on. + * @param VirtAddr is the virtual base address of the user memory region. + * + * @note + * Should be called after XEmacPs_Stop() + * + * @note + * C-style signature: + * void XEmacPs_BdRingPtrReset(XEmacPs_BdRing * RingPtr, void *virtaddrloc) + * + *****************************************************************************/ +void XEmacPs_BdRingPtrReset(XEmacPs_BdRing * RingPtr, void *virtaddrloc) +{ + RingPtr->FreeHead = virtaddrloc; + RingPtr->PreHead = virtaddrloc; + RingPtr->HwHead = virtaddrloc; + RingPtr->HwTail = virtaddrloc; + RingPtr->PostHead = virtaddrloc; +} + +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bdring.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bdring.h new file mode 100644 index 0000000..b89e898 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_bdring.h @@ -0,0 +1,241 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_bdring.h +* @addtogroup emacps_v3_7 +* @{ +* +* The Xiline EmacPs Buffer Descriptor ring driver. This is part of EmacPs +* DMA functionalities. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a wsy  01/10/10 First release
    +* 2.1   srt  07/15/14 Add support for Zynq Ultrascale Mp architecture.
    +* 3.0   kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.6   rb   09/08/17 HwCnt variable (in XEmacPs_BdRing structure) is
    +*		      changed to volatile.
    +*
    +* 
    +* +******************************************************************************/ + +#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 { + UINTPTR PhysBaseAddr;/**< Physical address of 1st BD in list */ + UINTPTR BaseBdAddr; /**< Virtual address of 1st BD in list */ + UINTPTR 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 */ + + volatile u32 HwCnt; /**< Number of BDs in work group */ + u32 PreCnt; /**< Number of BDs in pre-work group */ + u32 FreeCnt; /**< Number of allocatable BDs in the free group */ + u32 PostCnt; /**< Number of BDs in post-work group */ + u32 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))) + +/*****************************************************************************/ +/** +* 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) * (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) \ + (((UINTPTR)((void *)(BdPtr)) >= (RingPtr)->HighBdAddr) ? \ + (XEmacPs_Bd*)((void*)(RingPtr)->BaseBdAddr) : \ + (XEmacPs_Bd*)((UINTPTR)((void *)(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) \ + (((UINTPTR)(BdPtr) <= (RingPtr)->BaseBdAddr) ? \ + (XEmacPs_Bd*)(RingPtr)->HighBdAddr : \ + (XEmacPs_Bd*)((UINTPTR)(BdPtr) - (RingPtr)->Separation)) + +/************************** Function Prototypes ******************************/ + +/* + * Scatter gather DMA related functions in xemacps_bdring.c + */ +LONG XEmacPs_BdRingCreate(XEmacPs_BdRing * RingPtr, UINTPTR PhysAddr, + UINTPTR VirtAddr, u32 Alignment, u32 BdCount); +LONG XEmacPs_BdRingClone(XEmacPs_BdRing * RingPtr, XEmacPs_Bd * SrcBdPtr, + u8 Direction); +LONG XEmacPs_BdRingAlloc(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd ** BdSetPtr); +LONG XEmacPs_BdRingUnAlloc(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd * BdSetPtr); +LONG XEmacPs_BdRingToHw(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd * BdSetPtr); +LONG XEmacPs_BdRingFree(XEmacPs_BdRing * RingPtr, u32 NumBd, + XEmacPs_Bd * BdSetPtr); +u32 XEmacPs_BdRingFromHwTx(XEmacPs_BdRing * RingPtr, u32 BdLimit, + XEmacPs_Bd ** BdSetPtr); +u32 XEmacPs_BdRingFromHwRx(XEmacPs_BdRing * RingPtr, u32 BdLimit, + XEmacPs_Bd ** BdSetPtr); +LONG XEmacPs_BdRingCheck(XEmacPs_BdRing * RingPtr, u8 Direction); + +void XEmacPs_BdRingPtrReset(XEmacPs_BdRing * RingPtr, void *virtaddrloc); + +#ifdef __cplusplus +} +#endif + + +#endif /* end of protection macros */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_control.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_control.c new file mode 100644 index 0000000..8217a45 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_control.c @@ -0,0 +1,1174 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xemacps_control.c +* @addtogroup emacps_v3_7 +* @{ + * + * Functions in this file implement general purpose command and control related + * functionality. See xemacps.h for a detailed description of the driver. + * + *
    + * 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.
    + * 2.1   srt  07/15/14 Add support for Zynq Ultrascale Mp architecture.
    + * 3.0   kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    + * 3.0   hk   02/20/15 Added support for jumbo frames.
    + * 3.2   hk   02/22/16 Added SGMII support for Zynq Ultrascale+ MPSoC.
    + * 
    + *****************************************************************************/ + +/***************************** 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 + * + *****************************************************************************/ +LONG XEmacPs_SetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index) +{ + u32 MacAddr; + u8 *Aptr = (u8 *)(void *)AddressPtr; + u8 IndexLoc = Index; + LONG Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(Aptr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((IndexLoc <= (u8)XEMACPS_MAX_MAC_ADDR) && (IndexLoc > 0x00U)); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == (u32)XIL_COMPONENT_IS_STARTED) { + Status = (LONG)(XST_DEVICE_IS_STARTED); + } + else{ + /* Index ranges 1 to 4, for offset calculation is 0 to 3. */ + IndexLoc--; + + /* Set the MAC bits [31:0] in BOT */ + MacAddr = *(Aptr); + MacAddr |= ((u32)(*(Aptr+1)) << 8U); + MacAddr |= ((u32)(*(Aptr+2)) << 16U); + MacAddr |= ((u32)(*(Aptr+3)) << 24U); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + ((u32)XEMACPS_LADDR1L_OFFSET + ((u32)IndexLoc * (u32)8)), MacAddr); + + /* There are reserved bits in TOP so don't affect them */ + MacAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + ((u32)XEMACPS_LADDR1H_OFFSET + ((u32)IndexLoc * (u32)8))); + + MacAddr &= (u32)(~XEMACPS_LADDR_MACH_MASK); + + /* Set MAC bits [47:32] in TOP */ + MacAddr |= (u32)(*(Aptr+4)); + MacAddr |= (u32)(*(Aptr+5)) << 8U; + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + ((u32)XEMACPS_LADDR1H_OFFSET + ((u32)IndexLoc * (u32)8)), MacAddr); + + Status = (LONG)(XST_SUCCESS); + } + return Status; +} + + +/*****************************************************************************/ +/** + * 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 *)(void *)AddressPtr; + u8 IndexLoc = Index; + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(Aptr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertVoid((IndexLoc <= (u8)XEMACPS_MAX_MAC_ADDR) && (IndexLoc > 0x00U)); + + /* Index ranges 1 to 4, for offset calculation is 0 to 3. */ + IndexLoc--; + + MacAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + ((u32)XEMACPS_LADDR1L_OFFSET + ((u32)IndexLoc * (u32)8))); + *Aptr = (u8) MacAddr; + *(Aptr+1) = (u8) (MacAddr >> 8U); + *(Aptr+2) = (u8) (MacAddr >> 16U); + *(Aptr+3) = (u8) (MacAddr >> 24U); + + /* Read MAC bits [47:32] in TOP */ + MacAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + ((u32)XEMACPS_LADDR1H_OFFSET + ((u32)IndexLoc * (u32)8))); + *(Aptr+4) = (u8) MacAddr; + *(Aptr+5) = (u8) (MacAddr >> 8U); +} + + +/*****************************************************************************/ +/** + * 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. + * + *
    + * 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]
    + * 
    + * + * 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. + *****************************************************************************/ +LONG XEmacPs_SetHash(XEmacPs *InstancePtr, void *AddressPtr) +{ + u32 HashAddr; + u8 *Aptr = (u8 *)(void *)AddressPtr; + u8 Temp1, Temp2, Temp3, Temp4, Temp5, Temp6, Temp7, Temp8; + u32 Result; + LONG Status; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(AddressPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == (u32)XIL_COMPONENT_IS_STARTED) { + Status = (LONG)(XST_DEVICE_IS_STARTED); + } else { + Temp1 = (*(Aptr+0)) & 0x3FU; + Temp2 = ((*(Aptr+0) >> 6U) & 0x03U) | ((*(Aptr+1) & 0x0FU) << 2U); + + Temp3 = ((*(Aptr+1) >> 4U) & 0x0FU) | ((*(Aptr+2) & 0x3U) << 4U); + Temp4 = ((*(Aptr+2) >> 2U) & 0x3FU); + Temp5 = (*(Aptr+3)) & 0x3FU; + Temp6 = ((*(Aptr+3) >> 6U) & 0x03U) | ((*(Aptr+4) & 0x0FU) << 2U); + Temp7 = ((*(Aptr+4) >> 4U) & 0x0FU) | ((*(Aptr+5) & 0x03U) << 4U); + Temp8 = ((*(Aptr+5) >> 2U) & 0x3FU); + + Result = (u32)((u32)Temp1 ^ (u32)Temp2 ^ (u32)Temp3 ^ (u32)Temp4 ^ + (u32)Temp5 ^ (u32)Temp6 ^ (u32)Temp7 ^ (u32)Temp8); + + if (Result >= (u32)XEMACPS_MAX_HASH_BITS) { + Status = (LONG)(XST_INVALID_PARAM); + } else { + + if (Result < (u32)32) { + HashAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET); + HashAddr |= (u32)(0x00000001U << Result); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET, HashAddr); + } else { + HashAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET); + HashAddr |= (u32)(0x00000001U << (u32)(Result - (u32)32)); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET, HashAddr); + } + Status = (LONG)(XST_SUCCESS); + } + } + return Status; +} + +/*****************************************************************************/ +/** + * 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. + *****************************************************************************/ +LONG XEmacPs_DeleteHash(XEmacPs *InstancePtr, void *AddressPtr) +{ + u32 HashAddr; + u8 *Aptr = (u8 *)(void *)AddressPtr; + u8 Temp1, Temp2, Temp3, Temp4, Temp5, Temp6, Temp7, Temp8; + u32 Result; + LONG Status; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(Aptr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == (u32)XIL_COMPONENT_IS_STARTED) { + Status = (LONG)(XST_DEVICE_IS_STARTED); + } else { + Temp1 = (*(Aptr+0)) & 0x3FU; + Temp2 = ((*(Aptr+0) >> 6U) & 0x03U) | ((*(Aptr+1) & 0x0FU) << 2U); + Temp3 = ((*(Aptr+1) >> 4U) & 0x0FU) | ((*(Aptr+2) & 0x03U) << 4U); + Temp4 = ((*(Aptr+2) >> 2U) & 0x3FU); + Temp5 = (*(Aptr+3)) & 0x3FU; + Temp6 = ((*(Aptr+3) >> 6U) & 0x03U) | ((*(Aptr+4) & 0x0FU) << 2U); + Temp7 = ((*(Aptr+4) >> 4U) & 0x0FU) | ((*(Aptr+5) & 0x03U) << 4U); + Temp8 = ((*(Aptr+5) >> 2U) & 0x3FU); + + Result = (u32)((u32)Temp1 ^ (u32)Temp2 ^ (u32)Temp3 ^ (u32)Temp4 ^ + (u32)Temp5 ^ (u32)Temp6 ^ (u32)Temp7 ^ (u32)Temp8); + + if (Result >= (u32)(XEMACPS_MAX_HASH_BITS)) { + Status = (LONG)(XST_INVALID_PARAM); + } else { + if (Result < (u32)32) { + HashAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET); + HashAddr &= (u32)(~(0x00000001U << Result)); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET, HashAddr); + } else { + HashAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET); + HashAddr &= (u32)(~(0x00000001U << (u32)(Result - (u32)32))); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET, HashAddr); + } + Status = (LONG)(XST_SUCCESS); + } + } + return Status; +} +/*****************************************************************************/ +/** + * 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 == (u32)XIL_COMPONENT_IS_READY); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET, 0x0U); + + /* write bits [63:32] in TOP */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET, 0x0U); +} + + +/*****************************************************************************/ +/** + * 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 *)(void *)AddressPtr; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(AddressPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)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 + * + *****************************************************************************/ +LONG XEmacPs_SetTypeIdCheck(XEmacPs *InstancePtr, u32 Id_Check, u8 Index) +{ + u8 IndexLoc = Index; + LONG Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((IndexLoc <= (u8)XEMACPS_MAX_TYPE_ID) && (IndexLoc > 0x00U)); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == (u32)XIL_COMPONENT_IS_STARTED) { + Status = (LONG)(XST_DEVICE_IS_STARTED); + } else { + + /* Index ranges 1 to 4, for offset calculation is 0 to 3. */ + IndexLoc--; + + /* Set the ID bits in MATCHx register */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + ((u32)XEMACPS_MATCH1_OFFSET + ((u32)IndexLoc * (u32)4)), Id_Check); + + Status = (LONG)(XST_SUCCESS); + } + return Status; +} + +/*****************************************************************************/ +/** + * 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. + * + *****************************************************************************/ +LONG 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 */ + LONG Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == (u32)XIL_COMPONENT_IS_STARTED) { + Status = (LONG)(XST_DEVICE_IS_STARTED); + } else { + + /* 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) != 0x00000000U) { + RegNewNetCfg |= (XEMACPS_NWCFG_1536RXEN_MASK); + } + + /* Turn on VLAN packet only, only VLAN tagged will be accepted */ + if ((Options & XEMACPS_VLAN_OPTION) != 0x00000000U) { + RegNewNetCfg |= XEMACPS_NWCFG_NVLANDISC_MASK; + } + + /* Turn on FCS stripping on receive packets */ + if ((Options & XEMACPS_FCS_STRIP_OPTION) != 0x00000000U) { + RegNewNetCfg |= XEMACPS_NWCFG_FCSREM_MASK; + } + + /* Turn on length/type field checking on receive packets */ + if ((Options & XEMACPS_LENTYPE_ERR_OPTION) != 0x00000000U) { + RegNewNetCfg |= XEMACPS_NWCFG_LENERRDSCRD_MASK; + } + + /* Turn on flow control */ + if ((Options & XEMACPS_FLOW_CONTROL_OPTION) != 0x00000000U) { + RegNewNetCfg |= XEMACPS_NWCFG_PAUSEEN_MASK; + } + + /* Turn on promiscuous frame filtering (all frames are received) */ + if ((Options & XEMACPS_PROMISC_OPTION) != 0x00000000U) { + RegNewNetCfg |= XEMACPS_NWCFG_COPYALLEN_MASK; + } + + /* Allow broadcast address reception */ + if ((Options & XEMACPS_BROADCAST_OPTION) != 0x00000000U) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_BCASTDI_MASK); + } + + /* Allow multicast address filtering */ + if ((Options & XEMACPS_MULTICAST_OPTION) != 0x00000000U) { + RegNewNetCfg |= XEMACPS_NWCFG_MCASTHASHEN_MASK; + } + + /* enable RX checksum offload */ + if ((Options & XEMACPS_RX_CHKSUM_ENABLE_OPTION) != 0x00000000U) { + RegNewNetCfg |= XEMACPS_NWCFG_RXCHKSUMEN_MASK; + } + + /* Enable jumbo frames */ + if (((Options & XEMACPS_JUMBO_ENABLE_OPTION) != 0x00000000U) && + (InstancePtr->Version > 2)) { + RegNewNetCfg |= XEMACPS_NWCFG_JUMBO_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_JUMBOMAXLEN_OFFSET, XEMACPS_RX_BUF_SIZE_JUMBO); + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET); + Reg &= ~XEMACPS_DMACR_RXBUF_MASK; + Reg |= (((((u32)XEMACPS_RX_BUF_SIZE_JUMBO / (u32)XEMACPS_RX_BUF_UNIT) + + (((((u32)XEMACPS_RX_BUF_SIZE_JUMBO % + (u32)XEMACPS_RX_BUF_UNIT))!=(u32)0) ? 1U : 0U)) << + (u32)(XEMACPS_DMACR_RXBUF_SHIFT)) & + (u32)(XEMACPS_DMACR_RXBUF_MASK)); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET, Reg); + InstancePtr->MaxMtuSize = XEMACPS_MTU_JUMBO; + InstancePtr->MaxFrameSize = XEMACPS_MTU_JUMBO + + XEMACPS_HDR_SIZE + XEMACPS_TRL_SIZE; + InstancePtr->MaxVlanFrameSize = InstancePtr->MaxFrameSize + + XEMACPS_HDR_VLAN_SIZE; + InstancePtr->RxBufMask = XEMACPS_RXBUF_LEN_JUMBO_MASK; + } + + if (((Options & XEMACPS_SGMII_ENABLE_OPTION) != 0x00000000U) && + (InstancePtr->Version > 2)) { + RegNewNetCfg |= (XEMACPS_NWCFG_SGMIIEN_MASK | + XEMACPS_NWCFG_PCSSEL_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) != 0x00000000U) { + 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) != 0x00000000U) { + 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) != 0x00000000U) { + 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; + + Status = (LONG)(XST_SUCCESS); + } + return Status; +} + + +/*****************************************************************************/ +/** + * 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. + * + *****************************************************************************/ +LONG 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 */ + LONG Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == (u32)XIL_COMPONENT_IS_STARTED) { + Status = (LONG)(XST_DEVICE_IS_STARTED); + } else { + + /* 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) != 0x00000000U) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_1536RXEN_MASK); + } + + /* Turn off VLAN packet only */ + if ((Options & XEMACPS_VLAN_OPTION) != 0x00000000U) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_NVLANDISC_MASK); + } + + /* Turn off FCS stripping on receive packets */ + if ((Options & XEMACPS_FCS_STRIP_OPTION) != 0x00000000U) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_FCSREM_MASK); + } + + /* Turn off length/type field checking on receive packets */ + if ((Options & XEMACPS_LENTYPE_ERR_OPTION) != 0x00000000U) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_LENERRDSCRD_MASK); + } + + /* Turn off flow control */ + if ((Options & XEMACPS_FLOW_CONTROL_OPTION) != 0x00000000U) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_PAUSEEN_MASK); + } + + /* Turn off promiscuous frame filtering (all frames are received) */ + if ((Options & XEMACPS_PROMISC_OPTION) != 0x00000000U) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_COPYALLEN_MASK); + } + + /* Disallow broadcast address filtering => broadcast reception */ + if ((Options & XEMACPS_BROADCAST_OPTION) != 0x00000000U) { + RegNewNetCfg |= XEMACPS_NWCFG_BCASTDI_MASK; + } + + /* Disallow multicast address filtering */ + if ((Options & XEMACPS_MULTICAST_OPTION) != 0x00000000U) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_MCASTHASHEN_MASK); + } + + /* Disable RX checksum offload */ + if ((Options & XEMACPS_RX_CHKSUM_ENABLE_OPTION) != 0x00000000U) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_RXCHKSUMEN_MASK); + } + + /* Disable jumbo frames */ + if (((Options & XEMACPS_JUMBO_ENABLE_OPTION) != 0x00000000U) && + (InstancePtr->Version > 2)) { + RegNewNetCfg &= (u32)(~XEMACPS_NWCFG_JUMBO_MASK); + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET); + Reg &= ~XEMACPS_DMACR_RXBUF_MASK; + Reg |= (((((u32)XEMACPS_RX_BUF_SIZE / (u32)XEMACPS_RX_BUF_UNIT) + + (((((u32)XEMACPS_RX_BUF_SIZE % + (u32)XEMACPS_RX_BUF_UNIT))!=(u32)0) ? 1U : 0U)) << + (u32)(XEMACPS_DMACR_RXBUF_SHIFT)) & + (u32)(XEMACPS_DMACR_RXBUF_MASK)); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET, Reg); + InstancePtr->MaxMtuSize = XEMACPS_MTU; + InstancePtr->MaxFrameSize = XEMACPS_MTU + + XEMACPS_HDR_SIZE + XEMACPS_TRL_SIZE; + InstancePtr->MaxVlanFrameSize = InstancePtr->MaxFrameSize + + XEMACPS_HDR_VLAN_SIZE; + InstancePtr->RxBufMask = XEMACPS_RXBUF_LEN_MASK; + } + + if (((Options & XEMACPS_SGMII_ENABLE_OPTION) != 0x00000000U) && + (InstancePtr->Version > 2)) { + RegNewNetCfg &= (u32)(~(XEMACPS_NWCFG_SGMIIEN_MASK | + XEMACPS_NWCFG_PCSSEL_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) != 0x00000000U) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET); + Reg &= (u32)(~XEMACPS_DMACR_TCPCKSUM_MASK); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET, Reg); + } + + /* Disable transmitter */ + if ((Options & XEMACPS_TRANSMITTER_ENABLE_OPTION) != 0x00000000U) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg &= (u32)(~XEMACPS_NWCTRL_TXEN_MASK); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, Reg); + } + + /* Disable receiver */ + if ((Options & XEMACPS_RECEIVER_ENABLE_OPTION) != 0x00000000U) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg &= (u32)(~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; + + Status = (LONG)(XST_SUCCESS); + } + return Status; +} + + +/*****************************************************************************/ +/** + * 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 == (u32)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. + * + *****************************************************************************/ +LONG XEmacPs_SendPausePacket(XEmacPs *InstancePtr) +{ + u32 Reg; + LONG Status; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + /* Make sure device is ready for this operation */ + if (InstancePtr->IsStarted != (u32)XIL_COMPONENT_IS_STARTED) { + Status = (LONG)(XST_DEVICE_IS_STOPPED); + } else { + /* 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); + Status = (LONG)(XST_SUCCESS); + } + return Status; +} + +/*****************************************************************************/ +/** + * 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; + u16 Status; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET); + + if ((Reg & XEMACPS_NWCFG_1000_MASK) != 0x00000000U) { + Status = (u16)(1000); + } else { + if ((Reg & XEMACPS_NWCFG_100_MASK) != 0x00000000U) { + Status = (u16)(100); + } else { + Status = (u16)(10); + } + } + return Status; +} + + +/*****************************************************************************/ +/** + * 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; + u16 Status; + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertVoid((Speed == (u16)10) || (Speed == (u16)100) || (Speed == (u16)1000)); + + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET); + Reg &= (u32)(~(XEMACPS_NWCFG_1000_MASK | XEMACPS_NWCFG_100_MASK)); + + switch (Speed) { + case (u16)10: + Status = 0U; + break; + + case (u16)100: + Status = 0U; + Reg |= XEMACPS_NWCFG_100_MASK; + break; + + case (u16)1000: + Status = 0U; + Reg |= XEMACPS_NWCFG_1000_MASK; + break; + + default: + Status = 1U; + break; + } + if(Status == (u16)1){ + return; + } + + /* Set register and return */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET, Reg); +} + + +/*****************************************************************************/ +/** + * Set the MDIO clock divisor. + * + * Calculating the divisor: + * + *
    + *              f[HOSTCLK]
    + *   f[MDC] = -----------------
    + *            (1 + Divisor) * 2
    + * 
    + * + * 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, + * + *
    + * 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)
    + * 
    + * + * @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 == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Divisor <= (XEmacPs_MdcDiv)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 &= (u32)(~XEMACPS_NWCFG_MDCCLKDIV_MASK); + + Reg |= ((u32)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. +* +******************************************************************************/ +LONG XEmacPs_PhyRead(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 *PhyDataPtr) +{ + u32 Mgtcr; + volatile u32 Ipisr; + u32 IpReadTemp; + LONG Status; + + 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))==TRUE) { + Status = (LONG)(XST_EMAC_MII_BUSY); + } else { + + /* Construct Mgtcr mask for the operation */ + Mgtcr = XEMACPS_PHYMNTNC_OP_MASK | XEMACPS_PHYMNTNC_OP_R_MASK | + (PhyAddress << XEMACPS_PHYMNTNC_PHAD_SHFT_MSK) | + (RegisterNum << XEMACPS_PHYMNTNC_PREG_SHFT_MSK); + + /* 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); + IpReadTemp = Ipisr; + } while ((IpReadTemp & XEMACPS_NWSR_MDIOIDLE_MASK) == 0x00000000U); + + /* Read data */ + *PhyDataPtr = (u16)XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_PHYMNTNC_OFFSET); + Status = (LONG)(XST_SUCCESS); + } + return Status; +} + + +/*****************************************************************************/ +/** +* 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. +* +******************************************************************************/ +LONG XEmacPs_PhyWrite(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 PhyData) +{ + u32 Mgtcr; + volatile u32 Ipisr; + u32 IpWriteTemp; + LONG Status; + + 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))==TRUE) { + Status = (LONG)(XST_EMAC_MII_BUSY); + } else { + /* Construct Mgtcr mask for the operation */ + Mgtcr = XEMACPS_PHYMNTNC_OP_MASK | XEMACPS_PHYMNTNC_OP_W_MASK | + (PhyAddress << XEMACPS_PHYMNTNC_PHAD_SHFT_MSK) | + (RegisterNum << XEMACPS_PHYMNTNC_PREG_SHFT_MSK) | (u32)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); + IpWriteTemp = Ipisr; + } while ((IpWriteTemp & XEMACPS_NWSR_MDIOIDLE_MASK) == 0x00000000U); + + Status = (LONG)(XST_SUCCESS); + } + return Status; +} + +/*****************************************************************************/ +/** +* 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, s32 BLength) +{ + u32 Reg; + u32 RegUpdateVal; + + 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: + RegUpdateVal = 0x00000000U; + break; + } + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET); + + Reg &= (u32)(~XEMACPS_DMACR_BLENGTH_MASK); + Reg |= RegUpdateVal; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_DMACR_OFFSET, + Reg); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_g.c new file mode 100644 index 0000000..2554f27 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_g.c @@ -0,0 +1,56 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xemacps.h" + +/* +* The configuration table for devices +*/ + +XEmacPs_Config XEmacPs_ConfigTable[XPAR_XEMACPS_NUM_INSTANCES] = +{ + { + XPAR_PS7_ETHERNET_0_DEVICE_ID, + XPAR_PS7_ETHERNET_0_BASEADDR, + XPAR_PS7_ETHERNET_0_IS_CACHE_COHERENT + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_hw.c new file mode 100644 index 0000000..00e79a5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_hw.c @@ -0,0 +1,123 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_hw.c +* @addtogroup emacps_v3_7 +* @{ +* +* This file contains the implementation of the ethernet interface reset sequence +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.05a kpc  28/06/13 First release
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xemacps_hw.h" +#include "xparameters.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; + + /* Disable the interrupts */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_IDR_OFFSET,0x0U); + + /* Stop transmission,disable loopback and Stop tx and Rx engines */ + RegVal = XEmacPs_ReadReg(BaseAddr,XEMACPS_NWCTRL_OFFSET); + RegVal &= ~((u32)XEMACPS_NWCTRL_TXEN_MASK| + (u32)XEMACPS_NWCTRL_RXEN_MASK| + (u32)XEMACPS_NWCTRL_HALTTX_MASK| + (u32)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| + (u32)XEMACPS_TXSR_TXCOMPL_MASK| + (u32)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,0x0U); + /* Clear the rx base address */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_RXQBASE_OFFSET,0x0U); + /* 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,0x0U); + XEmacPs_WriteReg(BaseAddr,XEMACPS_HASHH_OFFSET,0x0U); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_hw.h new file mode 100644 index 0000000..e535470 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_hw.h @@ -0,0 +1,656 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_hw.h +* @addtogroup emacps_v3_7 +* @{ +* +* 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 +* +*
    +* 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
    +* 1.06a asa  11/02/13 Changed the value for XEMACPS_RXBUF_LEN_MASK from 0x3fff
    +*					  to 0x1fff. This fixes the CR#744902.
    +* 2.1   srt  07/15/14 Add support for Zynq Ultrascale Mp GEM specification.
    +* 3.0   kvn  12/16/14 Changed name of XEMACPS_NWCFG_LENGTHERRDSCRD_MASK to
    +*					  XEMACPS_NWCFG_LENERRDSCRD_MASK as it exceeds 31 characters.
    +* 3.0  kpc   1/23/15  Corrected the extended descriptor macro values.
    +* 3.0  kvn   02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.0  hk   03/18/15 Added support for jumbo frames.
    +*                    Remove "used bit set" from TX error interrupt masks.
    +* 3.1  hk   08/10/15 Update upper 32 bit tx and rx queue ptr register offsets.
    +* 3.2   hk   02/22/16 Added SGMII support for Zynq Ultrascale+ MPSoC.
    +* 
    +* +******************************************************************************/ + +#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 4U /**< Maxmum number of mac address + supported */ +#define XEMACPS_MAX_TYPE_ID 4U /**< Maxmum number of type id supported */ + +#ifdef __aarch64__ +#define XEMACPS_BD_ALIGNMENT 64U /**< Minimum buffer descriptor alignment + on the local bus */ +#else + +#define XEMACPS_BD_ALIGNMENT 4U /**< Minimum buffer descriptor alignment + on the local bus */ +#endif +#define XEMACPS_RX_BUF_ALIGNMENT 4U /**< 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 1U /**< send direction */ +#define XEMACPS_RECV 2U /**< receive direction */ +/*@}*/ + +/** @name MDC clock division + * currently supporting 8, 16, 32, 48, 64, 96, 128, 224. + * @{ + */ +typedef enum { MDC_DIV_8 = 0U, 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 1536U /**< Specify the receive buffer size in + bytes, 64, 128, ... 10240 */ +#define XEMACPS_RX_BUF_SIZE_JUMBO 10240U + +#define XEMACPS_RX_BUF_UNIT 64U /**< Number of receive buffer bytes as a + unit, this is HW setup */ + +#define XEMACPS_MAX_RXBD 128U /**< Size of RX buffer descriptor queues */ +#define XEMACPS_MAX_TXBD 128U /**< Size of TX buffer descriptor queues */ + +#define XEMACPS_MAX_HASH_BITS 64U /**< 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 0x00000000U /**< Network Control reg */ +#define XEMACPS_NWCFG_OFFSET 0x00000004U /**< Network Config reg */ +#define XEMACPS_NWSR_OFFSET 0x00000008U /**< Network Status reg */ + +#define XEMACPS_DMACR_OFFSET 0x00000010U /**< DMA Control reg */ +#define XEMACPS_TXSR_OFFSET 0x00000014U /**< TX Status reg */ +#define XEMACPS_RXQBASE_OFFSET 0x00000018U /**< RX Q Base address reg */ +#define XEMACPS_TXQBASE_OFFSET 0x0000001CU /**< TX Q Base address reg */ +#define XEMACPS_RXSR_OFFSET 0x00000020U /**< RX Status reg */ + +#define XEMACPS_ISR_OFFSET 0x00000024U /**< Interrupt Status reg */ +#define XEMACPS_IER_OFFSET 0x00000028U /**< Interrupt Enable reg */ +#define XEMACPS_IDR_OFFSET 0x0000002CU /**< Interrupt Disable reg */ +#define XEMACPS_IMR_OFFSET 0x00000030U /**< Interrupt Mask reg */ + +#define XEMACPS_PHYMNTNC_OFFSET 0x00000034U /**< Phy Maintaince reg */ +#define XEMACPS_RXPAUSE_OFFSET 0x00000038U /**< RX Pause Time reg */ +#define XEMACPS_TXPAUSE_OFFSET 0x0000003CU /**< TX Pause Time reg */ + +#define XEMACPS_JUMBOMAXLEN_OFFSET 0x00000048U /**< Jumbo max length reg */ + +#define XEMACPS_HASHL_OFFSET 0x00000080U /**< Hash Low address reg */ +#define XEMACPS_HASHH_OFFSET 0x00000084U /**< Hash High address reg */ + +#define XEMACPS_LADDR1L_OFFSET 0x00000088U /**< Specific1 addr low reg */ +#define XEMACPS_LADDR1H_OFFSET 0x0000008CU /**< Specific1 addr high reg */ +#define XEMACPS_LADDR2L_OFFSET 0x00000090U /**< Specific2 addr low reg */ +#define XEMACPS_LADDR2H_OFFSET 0x00000094U /**< Specific2 addr high reg */ +#define XEMACPS_LADDR3L_OFFSET 0x00000098U /**< Specific3 addr low reg */ +#define XEMACPS_LADDR3H_OFFSET 0x0000009CU /**< Specific3 addr high reg */ +#define XEMACPS_LADDR4L_OFFSET 0x000000A0U /**< Specific4 addr low reg */ +#define XEMACPS_LADDR4H_OFFSET 0x000000A4U /**< Specific4 addr high reg */ + +#define XEMACPS_MATCH1_OFFSET 0x000000A8U /**< Type ID1 Match reg */ +#define XEMACPS_MATCH2_OFFSET 0x000000ACU /**< Type ID2 Match reg */ +#define XEMACPS_MATCH3_OFFSET 0x000000B0U /**< Type ID3 Match reg */ +#define XEMACPS_MATCH4_OFFSET 0x000000B4U /**< Type ID4 Match reg */ + +#define XEMACPS_STRETCH_OFFSET 0x000000BCU /**< IPG Stretch reg */ + +#define XEMACPS_OCTTXL_OFFSET 0x00000100U /**< Octects transmitted Low + reg */ +#define XEMACPS_OCTTXH_OFFSET 0x00000104U /**< Octects transmitted High + reg */ + +#define XEMACPS_TXCNT_OFFSET 0x00000108U /**< Error-free Frmaes + transmitted counter */ +#define XEMACPS_TXBCCNT_OFFSET 0x0000010CU /**< Error-free Broadcast + Frames counter*/ +#define XEMACPS_TXMCCNT_OFFSET 0x00000110U /**< Error-free Multicast + Frame counter */ +#define XEMACPS_TXPAUSECNT_OFFSET 0x00000114U /**< Pause Frames Transmitted + Counter */ +#define XEMACPS_TX64CNT_OFFSET 0x00000118U /**< Error-free 64 byte Frames + Transmitted counter */ +#define XEMACPS_TX65CNT_OFFSET 0x0000011CU /**< Error-free 65-127 byte + Frames Transmitted + counter */ +#define XEMACPS_TX128CNT_OFFSET 0x00000120U /**< Error-free 128-255 byte + Frames Transmitted + counter*/ +#define XEMACPS_TX256CNT_OFFSET 0x00000124U /**< Error-free 256-511 byte + Frames transmitted + counter */ +#define XEMACPS_TX512CNT_OFFSET 0x00000128U /**< Error-free 512-1023 byte + Frames transmitted + counter */ +#define XEMACPS_TX1024CNT_OFFSET 0x0000012CU /**< Error-free 1024-1518 byte + Frames transmitted + counter */ +#define XEMACPS_TX1519CNT_OFFSET 0x00000130U /**< Error-free larger than + 1519 byte Frames + transmitted counter */ +#define XEMACPS_TXURUNCNT_OFFSET 0x00000134U /**< TX under run error + counter */ + +#define XEMACPS_SNGLCOLLCNT_OFFSET 0x00000138U /**< Single Collision Frame + Counter */ +#define XEMACPS_MULTICOLLCNT_OFFSET 0x0000013CU /**< Multiple Collision Frame + Counter */ +#define XEMACPS_EXCESSCOLLCNT_OFFSET 0x00000140U /**< Excessive Collision Frame + Counter */ +#define XEMACPS_LATECOLLCNT_OFFSET 0x00000144U /**< Late Collision Frame + Counter */ +#define XEMACPS_TXDEFERCNT_OFFSET 0x00000148U /**< Deferred Transmission + Frame Counter */ +#define XEMACPS_TXCSENSECNT_OFFSET 0x0000014CU /**< Transmit Carrier Sense + Error Counter */ + +#define XEMACPS_OCTRXL_OFFSET 0x00000150U /**< Octects Received register + Low */ +#define XEMACPS_OCTRXH_OFFSET 0x00000154U /**< Octects Received register + High */ + +#define XEMACPS_RXCNT_OFFSET 0x00000158U /**< Error-free Frames + Received Counter */ +#define XEMACPS_RXBROADCNT_OFFSET 0x0000015CU /**< Error-free Broadcast + Frames Received Counter */ +#define XEMACPS_RXMULTICNT_OFFSET 0x00000160U /**< Error-free Multicast + Frames Received Counter */ +#define XEMACPS_RXPAUSECNT_OFFSET 0x00000164U /**< Pause Frames + Received Counter */ +#define XEMACPS_RX64CNT_OFFSET 0x00000168U /**< Error-free 64 byte Frames + Received Counter */ +#define XEMACPS_RX65CNT_OFFSET 0x0000016CU /**< Error-free 65-127 byte + Frames Received Counter */ +#define XEMACPS_RX128CNT_OFFSET 0x00000170U /**< Error-free 128-255 byte + Frames Received Counter */ +#define XEMACPS_RX256CNT_OFFSET 0x00000174U /**< Error-free 256-512 byte + Frames Received Counter */ +#define XEMACPS_RX512CNT_OFFSET 0x00000178U /**< Error-free 512-1023 byte + Frames Received Counter */ +#define XEMACPS_RX1024CNT_OFFSET 0x0000017CU /**< Error-free 1024-1518 byte + Frames Received Counter */ +#define XEMACPS_RX1519CNT_OFFSET 0x00000180U /**< Error-free 1519-max byte + Frames Received Counter */ +#define XEMACPS_RXUNDRCNT_OFFSET 0x00000184U /**< Undersize Frames Received + Counter */ +#define XEMACPS_RXOVRCNT_OFFSET 0x00000188U /**< Oversize Frames Received + Counter */ +#define XEMACPS_RXJABCNT_OFFSET 0x0000018CU /**< Jabbers Received + Counter */ +#define XEMACPS_RXFCSCNT_OFFSET 0x00000190U /**< Frame Check Sequence + Error Counter */ +#define XEMACPS_RXLENGTHCNT_OFFSET 0x00000194U /**< Length Field Error + Counter */ +#define XEMACPS_RXSYMBCNT_OFFSET 0x00000198U /**< Symbol Error Counter */ +#define XEMACPS_RXALIGNCNT_OFFSET 0x0000019CU /**< Alignment Error Counter */ +#define XEMACPS_RXRESERRCNT_OFFSET 0x000001A0U /**< Receive Resource Error + Counter */ +#define XEMACPS_RXORCNT_OFFSET 0x000001A4U /**< Receive Overrun Counter */ +#define XEMACPS_RXIPCCNT_OFFSET 0x000001A8U /**< IP header Checksum Error + Counter */ +#define XEMACPS_RXTCPCCNT_OFFSET 0x000001ACU /**< TCP Checksum Error + Counter */ +#define XEMACPS_RXUDPCCNT_OFFSET 0x000001B0U /**< UDP Checksum Error + Counter */ +#define XEMACPS_LAST_OFFSET 0x000001B4U /**< Last statistic counter + offset, for clearing */ + +#define XEMACPS_1588_SEC_OFFSET 0x000001D0U /**< 1588 second counter */ +#define XEMACPS_1588_NANOSEC_OFFSET 0x000001D4U /**< 1588 nanosecond counter */ +#define XEMACPS_1588_ADJ_OFFSET 0x000001D8U /**< 1588 nanosecond + adjustment counter */ +#define XEMACPS_1588_INC_OFFSET 0x000001DCU /**< 1588 nanosecond + increment counter */ +#define XEMACPS_PTP_TXSEC_OFFSET 0x000001E0U /**< 1588 PTP transmit second + counter */ +#define XEMACPS_PTP_TXNANOSEC_OFFSET 0x000001E4U /**< 1588 PTP transmit + nanosecond counter */ +#define XEMACPS_PTP_RXSEC_OFFSET 0x000001E8U /**< 1588 PTP receive second + counter */ +#define XEMACPS_PTP_RXNANOSEC_OFFSET 0x000001ECU /**< 1588 PTP receive + nanosecond counter */ +#define XEMACPS_PTPP_TXSEC_OFFSET 0x000001F0U /**< 1588 PTP peer transmit + second counter */ +#define XEMACPS_PTPP_TXNANOSEC_OFFSET 0x000001F4U /**< 1588 PTP peer transmit + nanosecond counter */ +#define XEMACPS_PTPP_RXSEC_OFFSET 0x000001F8U /**< 1588 PTP peer receive + second counter */ +#define XEMACPS_PTPP_RXNANOSEC_OFFSET 0x000001FCU /**< 1588 PTP peer receive + nanosecond counter */ + +#define XEMACPS_INTQ1_STS_OFFSET 0x00000400U /**< Interrupt Q1 Status + reg */ +#define XEMACPS_TXQ1BASE_OFFSET 0x00000440U /**< TX Q1 Base address + reg */ +#define XEMACPS_RXQ1BASE_OFFSET 0x00000480U /**< RX Q1 Base address + reg */ +#define XEMACPS_MSBBUF_TXQBASE_OFFSET 0x000004C8U /**< MSB Buffer TX Q Base + reg */ +#define XEMACPS_MSBBUF_RXQBASE_OFFSET 0x000004D4U /**< MSB Buffer RX Q Base + reg */ +#define XEMACPS_INTQ1_IER_OFFSET 0x00000600U /**< Interrupt Q1 Enable + reg */ +#define XEMACPS_INTQ1_IDR_OFFSET 0x00000620U /**< Interrupt Q1 Disable + reg */ +#define XEMACPS_INTQ1_IMR_OFFSET 0x00000640U /**< Interrupt Q1 Mask + reg */ + +/* Define some bit positions for registers. */ + +/** @name network control register bit definitions + * @{ + */ +#define XEMACPS_NWCTRL_FLUSH_DPRAM_MASK 0x00040000U /**< Flush a packet from + Rx SRAM */ +#define XEMACPS_NWCTRL_ZEROPAUSETX_MASK 0x00000800U /**< Transmit zero quantum + pause frame */ +#define XEMACPS_NWCTRL_PAUSETX_MASK 0x00000800U /**< Transmit pause frame */ +#define XEMACPS_NWCTRL_HALTTX_MASK 0x00000400U /**< Halt transmission + after current frame */ +#define XEMACPS_NWCTRL_STARTTX_MASK 0x00000200U /**< Start tx (tx_go) */ + +#define XEMACPS_NWCTRL_STATWEN_MASK 0x00000080U /**< Enable writing to + stat counters */ +#define XEMACPS_NWCTRL_STATINC_MASK 0x00000040U /**< Increment statistic + registers */ +#define XEMACPS_NWCTRL_STATCLR_MASK 0x00000020U /**< Clear statistic + registers */ +#define XEMACPS_NWCTRL_MDEN_MASK 0x00000010U /**< Enable MDIO port */ +#define XEMACPS_NWCTRL_TXEN_MASK 0x00000008U /**< Enable transmit */ +#define XEMACPS_NWCTRL_RXEN_MASK 0x00000004U /**< Enable receive */ +#define XEMACPS_NWCTRL_LOOPEN_MASK 0x00000002U /**< local loopback */ +/*@}*/ + +/** @name network configuration register bit definitions + * @{ + */ +#define XEMACPS_NWCFG_BADPREAMBEN_MASK 0x20000000U /**< disable rejection of + non-standard preamble */ +#define XEMACPS_NWCFG_IPDSTRETCH_MASK 0x10000000U /**< enable transmit IPG */ +#define XEMACPS_NWCFG_SGMIIEN_MASK 0x08000000U /**< SGMII Enable */ +#define XEMACPS_NWCFG_FCSIGNORE_MASK 0x04000000U /**< disable rejection of + FCS error */ +#define XEMACPS_NWCFG_HDRXEN_MASK 0x02000000U /**< RX half duplex */ +#define XEMACPS_NWCFG_RXCHKSUMEN_MASK 0x01000000U /**< enable RX checksum + offload */ +#define XEMACPS_NWCFG_PAUSECOPYDI_MASK 0x00800000U /**< Do not copy pause + Frames to memory */ +#define XEMACPS_NWCFG_DWIDTH_64_MASK 0x00200000U /**< 64 bit Data bus width */ +#define XEMACPS_NWCFG_MDC_SHIFT_MASK 18U /**< shift bits for MDC */ +#define XEMACPS_NWCFG_MDCCLKDIV_MASK 0x001C0000U /**< MDC Mask PCLK divisor */ +#define XEMACPS_NWCFG_FCSREM_MASK 0x00020000U /**< Discard FCS from + received frames */ +#define XEMACPS_NWCFG_LENERRDSCRD_MASK 0x00010000U +/**< RX length error discard */ +#define XEMACPS_NWCFG_RXOFFS_MASK 0x0000C000U /**< RX buffer offset */ +#define XEMACPS_NWCFG_PAUSEEN_MASK 0x00002000U /**< Enable pause RX */ +#define XEMACPS_NWCFG_RETRYTESTEN_MASK 0x00001000U /**< Retry test */ +#define XEMACPS_NWCFG_XTADDMACHEN_MASK 0x00000200U +/**< External address match enable */ +#define XEMACPS_NWCFG_PCSSEL_MASK 0x00000800U /**< PCS Select */ +#define XEMACPS_NWCFG_1000_MASK 0x00000400U /**< 1000 Mbps */ +#define XEMACPS_NWCFG_1536RXEN_MASK 0x00000100U /**< Enable 1536 byte + frames reception */ +#define XEMACPS_NWCFG_UCASTHASHEN_MASK 0x00000080U /**< Receive unicast hash + frames */ +#define XEMACPS_NWCFG_MCASTHASHEN_MASK 0x00000040U /**< Receive multicast hash + frames */ +#define XEMACPS_NWCFG_BCASTDI_MASK 0x00000020U /**< Do not receive + broadcast frames */ +#define XEMACPS_NWCFG_COPYALLEN_MASK 0x00000010U /**< Copy all frames */ +#define XEMACPS_NWCFG_JUMBO_MASK 0x00000008U /**< Jumbo frames */ +#define XEMACPS_NWCFG_NVLANDISC_MASK 0x00000004U /**< Receive only VLAN + frames */ +#define XEMACPS_NWCFG_FDEN_MASK 0x00000002U/**< full duplex */ +#define XEMACPS_NWCFG_100_MASK 0x00000001U /**< 100 Mbps */ +#define XEMACPS_NWCFG_RESET_MASK 0x00080000U/**< reset value */ +/*@}*/ + +/** @name network status register bit definitaions + * @{ + */ +#define XEMACPS_NWSR_MDIOIDLE_MASK 0x00000004U /**< PHY management idle */ +#define XEMACPS_NWSR_MDIO_MASK 0x00000002U /**< Status of mdio_in */ +/*@}*/ + + +/** @name MAC address register word 1 mask + * @{ + */ +#define XEMACPS_LADDR_MACH_MASK 0x0000FFFFU /**< Address bits[47:32] + bit[31:0] are in BOTTOM */ +/*@}*/ + + +/** @name DMA control register bit definitions + * @{ + */ +#define XEMACPS_DMACR_ADDR_WIDTH_64 0x40000000U /**< 64 bit address bus */ +#define XEMACPS_DMACR_TXEXTEND_MASK 0x20000000U /**< Tx Extended desc mode */ +#define XEMACPS_DMACR_RXEXTEND_MASK 0x10000000U /**< Rx Extended desc mode */ +#define XEMACPS_DMACR_RXBUF_MASK 0x00FF0000U /**< Mask bit for RX buffer + size */ +#define XEMACPS_DMACR_RXBUF_SHIFT 16U /**< Shift bit for RX buffer + size */ +#define XEMACPS_DMACR_TCPCKSUM_MASK 0x00000800U /**< enable/disable TX + checksum offload */ +#define XEMACPS_DMACR_TXSIZE_MASK 0x00000400U /**< TX buffer memory size */ +#define XEMACPS_DMACR_RXSIZE_MASK 0x00000300U /**< RX buffer memory size */ +#define XEMACPS_DMACR_ENDIAN_MASK 0x00000080U /**< endian configuration */ +#define XEMACPS_DMACR_BLENGTH_MASK 0x0000001FU /**< buffer burst length */ +#define XEMACPS_DMACR_SINGLE_AHB_BURST 0x00000001U /**< single AHB bursts */ +#define XEMACPS_DMACR_INCR4_AHB_BURST 0x00000004U /**< 4 bytes AHB bursts */ +#define XEMACPS_DMACR_INCR8_AHB_BURST 0x00000008U /**< 8 bytes AHB bursts */ +#define XEMACPS_DMACR_INCR16_AHB_BURST 0x00000010U /**< 16 bytes AHB bursts */ +/*@}*/ + +/** @name transmit status register bit definitions + * @{ + */ +#define XEMACPS_TXSR_HRESPNOK_MASK 0x00000100U /**< Transmit hresp not OK */ +#define XEMACPS_TXSR_URUN_MASK 0x00000040U /**< Transmit underrun */ +#define XEMACPS_TXSR_TXCOMPL_MASK 0x00000020U /**< Transmit completed OK */ +#define XEMACPS_TXSR_BUFEXH_MASK 0x00000010U /**< Transmit buffs exhausted + mid frame */ +#define XEMACPS_TXSR_TXGO_MASK 0x00000008U /**< Status of go flag */ +#define XEMACPS_TXSR_RXOVR_MASK 0x00000004U /**< Retry limit exceeded */ +#define XEMACPS_TXSR_FRAMERX_MASK 0x00000002U /**< Collision tx frame */ +#define XEMACPS_TXSR_USEDREAD_MASK 0x00000001U /**< TX buffer used bit set */ + +#define XEMACPS_TXSR_ERROR_MASK ((u32)XEMACPS_TXSR_HRESPNOK_MASK | \ + (u32)XEMACPS_TXSR_URUN_MASK | \ + (u32)XEMACPS_TXSR_BUFEXH_MASK | \ + (u32)XEMACPS_TXSR_RXOVR_MASK | \ + (u32)XEMACPS_TXSR_FRAMERX_MASK | \ + (u32)XEMACPS_TXSR_USEDREAD_MASK) +/*@}*/ + +/** + * @name receive status register bit definitions + * @{ + */ +#define XEMACPS_RXSR_HRESPNOK_MASK 0x00000008U /**< Receive hresp not OK */ +#define XEMACPS_RXSR_RXOVR_MASK 0x00000004U /**< Receive overrun */ +#define XEMACPS_RXSR_FRAMERX_MASK 0x00000002U /**< Frame received OK */ +#define XEMACPS_RXSR_BUFFNA_MASK 0x00000001U /**< RX buffer used bit set */ + +#define XEMACPS_RXSR_ERROR_MASK ((u32)XEMACPS_RXSR_HRESPNOK_MASK | \ + (u32)XEMACPS_RXSR_RXOVR_MASK | \ + (u32)XEMACPS_RXSR_BUFFNA_MASK) +/*@}*/ + +/** + * @name Interrupt Q1 status register bit definitions + * @{ + */ +#define XEMACPS_INTQ1SR_TXCOMPL_MASK 0x00000080U /**< Transmit completed OK */ +#define XEMACPS_INTQ1SR_TXERR_MASK 0x00000040U /**< Transmit AMBA Error */ + +#define XEMACPS_INTQ1_IXR_ALL_MASK ((u32)XEMACPS_INTQ1SR_TXCOMPL_MASK | \ + (u32)XEMACPS_INTQ1SR_TXERR_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 0x02000000U /**< PTP Psync transmitted */ +#define XEMACPS_IXR_PTPPDRTX_MASK 0x01000000U /**< PTP Pdelay_req + transmitted */ +#define XEMACPS_IXR_PTPSTX_MASK 0x00800000U /**< PTP Sync transmitted */ +#define XEMACPS_IXR_PTPDRTX_MASK 0x00400000U /**< PTP Delay_req transmitted + */ +#define XEMACPS_IXR_PTPPSRX_MASK 0x00200000U /**< PTP Psync received */ +#define XEMACPS_IXR_PTPPDRRX_MASK 0x00100000U /**< PTP Pdelay_req received */ +#define XEMACPS_IXR_PTPSRX_MASK 0x00080000U /**< PTP Sync received */ +#define XEMACPS_IXR_PTPDRRX_MASK 0x00040000U /**< PTP Delay_req received */ +#define XEMACPS_IXR_PAUSETX_MASK 0x00004000U /**< Pause frame transmitted */ +#define XEMACPS_IXR_PAUSEZERO_MASK 0x00002000U /**< Pause time has reached + zero */ +#define XEMACPS_IXR_PAUSENZERO_MASK 0x00001000U /**< Pause frame received */ +#define XEMACPS_IXR_HRESPNOK_MASK 0x00000800U /**< hresp not ok */ +#define XEMACPS_IXR_RXOVR_MASK 0x00000400U /**< Receive overrun occurred */ +#define XEMACPS_IXR_TXCOMPL_MASK 0x00000080U /**< Frame transmitted ok */ +#define XEMACPS_IXR_TXEXH_MASK 0x00000040U /**< Transmit err occurred or + no buffers*/ +#define XEMACPS_IXR_RETRY_MASK 0x00000020U /**< Retry limit exceeded */ +#define XEMACPS_IXR_URUN_MASK 0x00000010U /**< Transmit underrun */ +#define XEMACPS_IXR_TXUSED_MASK 0x00000008U /**< Tx buffer used bit read */ +#define XEMACPS_IXR_RXUSED_MASK 0x00000004U /**< Rx buffer used bit read */ +#define XEMACPS_IXR_FRAMERX_MASK 0x00000002U /**< Frame received ok */ +#define XEMACPS_IXR_MGMNT_MASK 0x00000001U /**< PHY management complete */ +#define XEMACPS_IXR_ALL_MASK 0x00007FFFU /**< Everything! */ + +#define XEMACPS_IXR_TX_ERR_MASK ((u32)XEMACPS_IXR_TXEXH_MASK | \ + (u32)XEMACPS_IXR_RETRY_MASK | \ + (u32)XEMACPS_IXR_URUN_MASK) + + +#define XEMACPS_IXR_RX_ERR_MASK ((u32)XEMACPS_IXR_HRESPNOK_MASK | \ + (u32)XEMACPS_IXR_RXUSED_MASK | \ + (u32)XEMACPS_IXR_RXOVR_MASK) + +/*@}*/ + +/** @name PHY Maintenance bit definitions + * @{ + */ +#define XEMACPS_PHYMNTNC_OP_MASK 0x40020000U /**< operation mask bits */ +#define XEMACPS_PHYMNTNC_OP_R_MASK 0x20000000U /**< read operation */ +#define XEMACPS_PHYMNTNC_OP_W_MASK 0x10000000U /**< write operation */ +#define XEMACPS_PHYMNTNC_ADDR_MASK 0x0F800000U /**< Address bits */ +#define XEMACPS_PHYMNTNC_REG_MASK 0x007C0000U /**< register bits */ +#define XEMACPS_PHYMNTNC_DATA_MASK 0x00000FFFU /**< data bits */ +#define XEMACPS_PHYMNTNC_PHAD_SHFT_MSK 23U /**< Shift bits for PHYAD */ +#define XEMACPS_PHYMNTNC_PREG_SHFT_MSK 18U /**< Shift bits for PHREG */ +/*@}*/ + +/* Transmit buffer descriptor status words offset + * @{ + */ +#define XEMACPS_BD_ADDR_OFFSET 0x00000000U /**< word 0/addr of BDs */ +#define XEMACPS_BD_STAT_OFFSET 0x00000004U /**< word 1/status of BDs */ +#define XEMACPS_BD_ADDR_HI_OFFSET 0x00000008U /**< word 2/addr 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 0x80000000U /**< Used bit. */ +#define XEMACPS_TXBUF_WRAP_MASK 0x40000000U /**< Wrap bit, last descriptor */ +#define XEMACPS_TXBUF_RETRY_MASK 0x20000000U /**< Retry limit exceeded */ +#define XEMACPS_TXBUF_URUN_MASK 0x10000000U /**< Transmit underrun occurred */ +#define XEMACPS_TXBUF_EXH_MASK 0x08000000U /**< Buffers exhausted */ +#define XEMACPS_TXBUF_TCP_MASK 0x04000000U /**< Late collision. */ +#define XEMACPS_TXBUF_NOCRC_MASK 0x00010000U /**< No CRC */ +#define XEMACPS_TXBUF_LAST_MASK 0x00008000U /**< Last buffer */ +#define XEMACPS_TXBUF_LEN_MASK 0x00003FFFU /**< 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 0x80000000U /**< Broadcast frame */ +#define XEMACPS_RXBUF_MULTIHASH_MASK 0x40000000U /**< Multicast hashed frame */ +#define XEMACPS_RXBUF_UNIHASH_MASK 0x20000000U /**< Unicast hashed frame */ +#define XEMACPS_RXBUF_EXH_MASK 0x08000000U /**< buffer exhausted */ +#define XEMACPS_RXBUF_AMATCH_MASK 0x06000000U /**< Specific address + matched */ +#define XEMACPS_RXBUF_IDFOUND_MASK 0x01000000U /**< Type ID matched */ +#define XEMACPS_RXBUF_IDMATCH_MASK 0x00C00000U /**< ID matched mask */ +#define XEMACPS_RXBUF_VLAN_MASK 0x00200000U /**< VLAN tagged */ +#define XEMACPS_RXBUF_PRI_MASK 0x00100000U /**< Priority tagged */ +#define XEMACPS_RXBUF_VPRI_MASK 0x000E0000U /**< Vlan priority */ +#define XEMACPS_RXBUF_CFI_MASK 0x00010000U /**< CFI frame */ +#define XEMACPS_RXBUF_EOF_MASK 0x00008000U /**< End of frame. */ +#define XEMACPS_RXBUF_SOF_MASK 0x00004000U /**< Start of frame. */ +#define XEMACPS_RXBUF_LEN_MASK 0x00001FFFU /**< Mask for length field */ +#define XEMACPS_RXBUF_LEN_JUMBO_MASK 0x00003FFFU /**< Mask for jumbo length */ + +#define XEMACPS_RXBUF_WRAP_MASK 0x00000002U /**< Wrap bit, last BD */ +#define XEMACPS_RXBUF_NEW_MASK 0x00000001U /**< Used bit.. */ +#define XEMACPS_RXBUF_ADD_MASK 0xFFFFFFFCU /**< Mask for address */ +/* + * @} + */ + +/* + * Define appropriate I/O access method to memory mapped I/O or other + * interface 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) + (u32)(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) + (u32)(RegOffset), (u32)(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_intr.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_intr.c new file mode 100644 index 0000000..9c355a1 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_intr.c @@ -0,0 +1,268 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_intr.c +* @addtogroup emacps_v3_7 +* @{ +* +* Functions in this file implement general purpose interrupt processing related +* functionality. See xemacps.h for a detailed description of the driver. +* +*
    +* 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.
    +* 2.1   srt  07/15/14 Add support for Zynq Ultrascale Mp GEM specification
    +*		       and 64-bit changes.
    +* 3.0   kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1   hk   07/27/15 Do not call error handler with '0' error code when
    +*                     there is no error. CR# 869403
    +* 
    +******************************************************************************/ + +/***************************** 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 FuncPointer 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. + * + *****************************************************************************/ +LONG XEmacPs_SetHandler(XEmacPs *InstancePtr, u32 HandlerType, + void *FuncPointer, void *CallBackRef) +{ + LONG Status; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(FuncPointer != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + switch (HandlerType) { + case XEMACPS_HANDLER_DMASEND: + Status = (LONG)(XST_SUCCESS); + InstancePtr->SendHandler = ((XEmacPs_Handler)(void *)FuncPointer); + InstancePtr->SendRef = CallBackRef; + break; + case XEMACPS_HANDLER_DMARECV: + Status = (LONG)(XST_SUCCESS); + InstancePtr->RecvHandler = ((XEmacPs_Handler)(void *)FuncPointer); + InstancePtr->RecvRef = CallBackRef; + break; + case XEMACPS_HANDLER_ERROR: + Status = (LONG)(XST_SUCCESS); + InstancePtr->ErrorHandler = ((XEmacPs_ErrHandler)(void *)FuncPointer); + InstancePtr->ErrorRef = CallBackRef; + break; + default: + Status = (LONG)(XST_INVALID_PARAM); + break; + } + return Status; +} + +/*****************************************************************************/ +/** +* 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; + u32 RegQ1ISR = 0U; + XEmacPs *InstancePtr = (XEmacPs *) XEmacPsPtr; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)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); + + /* Read Transmit Q1 ISR */ + + if (InstancePtr->Version > 2) + RegQ1ISR = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_INTQ1_STS_OFFSET); + + /* Clear the interrupt status register */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_ISR_OFFSET, + RegISR); + + /* Receive complete interrupt */ + if ((RegISR & XEMACPS_IXR_FRAMERX_MASK) != 0x00000000U) { + /* Clear RX status register RX complete indication but preserve + * error bits if there is any */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_RXSR_OFFSET, + ((u32)XEMACPS_RXSR_FRAMERX_MASK | + (u32)XEMACPS_RXSR_BUFFNA_MASK)); + InstancePtr->RecvHandler(InstancePtr->RecvRef); + } + + /* Transmit Q1 complete interrupt */ + if ((InstancePtr->Version > 2) && + ((RegQ1ISR & XEMACPS_INTQ1SR_TXCOMPL_MASK) != 0x00000000U)) { + /* Clear TX status register TX complete indication but preserve + * error bits if there is any */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_INTQ1_STS_OFFSET, + XEMACPS_INTQ1SR_TXCOMPL_MASK); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXSR_OFFSET, + ((u32)XEMACPS_TXSR_TXCOMPL_MASK | + (u32)XEMACPS_TXSR_USEDREAD_MASK)); + InstancePtr->SendHandler(InstancePtr->SendRef); + } + + /* Transmit complete interrupt */ + if ((RegISR & XEMACPS_IXR_TXCOMPL_MASK) != 0x00000000U) { + /* Clear TX status register TX complete indication but preserve + * error bits if there is any */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXSR_OFFSET, + ((u32)XEMACPS_TXSR_TXCOMPL_MASK | + (u32)XEMACPS_TXSR_USEDREAD_MASK)); + InstancePtr->SendHandler(InstancePtr->SendRef); + } + + /* Receive error conditions interrupt */ + if ((RegISR & XEMACPS_IXR_RX_ERR_MASK) != 0x00000000U) { + /* 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) != 0x00000000U) { + RegCtrl = + XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + RegCtrl |= (u32)XEMACPS_NWCTRL_FLUSH_DPRAM_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, RegCtrl); + } + + if(RegSR != 0) { + 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 Q1 error conditions interrupt */ + if ((InstancePtr->Version > 2) && + ((RegQ1ISR & XEMACPS_INTQ1SR_TXERR_MASK) != 0x00000000U) && + ((RegQ1ISR & XEMACPS_INTQ1SR_TXCOMPL_MASK) != 0x00000000U)) { + /* Clear Interrupt Q1 status register */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_INTQ1_STS_OFFSET, RegQ1ISR); + InstancePtr->ErrorHandler(InstancePtr->ErrorRef, XEMACPS_SEND, + RegQ1ISR); + } + + /* Transmit error conditions interrupt */ + if (((RegISR & XEMACPS_IXR_TX_ERR_MASK) != 0x00000000U) && + (!(RegISR & XEMACPS_IXR_TXCOMPL_MASK) != 0x00000000U)) { + /* 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_sinit.c new file mode 100644 index 0000000..e2d2078 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/emacps_v3_7/src/xemacps_sinit.c @@ -0,0 +1,97 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_sinit.c +* @addtogroup emacps_v3_7 +* @{ +* +* This file contains lookup method by device ID when success, it returns +* pointer to config table to be used to initialize the device. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a wsy  01/10/10 New
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xemacps.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/*************************** Variable Definitions *****************************/ +extern XEmacPs_Config XEmacPs_ConfigTable[XPAR_XEMACPS_NUM_INSTANCES]; + +/***************** 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) +{ + XEmacPs_Config *CfgPtr = NULL; + u32 i; + + for (i = 0U; i < (u32)XPAR_XEMACPS_NUM_INSTANCES; i++) { + if (XEmacPs_ConfigTable[i].DeviceId == DeviceId) { + CfgPtr = &XEmacPs_ConfigTable[i]; + break; + } + } + + return (XEmacPs_Config *)(CfgPtr); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops.c new file mode 100644 index 0000000..7b6fe2e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops.c @@ -0,0 +1,628 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops.c +* @addtogroup gpiops_v3_3 +* @{ +* +* 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. +* +*
    +* 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.
    +* 2.1   hk   04/29/14 Use Input data register DATA_RO for read. CR# 771667.
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn  04/13/15 Add support for Zynq Ultrascale+ MP. CR# 856980.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xgpiops.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + + +/************************** Function Prototypes ******************************/ + +extern void StubHandler(void *CallBackRef, u32 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. +* +******************************************************************************/ +s32 XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr, + u32 EffectiveAddr) +{ + s32 Status = XST_SUCCESS; + u8 i; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + Xil_AssertNonvoid(EffectiveAddr != (u32)0); + /* + * Set some default values for instance data, don't indicate the device + * is ready to use until everything has been initialized successfully. + */ + InstancePtr->IsReady = 0U; + InstancePtr->GpioConfig.BaseAddr = EffectiveAddr; + InstancePtr->GpioConfig.DeviceId = ConfigPtr->DeviceId; + InstancePtr->Handler = StubHandler; + InstancePtr->Platform = XGetPlatform_Info(); + + /* Initialize the Bank data based on platform */ + if (InstancePtr->Platform == XPLAT_ZYNQ_ULTRA_MP) { + /* + * Max pins in the ZynqMP GPIO device + * 0 - 25, Bank 0 + * 26 - 51, Bank 1 + * 52 - 77, Bank 2 + * 78 - 109, Bank 3 + * 110 - 141, Bank 4 + * 142 - 173, Bank 5 + */ + InstancePtr->MaxPinNum = (u32)174; + InstancePtr->MaxBanks = (u8)6; + } else { + /* + * Max pins in the GPIO device + * 0 - 31, Bank 0 + * 32 - 53, Bank 1 + * 54 - 85, Bank 2 + * 86 - 117, Bank 3 + */ + InstancePtr->MaxPinNum = (u32)118; + InstancePtr->MaxBanks = (u8)4; + } + + /* + * By default, interrupts are not masked in GPIO. Disable + * interrupts for all pins in all the 4 banks. + */ + for (i=0;iMaxBanks;i++) { + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(i) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTDIS_OFFSET, 0xFFFFFFFFU); + } + + /* Indicate the component is now ready to use. */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + return Status; +} + +/****************************************************************************/ +/** +* +* 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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* +* @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 < InstancePtr->MaxBanks); + + return XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_DATA_BANK_OFFSET) + + XGPIOPS_DATA_RO_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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* 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. +* +*****************************************************************************/ +u32 XGpioPs_ReadPin(XGpioPs *InstancePtr, u32 Pin) +{ + u8 Bank; + u8 PinNumber; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + return (XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_DATA_BANK_OFFSET) + + XGPIOPS_DATA_RO_OFFSET) >> (u32)PinNumber) & (u32)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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* @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 < InstancePtr->MaxBanks); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* @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, u32 Pin, u32 Data) +{ + u32 RegOffset; + u32 Value; + u8 Bank; + u8 PinNumber; + u32 DataVar = Data; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + if (PinNumber > 15U) { + /* There are only 16 data bits in bit maskable register. */ + PinNumber -= (u8)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. + */ + DataVar &= (u32)0x01; + Value = ~((u32)1 << (PinNumber + 16U)) & ((DataVar << PinNumber) | 0xFFFF0000U); + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* @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 < InstancePtr->MaxBanks); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* @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, u32 Pin, u32 Direction) +{ + u8 Bank; + u8 PinNumber; + u32 DirModeReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < InstancePtr->MaxPinNum); + Xil_AssertVoid(Direction <= (u32)1); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + DirModeReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_DIRM_OFFSET); + + if (Direction!=(u32)0) { /* Output Direction */ + DirModeReg |= ((u32)1 << (u32)PinNumber); + } else { /* Input Direction */ + DirModeReg &= ~ ((u32)1 << (u32)PinNumber); + } + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* +* 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 < InstancePtr->MaxBanks); + + return XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* +* @return Direction of the specified pin. +* - 0 for Input Direction +* - 1 for Output Direction +* +* @note None. +* +*****************************************************************************/ +u32 XGpioPs_GetDirectionPin(XGpioPs *InstancePtr, u32 Pin) +{ + u8 Bank; + u8 PinNumber; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + return (XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_DIRM_OFFSET) >> (u32)PinNumber) & (u32)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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* @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 < InstancePtr->MaxBanks); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* @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, u32 Pin, u32 OpEnable) +{ + u8 Bank; + u8 PinNumber; + u32 OpEnableReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < InstancePtr->MaxPinNum); + Xil_AssertVoid(OpEnable <= (u32)1); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + OpEnableReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_OUTEN_OFFSET); + + if (OpEnable != (u32)0) { /* Enable Output Enable */ + OpEnableReg |= ((u32)1 << (u32)PinNumber); + } else { /* Disable Output Enable */ + OpEnableReg &= ~ ((u32)1 << (u32)PinNumber); + } + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* +* 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 < InstancePtr->MaxBanks); + + return XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* +* @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. +* +*****************************************************************************/ +u32 XGpioPs_GetOutputEnablePin(XGpioPs *InstancePtr, u32 Pin) +{ + u8 Bank; + u8 PinNumber; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + return (XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_OUTEN_OFFSET) >> (u32)PinNumber) & (u32)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) +{ + u32 XGpioPsPinTable[6] = {0}; + u32 Platform = XGetPlatform_Info(); + + if (Platform == XPLAT_ZYNQ_ULTRA_MP) { + /* + * This structure defines the mapping of the pin numbers to the banks when + * the driver APIs are used for working on the individual pins. + */ + + XGpioPsPinTable[0] = (u32)25; /* 0 - 25, Bank 0 */ + XGpioPsPinTable[1] = (u32)51; /* 26 - 51, Bank 1 */ + XGpioPsPinTable[2] = (u32)77; /* 52 - 77, Bank 2 */ + XGpioPsPinTable[3] = (u32)109; /* 78 - 109, Bank 3 */ + XGpioPsPinTable[4] = (u32)141; /* 110 - 141, Bank 4 */ + XGpioPsPinTable[5] = (u32)173; /* 142 - 173 Bank 5 */ + + *BankNumber = 0U; + while (*BankNumber < 6U) { + if (PinNumber <= XGpioPsPinTable[*BankNumber]) { + break; + } + (*BankNumber)++; + } + } else { + XGpioPsPinTable[0] = (u32)31; /* 0 - 31, Bank 0 */ + XGpioPsPinTable[1] = (u32)53; /* 32 - 53, Bank 1 */ + XGpioPsPinTable[2] = (u32)85; /* 54 - 85, Bank 2 */ + XGpioPsPinTable[3] = (u32)117; /* 86 - 117 Bank 3 */ + + *BankNumber = 0U; + while (*BankNumber < 4U) { + if (PinNumber <= XGpioPsPinTable[*BankNumber]) { + break; + } + (*BankNumber)++; + } + } + if (*BankNumber == (u8)0) { + *PinNumberInBank = PinNumber; + } else { + *PinNumberInBank = (u8)((u32)PinNumber % + (XGpioPsPinTable[*BankNumber - (u8)1] + (u32)1)); + } +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops.h new file mode 100644 index 0000000..fda562d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops.h @@ -0,0 +1,277 @@ + +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops.h +* @addtogroup gpiops_v3_3 +* @{ +* @details +* +* 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. +* +* Driver Description +* +* The device driver enables higher layer software (e.g., an application) to +* communicate to the GPIO. +* +* Interrupts +* +* 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. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Asserts +* +* 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. +* +* Building the driver +* +* 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. +*

    +* +*
    +* 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
    +* 2.1   hk   04/29/14 Use Input data register DATA_RO for read. CR# 771667.
    +* 2.2	sk	 10/13/14 Used Pin number in Bank instead of pin number
    +* 					  passed to APIs. CR# 822636
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn  04/13/15 Add support for Zynq Ultrascale+ MP. CR# 856980.
    +*       ms   03/17/17 Added readme.txt file in examples folder for doxygen
    +*                     generation.
    +*       ms   04/05/17 Added tabspace for return statements in functions of
    +*                     gpiops examples for proper documentation while
    +*                     generating doxygen.
    +* 3.3   ms   04/17/17 Added notes about gpio input and output pin description
    +*                     for zcu102 and zc702 boards in polled and interrupt
    +*                     example, configured Interrupt pin to input pin for
    +*                     proper functioning of interrupt example.
    +* 
    +* +******************************************************************************/ +#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" +#include "xplatform_info.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 0x00U /**< Interrupt on Rising edge */ +#define XGPIOPS_IRQ_TYPE_EDGE_FALLING 0x01U /**< Interrupt Falling edge */ +#define XGPIOPS_IRQ_TYPE_EDGE_BOTH 0x02U /**< Interrupt on both edges */ +#define XGPIOPS_IRQ_TYPE_LEVEL_HIGH 0x03U /**< Interrupt on high level */ +#define XGPIOPS_IRQ_TYPE_LEVEL_LOW 0x04U /**< Interrupt on low level */ +/*@}*/ + +#define XGPIOPS_BANK_MAX_PINS (u32)32 /**< Max pins in a GPIO bank */ +#define XGPIOPS_BANK0 0x00U /**< GPIO Bank 0 */ +#define XGPIOPS_BANK1 0x01U /**< GPIO Bank 1 */ +#define XGPIOPS_BANK2 0x02U /**< GPIO Bank 2 */ +#define XGPIOPS_BANK3 0x03U /**< GPIO Bank 3 */ + +#ifdef XPAR_PSU_GPIO_0_BASEADDR +#define XGPIOPS_BANK4 0x04U /**< GPIO Bank 4 */ +#define XGPIOPS_BANK5 0x05U /**< GPIO Bank 5 */ +#endif + +#define XGPIOPS_MAX_BANKS_ZYNQMP 0x06U /**< Max banks in a + * Zynq Ultrascale+ MP GPIO device + */ +#define XGPIOPS_MAX_BANKS 0x04U /**< Max banks in a Zynq GPIO device */ + +#define XGPIOPS_DEVICE_MAX_PIN_NUM_ZYNQMP (u32)174 /**< Max pins in the + * Zynq Ultrascale+ MP GPIO device + * 0 - 25, Bank 0 + * 26 - 51, Bank 1 + * 52 - 77, Bank 2 + * 78 - 109, Bank 3 + * 110 - 141, Bank 4 + * 142 - 173, Bank 5 + */ +#define XGPIOPS_DEVICE_MAX_PIN_NUM (u32)118 /**< Max pins in the Zynq 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, u32 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 */ + u32 Platform; /**< Platform data */ + u32 MaxPinNum; /**< Max pins in the GPIO device */ + u8 MaxBanks; /**< Max banks in a GPIO device */ +} XGpioPs; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/* Functions in xgpiops.c */ +s32 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 OpEnable); +u32 XGpioPs_GetOutputEnable(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_GetBankPin(u8 PinNumber, u8 *BankNumber, u8 *PinNumberInBank); + +/* Pin APIs in xgpiops.c */ +u32 XGpioPs_ReadPin(XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_WritePin(XGpioPs *InstancePtr, u32 Pin, u32 Data); +void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, u32 Pin, u32 Direction); +u32 XGpioPs_GetDirectionPin(XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, u32 Pin, u32 OpEnable); +u32 XGpioPs_GetOutputEnablePin(XGpioPs *InstancePtr, u32 Pin); + +/* Diagnostic functions in xgpiops_selftest.c */ +s32 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 FuncPointer); +void XGpioPs_IntrHandler(XGpioPs *InstancePtr); + +/* Pin APIs in xgpiops_intr.c */ +void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, u32 Pin, u8 IrqType); +u8 XGpioPs_GetIntrTypePin(XGpioPs *InstancePtr, u32 Pin); + +void XGpioPs_IntrEnablePin(XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_IntrDisablePin(XGpioPs *InstancePtr, u32 Pin); +u32 XGpioPs_IntrGetEnabledPin(XGpioPs *InstancePtr, u32 Pin); +u32 XGpioPs_IntrGetStatusPin(XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_IntrClearPin(XGpioPs *InstancePtr, u32 Pin); + +/* Functions in xgpiops_sinit.c */ +XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_g.c new file mode 100644 index 0000000..76e6947 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_g.c @@ -0,0 +1,55 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xgpiops.h" + +/* +* The configuration table for devices +*/ + +XGpioPs_Config XGpioPs_ConfigTable[XPAR_XGPIOPS_NUM_INSTANCES] = +{ + { + XPAR_PS7_GPIO_0_DEVICE_ID, + XPAR_PS7_GPIO_0_BASEADDR + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_hw.c new file mode 100644 index 0000000..8961c42 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_hw.c @@ -0,0 +1,169 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_hw.c +* @addtogroup gpiops_v3_3 +* @{ +* +* This file contains low level GPIO functions. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.02a hk   08/22/13 First Release
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn  04/13/15 Add support for Zynq Ultrascale+ MP. CR# 856980.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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; + u32 Platform,MaxBanks; + + Platform = XGetPlatform_Info(); + if (Platform == XPLAT_ZYNQ_ULTRA_MP) { + MaxBanks = (u32)6; + } else { + MaxBanks = (u32)4; + } + /* Write reset values to all mask data registers */ + for(BankCount = 2U; BankCount < (u32)MaxBanks; BankCount++) { + + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_DATA_MASK_OFFSET) + + XGPIOPS_DATA_LSW_OFFSET), 0x0U); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_DATA_MASK_OFFSET) + + XGPIOPS_DATA_MSW_OFFSET), 0x0U); + } + /* Write reset values to all output data registers */ + for(BankCount = 2U; BankCount < (u32)MaxBanks; BankCount++) { + + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_DATA_BANK_OFFSET) + + XGPIOPS_DATA_OFFSET), 0x0U); + } + + /* Reset all registers of all GPIO banks */ + for(BankCount = 0U; BankCount < (u32)MaxBanks; BankCount++) { + + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_DIRM_OFFSET), 0x0U); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_OUTEN_OFFSET), 0x0U); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTMASK_OFFSET), 0x0U); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTEN_OFFSET), 0x0U); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTDIS_OFFSET), 0x0U); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTSTS_OFFSET), 0x0U); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET), 0x0U); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTANY_OFFSET), 0x0U); + } + + /* Bank 0 Int type */ + XGpioPs_WriteReg(BaseAddress, XGPIOPS_INTTYPE_OFFSET, + XGPIOPS_INTTYPE_BANK0_RESET); + /* Bank 1 Int type */ + XGpioPs_WriteReg(BaseAddress, + ((u32)XGPIOPS_REG_MASK_OFFSET + (u32)XGPIOPS_INTTYPE_OFFSET), + XGPIOPS_INTTYPE_BANK1_RESET); + /* Bank 2 Int type */ + XGpioPs_WriteReg(BaseAddress, + (((u32)2 * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET), + XGPIOPS_INTTYPE_BANK2_RESET); + /* Bank 3 Int type */ + XGpioPs_WriteReg(BaseAddress, + (((u32)3 * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET), + XGPIOPS_INTTYPE_BANK3_RESET); + + if (Platform == XPLAT_ZYNQ_ULTRA_MP) { + /* Bank 4 Int type */ + XGpioPs_WriteReg(BaseAddress, + (((u32)4 * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET), + XGPIOPS_INTTYPE_BANK4_RESET); + /* Bank 5 Int type */ + XGpioPs_WriteReg(BaseAddress, + (((u32)5 * XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET), + XGPIOPS_INTTYPE_BANK5_RESET); + } + +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_hw.h new file mode 100644 index 0000000..ff01906 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_hw.h @@ -0,0 +1,164 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_hw.h +* @addtogroup gpiops_v3_3 +* @{ +* +* 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. +* +*
    +* 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
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn  04/13/15 Corrected reset values of banks.
    +* 
    +* +******************************************************************************/ +#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 0x00000000U /* Mask and Data Register LSW, WO */ +#define XGPIOPS_DATA_MSW_OFFSET 0x00000004U /* Mask and Data Register MSW, WO */ +#define XGPIOPS_DATA_OFFSET 0x00000040U /* Data Register, RW */ +#define XGPIOPS_DATA_RO_OFFSET 0x00000060U /* Data Register - Input, RO */ +#define XGPIOPS_DIRM_OFFSET 0x00000204U /* Direction Mode Register, RW */ +#define XGPIOPS_OUTEN_OFFSET 0x00000208U /* Output Enable Register, RW */ +#define XGPIOPS_INTMASK_OFFSET 0x0000020CU /* Interrupt Mask Register, RO */ +#define XGPIOPS_INTEN_OFFSET 0x00000210U /* Interrupt Enable Register, WO */ +#define XGPIOPS_INTDIS_OFFSET 0x00000214U /* Interrupt Disable Register, WO*/ +#define XGPIOPS_INTSTS_OFFSET 0x00000218U /* Interrupt Status Register, RO */ +#define XGPIOPS_INTTYPE_OFFSET 0x0000021CU /* Interrupt Type Register, RW */ +#define XGPIOPS_INTPOL_OFFSET 0x00000220U /* Interrupt Polarity Register, RW */ +#define XGPIOPS_INTANY_OFFSET 0x00000224U /* Interrupt On Any Register, RW */ +/* @} */ + +/** @name Register offsets for each Bank. + * @{ + */ +#define XGPIOPS_DATA_MASK_OFFSET 0x00000008U /* Data/Mask Registers offset */ +#define XGPIOPS_DATA_BANK_OFFSET 0x00000004U /* Data Registers offset */ +#define XGPIOPS_REG_MASK_OFFSET 0x00000040U /* Registers offset */ +/* @} */ + +/* For backwards compatibility */ +#define XGPIOPS_BYPM_MASK_OFFSET (u32)0x40 + +/** @name Interrupt type reset values for each bank + * @{ + */ +#ifdef XPAR_PSU_GPIO_0_BASEADDR +#define XGPIOPS_INTTYPE_BANK0_RESET 0x03FFFFFFU /* Resets specific to Zynq Ultrascale+ MP */ +#define XGPIOPS_INTTYPE_BANK1_RESET 0x03FFFFFFU +#define XGPIOPS_INTTYPE_BANK2_RESET 0x03FFFFFFU +#else +#define XGPIOPS_INTTYPE_BANK0_RESET 0xFFFFFFFFU /* Resets specific to Zynq */ +#define XGPIOPS_INTTYPE_BANK1_RESET 0x003FFFFFU +#define XGPIOPS_INTTYPE_BANK2_RESET 0xFFFFFFFFU +#endif + +#define XGPIOPS_INTTYPE_BANK3_RESET 0xFFFFFFFFU /* Reset common to both platforms */ +#define XGPIOPS_INTTYPE_BANK4_RESET 0xFFFFFFFFU /* Resets specific to Zynq Ultrascale+ MP */ +#define XGPIOPS_INTTYPE_BANK5_RESET 0xFFFFFFFFU +/* @} */ + +/**************************** 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) + (u32)(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) + (u32)(RegOffset), (u32)(Data)) + +/************************** Function Prototypes ******************************/ + +void XGpioPs_ResetHw(u32 BaseAddress); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XGPIOPS_HW_H */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_intr.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_intr.c new file mode 100644 index 0000000..a8b0a56 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_intr.c @@ -0,0 +1,731 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_intr.c +* @addtogroup gpiops_v3_3 +* @{ +* +* This file contains functions related to GPIO interrupt handling. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a sv   01/18/10 First Release
    +* 2.2	sk	 10/13/14 Used Pin number in Bank instead of pin number
    +* 					  passed to API's. CR# 822636
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn  04/13/15 Add support for Zynq Ultrascale+ MP. CR# 856980.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xgpiops.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void StubHandler(void *CallBackRef, u32 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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* @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 < InstancePtr->MaxBanks); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_IntrEnablePin(XGpioPs *InstancePtr, u32 Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg = 0U; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + IntrReg = ((u32)1 << (u32)PinNumber); + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* @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 < InstancePtr->MaxBanks); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_IntrDisablePin(XGpioPs *InstancePtr, u32 Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg = 0U; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + IntrReg = ((u32)1 << (u32)PinNumber); + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* +* @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 < InstancePtr->MaxBanks); + + IntrMask = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* +* @return +* - TRUE if the interrupt is enabled. +* - FALSE if the interrupt is disabled. +* +* @note None. +* +*****************************************************************************/ +u32 XGpioPs_IntrGetEnabledPin(XGpioPs *InstancePtr, u32 Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + IntrReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTMASK_OFFSET); + + return (((IntrReg & ((u32)1 << PinNumber)) != (u32)0)? FALSE : TRUE); +} + +/****************************************************************************/ +/** +* +* 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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* +* @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 < InstancePtr->MaxBanks); + + return XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* +* @return +* - TRUE if the interrupt has occurred. +* - FALSE if the interrupt has not occurred. +* +* @note None. +* +*****************************************************************************/ +u32 XGpioPs_IntrGetStatusPin(XGpioPs *InstancePtr, u32 Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + IntrReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTSTS_OFFSET); + + return (((IntrReg & ((u32)1 << PinNumber)) != (u32)0)? 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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* @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 < InstancePtr->MaxBanks); + + /* Clear the currently pending interrupts. */ + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_IntrClearPin(XGpioPs *InstancePtr, u32 Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + /* Clear the specified pending interrupts. */ + IntrReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTSTS_OFFSET); + + IntrReg &= ((u32)1 << PinNumber); + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* @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 < InstancePtr->MaxBanks); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET, IntrType); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET, IntrPolarity); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-3 in Zynq and 0-5 in Zynq Ultrascale+ MP. +* @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 < InstancePtr->MaxBanks); + + *IntrType = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET); + + *IntrPolarity = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET); + + *IntrOnAny = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* @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, u32 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 < InstancePtr->MaxPinNum); + Xil_AssertVoid(IrqType <= XGPIOPS_IRQ_TYPE_LEVEL_LOW); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + IntrTypeReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET); + + IntrPolReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET); + + IntrOnAnyReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTANY_OFFSET); + + switch (IrqType) { + case XGPIOPS_IRQ_TYPE_EDGE_RISING: + IntrTypeReg |= ((u32)1 << (u32)PinNumber); + IntrPolReg |= ((u32)1 << (u32)PinNumber); + IntrOnAnyReg &= ~((u32)1 << (u32)PinNumber); + break; + case XGPIOPS_IRQ_TYPE_EDGE_FALLING: + IntrTypeReg |= ((u32)1 << (u32)PinNumber); + IntrPolReg &= ~((u32)1 << (u32)PinNumber); + IntrOnAnyReg &= ~((u32)1 << (u32)PinNumber); + break; + case XGPIOPS_IRQ_TYPE_EDGE_BOTH: + IntrTypeReg |= ((u32)1 << (u32)PinNumber); + IntrOnAnyReg |= ((u32)1 << (u32)PinNumber); + break; + case XGPIOPS_IRQ_TYPE_LEVEL_HIGH: + IntrTypeReg &= ~((u32)1 << (u32)PinNumber); + IntrPolReg |= ((u32)1 << (u32)PinNumber); + break; + case XGPIOPS_IRQ_TYPE_LEVEL_LOW: + IntrTypeReg &= ~((u32)1 << (u32)PinNumber); + IntrPolReg &= ~((u32)1 << (u32)PinNumber); + break; + default: + /**< Default statement is added for MISRA C compliance. */ + break; + } + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET, IntrTypeReg); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET, IntrPolReg); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(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-117 in Zynq and 0-173 in Zynq Ultrascale+ MP. +* +* @return None. +* +* @note Use XGPIOPS_IRQ_TYPE_* defined in xgpiops.h for the IRQ type +* returned by this function. +* +*****************************************************************************/ +u8 XGpioPs_GetIntrTypePin(XGpioPs *InstancePtr, u32 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 < InstancePtr->MaxPinNum); + + /* Get the Bank number and Pin number within the bank. */ + XGpioPs_GetBankPin((u8)Pin, &Bank, &PinNumber); + + IntrType = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET) & ((u32)1 << PinNumber); + + if (IntrType == ((u32)1 << PinNumber)) { + + IntrOnAny = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTANY_OFFSET) & ((u32)1 << PinNumber); + + IntrPol = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET) & ((u32)1 << PinNumber); + + + if (IntrOnAny == ((u32)1 << PinNumber)) { + IrqType = XGPIOPS_IRQ_TYPE_EDGE_BOTH; + } else if (IntrPol == ((u32)1 << PinNumber)) { + IrqType = XGPIOPS_IRQ_TYPE_EDGE_RISING; + } else { + IrqType = XGPIOPS_IRQ_TYPE_EDGE_FALLING; + } + } else { + + IntrPol = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((u32)(Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET) & ((u32)1 << PinNumber); + + if (IntrPol == ((u32)1 << PinNumber)) { + 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 FuncPointer) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(FuncPointer != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + InstancePtr->Handler = FuncPointer; + 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 = 0U; Bank < InstancePtr->MaxBanks; Bank++) { + IntrStatus = XGpioPs_IntrGetStatus(InstancePtr, Bank); + if (IntrStatus != (u32)0) { + IntrEnabled = XGpioPs_IntrGetEnabled(InstancePtr, + Bank); + XGpioPs_IntrClear((XGpioPs *)InstancePtr, Bank, + (IntrStatus & IntrEnabled)); + InstancePtr->Handler(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, u32 Bank, u32 Status) +{ + (void) CallBackRef; + (void) Bank; + (void) Status; + + Xil_AssertVoidAlways(); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_selftest.c new file mode 100644 index 0000000..378524c --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_selftest.c @@ -0,0 +1,133 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_selftest.c +* @addtogroup gpiops_v3_3 +* @{ +* +* This file contains a diagnostic self-test function for the XGpioPs driver. +* +* Read xgpiops.h file for more information. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a sv   01/18/10 First Release
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +*****************************************************************************/ + +/***************************** 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. +* +* +******************************************************************************/ +s32 XGpioPs_SelfTest(XGpioPs *InstancePtr) +{ + s32 Status = XST_SUCCESS; + u32 IntrEnabled; + u32 CurrentIntrType = 0U; + u32 CurrentIntrPolarity = 0U; + u32 CurrentIntrOnAny = 0U; + u32 IntrType = 0U; + u32 IntrPolarity = 0U; + u32 IntrOnAny = 0U; + u32 IntrTestValue = 0x22U; + + 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_sinit.c new file mode 100644 index 0000000..4cc0c39 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/gpiops_v3_3/src/xgpiops_sinit.c @@ -0,0 +1,101 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_sinit.c +* @addtogroup gpiops_v3_3 +* @{ +* +* This file contains the implementation of the XGpioPs driver's static +* initialization functionality. +* +* @note None. +* +*
    +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a sv   01/15/10 First Release
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xgpiops.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +extern XGpioPs_Config XGpioPs_ConfigTable[XPAR_XGPIOPS_NUM_INSTANCES]; + +/*****************************************************************************/ +/** +* +* 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 = 0U; Index < (u32)XPAR_XGPIOPS_NUM_INSTANCES; Index++) { + if (XGpioPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XGpioPs_ConfigTable[Index]; + break; + } + } + + return (XGpioPs_Config *)CfgPtr; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps.c new file mode 100644 index 0000000..9546b54 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps.c @@ -0,0 +1,333 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps.c +* @addtogroup iicps_v3_7 +* @{ +* +* Contains implementation of required functions for the XIicPs driver. +* See xiicps.h for detailed description of the device and driver. +* +*
     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.
    +* 2.1   hk      04/25/14 Explicitly reset CR and clear FIFO in Abort function
    +*                        and state the same in the comments. CR# 784254.
    +*                        Fix for CR# 761060 - provision for repeated start.
    +* 2.3	sk		10/07/14 Repeated start feature removed.
    +* 3.0	sk		11/03/14 Modified TimeOut Register value to 0xFF
    +* 						 in XIicPs_Reset.
    +*				12/06/14 Implemented Repeated start feature.
    +*				01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +* 3.3   kvn		05/05/16 Modified latest code for MISRA-C:2012 Compliance.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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. +* +******************************************************************************/ +s32 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 = (u32)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); + + /* Initialize repeated start flag to 0 */ + InstancePtr->IsRepeatedStart = 0; + + return (s32)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. +* +******************************************************************************/ +s32 XIicPs_BusIsBusy(XIicPs *InstancePtr) +{ + u32 StatusReg; + s32 Status; + + StatusReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_SR_OFFSET); + if ((StatusReg & XIICPS_SR_BA_MASK) != 0x0U) { + Status = (s32)TRUE; + }else { + Status = (s32)FALSE; + } + return Status; +} + +/*****************************************************************************/ +/** +* +* 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) ((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 == (u32)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); + + /* + * Reset the settings in config register and clear the FIFOs. + */ + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET, + (u32)XIICPS_CR_RESET_VALUE | (u32)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 = (u32)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 == (u32)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. +* +******************************************************************************/ +s32 TransmitFifoFill(XIicPs *InstancePtr) +{ + u8 AvailBytes; + s32 LoopCnt; + s32 NumBytesToSend; + + /* + * Determine number of bytes to write to FIFO. + */ + AvailBytes = (u8)XIICPS_FIFO_DEPTH - + (u8)XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_TRANS_SIZE_OFFSET); + + if (InstancePtr->SendByteCount > (s32)AvailBytes) { + NumBytesToSend = (s32)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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps.h new file mode 100644 index 0000000..d3713de --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps.h @@ -0,0 +1,425 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps.h +* @addtogroup iicps_v3_7 +* @{ +* @details +* +* 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. +* +* Initialization & Configuration +* +* 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. +* +* Multiple Masters +* +* More than one master can exist, bus arbitration is defined in the IIC +* standard. Lost of arbitration causes arbitration loss interrupt on the device. +* +* Multiple Slaves +* +* 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. +* +* Addressing +* +* 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. +* +* FIFO Size +* 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. +* +* Data Rates +* +* 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. +* +* Polled Mode Operation +* +* This driver supports polled mode transfers. +* +* Interrupts +* +* 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 +* +* Bus Busy +* +* Bus busy is checked before the setup of a master mode device, to avoid +* unnecessary arbitration loss interrupt. +* +* RTOS Independence +* +* 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. +* +*Repeated Start +* +* The I2C controller does not indicate completion of a receive transfer if HOLD +* bit is set. Due to this errata, repeated start cannot be used if a receive +* transfer is followed by any other transfer. +* +*
     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.
    +* 2.0   hk  03/07/14 Added check for error status in the while loop that
    +*                    checks for completion.
    +*                    (XIicPs_MasterSendPolled function). CR# 762244, 764875.
    +*                    Limited frequency set when 100KHz or 400KHz is
    +*                    selected. This is a hardware limitation. CR#779290.
    +* 2.1   hk  04/24/14 Fix for CR# 789821 to handle >14 byte transfers.
    +*                    Explicitly reset CR and clear FIFO in Abort function
    +*                    and state the same in the comments. CR# 784254.
    +*                    Fix for CR# 761060 - provision for repeated start.
    +* 2.2   hk  08/23/14 Slave monitor mode changes - clear FIFO, enable
    +*                    read mode and clear transfer size register.
    +*                    Disable NACK to avoid interrupts on each retry.
    +* 2.3	sk	10/07/14 Repeated start feature deleted.
    +* 3.0	sk	11/03/14 Modified TimeOut Register value to 0xFF
    +* 					 in XIicPs_Reset.
    +* 			12/06/14 Implemented Repeated start feature.
    +*			01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +*			02/18/15 Implemented larger data transfer using repeated start
    +*					  in Zynq UltraScale MP.
    +* 3.3   kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +* 3.7   ask  04/17/18 Updated the Eeprom scanning mechanism
    +*                     as per the other examples (CR#997545)
    +*
    +* 
    +* +******************************************************************************/ + +#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" +#include "xplatform_info.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 0x01U /**< 7-bit address mode */ +#define XIICPS_10_BIT_ADDR_OPTION 0x02U /**< 10-bit address mode */ +#define XIICPS_SLAVE_MON_OPTION 0x04U /**< Slave monitor mode */ +#define XIICPS_REP_START_OPTION 0x08U /**< 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 0x0001U /**< Transmit Complete Event*/ +#define XIICPS_EVENT_COMPLETE_RECV 0x0002U /**< Receive Complete Event*/ +#define XIICPS_EVENT_TIME_OUT 0x0004U /**< Transfer timed out */ +#define XIICPS_EVENT_ERROR 0x0008U /**< Receive error */ +#define XIICPS_EVENT_ARB_LOST 0x0010U /**< Arbitration lost */ +#define XIICPS_EVENT_NACK 0x0020U /**< NACK Received */ +#define XIICPS_EVENT_SLAVE_RDY 0x0040U /**< Slave ready */ +#define XIICPS_EVENT_RX_OVR 0x0080U /**< RX overflow */ +#define XIICPS_EVENT_TX_OVR 0x0100U /**< TX overflow */ +#define XIICPS_EVENT_RX_UNF 0x0200U /**< 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 */ + +/* Maximum transfer size */ +#define XIICPS_MAX_TRANSFER_SIZE (u32)(255U - 3U) + +/**************************** 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 */ + s32 SendByteCount; /* Number of bytes still expected to send */ + s32 RecvByteCount; /* Number of bytes still expected to receive */ + s32 CurrByteCount; /* No. of bytes expected in current transfer */ + + s32 UpdateTxSize; /* If tx size register has to be updated */ + s32 IsSend; /* Whether master is sending or receiving */ + s32 IsRepeatedStart; /* Indicates if user set repeated start */ + + 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) \ +{ \ + u8 Data; \ + Data = *((InstancePtr)->SendBufferPtr); \ + XIicPs_Out32((InstancePtr)->Config.BaseAddress \ + + (u32)(XIICPS_DATA_OFFSET), \ + (u32)(Data)); \ + (InstancePtr)->SendBufferPtr += 1; \ + (InstancePtr)->SendByteCount -= 1;\ +} + +/****************************************************************************/ +/* +* +* 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) \ +{ \ + u8 *Data, Value; \ + Value = (u8)(XIicPs_In32((InstancePtr)->Config.BaseAddress \ + + (u32)XIICPS_DATA_OFFSET)); \ + Data = &Value; \ + *(InstancePtr)->RecvBufferPtr = *Data; \ + (InstancePtr)->RecvBufferPtr += 1; \ + (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 + */ +s32 XIicPs_CfgInitialize(XIicPs *InstancePtr, XIicPs_Config * ConfigPtr, + u32 EffectiveAddr); + +void XIicPs_Abort(XIicPs *InstancePtr); +void XIicPs_Reset(XIicPs *InstancePtr); + +s32 XIicPs_BusIsBusy(XIicPs *InstancePtr); +s32 TransmitFifoFill(XIicPs *InstancePtr); + +/* + * Functions for interrupts, in xiicps_intr.c + */ +void XIicPs_SetStatusHandler(XIicPs *InstancePtr, void *CallBackRef, + XIicPs_IntrHandler FunctionPtr); + +/* + * Functions for device as master, in xiicps_master.c + */ +void XIicPs_MasterSend(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount, + u16 SlaveAddr); +void XIicPs_MasterRecv(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount, + u16 SlaveAddr); +s32 XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount, + u16 SlaveAddr); +s32 XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 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, s32 ByteCount); +void XIicPs_SlaveRecv(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount); +s32 XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount); +s32 XIicPs_SlaveRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount); +void XIicPs_SlaveInterruptHandler(XIicPs *InstancePtr); + +/* + * Functions for selftest, in xiicps_selftest.c + */ +s32 XIicPs_SelfTest(XIicPs *InstancePtr); + +/* + * Functions for setting and getting data rate, in xiicps_options.c + */ +s32 XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options); +s32 XIicPs_ClearOptions(XIicPs *InstancePtr, u32 Options); +u32 XIicPs_GetOptions(XIicPs *InstancePtr); + +s32 XIicPs_SetSClk(XIicPs *InstancePtr, u32 FsclHz); +u32 XIicPs_GetSClk(XIicPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_g.c new file mode 100644 index 0000000..64ac648 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_g.c @@ -0,0 +1,56 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xiicps.h" + +/* +* The configuration table for devices +*/ + +XIicPs_Config XIicPs_ConfigTable[XPAR_XIICPS_NUM_INSTANCES] = +{ + { + XPAR_PS7_I2C_0_DEVICE_ID, + XPAR_PS7_I2C_0_BASEADDR, + XPAR_PS7_I2C_0_I2C_CLK_FREQ_HZ + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_hw.c new file mode 100644 index 0000000..ce81d92 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_hw.c @@ -0,0 +1,111 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_hw.c +* @addtogroup iicps_v3_7 +* @{ +* +* Contains implementation of required functions for providing the reset sequence +* to the i2c interface +* +*
     MODIFICATION HISTORY:
    +*
    +* Ver   Who     Date     Changes
    +* ----- ------  -------- --------------------------------------------
    +* 1.04a kpc     11/07/13 First release
    +* 3.0	sk		11/03/14 Modified TimeOut Register value to 0xFF
    +*				01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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, XIICPS_TO_RESET_VALUE); + /* Clear the transfer size register */ + XIicPs_WriteReg(BaseAddress, XIICPS_TRANS_SIZE_OFFSET, 0x0U); + /* 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, 0x0U); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_hw.h new file mode 100644 index 0000000..e9d63ec --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_hw.h @@ -0,0 +1,383 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_hw.h +* @addtogroup iicps_v3_7 +* @{ +* +* This header file contains the hardware definition for an IIC device. +* It includes register definitions and interface functions to read/write +* the registers. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who 	Date     Changes
    +* ----- ------  -------- -----------------------------------------------
    +* 1.00a drg/jz  01/30/10 First release
    +* 1.04a kpc		11/07/13 Added function prototype.
    +* 3.0	sk		11/03/14 Modified the TimeOut Register value to 0xFF
    +*				01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +* 
    +* +******************************************************************************/ +#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 0x00U /**< 32-bit Control */ +#define XIICPS_SR_OFFSET 0x04U /**< Status */ +#define XIICPS_ADDR_OFFSET 0x08U /**< IIC Address */ +#define XIICPS_DATA_OFFSET 0x0CU /**< IIC FIFO Data */ +#define XIICPS_ISR_OFFSET 0x10U /**< Interrupt Status */ +#define XIICPS_TRANS_SIZE_OFFSET 0x14U /**< Transfer Size */ +#define XIICPS_SLV_PAUSE_OFFSET 0x18U /**< Slave monitor pause */ +#define XIICPS_TIME_OUT_OFFSET 0x1CU /**< Time Out */ +#define XIICPS_IMR_OFFSET 0x20U /**< Interrupt Enabled Mask */ +#define XIICPS_IER_OFFSET 0x24U /**< Interrupt Enable */ +#define XIICPS_IDR_OFFSET 0x28U /**< 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 0x0000C000U /**< Clock Divisor A */ +#define XIICPS_CR_DIV_A_SHIFT 14U /**< Clock Divisor A shift */ +#define XIICPS_DIV_A_MAX 4U /**< Maximum value of Divisor A */ +#define XIICPS_CR_DIV_B_MASK 0x00003F00U /**< Clock Divisor B */ +#define XIICPS_CR_DIV_B_SHIFT 8U /**< Clock Divisor B shift */ +#define XIICPS_CR_CLR_FIFO_MASK 0x00000040U /**< Clear FIFO, auto clears*/ +#define XIICPS_CR_SLVMON_MASK 0x00000020U /**< Slave monitor mode */ +#define XIICPS_CR_HOLD_MASK 0x00000010U /**< Hold bus 1=Hold scl, + 0=terminate transfer */ +#define XIICPS_CR_ACKEN_MASK 0x00000008U /**< Enable TX of ACK when + Master receiver*/ +#define XIICPS_CR_NEA_MASK 0x00000004U /**< Addressing Mode 1=7 bit, + 0=10 bit */ +#define XIICPS_CR_MS_MASK 0x00000002U /**< Master mode bit 1=Master, + 0=Slave */ +#define XIICPS_CR_RD_WR_MASK 0x00000001U /**< Read or Write Master + transfer 0=Transmitter, + 1=Receiver*/ +#define XIICPS_CR_RESET_VALUE 0U /**< 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 0x00000100U /**< Bus Active Mask */ +#define XIICPS_SR_RXOVF_MASK 0x00000080U /**< Receiver Overflow Mask */ +#define XIICPS_SR_TXDV_MASK 0x00000040U /**< Transmit Data Valid Mask */ +#define XIICPS_SR_RXDV_MASK 0x00000020U /**< Receiver Data Valid Mask */ +#define XIICPS_SR_RXRW_MASK 0x00000008U /**< 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 + * + * IIC Interrupt Status Register + * + * 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. + * + * IIC Interrupt Enable Register + * + * 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. + * + * IIC Interrupt Disable Register + * + * 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. + * + * IIC Interrupt Mask Register + * + * 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 0x00000200U /**< Arbitration Lost Interrupt + mask */ +#define XIICPS_IXR_RX_UNF_MASK 0x00000080U /**< FIFO Recieve Underflow + Interrupt mask */ +#define XIICPS_IXR_TX_OVR_MASK 0x00000040U /**< Transmit Overflow + Interrupt mask */ +#define XIICPS_IXR_RX_OVR_MASK 0x00000020U /**< Receive Overflow Interrupt + mask */ +#define XIICPS_IXR_SLV_RDY_MASK 0x00000010U /**< Monitored Slave Ready + Interrupt mask */ +#define XIICPS_IXR_TO_MASK 0x00000008U /**< Transfer Time Out + Interrupt mask */ +#define XIICPS_IXR_NACK_MASK 0x00000004U /**< NACK Interrupt mask */ +#define XIICPS_IXR_DATA_MASK 0x00000002U /**< Data Interrupt mask */ +#define XIICPS_IXR_COMP_MASK 0x00000001U /**< Transfer Complete + Interrupt mask */ +#define XIICPS_IXR_DEFAULT_MASK 0x000002FFU /**< Default ISR Mask */ +#define XIICPS_IXR_ALL_INTR_MASK 0x000002FFU /**< 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 0x000000FFU /**< IIC Time Out mask */ +#define XIICPS_TO_RESET_VALUE 0x000000FFU /**< 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) + (u32)(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) + (u32)(RegOffset), (u32)(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 BaseAddress); +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_intr.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_intr.c new file mode 100644 index 0000000..6dccff4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_intr.c @@ -0,0 +1,101 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_intr.c +* @addtogroup iicps_v3_7 +* @{ +* +* Contains functions of the XIicPs driver for interrupt-driven transfers. +* See xiicps.h for a detailed description of the device and driver. +* +*
     MODIFICATION HISTORY:
    +*
    +* Ver   Who     Date     Changes
    +* ----- ------  -------- -----------------------------------------------
    +* 1.00a drg/jz  01/30/10 First release
    +* 3.00	sk		01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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 FunctionPtr 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 FunctionPtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(FunctionPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + InstancePtr->StatusHandler = FunctionPtr; + InstancePtr->CallBackRef = CallBackRef; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_master.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_master.c new file mode 100644 index 0000000..5554209 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_master.c @@ -0,0 +1,999 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_master.c +* @addtogroup iicps_v3_7 +* @{ +* +* Handles master mode transfers. +* +*
     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.
    +* 2.0   hk   03/07/14 Added check for error status in the while loop that
    +*                     checks for completion. CR# 762244, 764875.
    +* 2.1   hk   04/24/14 Fix for CR# 789821 to handle >14 byte transfers.
    +*                     Fix for CR# 761060 - provision for repeated start.
    +* 2.2   hk   08/23/14 Slave monitor mode changes - clear FIFO, enable
    +*                     read mode and clear transfer size register.
    +*                     Disable NACK to avoid interrupts on each retry.
    +* 2.3	sk	 10/06/14 Fill transmit fifo before address register when sending.
    +* 					  Replaced XIICPS_DATA_INTR_DEPTH with XIICPS_FIFO_DEPTH.
    +* 					  Repeated start feature removed.
    +* 3.0	sk	 12/06/14 Implemented Repeated start feature.
    +*			 01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +*			 02/18/15 Implemented larger data transfer using repeated start
    +*					  in Zynq UltraScale MP.
    +* 3.3   kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
    +* 3.6   ask 09/03/18 In XIicPs_MasterRecvPolled, set transfer size register
    +* 		     before slave address. Fix for CR996440.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +s32 TransmitFifoFill(XIicPs *InstancePtr); + +static s32 XIicPs_SetupMaster(XIicPs *InstancePtr, s32 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, s32 ByteCount, + u16 SlaveAddr) +{ + u32 BaseAddr; + u32 Platform = XGetPlatform_Info(); + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(MsgPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertVoid(XIICPS_ADDR_MASK >= SlaveAddr); + + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->SendBufferPtr = MsgPtr; + InstancePtr->SendByteCount = ByteCount; + InstancePtr->RecvBufferPtr = NULL; + InstancePtr->IsSend = 1; + + /* + * Set repeated start if sending more than FIFO of data. + */ + if (((InstancePtr->IsRepeatedStart) != 0)|| + ((ByteCount > XIICPS_FIFO_DEPTH) != 0U)) { + XIicPs_WriteReg(BaseAddr, (u32)XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, (u32)XIICPS_CR_OFFSET) | + (u32)XIICPS_CR_HOLD_MASK); + } + + /* + * Setup as a master sending role. + */ + (void)XIicPs_SetupMaster(InstancePtr, SENDING_ROLE); + + (void)TransmitFifoFill(InstancePtr); + + XIicPs_EnableInterrupts(BaseAddr, + (u32)XIICPS_IXR_NACK_MASK | (u32)XIICPS_IXR_COMP_MASK | + (u32)XIICPS_IXR_ARB_LOST_MASK); + /* + * Do the address transfer to notify the slave. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, (u32)SlaveAddr); + + /* Clear the Hold bit in ZYNQ if receive byte count is less than + * the FIFO depth to get the completion interrupt properly. + */ + if ((ByteCount < XIICPS_FIFO_DEPTH) && (Platform == (u32)XPLAT_ZYNQ)) + { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, (u32)XIICPS_CR_OFFSET) & + (u32)(~XIICPS_CR_HOLD_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, s32 ByteCount, + u16 SlaveAddr) +{ + u32 BaseAddr; + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(MsgPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertVoid(XIICPS_ADDR_MASK >= SlaveAddr); + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->RecvBufferPtr = MsgPtr; + InstancePtr->RecvByteCount = ByteCount; + InstancePtr->SendBufferPtr = NULL; + InstancePtr->IsSend = 0; + + if ((ByteCount > XIICPS_FIFO_DEPTH) || + ((InstancePtr->IsRepeatedStart) !=0)) + { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, (u32)XIICPS_CR_OFFSET) | + (u32)XIICPS_CR_HOLD_MASK); + } + + /* + * Initialize for a master receiving role. + */ + (void)XIicPs_SetupMaster(InstancePtr, RECVING_ROLE); + /* + * Setup the transfer size register so the slave knows how much + * to send to us. + */ + if (ByteCount > (s32)XIICPS_MAX_TRANSFER_SIZE) { + XIicPs_WriteReg(BaseAddr, XIICPS_TRANS_SIZE_OFFSET, + XIICPS_MAX_TRANSFER_SIZE); + InstancePtr->CurrByteCount = (s32)XIICPS_MAX_TRANSFER_SIZE; + InstancePtr->UpdateTxSize = 1; + }else { + InstancePtr->CurrByteCount = ByteCount; + XIicPs_WriteReg(BaseAddr, (u32)(XIICPS_TRANS_SIZE_OFFSET), + (u32)ByteCount); + InstancePtr->UpdateTxSize = 0; + } + + XIicPs_EnableInterrupts(BaseAddr, + (u32)XIICPS_IXR_NACK_MASK | (u32)XIICPS_IXR_DATA_MASK | + (u32)XIICPS_IXR_RX_OVR_MASK | (u32)XIICPS_IXR_COMP_MASK | + (u32)XIICPS_IXR_ARB_LOST_MASK); + /* + * Do the address transfer to signal the slave. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, (u32)SlaveAddr); + +} + +/*****************************************************************************/ +/** +* 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. +* +****************************************************************************/ +s32 XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, + s32 ByteCount, u16 SlaveAddr) +{ + u32 IntrStatusReg; + u32 StatusReg; + u32 BaseAddr; + u32 Intrs; + _Bool Value; + + /* + * Assert validates the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(MsgPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((u16)XIICPS_ADDR_MASK >= SlaveAddr); + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->SendBufferPtr = MsgPtr; + InstancePtr->SendByteCount = ByteCount; + + if (((InstancePtr->IsRepeatedStart) != 0) || + ((ByteCount > XIICPS_FIFO_DEPTH) != 0U)) { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, (u32)XIICPS_CR_OFFSET) | + (u32)XIICPS_CR_HOLD_MASK); + } + + (void)XIicPs_SetupMaster(InstancePtr, SENDING_ROLE); + + /* + * Intrs keeps all the error-related interrupts. + */ + Intrs = (u32)XIICPS_IXR_ARB_LOST_MASK | (u32)XIICPS_IXR_TX_OVR_MASK | + (u32)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. + */ + (void)TransmitFifoFill(InstancePtr); + + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, (u32)SlaveAddr); + + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + + /* + * Continue sending as long as there is more data and + * there are no errors. + */ + Value = ((InstancePtr->SendByteCount > (s32)0) && + ((IntrStatusReg & Intrs) == (u32)0U)); + while (Value != FALSE) { + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + + /* + * Wait until transmit FIFO is empty. + */ + if ((StatusReg & XIICPS_SR_TXDV_MASK) != 0U) { + IntrStatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_ISR_OFFSET); + Value = ((InstancePtr->SendByteCount > (s32)0) && + ((IntrStatusReg & Intrs) == (u32)0U)); + continue; + } + + /* + * Send more data out through transmit FIFO. + */ + (void)TransmitFifoFill(InstancePtr); + Value = ((InstancePtr->SendByteCount > (s32)0) && + ((IntrStatusReg & Intrs) == (u32)0U)); + } + + /* + * Check for completion of transfer. + */ + while ((IntrStatusReg & XIICPS_IXR_COMP_MASK) != XIICPS_IXR_COMP_MASK){ + + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + /* + * If there is an error, tell the caller. + */ + if ((IntrStatusReg & Intrs) != 0U) { + return (s32)XST_FAILURE; + } + } + + if ((!(InstancePtr->IsRepeatedStart)) != 0) { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr,XIICPS_CR_OFFSET) & + (~XIICPS_CR_HOLD_MASK)); + } + + return (s32)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. +* +****************************************************************************/ +s32 XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, + s32 ByteCount, u16 SlaveAddr) +{ + u32 IntrStatusReg; + u32 Intrs; + u32 StatusReg; + u32 BaseAddr; + s32 Result; + s32 IsHold; + s32 UpdateTxSize = 0; + s32 ByteCountVar = ByteCount; + u32 Platform; + + /* + * Assert validates the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(MsgPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(XIICPS_ADDR_MASK >= SlaveAddr); + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->RecvBufferPtr = MsgPtr; + InstancePtr->RecvByteCount = ByteCountVar; + + Platform = XGetPlatform_Info(); + + if((ByteCountVar > XIICPS_FIFO_DEPTH) || + ((InstancePtr->IsRepeatedStart) !=0)) + { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, (u32)XIICPS_CR_OFFSET) | + (u32)XIICPS_CR_HOLD_MASK); + IsHold = 1; + } else { + IsHold = 0; + } + + (void)XIicPs_SetupMaster(InstancePtr, RECVING_ROLE); + + /* + * 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 (ByteCountVar > (s32)XIICPS_MAX_TRANSFER_SIZE) { + XIicPs_WriteReg(BaseAddr, XIICPS_TRANS_SIZE_OFFSET, + XIICPS_MAX_TRANSFER_SIZE); + ByteCountVar = (s32)XIICPS_MAX_TRANSFER_SIZE; + UpdateTxSize = 1; + }else { + XIicPs_WriteReg(BaseAddr, XIICPS_TRANS_SIZE_OFFSET, + ByteCountVar); + } + + + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr); + + /* + * Intrs keeps all the error-related interrupts. + */ + Intrs = (u32)XIICPS_IXR_ARB_LOST_MASK | (u32)XIICPS_IXR_RX_OVR_MASK | + (u32)XIICPS_IXR_RX_UNF_MASK | (u32)XIICPS_IXR_NACK_MASK; + /* + * Poll the interrupt status register to find the errors. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + while ((InstancePtr->RecvByteCount > 0) && + ((IntrStatusReg & Intrs) == 0U)) { + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + + while ((StatusReg & XIICPS_SR_RXDV_MASK) != 0U) { + if (((InstancePtr->RecvByteCount < + XIICPS_DATA_INTR_DEPTH) != 0U) && (IsHold != 0) && + ((!InstancePtr->IsRepeatedStart) != 0) && + (UpdateTxSize == 0)) { + IsHold = 0; + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, + XIICPS_CR_OFFSET) & + (~XIICPS_CR_HOLD_MASK)); + } + XIicPs_RecvByte(InstancePtr); + ByteCountVar --; + + if (Platform == (u32)XPLAT_ZYNQ) { + if ((UpdateTxSize != 0) && + (ByteCountVar == (XIICPS_FIFO_DEPTH + 1))) { + break; + } + } + + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + } + if (Platform == (u32)XPLAT_ZYNQ) { + if ((UpdateTxSize != 0) && + (ByteCountVar == (XIICPS_FIFO_DEPTH + 1))) { + /* wait while fifo is full */ + while (XIicPs_ReadReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET) != + (u32)(ByteCountVar - XIICPS_FIFO_DEPTH)) { ; + } + + if ((InstancePtr->RecvByteCount - XIICPS_FIFO_DEPTH) > + (s32)XIICPS_MAX_TRANSFER_SIZE) { + + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + XIICPS_MAX_TRANSFER_SIZE); + ByteCountVar = (s32)XIICPS_MAX_TRANSFER_SIZE + + XIICPS_FIFO_DEPTH; + } else { + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + InstancePtr->RecvByteCount - + XIICPS_FIFO_DEPTH); + UpdateTxSize = 0; + ByteCountVar = InstancePtr->RecvByteCount; + } + } + } else { + if ((InstancePtr->RecvByteCount > 0) && (ByteCountVar == 0)) { + /* + * Clear the interrupt status register before use it to + * monitor. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg); + + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr); + + if ((InstancePtr->RecvByteCount) > + (s32)XIICPS_MAX_TRANSFER_SIZE) { + + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + XIICPS_MAX_TRANSFER_SIZE); + ByteCountVar = (s32)XIICPS_MAX_TRANSFER_SIZE; + } else { + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + InstancePtr->RecvByteCount); + UpdateTxSize = 0; + ByteCountVar = InstancePtr->RecvByteCount; + } + } + } + + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + } + + if ((!(InstancePtr->IsRepeatedStart)) != 0) { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr,XIICPS_CR_OFFSET) & + (~XIICPS_CR_HOLD_MASK)); + } + if ((IntrStatusReg & Intrs) != 0x0U) { + Result = (s32)XST_FAILURE; + } + else { + Result = (s32)XST_SUCCESS; + } + + return Result; +} + +/*****************************************************************************/ +/** +* 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; + u32 ConfigReg; + + Xil_AssertVoid(InstancePtr != NULL); + + BaseAddr = InstancePtr->Config.BaseAddress; + + /* Clear transfer size register */ + XIicPs_WriteReg(BaseAddr, (u32)XIICPS_TRANS_SIZE_OFFSET, 0x0U); + + /* + * Enable slave monitor mode in control register. + */ + ConfigReg = XIicPs_ReadReg(BaseAddr, (u32)XIICPS_CR_OFFSET); + ConfigReg |= (u32)XIICPS_CR_MS_MASK | (u32)XIICPS_CR_NEA_MASK | + (u32)XIICPS_CR_CLR_FIFO_MASK | (u32)XIICPS_CR_SLVMON_MASK; + ConfigReg &= (u32)(~XIICPS_CR_RD_WR_MASK); + + XIicPs_WriteReg(BaseAddr, (u32)XIICPS_CR_OFFSET, ConfigReg); + + /* + * Set up interrupt flag for slave monitor interrupt. + * Dont enable NACK. + */ + XIicPs_EnableInterrupts(BaseAddr, (u32)XIICPS_IXR_SLV_RDY_MASK); + + /* + * Initialize the slave monitor register. + */ + XIicPs_WriteReg(BaseAddr, (u32)XIICPS_SLV_PAUSE_OFFSET, 0xFU); + + /* + * Set the slave address to start the slave address transmission. + */ + XIicPs_WriteReg(BaseAddr, (u32)XIICPS_ADDR_OFFSET, (u32)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)); + + /* + * wait for slv monitor control bit to be clear + */ + while (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. +* +*
    +* 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.
    +*
    +* 
    +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr) +{ + u32 IntrStatusReg; + u32 StatusEvent = 0U; + u32 BaseAddr; + u16 SlaveAddr; + s32 ByteCnt; + s32 IsHold; + u32 Platform; + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + BaseAddr = InstancePtr->Config.BaseAddress; + + Platform = XGetPlatform_Info(); + + /* + * Read the Interrupt status register. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, + (u32)XIICPS_ISR_OFFSET); + + /* + * Write the status back to clear the interrupts so no events are + * missed while processing this interrupt. + */ + XIicPs_WriteReg(BaseAddr, (u32)XIICPS_ISR_OFFSET, IntrStatusReg); + + /* + * Use the Mask register AND with the Interrupt Status register so + * disabled interrupts are not processed. + */ + IntrStatusReg &= ~(XIicPs_ReadReg(BaseAddr, (u32)XIICPS_IMR_OFFSET)); + + ByteCnt = InstancePtr->CurrByteCount; + + IsHold = 0; + if ((XIicPs_ReadReg(BaseAddr, (u32)XIICPS_CR_OFFSET) & (u32)XIICPS_CR_HOLD_MASK) != 0U) { + IsHold = 1; + } + + /* + * Send + */ + if (((InstancePtr->IsSend) != 0) && + ((u32)0U != (IntrStatusReg & (u32)XIICPS_IXR_COMP_MASK))) { + if (InstancePtr->SendByteCount > 0) { + MasterSendData(InstancePtr); + } else { + StatusEvent |= XIICPS_EVENT_COMPLETE_SEND; + } + } + + + /* + * Receive + */ + if (((!(InstancePtr->IsSend))!= 0) && + ((0 != (IntrStatusReg & (u32)XIICPS_IXR_DATA_MASK)) || + (0 != (IntrStatusReg & (u32)XIICPS_IXR_COMP_MASK)))){ + + while ((XIicPs_ReadReg(BaseAddr, (u32)XIICPS_SR_OFFSET) & + XIICPS_SR_RXDV_MASK) != 0U) { + if (((InstancePtr->RecvByteCount < + XIICPS_DATA_INTR_DEPTH)!= 0U) && (IsHold != 0) && + ((!InstancePtr->IsRepeatedStart)!= 0) && + (InstancePtr->UpdateTxSize == 0)) { + IsHold = 0; + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, + XIICPS_CR_OFFSET) & + (~XIICPS_CR_HOLD_MASK)); + } + XIicPs_RecvByte(InstancePtr); + ByteCnt--; + + if (Platform == (u32)XPLAT_ZYNQ) { + if ((InstancePtr->UpdateTxSize != 0) && + (ByteCnt == (XIICPS_FIFO_DEPTH + 1))) { + break; + } + } + } + + if (Platform == (u32)XPLAT_ZYNQ) { + if ((InstancePtr->UpdateTxSize != 0) && + (ByteCnt == (XIICPS_FIFO_DEPTH + 1))) { + /* wait while fifo is full */ + while (XIicPs_ReadReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET) != + (u32)(ByteCnt - XIICPS_FIFO_DEPTH)) { + } + + if ((InstancePtr->RecvByteCount - XIICPS_FIFO_DEPTH) > + (s32)XIICPS_MAX_TRANSFER_SIZE) { + + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + XIICPS_MAX_TRANSFER_SIZE); + ByteCnt = (s32)XIICPS_MAX_TRANSFER_SIZE + + XIICPS_FIFO_DEPTH; + } else { + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + InstancePtr->RecvByteCount - + XIICPS_FIFO_DEPTH); + InstancePtr->UpdateTxSize = 0; + ByteCnt = InstancePtr->RecvByteCount; + } + } + } else { + if ((InstancePtr->RecvByteCount > 0) && (ByteCnt == 0)) { + /* + * Clear the interrupt status register before use it to + * monitor. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg); + + SlaveAddr = (u16)XIicPs_ReadReg(BaseAddr, (u32)XIICPS_ADDR_OFFSET); + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr); + + if ((InstancePtr->RecvByteCount) > + (s32)XIICPS_MAX_TRANSFER_SIZE) { + + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + XIICPS_MAX_TRANSFER_SIZE); + ByteCnt = (s32)XIICPS_MAX_TRANSFER_SIZE; + } else { + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + InstancePtr->RecvByteCount); + InstancePtr->UpdateTxSize = 0; + ByteCnt = InstancePtr->RecvByteCount; + } + XIicPs_EnableInterrupts(BaseAddr, + (u32)XIICPS_IXR_NACK_MASK | (u32)XIICPS_IXR_DATA_MASK | + (u32)XIICPS_IXR_RX_OVR_MASK | (u32)XIICPS_IXR_COMP_MASK | + (u32)XIICPS_IXR_ARB_LOST_MASK); + } + } + InstancePtr->CurrByteCount = ByteCnt; + } + + if (((!(InstancePtr->IsSend)) != 0) && + (0U != (IntrStatusReg & XIICPS_IXR_COMP_MASK))) { + /* + * If all done, tell the application. + */ + if (InstancePtr->RecvByteCount == 0){ + if ((!(InstancePtr->IsRepeatedStart)) != 0) { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, + XIICPS_CR_OFFSET) & + (~XIICPS_CR_HOLD_MASK)); + } + StatusEvent |= XIICPS_EVENT_COMPLETE_RECV; + } + } + + + /* + * Slave ready interrupt, it is only meaningful for master mode. + */ + if (0U != (IntrStatusReg & XIICPS_IXR_SLV_RDY_MASK)) { + StatusEvent |= XIICPS_EVENT_SLAVE_RDY; + } + + if (0U != (IntrStatusReg & XIICPS_IXR_NACK_MASK)) { + if ((!(InstancePtr->IsRepeatedStart)) != 0 ) { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, + XIICPS_CR_OFFSET) & + (~XIICPS_CR_HOLD_MASK)); + } + StatusEvent |= XIICPS_EVENT_NACK; + } + + /* + * Arbitration lost interrupt + */ + if (0U != (IntrStatusReg & XIICPS_IXR_ARB_LOST_MASK)) { + StatusEvent |= XIICPS_EVENT_ARB_LOST; + } + + /* + * All other interrupts are treated as error. + */ + if (0U != (IntrStatusReg & (XIICPS_IXR_NACK_MASK | + XIICPS_IXR_RX_UNF_MASK | XIICPS_IXR_TX_OVR_MASK | + XIICPS_IXR_RX_OVR_MASK))) { + if ((!(InstancePtr->IsRepeatedStart)) != 0) { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, + XIICPS_CR_OFFSET) & + (~XIICPS_CR_HOLD_MASK)); + } + StatusEvent |= XIICPS_EVENT_ERROR; + } + + /* + * Signal application if there are any events. + */ + if (StatusEvent != 0U) { + 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 s32 XIicPs_SetupMaster(XIicPs *InstancePtr, s32 Role) +{ + u32 ControlReg; + u32 BaseAddr; + + 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) == 0U) { + if (XIicPs_BusIsBusy(InstancePtr) == (s32)1) { + return (s32)XST_FAILURE; + } + } + + /* + * Set up master, AckEn, nea and also clear fifo. + */ + ControlReg |= (u32)XIICPS_CR_ACKEN_MASK | (u32)XIICPS_CR_CLR_FIFO_MASK | + (u32)XIICPS_CR_NEA_MASK | (u32)XIICPS_CR_MS_MASK; + + if (Role == RECVING_ROLE) { + ControlReg |= (u32)XIICPS_CR_RD_WR_MASK; + }else { + ControlReg &= (u32)(~XIICPS_CR_RD_WR_MASK); + } + + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, ControlReg); + + XIicPs_DisableAllInterrupts(BaseAddr); + + return (s32)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) +{ + (void)TransmitFifoFill(InstancePtr); + + /* + * Clear hold bit 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->IsRepeatedStart)) != 0) { + + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + (u32)XIICPS_CR_OFFSET, + XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + (u32)XIICPS_CR_OFFSET) & (u32)(~ XIICPS_CR_HOLD_MASK)); + } + } + + return; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_options.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_options.c new file mode 100644 index 0000000..4ef69a1 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_options.c @@ -0,0 +1,497 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_options.c +* @addtogroup iicps_v3_7 +* @{ +* +* Contains functions for the configuration of the XIccPs driver. +* +*
    +* 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.
    +* 2.0   hk  03/07/14 Limited frequency set when 100KHz or 400KHz is
    +*                    selected. This is a hardware limitation. CR#779290.
    +* 2.1   hk  04/24/14 Fix for CR# 761060 - provision for repeated start.
    +* 2.3	sk	10/07/14 Repeated start feature removed.
    +* 3.0	sk	12/06/14 Implemented Repeated start feature.
    +*			01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +* 3.3   kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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. +* +******************************************************************************/ +s32 XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options) +{ + u32 ControlReg; + u32 Index; + u32 OptionsVar = Options; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET); + + /* + * If repeated start option is requested, set the flag. + * The hold bit in CR will be written by driver when the next transfer + * is initiated. + */ + if ((OptionsVar & (u32)XIICPS_REP_START_OPTION) != (u32)0 ) { + InstancePtr->IsRepeatedStart = 1; + OptionsVar = OptionsVar & (~XIICPS_REP_START_OPTION); + } + + /* + * Loop through the options table, turning the option on. + */ + for (Index = 0U; Index < XIICPS_NUM_OPTIONS; Index++) { + if ((OptionsVar & OptionsTable[Index].Option) != (u32)0x0U) { + /* + * 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) != (u32)0x0U) { + /* 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 (s32)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 +* +******************************************************************************/ +s32 XIicPs_ClearOptions(XIicPs *InstancePtr, u32 Options) +{ + u32 ControlReg; + u32 Index; + u32 OptionsVar = Options; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET); + + /* + * If repeated start option is cleared, set the flag. + * The hold bit in CR will be cleared by driver when the + * following transfer ends. + */ + if ((OptionsVar & XIICPS_REP_START_OPTION) != (u32)0x0U ) { + InstancePtr->IsRepeatedStart = 0; + OptionsVar = OptionsVar & (~XIICPS_REP_START_OPTION); + } + + /* + * Loop through the options table and clear the specified options. + */ + for (Index = 0U; Index < XIICPS_NUM_OPTIONS; Index++) { + if ((OptionsVar & OptionsTable[Index].Option) != (u32)0x0U) { + + /* + * 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) != (u32)0x0U) { + + /* 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 = 0U; + u32 ControlReg; + u32 Index; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)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 = 0U; Index < XIICPS_NUM_OPTIONS; Index++) { + if ((ControlReg & OptionsTable[Index].Mask) != (u32)0x0U) { + OptionsFlag |= OptionsTable[Index].Option; + } + if ((ControlReg & XIICPS_CR_NEA_MASK) == (u32)0x0U) { + OptionsFlag |= XIICPS_10_BIT_ADDR_OPTION; + } + } + + if (InstancePtr->IsRepeatedStart != 0 ) { + OptionsFlag |= XIICPS_REP_START_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. +* +******************************************************************************/ +s32 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; + u32 BestDivB; + u32 FsclHzVar = FsclHz; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(FsclHzVar > 0U); + + if (0U != XIicPs_In32((InstancePtr->Config.BaseAddress) + + XIICPS_TRANS_SIZE_OFFSET)) { + return (s32)XST_DEVICE_IS_STARTED; + } + + /* + * Assume Div_a is 0 and calculate (divisor_a+1) x (divisor_b+1). + */ + Temp = (InstancePtr->Config.InputClockHz) / ((u32)22U * FsclHzVar); + + /* + * If the answer is negative or 0, the Fscl input is out of range. + */ + if ((u32)(0U) == Temp) { + return (s32)XST_FAILURE; + } + + /* + * If frequency 400KHz is selected, 384.6KHz should be set. + * If frequency 100KHz is selected, 90KHz should be set. + * This is due to a hardware limitation. + */ + if(FsclHzVar > (u32)384600U) { + FsclHzVar = (u32)384600U; + } + + if((FsclHzVar <= (u32)100000U) && (FsclHzVar > (u32)90000U)) { + FsclHzVar = (u32)90000U; + } + + /* + * 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) % + ((u32)22 * FsclHzVar)) != (u32)0x0U) ? + Temp + (u32)1U : Temp; + BestError = FsclHzVar; + + BestDivA = 0U; + BestDivB = 0U; + for ( ; Temp <= TempLimit ; Temp++) + { + LastError = FsclHzVar; + CalcDivA = 0U; + CalcDivB = 0U; + + for (Div_b = 0U; Div_b < 64U; Div_b++) { + + Div_a = Temp / (Div_b + 1U); + + if (Div_a != 0U){ + Div_a = Div_a - (u32)1U; + } + if (Div_a > 3U){ + continue; + } + ActualFscl = (InstancePtr->Config.InputClockHz) / + (22U * (Div_a + 1U) * (Div_b + 1U)); + + if (ActualFscl > FsclHzVar){ + CurrentError = (ActualFscl - FsclHzVar);} + else{ + CurrentError = (FsclHzVar - 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, + (u32)XIICPS_CR_OFFSET); + ControlReg &= ~((u32)XIICPS_CR_DIV_A_MASK | (u32)XIICPS_CR_DIV_B_MASK); + ControlReg |= (BestDivA << XIICPS_CR_DIV_A_SHIFT) | + (BestDivB << XIICPS_CR_DIV_B_SHIFT); + + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, (u32)XIICPS_CR_OFFSET, + ControlReg); + + return (s32)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 == (u32)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) / + (22U * (Div_a + 1U) * (Div_b + 1U)); + + return ActualFscl; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_selftest.c new file mode 100644 index 0000000..3e68cb6 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_selftest.c @@ -0,0 +1,132 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_selftest.c +* @addtogroup iicps_v3_7 +* @{ +* +* This component contains the implementation of selftest functions for the +* XIicPs driver component. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- ---------------------------------------------
    +* 1.00a drg/jz 01/30/10 First release
    +* 1.00a sdm    09/22/11 Removed unused code
    +* 3.0	sk	   11/03/14 Removed TimeOut Register value check
    +*			   01/31/15	Modified the code according to MISRAC 2012 Compliant.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + +#define REG_TEST_VALUE 0x00000005U + +/**************************** 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. +* +******************************************************************************/ +s32 XIicPs_SelfTest(XIicPs *InstancePtr) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)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_IXR_ALL_INTR_MASK != + XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_IMR_OFFSET))) { + return (s32)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 (s32)XST_FAILURE; + } + + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_SLV_PAUSE_OFFSET, 0U); + + XIicPs_Reset(InstancePtr); + + return (s32)XST_SUCCESS; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_sinit.c new file mode 100644 index 0000000..a5724c2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_sinit.c @@ -0,0 +1,102 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_sinit.c +* @addtogroup iicps_v3_7 +* @{ +* +* The implementation of the XIicPs component's static initialization +* functionality. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- --------------------------------------------
    +* 1.00a drg/jz 01/30/10 First release
    +* 3.00	sk	   01/31/15	Modified the code according to MISRAC 2012 Compliant.
    +* 
    +* +******************************************************************************/ + +/***************************** 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[XPAR_XIICPS_NUM_INSTANCES]; + +/*****************************************************************************/ +/** +* +* 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; + s32 Index; + + for (Index = 0; Index < XPAR_XIICPS_NUM_INSTANCES; Index++) { + if (XIicPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XIicPs_ConfigTable[Index]; + break; + } + } + + return (XIicPs_Config *)CfgPtr; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_slave.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_slave.c new file mode 100644 index 0000000..fb89192 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/iicps_v3_7/src/xiicps_slave.c @@ -0,0 +1,595 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xiicps_slave.c +* @addtogroup iicps_v3_7 +* @{ +* +* Handles slave transfers +* +*
     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
    +* 3.00	sk	01/31/15 Modified the code according to MISRAC 2012 Compliant.
    +* 3.3   kvn 05/05/16 Modified latest code for MISRA-C:2012 Compliance.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +extern s32 TransmitFifoFill(XIicPs *InstancePtr); + +static s32 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) +{ + u32 ControlReg; + u32 BaseAddr; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)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 |= (u32)XIICPS_CR_ACKEN_MASK | (u32)XIICPS_CR_CLR_FIFO_MASK; + ControlReg |= (u32)XIICPS_CR_NEA_MASK; + ControlReg &= (u32)(~XIICPS_CR_MS_MASK); + + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + ControlReg); + + XIicPs_DisableAllInterrupts(BaseAddr); + + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_ADDR_OFFSET, (u32)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, s32 ByteCount) +{ + u32 BaseAddr; + + /* + * Assert validates the input arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(MsgPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->SendBufferPtr = MsgPtr; + InstancePtr->SendByteCount = ByteCount; + InstancePtr->RecvBufferPtr = NULL; + + XIicPs_EnableInterrupts(BaseAddr, + (u32)XIICPS_IXR_DATA_MASK | (u32)XIICPS_IXR_COMP_MASK | + (u32)XIICPS_IXR_TO_MASK | (u32)XIICPS_IXR_NACK_MASK | + (u32)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, s32 ByteCount) +{ + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(MsgPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)XIL_COMPONENT_IS_READY); + + + InstancePtr->RecvBufferPtr = MsgPtr; + InstancePtr->RecvByteCount = ByteCount; + InstancePtr->SendBufferPtr = NULL; + + XIicPs_EnableInterrupts(InstancePtr->Config.BaseAddress, + (u32)XIICPS_IXR_DATA_MASK | (u32)XIICPS_IXR_COMP_MASK | + (u32)XIICPS_IXR_NACK_MASK | (u32)XIICPS_IXR_TO_MASK | + (u32)XIICPS_IXR_RX_OVR_MASK | (u32)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. +* +****************************************************************************/ +s32 XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount) +{ + u32 IntrStatusReg; + u32 StatusReg; + u32 BaseAddr; + s32 Tmp; + s32 BytesToSend; + s32 Error = 0; + s32 Status = (s32)XST_SUCCESS; + _Bool Value; + _Bool Result; + + /* + * Assert validates the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(MsgPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)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); + Result = (((u32)(StatusReg & XIICPS_SR_RXRW_MASK) == (u32)0x0U) && + (Error == 0)); + while (Result != FALSE) { + + /* + * If master tries to send us data, it is an error. + */ + if ((StatusReg & XIICPS_SR_RXDV_MASK) != 0x0U) { + Error = 1; + } + + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + Result = (((u32)(StatusReg & XIICPS_SR_RXRW_MASK) == (u32)0x0U) && + (Error == 0)); + } + + if (Error != 0) { + Status = (s32)XST_FAILURE; + } else { + + /* + * 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. + */ + Value = (InstancePtr->SendByteCount > (s32)0) && + ((Error == 0)); + while (Value != FALSE) { + + /* + * Find out how many can be sent. + */ + BytesToSend = InstancePtr->SendByteCount; + if (BytesToSend > (s32)(XIICPS_FIFO_DEPTH)) { + BytesToSend = (s32)(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) != (u32)0x00U) && + (Error == 0)) { + + /* + * 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) != 0x0U) { + Error = 1; + } + + /* Clear ISR. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, + IntrStatusReg); + + StatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_SR_OFFSET); + } + Value = ((InstancePtr->SendByteCount > (s32)0) && + (Error == 0)); + } + } + if (Error != 0) { + Status = (s32)XST_FAILURE; + } + + return Status; +} +/*****************************************************************************/ +/** +* 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. +* +****************************************************************************/ +s32 XIicPs_SlaveRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, s32 ByteCount) +{ + u32 IntrStatusReg; + u32 StatusReg; + u32 BaseAddr; + s32 Count; + + /* + * Assert validates the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(MsgPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == (u32)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); + Count = InstancePtr->RecvByteCount; + while (Count > (s32)0) { + + /* Wait for master to put data */ + while ((StatusReg & XIICPS_SR_RXDV_MASK) == 0U) { + 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))!=0x0U) && + ((StatusReg & XIICPS_SR_RXDV_MASK) == 0U) && + ((InstancePtr->RecvByteCount > 0) != 0x0U)) { + + return (s32)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)!=0x0U) && + ((InstancePtr->RecvByteCount > 0) != 0x0U)){ + + XIicPs_RecvByte(InstancePtr); + + StatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_SR_OFFSET); + } + Count = InstancePtr->RecvByteCount; + } + + return (s32)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. +* +*
    +*
    +* 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.
    +*
    +* 
    +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XIicPs_SlaveInterruptHandler(XIicPs *InstancePtr) +{ + u32 IntrStatusReg; + u32 IsSend = 0U; + u32 StatusEvent = 0U; + s32 LeftOver; + u32 BaseAddr; + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == (u32)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 = 1U; + } + + /* Data interrupt + * + * This means master wants to do more data transfers. + * Also check for completion of transfer, signal upper layer if done. + */ + if ((u32)0U != (IntrStatusReg & XIICPS_IXR_DATA_MASK)) { + if (IsSend != 0x0U) { + 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 (0U != (IntrStatusReg & XIICPS_IXR_COMP_MASK)) { + if (IsSend != 0x0U) { + 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 (0U != (IntrStatusReg & XIICPS_IXR_NACK_MASK)) { + StatusEvent |= XIICPS_EVENT_NACK; + } + + /* + * All other interrupts are treated as error. + */ + if (0U != (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 ((u32)0U != 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 s32 SlaveRecvData(XIicPs *InstancePtr) +{ + u32 StatusReg; + u32 BaseAddr; + + BaseAddr = InstancePtr->Config.BaseAddress; + + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + + while (((StatusReg & XIICPS_SR_RXDV_MASK)!=0x0U) && + ((InstancePtr->RecvByteCount > 0) != 0x0U)) { + XIicPs_RecvByte(InstancePtr); + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + } + + return InstancePtr->RecvByteCount; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips.c new file mode 100644 index 0000000..c33322c --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips.c @@ -0,0 +1,1571 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips.c +* @addtogroup qspips_v3_4 +* @{ +* +* Contains implements the interface functions of the XQspiPs driver. +* See xqspips.h for a detailed description of the device and driver. +* +*
    +* 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.
    +* 3.1   hk  08/13/14 When writing to the configuration register, set/reset
    +*                    required bits leaving reserved bits untouched. CR# 796813.
    +* 3.2	sk	02/05/15 Add SLCR reset in abort function as a workaround because
    +* 					 controller does not update FIFO status flags as expected
    +* 					 when thresholds are used.
    +* 3.3   sk  11/07/15 Modified the API prototypes according to MISRAC standards
    +*                    to remove compilation warnings. CR# 868893.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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) +{ + u32 ConfigReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Abort any transfer that is in progress + */ + XQspiPs_Abort(InstancePtr); + + /* + * Write default value to configuration register. + * Do not modify reserved bits. + */ + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_RESET_MASK_SET; + ConfigReg &= ~XQSPIPS_CR_RESET_MASK_CLR; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPS_CR_OFFSET, + ConfigReg); +} + +/*****************************************************************************/ +/** +* +* 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; + u32 IsLock; + + 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); + + /* + * QSPI Software Reset + */ + IsLock = XQspiPs_ReadReg(XPAR_XSLCR_0_BASEADDR, SLCR_LOCKSTA); + if (IsLock) { + XQspiPs_WriteReg(XPAR_XSLCR_0_BASEADDR, SLCR_UNLOCK, + SLCR_UNLOCK_MASK); + } + XQspiPs_WriteReg(XPAR_XSLCR_0_BASEADDR, LQSPI_RST_CTRL, + LQSPI_RST_CTRL_MASK); + XQspiPs_WriteReg(XPAR_XSLCR_0_BASEADDR, LQSPI_RST_CTRL, 0x0); + if (IsLock) { + XQspiPs_WriteReg(XPAR_XSLCR_0_BASEADDR, SLCR_LOCK, + SLCR_LOCK_MASK); + } + + /* + * 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); + + 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: +*
    +*   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.
    +* 
    +* 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. +* +******************************************************************************/ +s32 XQspiPs_Transfer(XQspiPs *InstancePtr, u8 *SendBufPtr, u8 *RecvBufPtr, + u32 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: +*
    +*   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.
    +*
    +* 
    +* +* @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. +* +******************************************************************************/ +s32 XQspiPs_PolledTransfer(XQspiPs *InstancePtr, u8 *SendBufPtr, + u8 *RecvBufPtr, u32 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); + +#ifndef XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR +#define XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR 0xFC000000 +#endif + /* + * 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); + +} + +/*****************************************************************************/ +/** +* +* 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. +* +*
    +*
    +* 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.
    +*
    +* 
    +* @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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips.h new file mode 100644 index 0000000..139ce4d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips.h @@ -0,0 +1,799 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips.h +* @addtogroup qspips_v3_4 +* @{ +* @details +* +* 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. +* +* Linear Mode +* 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. +* +* Initialization & Configuration +* +* 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. +* +* Multiple Masters +* +* 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. +* +* Modes of Operation +* +* 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. +* +* Interrupts +* +* 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. +* +* +* Polled Operation +* +* 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. +* +* Device Busy +* +* 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). +* +* Device Configuration +* +* 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. +* +* RTOS Independence +* +* 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. +* +*
    +* 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.
    +* 3.1   hk  08/13/14 When writing to the configuration register, set/reset
    +*                    required bits leaving reserved bits untouched. CR# 796813.
    +* 3.2	sk	02/05/15 Add SLCR reset in abort function as a workaround because
    +* 					 controller does not update FIFO status flags as expected
    +* 					 when thresholds are used.
    +* 3.3   sk  11/07/15 Modified the API prototypes according to MISRAC standards
    +*                    to remove compilation warnings. CR# 868893.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +*       ms  04/05/17 Modified Comment lines in functions of qspips
    +*                    examples to recognize it as documentation block
    +*                    and modified filename tag in
    +*                    xqspips_dual_flash_stack_lqspi_example.c to include it in
    +*                    doxygen examples.
    +* 3.4   nsk 31/07/17 Added QSPI_BUS_WIDTH parameter in xparameters.h file
    +*
    +* 
    +* +******************************************************************************/ +#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 + +/************************** 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 Active Low Clock option 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 Clock Phase option 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 QSPI Force Slave Select option 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 Manual Start option 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); + +s32 XQspiPs_Transfer(XQspiPs *InstancePtr, u8 *SendBufPtr, u8 *RecvBufPtr, + u32 ByteCount); +s32 XQspiPs_PolledTransfer(XQspiPs *InstancePtr, u8 *SendBufPtr, + u8 *RecvBufPtr, u32 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 + */ +s32 XQspiPs_SetOptions(XQspiPs *InstancePtr, u32 Options); +u32 XQspiPs_GetOptions(XQspiPs *InstancePtr); + +s32 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_g.c new file mode 100644 index 0000000..d739e62 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_g.c @@ -0,0 +1,57 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xqspips.h" + +/* +* The configuration table for devices +*/ + +XQspiPs_Config XQspiPs_ConfigTable[XPAR_XQSPIPS_NUM_INSTANCES] = +{ + { + 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_hw.c new file mode 100644 index 0000000..1817b07 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_hw.c @@ -0,0 +1,224 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_hw.c +* @addtogroup qspips_v3_4 +* @{ +* +* Contains low level functions, primarily reset related. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- -----------------------------------------------
    +* 2.03a hk  09/17/13 First release
    +* 3.1   hk  06/19/14 When writing to the configuration register, set/reset
    +*                    required bits leaving reserved bits untouched. CR# 796813.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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 + */ + ConfigReg = XQspiPs_ReadReg(BaseAddress, XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_RESET_MASK_SET; + ConfigReg &= ~XQSPIPS_CR_RESET_MASK_CLR; + XQspiPs_WriteReg(BaseAddress, XQSPIPS_CR_OFFSET, ConfigReg); + + /* + * 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; + u32 ConfigReg; + + /* + * 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 + */ + ConfigReg = XQspiPs_ReadReg(BaseAddress, XQSPIPS_CR_OFFSET); + ConfigReg |= (XQSPIPS_CR_RESET_MASK_SET | BaudRateDiv); + ConfigReg &= ~(XQSPIPS_CR_RESET_MASK_CLR | XQSPIPS_CR_SSCTRL_MASK); + XQspiPs_WriteReg(BaseAddress, XQSPIPS_CR_OFFSET, ConfigReg); + + /* + * Write linear configuration register with default value - + * enable linear mode and use fast read. + */ + + if(XPAR_XQSPIPS_0_QSPI_MODE == XQSPIPS_CONNECTION_MODE_SINGLE){ + + LinearCfg = XQSPIPS_LQSPI_CR_RST_STATE; + + }else if(XPAR_XQSPIPS_0_QSPI_MODE == + XQSPIPS_CONNECTION_MODE_STACKED){ + + LinearCfg = XQSPIPS_LQSPI_CR_RST_STATE | + XQSPIPS_LQSPI_CR_TWO_MEM_MASK; + + }else if(XPAR_XQSPIPS_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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_hw.h new file mode 100644 index 0000000..96c867a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_hw.h @@ -0,0 +1,423 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_hw.h +* @addtogroup qspips_v3_4 +* @{ +* +* 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. +* +*
    +* 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.
    +* 3.1   hk  08/13/14 Changed definition of CR reset value masks to set/reset
    +*                    required bits leaving reserved bits untouched. CR# 796813.
    +* 3.2	sk	02/05/15 Add SLCR reset in abort function as a workaround because
    +* 					 controller does not update FIFO status flags as expected
    +* 					 when thresholds are used.
    +*
    +* 
    +* +******************************************************************************/ +#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 */ + +#define XQSPIPS_CR_REF_CLK_MASK 0x00000100 /**< Ref clk bit - should be 0 */ + +/* Deselect the Slave select line and set the transfer size to 32 at reset */ +#define XQSPIPS_CR_RESET_MASK_SET XQSPIPS_CR_IFMODE_MASK | \ + XQSPIPS_CR_SSCTRL_MASK | \ + XQSPIPS_CR_DATA_SZ_MASK | \ + XQSPIPS_CR_MSTREN_MASK | \ + XQSPIPS_CR_SSFORCE_MASK | \ + XQSPIPS_CR_HOLD_B_MASK +#define XQSPIPS_CR_RESET_MASK_CLR XQSPIPS_CR_CPOL_MASK | \ + XQSPIPS_CR_CPHA_MASK | \ + XQSPIPS_CR_PRESC_MASK | \ + XQSPIPS_CR_MANSTRTEN_MASK | \ + XQSPIPS_CR_MANSTRT_MASK | \ + XQSPIPS_CR_ENDIAN_MASK | \ + XQSPIPS_CR_REF_CLK_MASK +/* @} */ + + +/** @name QSPI Interrupt Registers + * + * QSPI Status Register + * + * 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. + * + * QSPI Interrupt Enable Register + * + * 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. + * + * QSPI Interrupt Disable Register + * + * 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. + * + * QSPI Interrupt Mask Register + * + * 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 */ + +/* @} */ + + +/** @name SLCR Register + * + * Register offsets from SLCR base address. + * + * @{ + */ + +#define SLCR_LOCK 0x00000004 /**< SLCR Write Protection Lock */ +#define SLCR_UNLOCK 0x00000008 /**< SLCR Write Protection Unlock */ +#define LQSPI_RST_CTRL 0x00000230 /**< Quad SPI Software Reset Control */ +#define SLCR_LOCKSTA 0x0000000C /**< SLCR Write Protection status */ + +/* @} */ + + +/** @name SLCR Register + * + * Bit Masks of above SLCR Registers . + * + * @{ + */ + +#ifndef XPAR_XSLCR_0_BASEADDR +#define XPAR_XSLCR_0_BASEADDR 0xF8000000 +#endif +#define SLCR_LOCK_MASK 0x767B /**< Write Protection Lock mask*/ +#define SLCR_UNLOCK_MASK 0xDF0D /**< SLCR Write Protection Unlock */ +#define LQSPI_RST_CTRL_MASK 0x3 /**< Quad SPI Software Reset Control */ + +/* @} */ + + +/**************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_options.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_options.c new file mode 100644 index 0000000..1cd43f4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_options.c @@ -0,0 +1,430 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_options.c +* @addtogroup qspips_v3_4 +* @{ +* +* Contains functions for the configuration of the XQspiPs driver component. +* +*
    +* 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().
    +* 3.3   sk  11/07/15 Modified the API prototypes according to MISRAC standards
    +*                    to remove compilation warnings. CR# 868893.
    +*
    +* +******************************************************************************/ + +/***************************** 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. +* +******************************************************************************/ +s32 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. +* +******************************************************************************/ +s32 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_selftest.c new file mode 100644 index 0000000..4c44cdf --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_selftest.c @@ -0,0 +1,139 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_selftest.c +* @addtogroup qspips_v3_4 +* @{ +* +* This file contains the implementation of selftest function for the QSPI +* device. +* +*
    +* 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.
    +* 3.1   hk  06/19/14 Remove checks for CR and ISR register values as they are
    +*                    reset in the previous step.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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; + 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); + + 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_sinit.c new file mode 100644 index 0000000..929ecd8 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/qspips_v3_4/src/xqspips_sinit.c @@ -0,0 +1,100 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_sinit.c +* @addtogroup qspips_v3_4 +* @{ +* +* The implementation of the XQspiPs component's static initialization +* functionality. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- -----------------------------------------------
    +* 1.00  sdm 11/25/10 First release
    +* 
    +* +******************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic.c new file mode 100644 index 0000000..f6afc0e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic.c @@ -0,0 +1,1020 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic.c +* @addtogroup scugic_v3_8 +* @{ +* +* Contains required functions for the XScuGic driver for the Interrupt +* Controller. See xscugic.h for a detailed description of the driver. +* +*
    +* 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.
    +* 1.06a asa  16/11/13 Fix for CR#749178. Assignment for EffectiveAddr
    +*			  		  in function XScuGic_CfgInitialize is removed as it was
    +*		      		  a bug.
    +* 3.00  kvn  02/13/14 Modified code for MISRA-C:2012 compliance.
    +* 3.01	pkp	 06/19/15 Added XScuGic_InterruptMaptoCpu API for an interrupt
    +*			  		  target CPU mapping
    +* 3.02	pkp	 11/09/15 Modified DistributorInit function for AMP case to add
    +*					  the current cpu to interrupt processor targets registers
    +* 3.2   asa  02/29/16 Modified DistributorInit function for Zynq AMP case. The
    +*			  		  distributor is left uninitialized for Zynq AMP. It is assumed
    +*             		  that the distributor will be initialized by Linux master. However
    +*             		  for CortexR5 case, the earlier code is left unchanged where the
    +*             		  the interrupt processor target registers in the distributor is
    +*             		  initialized with the corresponding CPU ID on which the application
    +*             		  built over the scugic driver runs.
    +*             		  These changes fix CR#937243.
    +* 3.3	pkp  05/12/16 Modified XScuGic_InterruptMaptoCpu to write proper value
    +*					  to interrupt target register to fix CR#951848
    +*
    +* 3.4   asa  04/07/16 Created a new static function DoDistributorInit to simplify
    +*                     the flow and avoid code duplication. Changes are made for
    +*                     USE_AMP use case for R5. In a scenario (in R5 split mode) when
    +*                     one R5 is operating with A53 in open amp config and other
    +*                     R5 running baremetal app, the existing code
    +*                     had the potential to stop the whole AMP solution to work (if
    +*                     for some reason the R5 running the baremetal app tasked to
    +*                     initialize the Distributor hangs or crashes before initializing).
    +*                     Changes are made so that the R5 under AMP first checks if
    +*                     the distributor is enabled or not and if not, it does the
    +*                     standard Distributor initialization.
    +*                     This fixes the CR#952962.
    +* 3.4   mus  09/08/16 Added assert to avoid invalid access of GIC from CPUID 1
    +*                     for single core zynq-7000s
    +* 3.5   mus  10/05/16 Modified DistributorInit function to avoid re-initialization of
    +*                     distributor,If it is already initialized by other CPU.
    +* 3.5	pkp	 10/17/16 Modified XScuGic_InterruptMaptoCpu to correct the CPU Id value
    +*					  and properly mask interrupt target processor value to modify
    +*					  interrupt target processor register for a given interrupt ID
    +*					  and cpu ID
    +* 3.6	pkp	 20/01/17 Added new API XScuGic_Stop to Disable distributor and
    +*					  interrupts in case they are being used only by current cpu.
    +*					  It also removes current cpu from interrupt target registers
    +*					  for all interrupts.
    +*       kvn  02/17/17 Add support for changing GIC CPU master at run time.
    +*       kvn  02/28/17 Make the CpuId as static variable and Added new
    +*                     XScugiC_GetCpuId to access CpuId.
    +* 3.9   mus  02/21/18 Added new API's XScuGic_UnmapAllInterruptsFromCpu and
    +*                     XScuGic_InterruptUnmapFromCpu, These API's can be used
    +*                     by applications to unmap specific/all interrupts from
    +*                     target CPU. It fixes CR#992490.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xil_types.h" +#include "xil_assert.h" +#include "xscugic.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ +static u32 CpuId = XPAR_CPU_ID; /**< CPU Core identifier */ + +/************************** Function Prototypes ******************************/ + +static void StubHandler(void *CallBackRef); + +/*****************************************************************************/ +/** +* +* DoDistributorInit 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 DoDistributorInit(XScuGic *InstancePtr, u32 CpuID) +{ + u32 Int_Id; + u32 LocalCpuID = CpuID; + + XScuGic_DistWriteReg(InstancePtr, XSCUGIC_DIST_EN_OFFSET, 0U); + + /* + * 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 = 32U; Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS; Int_Id=Int_Id+16U) { + /* + * 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), + 0U); + } + + +#define DEFAULT_PRIORITY 0xa0a0a0a0U + for (Int_Id = 0U; Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS; Int_Id=Int_Id+4U) { + /* + * 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 = 32U; Int_IdBaseAddress for this parameters, passing the physical +* address instead. +* +* @return +* - XST_SUCCESS if initialization was successful +* +* @note None. +* +******************************************************************************/ +s32 XScuGic_CfgInitialize(XScuGic *InstancePtr, + XScuGic_Config *ConfigPtr, + u32 EffectiveAddr) +{ + u32 Int_Id; + u32 Cpu_Id = CpuId + (u32)1; + (void) EffectiveAddr; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + /* + * Detect Zynq-7000 base silicon configuration,Dual or Single CPU. + * If it is single CPU cnfiguration then invoke assert for CPU ID=1 + */ +#ifdef ARMA9 + if ( XPAR_CPU_ID == 0x01 ) + { + Xil_AssertNonvoid((Xil_In32(XPS_EFUSE_BASEADDR + EFUSE_STATUS_OFFSET) + & EFUSE_STATUS_CPU_MASK ) == 0); + } +#endif + + if(InstancePtr->IsReady != XIL_COMPONENT_IS_READY) { + + InstancePtr->IsReady = 0U; + InstancePtr->Config = ConfigPtr; + + + for (Int_Id = 0U; Int_IdConfig->HandlerTable[Int_Id].Handler == NULL)) { + InstancePtr->Config->HandlerTable[Int_Id].Handler = + StubHandler; + } + InstancePtr->Config->HandlerTable[Int_Id].CallBackRef = + InstancePtr; + } + XScuGic_Stop(InstancePtr); + DistributorInit(InstancePtr, Cpu_Id); + CPUInitialize(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. +* +****************************************************************************/ +s32 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 = 0x00000001U << (Int_Id % 32U); + + /* + * 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, (u32)XSCUGIC_DISABLE_OFFSET + + ((Int_Id / 32U) * 4U), 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 = 0x00000001U << (Int_Id % 32U); + + /* + * Enable the selected interrupt source by setting the + * corresponding bit in the Enable Set register. + */ + XScuGic_DistWriteReg(InstancePtr, (u32)XSCUGIC_ENABLE_SET_OFFSET + + ((Int_Id / 32U) * 4U), 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 = 0x00000001U << (Int_Id % 32U); + + /* + * Disable the selected interrupt source by setting the + * corresponding bit in the IDR. + */ + XScuGic_DistWriteReg(InstancePtr, (u32)XSCUGIC_DISABLE_OFFSET + + ((Int_Id / 32U) * 4U), 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. +* +******************************************************************************/ +s32 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 <= 15U) ; + Xil_AssertNonvoid(Cpu_Id <= 255U) ; + + + /* + * 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 << 16U) | 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 *)((void *)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; + u8 LocalPriority; + LocalPriority = Priority; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertVoid(Trigger <= (u8)XSCUGIC_INT_CFG_MASK); + Xil_AssertVoid(LocalPriority <= (u8)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. + */ + LocalPriority = LocalPriority & (u8)XSCUGIC_INTR_PRIO_MASK; + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue &= ~(XSCUGIC_PRIORITY_MASK << ((Int_Id%4U)*8U)); + RegValue |= (u32)LocalPriority << ((Int_Id%4U)*8U); + + /* + * 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%16U)*2U)); + RegValue |= (u32)Trigger << ((Int_Id%16U)*2U); + + /* + * 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%4U)*8U); + *Priority = (u8)(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%16U)*2U); + + *Trigger = (u8)(RegValue & XSCUGIC_INT_CFG_MASK); +} +/****************************************************************************/ +/** +* Sets the target CPU for the interrupt of a peripheral +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Cpu_Id is a CPU number for which the interrupt has to be targeted +* @param Int_Id is the IRQ source number to modify +* +* @return None. +* +* @note None +* +*****************************************************************************/ +void XScuGic_InterruptMaptoCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id) +{ + u32 RegValue, Offset; + RegValue = XScuGic_DistReadReg(InstancePtr, + XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id)); + + Offset = (Int_Id & 0x3U); + Cpu_Id = (0x1U << Cpu_Id); + + RegValue = (RegValue & (~(0xFFU << (Offset*8U))) ); + RegValue |= ((Cpu_Id) << (Offset*8U)); + + XScuGic_DistWriteReg(InstancePtr, + XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id), + RegValue); +} +/****************************************************************************/ +/** +* Unmaps specific SPI interrupt from the target CPU +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Cpu_Id is a CPU number from which the interrupt has to be +* unmapped +* @param Int_Id is the IRQ source number to modify +* +* @return None. +* +* @note None +* +*****************************************************************************/ +void XScuGic_InterruptUnmapFromCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id) +{ + u32 RegValue; + u8 BitPos; + + Xil_AssertVoid(InstancePtr != NULL); + + RegValue = XScuGic_DistReadReg(InstancePtr, + XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id)); + + /* + * Identify bit position corresponding to Int_Id and Cpu_Id, + * in interrupt target register and clear it + */ + BitPos = ((Int_Id % 4U) * 8U) + Cpu_Id; + RegValue &= (~ ( 1U << BitPos )); + XScuGic_DistWriteReg(InstancePtr, + XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id), + RegValue); +} +/****************************************************************************/ +/** +* Unmaps all SPI interrupts from the target CPU +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Cpu_Id is a CPU number from which the interrupts has to be +* unmapped +* +* @return None. +* +* @note None +* +*****************************************************************************/ +void XScuGic_UnmapAllInterruptsFromCpu(XScuGic *InstancePtr, u8 Cpu_Id) +{ + u32 Int_Id; + u32 Target_Cpu; + u32 LocalCpuID = (1U << Cpu_Id); + + Xil_AssertVoid(InstancePtr != NULL); + + LocalCpuID |= LocalCpuID << 8U; + LocalCpuID |= LocalCpuID << 16U; + + for (Int_Id = 32U; Int_IdInterrupt Vector Tables
    +* +* 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. +* +* Nested Interrupts Processing +* +* Nested interrupts are not supported by this driver. +* +* NOTE: +* The generic interrupt controller is not a part of the snoop control unit +* as indicated by the prefix "scu" in the name of the driver. +* It is an independent module in APU. +* +*
    +* 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.
    +* 2.0   adk  12/10/13 Updated as per the New Tcl API's
    +* 2.1   adk  25/04/14 Fixed the CR:789373 changes are made in the driver tcl file.
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.2   asa  02/29/16 Modified DistributorInit function for Zynq AMP case. The
    +*			  distributor is left uninitialized for Zynq AMP. It is assumed
    +*             that the distributor will be initialized by Linux master. However
    +*             for CortexR5 case, the earlier code is left unchanged where the
    +*             the interrupt processor target registers in the distributor is
    +*             initialized with the corresponding CPU ID on which the application
    +*             built over the scugic driver runs.
    +*             These changes fix CR#937243.
    +*
    +* 3.4   asa  04/07/16 Created a new static function DoDistributorInit to simplify
    +*            the flow and avoid code duplication. Changes are made for
    +*            USE_AMP use case for R5. In a scenario (in R5 split mode) when
    +*            one R5 is operating with A53 in open amp config and other
    +*            R5 running baremetal app, the existing code
    +*            had the potential to stop the whole AMP solution to work (if
    +*            for some reason the R5 running the baremetal app tasked to
    +*            initialize the Distributor hangs or crashes before initializing).
    +*            Changes are made so that the R5 under AMP first checks if
    +*            the distributor is enabled or not and if not, it does the
    +*            standard Distributor initialization.
    +*            This fixes the CR#952962.
    +* 3.6   ms   01/23/17 Modified xil_printf statement in main function for all
    +*                     examples to ensure that "Successfully ran" and "Failed"
    +*                     strings are available in all examples. This is a fix
    +*                     for CR-965028.
    +*       kvn  02/17/17 Add support for changing GIC CPU master at run time.
    +*       kvn  02/28/17 Make the CpuId as static variable and Added new
    +*                     XScugiC_GetCpuId to access CpuId.
    +*       ms   03/17/17 Added readme.txt file in examples folder for doxygen
    +*                     generation.
    +* 3.7   ms   04/11/17 Modified tcl file to add suffix U for all macro
    +*                     definitions of scugic in xparameters.h
    +* 3.8   mus  07/05/17 Updated scugic.tcl to add support for intrrupts connected
    +*                     through util_reduced_vector IP(OR gate)
    +*       mus  07/05/17 Updated xdefine_zynq_canonical_xpars proc to initialize
    +*                     the HandlerTable in XScuGic_ConfigTable to 0, it removes
    +*                     the compilation warning in xscugic_g.c. Fix for CR#978736.
    +*       mus  07/25/17 Updated xdefine_gic_params proc to export correct canonical
    +*                     definitions for pl to ps interrupts.Fix for CR#980534
    +* 3.9   mus  02/21/18 Added new API's XScuGic_UnmapAllInterruptsFromCpu and
    +*                     XScuGic_InterruptUnmapFromCpu, These API's can be used
    +*                     by applications to unmap specific/all interrupts from
    +*                     target CPU.
    +*
    +* 
    +* +******************************************************************************/ + +#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 *****************************/ + +#define EFUSE_STATUS_OFFSET 0x10 +#define EFUSE_STATUS_CPU_MASK 0x80 + +#if !defined (ARMR5) && !defined (__aarch64__) && !defined (ARMA53_32) +#define ARMA9 +#endif +/**************************** 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 + */ + +s32 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); + +s32 XScuGic_CfgInitialize(XScuGic *InstancePtr, XScuGic_Config *ConfigPtr, + u32 EffectiveAddr); + +s32 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); +void XScuGic_InterruptMaptoCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id); +void XScuGic_InterruptUnmapFromCpu(XScuGic *InstancePtr, u8 Cpu_Id, u32 Int_Id); +void XScuGic_UnmapAllInterruptsFromCpu(XScuGic *InstancePtr, u8 Cpu_Id); +void XScuGic_Stop(XScuGic *InstancePtr); +void XScuGic_SetCpuID(u32 CpuCoreId); +u32 XScuGic_GetCpuID(void); +/* + * 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 + */ +s32 XScuGic_SelfTest(XScuGic *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_g.c new file mode 100644 index 0000000..6765fd5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_g.c @@ -0,0 +1,57 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xscugic.h" + +/* +* The configuration table for devices +*/ + +XScuGic_Config XScuGic_ConfigTable[XPAR_XSCUGIC_NUM_INSTANCES] = +{ + { + XPAR_PS7_SCUGIC_0_DEVICE_ID, + XPAR_PS7_SCUGIC_0_BASEADDR, + XPAR_PS7_SCUGIC_0_DIST_BASEADDR, + {{0}} /**< Initialize the HandlerTable to 0 */ + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_hw.c new file mode 100644 index 0000000..6604e3a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_hw.c @@ -0,0 +1,649 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_hw.c +* @addtogroup scugic_v3_8 +* @{ +* +* 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. +* +*
    +* 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
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.6   kvn  02/17/17 Add support for changing GIC CPU master at run time.
    +*       kvn  02/28/17 Make the CpuId as static variable and Added new
    +*                     XScugiC_GetCpuId to access CpuId.
    +* 3.9   mus  02/21/18 Added new API's XScuGic_InterruptUnmapFromCpuByDistAddr
    +*					  and XScuGic_UnmapAllInterruptsFromCpuByDistAddr, These
    +*					  API's can be used by applications to unmap specific/all
    +*					  interrupts from target CPU. It fixes CR#992490.
    +*
    +* 
    +* +******************************************************************************/ + + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xscugic.h" +#include "xparameters.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 CpuBaseAddress); + +/************************** Variable Definitions *****************************/ + +extern XScuGic_Config XScuGic_ConfigTable[XPAR_XSCUGIC_NUM_INSTANCES]; +extern u32 CpuId; + +/*****************************************************************************/ +/** +* +* 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; + u32 LocalCpuID = CpuID; + +#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, 0U); + + /* + * 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 = 32U; Int_IdDistBaseAddress, + XSCUGIC_INT_CFG_OFFSET_CALC(Int_Id), 0U); + } + + +#define DEFAULT_PRIORITY 0xa0a0a0a0U + for (Int_Id = 0U; Int_IdDistBaseAddress, + XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id), + DEFAULT_PRIORITY); + } + + for (Int_Id = 32U; Int_IdDistBaseAddress, + XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id), LocalCpuID); + } + + for (Int_Id = 0U; Int_IdDistBaseAddress, + XSCUGIC_EN_DIS_OFFSET_CALC(XSCUGIC_DISABLE_OFFSET, + Int_Id), + 0xFFFFFFFFU); + + } + + 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, + 0xF0U); + + /* + * 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, 0x07U); + +} + +/*****************************************************************************/ +/** +* +* 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. +* +******************************************************************************/ +s32 XScuGic_DeviceInitialize(u32 DeviceId) +{ + XScuGic_Config *Config; + u32 Cpu_Id = XScuGic_GetCpuID() + (u32)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 InterruptID; + u32 IntIDFull; + XScuGic_VectorTableEntry *TablePtr; + XScuGic_Config *CfgPtr; + + CfgPtr = &XScuGic_ConfigTable[(INTPTR )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. + */ + IntIDFull = XScuGic_ReadReg(CfgPtr->CpuBaseAddress, XSCUGIC_INT_ACK_OFFSET); + InterruptID = IntIDFull & XSCUGIC_ACK_INTID_MASK; + if(XSCUGIC_MAX_NUM_INTR_INPUTS < InterruptID){ + 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[InterruptID]); + if(TablePtr != NULL) { + 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, IntIDFull); + + /* + * 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, s32 InterruptID, + Xil_InterruptHandler IntrHandler, void *CallBackRef) +{ + XScuGic_Config *CfgPtr; + CfgPtr = LookupConfigByBaseAddress(BaseAddress); + + if(CfgPtr != NULL) { + if( IntrHandler != NULL) { + CfgPtr->HandlerTable[InterruptID].Handler = IntrHandler; + } + if( CallBackRef != NULL) { + 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; + u32 Index; + + for (Index = 0U; Index < XPAR_SCUGIC_NUM_INSTANCES; Index++) { + if (XScuGic_ConfigTable[Index].CpuBaseAddress == + CpuBaseAddress) { + CfgPtr = &XScuGic_ConfigTable[Index]; + break; + } + } + + return (XScuGic_Config *)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; + u8 LocalPriority = Priority; + + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertVoid(Trigger <= XSCUGIC_INT_CFG_MASK); + Xil_AssertVoid(LocalPriority <= 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. + */ + LocalPriority = LocalPriority & XSCUGIC_INTR_PRIO_MASK; + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue &= ~(XSCUGIC_PRIORITY_MASK << ((Int_Id%4U)*8U)); + RegValue |= (u32)LocalPriority << ((Int_Id%4U)*8U); + + /* + * 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%16U)*2U)); + RegValue |= (u32)Trigger << ((Int_Id%16U)*2U); + + /* + * 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%4U)*8U); + *Priority = (u8)(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%16U)*2U); + + *Trigger = (u8)(RegValue & XSCUGIC_INT_CFG_MASK); +} + +/****************************************************************************/ +/** +* Unmaps specific SPI interrupt from the target CPU +* +* @param DistBaseAddress is the device base address +* @param Cpu_Id is a CPU number from which the interrupt has to be +* unmapped +* @param Int_Id is the IRQ source number to modify +* +* @return None. +* +* @note None +* +*****************************************************************************/ +void XScuGic_InterruptUnmapFromCpuByDistAddr(u32 DistBaseAddress, + u8 Cpu_Id, u32 Int_Id) +{ + u32 RegValue; + u8 BitPos; + + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + + RegValue = XScuGic_ReadReg(DistBaseAddress, + XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id)); + + /* + * Identify bit position corresponding to Int_Id and Cpu_Id, + * in interrupt target register and clear it + */ + BitPos = ((Int_Id % 4U) * 8U) + Cpu_Id; + RegValue &= (~ ( 1U << BitPos )); + XScuGic_WriteReg(DistBaseAddress, + XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id), RegValue); +} + +/****************************************************************************/ +/** +* Unmaps all SPI interrupts from the target CPU +* +* @param DistBaseAddress is the device base address +* @param Cpu_Id is a CPU number from which the interrupts has to be +* unmapped +* +* @return None. +* +* @note None +* +*****************************************************************************/ +void XScuGic_UnmapAllInterruptsFromCpuByDistAddr(u32 DistBaseAddress, + u8 Cpu_Id) +{ + u32 Int_Id; + u32 Target_Cpu; + u32 LocalCpuID = (1U << Cpu_Id); + + LocalCpuID |= LocalCpuID << 8U; + LocalCpuID |= LocalCpuID << 16U; + + for (Int_Id = 32U; Int_Id +* 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 +* 3.0 pkp 12/09/14 changed XSCUGIC_MAX_NUM_INTR_INPUTS for +* Zynq Ultrascale Mp +* 3.0 kvn 02/13/14 Modified code for MISRA-C:2012 compliance. +* 3.2 pkp 11/09/15 Corrected the interrupt processsor target mask value +* for CPU interface 2 i.e. XSCUGIC_SPI_CPU2_MASK +* 3.9 mus 02/21/18 Added new API's XScuGic_InterruptUnmapFromCpuByDistAddr +* and XScuGic_UnmapAllInterruptsFromCpuByDistAddr, These +* API's can be used by applications to unmap specific/all +* interrupts from target CPU. It fixes CR#992490. +*
    +* +******************************************************************************/ + +#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. + */ +#ifdef __ARM_NEON__ +#define XSCUGIC_MAX_NUM_INTR_INPUTS 95U /* Maximum number of interrupt defined by Zynq */ +#else +#define XSCUGIC_MAX_NUM_INTR_INPUTS 195U /* Maximum number of interrupt defined by Zynq Ultrascale Mp */ +#endif + +/* + * The maximum priority value that can be used in the GIC. + */ +#define XSCUGIC_MAX_INTR_PRIO_VAL 248U +#define XSCUGIC_INTR_PRIO_MASK 0x000000F8U + +/** @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 0x00000000U /**< Distributor Enable + Register */ +#define XSCUGIC_IC_TYPE_OFFSET 0x00000004U /**< Interrupt Controller + Type Register */ +#define XSCUGIC_DIST_IDENT_OFFSET 0x00000008U /**< Implementor ID + Register */ +#define XSCUGIC_SECURITY_OFFSET 0x00000080U /**< Interrupt Security + Register */ +#define XSCUGIC_ENABLE_SET_OFFSET 0x00000100U /**< Enable Set + Register */ +#define XSCUGIC_DISABLE_OFFSET 0x00000180U /**< Enable Clear Register */ +#define XSCUGIC_PENDING_SET_OFFSET 0x00000200U /**< Pending Set + Register */ +#define XSCUGIC_PENDING_CLR_OFFSET 0x00000280U /**< Pending Clear + Register */ +#define XSCUGIC_ACTIVE_OFFSET 0x00000300U /**< Active Status Register */ +#define XSCUGIC_PRIORITY_OFFSET 0x00000400U /**< Priority Level Register */ +#define XSCUGIC_SPI_TARGET_OFFSET 0x00000800U /**< SPI Target + Register 0x800-0x8FB */ +#define XSCUGIC_INT_CFG_OFFSET 0x00000C00U /**< Interrupt Configuration + Register 0xC00-0xCFC */ +#define XSCUGIC_PPI_STAT_OFFSET 0x00000D00U /**< PPI Status Register */ +#define XSCUGIC_SPI_STAT_OFFSET 0x00000D04U /**< SPI Status Register + 0xd04-0xd7C */ +#define XSCUGIC_AHB_CONFIG_OFFSET 0x00000D80U /**< AHB Configuration + Register */ +#define XSCUGIC_SFI_TRIG_OFFSET 0x00000F00U /**< Software Triggered + Interrupt Register */ +#define XSCUGIC_PERPHID_OFFSET 0x00000FD0U /**< Peripheral ID Reg */ +#define XSCUGIC_PCELLID_OFFSET 0x00000FF0U /**< Pcell ID Register */ +/* @} */ + +/** @name Distributor Enable Register + * Controls if the distributor response to external interrupt inputs. + * @{ + */ +#define XSCUGIC_EN_INT_MASK 0x00000001U /**< Interrupt In Enable */ +/* @} */ + +/** @name Interrupt Controller Type Register + * @{ + */ +#define XSCUGIC_LSPI_MASK 0x0000F800U /**< Number of Lockable + Shared Peripheral + Interrupts*/ +#define XSCUGIC_DOMAIN_MASK 0x00000400U /**< Number os Security domains*/ +#define XSCUGIC_CPU_NUM_MASK 0x000000E0U /**< Number of CPU Interfaces */ +#define XSCUGIC_NUM_INT_MASK 0x0000001FU /**< Number of Interrupt IDs */ +/* @} */ + +/** @name Implementor ID Register + * Implementor and revision information. + * @{ + */ +#define XSCUGIC_REV_MASK 0x00FFF000U /**< Revision Number */ +#define XSCUGIC_IMPL_MASK 0x00000FFFU /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x00000001U /**< 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 0x000000FFU /**< Each Byte corresponds to an + INT_ID */ +#define XSCUGIC_PRIORITY_MAX 0x000000FFU /**< 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 0x00000080U /**< CPU 7 Mask*/ +#define XSCUGIC_SPI_CPU6_MASK 0x00000040U /**< CPU 6 Mask*/ +#define XSCUGIC_SPI_CPU5_MASK 0x00000020U /**< CPU 5 Mask*/ +#define XSCUGIC_SPI_CPU4_MASK 0x00000010U /**< CPU 4 Mask*/ +#define XSCUGIC_SPI_CPU3_MASK 0x00000008U /**< CPU 3 Mask*/ +#define XSCUGIC_SPI_CPU2_MASK 0x00000004U /**< CPU 2 Mask*/ +#define XSCUGIC_SPI_CPU1_MASK 0x00000002U /**< CPU 1 Mask*/ +#define XSCUGIC_SPI_CPU0_MASK 0x00000001U /**< 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 0x00000003U /**< */ +/* @} */ + +/** @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 0x00008000U /**< PPI Status */ +#define XSCUGIC_PPI_C14_MASK 0x00004000U /**< PPI Status */ +#define XSCUGIC_PPI_C13_MASK 0x00002000U /**< PPI Status */ +#define XSCUGIC_PPI_C12_MASK 0x00001000U /**< PPI Status */ +#define XSCUGIC_PPI_C11_MASK 0x00000800U /**< PPI Status */ +#define XSCUGIC_PPI_C10_MASK 0x00000400U /**< PPI Status */ +#define XSCUGIC_PPI_C09_MASK 0x00000200U /**< PPI Status */ +#define XSCUGIC_PPI_C08_MASK 0x00000100U /**< PPI Status */ +#define XSCUGIC_PPI_C07_MASK 0x00000080U /**< PPI Status */ +#define XSCUGIC_PPI_C06_MASK 0x00000040U /**< PPI Status */ +#define XSCUGIC_PPI_C05_MASK 0x00000020U /**< PPI Status */ +#define XSCUGIC_PPI_C04_MASK 0x00000010U /**< PPI Status */ +#define XSCUGIC_PPI_C03_MASK 0x00000008U /**< PPI Status */ +#define XSCUGIC_PPI_C02_MASK 0x00000004U /**< PPI Status */ +#define XSCUGIC_PPI_C01_MASK 0x00000002U /**< PPI Status */ +#define XSCUGIC_PPI_C00_MASK 0x00000001U /**< 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 0x00000001U /**< 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 0x00000004U /**< 0-GIC uses little Endian, + 1-GIC uses Big Endian */ +#define XSCUGIC_AHB_ENDOVR_MASK 0x00000002U /**< 0-Uses CFGBIGEND control, + 1-use the AHB_END bit */ +#define XSCUGIC_AHB_TIE_OFF_MASK 0x00000001U /**< State of CFGBIGEND */ + +/* @} */ + +/** @name Software Triggered Interrupt Register + * Controls issueing of software interrupts. + * @{ + */ +#define XSCUGIC_SFI_SELFTRIG_MASK 0x02010000U +#define XSCUGIC_SFI_TRIG_TRGFILT_MASK 0x03000000U /**< Target List filter + b00-Use the target List + b01-All CPUs except requester + b10-To Requester + b11-reserved */ +#define XSCUGIC_SFI_TRIG_CPU_MASK 0x00FF0000U /**< CPU Target list */ +#define XSCUGIC_SFI_TRIG_SATT_MASK 0x00008000U /**< 0= Use a secure interrupt */ +#define XSCUGIC_SFI_TRIG_INTID_MASK 0x0000000FU /**< 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 0x00000000U /**< CPU Interface Control + Register */ +#define XSCUGIC_CPU_PRIOR_OFFSET 0x00000004U /**< Priority Mask Reg */ +#define XSCUGIC_BIN_PT_OFFSET 0x00000008U /**< Binary Point Register */ +#define XSCUGIC_INT_ACK_OFFSET 0x0000000CU /**< Interrupt ACK Reg */ +#define XSCUGIC_EOI_OFFSET 0x00000010U /**< End of Interrupt Reg */ +#define XSCUGIC_RUN_PRIOR_OFFSET 0x00000014U /**< Running Priority Reg */ +#define XSCUGIC_HI_PEND_OFFSET 0x00000018U /**< Highest Pending Interrupt + Register */ +#define XSCUGIC_ALIAS_BIN_PT_OFFSET 0x0000001CU /**< 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 0x00000010U /**< Secure Binary Pointer, + 0=separate registers, + 1=both use bin_pt_s */ +#define XSCUGIC_CNTR_FIQEN_MASK 0x00000008U /**< Use nFIQ_C for secure + interrupts, + 0= use IRQ for both, + 1=Use FIQ for secure, IRQ for non*/ +#define XSCUGIC_CNTR_ACKCTL_MASK 0x00000004U /**< Ack control for secure or non secure */ +#define XSCUGIC_CNTR_EN_NS_MASK 0x00000002U /**< Non Secure enable */ +#define XSCUGIC_CNTR_EN_S_MASK 0x00000001U /**< 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 0x000000FFU*/ /**< All interrupts */ +/* @} */ + +/** @name Binary Point Register + * Binary Point register definitions + * @{ + */ + +#define XSCUGIC_BIN_PT_MASK 0x00000007U /**< 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 0x000003FFU /**< Interrupt ID */ +#define XSCUGIC_CPUID_MASK 0x00000C00U /**< 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 0x000003FFU /**< 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 0x000000FFU /**< Interrupt Priority */ +/* @} */ + +/* + * Highest Pending Interrupt register definitions + * Identifies the interrupt priority of the highest priority pending interupt + */ +#define XSCUGIC_PEND_INTID_MASK 0x000003FFU /**< Pending Interrupt ID */ +/*#define XSCUGIC_CPUID_MASK 0x00000C00U */ /**< 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) \ + ((u32)XSCUGIC_INT_CFG_OFFSET + (((InterruptID)/16U) * 4U)) + +/****************************************************************************/ +/** +* +* 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) \ + ((u32)XSCUGIC_PRIORITY_OFFSET + (((InterruptID)/4U) * 4U)) + +/****************************************************************************/ +/** +* +* 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) \ + ((u32)XSCUGIC_SPI_TARGET_OFFSET + (((InterruptID)/4U) * 4U)) + +/****************************************************************************/ +/** +* +* 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_EN_DIS_OFFSET_CALC(Register, InterruptID) \ + ((Register) + (((InterruptID)/32U) * 4U)) + +/****************************************************************************/ +/** +* +* 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) / 32U) * 4U), \ + (0x00000001U << ((Int_Id) % 32U))) + +/****************************************************************************/ +/** +* +* 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) / 32U) * 4U), \ + (0x00000001U << ((Int_Id) % 32U))) + + +/************************** Function Prototypes ******************************/ + +void XScuGic_DeviceInterruptHandler(void *DeviceId); +s32 XScuGic_DeviceInitialize(u32 DeviceId); +void XScuGic_RegisterHandler(u32 BaseAddress, s32 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); +void XScuGic_InterruptUnmapFromCpuByDistAddr(u32 DistBaseAddress, + u8 Cpu_Id, u32 Int_Id); +void XScuGic_UnmapAllInterruptsFromCpuByDistAddr(u32 DistBaseAddress, + u8 Cpu_Id); +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_intr.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_intr.c new file mode 100644 index 0000000..d82a60b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_intr.c @@ -0,0 +1,173 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_intr.c +* @addtogroup scugic_v3_8 +* @{ +* +* 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. +* +*
    +* 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.
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +*
    +* 
    +* +* @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 InterruptID; + u32 IntIDFull; + 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. + */ + IntIDFull = XScuGic_CPUReadReg(InstancePtr, XSCUGIC_INT_ACK_OFFSET); + InterruptID = IntIDFull & XSCUGIC_ACK_INTID_MASK; + + if(XSCUGIC_MAX_NUM_INTR_INPUTS < InterruptID){ + 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[InterruptID]); + if(TablePtr != NULL) { + 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, IntIDFull); + + /* + * Return from the interrupt. Change security domains could happen here. + */ +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_selftest.c new file mode 100644 index 0000000..7b1028f --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_selftest.c @@ -0,0 +1,115 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_selftest.c +* @addtogroup scugic_v3_8 +* @{ +* +* Contains diagnostic self-test functions for the XScuGic driver. +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a drg  01/19/10 First release
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xscugic.h" + +/************************** Constant Definitions *****************************/ + +#define XSCUGIC_PCELL_ID 0xB105F00DU + +/**************************** 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. +* +******************************************************************************/ +s32 XScuGic_SelfTest(XScuGic *InstancePtr) +{ + u32 RegValue1 = 0U; + u32 Index; + s32 Status; + + /* + * Assert the arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the ID registers. + */ + for(Index=0U; Index<=3U; Index++) { + RegValue1 |= XScuGic_DistReadReg(InstancePtr, + ((u32)XSCUGIC_PCELLID_OFFSET + (Index * 4U))) << (Index * 8U); + } + + if(XSCUGIC_PCELL_ID != RegValue1){ + Status = XST_FAILURE; + } else { + Status = XST_SUCCESS; + } + return Status; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_sinit.c new file mode 100644 index 0000000..842f318 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scugic_v3_9/src/xscugic_sinit.c @@ -0,0 +1,103 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_sinit.c +* @addtogroup scugic_v3_8 +* @{ +* +* Contains static init functions for the XScuGic driver for the Interrupt +* Controller. See xscugic.h for a detailed description of the driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- --------------------------------------------------------
    +* 1.00a drg  01/19/10 First release
    +* 3.00  kvn  02/13/15 Modified code for MISRA-C:2012 compliance.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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[XPAR_SCUGIC_NUM_INSTANCES]; + +/************************** 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; + u32 Index; + + for (Index=0U; Index < (u32)XPAR_SCUGIC_NUM_INSTANCES; Index++) { + if (XScuGic_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XScuGic_ConfigTable[Index]; + break; + } + } + + return (XScuGic_Config *)CfgPtr; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer.c new file mode 100644 index 0000000..9d477d9 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer.c @@ -0,0 +1,286 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer.c +* @addtogroup scutimer_v2_1 +* @{ +* +* Contains the implementation of interface functions of the SCU Timer driver. +* See xscutimer.h for a description of the driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- ---------------------------------------------
    +* 1.00a nm  03/10/10 First release
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** 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. +* +******************************************************************************/ +s32 XScuTimer_CfgInitialize(XScuTimer *InstancePtr, + XScuTimer_Config *ConfigPtr, u32 EffectiveAddress) +{ + s32 Status; + 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) { + /* + * 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 = (u32)0; + + /* + * Indicate the instance is ready to use, successfully initialized. + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + Status =(s32)XST_SUCCESS; + } + else { + Status = (s32)XST_DEVICE_IS_STARTED; + } + return Status; +} + +/****************************************************************************/ +/** +* +* 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 &= (u32)(~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 = (u32)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 &= (u32)(~XSCUTIMER_CONTROL_PRESCALER_MASK); + + /* + * Set the prescaler value. + */ + ControlReg |= (((u32)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 (u8)(ControlReg >> XSCUTIMER_CONTROL_PRESCALER_SHIFT); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer.h new file mode 100644 index 0000000..ea4ba79 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer.h @@ -0,0 +1,368 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer.h +* @addtogroup scutimer_v2_1 +* @{ +* @details +* +* 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) +* +* Initialization and Configuration +* +* 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. +* +* Interrupts +* +* 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. +* +* Virtual Memory +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Asserts +* +* 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. +* +* Building the driver +* +* 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. +* +*

    +* +* NOTE: +* The timer is not a part of the snoop control unit as indicated by the +* prefix "scu" in the name of the driver. +* It is an independent module in APU. +* +*
    +* 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.
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +* 
    +* +******************************************************************************/ +#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 + */ +s32 XScuTimer_SelfTest(XScuTimer *InstancePtr); + +/* + * Interface functions in xscutimer.c + */ +s32 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_g.c new file mode 100644 index 0000000..6ccfa91 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_g.c @@ -0,0 +1,55 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xscutimer.h" + +/* +* The configuration table for devices +*/ + +XScuTimer_Config XScuTimer_ConfigTable[XPAR_XSCUTIMER_NUM_INSTANCES] = +{ + { + XPAR_PS7_SCUTIMER_0_DEVICE_ID, + XPAR_PS7_SCUTIMER_0_BASEADDR + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_hw.h new file mode 100644 index 0000000..ac7b429 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_hw.h @@ -0,0 +1,287 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer_hw.h +* @addtogroup scutimer_v2_1 +* @{ +* +* This file contains the hardware interface to the Timer. +* +*
    +* 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.
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ +#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 0x00U /**< Timer Load Register */ +#define XSCUTIMER_COUNTER_OFFSET 0x04U /**< Timer Counter Register */ +#define XSCUTIMER_CONTROL_OFFSET 0x08U /**< Timer Control Register */ +#define XSCUTIMER_ISR_OFFSET 0x0CU /**< 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 0x0000FF00U /**< Prescaler */ +#define XSCUTIMER_CONTROL_PRESCALER_SHIFT 8U +#define XSCUTIMER_CONTROL_IRQ_ENABLE_MASK 0x00000004U /**< Intr enable */ +#define XSCUTIMER_CONTROL_AUTO_RELOAD_MASK 0x00000002U /**< Auto-reload */ +#define XSCUTIMER_CONTROL_ENABLE_MASK 0x00000001U /**< Timer enable */ +/* @} */ + +/** @name Interrupt Status register + * This register indicates the Timer counter register has reached zero. + * @{ + */ + +#define XSCUTIMER_ISR_EVENT_FLAG_MASK 0x00000001U /**< 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_selftest.c new file mode 100644 index 0000000..6e37fef --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_selftest.c @@ -0,0 +1,139 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer_selftest.c +* @addtogroup scutimer_v2_1 +* @{ +* +* Contains diagnostic self-test functions for the XScuTimer driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- ---------------------------------------------
    +* 1.00a nm  03/10/10 First release
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xscutimer.h" + +/************************** Constant Definitions *****************************/ + +#define XSCUTIMER_SELFTEST_VALUE 0xA55AF00FU + +/**************************** 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. +* +******************************************************************************/ +s32 XScuTimer_SelfTest(XScuTimer *InstancePtr) +{ + u32 Register; + u32 CtrlOrig; + u32 LoadOrig; + s32 Status; + + /* + * 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 & (u32)(~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) { + Status = (s32)XST_FAILURE; + } + else { + Status = (s32)XST_SUCCESS; + } + + return Status; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_sinit.c new file mode 100644 index 0000000..3bcc57e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scutimer_v2_1/src/xscutimer_sinit.c @@ -0,0 +1,96 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscutimer_sinit.c +* @addtogroup scutimer_v2_1 +* @{ +* +* This file contains method for static initialization (compile-time) of the +* driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- ---------------------------------------------
    +* 1.00a nm  03/10/10 First release
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xscutimer.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions ****************************/ +extern XScuTimer_Config XScuTimer_ConfigTable[XPAR_XSCUTIMER_NUM_INSTANCES]; + +/************************** 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) +{ + XScuTimer_Config *CfgPtr = NULL; + u32 Index; + + for (Index = 0U; Index < XPAR_XSCUTIMER_NUM_INSTANCES; Index++) { + if (XScuTimer_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XScuTimer_ConfigTable[Index]; + break; + } + } + + return (XScuTimer_Config *)CfgPtr; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt.c new file mode 100644 index 0000000..cd9e15d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt.c @@ -0,0 +1,217 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt.c +* @addtogroup scuwdt_v2_1 +* @{ +* +* Contains the implementation of interface functions of the XScuWdt driver. +* See xscuwdt.h for a description of the driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- ---------------------------------------------
    +* 1.00a sdm 01/15/10 First release
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** 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. +* +******************************************************************************/ +s32 XScuWdt_CfgInitialize(XScuWdt *InstancePtr, + XScuWdt_Config *ConfigPtr, u32 EffectiveAddress) +{ + s32 CfgStatus; + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + Xil_AssertNonvoid(EffectiveAddress != 0x00U); + + /* + * 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) { + CfgStatus = (s32)XST_DEVICE_IS_STARTED; + } + else { + /* + * 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 = 0U; + + /* + * 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; + + CfgStatus =(s32)XST_SUCCESS; + } + return CfgStatus; +} + +/****************************************************************************/ +/** +* +* 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 &= (u32)(~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 = 0U; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt.h new file mode 100644 index 0000000..372bbc3 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt.h @@ -0,0 +1,383 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt.h +* @addtogroup scuwdt_v2_1 +* @{ +* @details +* +* 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. +* +* Initialization and Configuration +* +* 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. +* +* Interrupts +* +* 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. +* +* Virtual Memory +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* Asserts +* +* 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. +* +* Building the driver +* +* 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. +* +*

    +* +* NOTE: +* The watchdog timer is not a part of the snoop control unit as indicated +* by the prefix "scu" in the name of the driver. +* It is an independent module in APU. +* +*
    +* 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.
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +*       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    +*                    generation.
    +* 
    +* +******************************************************************************/ +#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 + */ +s32 XScuWdt_SelfTest(XScuWdt *InstancePtr); + +/* + * Interface functions in xscuwdt.c + */ +s32 XScuWdt_CfgInitialize(XScuWdt *InstancePtr, + XScuWdt_Config *ConfigPtr, u32 EffectiveAddress); + +void XScuWdt_Start(XScuWdt *InstancePtr); + +void XScuWdt_Stop(XScuWdt *InstancePtr); + + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_g.c new file mode 100644 index 0000000..5d6307d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_g.c @@ -0,0 +1,55 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xscuwdt.h" + +/* +* The configuration table for devices +*/ + +XScuWdt_Config XScuWdt_ConfigTable[XPAR_XSCUWDT_NUM_INSTANCES] = +{ + { + XPAR_PS7_SCUWDT_0_DEVICE_ID, + XPAR_PS7_SCUWDT_0_BASEADDR + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_hw.h new file mode 100644 index 0000000..2067d3a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_hw.h @@ -0,0 +1,182 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt_hw.h +* @addtogroup scuwdt_v2_1 +* @{ +* +* This file contains the hardware interface to the Xilinx SCU private Watch Dog +* Timer (XSCUWDT). +* +*
    +* 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.
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ +#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 0x00U /**< Watchdog Load Register */ +#define XSCUWDT_COUNTER_OFFSET 0x04U /**< Watchdog Counter Register */ +#define XSCUWDT_CONTROL_OFFSET 0x08U /**< Watchdog Control Register */ +#define XSCUWDT_ISR_OFFSET 0x0CU /**< Watchdog Interrupt Status Register */ +#define XSCUWDT_RST_STS_OFFSET 0x10U /**< Watchdog Reset Status Register */ +#define XSCUWDT_DISABLE_OFFSET 0x14U /**< 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 0x0000FF00U /**< Prescaler */ +#define XSCUWDT_CONTROL_PRESCALER_SHIFT 8U +#define XSCUWDT_CONTROL_WD_MODE_MASK 0x00000008U /**< Watchdog/Timer mode */ +#define XSCUWDT_CONTROL_IT_ENABLE_MASK 0x00000004U /**< Intr enable (in + timer mode) */ +#define XSCUWDT_CONTROL_AUTO_RELOAD_MASK 0x00000002U /**< Auto-reload (in + timer mode) */ +#define XSCUWDT_CONTROL_WD_ENABLE_MASK 0x00000001U /**< Watchdog enable */ +/* @} */ + +/** @name Interrupt Status register + * This register indicates the Counter register has reached zero in Counter + * mode. + * @{ + */ + +#define XSCUWDT_ISR_EVENT_FLAG_MASK 0x00000001U /**< 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 0x00000001U /**< 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 0x12345678U /**< Watchdog mode disable + value 1 */ +#define XSCUWDT_DISABLE_VALUE2 0x87654321U /**< 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) + ((u32)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) + ((u32)RegOffset), ((u32)Data)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_selftest.c new file mode 100644 index 0000000..95d5065 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_selftest.c @@ -0,0 +1,131 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt_selftest.c +* @addtogroup scuwdt_v2_1 +* @{ +* +* Contains diagnostic self-test functions for the XScuWdt driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- ---------------------------------------------
    +* 1.00a sdm 01/15/10 First release
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** 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. +* +******************************************************************************/ +s32 XScuWdt_SelfTest(XScuWdt *InstancePtr) +{ + s32 SelfTestStatus; + 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 & (u32)(~XSCUWDT_CONTROL_WD_ENABLE_MASK)); + + LoadOrig = XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, + XSCUWDT_LOAD_OFFSET); + XScuWdt_LoadWdt(InstancePtr, 0xFFFFFFFFU); + + /* + * Start the watchdog timer and check if the watchdog counter is + * decrementing. + */ + XScuWdt_SetControlReg(InstancePtr, + CtrlOrig | (u32)XSCUWDT_CONTROL_WD_ENABLE_MASK); + + Register = XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, + XSCUWDT_COUNTER_OFFSET); + + XScuWdt_LoadWdt(InstancePtr, LoadOrig); + XScuWdt_SetControlReg(InstancePtr, CtrlOrig); + + if (Register == 0xFFFFFFFFU) { + SelfTestStatus = (s32)XST_FAILURE; + } + else { + SelfTestStatus = (s32)XST_SUCCESS; + } + + return SelfTestStatus; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_sinit.c new file mode 100644 index 0000000..c63eb9a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/scuwdt_v2_1/src/xscuwdt_sinit.c @@ -0,0 +1,96 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscuwdt_sinit.c +* @addtogroup scuwdt_v2_1 +* @{ +* +* This file contains method for static initialization (compile-time) of the +* driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who Date     Changes
    +* ----- --- -------- ---------------------------------------------
    +* 1.00a sdm 01/15/10 First release
    +* 2.1 	sk  02/26/15 Modified the code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xscuwdt.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +extern XScuWdt_Config XScuWdt_ConfigTable[XPAR_XSCUWDT_NUM_INSTANCES]; + +/*****************************************************************************/ +/** +* 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) +{ + XScuWdt_Config *CfgPtr = NULL; + u32 Index; + + for (Index = 0U; Index < XPAR_XSCUWDT_NUM_INSTANCES; Index++) { + if (XScuWdt_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XScuWdt_ConfigTable[Index]; + break; + } + } + + return (XScuWdt_Config *)CfgPtr; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps.c new file mode 100644 index 0000000..8b1f113 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps.c @@ -0,0 +1,1763 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xsdps.c +* @addtogroup sdps_v3_5 +* @{ +* +* Contains the interface functions of the XSdPs driver. +* See xsdps.h for a detailed description of the device and driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ---    -------- -----------------------------------------------
    +* 1.00a hk/sg  10/17/13 Initial release
    +* 2.0   hk     12/13/13 Added check for arm to use sleep.h and its API's
    +* 2.1   hk     04/18/14 Add sleep for microblaze designs. CR# 781117.
    +* 2.2   hk     07/28/14 Make changes to enable use of data cache.
    +* 2.3   sk     09/23/14 Send command for relative card address
    +*                       when re-initialization is done.CR# 819614.
    +*						Use XSdPs_Change_ClkFreq API whenever changing
    +*						clock.CR# 816586.
    +* 2.4	sk	   12/04/14 Added support for micro SD without
    +* 						WP/CD. CR# 810655.
    +*						Checked for DAT Inhibit mask instead of CMD
    +* 						Inhibit mask in Cmd Transfer API.
    +*						Added Support for SD Card v1.0
    +* 2.5 	sg	   07/09/15 Added SD 3.0 features
    +*       kvn    07/15/15 Modified the code according to MISRAC-2012.
    +* 2.6   sk     10/12/15 Added support for SD card v1.0 CR# 840601.
    +* 2.7   sk     11/24/15 Considered the slot type befoe checking CD/WP pins.
    +*       sk     12/10/15 Added support for MMC cards.
    +*       sk     02/16/16 Corrected the Tuning logic.
    +*       sk     03/01/16 Removed Bus Width check for eMMC. CR# 938311.
    +* 2.8   sk     05/03/16 Standard Speed for SD to 19MHz in ZynqMPSoC. CR#951024
    +* 3.0   sk     06/09/16 Added support for mkfs to calculate sector count.
    +*       sk     07/16/16 Added support for UHS modes.
    +*       sk     07/07/16 Used usleep API for both arm and microblaze.
    +*       sk     07/16/16 Added Tap delays accordingly to different SD/eMMC
    +*                       operating modes.
    +* 3.1   mi     09/07/16 Removed compilation warnings with extra compiler flags.
    +*       sk     10/13/16 Reduced the delay during power cycle to 1ms as per spec
    +*       sk     10/19/16 Used emmc_hwreset pin to reset eMMC.
    +*       sk     11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
    +* 3.2   sk     11/30/16 Modified the voltage switching sequence as per spec.
    +*       sk     02/01/17 Added HSD and DDR mode support for eMMC.
    +*       vns    02/09/17 Added ARMA53_32 support for ZynqMP CR#968397
    +*       sk     03/20/17 Add support for EL1 non-secure mode.
    +* 3.3   mn     05/17/17 Add support for 64bit DMA addressing
    +*       mn     07/17/17 Add support for running SD at 200MHz
    +*       mn     07/26/17 Fixed compilation warnings
    +*       mn     08/07/17 Modify driver to support 64-bit DMA in arm64 only
    +*       mn     08/17/17 Added CCI support for A53 and disabled data cache
    +*                       operations when it is enabled.
    +*       mn     08/22/17 Updated for Word Access System support
    +*       mn     09/06/17 Resolved compilation errors with IAR toolchain
    +*       mn     09/26/17 Added UHS_MODE_ENABLE macro to enable UHS mode
    +* 3.4   mn     10/17/17 Use different commands for single and multi block
    +*                       transfers
    +*       mn     03/02/18 Move UHS macro check to SD card initialization routine
    +* 3.5   mn     04/18/18 Resolve compilation warnings for sdps driver
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xsdps.h" +#include "sleep.h" + +/************************** Constant Definitions *****************************/ +#define XSDPS_CMD8_VOL_PATTERN 0x1AAU +#define XSDPS_RESPOCR_READY 0x80000000U +#define XSDPS_ACMD41_HCS 0x40000000U +#define XSDPS_ACMD41_3V3 0x00300000U +#define XSDPS_CMD1_HIGH_VOL 0x00FF8000U +#define XSDPS_CMD1_DUAL_VOL 0x00FF8010U +#define HIGH_SPEED_SUPPORT 0x2U +#define UHS_SDR50_SUPPORT 0x4U +#define WIDTH_4_BIT_SUPPORT 0x4U +#define SD_CLK_25_MHZ 25000000U +#define SD_CLK_19_MHZ 19000000U +#define SD_CLK_26_MHZ 26000000U +#define EXT_CSD_DEVICE_TYPE_BYTE 196U +#define EXT_CSD_SEC_COUNT_BYTE1 212U +#define EXT_CSD_SEC_COUNT_BYTE2 213U +#define EXT_CSD_SEC_COUNT_BYTE3 214U +#define EXT_CSD_SEC_COUNT_BYTE4 215U +#define EXT_CSD_DEVICE_TYPE_HIGH_SPEED 0x2U +#define EXT_CSD_DEVICE_TYPE_DDR_1V8_HIGH_SPEED 0x4U +#define EXT_CSD_DEVICE_TYPE_DDR_1V2_HIGH_SPEED 0x8U +#define EXT_CSD_DEVICE_TYPE_SDR_1V8_HS200 0x10U +#define EXT_CSD_DEVICE_TYPE_SDR_1V2_HS200 0x20U +#define CSD_SPEC_VER_3 0x3U +#define SCR_SPEC_VER_3 0x80U + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +u32 XSdPs_FrameCmd(XSdPs *InstancePtr, u32 Cmd); +s32 XSdPs_CmdTransfer(XSdPs *InstancePtr, u32 Cmd, u32 Arg, u32 BlkCnt); +void XSdPs_SetupADMA2DescTbl(XSdPs *InstancePtr, u32 BlkCnt, const u8 *Buff); +extern s32 XSdPs_Uhs_ModeInit(XSdPs *InstancePtr, u8 Mode); +static s32 XSdPs_IdentifyCard(XSdPs *InstancePtr); +static s32 XSdPs_Switch_Voltage(XSdPs *InstancePtr); + +u16 TransferMode; +/*****************************************************************************/ +/** +* +* Initializes a specific XSdPs instance such that the driver is ready to use. +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* @param ConfigPtr is a reference to a structure containing information +* about a specific SD 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 This function initializes the host controller. +* Initial clock of 400KHz is set. +* Voltage of 3.3V is selected as that is supported by host. +* Interrupts status is enabled and signal disabled by default. +* Default data direction is card to host and +* 32 bit ADMA2 is selected. Defualt Block size is 512 bytes. +* +******************************************************************************/ +s32 XSdPs_CfgInitialize(XSdPs *InstancePtr, XSdPs_Config *ConfigPtr, + u32 EffectiveAddr) +{ + s32 Status; + u8 PowerLevel; + u8 ReadReg; + + 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->IsReady = XIL_COMPONENT_IS_READY; + InstancePtr->Config.CardDetect = ConfigPtr->CardDetect; + InstancePtr->Config.WriteProtect = ConfigPtr->WriteProtect; + InstancePtr->Config.BusWidth = ConfigPtr->BusWidth; + InstancePtr->Config.BankNumber = ConfigPtr->BankNumber; + InstancePtr->Config.HasEMIO = ConfigPtr->HasEMIO; + InstancePtr->Config.IsCacheCoherent = ConfigPtr->IsCacheCoherent; + InstancePtr->SectorCount = 0; + InstancePtr->Mode = XSDPS_DEFAULT_SPEED_MODE; + InstancePtr->Config_TapDelay = NULL; + + /* Disable bus power and issue emmc hw reset */ + if ((XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL_VER_OFFSET) & XSDPS_HC_SPEC_VER_MASK) == + XSDPS_HC_SPEC_V3) + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_POWER_CTRL_OFFSET, XSDPS_PC_EMMC_HW_RST_MASK); + else + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_POWER_CTRL_OFFSET, 0x0); + + /* Delay to poweroff card */ + (void)usleep(1000U); + + /* "Software reset for all" is initiated */ + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, XSDPS_SW_RST_OFFSET, + XSDPS_SWRST_ALL_MASK); + + /* Proceed with initialization only after reset is complete */ + ReadReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress, + XSDPS_SW_RST_OFFSET); + while ((ReadReg & XSDPS_SWRST_ALL_MASK) != 0U) { + ReadReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress, + XSDPS_SW_RST_OFFSET); + } + /* Host Controller version is read. */ + InstancePtr->HC_Version = + (u8)(XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL_VER_OFFSET) & XSDPS_HC_SPEC_VER_MASK); + + /* + * Read capabilities register and update it in Instance pointer. + * It is sufficient to read this once on power on. + */ + InstancePtr->Host_Caps = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_CAPS_OFFSET); + + /* Select voltage and enable bus power. */ + if (InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_POWER_CTRL_OFFSET, + (XSDPS_PC_BUS_VSEL_3V3_MASK | XSDPS_PC_BUS_PWR_MASK) & + ~XSDPS_PC_EMMC_HW_RST_MASK); + else + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_POWER_CTRL_OFFSET, + XSDPS_PC_BUS_VSEL_3V3_MASK | XSDPS_PC_BUS_PWR_MASK); + + /* Delay before issuing the command after emmc reset */ + if (InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) + if ((InstancePtr->Host_Caps & XSDPS_CAPS_SLOT_TYPE_MASK) == + XSDPS_CAPS_EMB_SLOT) + usleep(200); + + /* Change the clock frequency to 400 KHz */ + Status = XSdPs_Change_ClkFreq(InstancePtr, XSDPS_CLK_400_KHZ); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH ; + } + + if ((InstancePtr->Host_Caps & XSDPS_CAP_VOLT_3V3_MASK) != 0U) { + PowerLevel = XSDPS_PC_BUS_VSEL_3V3_MASK; + } else if ((InstancePtr->Host_Caps & XSDPS_CAP_VOLT_3V0_MASK) != 0U) { + PowerLevel = XSDPS_PC_BUS_VSEL_3V0_MASK; + } else if ((InstancePtr->Host_Caps & XSDPS_CAP_VOLT_1V8_MASK) != 0U) { + PowerLevel = XSDPS_PC_BUS_VSEL_1V8_MASK; + } else { + PowerLevel = 0U; + } + + /* Select voltage based on capability and enable bus power. */ + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_POWER_CTRL_OFFSET, + PowerLevel | XSDPS_PC_BUS_PWR_MASK); + +#ifdef __aarch64__ + /* Enable ADMA2 in 64bit mode. */ + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL1_OFFSET, + XSDPS_HC_DMA_ADMA2_64_MASK); +#else + /* Enable ADMA2 in 32bit mode. */ + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL1_OFFSET, + XSDPS_HC_DMA_ADMA2_32_MASK); +#endif + + /* Enable all interrupt status except card interrupt initially */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_EN_OFFSET, + XSDPS_NORM_INTR_ALL_MASK & (~XSDPS_INTR_CARD_MASK)); + + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_EN_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + + /* Disable all interrupt signals by default. */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_SIG_EN_OFFSET, 0x0U); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_SIG_EN_OFFSET, 0x0U); + + /* + * Transfer mode register - default value + * DMA enabled, block count enabled, data direction card to host(read) + */ + TransferMode = XSDPS_TM_DMA_EN_MASK | XSDPS_TM_BLK_CNT_EN_MASK | + XSDPS_TM_DAT_DIR_SEL_MASK; + + /* Set block size to 512 by default */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_BLK_SIZE_OFFSET, XSDPS_BLK_SIZE_512_MASK); + + Status = XST_SUCCESS; + +RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* SD initialization is done in this function +* +* +* @param InstancePtr is a pointer to the instance to be worked on. +* +* @return +* - XST_SUCCESS if initialization was successful +* - XST_FAILURE if failure - could be because +* a) SD is already initialized +* b) There is no card inserted +* c) One of the steps (commands) in the + initialization cycle failed +* +* @note This function initializes the SD card by following its +* initialization and identification state diagram. +* CMD0 is sent to reset card. +* CMD8 and ACDM41 are sent to identify voltage and +* high capacity support +* CMD2 and CMD3 are sent to obtain Card ID and +* Relative card address respectively. +* CMD9 is sent to read the card specific data. +* +******************************************************************************/ +s32 XSdPs_SdCardInitialize(XSdPs *InstancePtr) +{ + u32 PresentStateReg; + s32 Status; + u32 RespOCR; + u32 CSD[4]; + u32 Arg; + u8 ReadReg; + u32 BlkLen, DeviceSize, Mult; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + +#ifndef UHS_MODE_ENABLE + InstancePtr->Config.BusWidth = XSDPS_WIDTH_4; +#endif + + if ((InstancePtr->HC_Version != XSDPS_HC_SPEC_V3) || + ((InstancePtr->Host_Caps & XSDPS_CAPS_SLOT_TYPE_MASK) + != XSDPS_CAPS_EMB_SLOT)) { + if(InstancePtr->Config.CardDetect != 0U) { + /* + * Check the present state register to make sure + * card is inserted and detected by host controller + */ + PresentStateReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + if ((PresentStateReg & XSDPS_PSR_CARD_INSRT_MASK) == 0U) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + } + + /* CMD0 no response expected */ + Status = XSdPs_CmdTransfer(InstancePtr, (u32)CMD0, 0U, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * CMD8; response expected + * 0x1AA - Supply Voltage 2.7 - 3.6V and AA is pattern + */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD8, + XSDPS_CMD8_VOL_PATTERN, 0U); + if ((Status != XST_SUCCESS) && (Status != XSDPS_CT_ERROR)) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if (Status == XSDPS_CT_ERROR) { + /* "Software reset for all" is initiated */ + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, XSDPS_SW_RST_OFFSET, + XSDPS_SWRST_CMD_LINE_MASK); + + /* Proceed with initialization only after reset is complete */ + ReadReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress, + XSDPS_SW_RST_OFFSET); + while ((ReadReg & XSDPS_SWRST_CMD_LINE_MASK) != 0U) { + ReadReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress, + XSDPS_SW_RST_OFFSET); + } + } + + RespOCR = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + if (RespOCR != XSDPS_CMD8_VOL_PATTERN) { + InstancePtr->Card_Version = XSDPS_SD_VER_1_0; + } + else { + InstancePtr->Card_Version = XSDPS_SD_VER_2_0; + } + + RespOCR = 0U; + /* Send ACMD41 while card is still busy with power up */ + while ((RespOCR & XSDPS_RESPOCR_READY) == 0U) { + Status = XSdPs_CmdTransfer(InstancePtr, CMD55, 0U, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Arg = XSDPS_ACMD41_HCS | XSDPS_ACMD41_3V3 | (0x1FFU << 15U); + /* + * There is no support to switch to 1.8V and use UHS mode on + * 1.0 silicon + */ + if ((InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) && +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) || (PSU_PMU) + (XGetPSVersion_Info() > XPS_VERSION_1) && +#endif + (InstancePtr->Config.BusWidth == XSDPS_WIDTH_8)) { + Arg |= XSDPS_OCR_S18; + } + + /* 0x40300000 - Host High Capacity support & 3.3V window */ + Status = XSdPs_CmdTransfer(InstancePtr, ACMD41, + Arg, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Response with card capacity */ + RespOCR = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + } + + /* Update HCS support flag based on card capacity response */ + if ((RespOCR & XSDPS_ACMD41_HCS) != 0U) { + InstancePtr->HCS = 1U; + } + + if ((RespOCR & XSDPS_OCR_S18) != 0U) { + InstancePtr->Switch1v8 = 1U; + Status = XSdPs_Switch_Voltage(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + + /* CMD2 for Card ID */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD2, 0U, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + InstancePtr->CardID[0] = + XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + InstancePtr->CardID[1] = + XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_RESP1_OFFSET); + InstancePtr->CardID[2] = + XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_RESP2_OFFSET); + InstancePtr->CardID[3] = + XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_RESP3_OFFSET); + do { + Status = XSdPs_CmdTransfer(InstancePtr, CMD3, 0U, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Relative card address is stored as the upper 16 bits + * This is to avoid shifting when sending commands + */ + InstancePtr->RelCardAddr = + XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET) & 0xFFFF0000U; + } while (InstancePtr->RelCardAddr == 0U); + + Status = XSdPs_CmdTransfer(InstancePtr, CMD9, (InstancePtr->RelCardAddr), 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Card specific data is read. + * Currently not used for any operation. + */ + CSD[0] = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + CSD[1] = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP1_OFFSET); + CSD[2] = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP2_OFFSET); + CSD[3] = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP3_OFFSET); + + if (((CSD[3] & CSD_STRUCT_MASK) >> 22U) == 0U) { + BlkLen = 1 << ((CSD[2] & READ_BLK_LEN_MASK) >> 8U); + Mult = 1 << (((CSD[1] & C_SIZE_MULT_MASK) >> 7U) + 2U); + DeviceSize = (CSD[1] & C_SIZE_LOWER_MASK) >> 22U; + DeviceSize |= (CSD[2] & C_SIZE_UPPER_MASK) << 10U; + DeviceSize = (DeviceSize + 1U) * Mult; + DeviceSize = DeviceSize * BlkLen; + InstancePtr->SectorCount = (DeviceSize/XSDPS_BLK_SIZE_512_MASK); + } else if (((CSD[3] & CSD_STRUCT_MASK) >> 22U) == 1U) { + InstancePtr->SectorCount = (((CSD[1] & CSD_V2_C_SIZE_MASK) >> 8U) + + 1U) * 1024U; + } + + Status = XST_SUCCESS; + +RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* Initialize Card with Identification mode sequence +* +* +* @param InstancePtr is a pointer to the instance to be worked on. +* +* @return +* - XST_SUCCESS if initialization was successful +* - XST_FAILURE if failure - could be because +* a) SD is already initialized +* b) There is no card inserted +* c) One of the steps (commands) in the +* initialization cycle failed +* +* +******************************************************************************/ +s32 XSdPs_CardInitialize(XSdPs *InstancePtr) +{ +#ifdef __ICCARM__ +#pragma data_alignment = 32 + static u8 ExtCsd[512]; + u8 SCR[8] = { 0U }; +#pragma data_alignment = 4 +#else + static u8 ExtCsd[512] __attribute__ ((aligned(32))); + u8 SCR[8] __attribute__ ((aligned(32))) = { 0U }; +#endif + u8 ReadBuff[64] = { 0U }; + s32 Status; + u32 Arg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Default settings */ + InstancePtr->BusWidth = XSDPS_1_BIT_WIDTH; + InstancePtr->CardType = XSDPS_CARD_SD; + InstancePtr->Switch1v8 = 0U; + InstancePtr->BusSpeed = XSDPS_CLK_400_KHZ; + + if ((InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) && + ((InstancePtr->Host_Caps & XSDPS_CAPS_SLOT_TYPE_MASK) + == XSDPS_CAPS_EMB_SLOT)) { + InstancePtr->CardType = XSDPS_CHIP_EMMC; + } else { + Status = XSdPs_IdentifyCard(InstancePtr); + if (Status == XST_FAILURE) { + goto RETURN_PATH; + } + } + + if ((InstancePtr->CardType != XSDPS_CARD_SD) && + (InstancePtr->CardType != XSDPS_CARD_MMC) && + (InstancePtr->CardType != XSDPS_CHIP_EMMC)) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if (InstancePtr->CardType == XSDPS_CARD_SD) { + Status = XSdPs_SdCardInitialize(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Change clock to default clock 25MHz */ + /* + * SD default speed mode timing should be closed at 19 MHz. + * The reason for this is SD requires a voltage level shifter. + * This limitation applies to ZynqMPSoC. + */ + if (InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) + InstancePtr->BusSpeed = SD_CLK_19_MHZ; + else + InstancePtr->BusSpeed = SD_CLK_25_MHZ; + Status = XSdPs_Change_ClkFreq(InstancePtr, InstancePtr->BusSpeed); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + } else if ((InstancePtr->CardType == XSDPS_CARD_MMC) + || (InstancePtr->CardType == XSDPS_CHIP_EMMC)) { + Status = XSdPs_MmcCardInitialize(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + /* Change clock to default clock 26MHz */ + InstancePtr->BusSpeed = SD_CLK_26_MHZ; + Status = XSdPs_Change_ClkFreq(InstancePtr, InstancePtr->BusSpeed); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } else { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Status = XSdPs_Select_Card(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if (InstancePtr->CardType == XSDPS_CARD_SD) { + /* Pull-up disconnected during data transfer */ + Status = XSdPs_Pullup(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Status = XSdPs_Get_BusWidth(InstancePtr, SCR); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if ((SCR[1] & WIDTH_4_BIT_SUPPORT) != 0U) { + Status = XSdPs_Change_BusWidth(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + + /* Get speed supported by device */ + Status = XSdPs_Get_BusSpeed(InstancePtr, ReadBuff); + if (Status != XST_SUCCESS) { + goto RETURN_PATH; + } + + if (((SCR[2] & SCR_SPEC_VER_3) != 0U) && + (ReadBuff[13] >= UHS_SDR50_SUPPORT) && + (InstancePtr->Config.BusWidth == XSDPS_WIDTH_8) && +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) || (PSU_PMU) + (XGetPSVersion_Info() > XPS_VERSION_1) && +#endif + (InstancePtr->Switch1v8 == 0U)) { + u16 CtrlReg, ClockReg; + + /* Stop the clock */ + CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + CtrlReg &= ~(XSDPS_CC_SD_CLK_EN_MASK | XSDPS_CC_INT_CLK_EN_MASK); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_CLK_CTRL_OFFSET, + CtrlReg); + + /* Enabling 1.8V in controller */ + CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET); + CtrlReg |= XSDPS_HC2_1V8_EN_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_HOST_CTRL2_OFFSET, + CtrlReg); + + /* Wait minimum 5mSec */ + (void)usleep(5000U); + + /* Check for 1.8V signal enable bit is cleared by Host */ + CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET); + if ((CtrlReg & XSDPS_HC2_1V8_EN_MASK) == 0U) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Wait for internal clock to stabilize */ + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET, + ClockReg | XSDPS_CC_INT_CLK_EN_MASK); + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + while((ClockReg & XSDPS_CC_INT_CLK_STABLE_MASK) == 0U) { + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + } + + /* Enable SD clock */ + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET, + ClockReg | XSDPS_CC_SD_CLK_EN_MASK); + + /* Wait for 1mSec */ + (void)usleep(1000U); + + InstancePtr->Switch1v8 = 1U; + } + +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + if (InstancePtr->Switch1v8 != 0U) { + + /* Identify the UHS mode supported by card */ + XSdPs_Identify_UhsMode(InstancePtr, ReadBuff); + + /* Set UHS-I SDR104 mode */ + Status = XSdPs_Uhs_ModeInit(InstancePtr, InstancePtr->Mode); + if (Status != XST_SUCCESS) { + goto RETURN_PATH; + } + + } else { +#endif + /* + * card supports CMD6 when SD_SPEC field in SCR register + * indicates that the Physical Layer Specification Version + * is 1.10 or later. So for SD v1.0 cmd6 is not supported. + */ + if (SCR[0] != 0U) { + /* Check for high speed support */ + if (((ReadBuff[13] & HIGH_SPEED_SUPPORT) != 0U) && + (InstancePtr->BusWidth >= XSDPS_4_BIT_WIDTH)) { + InstancePtr->Mode = XSDPS_HIGH_SPEED_MODE; +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + InstancePtr->Config_TapDelay = XSdPs_hsd_sdr25_tapdelay; +#endif + Status = XSdPs_Change_BusSpeed(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + } +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + } +#endif + + } else if (((InstancePtr->CardType == XSDPS_CARD_MMC) && + (InstancePtr->Card_Version > CSD_SPEC_VER_3)) && + (InstancePtr->HC_Version == XSDPS_HC_SPEC_V2)) { + + Status = XSdPs_Change_BusWidth(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Status = XSdPs_Get_Mmc_ExtCsd(InstancePtr, ExtCsd); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + InstancePtr->SectorCount = ((u32)ExtCsd[EXT_CSD_SEC_COUNT_BYTE4]) << 24; + InstancePtr->SectorCount |= (u32)ExtCsd[EXT_CSD_SEC_COUNT_BYTE3] << 16; + InstancePtr->SectorCount |= (u32)ExtCsd[EXT_CSD_SEC_COUNT_BYTE2] << 8; + InstancePtr->SectorCount |= (u32)ExtCsd[EXT_CSD_SEC_COUNT_BYTE1]; + + if (((ExtCsd[EXT_CSD_DEVICE_TYPE_BYTE] & + EXT_CSD_DEVICE_TYPE_HIGH_SPEED) != 0U) && + (InstancePtr->BusWidth >= XSDPS_4_BIT_WIDTH)) { + InstancePtr->Mode = XSDPS_HIGH_SPEED_MODE; + Status = XSdPs_Change_BusSpeed(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Status = XSdPs_Get_Mmc_ExtCsd(InstancePtr, ExtCsd); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if (ExtCsd[EXT_CSD_HS_TIMING_BYTE] != EXT_CSD_HS_TIMING_HIGH) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + } else if (InstancePtr->CardType == XSDPS_CHIP_EMMC){ + /* Change bus width to 8-bit */ + Status = XSdPs_Change_BusWidth(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Get Extended CSD */ + Status = XSdPs_Get_Mmc_ExtCsd(InstancePtr, ExtCsd); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + InstancePtr->SectorCount = ((u32)ExtCsd[EXT_CSD_SEC_COUNT_BYTE4]) << 24; + InstancePtr->SectorCount |= (u32)ExtCsd[EXT_CSD_SEC_COUNT_BYTE3] << 16; + InstancePtr->SectorCount |= (u32)ExtCsd[EXT_CSD_SEC_COUNT_BYTE2] << 8; + InstancePtr->SectorCount |= (u32)ExtCsd[EXT_CSD_SEC_COUNT_BYTE1]; + + /* Check for card supported speed */ + if (((ExtCsd[EXT_CSD_DEVICE_TYPE_BYTE] & + (EXT_CSD_DEVICE_TYPE_SDR_1V8_HS200 | + EXT_CSD_DEVICE_TYPE_SDR_1V2_HS200)) != 0U) && + (InstancePtr->BusWidth >= XSDPS_4_BIT_WIDTH)) { + InstancePtr->Mode = XSDPS_HS200_MODE; +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + InstancePtr->Config_TapDelay = XSdPs_sdr104_hs200_tapdelay; +#endif + } else if (((ExtCsd[EXT_CSD_DEVICE_TYPE_BYTE] & + (EXT_CSD_DEVICE_TYPE_DDR_1V8_HIGH_SPEED | + EXT_CSD_DEVICE_TYPE_DDR_1V2_HIGH_SPEED)) != 0U) && + (InstancePtr->BusWidth >= XSDPS_4_BIT_WIDTH)) { + InstancePtr->Mode = XSDPS_DDR52_MODE; +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + InstancePtr->Config_TapDelay = XSdPs_ddr50_tapdelay; +#endif + } else if (((ExtCsd[EXT_CSD_DEVICE_TYPE_BYTE] & + EXT_CSD_DEVICE_TYPE_HIGH_SPEED) != 0U) && + (InstancePtr->BusWidth >= XSDPS_4_BIT_WIDTH)) { + InstancePtr->Mode = XSDPS_HIGH_SPEED_MODE; +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + InstancePtr->Config_TapDelay = XSdPs_hsd_sdr25_tapdelay; +#endif + } else + InstancePtr->Mode = XSDPS_DEFAULT_SPEED_MODE; + + if (InstancePtr->Mode != XSDPS_DEFAULT_SPEED_MODE) { + Status = XSdPs_Change_BusSpeed(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Status = XSdPs_Get_Mmc_ExtCsd(InstancePtr, ExtCsd); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if (InstancePtr->Mode == XSDPS_HS200_MODE) { + if (ExtCsd[EXT_CSD_HS_TIMING_BYTE] != EXT_CSD_HS_TIMING_HS200) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + + if ((InstancePtr->Mode == XSDPS_HIGH_SPEED_MODE) || + InstancePtr->Mode == XSDPS_DDR52_MODE) { + if (ExtCsd[EXT_CSD_HS_TIMING_BYTE] != EXT_CSD_HS_TIMING_HIGH) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if (InstancePtr->Mode == XSDPS_DDR52_MODE) { + Status = XSdPs_Change_BusWidth(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + } + } + + /* Enable Rst_n_Fun bit if it is disabled */ + if(ExtCsd[EXT_CSD_RST_N_FUN_BYTE] == EXT_CSD_RST_N_FUN_TEMP_DIS) { + Arg = XSDPS_MMC_RST_FUN_EN_ARG; + Status = XSdPs_Set_Mmc_ExtCsd(InstancePtr, Arg); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + } + if ((InstancePtr->Mode != XSDPS_DDR52_MODE) || + (InstancePtr->CardType == XSDPS_CARD_SD)) { + Status = XSdPs_SetBlkSize(InstancePtr, XSDPS_BLK_SIZE_512_MASK); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + +RETURN_PATH: + return Status; +} + +/*****************************************************************************/ +/** +* +* Identify type of card using CMD0 + CMD1 sequence +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +******************************************************************************/ +static s32 XSdPs_IdentifyCard(XSdPs *InstancePtr) +{ + s32 Status; + u8 ReadReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* 74 CLK delay after card is powered up, before the first command. */ + usleep(XSDPS_INIT_DELAY); + + /* CMD0 no response expected */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD0, 0U, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Host High Capacity support & High voltage window */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD1, + XSDPS_ACMD41_HCS | XSDPS_CMD1_HIGH_VOL, 0U); + if (Status != XST_SUCCESS) { + InstancePtr->CardType = XSDPS_CARD_SD; + } else { + InstancePtr->CardType = XSDPS_CARD_MMC; + } + + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_NORM_INTR_ALL_MASK); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, XSDPS_ERROR_INTR_ALL_MASK); + + /* "Software reset for all" is initiated */ + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, XSDPS_SW_RST_OFFSET, + XSDPS_SWRST_CMD_LINE_MASK); + + /* Proceed with initialization only after reset is complete */ + ReadReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress, + XSDPS_SW_RST_OFFSET); + while ((ReadReg & XSDPS_SWRST_CMD_LINE_MASK) != 0U) { + ReadReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress, + XSDPS_SW_RST_OFFSET); + } + + Status = XST_SUCCESS; + +RETURN_PATH: + return Status; +} + +/*****************************************************************************/ +/** +* +* Switches the SD card voltage from 3v3 to 1v8 +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +******************************************************************************/ +static s32 XSdPs_Switch_Voltage(XSdPs *InstancePtr) +{ + s32 Status; + u16 CtrlReg; + u32 ReadReg, ClockReg; + + /* Send switch voltage command */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD11, 0U, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + } + + /* Wait for CMD and DATA line to go low */ + ReadReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + while ((ReadReg & (XSDPS_PSR_CMD_SG_LVL_MASK | + XSDPS_PSR_DAT30_SG_LVL_MASK)) != 0U) { + ReadReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + } + + /* Stop the clock */ + CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + CtrlReg &= ~(XSDPS_CC_SD_CLK_EN_MASK | XSDPS_CC_INT_CLK_EN_MASK); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_CLK_CTRL_OFFSET, + CtrlReg); + + /* Enabling 1.8V in controller */ + CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET); + CtrlReg |= XSDPS_HC2_1V8_EN_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_HOST_CTRL2_OFFSET, + CtrlReg); + + /* Wait minimum 5mSec */ + (void)usleep(5000U); + + /* Check for 1.8V signal enable bit is cleared by Host */ + CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET); + if ((CtrlReg & XSDPS_HC2_1V8_EN_MASK) == 0U) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Wait for internal clock to stabilize */ + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET, + ClockReg | XSDPS_CC_INT_CLK_EN_MASK); + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + while((ClockReg & XSDPS_CC_INT_CLK_STABLE_MASK) == 0U) { + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + } + + /* Enable SD clock */ + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET, + ClockReg | XSDPS_CC_SD_CLK_EN_MASK); + + /* Wait for 1mSec */ + (void)usleep(1000U); + + /* Wait for CMD and DATA line to go high */ + ReadReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + while ((ReadReg & (XSDPS_PSR_CMD_SG_LVL_MASK | XSDPS_PSR_DAT30_SG_LVL_MASK)) + != (XSDPS_PSR_CMD_SG_LVL_MASK | XSDPS_PSR_DAT30_SG_LVL_MASK)) { + ReadReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + } + +RETURN_PATH: + return Status; +} + +/*****************************************************************************/ +/** + +* This function does SD command generation. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Cmd is the command to be sent. +* @param Arg is the argument to be sent along with the command. +* This could be address or any other information +* @param BlkCnt - Block count passed by the user. +* +* @return +* - XST_SUCCESS if initialization was successful +* - XST_FAILURE if failure - could be because another transfer +* is in progress or command or data inhibit is set +* +******************************************************************************/ +s32 XSdPs_CmdTransfer(XSdPs *InstancePtr, u32 Cmd, u32 Arg, u32 BlkCnt) +{ + u32 PresentStateReg; + u32 CommandReg; + u32 StatusReg; + s32 Status; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Check the command inhibit to make sure no other + * command transfer is in progress + */ + PresentStateReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + if ((PresentStateReg & XSDPS_PSR_INHIBIT_CMD_MASK) != 0U) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Write block count register */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_BLK_CNT_OFFSET, (u16)BlkCnt); + + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_TIMEOUT_CTRL_OFFSET, 0xEU); + + /* Write argument register */ + XSdPs_WriteReg(InstancePtr->Config.BaseAddress, + XSDPS_ARGMT_OFFSET, Arg); + + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_NORM_INTR_ALL_MASK); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, XSDPS_ERROR_INTR_ALL_MASK); + /* Command register is set to trigger transfer of command */ + CommandReg = XSdPs_FrameCmd(InstancePtr, Cmd); + + /* + * Mask to avoid writing to reserved bits 31-30 + * This is necessary because 0x80000000 is used by this software to + * distinguish between ACMD and CMD of same number + */ + CommandReg = CommandReg & 0x3FFFU; + + /* + * Check for data inhibit in case of command using DAT lines. + * For Tuning Commands DAT lines check can be ignored. + */ + if ((Cmd != CMD21) && (Cmd != CMD19)) { + PresentStateReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + if (((PresentStateReg & (XSDPS_PSR_INHIBIT_DAT_MASK | + XSDPS_PSR_INHIBIT_DAT_MASK)) != 0U) && + ((CommandReg & XSDPS_DAT_PRESENT_SEL_MASK) != 0U)) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + + XSdPs_WriteReg(InstancePtr->Config.BaseAddress, XSDPS_XFER_MODE_OFFSET, + (CommandReg << 16) | TransferMode); + + /* Polling for response for now */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((Cmd == CMD21) || (Cmd == CMD19)) { + if ((XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET) & XSDPS_INTR_BRR_MASK) != 0U){ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_BRR_MASK); + break; + } + } + + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + Status = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET); + if ((Status & ~XSDPS_INTR_ERR_CT_MASK) == 0) { + Status = XSDPS_CT_ERROR; + } + /* Write to clear error bits */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + goto RETURN_PATH; + } + } while((StatusReg & XSDPS_INTR_CC_MASK) == 0U); + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, + XSDPS_INTR_CC_MASK); + + Status = XST_SUCCESS; + +RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* This function frames the Command register for a particular command. +* Note that this generates only the command register value i.e. +* the upper 16 bits of the transfer mode and command register. +* This value is already shifted to be upper 16 bits and can be directly +* OR'ed with transfer mode register value. +* +* @param Command to be sent. +* +* @return Command register value complete with response type and +* data, CRC and index related flags. +* +******************************************************************************/ +u32 XSdPs_FrameCmd(XSdPs *InstancePtr, u32 Cmd) +{ + u32 RetVal; + + RetVal = Cmd; + + switch(Cmd) { + case CMD0: + RetVal |= RESP_NONE; + break; + case CMD1: + RetVal |= RESP_R3; + break; + case CMD2: + RetVal |= RESP_R2; + break; + case CMD3: + RetVal |= RESP_R6; + break; + case CMD4: + RetVal |= RESP_NONE; + break; + case CMD5: + RetVal |= RESP_R1B; + break; + case CMD6: + if (InstancePtr->CardType == XSDPS_CARD_SD) { + RetVal |= RESP_R1 | (u32)XSDPS_DAT_PRESENT_SEL_MASK; + } else { + RetVal |= RESP_R1B; + } + break; + case ACMD6: + RetVal |= RESP_R1; + break; + case CMD7: + RetVal |= RESP_R1; + break; + case CMD8: + if (InstancePtr->CardType == XSDPS_CARD_SD) { + RetVal |= RESP_R1; + } else { + RetVal |= RESP_R1 | (u32)XSDPS_DAT_PRESENT_SEL_MASK; + } + break; + case CMD9: + RetVal |= RESP_R2; + break; + case CMD11: + case CMD10: + case CMD12: + case ACMD13: + case CMD16: + RetVal |= RESP_R1; + break; + case CMD17: + case CMD18: + case CMD19: + case CMD21: + RetVal |= RESP_R1 | (u32)XSDPS_DAT_PRESENT_SEL_MASK; + break; + case CMD23: + case ACMD23: + case CMD24: + case CMD25: + RetVal |= RESP_R1 | (u32)XSDPS_DAT_PRESENT_SEL_MASK; + break; + case ACMD41: + RetVal |= RESP_R3; + break; + case ACMD42: + RetVal |= RESP_R1; + break; + case ACMD51: + RetVal |= RESP_R1 | (u32)XSDPS_DAT_PRESENT_SEL_MASK; + break; + case CMD52: + case CMD55: + RetVal |= RESP_R1; + break; + case CMD58: + break; + default : + RetVal |= Cmd; + break; + } + + return RetVal; +} + +/*****************************************************************************/ +/** +* This function performs SD read in polled mode. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Arg is the address passed by the user that is to be sent as +* argument along with the command. +* @param BlkCnt - Block count passed by the user. +* @param Buff - Pointer to the data buffer for a DMA transfer. +* +* @return +* - XST_SUCCESS if initialization was successful +* - XST_FAILURE if failure - could be because another transfer +* is in progress or command or data inhibit is set +* +******************************************************************************/ +s32 XSdPs_ReadPolled(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, u8 *Buff) +{ + s32 Status; + u32 PresentStateReg; + u32 StatusReg; + + if ((InstancePtr->HC_Version != XSDPS_HC_SPEC_V3) || + ((InstancePtr->Host_Caps & XSDPS_CAPS_SLOT_TYPE_MASK) + != XSDPS_CAPS_EMB_SLOT)) { + if(InstancePtr->Config.CardDetect != 0U) { + /* Check status to ensure card is initialized */ + PresentStateReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + if ((PresentStateReg & XSDPS_PSR_CARD_INSRT_MASK) == 0x0U) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + } + + /* Set block size to 512 if not already set */ + if( XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_BLK_SIZE_OFFSET) != XSDPS_BLK_SIZE_512_MASK ) { + Status = XSdPs_SetBlkSize(InstancePtr, + XSDPS_BLK_SIZE_512_MASK); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + + XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, Buff); + if (InstancePtr->Config.IsCacheCoherent == 0) { + Xil_DCacheInvalidateRange((INTPTR)Buff, + BlkCnt * XSDPS_BLK_SIZE_512_MASK); + } + + if (BlkCnt == 1U) { + TransferMode = XSDPS_TM_BLK_CNT_EN_MASK | + XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK; + + /* Send single block read command */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD17, Arg, BlkCnt); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } else { + TransferMode = XSDPS_TM_AUTO_CMD12_EN_MASK | + XSDPS_TM_BLK_CNT_EN_MASK | XSDPS_TM_DAT_DIR_SEL_MASK | + XSDPS_TM_DMA_EN_MASK | XSDPS_TM_MUL_SIN_BLK_SEL_MASK; + + /* Send multiple blocks read command */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD18, Arg, BlkCnt); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + + /* Check for transfer complete */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* Write to clear error bits */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + Status = (s32)XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + Status = XST_SUCCESS; + +RETURN_PATH: + return Status; +} + +/*****************************************************************************/ +/** +* This function performs SD write in polled mode. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Arg is the address passed by the user that is to be sent as +* argument along with the command. +* @param BlkCnt - Block count passed by the user. +* @param Buff - Pointer to the data buffer for a DMA transfer. +* +* @return +* - XST_SUCCESS if initialization was successful +* - XST_FAILURE if failure - could be because another transfer +* is in progress or command or data inhibit is set +* +******************************************************************************/ +s32 XSdPs_WritePolled(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, const u8 *Buff) +{ + s32 Status; + u32 PresentStateReg; + u32 StatusReg; + + if ((InstancePtr->HC_Version != XSDPS_HC_SPEC_V3) || + ((InstancePtr->Host_Caps & XSDPS_CAPS_SLOT_TYPE_MASK) + != XSDPS_CAPS_EMB_SLOT)) { + if(InstancePtr->Config.CardDetect != 0U) { + /* Check status to ensure card is initialized */ + PresentStateReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + if ((PresentStateReg & XSDPS_PSR_CARD_INSRT_MASK) == 0x0U) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + } + + /* Set block size to 512 if not already set */ + if( XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_BLK_SIZE_OFFSET) != XSDPS_BLK_SIZE_512_MASK ) { + Status = XSdPs_SetBlkSize(InstancePtr, + XSDPS_BLK_SIZE_512_MASK); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + } + + XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, Buff); + if (InstancePtr->Config.IsCacheCoherent == 0) { + Xil_DCacheFlushRange((INTPTR)Buff, + BlkCnt * XSDPS_BLK_SIZE_512_MASK); + } + + if (BlkCnt == 1U) { + TransferMode = XSDPS_TM_BLK_CNT_EN_MASK | XSDPS_TM_DMA_EN_MASK; + + /* Send single block write command */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD24, Arg, BlkCnt); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } else { + TransferMode = XSDPS_TM_AUTO_CMD12_EN_MASK | + XSDPS_TM_BLK_CNT_EN_MASK | + XSDPS_TM_MUL_SIN_BLK_SEL_MASK | XSDPS_TM_DMA_EN_MASK; + + /* Send multiple blocks write command */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD25, Arg, BlkCnt); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + + /* + * Check for transfer complete + * Polling for response for now + */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* Write to clear error bits */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; +} + +/*****************************************************************************/ +/** +* +* Selects card and sets default block size +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return +* - XST_SUCCESS if successful. +* - XST_FAILURE if fail. +* +* @note None. +* +******************************************************************************/ +s32 XSdPs_Select_Card (XSdPs *InstancePtr) +{ + s32 Status = 0; + + /* Send CMD7 - Select card */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD7, + InstancePtr->RelCardAddr, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + +RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* API to setup ADMA2 descriptor table +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* @param BlkCnt - block count. +* @param Buff pointer to data buffer. +* +* @return None +* +* @note None. +* +******************************************************************************/ +void XSdPs_SetupADMA2DescTbl(XSdPs *InstancePtr, u32 BlkCnt, const u8 *Buff) +{ + u32 TotalDescLines = 0U; + u32 DescNum = 0U; + u32 BlkSize = 0U; + + /* Setup ADMA2 - Write descriptor table and point ADMA SAR to it */ + BlkSize = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_BLK_SIZE_OFFSET); + BlkSize = BlkSize & XSDPS_BLK_SIZE_MASK; + + if((BlkCnt*BlkSize) < XSDPS_DESC_MAX_LENGTH) { + + TotalDescLines = 1U; + + }else { + + TotalDescLines = ((BlkCnt*BlkSize) / XSDPS_DESC_MAX_LENGTH); + if (((BlkCnt * BlkSize) % XSDPS_DESC_MAX_LENGTH) != 0U) { + TotalDescLines += 1U; + } + + } + + for (DescNum = 0U; DescNum < (TotalDescLines-1); DescNum++) { +#ifdef __aarch64__ + InstancePtr->Adma2_DescrTbl[DescNum].Address = + (u64)((UINTPTR)Buff + (DescNum*XSDPS_DESC_MAX_LENGTH)); +#else + InstancePtr->Adma2_DescrTbl[DescNum].Address = + (u32)((UINTPTR)Buff + (DescNum*XSDPS_DESC_MAX_LENGTH)); +#endif + InstancePtr->Adma2_DescrTbl[DescNum].Attribute = + XSDPS_DESC_TRAN | XSDPS_DESC_VALID; + /* This will write '0' to length field which indicates 65536 */ + InstancePtr->Adma2_DescrTbl[DescNum].Length = + (u16)XSDPS_DESC_MAX_LENGTH; + } + +#ifdef __aarch64__ + InstancePtr->Adma2_DescrTbl[TotalDescLines-1].Address = + (u64)((UINTPTR)Buff + (DescNum*XSDPS_DESC_MAX_LENGTH)); +#else + InstancePtr->Adma2_DescrTbl[TotalDescLines-1].Address = + (u32)((UINTPTR)Buff + (DescNum*XSDPS_DESC_MAX_LENGTH)); +#endif + + InstancePtr->Adma2_DescrTbl[TotalDescLines-1].Attribute = + XSDPS_DESC_TRAN | XSDPS_DESC_END | XSDPS_DESC_VALID; + + InstancePtr->Adma2_DescrTbl[TotalDescLines-1].Length = + (u16)((BlkCnt*BlkSize) - (DescNum*XSDPS_DESC_MAX_LENGTH)); + +#ifdef __aarch64__ + XSdPs_WriteReg(InstancePtr->Config.BaseAddress, XSDPS_ADMA_SAR_EXT_OFFSET, + (u32)(((u64)&(InstancePtr->Adma2_DescrTbl[0]))>>32)); +#endif + + XSdPs_WriteReg(InstancePtr->Config.BaseAddress, XSDPS_ADMA_SAR_OFFSET, + (u32)(UINTPTR)&(InstancePtr->Adma2_DescrTbl[0])); + + if (InstancePtr->Config.IsCacheCoherent == 0) { + Xil_DCacheFlushRange((INTPTR)&(InstancePtr->Adma2_DescrTbl[0]), + sizeof(XSdPs_Adma2Descriptor) * 32U); + } +} + +/*****************************************************************************/ +/** +* Mmc initialization is done in this function +* +* +* @param InstancePtr is a pointer to the instance to be worked on. +* +* @return +* - XST_SUCCESS if initialization was successful +* - XST_FAILURE if failure - could be because +* a) MMC is already initialized +* b) There is no card inserted +* c) One of the steps (commands) in the initialization +* cycle failed +* @note This function initializes the SD card by following its +* initialization and identification state diagram. +* CMD0 is sent to reset card. +* CMD1 sent to identify voltage and high capacity support +* CMD2 and CMD3 are sent to obtain Card ID and +* Relative card address respectively. +* CMD9 is sent to read the card specific data. +* +******************************************************************************/ +s32 XSdPs_MmcCardInitialize(XSdPs *InstancePtr) +{ + u32 PresentStateReg; + s32 Status; + u32 RespOCR; + u32 CSD[4]; + u32 BlkLen, DeviceSize, Mult; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + if ((InstancePtr->HC_Version != XSDPS_HC_SPEC_V3) || + ((InstancePtr->Host_Caps & XSDPS_CAPS_SLOT_TYPE_MASK) + != XSDPS_CAPS_EMB_SLOT)) { + if(InstancePtr->Config.CardDetect != 0U) { + /* + * Check the present state register to make sure + * card is inserted and detected by host controller + */ + PresentStateReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + if ((PresentStateReg & XSDPS_PSR_CARD_INSRT_MASK) == 0U) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + } + + /* CMD0 no response expected */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD0, 0U, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + RespOCR = 0U; + /* Send CMD1 while card is still busy with power up */ + while ((RespOCR & XSDPS_RESPOCR_READY) == 0U) { + + /* Host High Capacity support & High volage window */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD1, + XSDPS_ACMD41_HCS | XSDPS_CMD1_HIGH_VOL, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Response with card capacity */ + RespOCR = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + } + + /* Update HCS support flag based on card capacity response */ + if ((RespOCR & XSDPS_ACMD41_HCS) != 0U) { + InstancePtr->HCS = 1U; + } + + /* CMD2 for Card ID */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD2, 0U, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + InstancePtr->CardID[0] = + XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + InstancePtr->CardID[1] = + XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_RESP1_OFFSET); + InstancePtr->CardID[2] = + XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_RESP2_OFFSET); + InstancePtr->CardID[3] = + XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_RESP3_OFFSET); + + /* Set relative card address */ + InstancePtr->RelCardAddr = 0x12340000U; + Status = XSdPs_CmdTransfer(InstancePtr, CMD3, (InstancePtr->RelCardAddr), 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Status = XSdPs_CmdTransfer(InstancePtr, CMD9, (InstancePtr->RelCardAddr), 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Card specific data is read. + * Currently not used for any operation. + */ + CSD[0] = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + CSD[1] = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP1_OFFSET); + CSD[2] = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP2_OFFSET); + CSD[3] = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP3_OFFSET); + + InstancePtr->Card_Version = (CSD[3] & CSD_SPEC_VER_MASK) >>18U; + + /* Calculating the memory capacity */ + BlkLen = 1 << ((CSD[2] & READ_BLK_LEN_MASK) >> 8U); + Mult = 1 << (((CSD[1] & C_SIZE_MULT_MASK) >> 7U) + 2U); + DeviceSize = (CSD[1] & C_SIZE_LOWER_MASK) >> 22U; + DeviceSize |= (CSD[2] & C_SIZE_UPPER_MASK) << 10U; + DeviceSize = (DeviceSize + 1U) * Mult; + DeviceSize = DeviceSize * BlkLen; + + InstancePtr->SectorCount = (DeviceSize/XSDPS_BLK_SIZE_512_MASK); + + Status = XST_SUCCESS; + +RETURN_PATH: + return Status; + +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps.h new file mode 100644 index 0000000..b8d979d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps.h @@ -0,0 +1,280 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xsdps.h +* @addtogroup sdps_v3_5 +* @{ +* @details +* +* This file contains the implementation of XSdPs driver. +* This driver is used initialize read from and write to the SD card. +* Features such as switching bus width to 4-bit and switching to high speed, +* changing clock frequency, block size etc. are supported. +* SD 2.0 uses 1/4 bus width and speeds of 25/50KHz. Initialization, however +* is done using 1-bit bus width and 400KHz clock frequency. +* SD commands are classified as broadcast and addressed. Commands can be +* those with response only (using only command line) or +* response + data (using command and data lines). +* Only one command can be sent at a time. During a data transfer however, +* when dsta lines are in use, certain commands (which use only the command +* line) can be sent, most often to obtain status. +* This driver does not support multi card slots at present. +* +* Intialization: +* This includes initialization on the host controller side to select +* clock frequency, bus power and default transfer related parameters. +* The default voltage is 3.3V. +* On the SD card side, the initialization and identification state diagram is +* implemented. This resets the card, gives it a unique address/ID and +* identifies key card related specifications. +* +* Data transfer: +* The SD card is put in tranfer state to read from or write to it. +* The default block size is 512 bytes and if supported, +* default bus width is 4-bit and bus speed is High speed. +* The read and write functions are implemented in polled mode using ADMA2. +* +* At any point, when key parameters such as block size or +* clock/speed or bus width are modified, this driver takes care of +* maintaining the same selection on host and card. +* All error bits in host controller are monitored by the driver and in the +* event one of them is set, driver will clear the interrupt status and +* communicate failure to the upper layer. +* +* File system use: +* This driver can be used with xilffs library to read and write files to SD. +* (Please refer to procedure in diskio.c). The file system read/write example +* in polled mode can used for reference. +* +* There is no example for using SD driver without file system at present. +* However, the driver can be used without the file system. The glue layer +* in filesytem can be used as reference for the same. The block count +* passed to the read/write function in one call is limited by the ADMA2 +* descriptor table and hence care will have to be taken to call read/write +* API's in a loop for large file sizes. +* +* Interrupt mode is not supported because it offers no improvement when used +* with file system. +* +* eMMC support: +* SD driver supports SD and eMMC based on the "enable MMC" parameter in SDK. +* The features of eMMC supported by the driver will depend on those supported +* by the host controller. The current driver supports read/write on eMMC card +* using 4-bit and high speed mode currently. +* +* Features not supported include - card write protect, password setting, +* lock/unlock, interrupts, SDMA mode, programmed I/O mode and +* 64-bit addressed ADMA2, erase/pre-erase commands. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ---    -------- -----------------------------------------------
    +* 1.00a hk/sg  10/17/13 Initial release
    +* 2.0   hk      03/07/14 Version number revised.
    +* 2.1   hk     04/18/14 Increase sleep for eMMC switch command.
    +*                       Add sleep for microblaze designs. CR# 781117.
    +* 2.2   hk     07/28/14 Make changes to enable use of data cache.
    +* 2.3   sk     09/23/14 Send command for relative card address
    +*                       when re-initialization is done.CR# 819614.
    +*						Use XSdPs_Change_ClkFreq API whenever changing
    +*						clock.CR# 816586.
    +* 2.4	sk	   12/04/14 Added support for micro SD without
    +* 						WP/CD. CR# 810655.
    +*						Checked for DAT Inhibit mask instead of CMD
    +* 						Inhibit mask in Cmd Transfer API.
    +*						Added Support for SD Card v1.0
    +* 2.5 	sg		07/09/15 Added SD 3.0 features
    +*       kvn     07/15/15 Modified the code according to MISRAC-2012.
    +* 2.6   sk     10/12/15 Added support for SD card v1.0 CR# 840601.
    +* 2.7   sk     11/24/15 Considered the slot type befoe checking CD/WP pins.
    +*       sk     12/10/15 Added support for MMC cards.
    +*              01/08/16 Added workaround for issue in auto tuning mode
    +*                       of SDR50, SDR104 and HS200.
    +*       sk     02/16/16 Corrected the Tuning logic.
    +*       sk     03/01/16 Removed Bus Width check for eMMC. CR# 938311.
    +* 2.8   sk     04/20/16 Added new workaround for auto tuning.
    +*              05/03/16 Standard Speed for SD to 19MHz in ZynqMPSoC. CR#951024
    +* 3.0   sk     06/09/16 Added support for mkfs to calculate sector count.
    +*       sk     07/16/16 Added support for UHS modes.
    +*       sk     07/07/16 Used usleep API for both arm and microblaze.
    +*       sk     07/16/16 Added Tap delays accordingly to different SD/eMMC
    +*                       operating modes.
    +*       sk     08/13/16 Removed sleep.h from xsdps.h as a temporary fix for
    +*                       CR#956899.
    +* 3.1   mi     09/07/16 Removed compilation warnings with extra compiler flags.
    +*       sk     10/13/16 Reduced the delay during power cycle to 1ms as per spec
    +*       sk     10/19/16 Used emmc_hwreset pin to reset eMMC.
    +*       sk     11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
    +*       sk     11/16/16 Issue DLL reset at 31 iteration to load new zero value.
    +* 3.2   sk     11/30/16 Modified the voltage switching sequence as per spec.
    +*       sk     02/01/17 Added HSD and DDR mode support for eMMC.
    +*       sk     02/01/17 Consider bus width parameter from design for switching
    +*       vns    02/09/17 Added ARMA53_32 support for ZynqMP CR#968397
    +*       sk     03/20/17 Add support for EL1 non-secure mode.
    +* 3.3   mn     05/17/17 Add support for 64bit DMA addressing
    +* 	mn     08/07/17 Modify driver to support 64-bit DMA in arm64 only
    +*       mn     08/17/17 Enabled CCI support for A53 by adding cache coherency
    +*                       information.
    +*       mn     09/06/17 Resolved compilation errors with IAR toolchain
    +*
    +* 
    +* +******************************************************************************/ + + +#ifndef SDPS_H_ +#define SDPS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xil_printf.h" +#include "xil_cache.h" +#include "xstatus.h" +#include "xsdps_hw.h" +#include "xplatform_info.h" +#include + +/************************** Constant Definitions *****************************/ + +#define XSDPS_CT_ERROR 0x2U /**< Command timeout flag */ +#define MAX_TUNING_COUNT 40U /**< Maximum Tuning count */ + +/**************************** Type Definitions *******************************/ + +typedef void (*XSdPs_ConfigTap) (u32 Bank, u32 DeviceId, u32 CardType); + +/** + * 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 */ + u32 CardDetect; /**< Card Detect */ + u32 WriteProtect; /**< Write Protect */ + u32 BusWidth; /**< Bus Width */ + u32 BankNumber; /**< MIO Bank selection for SD */ + u32 HasEMIO; /**< If SD is connected to EMIO */ + u8 IsCacheCoherent; /**< If SD is Cache Coherent or not */ +} XSdPs_Config; + +/* ADMA2 descriptor table */ +typedef struct { + u16 Attribute; /**< Attributes of descriptor */ + u16 Length; /**< Length of current dma transfer */ +#ifdef __aarch64__ + u64 Address; /**< Address of current dma transfer */ +#else + u32 Address; /**< Address of current dma transfer */ +#endif +#ifdef __ICCARM__ +#pragma data_alignment = 32 +} XSdPs_Adma2Descriptor; +#pragma data_alignment = 4 +#else +} __attribute__((__packed__))XSdPs_Adma2Descriptor; +#endif + +/** + * The XSdPs driver instance data. The user is required to allocate a + * variable of this type for every SD device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XSdPs_Config Config; /**< Configuration structure */ + u32 IsReady; /**< Device is initialized and ready */ + u32 Host_Caps; /**< Capabilities of host controller */ + u32 Host_CapsExt; /**< Extended Capabilities */ + u32 HCS; /**< High capacity support in card */ + u8 CardType; /**< Type of card - SD/MMC/eMMC */ + u8 Card_Version; /**< Card version */ + u8 HC_Version; /**< Host controller version */ + u8 BusWidth; /**< Current operating bus width */ + u32 BusSpeed; /**< Current operating bus speed */ + u8 Switch1v8; /**< 1.8V Switch support */ + u32 CardID[4]; /**< Card ID Register */ + u32 RelCardAddr; /**< Relative Card Address */ + u32 CardSpecData[4]; /**< Card Specific Data Register */ + u32 SectorCount; /**< Sector Count */ + u32 SdCardConfig; /**< Sd Card Configuration Register */ + u32 Mode; /**< Bus Speed Mode */ + XSdPs_ConfigTap Config_TapDelay; /**< Configuring the tap delays */ + /**< ADMA Descriptors */ +#ifdef __ICCARM__ +#pragma data_alignment = 32 + XSdPs_Adma2Descriptor Adma2_DescrTbl[32]; +#pragma data_alignment = 4 +#else + XSdPs_Adma2Descriptor Adma2_DescrTbl[32] __attribute__ ((aligned(32))); +#endif +} XSdPs; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +XSdPs_Config *XSdPs_LookupConfig(u16 DeviceId); +s32 XSdPs_CfgInitialize(XSdPs *InstancePtr, XSdPs_Config *ConfigPtr, + u32 EffectiveAddr); +s32 XSdPs_SdCardInitialize(XSdPs *InstancePtr); +s32 XSdPs_ReadPolled(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, u8 *Buff); +s32 XSdPs_WritePolled(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, const u8 *Buff); +s32 XSdPs_SetBlkSize(XSdPs *InstancePtr, u16 BlkSize); +s32 XSdPs_Select_Card (XSdPs *InstancePtr); +s32 XSdPs_Change_ClkFreq(XSdPs *InstancePtr, u32 SelFreq); +s32 XSdPs_Change_BusWidth(XSdPs *InstancePtr); +s32 XSdPs_Change_BusSpeed(XSdPs *InstancePtr); +s32 XSdPs_Get_BusWidth(XSdPs *InstancePtr, u8 *SCR); +s32 XSdPs_Get_BusSpeed(XSdPs *InstancePtr, u8 *ReadBuff); +s32 XSdPs_Pullup(XSdPs *InstancePtr); +s32 XSdPs_MmcCardInitialize(XSdPs *InstancePtr); +s32 XSdPs_CardInitialize(XSdPs *InstancePtr); +s32 XSdPs_Get_Mmc_ExtCsd(XSdPs *InstancePtr, u8 *ReadBuff); +s32 XSdPs_Set_Mmc_ExtCsd(XSdPs *InstancePtr, u32 Arg); +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) +void XSdPs_Identify_UhsMode(XSdPs *InstancePtr, u8 *ReadBuff); +void XSdPs_ddr50_tapdelay(u32 Bank, u32 DeviceId, u32 CardType); +void XSdPs_hsd_sdr25_tapdelay(u32 Bank, u32 DeviceId, u32 CardType); +void XSdPs_sdr104_hs200_tapdelay(u32 Bank, u32 DeviceId, u32 CardType); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* SD_H_ */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_g.c new file mode 100644 index 0000000..c427bed --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_g.c @@ -0,0 +1,62 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xsdps.h" + +/* +* The configuration table for devices +*/ + +XSdPs_Config XSdPs_ConfigTable[XPAR_XSDPS_NUM_INSTANCES] = +{ + { + XPAR_PS7_SD_0_DEVICE_ID, + XPAR_PS7_SD_0_BASEADDR, + XPAR_PS7_SD_0_SDIO_CLK_FREQ_HZ, + XPAR_PS7_SD_0_HAS_CD, + XPAR_PS7_SD_0_HAS_WP, + XPAR_PS7_SD_0_BUS_WIDTH, + XPAR_PS7_SD_0_MIO_BANK, + XPAR_PS7_SD_0_HAS_EMIO, + XPAR_PS7_SD_0_IS_CACHE_COHERENT + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_hw.h new file mode 100644 index 0000000..c63d8f6 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_hw.h @@ -0,0 +1,1301 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xsdps_hw.h +* @addtogroup sdps_v3_5 +* @{ +* +* 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 xsdps.h. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ---    -------- -----------------------------------------------
    +* 1.00a hk/sg  10/17/13 Initial release
    +* 2.5 	sg	   07/09/15 Added SD 3.0 features
    +*       kvn    07/15/15 Modified the code according to MISRAC-2012.
    +* 2.7   sk     12/10/15 Added support for MMC cards.
    +*       sk     03/02/16 Configured the Tap Delay values for eMMC HS200 mode.
    +* 2.8   sk     04/20/16 Added new workaround for auto tuning.
    +* 3.0   sk     06/09/16 Added support for mkfs to calculate sector count.
    +*       sk     07/16/16 Added support for UHS modes.
    +*       sk     07/16/16 Added Tap delays accordingly to different SD/eMMC
    +*                       operating modes.
    +* 3.1   sk     11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
    +* 3.2   sk     03/20/17 Add support for EL1 non-secure mode.
    +* 3.3   mn     08/22/17 Updated for Word Access System support
    +*       mn     09/06/17 Added support for ARMCC toolchain
    +* 3.4   mn     01/22/18 Separated out SDR104 and HS200 clock defines
    +*
    +* 
    +* +******************************************************************************/ + +#ifndef SD_HW_H_ +#define SD_HW_H_ + +#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 SD device. + * @{ + */ + +#define XSDPS_SDMA_SYS_ADDR_OFFSET 0x00U /**< SDMA System Address + Register */ +#define XSDPS_SDMA_SYS_ADDR_LO_OFFSET XSDPS_SDMA_SYS_ADDR_OFFSET + /**< SDMA System Address + Low Register */ +#define XSDPS_ARGMT2_LO_OFFSET 0x00U /**< Argument2 Low Register */ +#define XSDPS_SDMA_SYS_ADDR_HI_OFFSET 0x02U /**< SDMA System Address + High Register */ +#define XSDPS_ARGMT2_HI_OFFSET 0x02U /**< Argument2 High Register */ + +#define XSDPS_BLK_SIZE_OFFSET 0x04U /**< Block Size Register */ +#define XSDPS_BLK_CNT_OFFSET 0x06U /**< Block Count Register */ +#define XSDPS_ARGMT_OFFSET 0x08U /**< Argument Register */ +#define XSDPS_ARGMT1_LO_OFFSET XSDPS_ARGMT_OFFSET + /**< Argument1 Register */ +#define XSDPS_ARGMT1_HI_OFFSET 0x0AU /**< Argument1 Register */ + +#define XSDPS_XFER_MODE_OFFSET 0x0CU /**< Transfer Mode Register */ +#define XSDPS_CMD_OFFSET 0x0EU /**< Command Register */ +#define XSDPS_RESP0_OFFSET 0x10U /**< Response0 Register */ +#define XSDPS_RESP1_OFFSET 0x14U /**< Response1 Register */ +#define XSDPS_RESP2_OFFSET 0x18U /**< Response2 Register */ +#define XSDPS_RESP3_OFFSET 0x1CU /**< Response3 Register */ +#define XSDPS_BUF_DAT_PORT_OFFSET 0x20U /**< Buffer Data Port */ +#define XSDPS_PRES_STATE_OFFSET 0x24U /**< Present State */ +#define XSDPS_HOST_CTRL1_OFFSET 0x28U /**< Host Control 1 */ +#define XSDPS_POWER_CTRL_OFFSET 0x29U /**< Power Control */ +#define XSDPS_BLK_GAP_CTRL_OFFSET 0x2AU /**< Block Gap Control */ +#define XSDPS_WAKE_UP_CTRL_OFFSET 0x2BU /**< Wake Up Control */ +#define XSDPS_CLK_CTRL_OFFSET 0x2CU /**< Clock Control */ +#define XSDPS_TIMEOUT_CTRL_OFFSET 0x2EU /**< Timeout Control */ +#define XSDPS_SW_RST_OFFSET 0x2FU /**< Software Reset */ +#define XSDPS_NORM_INTR_STS_OFFSET 0x30U /**< Normal Interrupt + Status Register */ +#define XSDPS_ERR_INTR_STS_OFFSET 0x32U /**< Error Interrupt + Status Register */ +#define XSDPS_NORM_INTR_STS_EN_OFFSET 0x34U /**< Normal Interrupt + Status Enable Register */ +#define XSDPS_ERR_INTR_STS_EN_OFFSET 0x36U /**< Error Interrupt + Status Enable Register */ +#define XSDPS_NORM_INTR_SIG_EN_OFFSET 0x38U /**< Normal Interrupt + Signal Enable Register */ +#define XSDPS_ERR_INTR_SIG_EN_OFFSET 0x3AU /**< Error Interrupt + Signal Enable Register */ + +#define XSDPS_AUTO_CMD12_ERR_STS_OFFSET 0x3CU /**< Auto CMD12 Error Status + Register */ +#define XSDPS_HOST_CTRL2_OFFSET 0x3EU /**< Host Control2 Register */ +#define XSDPS_CAPS_OFFSET 0x40U /**< Capabilities Register */ +#define XSDPS_CAPS_EXT_OFFSET 0x44U /**< Capabilities Extended */ +#define XSDPS_MAX_CURR_CAPS_OFFSET 0x48U /**< Maximum Current + Capabilities Register */ +#define XSDPS_MAX_CURR_CAPS_EXT_OFFSET 0x4CU /**< Maximum Current + Capabilities Ext Register */ +#define XSDPS_FE_ERR_INT_STS_OFFSET 0x52U /**< Force Event for + Error Interrupt Status */ +#define XSDPS_FE_AUTO_CMD12_EIS_OFFSET 0x50U /**< Auto CM12 Error Interrupt + Status Register */ +#define XSDPS_ADMA_ERR_STS_OFFSET 0x54U /**< ADMA Error Status + Register */ +#define XSDPS_ADMA_SAR_OFFSET 0x58U /**< ADMA System Address + Register */ +#define XSDPS_ADMA_SAR_EXT_OFFSET 0x5CU /**< ADMA System Address + Extended Register */ +#define XSDPS_PRE_VAL_1_OFFSET 0x60U /**< Preset Value Register */ +#define XSDPS_PRE_VAL_2_OFFSET 0x64U /**< Preset Value Register */ +#define XSDPS_PRE_VAL_3_OFFSET 0x68U /**< Preset Value Register */ +#define XSDPS_PRE_VAL_4_OFFSET 0x6CU /**< Preset Value Register */ +#define XSDPS_BOOT_TOUT_CTRL_OFFSET 0x70U /**< Boot timeout control + register */ + +#define XSDPS_SHARED_BUS_CTRL_OFFSET 0xE0U /**< Shared Bus Control + Register */ +#define XSDPS_SLOT_INTR_STS_OFFSET 0xFCU /**< Slot Interrupt Status + Register */ +#define XSDPS_HOST_CTRL_VER_OFFSET 0xFEU /**< Host Controller Version + Register */ + +/* @} */ + +/** @name Control Register - Host control, Power control, + * Block Gap control and Wakeup control + * + * This register contains bits for various configuration options of + * the SD host controller. Read/Write apart from the reserved bits. + * @{ + */ + +#define XSDPS_HC_LED_MASK 0x00000001U /**< LED Control */ +#define XSDPS_HC_WIDTH_MASK 0x00000002U /**< Bus width */ +#define XSDPS_HC_BUS_WIDTH_4 0x00000002U +#define XSDPS_HC_SPEED_MASK 0x00000004U /**< High Speed */ +#define XSDPS_HC_DMA_MASK 0x00000018U /**< DMA Mode Select */ +#define XSDPS_HC_DMA_SDMA_MASK 0x00000000U /**< SDMA Mode */ +#define XSDPS_HC_DMA_ADMA1_MASK 0x00000008U /**< ADMA1 Mode */ +#define XSDPS_HC_DMA_ADMA2_32_MASK 0x00000010U /**< ADMA2 Mode - 32 bit */ +#define XSDPS_HC_DMA_ADMA2_64_MASK 0x00000018U /**< ADMA2 Mode - 64 bit */ +#define XSDPS_HC_EXT_BUS_WIDTH 0x00000020U /**< Bus width - 8 bit */ +#define XSDPS_HC_CARD_DET_TL_MASK 0x00000040U /**< Card Detect Tst Lvl */ +#define XSDPS_HC_CARD_DET_SD_MASK 0x00000080U /**< Card Detect Sig Det */ + +#define XSDPS_PC_BUS_PWR_MASK 0x00000001U /**< Bus Power Control */ +#define XSDPS_PC_BUS_VSEL_MASK 0x0000000EU /**< Bus Voltage Select */ +#define XSDPS_PC_BUS_VSEL_3V3_MASK 0x0000000EU /**< Bus Voltage 3.3V */ +#define XSDPS_PC_BUS_VSEL_3V0_MASK 0x0000000CU /**< Bus Voltage 3.0V */ +#define XSDPS_PC_BUS_VSEL_1V8_MASK 0x0000000AU /**< Bus Voltage 1.8V */ +#define XSDPS_PC_EMMC_HW_RST_MASK 0x00000010U /**< HW reset for eMMC */ + +#define XSDPS_BGC_STP_REQ_MASK 0x00000001U /**< Block Gap Stop Req */ +#define XSDPS_BGC_CNT_REQ_MASK 0x00000002U /**< Block Gap Cont Req */ +#define XSDPS_BGC_RWC_MASK 0x00000004U /**< Block Gap Rd Wait */ +#define XSDPS_BGC_INTR_MASK 0x00000008U /**< Block Gap Intr */ +#define XSDPS_BGC_SPI_MODE_MASK 0x00000010U /**< Block Gap SPI Mode */ +#define XSDPS_BGC_BOOT_EN_MASK 0x00000020U /**< Block Gap Boot Enb */ +#define XSDPS_BGC_ALT_BOOT_EN_MASK 0x00000040U /**< Block Gap Alt BootEn */ +#define XSDPS_BGC_BOOT_ACK_MASK 0x00000080U /**< Block Gap Boot Ack */ + +#define XSDPS_WC_WUP_ON_INTR_MASK 0x00000001U /**< Wakeup Card Intr */ +#define XSDPS_WC_WUP_ON_INSRT_MASK 0x00000002U /**< Wakeup Card Insert */ +#define XSDPS_WC_WUP_ON_REM_MASK 0x00000004U /**< Wakeup Card Removal */ + +/* @} */ + +/** @name Control Register - Clock control, Timeout control & Software reset + * + * This register contains bits for configuration options of clock, timeout and + * software reset. + * Read/Write except for Inter_Clock_Stable bit (read only) and reserved bits. + * @{ + */ + +#define XSDPS_CC_INT_CLK_EN_MASK 0x00000001U +#define XSDPS_CC_INT_CLK_STABLE_MASK 0x00000002U +#define XSDPS_CC_SD_CLK_EN_MASK 0x00000004U +#define XSDPS_CC_SD_CLK_GEN_SEL_MASK 0x00000020U +#define XSDPS_CC_SDCLK_FREQ_SEL_EXT_MASK 0x000000C0U +#define XSDPS_CC_SDCLK_FREQ_SEL_MASK 0x0000FF00U +#define XSDPS_CC_SDCLK_FREQ_D256_MASK 0x00008000U +#define XSDPS_CC_SDCLK_FREQ_D128_MASK 0x00004000U +#define XSDPS_CC_SDCLK_FREQ_D64_MASK 0x00002000U +#define XSDPS_CC_SDCLK_FREQ_D32_MASK 0x00001000U +#define XSDPS_CC_SDCLK_FREQ_D16_MASK 0x00000800U +#define XSDPS_CC_SDCLK_FREQ_D8_MASK 0x00000400U +#define XSDPS_CC_SDCLK_FREQ_D4_MASK 0x00000200U +#define XSDPS_CC_SDCLK_FREQ_D2_MASK 0x00000100U +#define XSDPS_CC_SDCLK_FREQ_BASE_MASK 0x00000000U +#define XSDPS_CC_MAX_DIV_CNT 256U +#define XSDPS_CC_EXT_MAX_DIV_CNT 2046U +#define XSDPS_CC_EXT_DIV_SHIFT 6U + +#define XSDPS_TC_CNTR_VAL_MASK 0x0000000FU + +#define XSDPS_SWRST_ALL_MASK 0x00000001U +#define XSDPS_SWRST_CMD_LINE_MASK 0x00000002U +#define XSDPS_SWRST_DAT_LINE_MASK 0x00000004U + +#define XSDPS_CC_MAX_NUM_OF_DIV 9U +#define XSDPS_CC_DIV_SHIFT 8U + +/* @} */ + +/** @name SD Interrupt Registers + * + * Normal and Error Interrupt Status Register + * This register shows the normal and error interrupt status. + * Status enable register affects reads of this register. + * If Signal enable register is set and the corresponding status bit is set, + * interrupt is generated. + * Write to clear except + * Error_interrupt and Card_Interrupt bits - Read only + * + * Normal and Error Interrupt Status Enable Register + * Setting this register bits enables Interrupt status. + * Read/Write except Fixed_to_0 bit (Read only) + * + * Normal and Error Interrupt Signal Enable Register + * This register is used to select which interrupt status is + * indicated to the Host System as the interrupt. + * Read/Write except Fixed_to_0 bit (Read only) + * + * All three registers have same bit definitions + * @{ + */ + +#define XSDPS_INTR_CC_MASK 0x00000001U /**< Command Complete */ +#define XSDPS_INTR_TC_MASK 0x00000002U /**< Transfer Complete */ +#define XSDPS_INTR_BGE_MASK 0x00000004U /**< Block Gap Event */ +#define XSDPS_INTR_DMA_MASK 0x00000008U /**< DMA Interrupt */ +#define XSDPS_INTR_BWR_MASK 0x00000010U /**< Buffer Write Ready */ +#define XSDPS_INTR_BRR_MASK 0x00000020U /**< Buffer Read Ready */ +#define XSDPS_INTR_CARD_INSRT_MASK 0x00000040U /**< Card Insert */ +#define XSDPS_INTR_CARD_REM_MASK 0x00000080U /**< Card Remove */ +#define XSDPS_INTR_CARD_MASK 0x00000100U /**< Card Interrupt */ +#define XSDPS_INTR_INT_A_MASK 0x00000200U /**< INT A Interrupt */ +#define XSDPS_INTR_INT_B_MASK 0x00000400U /**< INT B Interrupt */ +#define XSDPS_INTR_INT_C_MASK 0x00000800U /**< INT C Interrupt */ +#define XSDPS_INTR_RE_TUNING_MASK 0x00001000U /**< Re-Tuning Interrupt */ +#define XSDPS_INTR_BOOT_ACK_RECV_MASK 0x00002000U /**< Boot Ack Recv + Interrupt */ +#define XSDPS_INTR_BOOT_TERM_MASK 0x00004000U /**< Boot Terminate + Interrupt */ +#define XSDPS_INTR_ERR_MASK 0x00008000U /**< Error Interrupt */ +#define XSDPS_NORM_INTR_ALL_MASK 0x0000FFFFU + +#define XSDPS_INTR_ERR_CT_MASK 0x00000001U /**< Command Timeout + Error */ +#define XSDPS_INTR_ERR_CCRC_MASK 0x00000002U /**< Command CRC Error */ +#define XSDPS_INTR_ERR_CEB_MASK 0x00000004U /**< Command End Bit + Error */ +#define XSDPS_INTR_ERR_CI_MASK 0x00000008U /**< Command Index Error */ +#define XSDPS_INTR_ERR_DT_MASK 0x00000010U /**< Data Timeout Error */ +#define XSDPS_INTR_ERR_DCRC_MASK 0x00000020U /**< Data CRC Error */ +#define XSDPS_INTR_ERR_DEB_MASK 0x00000040U /**< Data End Bit Error */ +#define XSDPS_INTR_ERR_CUR_LMT_MASK 0x00000080U /**< Current Limit Error */ +#define XSDPS_INTR_ERR_AUTO_CMD12_MASK 0x00000100U /**< Auto CMD12 Error */ +#define XSDPS_INTR_ERR_ADMA_MASK 0x00000200U /**< ADMA Error */ +#define XSDPS_INTR_ERR_TR_MASK 0x00001000U /**< Tuning Error */ +#define XSDPS_INTR_VEND_SPF_ERR_MASK 0x0000E000U /**< Vendor Specific + Error */ +#define XSDPS_ERROR_INTR_ALL_MASK 0x0000F3FFU /**< Mask for error bits */ +/* @} */ + +/** @name Block Size and Block Count Register + * + * This register contains the block count for current transfer, + * block size and SDMA buffer size. + * Read/Write except for reserved bits. + * @{ + */ + +#define XSDPS_BLK_SIZE_MASK 0x00000FFFU /**< Transfer Block Size */ +#define XSDPS_SDMA_BUFF_SIZE_MASK 0x00007000U /**< Host SDMA Buffer Size */ +#define XSDPS_BLK_SIZE_1024 0x400U +#define XSDPS_BLK_SIZE_2048 0x800U +#define XSDPS_BLK_CNT_MASK 0x0000FFFFU /**< Block Count for + Current Transfer */ + +/* @} */ + +/** @name Transfer Mode and Command Register + * + * The Transfer Mode register is used to control the data transfers and + * Command register is used for command generation + * Read/Write except for reserved bits. + * @{ + */ + +#define XSDPS_TM_DMA_EN_MASK 0x00000001U /**< DMA Enable */ +#define XSDPS_TM_BLK_CNT_EN_MASK 0x00000002U /**< Block Count Enable */ +#define XSDPS_TM_AUTO_CMD12_EN_MASK 0x00000004U /**< Auto CMD12 Enable */ +#define XSDPS_TM_DAT_DIR_SEL_MASK 0x00000010U /**< Data Transfer + Direction Select */ +#define XSDPS_TM_MUL_SIN_BLK_SEL_MASK 0x00000020U /**< Multi/Single + Block Select */ + +#define XSDPS_CMD_RESP_SEL_MASK 0x00000003U /**< Response Type + Select */ +#define XSDPS_CMD_RESP_NONE_MASK 0x00000000U /**< No Response */ +#define XSDPS_CMD_RESP_L136_MASK 0x00000001U /**< Response length 138 */ +#define XSDPS_CMD_RESP_L48_MASK 0x00000002U /**< Response length 48 */ +#define XSDPS_CMD_RESP_L48_BSY_CHK_MASK 0x00000003U /**< Response length 48 & + check busy after + response */ +#define XSDPS_CMD_CRC_CHK_EN_MASK 0x00000008U /**< Command CRC Check + Enable */ +#define XSDPS_CMD_INX_CHK_EN_MASK 0x00000010U /**< Command Index Check + Enable */ +#define XSDPS_DAT_PRESENT_SEL_MASK 0x00000020U /**< Data Present Select */ +#define XSDPS_CMD_TYPE_MASK 0x000000C0U /**< Command Type */ +#define XSDPS_CMD_TYPE_NORM_MASK 0x00000000U /**< CMD Type - Normal */ +#define XSDPS_CMD_TYPE_SUSPEND_MASK 0x00000040U /**< CMD Type - Suspend */ +#define XSDPS_CMD_TYPE_RESUME_MASK 0x00000080U /**< CMD Type - Resume */ +#define XSDPS_CMD_TYPE_ABORT_MASK 0x000000C0U /**< CMD Type - Abort */ +#define XSDPS_CMD_MASK 0x00003F00U /**< Command Index Mask - + Set to CMD0-63, + AMCD0-63 */ + +/* @} */ + +/** @name Auto CMD Error Status Register + * + * This register is read only register which contains + * information about the error status of Auto CMD 12 and 23. + * Read Only + * @{ + */ +#define XSDPS_AUTO_CMD12_NT_EX_MASK 0x0001U /**< Auto CMD12 Not + executed */ +#define XSDPS_AUTO_CMD_TOUT_MASK 0x0002U /**< Auto CMD Timeout + Error */ +#define XSDPS_AUTO_CMD_CRC_MASK 0x0004U /**< Auto CMD CRC Error */ +#define XSDPS_AUTO_CMD_EB_MASK 0x0008U /**< Auto CMD End Bit + Error */ +#define XSDPS_AUTO_CMD_IND_MASK 0x0010U /**< Auto CMD Index Error */ +#define XSDPS_AUTO_CMD_CNI_ERR_MASK 0x0080U /**< Command not issued by + Auto CMD12 Error */ +/* @} */ + +/** @name Host Control2 Register + * + * This register contains extended configuration bits. + * Read Write + * @{ + */ +#define XSDPS_HC2_UHS_MODE_MASK 0x0007U /**< UHS Mode select bits */ +#define XSDPS_HC2_UHS_MODE_SDR12_MASK 0x0000U /**< SDR12 UHS Mode */ +#define XSDPS_HC2_UHS_MODE_SDR25_MASK 0x0001U /**< SDR25 UHS Mode */ +#define XSDPS_HC2_UHS_MODE_SDR50_MASK 0x0002U /**< SDR50 UHS Mode */ +#define XSDPS_HC2_UHS_MODE_SDR104_MASK 0x0003U /**< SDR104 UHS Mode */ +#define XSDPS_HC2_UHS_MODE_DDR50_MASK 0x0004U /**< DDR50 UHS Mode */ +#define XSDPS_HC2_1V8_EN_MASK 0x0008U /**< 1.8V Signal Enable */ +#define XSDPS_HC2_DRV_STR_SEL_MASK 0x0030U /**< Driver Strength + Selection */ +#define XSDPS_HC2_DRV_STR_B_MASK 0x0000U /**< Driver Strength B */ +#define XSDPS_HC2_DRV_STR_A_MASK 0x0010U /**< Driver Strength A */ +#define XSDPS_HC2_DRV_STR_C_MASK 0x0020U /**< Driver Strength C */ +#define XSDPS_HC2_DRV_STR_D_MASK 0x0030U /**< Driver Strength D */ +#define XSDPS_HC2_EXEC_TNG_MASK 0x0040U /**< Execute Tuning */ +#define XSDPS_HC2_SAMP_CLK_SEL_MASK 0x0080U /**< Sampling Clock + Selection */ +#define XSDPS_HC2_ASYNC_INTR_EN_MASK 0x4000U /**< Asynchronous Interrupt + Enable */ +#define XSDPS_HC2_PRE_VAL_EN_MASK 0x8000U /**< Preset Value Enable */ + +/* @} */ + +/** @name Capabilities Register + * + * Capabilities register is a read only register which contains + * information about the host controller. + * Sufficient if read once after power on. + * Read Only + * @{ + */ +#define XSDPS_CAP_TOUT_CLK_FREQ_MASK 0x0000003FU /**< Timeout clock freq + select */ +#define XSDPS_CAP_TOUT_CLK_UNIT_MASK 0x00000080U /**< Timeout clock unit - + MHz/KHz */ +#define XSDPS_CAP_MAX_BLK_LEN_MASK 0x00030000U /**< Max block length */ +#define XSDPS_CAP_MAX_BLK_LEN_512B_MASK 0x00000000U /**< Max block 512 bytes */ +#define XSDPS_CAP_MAX_BL_LN_1024_MASK 0x00010000U /**< Max block 1024 bytes */ +#define XSDPS_CAP_MAX_BL_LN_2048_MASK 0x00020000U /**< Max block 2048 bytes */ +#define XSDPS_CAP_MAX_BL_LN_4096_MASK 0x00030000U /**< Max block 4096 bytes */ + +#define XSDPS_CAP_EXT_MEDIA_BUS_MASK 0x00040000U /**< Extended media bus */ +#define XSDPS_CAP_ADMA2_MASK 0x00080000U /**< ADMA2 support */ +#define XSDPS_CAP_HIGH_SPEED_MASK 0x00200000U /**< High speed support */ +#define XSDPS_CAP_SDMA_MASK 0x00400000U /**< SDMA support */ +#define XSDPS_CAP_SUSP_RESUME_MASK 0x00800000U /**< Suspend/Resume + support */ +#define XSDPS_CAP_VOLT_3V3_MASK 0x01000000U /**< 3.3V support */ +#define XSDPS_CAP_VOLT_3V0_MASK 0x02000000U /**< 3.0V support */ +#define XSDPS_CAP_VOLT_1V8_MASK 0x04000000U /**< 1.8V support */ + +#define XSDPS_CAP_SYS_BUS_64_MASK 0x10000000U /**< 64 bit system bus + support */ +/* Spec 2.0 */ +#define XSDPS_CAP_INTR_MODE_MASK 0x08000000U /**< Interrupt mode + support */ +#define XSDPS_CAP_SPI_MODE_MASK 0x20000000U /**< SPI mode */ +#define XSDPS_CAP_SPI_BLOCK_MODE_MASK 0x40000000U /**< SPI block mode */ + + +/* Spec 3.0 */ +#define XSDPS_CAPS_ASYNC_INTR_MASK 0x20000000U /**< Async Interrupt + support */ +#define XSDPS_CAPS_SLOT_TYPE_MASK 0xC0000000U /**< Slot Type */ +#define XSDPS_CAPS_REM_CARD 0x00000000U /**< Removable Slot */ +#define XSDPS_CAPS_EMB_SLOT 0x40000000U /**< Embedded Slot */ +#define XSDPS_CAPS_SHR_BUS 0x80000000U /**< Shared Bus Slot */ + +#define XSDPS_ECAPS_SDR50_MASK 0x00000001U /**< SDR50 Mode support */ +#define XSDPS_ECAPS_SDR104_MASK 0x00000002U /**< SDR104 Mode support */ +#define XSDPS_ECAPS_DDR50_MASK 0x00000004U /**< DDR50 Mode support */ +#define XSDPS_ECAPS_DRV_TYPE_A_MASK 0x00000010U /**< DriverType A support */ +#define XSDPS_ECAPS_DRV_TYPE_C_MASK 0x00000020U /**< DriverType C support */ +#define XSDPS_ECAPS_DRV_TYPE_D_MASK 0x00000040U /**< DriverType D support */ +#define XSDPS_ECAPS_TMR_CNT_MASK 0x00000F00U /**< Timer Count for + Re-tuning */ +#define XSDPS_ECAPS_USE_TNG_SDR50_MASK 0x00002000U /**< SDR50 Mode needs + tuning */ +#define XSDPS_ECAPS_RE_TNG_MODES_MASK 0x0000C000U /**< Re-tuning modes + support */ +#define XSDPS_ECAPS_RE_TNG_MODE1_MASK 0x00000000U /**< Re-tuning mode 1 */ +#define XSDPS_ECAPS_RE_TNG_MODE2_MASK 0x00004000U /**< Re-tuning mode 2 */ +#define XSDPS_ECAPS_RE_TNG_MODE3_MASK 0x00008000U /**< Re-tuning mode 3 */ +#define XSDPS_ECAPS_CLK_MULT_MASK 0x00FF0000U /**< Clock Multiplier value + for Programmable clock + mode */ +#define XSDPS_ECAPS_SPI_MODE_MASK 0x01000000U /**< SPI mode */ +#define XSDPS_ECAPS_SPI_BLK_MODE_MASK 0x02000000U /**< SPI block mode */ + +/* @} */ + +/** @name Present State Register + * + * Gives the current status of the host controller + * Read Only + * @{ + */ + +#define XSDPS_PSR_INHIBIT_CMD_MASK 0x00000001U /**< Command inhibit - CMD */ +#define XSDPS_PSR_INHIBIT_DAT_MASK 0x00000002U /**< Command Inhibit - DAT */ +#define XSDPS_PSR_DAT_ACTIVE_MASK 0x00000004U /**< DAT line active */ +#define XSDPS_PSR_RE_TUNING_REQ_MASK 0x00000008U /**< Re-tuning request */ +#define XSDPS_PSR_WR_ACTIVE_MASK 0x00000100U /**< Write transfer active */ +#define XSDPS_PSR_RD_ACTIVE_MASK 0x00000200U /**< Read transfer active */ +#define XSDPS_PSR_BUFF_WR_EN_MASK 0x00000400U /**< Buffer write enable */ +#define XSDPS_PSR_BUFF_RD_EN_MASK 0x00000800U /**< Buffer read enable */ +#define XSDPS_PSR_CARD_INSRT_MASK 0x00010000U /**< Card inserted */ +#define XSDPS_PSR_CARD_STABLE_MASK 0x00020000U /**< Card state stable */ +#define XSDPS_PSR_CARD_DPL_MASK 0x00040000U /**< Card detect pin level */ +#define XSDPS_PSR_WPS_PL_MASK 0x00080000U /**< Write protect switch + pin level */ +#define XSDPS_PSR_DAT30_SG_LVL_MASK 0x00F00000U /**< Data 3:0 signal lvl */ +#define XSDPS_PSR_CMD_SG_LVL_MASK 0x01000000U /**< Cmd Line signal lvl */ +#define XSDPS_PSR_DAT74_SG_LVL_MASK 0x1E000000U /**< Data 7:4 signal lvl */ + +/* @} */ + +/** @name Maximum Current Capablities Register + * + * This register is read only register which contains + * information about current capabilities at each voltage levels. + * Read Only + * @{ + */ +#define XSDPS_MAX_CUR_CAPS_1V8_MASK 0x00000F00U /**< Maximum Current + Capability at 1.8V */ +#define XSDPS_MAX_CUR_CAPS_3V0_MASK 0x000000F0U /**< Maximum Current + Capability at 3.0V */ +#define XSDPS_MAX_CUR_CAPS_3V3_MASK 0x0000000FU /**< Maximum Current + Capability at 3.3V */ +/* @} */ + + +/** @name Force Event for Auto CMD Error Status Register + * + * This register is write only register which contains + * control bits to generate events for Auto CMD error status. + * Write Only + * @{ + */ +#define XSDPS_FE_AUTO_CMD12_NT_EX_MASK 0x0001U /**< Auto CMD12 Not + executed */ +#define XSDPS_FE_AUTO_CMD_TOUT_MASK 0x0002U /**< Auto CMD Timeout + Error */ +#define XSDPS_FE_AUTO_CMD_CRC_MASK 0x0004U /**< Auto CMD CRC Error */ +#define XSDPS_FE_AUTO_CMD_EB_MASK 0x0008U /**< Auto CMD End Bit + Error */ +#define XSDPS_FE_AUTO_CMD_IND_MASK 0x0010U /**< Auto CMD Index Error */ +#define XSDPS_FE_AUTO_CMD_CNI_ERR_MASK 0x0080U /**< Command not issued by + Auto CMD12 Error */ +/* @} */ + + + +/** @name Force Event for Error Interrupt Status Register + * + * This register is write only register which contains + * control bits to generate events of error interrupt status register. + * Write Only + * @{ + */ +#define XSDPS_FE_INTR_ERR_CT_MASK 0x0001U /**< Command Timeout + Error */ +#define XSDPS_FE_INTR_ERR_CCRC_MASK 0x0002U /**< Command CRC Error */ +#define XSDPS_FE_INTR_ERR_CEB_MASK 0x0004U /**< Command End Bit + Error */ +#define XSDPS_FE_INTR_ERR_CI_MASK 0x0008U /**< Command Index Error */ +#define XSDPS_FE_INTR_ERR_DT_MASK 0x0010U /**< Data Timeout Error */ +#define XSDPS_FE_INTR_ERR_DCRC_MASK 0x0020U /**< Data CRC Error */ +#define XSDPS_FE_INTR_ERR_DEB_MASK 0x0040U /**< Data End Bit Error */ +#define XSDPS_FE_INTR_ERR_CUR_LMT_MASK 0x0080U /**< Current Limit Error */ +#define XSDPS_FE_INTR_ERR_AUTO_CMD_MASK 0x0100U /**< Auto CMD Error */ +#define XSDPS_FE_INTR_ERR_ADMA_MASK 0x0200U /**< ADMA Error */ +#define XSDPS_FE_INTR_ERR_TR_MASK 0x1000U /**< Target Reponse */ +#define XSDPS_FE_INTR_VEND_SPF_ERR_MASK 0xE000U /**< Vendor Specific + Error */ + +/* @} */ + +/** @name ADMA Error Status Register + * + * This register is read only register which contains + * status information about ADMA errors. + * Read Only + * @{ + */ +#define XSDPS_ADMA_ERR_MM_LEN_MASK 0x04U /**< ADMA Length Mismatch + Error */ +#define XSDPS_ADMA_ERR_STATE_MASK 0x03U /**< ADMA Error State */ +#define XSDPS_ADMA_ERR_STATE_STOP_MASK 0x00U /**< ADMA Error State + STOP */ +#define XSDPS_ADMA_ERR_STATE_FDS_MASK 0x01U /**< ADMA Error State + FDS */ +#define XSDPS_ADMA_ERR_STATE_TFR_MASK 0x03U /**< ADMA Error State + TFR */ +/* @} */ + +/** @name Preset Values Register + * + * This register is read only register which contains + * preset values for each of speed modes. + * Read Only + * @{ + */ +#define XSDPS_PRE_VAL_SDCLK_FSEL_MASK 0x03FFU /**< SDCLK Frequency + Select Value */ +#define XSDPS_PRE_VAL_CLK_GEN_SEL_MASK 0x0400U /**< Clock Generator + Mode Select */ +#define XSDPS_PRE_VAL_DRV_STR_SEL_MASK 0xC000U /**< Driver Strength + Select Value */ + +/* @} */ + +/** @name Slot Interrupt Status Register + * + * This register is read only register which contains + * interrupt slot signal for each slot. + * Read Only + * @{ + */ +#define XSDPS_SLOT_INTR_STS_INT_MASK 0x0007U /**< Interrupt Signal + mask */ + +/* @} */ + +/** @name Host Controller Version Register + * + * This register is read only register which contains + * Host Controller and Vendor Specific version. + * Read Only + * @{ + */ +#define XSDPS_HC_VENDOR_VER 0xFF00U /**< Vendor + Specification + version mask */ +#define XSDPS_HC_SPEC_VER_MASK 0x00FFU /**< Host + Specification + version mask */ +#define XSDPS_HC_SPEC_V3 0x0002U +#define XSDPS_HC_SPEC_V2 0x0001U +#define XSDPS_HC_SPEC_V1 0x0000U + +/** @name Block size mask for 512 bytes + * + * Block size mask for 512 bytes - This is the default block size. + * @{ + */ + +#define XSDPS_BLK_SIZE_512_MASK 0x200U + +/* @} */ + +/** @name Commands + * + * Constant definitions for commands and response related to SD + * @{ + */ + +#define XSDPS_APP_CMD_PREFIX 0x8000U +#define CMD0 0x0000U +#define CMD1 0x0100U +#define CMD2 0x0200U +#define CMD3 0x0300U +#define CMD4 0x0400U +#define CMD5 0x0500U +#define CMD6 0x0600U +#define ACMD6 (XSDPS_APP_CMD_PREFIX + 0x0600U) +#define CMD7 0x0700U +#define CMD8 0x0800U +#define CMD9 0x0900U +#define CMD10 0x0A00U +#define CMD11 0x0B00U +#define CMD12 0x0C00U +#define ACMD13 (XSDPS_APP_CMD_PREFIX + 0x0D00U) +#define CMD16 0x1000U +#define CMD17 0x1100U +#define CMD18 0x1200U +#define CMD19 0x1300U +#define CMD21 0x1500U +#define CMD23 0x1700U +#define ACMD23 (XSDPS_APP_CMD_PREFIX + 0x1700U) +#define CMD24 0x1800U +#define CMD25 0x1900U +#define CMD41 0x2900U +#define ACMD41 (XSDPS_APP_CMD_PREFIX + 0x2900U) +#define ACMD42 (XSDPS_APP_CMD_PREFIX + 0x2A00U) +#define ACMD51 (XSDPS_APP_CMD_PREFIX + 0x3300U) +#define CMD52 0x3400U +#define CMD55 0x3700U +#define CMD58 0x3A00U + +#define RESP_NONE (u32)XSDPS_CMD_RESP_NONE_MASK +#define RESP_R1 (u32)XSDPS_CMD_RESP_L48_MASK | (u32)XSDPS_CMD_CRC_CHK_EN_MASK | \ + (u32)XSDPS_CMD_INX_CHK_EN_MASK + +#define RESP_R1B (u32)XSDPS_CMD_RESP_L48_BSY_CHK_MASK | \ + (u32)XSDPS_CMD_CRC_CHK_EN_MASK | (u32)XSDPS_CMD_INX_CHK_EN_MASK + +#define RESP_R2 (u32)XSDPS_CMD_RESP_L136_MASK | (u32)XSDPS_CMD_CRC_CHK_EN_MASK +#define RESP_R3 (u32)XSDPS_CMD_RESP_L48_MASK + +#define RESP_R6 (u32)XSDPS_CMD_RESP_L48_BSY_CHK_MASK | \ + (u32)XSDPS_CMD_CRC_CHK_EN_MASK | (u32)XSDPS_CMD_INX_CHK_EN_MASK + +/* @} */ + +/* Card Interface Conditions Definitions */ +#define XSDPS_CIC_CHK_PATTERN 0xAAU +#define XSDPS_CIC_VOLT_MASK (0xFU<<8) +#define XSDPS_CIC_VOLT_2V7_3V6 (1U<<8) +#define XSDPS_CIC_VOLT_LOW (1U<<9) + +/* Operation Conditions Register Definitions */ +#define XSDPS_OCR_PWRUP_STS (1U<<31) +#define XSDPS_OCR_CC_STS (1U<<30) +#define XSDPS_OCR_S18 (1U<<24) +#define XSDPS_OCR_3V5_3V6 (1U<<23) +#define XSDPS_OCR_3V4_3V5 (1U<<22) +#define XSDPS_OCR_3V3_3V4 (1U<<21) +#define XSDPS_OCR_3V2_3V3 (1U<<20) +#define XSDPS_OCR_3V1_3V2 (1U<<19) +#define XSDPS_OCR_3V0_3V1 (1U<<18) +#define XSDPS_OCR_2V9_3V0 (1U<<17) +#define XSDPS_OCR_2V8_2V9 (1U<<16) +#define XSDPS_OCR_2V7_2V8 (1U<<15) +#define XSDPS_OCR_1V7_1V95 (1U<<7) +#define XSDPS_OCR_HIGH_VOL 0x00FF8000U +#define XSDPS_OCR_LOW_VOL 0x00000080U + +/* SD Card Configuration Register Definitions */ +#define XSDPS_SCR_REG_LEN 8U +#define XSDPS_SCR_STRUCT_MASK (0xFU<<28) +#define XSDPS_SCR_SPEC_MASK (0xFU<<24) +#define XSDPS_SCR_SPEC_1V0 0U +#define XSDPS_SCR_SPEC_1V1 (1U<<24) +#define XSDPS_SCR_SPEC_2V0_3V0 (2U<<24) +#define XSDPS_SCR_MEM_VAL_AF_ERASE (1U<<23) +#define XSDPS_SCR_SEC_SUPP_MASK (7U<<20) +#define XSDPS_SCR_SEC_SUPP_NONE 0U +#define XSDPS_SCR_SEC_SUPP_1V1 (2U<<20) +#define XSDPS_SCR_SEC_SUPP_2V0 (3U<<20) +#define XSDPS_SCR_SEC_SUPP_3V0 (4U<<20) +#define XSDPS_SCR_BUS_WIDTH_MASK (0xFU<<16) +#define XSDPS_SCR_BUS_WIDTH_1 (1U<<16) +#define XSDPS_SCR_BUS_WIDTH_4 (4U<<16) +#define XSDPS_SCR_SPEC3_MASK (1U<<12) +#define XSDPS_SCR_SPEC3_2V0 0U +#define XSDPS_SCR_SPEC3_3V0 (1U<<12) +#define XSDPS_SCR_CMD_SUPP_MASK 0x3U +#define XSDPS_SCR_CMD23_SUPP (1U<<1) +#define XSDPS_SCR_CMD20_SUPP (1U<<0) + +/* Card Status Register Definitions */ +#define XSDPS_CD_STS_OUT_OF_RANGE (1U<<31) +#define XSDPS_CD_STS_ADDR_ERR (1U<<30) +#define XSDPS_CD_STS_BLK_LEN_ERR (1U<<29) +#define XSDPS_CD_STS_ER_SEQ_ERR (1U<<28) +#define XSDPS_CD_STS_ER_PRM_ERR (1U<<27) +#define XSDPS_CD_STS_WP_VIO (1U<<26) +#define XSDPS_CD_STS_IS_LOCKED (1U<<25) +#define XSDPS_CD_STS_LOCK_UNLOCK_FAIL (1U<<24) +#define XSDPS_CD_STS_CMD_CRC_ERR (1U<<23) +#define XSDPS_CD_STS_ILGL_CMD (1U<<22) +#define XSDPS_CD_STS_CARD_ECC_FAIL (1U<<21) +#define XSDPS_CD_STS_CC_ERR (1U<<20) +#define XSDPS_CD_STS_ERR (1U<<19) +#define XSDPS_CD_STS_CSD_OVRWR (1U<<16) +#define XSDPS_CD_STS_WP_ER_SKIP (1U<<15) +#define XSDPS_CD_STS_CARD_ECC_DIS (1U<<14) +#define XSDPS_CD_STS_ER_RST (1U<<13) +#define XSDPS_CD_STS_CUR_STATE (0xFU<<9) +#define XSDPS_CD_STS_RDY_FOR_DATA (1U<<8) +#define XSDPS_CD_STS_APP_CMD (1U<<5) +#define XSDPS_CD_STS_AKE_SEQ_ERR (1U<<2) + +/* Switch Function Definitions CMD6 */ +#define XSDPS_SWITCH_SD_RESP_LEN 64U + +#define XSDPS_SWITCH_FUNC_SWITCH (1U<<31) +#define XSDPS_SWITCH_FUNC_CHECK 0U + +#define XSDPS_MODE_FUNC_GRP1 1U +#define XSDPS_MODE_FUNC_GRP2 2U +#define XSDPS_MODE_FUNC_GRP3 3U +#define XSDPS_MODE_FUNC_GRP4 4U +#define XSDPS_MODE_FUNC_GRP5 5U +#define XSDPS_MODE_FUNC_GRP6 6U + +#define XSDPS_FUNC_GRP_DEF_VAL 0xFU +#define XSDPS_FUNC_ALL_GRP_DEF_VAL 0xFFFFFFU + +#define XSDPS_ACC_MODE_DEF_SDR12 0U +#define XSDPS_ACC_MODE_HS_SDR25 1U +#define XSDPS_ACC_MODE_SDR50 2U +#define XSDPS_ACC_MODE_SDR104 3U +#define XSDPS_ACC_MODE_DDR50 4U + +#define XSDPS_CMD_SYS_ARG_SHIFT 4U +#define XSDPS_CMD_SYS_DEF 0U +#define XSDPS_CMD_SYS_eC 1U +#define XSDPS_CMD_SYS_OTP 3U +#define XSDPS_CMD_SYS_ASSD 4U +#define XSDPS_CMD_SYS_VEND 5U + +#define XSDPS_DRV_TYPE_ARG_SHIFT 8U +#define XSDPS_DRV_TYPE_B 0U +#define XSDPS_DRV_TYPE_A 1U +#define XSDPS_DRV_TYPE_C 2U +#define XSDPS_DRV_TYPE_D 3U + +#define XSDPS_CUR_LIM_ARG_SHIFT 12U +#define XSDPS_CUR_LIM_200 0U +#define XSDPS_CUR_LIM_400 1U +#define XSDPS_CUR_LIM_600 2U +#define XSDPS_CUR_LIM_800 3U + +#define CSD_SPEC_VER_MASK 0x3C0000U +#define READ_BLK_LEN_MASK 0x00000F00U +#define C_SIZE_MULT_MASK 0x00000380U +#define C_SIZE_LOWER_MASK 0xFFC00000U +#define C_SIZE_UPPER_MASK 0x00000003U +#define CSD_STRUCT_MASK 0x00C00000U +#define CSD_V2_C_SIZE_MASK 0x3FFFFF00U + +/* EXT_CSD field definitions */ +#define XSDPS_EXT_CSD_SIZE 512U + +#define EXT_CSD_WR_REL_PARAM_EN (1U<<2) + +#define EXT_CSD_BOOT_WP_B_PWR_WP_DIS (0x40U) +#define EXT_CSD_BOOT_WP_B_PERM_WP_DIS (0x10U) +#define EXT_CSD_BOOT_WP_B_PERM_WP_EN (0x04U) +#define EXT_CSD_BOOT_WP_B_PWR_WP_EN (0x01U) + +#define EXT_CSD_PART_CONFIG_ACC_MASK (0x7U) +#define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1U) +#define EXT_CSD_PART_CONFIG_ACC_RPMB (0x3U) +#define EXT_CSD_PART_CONFIG_ACC_GP0 (0x4U) + +#define EXT_CSD_PART_SUPPORT_PART_EN (0x1U) + +#define EXT_CSD_CMD_SET_NORMAL (1U<<0) +#define EXT_CSD_CMD_SET_SECURE (1U<<1) +#define EXT_CSD_CMD_SET_CPSECURE (1U<<2) + +#define EXT_CSD_CARD_TYPE_26 (1U<<0) /* Card can run at 26MHz */ +#define EXT_CSD_CARD_TYPE_52 (1U<<1) /* Card can run at 52MHz */ +#define EXT_CSD_CARD_TYPE_MASK 0x3FU /* Mask out reserved bits */ +#define EXT_CSD_CARD_TYPE_DDR_1_8V (1U<<2) /* Card can run at 52MHz */ + /* DDR mode @1.8V or 3V I/O */ +#define EXT_CSD_CARD_TYPE_DDR_1_2V (1U<<3) /* Card can run at 52MHz */ + /* DDR mode @1.2V I/O */ +#define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V \ + | EXT_CSD_CARD_TYPE_DDR_1_2V) +#define EXT_CSD_CARD_TYPE_SDR_1_8V (1U<<4) /* Card can run at 200MHz */ +#define EXT_CSD_CARD_TYPE_SDR_1_2V (1U<<5) /* Card can run at 200MHz */ + /* SDR mode @1.2V I/O */ +#define EXT_CSD_BUS_WIDTH_BYTE 183U +#define EXT_CSD_BUS_WIDTH_1_BIT 0U /* Card is in 1 bit mode */ +#define EXT_CSD_BUS_WIDTH_4_BIT 1U /* Card is in 4 bit mode */ +#define EXT_CSD_BUS_WIDTH_8_BIT 2U /* Card is in 8 bit mode */ +#define EXT_CSD_BUS_WIDTH_DDR_4_BIT 5U /* Card is in 4 bit DDR mode */ +#define EXT_CSD_BUS_WIDTH_DDR_8_BIT 6U /* Card is in 8 bit DDR mode */ + +#define EXT_CSD_HS_TIMING_BYTE 185U +#define EXT_CSD_HS_TIMING_DEF 0U +#define EXT_CSD_HS_TIMING_HIGH 1U /* Card is in high speed mode */ +#define EXT_CSD_HS_TIMING_HS200 2U /* Card is in HS200 mode */ + +#define EXT_CSD_RST_N_FUN_BYTE 162U +#define EXT_CSD_RST_N_FUN_TEMP_DIS 0U /* RST_n signal is temporarily disabled */ +#define EXT_CSD_RST_N_FUN_PERM_EN 1U /* RST_n signal is permanently enabled */ +#define EXT_CSD_RST_N_FUN_PERM_DIS 2U /* RST_n signal is permanently disabled */ + +#define XSDPS_EXT_CSD_CMD_SET 0U +#define XSDPS_EXT_CSD_SET_BITS 1U +#define XSDPS_EXT_CSD_CLR_BITS 2U +#define XSDPS_EXT_CSD_WRITE_BYTE 3U + +#define XSDPS_MMC_DEF_SPEED_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_HS_TIMING_BYTE << 16) \ + | ((u32)EXT_CSD_HS_TIMING_DEF << 8)) + +#define XSDPS_MMC_HIGH_SPEED_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_HS_TIMING_BYTE << 16) \ + | ((u32)EXT_CSD_HS_TIMING_HIGH << 8)) + +#define XSDPS_MMC_HS200_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_HS_TIMING_BYTE << 16) \ + | ((u32)EXT_CSD_HS_TIMING_HS200 << 8)) + +#define XSDPS_MMC_1_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WITH_1_BIT << 8)) + +#define XSDPS_MMC_4_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WIDTH_4_BIT << 8)) + +#define XSDPS_MMC_8_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WIDTH_8_BIT << 8)) + +#define XSDPS_MMC_DDR_4_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WIDTH_DDR_4_BIT << 8)) + +#define XSDPS_MMC_DDR_8_BIT_BUS_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_BUS_WIDTH_BYTE << 16) \ + | ((u32)EXT_CSD_BUS_WIDTH_DDR_8_BIT << 8)) + +#define XSDPS_MMC_RST_FUN_EN_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_RST_N_FUN_BYTE << 16) \ + | ((u32)EXT_CSD_RST_N_FUN_PERM_EN << 8)) + +#define XSDPS_MMC_DELAY_FOR_SWITCH 1000U + +/* @} */ + +/* @400KHz, in usec */ +#define XSDPS_74CLK_DELAY 2960U +#define XSDPS_100CLK_DELAY 4000U +#define XSDPS_INIT_DELAY 10000U + +#define XSDPS_DEF_VOLT_LVL XSDPS_PC_BUS_VSEL_3V0_MASK +#define XSDPS_CARD_DEF_ADDR 0x1234U + +#define XSDPS_CARD_SD 1U +#define XSDPS_CARD_MMC 2U +#define XSDPS_CARD_SDIO 3U +#define XSDPS_CARD_SDCOMBO 4U +#define XSDPS_CHIP_EMMC 5U + + +/** @name ADMA2 Descriptor related definitions + * + * ADMA2 Descriptor related definitions + * @{ + */ + +#define XSDPS_DESC_MAX_LENGTH 65536U + +#define XSDPS_DESC_VALID (0x1U << 0) +#define XSDPS_DESC_END (0x1U << 1) +#define XSDPS_DESC_INT (0x1U << 2) +#define XSDPS_DESC_TRAN (0x2U << 4) + +/* @} */ + +/* For changing clock frequencies */ +#define XSDPS_CLK_400_KHZ 400000U /**< 400 KHZ */ +#define XSDPS_CLK_50_MHZ 50000000U /**< 50 MHZ */ +#define XSDPS_CLK_52_MHZ 52000000U /**< 52 MHZ */ +#define XSDPS_SD_VER_1_0 0x1U /**< SD ver 1 */ +#define XSDPS_SD_VER_2_0 0x2U /**< SD ver 2 */ +#define XSDPS_SCR_BLKCNT 1U +#define XSDPS_SCR_BLKSIZE 8U +#define XSDPS_1_BIT_WIDTH 0x1U +#define XSDPS_4_BIT_WIDTH 0x2U +#define XSDPS_8_BIT_WIDTH 0x3U +#define XSDPS_UHS_SPEED_MODE_SDR12 0x0U +#define XSDPS_UHS_SPEED_MODE_SDR25 0x1U +#define XSDPS_UHS_SPEED_MODE_SDR50 0x2U +#define XSDPS_UHS_SPEED_MODE_SDR104 0x3U +#define XSDPS_UHS_SPEED_MODE_DDR50 0x4U +#define XSDPS_HIGH_SPEED_MODE 0x5U +#define XSDPS_DEFAULT_SPEED_MODE 0x6U +#define XSDPS_HS200_MODE 0x7U +#define XSDPS_DDR52_MODE 0x4U +#define XSDPS_SWITCH_CMD_BLKCNT 1U +#define XSDPS_SWITCH_CMD_BLKSIZE 64U +#define XSDPS_SWITCH_CMD_HS_GET 0x00FFFFF0U +#define XSDPS_SWITCH_CMD_HS_SET 0x80FFFFF1U +#define XSDPS_SWITCH_CMD_SDR12_SET 0x80FFFFF0U +#define XSDPS_SWITCH_CMD_SDR25_SET 0x80FFFFF1U +#define XSDPS_SWITCH_CMD_SDR50_SET 0x80FFFFF2U +#define XSDPS_SWITCH_CMD_SDR104_SET 0x80FFFFF3U +#define XSDPS_SWITCH_CMD_DDR50_SET 0x80FFFFF4U +#define XSDPS_EXT_CSD_CMD_BLKCNT 1U +#define XSDPS_EXT_CSD_CMD_BLKSIZE 512U +#define XSDPS_TUNING_CMD_BLKCNT 1U +#define XSDPS_TUNING_CMD_BLKSIZE 64U + +#define XSDPS_HIGH_SPEED_MAX_CLK 50000000U +#define XSDPS_UHS_SDR104_MAX_CLK 208000000U +#define XSDPS_UHS_SDR50_MAX_CLK 100000000U +#define XSDPS_UHS_DDR50_MAX_CLK 50000000U +#define XSDPS_UHS_SDR25_MAX_CLK 50000000U +#define XSDPS_UHS_SDR12_MAX_CLK 25000000U + +#define SD_DRIVER_TYPE_B 0x01U +#define SD_DRIVER_TYPE_A 0x02U +#define SD_DRIVER_TYPE_C 0x04U +#define SD_DRIVER_TYPE_D 0x08U +#define SD_SET_CURRENT_LIMIT_200 0U +#define SD_SET_CURRENT_LIMIT_400 1U +#define SD_SET_CURRENT_LIMIT_600 2U +#define SD_SET_CURRENT_LIMIT_800 3U + +#define SD_MAX_CURRENT_200 (1U << SD_SET_CURRENT_LIMIT_200) +#define SD_MAX_CURRENT_400 (1U << SD_SET_CURRENT_LIMIT_400) +#define SD_MAX_CURRENT_600 (1U << SD_SET_CURRENT_LIMIT_600) +#define SD_MAX_CURRENT_800 (1U << SD_SET_CURRENT_LIMIT_800) + +#define XSDPS_SD_SDR12_MAX_CLK 25000000U +#define XSDPS_SD_SDR25_MAX_CLK 50000000U +#define XSDPS_SD_SDR50_MAX_CLK 100000000U +#define XSDPS_SD_DDR50_MAX_CLK 50000000U +#define XSDPS_SD_SDR104_MAX_CLK 208000000U +/* + * XSDPS_SD_INPUT_MAX_CLK is set to 175000000 in order to keep it smaller + * than the clock value coming from the core. This value is kept to safely + * switch to SDR104 mode if the SD card supports it. + */ +#define XSDPS_SD_INPUT_MAX_CLK 175000000U + +#define XSDPS_MMC_HS200_MAX_CLK 200000000U +#define XSDPS_MMC_HSD_MAX_CLK 52000000U +#define XSDPS_MMC_DDR_MAX_CLK 52000000U + +#define XSDPS_CARD_STATE_IDLE 0U +#define XSDPS_CARD_STATE_RDY 1U +#define XSDPS_CARD_STATE_IDEN 2U +#define XSDPS_CARD_STATE_STBY 3U +#define XSDPS_CARD_STATE_TRAN 4U +#define XSDPS_CARD_STATE_DATA 5U +#define XSDPS_CARD_STATE_RCV 6U +#define XSDPS_CARD_STATE_PROG 7U +#define XSDPS_CARD_STATE_DIS 8U +#define XSDPS_CARD_STATE_BTST 9U +#define XSDPS_CARD_STATE_SLP 10U + +#define XSDPS_SLOT_REM 0U +#define XSDPS_SLOT_EMB 1U + +#define XSDPS_WIDTH_8 8U +#define XSDPS_WIDTH_4 4U + + +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) +#define SD0_ITAPDLY_SEL_MASK 0x000000FFU +#define SD0_OTAPDLY_SEL_MASK 0x0000003FU +#define SD1_ITAPDLY_SEL_MASK 0x00FF0000U +#define SD1_OTAPDLY_SEL_MASK 0x003F0000U +#define SD_DLL_CTRL 0x00000358U +#define SD_ITAPDLY 0x00000314U +#define SD_OTAPDLY 0x00000318U +#define SD0_DLL_RST 0x00000004U +#define SD1_DLL_RST 0x00040000U +#define SD0_ITAPCHGWIN 0x00000200U +#define SD0_ITAPDLYENA 0x00000100U +#define SD0_OTAPDLYENA 0x00000040U +#define SD1_ITAPCHGWIN 0x02000000U +#define SD1_ITAPDLYENA 0x01000000U +#define SD1_OTAPDLYENA 0x00400000U + +#define SD0_OTAPDLYSEL_HS200_B0 0x00000003U +#define SD0_OTAPDLYSEL_HS200_B2 0x00000002U +#define SD0_ITAPDLYSEL_SD50 0x00000014U +#define SD0_OTAPDLYSEL_SD50 0x00000003U +#define SD0_ITAPDLYSEL_SD_DDR50 0x0000003DU +#define SD0_ITAPDLYSEL_EMMC_DDR50 0x00000012U +#define SD0_OTAPDLYSEL_SD_DDR50 0x00000004U +#define SD0_OTAPDLYSEL_EMMC_DDR50 0x00000006U +#define SD0_ITAPDLYSEL_HSD 0x00000015U +#define SD0_OTAPDLYSEL_SD_HSD 0x00000005U +#define SD0_OTAPDLYSEL_EMMC_HSD 0x00000006U + +#define SD1_OTAPDLYSEL_HS200_B0 0x00030000U +#define SD1_OTAPDLYSEL_HS200_B2 0x00020000U +#define SD1_ITAPDLYSEL_SD50 0x00140000U +#define SD1_OTAPDLYSEL_SD50 0x00030000U +#define SD1_ITAPDLYSEL_SD_DDR50 0x003D0000U +#define SD1_ITAPDLYSEL_EMMC_DDR50 0x00120000U +#define SD1_OTAPDLYSEL_SD_DDR50 0x00040000U +#define SD1_OTAPDLYSEL_EMMC_DDR50 0x00060000U +#define SD1_ITAPDLYSEL_HSD 0x00150000U +#define SD1_OTAPDLYSEL_SD_HSD 0x00050000U +#define SD1_OTAPDLYSEL_EMMC_HSD 0x00060000U + +#endif + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ +#define XSdPs_In64 Xil_In64 +#define XSdPs_Out64 Xil_Out64 + +#define XSdPs_In32 Xil_In32 +#define XSdPs_Out32 Xil_Out32 + +#define XSdPs_In16 Xil_In16 +#define XSdPs_Out16 Xil_Out16 + +#define XSdPs_In8 Xil_In8 +#define XSdPs_Out8 Xil_Out8 + +/****************************************************************************/ +/** +* 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 XSdPs_ReadReg(XSdPs *InstancePtr. s32 RegOffset) +* +******************************************************************************/ +#define XSdPs_ReadReg64(InstancePtr, RegOffset) \ + XSdPs_In64((InstancePtr->Config.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 XSdPs_WriteReg(XSdPs *InstancePtr, s32 RegOffset, +* u64 RegisterValue) +* +******************************************************************************/ +#define XSdPs_WriteReg64(InstancePtr, RegOffset, RegisterValue) \ + XSdPs_Out64((InstancePtr->Config.BaseAddress) + (RegOffset), \ + (RegisterValue)) + +/****************************************************************************/ +/** +* 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 XSdPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +#define XSdPs_ReadReg(BaseAddress, RegOffset) \ + XSdPs_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 XSdPs_WriteReg(u32 BaseAddress, int RegOffset, +* u32 RegisterValue) +* +******************************************************************************/ +#define XSdPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + XSdPs_Out32((BaseAddress) + (RegOffset), (RegisterValue)) + +/****************************************************************************/ +/** +* 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: +* u16 XSdPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +static INLINE u16 XSdPs_ReadReg16(u32 BaseAddress, u8 RegOffset) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg >>= ((RegOffset & 0x3)*8); + return (u16)Reg; +#else + return XSdPs_In16((BaseAddress) + (RegOffset)); +#endif +} + +/***************************************************************************/ +/** +* 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 XSdPs_WriteReg(u32 BaseAddress, int RegOffset, +* u16 RegisterValue) +* +******************************************************************************/ + +static INLINE void XSdPs_WriteReg16(u32 BaseAddress, u8 RegOffset, u16 RegisterValue) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg &= ~(0xFFFF<<((RegOffset & 0x3)*8)); + Reg |= RegisterValue <<((RegOffset & 0x3)*8); + XSdPs_Out32(BaseAddress, Reg); +#else + XSdPs_Out16((BaseAddress) + (RegOffset), (RegisterValue)); +#endif +} + +/****************************************************************************/ +/** +* 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: +* u8 XSdPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +static INLINE u8 XSdPs_ReadReg8(u32 BaseAddress, u8 RegOffset) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg >>= ((RegOffset & 0x3)*8); + return (u8)Reg; +#else + return XSdPs_In8((BaseAddress) + (RegOffset)); +#endif +} +/***************************************************************************/ +/** +* 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 XSdPs_WriteReg(u32 BaseAddress, int RegOffset, +* u8 RegisterValue) +* +******************************************************************************/ +static INLINE void XSdPs_WriteReg8(u32 BaseAddress, u8 RegOffset, u8 RegisterValue) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg &= ~(0xFF<<((RegOffset & 0x3)*8)); + Reg |= RegisterValue <<((RegOffset & 0x3)*8); + XSdPs_Out32(BaseAddress, Reg); +#else + XSdPs_Out8((BaseAddress) + (RegOffset), (RegisterValue)); +#endif +} +/***************************************************************************/ +/** +* Macro to get present status register +* +* @param BaseAddress contains the base address of the device. +* +* @return None. +* +* @note C-Style signature: +* void XSdPs_WriteReg(u32 BaseAddress, int RegOffset, +* u8 RegisterValue) +* +******************************************************************************/ +#define XSdPs_GetPresentStatusReg(BaseAddress) \ + XSdPs_In32((BaseAddress) + (XSDPS_PRES_STATE_OFFSET)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* SD_HW_H_ */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_options.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_options.c new file mode 100644 index 0000000..4894754 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_options.c @@ -0,0 +1,1760 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xsdps_options.c +* @addtogroup sdps_v3_5 +* @{ +* +* Contains API's for changing the various options in host and card. +* See xsdps.h for a detailed description of the device and driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ---    -------- -----------------------------------------------
    +* 1.00a hk/sg  10/17/13 Initial release
    +* 2.1   hk     04/18/14 Increase sleep for eMMC switch command.
    +*                       Add sleep for microblaze designs. CR# 781117.
    +* 2.3   sk     09/23/14 Use XSdPs_Change_ClkFreq API whenever changing
    +*						clock.CR# 816586.
    +* 2.5 	sg	   07/09/15 Added SD 3.0 features
    +*       kvn    07/15/15 Modified the code according to MISRAC-2012.
    +* 2.7   sk     01/08/16 Added workaround for issue in auto tuning mode
    +*                       of SDR50, SDR104 and HS200.
    +*       sk     02/16/16 Corrected the Tuning logic.
    +*       sk     03/02/16 Configured the Tap Delay values for eMMC HS200 mode.
    +* 2.8   sk     04/20/16 Added new workaround for auto tuning.
    +* 3.0   sk     07/07/16 Used usleep API for both arm and microblaze.
    +*       sk     07/16/16 Added support for UHS modes.
    +*       sk     07/16/16 Added Tap delays accordingly to different SD/eMMC
    +*                       operating modes.
    +* 3.1   mi     09/07/16 Removed compilation warnings with extra compiler flags.
    +*       sk     11/07/16 Enable Rst_n bit in ext_csd reg if not enabled.
    +*       sk     11/16/16 Issue DLL reset at 31 iteration to load new zero value.
    +* 3.2   sk     02/01/17 Added HSD and DDR mode support for eMMC.
    +*       sk     02/01/17 Consider bus width parameter from design for switching
    +*       vns    02/09/17 Added ARMA53_32 support for ZynqMP CR#968397
    +*       vns    03/13/17 Fixed MISRAC mandatory violation
    +*       sk     03/20/17 Add support for EL1 non-secure mode.
    +* 3.3   mn     07/25/17 Removed SD0_OTAPDLYENA and SD1_OTAPDLYENA bits
    +*       mn     08/07/17	Properly set OTAPDLY value by clearing previous bit
    +* 			settings
    +*       mn     08/17/17 Added CCI support for A53 and disabled data cache
    +*                       operations when it is enabled.
    +*       mn     08/22/17 Updated for Word Access System support
    +* 3.4   mn     01/22/18 Separated out SDR104 and HS200 clock defines
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xsdps.h" +#include "sleep.h" +#if defined (__aarch64__) +#include "xil_smc.h" +#endif +/************************** Constant Definitions *****************************/ +#define UHS_SDR12_SUPPORT 0x1U +#define UHS_SDR25_SUPPORT 0x2U +#define UHS_SDR50_SUPPORT 0x4U +#define UHS_SDR104_SUPPORT 0x8U +#define UHS_DDR50_SUPPORT 0x10U +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +s32 XSdPs_CmdTransfer(XSdPs *InstancePtr, u32 Cmd, u32 Arg, u32 BlkCnt); +void XSdPs_SetupADMA2DescTbl(XSdPs *InstancePtr, u32 BlkCnt, const u8 *Buff); +static s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr); +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) +s32 XSdPs_Uhs_ModeInit(XSdPs *InstancePtr, u8 Mode); +static void XSdPs_sdr50_tapdelay(u32 Bank, u32 DeviceId, u32 CardType); +void XSdPs_SetTapDelay(XSdPs *InstancePtr); +static void XSdPs_DllReset(XSdPs *InstancePtr); +#endif + +extern u16 TransferMode; +/*****************************************************************************/ +/** +* Update Block size for read/write operations. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param BlkSize - Block size passed by the user. +* +* @return None +* +******************************************************************************/ +s32 XSdPs_SetBlkSize(XSdPs *InstancePtr, u16 BlkSize) +{ + s32 Status; + u32 PresentStateReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + PresentStateReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_PRES_STATE_OFFSET); + + if ((PresentStateReg & ((u32)XSDPS_PSR_INHIBIT_CMD_MASK | + (u32)XSDPS_PSR_INHIBIT_DAT_MASK | + (u32)XSDPS_PSR_WR_ACTIVE_MASK | (u32)XSDPS_PSR_RD_ACTIVE_MASK)) != 0U) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + + /* Send block write command */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD16, BlkSize, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Status = (s32)XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + /* Set block size to the value passed */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_BLK_SIZE_OFFSET, + BlkSize & XSDPS_BLK_SIZE_MASK); + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* API to get bus width support by card. +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* @param SCR - buffer to store SCR register returned by card. +* +* @return +* - XST_SUCCESS if successful. +* - XST_FAILURE if fail. +* +* @note None. +* +******************************************************************************/ +s32 XSdPs_Get_BusWidth(XSdPs *InstancePtr, u8 *SCR) +{ + s32 Status; + u32 StatusReg; + u16 BlkCnt; + u16 BlkSize; + s32 LoopCnt; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + for (LoopCnt = 0; LoopCnt < 8; LoopCnt++) { + SCR[LoopCnt] = 0U; + } + + /* Send block write command */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD55, + InstancePtr->RelCardAddr, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + BlkCnt = XSDPS_SCR_BLKCNT; + BlkSize = XSDPS_SCR_BLKSIZE; + + /* Set block size to the value passed */ + BlkSize &= XSDPS_BLK_SIZE_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_BLK_SIZE_OFFSET, BlkSize); + + XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, SCR); + + TransferMode = XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK; + + if (InstancePtr->Config.IsCacheCoherent == 0) { + Xil_DCacheInvalidateRange((INTPTR)SCR, 8); + } + + Status = XSdPs_CmdTransfer(InstancePtr, ACMD51, 0U, BlkCnt); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Check for transfer complete + * Polling for response for now + */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* Write to clear error bits */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + + Status = (s32)XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* API to set bus width to 4-bit in card and host +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return +* - XST_SUCCESS if successful. +* - XST_FAILURE if fail. +* +* @note None. +* +******************************************************************************/ +s32 XSdPs_Change_BusWidth(XSdPs *InstancePtr) +{ + s32 Status; + u32 StatusReg; + u32 Arg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + /* + * check for bus width for 3.0 controller and return if + * bus width is <4 + */ + if ((InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) && + (InstancePtr->Config.BusWidth < XSDPS_WIDTH_4)) { + Status = XST_SUCCESS; + goto RETURN_PATH; + } + + if (InstancePtr->CardType == XSDPS_CARD_SD) { + + Status = XSdPs_CmdTransfer(InstancePtr, CMD55, InstancePtr->RelCardAddr, + 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + InstancePtr->BusWidth = XSDPS_4_BIT_WIDTH; + + Arg = ((u32)InstancePtr->BusWidth); + + Status = XSdPs_CmdTransfer(InstancePtr, ACMD6, Arg, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } else { + + if ((InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) + && (InstancePtr->CardType == XSDPS_CHIP_EMMC) && + (InstancePtr->Config.BusWidth == XSDPS_WIDTH_8)) { + /* in case of eMMC data width 8-bit */ + InstancePtr->BusWidth = XSDPS_8_BIT_WIDTH; + } else { + InstancePtr->BusWidth = XSDPS_4_BIT_WIDTH; + } + + if (InstancePtr->BusWidth == XSDPS_8_BIT_WIDTH) { + if (InstancePtr->Mode == XSDPS_DDR52_MODE) + Arg = XSDPS_MMC_DDR_8_BIT_BUS_ARG; + else + Arg = XSDPS_MMC_8_BIT_BUS_ARG; + } else { + if (InstancePtr->Mode == XSDPS_DDR52_MODE) + Arg = XSDPS_MMC_DDR_4_BIT_BUS_ARG; + else + Arg = XSDPS_MMC_4_BIT_BUS_ARG; + } + + Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Check for transfer complete */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* Write to clear error bits */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + } + + usleep(XSDPS_MMC_DELAY_FOR_SWITCH); + + StatusReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL1_OFFSET); + + /* Width setting in controller */ + if (InstancePtr->BusWidth == XSDPS_8_BIT_WIDTH) { + StatusReg |= XSDPS_HC_EXT_BUS_WIDTH; + } else { + StatusReg |= XSDPS_HC_WIDTH_MASK; + } + + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL1_OFFSET, + (u8)StatusReg); + + if (InstancePtr->Mode == XSDPS_DDR52_MODE) { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET); + StatusReg &= (u16)(~XSDPS_HC2_UHS_MODE_MASK); + StatusReg |= InstancePtr->Mode; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET, StatusReg); + } + + Status = (s32)XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* API to get bus speed supported by card. +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* @param ReadBuff - buffer to store function group support data +* returned by card. +* +* @return +* - XST_SUCCESS if successful. +* - XST_FAILURE if fail. +* +* @note None. +* +******************************************************************************/ +s32 XSdPs_Get_BusSpeed(XSdPs *InstancePtr, u8 *ReadBuff) +{ + s32 Status; + u32 StatusReg; + u32 Arg; + u16 BlkCnt; + u16 BlkSize; + s32 LoopCnt; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + for (LoopCnt = 0; LoopCnt < 64; LoopCnt++) { + ReadBuff[LoopCnt] = 0U; + } + + BlkCnt = XSDPS_SWITCH_CMD_BLKCNT; + BlkSize = XSDPS_SWITCH_CMD_BLKSIZE; + BlkSize &= XSDPS_BLK_SIZE_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_BLK_SIZE_OFFSET, BlkSize); + + XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, ReadBuff); + + TransferMode = XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK; + + Arg = XSDPS_SWITCH_CMD_HS_GET; + + if (InstancePtr->Config.IsCacheCoherent == 0) { + Xil_DCacheInvalidateRange((INTPTR)ReadBuff, 64); + } + + Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 1U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Check for transfer complete + * Polling for response for now + */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* Write to clear error bits */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + + Status = (s32)XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* API to set high speed in card and host. Changes clock in host accordingly. +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return +* - XST_SUCCESS if successful. +* - XST_FAILURE if fail. +* +* @note None. +* +******************************************************************************/ +s32 XSdPs_Change_BusSpeed(XSdPs *InstancePtr) +{ + s32 Status; + u32 StatusReg; + u32 Arg; + u16 BlkCnt; + u16 BlkSize; + u8 ReadBuff[64] = {0U}; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + if (InstancePtr->CardType == XSDPS_CARD_SD) { + + BlkCnt = XSDPS_SWITCH_CMD_BLKCNT; + BlkSize = XSDPS_SWITCH_CMD_BLKSIZE; + BlkSize &= XSDPS_BLK_SIZE_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_BLK_SIZE_OFFSET, BlkSize); + + XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, ReadBuff); + + if (InstancePtr->Config.IsCacheCoherent == 0) { + Xil_DCacheFlushRange((INTPTR)ReadBuff, 64); + } + + TransferMode = XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK; + + Arg = XSDPS_SWITCH_CMD_HS_SET; + + Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 1U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Check for transfer complete + * Polling for response for now + */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* Write to clear error bits */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + + /* Change the clock frequency to 50 MHz */ + InstancePtr->BusSpeed = XSDPS_CLK_50_MHZ; + Status = XSdPs_Change_ClkFreq(InstancePtr, InstancePtr->BusSpeed); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + } else if (InstancePtr->CardType == XSDPS_CARD_MMC) { + Arg = XSDPS_MMC_HIGH_SPEED_ARG; + + Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Check for transfer complete + */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* + * Write to clear error bits + */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* + * Write to clear bit + */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + + /* Change the clock frequency to 52 MHz */ + InstancePtr->BusSpeed = XSDPS_CLK_52_MHZ; + Status = XSdPs_Change_ClkFreq(InstancePtr, XSDPS_CLK_52_MHZ); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } else { + if (InstancePtr->Mode == XSDPS_HS200_MODE) { + Arg = XSDPS_MMC_HS200_ARG; + InstancePtr->BusSpeed = XSDPS_MMC_HS200_MAX_CLK; + } else if (InstancePtr->Mode == XSDPS_DDR52_MODE) { + Arg = XSDPS_MMC_HIGH_SPEED_ARG; + InstancePtr->BusSpeed = XSDPS_MMC_DDR_MAX_CLK; + } else { + Arg = XSDPS_MMC_HIGH_SPEED_ARG; + InstancePtr->BusSpeed = XSDPS_MMC_HSD_MAX_CLK; + } + + Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Check for transfer complete + */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* + * Write to clear error bits + */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* + * Write to clear bit + */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + + Status = XSdPs_Change_ClkFreq(InstancePtr, InstancePtr->BusSpeed); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if (InstancePtr->Mode == XSDPS_HS200_MODE) { + Status = XSdPs_Execute_Tuning(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + } + + usleep(XSDPS_MMC_DELAY_FOR_SWITCH); + + StatusReg = (s32)XSdPs_ReadReg8(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL1_OFFSET); + StatusReg |= XSDPS_HC_SPEED_MASK; + XSdPs_WriteReg8(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL1_OFFSET, (u8)StatusReg); + + Status = (s32)XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* API to change clock freq to given value. +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* @param SelFreq - Clock frequency in Hz. +* +* @return None +* +* @note This API will change clock frequency to the value less than +* or equal to the given value using the permissible dividors. +* +******************************************************************************/ +s32 XSdPs_Change_ClkFreq(XSdPs *InstancePtr, u32 SelFreq) +{ + u16 ClockReg; + u16 DivCnt; + u16 Divisor = 0U; + u16 ExtDivisor; + s32 Status; + u16 ReadReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Disable clock */ + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + ClockReg &= ~(XSDPS_CC_SD_CLK_EN_MASK | XSDPS_CC_INT_CLK_EN_MASK); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET, ClockReg); + + if (InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) { +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + if ((InstancePtr->Mode != XSDPS_DEFAULT_SPEED_MODE) && + (InstancePtr->Mode != XSDPS_UHS_SPEED_MODE_SDR12)) + /* Program the Tap delays */ + XSdPs_SetTapDelay(InstancePtr); +#endif + /* Calculate divisor */ + for (DivCnt = 0x1U; DivCnt <= XSDPS_CC_EXT_MAX_DIV_CNT;DivCnt++) { + if (((InstancePtr->Config.InputClockHz) / DivCnt) <= SelFreq) { + Divisor = DivCnt >> 1; + break; + } + } + + if (DivCnt > XSDPS_CC_EXT_MAX_DIV_CNT) { + /* No valid divisor found for given frequency */ + Status = XST_FAILURE; + goto RETURN_PATH; + } + } else { + /* Calculate divisor */ + DivCnt = 0x1U; + while (DivCnt <= XSDPS_CC_MAX_DIV_CNT) { + if (((InstancePtr->Config.InputClockHz) / DivCnt) <= SelFreq) { + Divisor = DivCnt / 2U; + break; + } + DivCnt = DivCnt << 1U; + } + + if (DivCnt > XSDPS_CC_MAX_DIV_CNT) { + /* No valid divisor found for given frequency */ + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + + /* Set clock divisor */ + if (InstancePtr->HC_Version == XSDPS_HC_SPEC_V3) { + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + ClockReg &= ~(XSDPS_CC_SDCLK_FREQ_SEL_MASK | + XSDPS_CC_SDCLK_FREQ_SEL_EXT_MASK); + + ExtDivisor = Divisor >> 8; + ExtDivisor <<= XSDPS_CC_EXT_DIV_SHIFT; + ExtDivisor &= XSDPS_CC_SDCLK_FREQ_SEL_EXT_MASK; + + Divisor <<= XSDPS_CC_DIV_SHIFT; + Divisor &= XSDPS_CC_SDCLK_FREQ_SEL_MASK; + ClockReg |= Divisor | ExtDivisor | (u16)XSDPS_CC_INT_CLK_EN_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_CLK_CTRL_OFFSET, + ClockReg); + } else { + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + ClockReg &= (~XSDPS_CC_SDCLK_FREQ_SEL_MASK); + + Divisor <<= XSDPS_CC_DIV_SHIFT; + Divisor &= XSDPS_CC_SDCLK_FREQ_SEL_MASK; + ClockReg |= Divisor | (u16)XSDPS_CC_INT_CLK_EN_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_CLK_CTRL_OFFSET, + ClockReg); + } + + /* Wait for internal clock to stabilize */ + ReadReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + while((ReadReg & XSDPS_CC_INT_CLK_STABLE_MASK) == 0U) { + ReadReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET);; + } + + /* Enable SD clock */ + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET, + ClockReg | XSDPS_CC_SD_CLK_EN_MASK); + + Status = XST_SUCCESS; + +RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* API to send pullup command to card before using DAT line 3(using 4-bit bus) +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return +* - XST_SUCCESS if successful. +* - XST_FAILURE if fail. +* +* @note None. +* +******************************************************************************/ +s32 XSdPs_Pullup(XSdPs *InstancePtr) +{ + s32 Status; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + Status = XSdPs_CmdTransfer(InstancePtr, CMD55, + InstancePtr->RelCardAddr, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Status = XSdPs_CmdTransfer(InstancePtr, ACMD42, 0U, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* API to get EXT_CSD register of eMMC. +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* @param ReadBuff - buffer to store EXT_CSD +* +* @return +* - XST_SUCCESS if successful. +* - XST_FAILURE if fail. +* +* @note None. +* +******************************************************************************/ +s32 XSdPs_Get_Mmc_ExtCsd(XSdPs *InstancePtr, u8 *ReadBuff) +{ + s32 Status; + u32 StatusReg; + u32 Arg = 0U; + u16 BlkCnt; + u16 BlkSize; + s32 LoopCnt; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + for (LoopCnt = 0; LoopCnt < 512; LoopCnt++) { + ReadBuff[LoopCnt] = 0U; + } + + BlkCnt = XSDPS_EXT_CSD_CMD_BLKCNT; + BlkSize = XSDPS_EXT_CSD_CMD_BLKSIZE; + BlkSize &= XSDPS_BLK_SIZE_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_BLK_SIZE_OFFSET, BlkSize); + + XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, ReadBuff); + + if (InstancePtr->Config.IsCacheCoherent == 0) { + Xil_DCacheInvalidateRange((INTPTR)ReadBuff, 512U); + } + + TransferMode = XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK; + + /* Send SEND_EXT_CSD command */ + Status = XSdPs_CmdTransfer(InstancePtr, CMD8, Arg, 1U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Check for transfer complete + * Polling for response for now + */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* Write to clear error bits */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + + Status = (s32)XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; + +} + +/*****************************************************************************/ +/** +* +* API to write EXT_CSD register of eMMC. +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* @param Arg is the argument to be sent along with the command +* +* @return +* - XST_SUCCESS if successful. +* - XST_FAILURE if fail. +* +* @note None. +* +******************************************************************************/ +s32 XSdPs_Set_Mmc_ExtCsd(XSdPs *InstancePtr, u32 Arg) +{ + s32 Status; + u32 StatusReg; + + Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 0U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Check for transfer complete + */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* + * Write to clear error bits + */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, + XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + + Status = (s32)XSdPs_ReadReg(InstancePtr->Config.BaseAddress, + XSDPS_RESP0_OFFSET); + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; + +} + +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) +/*****************************************************************************/ +/** +* +* API to Identify the supported UHS mode. This API will assign the +* corresponding tap delay API to the Config_TapDelay pointer based on the +* supported bus speed. +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* @param ReadBuff contains the response for CMD6 +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XSdPs_Identify_UhsMode(XSdPs *InstancePtr, u8 *ReadBuff) +{ + + Xil_AssertVoid(InstancePtr != NULL); + + if (((ReadBuff[13] & UHS_SDR104_SUPPORT) != 0U) && + (InstancePtr->Config.InputClockHz >= XSDPS_SD_INPUT_MAX_CLK)) { + InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_SDR104; + InstancePtr->Config_TapDelay = XSdPs_sdr104_hs200_tapdelay; + } + else if (((ReadBuff[13] & UHS_SDR50_SUPPORT) != 0U) && + (InstancePtr->Config.InputClockHz >= XSDPS_SD_SDR50_MAX_CLK)) { + InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_SDR50; + InstancePtr->Config_TapDelay = XSdPs_sdr50_tapdelay; + } + else if (((ReadBuff[13] & UHS_DDR50_SUPPORT) != 0U) && + (InstancePtr->Config.InputClockHz >= XSDPS_SD_DDR50_MAX_CLK)) { + InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_DDR50; + InstancePtr->Config_TapDelay = XSdPs_ddr50_tapdelay; + } + else if (((ReadBuff[13] & UHS_SDR25_SUPPORT) != 0U) && + (InstancePtr->Config.InputClockHz >= XSDPS_SD_SDR25_MAX_CLK)) { + InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_SDR25; + InstancePtr->Config_TapDelay = XSdPs_hsd_sdr25_tapdelay; + } + else + InstancePtr->Mode = XSDPS_UHS_SPEED_MODE_SDR12; +} + +/*****************************************************************************/ +/** +* +* API to UHS-I mode initialization +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* @param Mode UHS-I mode +* +* @return +* - XST_SUCCESS if successful. +* - XST_FAILURE if fail. +* +* @note None. +* +******************************************************************************/ +s32 XSdPs_Uhs_ModeInit(XSdPs *InstancePtr, u8 Mode) +{ + s32 Status; + u16 StatusReg; + u16 CtrlReg; + u32 Arg; + u16 BlkCnt; + u16 BlkSize; + u8 ReadBuff[64] = {0U}; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Drive strength */ + + /* Bus speed mode selection */ + BlkCnt = XSDPS_SWITCH_CMD_BLKCNT; + BlkSize = XSDPS_SWITCH_CMD_BLKSIZE; + BlkSize &= XSDPS_BLK_SIZE_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_BLK_SIZE_OFFSET, + BlkSize); + + XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, ReadBuff); + + if (InstancePtr->Config.IsCacheCoherent == 0) { + Xil_DCacheFlushRange((INTPTR)ReadBuff, 64); + } + + TransferMode = XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK; + + switch (Mode) { + case 0U: + Arg = XSDPS_SWITCH_CMD_SDR12_SET; + InstancePtr->BusSpeed = XSDPS_SD_SDR12_MAX_CLK; + break; + case 1U: + Arg = XSDPS_SWITCH_CMD_SDR25_SET; + InstancePtr->BusSpeed = XSDPS_SD_SDR25_MAX_CLK; + break; + case 2U: + Arg = XSDPS_SWITCH_CMD_SDR50_SET; + InstancePtr->BusSpeed = XSDPS_SD_SDR50_MAX_CLK; + break; + case 3U: + Arg = XSDPS_SWITCH_CMD_SDR104_SET; + InstancePtr->BusSpeed = XSDPS_SD_SDR104_MAX_CLK; + break; + case 4U: + Arg = XSDPS_SWITCH_CMD_DDR50_SET; + InstancePtr->BusSpeed = XSDPS_SD_DDR50_MAX_CLK; + break; + default: + Status = XST_FAILURE; + goto RETURN_PATH; + break; + } + + Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 1U); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* + * Check for transfer complete + * Polling for response for now + */ + do { + StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET); + if ((StatusReg & XSDPS_INTR_ERR_MASK) != 0U) { + /* Write to clear error bits */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_ERR_INTR_STS_OFFSET, XSDPS_ERROR_INTR_ALL_MASK); + Status = XST_FAILURE; + goto RETURN_PATH; + } + } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0U); + + /* Write to clear bit */ + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK); + + + /* Current limit */ + + /* Set UHS mode in controller */ + CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET); + CtrlReg &= (u16)(~XSDPS_HC2_UHS_MODE_MASK); + CtrlReg |= Mode; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET, CtrlReg); + + /* Change the clock frequency */ + Status = XSdPs_Change_ClkFreq(InstancePtr, InstancePtr->BusSpeed); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if((Mode == XSDPS_UHS_SPEED_MODE_SDR104) || + (Mode == XSDPS_UHS_SPEED_MODE_SDR50)) { + /* Send tuning pattern */ + Status = XSdPs_Execute_Tuning(InstancePtr); + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + } + + Status = XST_SUCCESS; + + RETURN_PATH: + return Status; +} +#endif + +static s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr) +{ + s32 Status; + u16 BlkSize; + u16 CtrlReg; + u8 TuningCount; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + BlkSize = XSDPS_TUNING_CMD_BLKSIZE; + if(InstancePtr->BusWidth == XSDPS_8_BIT_WIDTH) + { + BlkSize = BlkSize*2U; + } + BlkSize &= XSDPS_BLK_SIZE_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_BLK_SIZE_OFFSET, + BlkSize); + + TransferMode = XSDPS_TM_DAT_DIR_SEL_MASK; + + CtrlReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET); + CtrlReg |= XSDPS_HC2_EXEC_TNG_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET, CtrlReg); + + /* + * workaround which can work for 1.0/2.0 silicon for auto tuning. + * This can be revisited for 3.0 silicon if necessary. + */ + /* Wait for ~60 clock cycles to reset the tap values */ + (void)usleep(1U); + +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + /* Issue DLL Reset to load new SDHC tuned tap values */ + XSdPs_DllReset(InstancePtr); +#endif + + for (TuningCount = 0U; TuningCount < MAX_TUNING_COUNT; TuningCount++) { + + if (InstancePtr->CardType == XSDPS_CARD_SD) { + Status = XSdPs_CmdTransfer(InstancePtr, CMD19, 0U, 1U); + } else { + Status = XSdPs_CmdTransfer(InstancePtr, CMD21, 0U, 1U); + } + + if (Status != XST_SUCCESS) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + if ((XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET) & XSDPS_HC2_EXEC_TNG_MASK) == 0U) { + break; + } + + if (TuningCount == 31) { +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + /* Issue DLL Reset to load new SDHC tuned tap values */ + XSdPs_DllReset(InstancePtr); +#endif + } + } + + if ((XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_HOST_CTRL2_OFFSET) & XSDPS_HC2_SAMP_CLK_SEL_MASK) == 0U) { + Status = XST_FAILURE; + goto RETURN_PATH; + } + + /* Wait for ~12 clock cycles to synchronize the new tap values */ + (void)usleep(1U); + +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) + /* Issue DLL Reset to load new SDHC tuned tap values */ + XSdPs_DllReset(InstancePtr); +#endif + + Status = XST_SUCCESS; + + RETURN_PATH: return Status; + +} + +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) +/*****************************************************************************/ +/** +* +* API to set Tap Delay for SDR104 and HS200 modes +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return None +* +* @note None. +* +******************************************************************************/ +void XSdPs_sdr104_hs200_tapdelay(u32 Bank, u32 DeviceId, u32 CardType) +{ + u32 TapDelay; + (void) CardType; + +#ifdef XPAR_PSU_SD_0_DEVICE_ID + if (DeviceId == 0U) { +#if EL1_NONSECURE && defined (__aarch64__) + (void)TapDelay; + if (Bank == 2) + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD0_OTAPDLY_SEL_MASK << 32), + (u64)SD0_OTAPDLYSEL_HS200_B2, 0, 0, 0, 0, 0); + else + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD0_OTAPDLY_SEL_MASK << 32), + (u64)SD0_OTAPDLYSEL_HS200_B0, 0, 0, 0, 0, 0); +#else + /* Program the OTAPDLY */ + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY); + TapDelay &= ~SD0_OTAPDLY_SEL_MASK; + if (Bank == 2) + TapDelay |= SD0_OTAPDLYSEL_HS200_B2; + else + TapDelay |= SD0_OTAPDLYSEL_HS200_B0; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay); +#endif + } else { +#endif + (void) DeviceId; +#if EL1_NONSECURE && defined (__aarch64__) + (void)TapDelay; + if (Bank == 2) + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD1_OTAPDLY_SEL_MASK << 32), + (u64)SD1_OTAPDLYSEL_HS200_B2, 0, 0, 0, 0, 0); + else + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD1_OTAPDLY_SEL_MASK << 32), + (u64)SD1_OTAPDLYSEL_HS200_B0, 0, 0, 0, 0, 0); +#else + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY); + TapDelay &= ~SD1_OTAPDLY_SEL_MASK; + if (Bank == 2) + TapDelay |= SD1_OTAPDLYSEL_HS200_B2; + else + TapDelay |= SD1_OTAPDLYSEL_HS200_B0; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay); +#endif +#ifdef XPAR_PSU_SD_0_DEVICE_ID + } +#endif +} + +/*****************************************************************************/ +/** +* +* API to set Tap Delay for SDR50 mode +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return None +* +* @note None. +* +******************************************************************************/ +void XSdPs_sdr50_tapdelay(u32 Bank, u32 DeviceId, u32 CardType) +{ + u32 TapDelay; + (void) Bank; + (void) CardType; + +#ifdef XPAR_PSU_SD_0_DEVICE_ID + if (DeviceId == 0U) { +#if EL1_NONSECURE && defined (__aarch64__) + (void)TapDelay; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_OTAPDLY) | + ((u64)SD0_OTAPDLY_SEL_MASK << 32), (u64)SD0_OTAPDLYSEL_SD50, + 0, 0, 0, 0, 0); +#else + /* Program the OTAPDLY */ + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY); + TapDelay &= ~SD0_OTAPDLY_SEL_MASK; + TapDelay |= SD0_OTAPDLYSEL_SD50; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay); +#endif + } else { +#endif + (void) DeviceId; +#if EL1_NONSECURE && defined (__aarch64__) + (void)TapDelay; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_OTAPDLY) | + ((u64)SD1_OTAPDLY_SEL_MASK << 32), (u64)SD1_OTAPDLYSEL_SD50, + 0, 0, 0, 0, 0); +#else + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY); + TapDelay &= ~SD1_OTAPDLY_SEL_MASK; + TapDelay |= SD1_OTAPDLYSEL_SD50; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay); +#endif +#ifdef XPAR_PSU_SD_0_DEVICE_ID + } +#endif +} + +/*****************************************************************************/ +/** +* +* API to set Tap Delay for DDR50 mode +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return None +* +* @note None. +* +******************************************************************************/ +void XSdPs_ddr50_tapdelay(u32 Bank, u32 DeviceId, u32 CardType) +{ + u32 TapDelay; + (void) Bank; + +#ifdef XPAR_PSU_SD_0_DEVICE_ID + if (DeviceId == 0U) { +#if EL1_NONSECURE && defined (__aarch64__) + (void)TapDelay; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD0_ITAPCHGWIN << 32), (u64)SD0_ITAPCHGWIN, + 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD0_ITAPDLYENA << 32), (u64)SD0_ITAPDLYENA, + 0, 0, 0, 0, 0); + if (CardType== XSDPS_CARD_SD) + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_ITAPDLY) | ((u64)SD0_ITAPDLY_SEL_MASK << 32), + (u64)SD0_ITAPDLYSEL_SD_DDR50, 0, 0, 0, 0, 0); + else + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_ITAPDLY) | ((u64)SD0_ITAPDLY_SEL_MASK << 32), + (u64)SD0_ITAPDLYSEL_EMMC_DDR50, 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD0_ITAPCHGWIN << 32), (u64)0x0, 0, 0, 0, 0, 0); + if (CardType == XSDPS_CARD_SD) + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD0_OTAPDLY_SEL_MASK << 32), + (u64)SD0_OTAPDLYSEL_SD_DDR50, 0, 0, 0, 0, 0); + else + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD0_OTAPDLY_SEL_MASK << 32), + (u64)SD0_OTAPDLYSEL_EMMC_DDR50, 0, 0, 0, 0, 0); +#else + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY); + TapDelay |= SD0_ITAPCHGWIN; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + /* Program the ITAPDLY */ + TapDelay |= SD0_ITAPDLYENA; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + if (CardType== XSDPS_CARD_SD) + TapDelay |= SD0_ITAPDLYSEL_SD_DDR50; + else + TapDelay |= SD0_ITAPDLYSEL_EMMC_DDR50; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + TapDelay &= ~SD0_ITAPCHGWIN; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + /* Program the OTAPDLY */ + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY); + TapDelay &= ~SD0_OTAPDLY_SEL_MASK; + if (CardType == XSDPS_CARD_SD) + TapDelay |= SD0_OTAPDLYSEL_SD_DDR50; + else + TapDelay |= SD0_OTAPDLYSEL_EMMC_DDR50; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay); +#endif + } else { +#endif + (void) DeviceId; +#if EL1_NONSECURE && defined (__aarch64__) + (void)TapDelay; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD1_ITAPCHGWIN << 32), (u64)SD1_ITAPCHGWIN, + 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD1_ITAPDLYENA << 32), (u64)SD1_ITAPDLYENA, + 0, 0, 0, 0, 0); + if (CardType== XSDPS_CARD_SD) + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_ITAPDLY) | ((u64)SD1_ITAPDLY_SEL_MASK << 32), + (u64)SD1_ITAPDLYSEL_SD_DDR50, 0, 0, 0, 0, 0); + else + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_ITAPDLY) | ((u64)SD1_ITAPDLY_SEL_MASK << 32), + (u64)SD1_ITAPDLYSEL_EMMC_DDR50, 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_ITAPDLY) | ((u64)SD1_ITAPCHGWIN << 32), + (u64)0x0, 0, 0, 0, 0, 0); + if (CardType == XSDPS_CARD_SD) + Xil_Smc(MMIO_WRITE_SMC_FID,(u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD1_OTAPDLY_SEL_MASK << 32), + (u64)SD1_OTAPDLYSEL_SD_DDR50, 0, 0, 0, 0, 0); + else + Xil_Smc(MMIO_WRITE_SMC_FID,(u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD1_OTAPDLY_SEL_MASK << 32), + (u64)SD1_OTAPDLYSEL_EMMC_DDR50, 0, 0, 0, 0, 0); +#else + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY); + TapDelay |= SD1_ITAPCHGWIN; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + /* Program the ITAPDLY */ + TapDelay |= SD1_ITAPDLYENA; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + if (CardType == XSDPS_CARD_SD) + TapDelay |= SD1_ITAPDLYSEL_SD_DDR50; + else + TapDelay |= SD1_ITAPDLYSEL_EMMC_DDR50; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + TapDelay &= ~SD1_ITAPCHGWIN; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + /* Program the OTAPDLY */ + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY); + TapDelay &= ~SD1_OTAPDLY_SEL_MASK; + if (CardType == XSDPS_CARD_SD) + TapDelay |= SD1_OTAPDLYSEL_SD_DDR50; + else + TapDelay |= SD1_OTAPDLYSEL_EMMC_DDR50; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay); +#endif +#ifdef XPAR_PSU_SD_0_DEVICE_ID + } +#endif +} + +/*****************************************************************************/ +/** +* +* API to set Tap Delay for HSD and SDR25 mode +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return None +* +* @note None. +* +******************************************************************************/ +void XSdPs_hsd_sdr25_tapdelay(u32 Bank, u32 DeviceId, u32 CardType) +{ + u32 TapDelay; + (void) Bank; + +#ifdef XPAR_PSU_SD_0_DEVICE_ID + if (DeviceId == 0U) { +#if EL1_NONSECURE && defined (__aarch64__) + (void)TapDelay; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD0_ITAPCHGWIN << 32), (u64)SD0_ITAPCHGWIN, + 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD0_ITAPDLYENA << 32), (u64)SD0_ITAPDLYENA, + 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD0_ITAPDLY_SEL_MASK << 32), (u64)SD0_ITAPDLYSEL_HSD, + 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD0_ITAPCHGWIN << 32), (u64)0x0, 0, 0, 0, 0, 0); + if (CardType == XSDPS_CARD_SD) + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD0_OTAPDLY_SEL_MASK << 32), + (u64)SD0_OTAPDLYSEL_SD_HSD, 0, 0, 0, 0, 0); + else + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD0_OTAPDLY_SEL_MASK << 32), + (u64)SD0_OTAPDLYSEL_EMMC_HSD, 0, 0, 0, 0, 0); +#else + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY); + TapDelay |= SD0_ITAPCHGWIN; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + /* Program the ITAPDLY */ + TapDelay |= SD0_ITAPDLYENA; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + TapDelay |= SD0_ITAPDLYSEL_HSD; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + TapDelay &= ~SD0_ITAPCHGWIN; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + /* Program the OTAPDLY */ + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY); + TapDelay &= ~SD0_OTAPDLY_SEL_MASK; + if (CardType == XSDPS_CARD_SD) + TapDelay |= SD0_OTAPDLYSEL_SD_HSD; + else + TapDelay |= SD0_OTAPDLYSEL_EMMC_HSD; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay); +#endif + } else { +#endif + (void) DeviceId; +#if EL1_NONSECURE && defined (__aarch64__) + (void)TapDelay; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD1_ITAPCHGWIN << 32), (u64)SD1_ITAPCHGWIN, + 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD1_ITAPDLYENA << 32), (u64)SD1_ITAPDLYENA, + 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD1_ITAPDLY_SEL_MASK << 32), (u64)SD1_ITAPDLYSEL_HSD, + 0, 0, 0, 0, 0); + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + SD_ITAPDLY) | + ((u64)SD1_ITAPCHGWIN << 32), (u64)0x0, 0, 0, 0, 0, 0); + if (CardType == XSDPS_CARD_SD) + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD1_OTAPDLY_SEL_MASK << 32), + (u64)SD1_OTAPDLYSEL_SD_HSD, 0, 0, 0, 0, 0); + else + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_OTAPDLY) | ((u64)SD1_OTAPDLY_SEL_MASK << 32), + (u64)SD1_OTAPDLYSEL_EMMC_HSD, 0, 0, 0, 0, 0); +#else + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY); + TapDelay |= SD1_ITAPCHGWIN; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + /* Program the ITAPDLY */ + TapDelay |= SD1_ITAPDLYENA; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + TapDelay |= SD1_ITAPDLYSEL_HSD; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + TapDelay &= ~SD1_ITAPCHGWIN; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_ITAPDLY, TapDelay); + /* Program the OTAPDLY */ + TapDelay = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY); + TapDelay &= ~SD1_OTAPDLY_SEL_MASK; + if (CardType == XSDPS_CARD_SD) + TapDelay |= SD1_OTAPDLYSEL_SD_HSD; + else + TapDelay |= SD1_OTAPDLYSEL_EMMC_HSD; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_OTAPDLY, TapDelay); +#endif +#ifdef XPAR_PSU_SD_0_DEVICE_ID + } +#endif +} + +/*****************************************************************************/ +/** +* +* API to set Tap Delay w.r.t speed modes +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return None +* +* @note None. +* +******************************************************************************/ +void XSdPs_SetTapDelay(XSdPs *InstancePtr) +{ + u32 DllCtrl, BankNum, DeviceId, CardType; + + BankNum = InstancePtr->Config.BankNumber; + DeviceId = InstancePtr->Config.DeviceId ; + CardType = InstancePtr->CardType ; +#ifdef XPAR_PSU_SD_0_DEVICE_ID + if (DeviceId == 0U) { +#if EL1_NONSECURE && defined (__aarch64__) + (void)DllCtrl; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_DLL_CTRL) | ((u64)SD0_DLL_RST << 32), + (u64)SD0_DLL_RST, 0, 0, 0, 0, 0); +#else + DllCtrl = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL); + DllCtrl |= SD0_DLL_RST; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl); +#endif + InstancePtr->Config_TapDelay(BankNum, DeviceId, CardType); +#if EL1_NONSECURE && defined (__aarch64__) + (void)DllCtrl; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_DLL_CTRL) | ((u64)SD0_DLL_RST << 32), + (u64)0x0, 0, 0, 0, 0, 0); +#else + DllCtrl &= ~SD0_DLL_RST; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl); +#endif + } else { +#endif +#if EL1_NONSECURE && defined (__aarch64__) + (void)DllCtrl; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_DLL_CTRL) | ((u64)SD1_DLL_RST << 32), + (u64)SD1_DLL_RST, 0, 0, 0, 0, 0); +#else + DllCtrl = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL); + DllCtrl |= SD1_DLL_RST; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl); +#endif + InstancePtr->Config_TapDelay(BankNum, DeviceId, CardType); +#if EL1_NONSECURE && defined (__aarch64__) + (void)DllCtrl; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_DLL_CTRL) | ((u64)SD1_DLL_RST << 32), + (u64)0x0, 0, 0, 0, 0, 0); +#else + DllCtrl &= ~SD1_DLL_RST; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl); +#endif +#ifdef XPAR_PSU_SD_0_DEVICE_ID + } +#endif +} + +/*****************************************************************************/ +/** +* +* API to reset the DLL +* +* +* @param InstancePtr is a pointer to the XSdPs instance. +* +* @return None +* +* @note None. +* +******************************************************************************/ +static void XSdPs_DllReset(XSdPs *InstancePtr) +{ + u32 ClockReg, DllCtrl; + + /* Disable clock */ + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + ClockReg &= ~XSDPS_CC_SD_CLK_EN_MASK; + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET, ClockReg); + + /* Issue DLL Reset to load zero tap values */ + DllCtrl = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL); + if (InstancePtr->Config.DeviceId == 0U) { +#if EL1_NONSECURE && defined (__aarch64__) + (void)DllCtrl; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_DLL_CTRL) | ((u64)SD0_DLL_RST << 32), + (u64)SD0_DLL_RST, 0, 0, 0, 0, 0); +#else + DllCtrl |= SD0_DLL_RST; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl); +#endif + } else { +#if EL1_NONSECURE && defined (__aarch64__) + (void)DllCtrl; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_DLL_CTRL) | ((u64)SD1_DLL_RST << 32), + (u64)SD1_DLL_RST, 0, 0, 0, 0, 0); +#else + DllCtrl |= SD1_DLL_RST; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl); +#endif + } + + /* Wait for 2 micro seconds */ + (void)usleep(2U); + + /* Release the DLL out of reset */ + DllCtrl = XSdPs_ReadReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL); + if (InstancePtr->Config.DeviceId == 0U) { +#if EL1_NONSECURE && defined (__aarch64__) + (void)DllCtrl; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_DLL_CTRL) | ((u64)SD0_DLL_RST << 32), + (u64)0x0, 0, 0, 0, 0, 0); +#else + DllCtrl &= ~SD0_DLL_RST; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl); +#endif + } else { +#if EL1_NONSECURE && defined (__aarch64__) + (void)DllCtrl; + Xil_Smc(MMIO_WRITE_SMC_FID, (u64)(XPS_SYS_CTRL_BASEADDR + + SD_DLL_CTRL) | ((u64)SD1_DLL_RST << 32), + (u64)0x0, 0, 0, 0, 0, 0); +#else + DllCtrl &= ~SD1_DLL_RST; + XSdPs_WriteReg(XPS_SYS_CTRL_BASEADDR, SD_DLL_CTRL, DllCtrl); +#endif + } + + /* Wait for internal clock to stabilize */ + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + while((ClockReg & XSDPS_CC_INT_CLK_STABLE_MASK) == 0U) { + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + } + + /* Enable SD clock */ + ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET); + XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, + XSDPS_CLK_CTRL_OFFSET, + ClockReg | XSDPS_CC_SD_CLK_EN_MASK); +} +#endif +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_sinit.c new file mode 100644 index 0000000..62bbfc0 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/sdps_v3_5/src/xsdps_sinit.c @@ -0,0 +1,99 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xsdps_sinit.c +* @addtogroup sdps_v3_5 +* @{ +* +* The implementation of the XSdPs component's static initialization +* functionality. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ---    -------- -----------------------------------------------
    +* 1.00a hk/sg  10/17/13 Initial release
    +*       kvn    07/15/15 Modified the code according to MISRAC-2012.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xstatus.h" +#include "xsdps.h" +#include "xparameters.h" +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +extern XSdPs_Config XSdPs_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 xsdps.h for the definition of XSdPs_Config. +* +* @note None. +* +******************************************************************************/ +XSdPs_Config *XSdPs_LookupConfig(u16 DeviceId) +{ + XSdPs_Config *CfgPtr = NULL; + u32 Index; + + for (Index = 0U; Index < (u32)XPAR_XSDPS_NUM_INSTANCES; Index++) { + if (XSdPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XSdPs_ConfigTable[Index]; + break; + } + } + return (XSdPs_Config *)CfgPtr; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_exit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_exit.c new file mode 100644 index 0000000..cf59888 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_exit.c @@ -0,0 +1,44 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include +#include "xil_types.h" + +/* _exit - Simple implementation. Does not return. +*/ +__attribute__((weak)) void _exit (sint32 status) +{ + (void)status; + while (1) { + ; + } +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_open.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_open.c new file mode 100644 index 0000000..a108b77 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_open.c @@ -0,0 +1,54 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +#ifndef UNDEFINE_FILE_OPS +#include +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) s32 _open(const char8 *buf, s32 flags, s32 mode); +} +#endif + +/* + * _open -- open a file descriptor. We don't have a filesystem, so + * we return an error. + */ +__attribute__((weak)) s32 _open(const char8 *buf, s32 flags, s32 mode) +{ + (void)buf; + (void)flags; + (void)mode; + errno = EIO; + return (-1); +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_sbrk.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_sbrk.c new file mode 100644 index 0000000..967bdfc --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/_sbrk.c @@ -0,0 +1,65 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include +#include "xil_types.h" + +extern u8 _heap_start[]; +extern u8 _heap_end[]; + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) caddr_t _sbrk ( s32 incr ); +} +#endif + +__attribute__((weak)) caddr_t _sbrk ( s32 incr ) +{ + static u8 *heap = NULL; + u8 *prev_heap; + static u8 *HeapEndPtr = (u8 *)&_heap_end; + caddr_t Status; + + if (heap == NULL) { + heap = (u8 *)&_heap_start; + } + prev_heap = heap; + + if (((heap + incr) <= HeapEndPtr) && (prev_heap != NULL)) { + heap += incr; + Status = (caddr_t) ((void *)prev_heap); + } else { + Status = (caddr_t) -1; + } + + return Status; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/abort.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/abort.c new file mode 100644 index 0000000..e8988c0 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/abort.c @@ -0,0 +1,42 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include +#include + +/* + * abort -- go out via exit... + */ +__attribute__((weak)) void abort(void) +{ + _exit(1); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/bspconfig.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/bspconfig.h new file mode 100644 index 0000000..9427ad0 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/bspconfig.h @@ -0,0 +1,45 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Configurations for Standalone BSP +* +*******************************************************************/ + +#ifndef BSPCONFIG_H /* prevent circular inclusions */ +#define BSPCONFIG_H /* by using protection macros */ + +#define MICROBLAZE_PVR_NONE + +#endif /*end of __BSPCONFIG_H_*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/changelog.txt b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/changelog.txt new file mode 100644 index 0000000..0dab3e9 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/changelog.txt @@ -0,0 +1,549 @@ +/***************************************************************************** + * 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 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. + * 3.12a asa 10/22/13 Modified the files xpseudo_asm_rvct.c and xpseudo_asm_rvct.h + * to fix linking issues with armcc/DS-5. Modified the armcc + * makefile to fix issues. + * 3.12a asa 11/15/13 Fix for CR#754800. It fixes issues around profiling for MB. + * 4.0 hk 12/13/13 Added check for STDOUT_BASEADDRESS where outbyte is used. + * 4.0 pkp 22/01/14 Modified return addresses for interrupt handlers (DataAbortHandler + * and SWIHandler) in asm_vector.S (src\cortexa9\gcc\ and + * src\cortexa9\armcc\) to fix CR#767251 + * 4.0 pkp 24/01/14 Modified cache APIs (Xil_DCacheInvalidateRange and + * Xil_L1DCacheInvalidate) in xil_cache.c (src\cortexa9) to fix the bugs. + * Few cache lines were missed to invalidate when unaligned address + * invalidation was accommodated in Xil_DCacheInvalidateRange. + * In Xil_L1DCacheInvalidate, while invalidating all L1D cache + * stack memory (which contains return address) was invalidated. So + * stack memory is flushed first and then L1D cache is invalidated. + * This is done to fix CR #763829 + * 4.0 adk 22/02/2014 Fixed the CR:775379 removed unnecessay _t(unit32_t etc) from + * mblaze_nt_types.h file and replace uint32_t with u32 in the + * profile_hist.c to fix the above CR. + * 4.1 bss 04/14/14 Updated driver tcl to remove _interrupt_handler.o from libgloss.a + * instead of libxil.a and added prototypes for + * microblaze_invalidate_cache_ext and microblaze_flush_cache_ext in + * mb_interface.h + * 4.1 hk 04/18/14 Add sleep function. + * 4.1 asa 04/21/14 Fix for CR#764881. Added support for msrset and msrclr. Renamed + * some of the *.s files inMB BSP source to *.S. + * 4.1 asa 04/28/14 Fix for CR#772280. Made changes in file cortexa9/gcc/read.c. + * 4.1 bss 04/29/14 Modified driver tcl to use libxil.a if libgloss.a does not exist + * CR#794205 + * 4.1 asa 05/09/14 Fix for CR#798230. Made changes in cortexa9/xil_cache.c and + * common/xil_testcache.c + * Fix for CR#764881. + * 4.1 srt 06/27/14 Remove '#undef DEBUG' from src/common/xdebug.h, which allows to + * output the DEBUG logs when -DDEBUG flag is enabled in BSP. + * 4.2 pkp 06/27/14 Added support for IAR compiler in src/cortexa9/iccarm. + * Also added explanatory notes in cortexa9/xil_cache.c for CR#785243. + * 4.2 pkp 06/19/14 Asynchronous abort has been enabled into cortexa9/gcc/boot.s and + * cortexa9/armcc/boot.s. Added default exception handlers for data + * abort and prefetch abort using handlers called + * DataAbortHandler and PrefetchAbortHandler respectively in + * cortexa9/xil_exception.c to fix CR#802862. + * 4.2 pkp 06/30/14 MakeFile for cortexa9/armcc has been changed to fixes the + * issue of improper linking of translation_table.s + * 4.2 pkp 07/04/14 added weak attribute for the function in BSP which are also present + * in tool chain to avoid conflicts into some special cases + * 4.2 pkp 07/21/14 Corrected reset value of event counter in function + * Xpm_ResetEventCounters in src/cortexa9/xpm_counter.c to fix CR#796275 + * 4.2 pkp 07/21/14 Included xil_types.h file in xil_mmu.h which had contained a function + * containing type def u32 defined in xil_types.g to resolve issue of + * CR#805869 + * 4.2 pkp 08/04/14 Removed unimplemented nanosleep routine from cortexa9/usleep.c as + * it is not possible to generate timer in nanosecond due to limited + * cpu frequency + * 4.2 pkp 08/04/14 Removed PEEP board related code which contained initialization of + * uart, smc nor and sram from cortexa9/gcc/xil-crt0.s and armcc/boot.s + * and iccarm/boot.s. Also uart.c and smc.c have been removed. Also + * removed function definition of XSmc_NorInit and XSmc_NorInit from + * cortexa9/smc.h + * 4.2 bss 08/11/14 Added microblaze_flush_cache_ext_range and microblaze_invalidate_ + * cache_ext_range declarations in mb_interface.h CR#783821. + * Modified profile_mcount_mb.S to fix CR#808412. + * 4.2 pkp 08/21/14 modified makefile of iccarm for proper linking of objectfiles in + * cortexa9/iccarm to fix CR#816701 + * 4.2 pkp 09/02/14 modified translation table entries in cortexa9/gcc/translation_table.s, + * armcc/translation_table.s and iccarm/translation_table.s + * to properly defined reserved entries according to address map for + * fixing CR#820146 + * 4.2 pkp 09/11/14 modified translation table entries in cortexa9/iccarm/translation_table.s + * and cortexa9/armcc/translation_table.s to resolve compilation + * error for solving CR#822897 + * 5.0 kvn 12/9/14 Support for Zync Ultrascale Mp.Also modified code for + * MISRA-C:2012 compliance. + * 5.0 pkp 12/15/14 Added APIs to get information about the platforms running the code by + * adding src/common/xplatform_info.*s + * 5.0 pkp 16/12/14 Modified boot code to enable scu after MMU is enabled and + * removed incorrect initialization of TLB lockdown register to fix + * CR#830580 in cortexa9/gcc/boot.S & cpu_init.S, armcc/boot.S + * and iccarm/boot.s + * 5.0 pkp 25/02/15 Modified floating point flag to vfpv3 from vfpv3_d16 in BSP MakeFile + * for iccarm and armcc compiler of cortexA9 + * 5.1 pkp 05/13/15 Changed the initialization order in cortexa9/gcc/boot.S, iccarm/boot.s + * and armcc/boot.s so to first invalidate caches and TLB, enable MMU and + * caches, then enable SMP bit in ACTLR. L2Cache invalidation and enabling + * of L2Cache is done later. + * 5.1 pkp 12/05/15 Modified cortexa9/xil_cache.c to modify Xil_DCacheInvalidateRange and + * Xil_DCacheFlushRange to remove unnecessary dsb which is unnecessarily + * taking long time to fix CR#853097. L2CacheSync is added into + * Xil_L2CacheInvalidateRange API. Xil_L1DCacheInvalidate and + * Xil_L2CacheInvalidate APIs are modified to flush the complete stack + * instead of just System Stack + * 5.1 pkp 14/05/15 Modified cortexa9/gcc/Makefile to keep a correct check of a compiler + * to update ECC_FLAGS and also take the compiler and archiver as specified + * in settings instead of hardcoding it. + * 5.2 pkp 06/08/15 Modified cortexa9/gcc/translation_table.S to put a check for + * XPAR_PS7_DDR_0_S_AXI_BASEADDR to confirm if DDR is present or not and + * accordingly generate the translation table + * 5.2 pkp 23/07/15 Modified cortexa9/gcc/Makefile to keep a correct check of a compiler + * to update ECC_FLAGS to fix a bug introduced during new version creation + * of BSP. + * 5.3 pkp 10/07/15 Modified cortexa9/xil_cache.c file to change cache API so that L2 Cache + * functionalities are avoided for the OpenAMP slave application(when + * USE_AMP flag is defined for BSP) as master CPU would be utilizing L2 + * cache for its operation. Also file operations such as read, write, + * close, open are also avoided for OpenAMP support(when USE_AMP flag is + * defined for BSP) because XilOpenAMP library contains own file operation. + * The xil-crt0.S file is modified for not initializing global timer for + * OpenAMP application as it might be already in use by master CPU + * 5.3 pkp 10/09/15 Modified cortexa9/iccarm/xpseudo_asm_iccarm.h file to change function + * definition for dsb, isb and dmb to fix the compilation error when used + * kvn 16/10/15 Encapsulated assembly code into macros for R5 xil_cache file. + * 5.4 pkp 09/11/15 Modified cortexr5/gcc/boot.S to disable ACTLR.DBWR bit to avoid potential + * R5 deadlock for errata 780125 + * 5.4 pkp 09/11/15 Modified cortexa53/32bit/gcc/boot.S to enable I-Cache and D-Cache for a53 + * 32 bit BSP in the initialization + * 5.4 pkp 09/11/15 Modified cortexa9/xil_misc_psreset_api.c file to change the description + * for XOcm_Remap function + * 5.4 pkp 16/11/15 Modified microblaze/xil_misc_psreset_api.c file to change the description + * for XOcm_Remap function + * kvn 21/11/15 Added volatile keyword for ADDR varibles in Xil_Out API + * kvn 21/11/15 Changed ADDR variable type from u32 to UINTPTR. This is + * required for MISRA-C:2012 Compliance. + * 5.4 pkp 23/11/15 Added attribute definitions for Xil_SetTlbAttributes API of Cortex-A9 + * in cortexa9/xil_mmu.h + * 5.4 pkp 23/11/15 Added default undefined exception handler for Cortex-A9 + * 5.4 pkp 11/12/15 Modified common/xplatform_info.h to add #defines for silicon for + * checking the current executing platform + * 5.4 pkp 18/12/15 Modified cortexa53/32bit/gcc/xil-crt0.S and 64bit/gcc/xil-crt0.S + * to initialize global constructor for C++ applications + * 5.4 pkp 18/12/15 Modified cortexr5/gcc/xil-crt0.S to initialize global constructor for + * C++ applications + * 5.4 pkp 18/12/15 Modified cortexa53/32bit/gcc/translation_table.S and 64bit/gcc/ + * translation_table.S to update the translation table according to proper + * address map + * 5.4 pkp 18/12/15 Modified cortexar5/mpu.c to initialize the MPU according to proper + * address map + * 5.4 pkp 05/01/16 Modified cortexa53/64bit/boot.S to set the reset vector register RVBAR + * equivalent to vector table base address + * 5.4 pkp 08/01/16 Modified cortexa9/gcc/Makefile to update the extra compiler flag + * as per the toolchain update + * 5.4 pkp 12/01/16 Changed common/xplatform_info.* to add platform information support + * for Cortex-A53 32bit mode + * 5.4 pkp 28/01/16 Modified cortexa53/32bit/sleep.c and usleep.c & cortexa53/64bit/sleep.c + * and usleep.c to correct routines to avoid hardcoding the timer frequency, + * instead take it from xparameters.h to properly configure the timestamp + * clock frequency + * 5.4 asa 29/01/16 Modified microblaze/mb_interface.h to add macros that support the + * new instructions for MB address extension feature + * 5.4 kvn 30/01/16 Modified xparameters_ps.h file to add interrupt ID number for + * system monitor. + * 5.4 pkp 04/02/16 Modified cortexr5/gcc/boot.S to enable fault log for lock-step mode + * 5.4 pkp 19/02/16 Modified cortexr5/xtime_l.c to add an API XTime_StartTimer and updated + * cortexr5/xil-crt0.S to configure the TTC3 timer when present. Modified + * cortexr5/sleep.c, cortexr5/usleep.c to use TTC3 when present otherwise + * use set of assembly instructions to provide required delay to fix + * CR#913249. + * 5.4 asa 25/02/16 Made changes in xil-crt0.S for R5, A53 64 and 32 bit BSPs, to replace + * _exit with exit. We should not be directly calling _exit and should + * always use the library exit. This fixes the CR#937036. + * 5.4 pkp 25/02/16 Made change to cortexr5/gcc/boot.S to initialize the floating point + * registers, banked registers for various modes and enabled + * the cache ECC check before enabling the fault log for lock step mode + * Also modified the cortexr5/gcc/Makefile to support floating point + * registers initialization in boot code. + * 5.4 pkp 03/01/16 Updated the exit function in cortexr5/gcc/_exit.c to enable the debug + * logic in case of lock-step mode when fault log is enabled to fix + * CR#938281 + * 5.4 pkp 03/02/16 Modified cortexa9/iccarm/xpseudo_asm_iccarm.h file to include + * header file instrinsics.h which contains assembly instructions + * definitions which can be used by C + * 5.4 asa 03/02/16 Added print.c in MB BSP. Made other cosmetic changes to have uniform + * proto for all print.c across the BSPs. This patch fixes CR#938738. + * 5.4 pkp 03/09/16 Modified cortexr5/sleep.c and usleep.c to avoid disabling the + * interrupts when sleep/usleep is being executed using assembly + * instructions to fix CR#913249. + * 5.4 pkp 03/11/16 Modified cortexr5/xtime_l.c to avoid enabling overflow interrupt, + * instead modified cortexr5/sleep.c and usleep.c to poll the counter + * value and compare it with previous value to detect the overflow + * to fix CR#940209. + * 5.4 pkp 03/24/16 Modified cortexr5/boot.S to reset the dbg_lpd_reset before enabling + * the fault log to avoid intervention for lock-step mode and cortexr5/ + * _exit.c to enable the dbg_lpd_reset once the fault log is disabled + * to fix CR#947335 + * 5.5 pkp 04/11/16 Modified cortexr5/boot.S to enable comparators for non-JTAG bootmode + * in lock-step to avoid resetting the debug logic which restricts the + * access for debugger and removed enabling back of debug modules in + * cortexr5/_exit.c + * 5.5 pkp 04/13/16 Modified cortexa9/gcc/read.c to return correct number of bytes when + * read buffer is filled and removed the redundant NULL checking for + * buffer to simplify the code + * 5.5 pkp 04/13/16 Modified cortexa53/64bit/gcc/read.c and cortexa53/32bit/gcc/read.c + * to return correct number of bytes when read buffer is filled and + * removed the redundant NULL checking for buffer to simplify the code + * 5.5 pkp 04/13/16 Modified cortexr5/gcc/read.c to return correct number of bytes when + * read buffer is filled and removed the redundant NULL checking for + * buffer to simplify the code + * 5.5 pkp 04/13/16 Modified cortexa53/64bit/xpseudo_asm_gcc.h to add volatile to asm + * instruction macros to disable certain optimizations which may move + * code out of loops if optimizers believe that the code will always + * return the same result or discard asm statements if optimizers + * determine there is no need for the output variables + * 5.5 pkp 04/13/16 Modified cortexa53/64bit/xtime_l.c to add XTime_StartTimer which + * starts the timer if it is disabled and modified XTime_GetTime to + * enable the timer if it is not enabled. Also modified cortexa53/64bit/ + * sleep.c and cortexa53/64bit/usleep.c to enable the timer if it is + * disabled and read the counter value directly from register instead + * of using XTime_GetTime for optimization + * 5.5 pkp 04/13/16 Modified cortexa53/32bit/xtime_l.c to add XTime_StartTimer which + * starts the timer if it is disabled and modified XTime_GetTime to + * enable the timer if it is not enabled. Also modified cortexa53/32bit/ + * sleep.c and cortexa53/32bit/usleep.c to enable the timer if it is + * disabled and read the counter value directly from register instead + * of using XTime_GetTime for optimization + * 5.5 pkp 04/13/16 Modified cortexa53/32bit/xil_cache.c and cortexa53/64bit/xil_cache.c + * to update the Xil_DCacheInvalidate, Xil_DCacheInvalidateLine and + * Xil_DCacheInvalidateRange functions description for proper + * explaination to fix CR#949801 + * 5.5 asa 04/20/16 Added missing macros for hibernate and suspend in Microblaze BSP + * file mb_interface.h. This fixes the CR#949503. + * 5.5 asa 04/29/16 Fix for CR#951080. Updated cache APIs for HW designs where cache + * memory is not included for MicroBlaze. + * 5.5 pkp 05/06/16 Modified the cortexa9/xil_exception.h to update the macros + * Xil_EnableNestedInterrupts and Xil_DisableNestedInterrupts for fixing + * the issue of lr being corrupted to resolve CR#950468 + * 5.5 pkp 05/06/16 Modified the cortexr5/xil_exception.h to update the macros + * Xil_EnableNestedInterrupts and Xil_DisableNestedInterrupts for fixing + * the issue of lr being corrupted to resolve CR#950468 + * 6.0 kvn 05/31/16 Make Xil_AsserWait a global variable + * 6.0 pkp 06/27/16 Updated cortexr5/mpu.c to move the code related to Init_MPU to .boot + * section since it is part of boot process to fix CR#949555 + * hk 07/12/16 Correct masks for IOU SLCR GEM registers + * 6.0 pkp 07/25/16 Program the counter frequency in boot code for CortexA53 + * 6.0 asa 08/03/16 Updated sleep_common function in microblaze_sleep.c to improve the + * the accuracy of MB sleep functionality. This fixes the CR#954191. + * 6.0 mus 08/03/16 Restructured the BSP to avoid code duplication across all BSPs. + * Source code directories specific to ARM processor's are moved to src/arm + * directory(i.e. src/cortexa53,src/cortexa9 and src/cortexr5 moved to src/arm/cortexa53, + * src/arm/cortexa9 and src/arm/cortexr5 respectively).Files xil_printf.c,xil_printf.h, + * print.c,xil_io.c and xil_io.h are consolidated across all BSPs into common file each and + * consolidated files are kept at src/common directory.Files putnum.c,vectors.c,vectors.h, + * xil_exception.c and xil_exception.h are consolidated across all ARM BSPs + * into common file each and consolidated files are kept at src/arm/common directory. + * GCC source files related to file operations are consolidated and kept + * at src/arm/common/gcc directory. + * All io interfacing functions (i.e. All variants of xil_out, xil_in ) + * are made as static inline and implementation is kept in consolidated common/xil_io.h, + * xil_io.h must be included as a header file to access io interfacing functions. + * Added undefined exception handler for A53 32 bit and R5 processor + * 6.0 mus 08/11/16 Updated xtime_l.c in R5 BSP to remove implementation of XTime_SetTime API, since + * TTC counter value register is read only. + * 6.0 asa 08/15/16 Modified the signatures for functions sleep and usleep. This fixes + * the CR#956899. + * 6.0 mus 08/18/16 Defined ARMA53_32 flag in cortexa53/32bit/xparameters_ps.h and ARMR5 flag + * in cortexr5/xparameters_ps.h + * 6.0 mus 08/18/16 Added support for the the Zynq 7000s devices + * 6.0 mus 08/18/16 Removed unused variables from xil_printf.c and xplatform_info.c + * 6.0 mus 08/19/16 Modified xil_io.h to remove __LITTLE_ENDIAN__ flag check for all ARM processors + * 6.1 mus 11/03/16 Added APIs handle_stdin_parameter and handle_stdout_parameter in standalone tcl. + * ::hsi::utils::handle_stdin and ::hsi::utils::handle_stdout are taken as a base for + * these APIs and modifications are done on top of it to handle stdout/stdin + * parameters for design which doesnt have UART.It fixes CR#953681 + * 6.1 nsk 11/07/16 Added two new files xil_mem.c and xil_mem.h for xil_memcpy + * 6.2 pkp 12/14/16 Updated cortexa53/64bit/translation_table.S for upper ps DDR. The 0x800000000 - + * 0xFFFFFFFFF range is marked normal memory for the DDR size defined in hdf + * and rest of the memory in that 32GB region is marked as reserved to avoid + * any speculative access + * 6.2 pkp 12/23/16 Added support for floating point operation to Cortex-A53 64bit mode. It modified + * asm_vectors.S to implement lazy floating point context saving i.e. floating point + * access is enabled if there is any floating point operation, it is disabled by + * default. Also FPU is initally disabled for IRQ and none of the floating point + * registers are saved during normal context saving. If IRQ handler does not require + * floating point operation, the floating point registers are untouched and no need + * for saving/restoring. If IRQ handler uses any floating point operation, then floating + * point registers are saved and FPU is enabled for IRQ handler. Then floating point + * registers are restored back after servicing IRQ during normal context restoring. + * 6.2 mus 01/01/17 Updated makefiles of R5 and a53 64 bit/32 bit processors to fix error in clean + * target.It fixes the CR#966900 + * 6.2 pkp 01/22/17 Added support for EL1 non-secure execution and Hypervisor Baremetal for Cortex-A53 + * 64bit Mode. If Hypervisor_guest is selected as true in BSP settings, BSP will be built + * for EL1 Non-secure, else BSP will be built for EL3. By default hypervisor_guest is + * as false i.e. default bsp is EL3. + * 6.2 pkp 01/24/17 Updated cortexa53/64bit/boot.S to clear FPUStatus variable to make sure that it + * contains initial status of FPU i.e. disabled. In case of a warm restart execution + * when bss sections are not cleared, it may contain previously updated value which + * does not hold true once processor resumes. This fixes CR#966826. + * 6.2 asa 01/31/17 The existing Xil_DCacheDisable API first flushes the + * D caches and then disables it. The problem with that is, + * potentially there will be a small window after the cache + * flush operation and before the we disable D caches where + * we might have valid data in cache lines. In such a + * scenario disabling the D cache can lead to unknown behavior. + * The ideal solution to this is to use assembly code for + * the complete API and avoid any memory accesses. But with + * that we will end up having a huge amount on assembly code + * which is not maintainable. Changes are done to use a mix + * of assembly and C code. All local variables are put in + * registers. Also function calls are avoided in the API to + * avoid using stack memory. + * 6.2 mus 02/13/17 A53 CPU cache system can pre-fetch catch lines.So there are + * scenarios when an invalidated cache line can get pre fetched to cache. + * If that happens, the coherency between cache and memory is lost + * resulting in lost data. To avoid this kind of issue either + * user has to use dsb() or disable pre-fetching for L1 cache + * or else reduce maximum number of outstanding data prefetches allowed. + * Using dsb() while comparing data costing more performance compared to + * disabling pre-fetching/reducing maximum number of outstanding data + * prefetches for L1 Cache.The new api Xil_ConfigureL1Prefetch is added + * to disable pre-fetching/configure maximum number of outstanding data + * prefetches allowed in L1 cache system.This fixes CR#967864. + * 6.2 pkp 02/16/17 Added xil_smc.c file to provide a C wrapper for smc calling which can be + * used by cortex-A53 64bit EL1 Non-secure application. + * 6.2 kvn 03/03/17 Added support thumb mode + * 6.2 mus 03/13/17 Fixed MISRA C mandatory standard violations in ARM cortexr5 and cortexa53 BSP. + * It fixes CR#970543 + * 6.2 asa 03/16/17 Fix for CR#970859. For Mcroblaze BSP, when we enable intrusive + * profiling we see a crash. That is because the the tcl uses invalid + * HSI command. This change fixes it. + * 6.2 mus 03/22/17 Updated standalone tcl to generate xparameter XPAR_FPD_IS_CACHE_COHERENT, if + * any FPD peripheral is configured to use CCI.It fixes CR#972638 + * 6.3 mus 03/20/17 Updated cortex-r5 BSP, to add hard floating point support. + * 6.3 mus 04/17/17 Updated Cortex-a53 32 bit BSP boot code to fix bug in + * the HW coherency enablement. It fixes the CR#973287 + * 6.3 mus 04/20/17 Updated Cortex-A53 64 bit BSP boot code, to remove redundant write to the + * L2CTLR_EL1 register. It fixes the CR#974698 + * 6.4 mus 06/08/17 Updated arm/common/xil_exception.c to fix warnings in C level exception handlers + * of ARM 32 bit processor's. + * 6.4 mus 06/14/17 Updated cortexa53/64bit/gcc/asm_vectors.S to fix bug in IRQInterruptHandler code + * snippet, which checks for the FPEN bit of CPACR_EL1 register. + * 6.4 ms 05/23/17 Added PSU_PMU macro in xplatform_info.c, xparameters.h to support + * XGetPSVersion_Info function for PMUFW. + * ms 06/13/17 Added PSU_PMU macro in xplatform_info.c to support XGetPlatform_Info + * function for PMUFW. + * 6.4 mus 07/05/17 Updated Xil_In32BE function in xil_io.h to fix bug.It fixes CR#979740. + * 6.4 mus 07/25/17 Updated a53 32 bit boot code and vectors to support hard floating point + * operations.Now,VFP is being enabled in FPEXC register, through boot code + * and FPU registers are being saved/restored when irq/fiq vector is invoked. + * 6.4 adk 08/01/17 Updated standalone tcl to generate xparameter XPAR_PL_IS_CACHE_COHERENT, + * if h/w design configured with HPC port. + * 6.4 mus 08/10/17 Updated a53 64 bit translation table to mark memory as a outer shareable for + * EL1 NS execution. This change has been done to support CCI enabled IP's. + * 6.4 mus 08/11/17 Updated a53 64 bit boot code to implement ARM erratum 855873.This fixes + * CR#982209. + * 6.4 asa 08/16/17 Made several changes in the R5 MPU handling logic. Added new APIs to + * make RPU MPU handling user-friendly. This also fixes the CR-981028. + * 6.4 mus 08/17/17 Updated XGet_Zynq_UltraMp_Platform_info and XGetPSVersion_Info APIs to read + * version register through SMC call, over EL1 NS mode. This change has been done to + * support these APIs over EL1 NS mode. + * 6.5 mus 10/20/17 Updated standalone.tcl to fix bug in mb_can_handle_exceptions_in_delay_slots proc, + * it fixes CR#987464. + * 6.6 mus 12/07/17 Updated cortexa9/xil_errata.h and cortexa9/xil_cache.c to remove Errata 753970. + * It fixes CR#989132. + * srm 10/18/17 Updated all the sleep routines in a9,a53,R5,microblaze. Now the sleep routines + * will use the timer specified by the user to provide delay. A9 and A53 can use + * Global timer or TTC. R5 can use TTC or the machine cycles. Microblaze can use + * machine cycles or Axi timer. Updated standalone.tcl and standalone.mld files + * to support the sleep configuration Added new API's for the Axi timer in + * microblaze and TTC in ARM. Added two new files, xil_sleeptimer.c and + * xil_sleeptimer.h in ARM for the common sleep routines and 1 new file, + * xil_sleepcommon.c in Standalone-common for sleep/usleep API's. + * 6.6 hk 12/15/17 Export platform macros to bspconfig.h based on the processor. + * 6.6 asa 1/16/18 Ensure C stack information for A9 are flushed out from L1 D cache + * or L2 cache only when the respective caches are enabled. This fixes CR-922023. + * 6.6 mus 01/19/18 Updated asm_vectors.S and boot.S in Cortexa53 64 bit BSP, to add isb + * after writing to cpacr_el1/cptr_el3 registers. It would ensure + * disabling/enabling of floating-point unit, before any subsequent + * instruction. + * 6.6 mus 01/30/18 Updated hypervisor enabled Cortexa53 64 bit BSP, to add xen PV console + * support. Now, xil_printf would use PV console instead of UART in case of + * hypervisor enabled BSP. + * 6.6 mus 02/02/18 Updated get_connected_if proc in standalone tcl to detect the HPC port + * configured with smart interconnect.It fixes CR#990318. + * 6.6 srm 02/10/18 Updated csu_wdt interrupt to the correct value. Fixes CR#992229 + * 6.6 asa 02/12/18 Fix for heap handling for ARM platforms. CR#993932. + * 6.6 mus 02/19/18 Updated standalone.tcl to fix bug in handle_profile_opbtimer proc, + * CR#995014. + * 6.6 mus 02/23/18 Presently Cortex R5 BSP boot code is disabling the debug logic in +* non-JTAG boot mode, when processor is in lockstep configuration. +* This behavior is restricting application debugging in non-JTAG boot +* mode. To get rid of this restriction, added new mld parameter +* "lockstep_mode_debug", to enable/disable debug logic from BSP +* settings. Now, debug logic can be enabled through BSP settings, +* by modifying value of parameter "lockstep_mode_debug" as "true". +* It fixes CR#993896. + * 6.6.mus 02/27/18 Updated Xil_DCacheInvalidateRange and +* Xil_ICacheInvalidateRange APIs in Cortexa53 64 bit BSP, to fix bug +* in handling upper DDR addresses.It fixes CR#995581. +* 6.6 mus 03/12/18 Updated makefile of Cortexa53 32bit BSP to add includes_ps directory +* in the list of include paths. This change allows applications/BSP +* files to include .h files in include_ps directory. +* 6.6 mus 03/16/18 By default CPUACTLR_EL1 is accessible only from EL3, it +* results into abort if accessed from EL1 non secure privilege +* level. Updated Xil_ConfigureL1Prefetch function in Cortexa53 64 bit BSP +* to avoid CPUACTLR_EL1 access from privile levels other than EL3. +* 6.6 mus 03/16/18 Updated hypervisor enabled BSP to use PV console, based on the +* XEN_USE_PV_CONSOLE flag. By deafault hypervisor enabled BSP would +* use UART console, PV console can be enabled by appending + "-DXEN_USE_PV_CONSOLE" to the BSP extra compiler flags. + * +* 6.7 mus 04/27/18 Removed __ARM_NEON__ flag definition. Now, saving/restoring of of HW +* floating point register would be done through newly introduced flag +* FPU_HARD_FLOAT_ABI_ENABLED. This new flag will be configured based on +* the -mfpu-abi option in extra compiler flags.. This change has +* been done to avoid saving/restoring of HW floating point registers, +* when BSP is not compiled with HW floating point configuration. +* 6.7 asa 04/26/18 Added API Xil_GetExceptionRegisterHandler for obtaining information +* on an already registered exception vector. +* 6.7 asa 05/18/18 Fixed bugss in the API Xil_GetExceptionRegisterHandler. +* + *****************************************************************************************/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/close.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/close.c new file mode 100644 index 0000000..dbbe0d4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/close.c @@ -0,0 +1,49 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +#ifndef UNDEFINE_FILE_OPS +#include "xil_types.h" +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) s32 _close(s32 fd); +} +#endif + +/* + * close -- We don't need to do anything, but pretend we did. + */ + +__attribute__((weak)) s32 _close(s32 fd) +{ + (void)fd; + return (0); +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/errno.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/errno.c new file mode 100644 index 0000000..df0218e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/errno.c @@ -0,0 +1,51 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/* 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 +#include +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) sint32 * __errno (void); +} +#endif + +__attribute__((weak)) sint32 * +__errno (void) +{ + return &_REENT->_errno; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/fcntl.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/fcntl.c new file mode 100644 index 0000000..e58221a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/fcntl.c @@ -0,0 +1,46 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include +#include "xil_types.h" + +/* + * fcntl -- Manipulate a file descriptor. + * We don't have a filesystem, so we do nothing. + */ +__attribute__((weak)) sint32 fcntl (sint32 fd, sint32 cmd, long arg) +{ + (void)fd; + (void)cmd; + (void)arg; + return 0; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/fstat.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/fstat.c new file mode 100644 index 0000000..c5a31f3 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/fstat.c @@ -0,0 +1,50 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) s32 _fstat(s32 fd, struct stat *buf); +} +#endif +/* + * fstat -- Since we have no file system, we just return an error. + */ +__attribute__((weak)) s32 _fstat(s32 fd, struct stat *buf) +{ + (void)fd; + buf->st_mode = S_IFCHR; /* Always pretend to be a tty */ + + return (0); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/getpid.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/getpid.c new file mode 100644 index 0000000..d02df5c --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/getpid.c @@ -0,0 +1,51 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include "xil_types.h" +/* + * getpid -- only one process, so just return 1. + */ +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) s32 _getpid(void); +} +#endif + +__attribute__((weak)) s32 getpid(void) +{ + return 1; +} + +__attribute__((weak)) s32 _getpid(void) +{ + return 1; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/inbyte.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/inbyte.c new file mode 100644 index 0000000..a5a6448 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/isatty.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/isatty.c new file mode 100644 index 0000000..f142515 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/isatty.c @@ -0,0 +1,56 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +#include +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) sint32 _isatty(sint32 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. + */ +__attribute__((weak)) sint32 isatty(sint32 fd) +{ + (void)fd; + return (1); +} + +__attribute__((weak)) sint32 _isatty(sint32 fd) +{ + (void)fd; + return (1); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/kill.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/kill.c new file mode 100644 index 0000000..fc2f89d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/kill.c @@ -0,0 +1,60 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +#include +#include +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) int _kill(pid_t pid, int sig); +} +#endif + +/* + * kill -- go out via exit... + */ + +__attribute__((weak)) int kill(pid_t pid, int sig) +{ + if(pid == 1) { + _exit(sig); + } + return 0; +} + +__attribute__((weak)) int _kill(pid_t pid, int sig) +{ + if(pid == 1) { + _exit(sig); + } + return 0; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/lseek.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/lseek.c new file mode 100644 index 0000000..106c45c --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/lseek.c @@ -0,0 +1,61 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include +#include +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) off_t _lseek(s32 fd, off_t offset, s32 whence); +} +#endif +/* + * lseek -- Since a serial port is non-seekable, we return an error. + */ +__attribute__((weak)) off_t lseek(s32 fd, off_t offset, s32 whence) +{ + (void)fd; + (void)offset; + (void)whence; + errno = ESPIPE; + return ((off_t)-1); +} + +__attribute__((weak)) off_t _lseek(s32 fd, off_t offset, s32 whence) +{ + (void)fd; + (void)offset; + (void)whence; + errno = ESPIPE; + return ((off_t)-1); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/open.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/open.c new file mode 100644 index 0000000..85e9ce4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/open.c @@ -0,0 +1,53 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +#ifndef UNDEFINE_FILE_OPS +#include +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) s32 open(char8 *buf, s32 flags, s32 mode); +} +#endif +/* + * open -- open a file descriptor. We don't have a filesystem, so + * we return an error. + */ +__attribute__((weak)) s32 open(char8 *buf, s32 flags, s32 mode) +{ + (void)buf; + (void)flags; + (void)mode; + errno = EIO; + return (-1); +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/outbyte.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/outbyte.c new file mode 100644 index 0000000..3c64308 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/print.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/print.c new file mode 100644 index 0000000..da7e768 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/print.c @@ -0,0 +1,36 @@ +/* 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 char8 *ptr) +{ +#if HYP_GUEST && EL1_NONSECURE && XEN_USE_PV_CONSOLE + XPVXenConsole_Write(ptr); +#else +#ifdef STDOUT_BASEADDRESS + while (*ptr != (char8)0) { + outbyte (*ptr); + ptr++; + } +#else +(void)ptr; +#endif +#endif +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_clean.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_clean.c new file mode 100644 index 0000000..1d8aada --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_clean.c @@ -0,0 +1,47 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include "profile.h" +#include "_profile_timer_hw.h" +#include "xil_exception.h" + +void _profile_clean( void ); + +/* + * 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_init.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_init.c new file mode 100644 index 0000000..0ac51b1 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_init.c @@ -0,0 +1,90 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +****************************************************************************** +* +* _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 s32 microblaze_init(void); + +#elif defined PROC_PPC + +extern s32 powerpc405_init(void); + +#else + +extern s32 cortexa9_init(void); + +#endif + +s32 profile_version = 1; /* Version of S/W Intrusive Profiling library */ + +u32 binsize = (u32)BINSIZE; /* Histogram Bin Size */ +u32 cpu_clk_freq = (u32)CPU_FREQ_HZ ; /* CPU Clock Frequency */ +u32 sample_freq_hz = (u32)SAMPLE_FREQ_HZ ; /* Histogram Sampling Frequency */ +u32 timer_clk_ticks = (u32)TIMER_CLK_TICKS ;/* Timer Clock Ticks for the Timer */ + +/* Structure for Storing the Profiling Data */ +struct gmonparam *_gmonparam = (struct gmonparam *)(0xffffffffU); +s32 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 + (void)microblaze_init(); +#elif defined PROC_PPC + powerpc405_init(); +#else + (void)cortexa9_init(); +#endif +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_timer_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_timer_hw.c new file mode 100644 index 0000000..e85fb5c --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_timer_hw.c @@ -0,0 +1,387 @@ +/****************************************************************************** +* +* Copyright (C) 2004 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +****************************************************************************** +* +* _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 u32 timer_clk_ticks, */ + +#ifdef PROC_PPC405 +#ifdef PPC_PIT_INTERRUPT +s32 ppc_pit_init( void ); +#endif +s32 powerpc405_init() +#endif /* PROC_CORTEXA9 */ + +#ifdef PROC_PPC440 +#ifdef PPC_PIT_INTERRUPT +s32 ppc_dec_init( void ); +#endif +s32 powerpc405_init(void); +#endif /* PROC_PPC440 */ + +#if (!defined PPC_PIT_INTERRUPT && !defined PROC_CORTEXA9) +s32 opb_timer_init( void ); +#endif + +#ifdef PROC_MICROBLAZE +s32 microblaze_init(void); +#endif /* PROC_MICROBLAZE */ + +#ifdef PROC_CORTEXA9 +s32 scu_timer_init( void ); +s32 cortexa9_init(void); +#endif /* PROC_CORTEXA9 */ + + +/*-------------------------------------------------------------------- + * 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,NULL); + 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 +* +*-------------------------------------------------------------------- */ +s32 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,NULL); + XIntc_RegisterHandler( INTC_BASEADDR, PROFILE_TIMER_INTR_ID, + (XInterruptHandler)profile_intr_handler,NULL); +#else + Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT, + (Xil_ExceptionHandler)profile_intr_handler,NULL); +#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 +s32 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,NULL); + 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 + * + *-------------------------------------------------------------------- */ +s32 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,NULL); + + XIntc_RegisterHandler( INTC_BASEADDR, PROFILE_TIMER_INTR_ID, + (XInterruptHandler)profile_intr_handler,NULL); +#else + Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT, + (Xil_ExceptionHandler)profile_intr_handler,NULL); + Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT, + (Xil_ExceptionHandler)profile_intr_handler,NULL); +#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) +s32 opb_timer_init( void ) +{ + /* set the number of cycles the timer counts before interrupting */ + XTmrCtr_SetLoadReg((u32)PROFILE_TIMER_BASEADDR, (u16)0, (u32)timer_clk_ticks); + + /* reset the timers, and clear interrupts */ + XTmrCtr_SetControlStatusReg((u32)PROFILE_TIMER_BASEADDR, (u16)0, + (u32)XTC_CSR_INT_OCCURED_MASK | (u32)XTC_CSR_LOAD_MASK ); + + /* start the timers */ + XTmrCtr_SetControlStatusReg((u32)PROFILE_TIMER_BASEADDR, (u16)0, (u32)XTC_CSR_ENABLE_TMR_MASK + | (u32)XTC_CSR_ENABLE_INT_MASK | (u32)XTC_CSR_AUTO_RELOAD_MASK | (u32)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. + * + *-------------------------------------------------------------------- */ +s32 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,NULL); +#else + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, + (Xil_ExceptionHandler)profile_intr_handler, + NULL) ; +#endif + + /* Initialize the timer with Timer Ticks */ + (void)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((u32)INTC_BASEADDR ); + XIntc_SetIntrSvcOption( INTC_BASEADDR, XIN_SVC_ALL_ISRS_OPTION); + XIntc_EnableIntr( (u32)INTC_BASEADDR, PROFILE_TIMER_INTR_MASK ); + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, + (Xil_ExceptionHandler)XIntc_DeviceInterruptHandler,NULL); +#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. + * + *-------------------------------------------------------------------- */ +s32 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/2U); + + /* clear any pending interrupts */ + XScuTimer_SetIntrReg(PROFILE_TIMER_BASEADDR, 1U); + + /* 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; +} + +s32 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, + NULL); + + /* + * 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, + NULL); + + /* + * 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 + */ + (void)scu_timer_init() ; + + Xil_ExceptionEnable(); + + return 0; +} + +#endif /* PROC_CORTEXA9 */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_timer_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_timer_hw.h new file mode 100644 index 0000000..2cee66b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/_profile_timer_hw.h @@ -0,0 +1,312 @@ +/****************************************************************************** +* +* Copyright (C) 2004 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +****************************************************************************** +* +* _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(((u32)(BaseAddress) + (u32)XTmrCtr_Offsets[(TmrCtrNumber)] + \ + (u32)(RegOffset)), (u32)(ValueToWrite)) + +#define ProfTimerCtr_mReadReg(BaseAddress, TmrCtrNumber, RegOffset) \ + ProfIo_In32((u32)(BaseAddress) + (u32)XTmrCtr_Offsets[(TmrCtrNumber)] + (u32)(RegOffset)) + +#define ProfTmrCtr_mSetControlStatusReg(BaseAddress, TmrCtrNumber, RegisterValue)\ + ProfTmrCtr_mWriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (RegisterValue)) + +#define ProfTmrCtr_mGetControlStatusReg(BaseAddress, TmrCtrNumber) \ + ProfTimerCtr_mReadReg((u32)(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 u32 timer_clk_ticks ; + +/*-------------------------------------------------------------------- + * PowerPC Target - Timer related functions + *-------------------------------------------------------------------- */ +#ifdef PROC_PPC + +#ifdef PPC_PIT_INTERRUPT +u32 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() \ + { \ + u32 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() \ + { \ + u32 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() \ + { \ + u32 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() \ + { \ + u32 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 = ((u32)PROFILE_TIMER_BASEADDR); \ + Addr += (u32)XTmrCtr_Offsets[(u16)(0)]; \ + Addr += (u32)XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(Addr); \ + tmp_v = tmp_v & (u32)(~XTC_CSR_ENABLE_TMR_MASK); \ + u32 OutAddr = (u32)PROFILE_TIMER_BASEADDR; \ + OutAddr += (u32)XTmrCtr_Offsets[(u16)(0)]; \ + OutAddr += (u32)XTC_TCSR_OFFSET; \ + ProfIo_Out32(OutAddr, (u32)tmp_v); \ + } + + +/* -------------------------------------------------------------------- + * Enable the Timer after Call-Graph Data collection + * + *-------------------------------------------------------------------- */ +#define enable_timer() \ + { \ + u32 Addr = ((u32)PROFILE_TIMER_BASEADDR); \ + Addr += (u32)XTmrCtr_Offsets[(u16)(0)]; \ + Addr += (u32)XTC_TCSR_OFFSET; \ + u32 tmp_v = (u32)ProfIo_In32(Addr); \ + tmp_v = tmp_v | (u32)XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((u32)(PROFILE_TIMER_BASEADDR) + (u32)XTmrCtr_Offsets[(u16)(0)] + (u32)XTC_TCSR_OFFSET, (u32)tmp_v); \ + } + + +/* -------------------------------------------------------------------- + * Send Ack to Timer Interrupt + * + *-------------------------------------------------------------------- */ +#define timer_ack() \ + { \ + u32 csr; \ + csr = ProfTmrCtr_mGetControlStatusReg((u32)PROFILE_TIMER_BASEADDR, (u16)0); \ + ProfTmrCtr_mSetControlStatusReg((u32)PROFILE_TIMER_BASEADDR, (u16)0, (u32)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((u32)PROFILE_TIMER_BASEADDR + (u32)XSCUTIMER_ISR_OFFSET, \ + (u32)XSCUTIMER_ISR_EVENT_FLAG_MASK);\ +} + +/*-------------------------------------------------------------------- */ +#endif /* PROC_CORTEXA9 */ +/*-------------------------------------------------------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/mblaze_nt_types.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/mblaze_nt_types.h new file mode 100644 index 0000000..7096a92 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/mblaze_nt_types.h @@ -0,0 +1,54 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + + +#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; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile.h new file mode 100644 index 0000000..4cb07a7 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile.h @@ -0,0 +1,131 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#ifndef PROFILE_H +#define PROFILE_H 1 + +#include +#include "xil_types.h" +#include "profile_config.h" + +#ifdef PROC_MICROBLAZE +#include "mblaze_nt_types.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +void _system_init( void ) ; +void _system_clean( void ) ; +void mcount(u32 frompc, u32 selfpc); +void profile_intr_handler( void ) ; +void _profile_init( 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 u16 + +struct tostruct { + u32 selfpc; + s32 count; + s16 link; + u16 pad; +}; + +struct fromstruct { + u32 frompc ; + s16 link ; + u16 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 { + s32 state; + + /* Histogram Information */ + u16 *kcount; /* No. of bins in histogram */ + u32 kcountsize; /* Histogram samples */ + + /* Call-graph Information */ + struct fromstruct *froms; + u32 fromssize; + struct tostruct *tos; + u32 tossize; + + /* Initialization I/Ps */ + u32 lowpc; + u32 highpc; + u32 textsize; + /* u32 cg_froms, */ + /* u32 cg_tos, */ +}; +extern struct gmonparam *_gmonparam; +extern s32 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_cg.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_cg.c new file mode 100644 index 0000000..2539ce6 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_cg.c @@ -0,0 +1,171 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include "profile.h" +#include "_profile_timer_hw.h" +#ifdef PROC_MICROBLAZE +#include "mblaze_nt_types.h" +#endif + +/* + * The mcount fucntion is excluded from the library, if the user defines + * PROFILE_NO_GRAPH. + */ +#ifndef PROFILE_NO_GRAPH + +#include +#include +#include + +#ifdef PROFILE_NO_FUNCPTR +s32 searchpc(const struct fromto_struct *cgtable, s32 cgtable_size, u32 frompc ); +#else +s32 searchpc(const struct fromstruct *froms, s32 fromssize, u32 frompc ); +#endif + +/*extern struct gmonparam *_gmonparam, */ + +#ifdef PROFILE_NO_FUNCPTR +s32 searchpc(const struct fromto_struct *cgtable, s32 cgtable_size, u32 frompc ) +{ + s32 index = 0 ; + + while( (index < cgtable_size) && (cgtable[index].frompc != frompc) ){ + index++ ; + } + if( index == cgtable_size ) { + return -1 ; + } else { + return index ; + } +} +#else +s32 searchpc(const struct fromstruct *froms, s32 fromssize, u32 frompc ) +{ + s32 index = 0 ; + s32 Status; + + while( (index < fromssize) && (froms[index].frompc != frompc) ){ + index++ ; + } + if( index == fromssize ) { + Status = -1 ; + } else { + Status = index ; + } + return Status; +} +#endif /* PROFILE_NO_FUNCPTR */ + + +void mcount( u32 frompc, u32 selfpc ) +{ + register struct gmonparam *p = NULL; + register s32 toindex, fromindex; + s32 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 = (s32)searchpc( p->froms, ((s32)p->fromssize), frompc ) ; + if( fromindex == -1 ) { + fromindex = (s32)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 = ((s32)(p->froms[fromindex].link)); + while(toindex != -1) { + toindex = (((s32)p->tossize) - toindex)-1 ; + if( p->tos[toindex].selfpc == selfpc ) { + p->tos[toindex].count++ ; + goto done ; + } + toindex = ((s32)(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 = ((s32)(p->tossize))-((s32)1); +#endif + + done: + p->state = GMON_PROF_ON; + goto enable_timer_label ; + /* overflow: */ + /*p->state = GMON_PROF_ERROR */ + enable_timer_label: + enable_timer(); + return ; +} + + +#endif /* PROFILE_NO_GRAPH */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_config.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_config.h new file mode 100644 index 0000000..550c60b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_config.h @@ -0,0 +1,48 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + + +#ifndef _PROFILE_CONFIG_H +#define _PROFILE_CONFIG_H + +#define BINSIZE 4U +#define SAMPLE_FREQ_HZ 100000U +#define TIMER_CLK_TICKS 1000U + +#define PROFILE_NO_FUNCPTR_FLAG 0 + +#define PROFILE_TIMER_BASEADDR 0x00608000U +#define PROFILE_TIMER_INTR_ID 0U + +#define TIMER_CONNECT_INTC + +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_hist.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_hist.c new file mode 100644 index 0000000..c8ee9ce --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/profile/profile_hist.c @@ -0,0 +1,71 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include "profile.h" +#include "_profile_timer_hw.h" + +#ifdef PROC_MICROBLAZE +#include "mblaze_nt_types.h" +#endif + +#ifdef PROC_PPC +#include "xpseudo_asm.h" +#define SPR_SRR0 0x01A +#endif + +#include "xil_types.h" + +extern u32 binsize ; +u32 prof_pc ; + +void profile_intr_handler( void ) +{ + + s32 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 >= ((u32)_gmonparam[j].lowpc)) && (prof_pc < ((u32)_gmonparam[j].highpc))) { + _gmonparam[j].kcount[(prof_pc-_gmonparam[j].lowpc)/((u32)4 * binsize)]++; + break; + } + } + /* Ack the Timer Interrupt */ + timer_ack(); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/putnum.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/putnum.c new file mode 100644 index 0000000..aaf9ede --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/putnum.c @@ -0,0 +1,59 @@ +/* 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 + */ + +/***************************** Include Files *********************************/ +#include "xil_types.h" + +/************************** Function Prototypes ******************************/ +extern void print (const char8 *ptr); +void putnum(u32 num); + +void putnum(u32 num) +{ + char8 buf[9]; + s32 cnt; + s32 i; + char8 *ptr; + u32 digit; + for(i = 0; i<9; i++) { + buf[i] = '0'; + } + + ptr = buf; + for (cnt = 7 ; cnt >= 0 ; cnt--) { + digit = (num >> (cnt * 4U)) & 0x0000000fU; + + if ((digit <= 9U) && (ptr != NULL)) { + digit += (u32)'0'; + *ptr = ((char8) digit); + ptr += 1; + } else if (ptr != NULL) { + digit += ((u32)'a' - (u32)10); + *ptr = ((char8)digit); + ptr += 1; + } else { + /*Made for MisraC Compliance*/; + } + } + + if(ptr != NULL) { + *ptr = (char8) 0; + } + print (buf); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/read.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/read.c new file mode 100644 index 0000000..7f7b7d2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/read.c @@ -0,0 +1,104 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/* read.c -- read bytes from a input device. + */ +#ifndef UNDEFINE_FILE_OPS +#include "xil_printf.h" +#include "xparameters.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) s32 _read (s32 fd, char8* buf, s32 nbytes); +} +#endif + +/* + * read -- read bytes from the serial port. Ignore fd, since + * we only have stdin. + */ +__attribute__((weak)) s32 +read (s32 fd, char8* buf, s32 nbytes) +{ +#ifdef STDIN_BASEADDRESS + s32 i; + s32 numbytes = 0; + char8* LocalBuf = buf; + + (void)fd; + if(LocalBuf != NULL) { + for (i = 0; i < nbytes; i++) { + numbytes++; + *(LocalBuf + i) = inbyte(); + if ((*(LocalBuf + i) == '\n' )|| (*(LocalBuf + i) == '\r')) { + break; + } + } + } + + return numbytes; +#else + (void)fd; + (void)buf; + (void)nbytes; + return 0; +#endif +} + +__attribute__((weak)) s32 +_read (s32 fd, char8* buf, s32 nbytes) +{ +#ifdef STDIN_BASEADDRESS + s32 i; + s32 numbytes = 0; + char8* LocalBuf = buf; + + (void)fd; + if(LocalBuf != NULL) { + for (i = 0; i < nbytes; i++) { + numbytes++; + *(LocalBuf + i) = inbyte(); + if ((*(LocalBuf + i) == '\n' )|| (*(LocalBuf + i) == '\r')) { + break; + } + } + } + + return numbytes; +#else + (void)fd; + (void)buf; + (void)nbytes; + return 0; +#endif +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sbrk.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sbrk.c new file mode 100644 index 0000000..87a753d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sbrk.c @@ -0,0 +1,61 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include +#include "xil_types.h" +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) char8 *sbrk (s32 nbytes); +} +#endif + +extern u8 _heap_start[]; +extern u8 _heap_end[]; +extern char8 HeapBase[]; +extern char8 HeapLimit[]; + + + +__attribute__((weak)) char8 *sbrk (s32 nbytes) +{ + char8 *base; + static char8 *heap_ptr = HeapBase; + + base = heap_ptr; + if((heap_ptr != NULL) && (heap_ptr + nbytes <= (char8 *)&HeapLimit + 1)) { + heap_ptr += nbytes; + return base; + } else { + errno = ENOMEM; + return ((char8 *)-1); + } +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sleep.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sleep.c new file mode 100644 index 0000000..f85743b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sleep.c @@ -0,0 +1,92 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/***************************************************************************** +* +* @file sleep.c +* +* This function provides a second delay using the Global Timer register in +* the ARM Cortex A9 MP core. +* +*
    +* 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
    +* 6.0   asa      08/15/16 Updated the sleep signature. Fix for CR#956899.
    +* 6.6	srm      10/18/17 Updated sleep routines to support user configurable
    +*			  implementation. Now sleep routines will use Timer
    +*                         specified by the user (i.e. Global timer/TTC timer)
    +*
    +* 
    +* +******************************************************************************/ +/***************************** Include Files *********************************/ + +#include "sleep.h" +#include "xtime_l.h" +#include "xparameters.h" + +#if defined (SLEEP_TIMER_BASEADDR) +#include "xil_sleeptimer.h" +#endif + +/*****************************************************************************/ +/* +* +* This API is used to provide delays in seconds +* +* @param seconds requested +* +* @return 0 always +* +* @note None. +* +****************************************************************************/ +unsigned sleep_A9(unsigned int seconds) +{ +#if defined (SLEEP_TIMER_BASEADDR) + Xil_SleepTTCCommon(seconds, COUNTS_PER_SECOND); +#else + XTime tEnd, tCur; + + XTime_GetTime(&tCur); + tEnd = tCur + (((XTime) seconds) * COUNTS_PER_SECOND); + do + { + XTime_GetTime(&tCur); + } while (tCur < tEnd); +#endif + + return 0; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sleep.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sleep.h new file mode 100644 index 0000000..f53b2d8 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/sleep.h @@ -0,0 +1,119 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/*****************************************************************************/ +/** +* @file sleep.h +* +* This header file contains ARM Cortex A53,A9,R5,Microblaze specific sleep +* related APIs. +* +*
    +* MODIFICATION HISTORY :
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 6.6   srm  11/02/17 Added processor specific sleep rountines
    +*								 function prototypes.
    +*
    +* 
    +* +******************************************************************************/ + +#ifndef SLEEP_H +#define SLEEP_H + +#include "xil_types.h" +#include "xil_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*****************************************************************************/ +/** +* +* This macro polls an address periodically until a condition is met or till the +* timeout occurs. +* The minimum timeout for calling this macro is 100us. If the timeout is less +* than 100us, it still waits for 100us. Also the unit for the timeout is 100us. +* If the timeout is not a multiple of 100us, it waits for a timeout of +* the next usec value which is a multiple of 100us. +* +* @param IO_func - accessor function to read the register contents. +* Depends on the register width. +* @param ADDR - Address to be polled +* @param VALUE - variable to read the value +* @param COND - Condition to checked (usually involves VALUE) +* @param TIMEOUT_US - timeout in micro seconds +* +* @return 0 - when the condition is met +* -1 - when the condition is not met till the timeout period +* +* @note none +* +*****************************************************************************/ +#define Xil_poll_timeout(IO_func, ADDR, VALUE, COND, TIMEOUT_US) \ + ( { \ + u64 timeout = TIMEOUT_US/100; \ + if(TIMEOUT_US%100!=0) \ + timeout++; \ + for(;;) { \ + VALUE = IO_func(ADDR); \ + if(COND) \ + break; \ + else { \ + usleep(100); \ + timeout--; \ + if(timeout==0) \ + break; \ + } \ + } \ + (timeout>0) ? 0 : -1; \ + } ) + +void usleep(unsigned long useconds); +void sleep(unsigned int seconds); +int usleep_R5(unsigned long useconds); +unsigned sleep_R5(unsigned int seconds); +int usleep_MB(unsigned long useconds); +unsigned sleep_MB(unsigned int seconds); +int usleep_A53(unsigned long useconds); +unsigned sleep_A53(unsigned int seconds); +int usleep_A9(unsigned long useconds); +unsigned sleep_A9(unsigned int seconds); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/smc.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/smc.h new file mode 100644 index 0000000..5a4d336 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/smc.h @@ -0,0 +1,114 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file smc.h +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- ---------------------------------------------------
    +* 1.00a sdm  11/03/09 Initial release.
    +* 4.2	pkp	 08/04/14 Removed function definition of XSmc_NorInit and XSmc_NorInit
    +*					  as smc.c is removed
    +* 
    +* +* @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 0x000U /* Controller status reg, RO */ +#define XSMCPSS_MC_INTERFACE_CONFIG 0x004U /* Interface config reg, RO */ +#define XSMCPSS_MC_SET_CONFIG 0x008U /* Set configuration reg, WO */ +#define XSMCPSS_MC_CLR_CONFIG 0x00CU /* Clear config reg, WO */ +#define XSMCPSS_MC_DIRECT_CMD 0x010U /* Direct command reg, WO */ +#define XSMCPSS_MC_SET_CYCLES 0x014U /* Set cycles register, WO */ +#define XSMCPSS_MC_SET_OPMODE 0x018U /* Set opmode register, WO */ +#define XSMCPSS_MC_REFRESH_PERIOD_0 0x020U /* Refresh period_0 reg, RW */ +#define XSMCPSS_MC_REFRESH_PERIOD_1 0x024U /* Refresh period_1 reg, RW */ + +/* Chip select configuration register offset */ +#define XSMCPSS_CS_IF0_CHIP_0_OFFSET 0x100U /* Interface 0 chip 0 config */ +#define XSMCPSS_CS_IF0_CHIP_1_OFFSET 0x120U /* Interface 0 chip 1 config */ +#define XSMCPSS_CS_IF0_CHIP_2_OFFSET 0x140U /* Interface 0 chip 2 config */ +#define XSMCPSS_CS_IF0_CHIP_3_OFFSET 0x160U /* Interface 0 chip 3 config */ +#define XSMCPSS_CS_IF1_CHIP_0_OFFSET 0x180U /* Interface 1 chip 0 config */ +#define XSMCPSS_CS_IF1_CHIP_1_OFFSET 0x1A0U /* Interface 1 chip 1 config */ +#define XSMCPSS_CS_IF1_CHIP_2_OFFSET 0x1C0U /* Interface 1 chip 2 config */ +#define XSMCPSS_CS_IF1_CHIP_3_OFFSET 0x1E0U /* Interface 1 chip 3 config */ + +/* User configuration register offset */ +#define XSMCPSS_UC_STATUS_OFFSET 0x200U /* User status reg, RO */ +#define XSMCPSS_UC_CONFIG_OFFSET 0x204U /* User config reg, WO */ + +/* Integration test register offset */ +#define XSMCPSS_IT_OFFSET 0xE00U + +/* ID configuration register offset */ +#define XSMCPSS_ID_PERIP_0_OFFSET 0xFE0U +#define XSMCPSS_ID_PERIP_1_OFFSET 0xFE4U +#define XSMCPSS_ID_PERIP_2_OFFSET 0xFE8U +#define XSMCPSS_ID_PERIP_3_OFFSET 0xFECU +#define XSMCPSS_ID_PCELL_0_OFFSET 0xFF0U +#define XSMCPSS_ID_PCELL_1_OFFSET 0xFF4U +#define XSMCPSS_ID_PCELL_2_OFFSET 0xFF8U +#define XSMCPSS_ID_PCELL_3_OFFSET 0xFFCU + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SMC_H */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/unlink.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/unlink.c new file mode 100644 index 0000000..d0cc680 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/unlink.c @@ -0,0 +1,50 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +#include +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) sint32 unlink(char8 *path); +} +#endif +/* + * unlink -- since we have no file system, + * we just return an error. + */ +__attribute__((weak)) sint32 unlink(char8 *path) +{ + (void) path; + errno = EIO; + return (-1); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/usleep.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/usleep.c new file mode 100644 index 0000000..65eea28 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/usleep.c @@ -0,0 +1,107 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file usleep.c +* +* This function provides a microsecond delay using the Global Timer register in +* the ARM Cortex A9 MP core. +* +*
    +* 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
    +* 4.2	pkp		 08/04/14 Removed unimplemented nanosleep routine as it is not
    +*						  possible to generate timer in nanosecond due to
    +*						  limited cpu frequency
    +* 6.0   asa      08/15/16 Updated the usleep signature. Fix for CR#956899.
    +* 6.6	srm	 10/18/17 Updated sleep routines to support user configurable
    +*			  implementation. Now sleep routines will use Timer
    +*                         specified by the user (i.e. Global timer/TTC timer)
    +* 
    +* +******************************************************************************/ +/***************************** Include Files *********************************/ + +#include "sleep.h" +#include "xtime_l.h" +#include "xparameters.h" +#include "xil_types.h" +#include "xpseudo_asm.h" +#include "xreg_cortexa9.h" + +#if defined (SLEEP_TIMER_BASEADDR) +#include "xil_sleeptimer.h" +#endif + +/**************************** Constant Definitions ************************/ +#if defined (SLEEP_TIMER_BASEADDR) +#define COUNTS_PER_USECOND (SLEEP_TIMER_FREQUENCY / 1000000) +#else +/* Global Timer is always clocked at half of the CPU frequency */ +#define COUNTS_PER_USECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ / (2U*1000000U)) +#endif + +/*****************************************************************************/ +/** +* +* 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_A9(unsigned long useconds) +{ +#if defined (SLEEP_TIMER_BASEADDR) + Xil_SleepTTCCommon(useconds, COUNTS_PER_USECOND); +#else + XTime tEnd, tCur; + + XTime_GetTime(&tCur); + tEnd = tCur + (((XTime) useconds) * COUNTS_PER_USECOND); + do + { + XTime_GetTime(&tCur); + } while (tCur < tEnd); +#endif + + return 0; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/vectors.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/vectors.c new file mode 100644 index 0000000..0a36163 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/vectors.c @@ -0,0 +1,231 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file vectors.c +* +* This file contains the C level vectors for the ARM Cortex A9 core. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- ---------------------------------------------------
    +* 1.00a ecm  10/20/09 Initial version, moved over from bsp area
    +* 6.0   mus  27/07/16 Consolidated vectors for a53,a9 and r5 processor
    +*                     and added UndefinedException for a53 32 bit and r5
    +*                     processor
    +* 
    +* +* @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); +} + +#if !defined (__aarch64__) +/*****************************************************************************/ +/** +* +* This is the C level wrapper for the Undefined exception called from the +* vectors.s file. +* +* @param None. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void UndefinedException(void) +{ + XExc_VectorTable[XIL_EXCEPTION_ID_UNDEFINED_INT].Handler(XExc_VectorTable[ + XIL_EXCEPTION_ID_UNDEFINED_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); +} +#else + +/*****************************************************************************/ +/** +* +* This is the C level wrapper for the Synchronous Interrupt called from the vectors.s +* file. +* +* @param None. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void SynchronousInterrupt(void) +{ + XExc_VectorTable[XIL_EXCEPTION_ID_SYNC_INT].Handler(XExc_VectorTable[ + XIL_EXCEPTION_ID_SYNC_INT].Data); +} + +/*****************************************************************************/ +/** +* +* This is the C level wrapper for the SError Interrupt called from the +* vectors.s file. +* +* @param None. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void SErrorInterrupt(void) +{ + XExc_VectorTable[XIL_EXCEPTION_ID_SERROR_ABORT_INT].Handler( + XExc_VectorTable[XIL_EXCEPTION_ID_SERROR_ABORT_INT].Data); +} + +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/vectors.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/vectors.h new file mode 100644 index 0000000..bb599b5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/vectors.h @@ -0,0 +1,88 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file vectors.h +* +* This file contains the C level vector prototypes for the ARM Cortex A9 core. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- ---------------------------------------------------
    +* 1.00a ecm  10/20/10 Initial version, moved over from bsp area
    +* 6.0   mus  07/27/16 Consolidated vectors for a9,a53 and r5 processors
    +* 
    +* +* @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); +#if !defined (__aarch64__) +void SWInterrupt(void); +void DataAbortInterrupt(void); +void PrefetchAbortInterrupt(void); +void UndefinedException(void); +#else +void SynchronousInterrupt(void); +void SErrorInterrupt(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/write.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/write.c new file mode 100644 index 0000000..9389f61 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/write.c @@ -0,0 +1,121 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/* write.c -- write bytes to an output device. + */ +#ifndef UNDEFINE_FILE_OPS +#include "xil_printf.h" +#include "xparameters.h" + +#ifdef __cplusplus +extern "C" { + __attribute__((weak)) sint32 _write (sint32 fd, char8* buf, sint32 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. + */ +__attribute__((weak)) sint32 +write (sint32 fd, char8* buf, sint32 nbytes) + +{ +#ifdef STDOUT_BASEADDRESS + s32 i; + char8* LocalBuf = buf; + + (void)fd; + for (i = 0; i < nbytes; i++) { + if(LocalBuf != NULL) { + LocalBuf += i; + } + if(LocalBuf != NULL) { + if (*LocalBuf == '\n') { + outbyte ('\r'); + } + outbyte (*LocalBuf); + } + if(LocalBuf != NULL) { + LocalBuf -= i; + } + } + return (nbytes); +#else + (void)fd; + (void)buf; + (void)nbytes; + return 0; +#endif +} + +__attribute__((weak)) sint32 +_write (sint32 fd, char8* buf, sint32 nbytes) +{ +#if HYP_GUEST && EL1_NONSECURE && XEN_USE_PV_CONSOLE + sint32 length; + + (void)fd; + (void)nbytes; + length = XPVXenConsole_Write(buf); + return length; +#else +#ifdef STDOUT_BASEADDRESS + s32 i; + char8* LocalBuf = buf; + + (void)fd; + for (i = 0; i < nbytes; i++) { + if(LocalBuf != NULL) { + LocalBuf += i; + } + if(LocalBuf != NULL) { + if (*LocalBuf == '\n') { + outbyte ('\r'); + } + outbyte (*LocalBuf); + } + if(LocalBuf != NULL) { + LocalBuf -= i; + } + } + return (nbytes); +#else + (void)fd; + (void)buf; + (void)nbytes; + return 0; +#endif +#endif +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xbasic_types.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xbasic_types.h new file mode 100644 index 0000000..787212c --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xbasic_types.h @@ -0,0 +1,119 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xbasic_types.h +* +* +* @note Dummy File for backwards compatibility +* + +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date   Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a adk   1/31/14  Added in bsp common folder for backward compatibility
    +* 
    +* +******************************************************************************/ + +#ifndef XBASIC_TYPES_H /* prevent circular inclusions */ +#define XBASIC_TYPES_H /* by using protection macros */ + +/** @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 +#endif + +#ifndef TRUE +# define TRUE 1U +#endif + +#ifndef FALSE +# define FALSE 0U +#endif + +#ifndef NULL +#define NULL 0U +#endif + +/* + * Xilinx NULL, TRUE and FALSE legacy support. Deprecated. + * Please use NULL, TRUE and FALSE + */ +#define XNULL NULL +#define XTRUE TRUE +#define XFALSE FALSE + +/* + * This file is deprecated and users + * should use xil_types.h and xil_assert.h\n\r + */ +#warning The xbasics_type.h file is deprecated and users should use xil_types.h and xil_assert. +#warning Please refer the Standalone BSP UG647 for further details + + +#endif /* end of protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xdebug.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xdebug.h new file mode 100644 index 0000000..650946b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xdebug.h @@ -0,0 +1,32 @@ +#ifndef XDEBUG /* prevent circular inclusions */ +#define XDEBUG /* by using protection macros */ + +#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 0x00000001U /* error condition messages */ +#define XDBG_DEBUG_GENERAL 0x00000002U /* general debug messages */ +#define XDBG_DEBUG_ALL 0xFFFFFFFFU /* all debugging data */ + +#define xdbg_current_types (XDBG_DEBUG_GENERAL) + +#define xdbg_stmnt(x) x + +#define xdbg_printf(type, ...) (((type) & xdbg_current_types) ? printf (__VA_ARGS__) : 0) + + +#else /* defined(DEBUG) && !defined(NDEBUG) */ + +#define xdbg_stmnt(x) + +#define xdbg_printf(...) + +#endif /* defined(DEBUG) && !defined(NDEBUG) */ + +#endif /* XDEBUG */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xenv.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xenv.h new file mode 100644 index 0000000..3d97beb --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xenv.h @@ -0,0 +1,187 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00b ch   10/24/02 Added XENV_LINUX
    +* 1.00a rmm  04/17/02 First release
    +* 
    +* +******************************************************************************/ + +#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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xenv_standalone.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xenv_standalone.h new file mode 100644 index 0000000..f186018 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xenv_standalone.h @@ -0,0 +1,368 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @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. +* +*
    +* 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
    +*
    +* 
    +* +* +******************************************************************************/ + +#ifndef XENV_STANDALONE_H +#define XENV_STANDALONE_H + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +/****************************************************************************** + * + * Get the processor dependent includes + * + ******************************************************************************/ + +#include + +#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, (s32) 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 s32 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) + *

    + * 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((s32)(Addr), (s32)(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((s32)(Addr), (s32)(Len)) +#else +# define XCACHE_FLUSH_DCACHE() microblaze_invalidate_dcache() +# define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + microblaze_invalidate_dcache_range((s32)(Addr), (s32)(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((s32)(Addr), (s32)(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((u32)(Addr), (u32)(Len)) + +#define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + XCache_FlushDCacheRange((u32)(Addr), (u32)(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_assert.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_assert.c new file mode 100644 index 0000000..59b3c1c --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_assert.c @@ -0,0 +1,147 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_assert.c +* +* This file contains basic assert related functions for Xilinx software IP. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date   Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a hbm  07/14/09 Initial release
    +* 6.0   kvn  05/31/16 Make Xil_AsserWait a global variable
    +* 
    +* +******************************************************************************/ + +/***************************** 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. + */ +u32 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. + */ +s32 Xil_AssertWait = 1; + +/* The callback function to be invoked when an assert is taken */ +static Xil_AssertCallback Xil_AssertCallbackRoutine = NULL; + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* +* @brief 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: filename of the source +* @param line: linenumber within File +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void Xil_Assert(const char8 *File, s32 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 != 0) { + } +} + +/*****************************************************************************/ +/** +* +* @brief Set up a callback function to be invoked when an assert occurs. +* If a callback is already installed, then it will be replaced. +* +* @param routine: 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; +} + +/*****************************************************************************/ +/** +* +* @brief 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: arbitrary void pointer and not used. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XNullHandler(void *NullParameter) +{ + (void) NullParameter; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_assert.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_assert.h new file mode 100644 index 0000000..add4124 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_assert.h @@ -0,0 +1,195 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_assert.h +* +* @addtogroup common_assert_apis Assert APIs and Macros +* +* The xil_assert.h file contains assert related functions and macros. +* Assert APIs/Macros specifies that a application program satisfies certain +* conditions at particular points in its execution. These function can be +* used by application programs to ensure that, application code is satisfying +* certain conditions. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date   Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a hbm  07/14/09 First release
    +* 6.0   kvn  05/31/16 Make Xil_AsserWait a global variable
    +* 
    +* +******************************************************************************/ + +#ifndef XIL_ASSERT_H /* prevent circular inclusions */ +#define XIL_ASSERT_H /* by using protection macros */ + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ + + +/************************** Constant Definitions *****************************/ + +#define XIL_ASSERT_NONE 0U +#define XIL_ASSERT_OCCURRED 1U +#define XNULL NULL + +extern u32 Xil_AssertStatus; +extern s32 Xil_AssertWait; +extern void Xil_Assert(const char8 *File, s32 Line); +void XNullHandler(void *NullParameter); + +/** + * 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 char8 *File, s32 Line); + +/***************** Macros (Inline Functions) Definitions *********************/ + +#ifndef NDEBUG + +/*****************************************************************************/ +/** +* @brief This assert macro is to be used for void functions. 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: expression to be evaluated. 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. +* +******************************************************************************/ +#define Xil_AssertVoid(Expression) \ +{ \ + if (Expression) { \ + Xil_AssertStatus = XIL_ASSERT_NONE; \ + } else { \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return; \ + } \ +} + +/*****************************************************************************/ +/** +* @brief 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: expression to be evaluated. 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. +* +******************************************************************************/ +#define Xil_AssertNonvoid(Expression) \ +{ \ + if (Expression) { \ + Xil_AssertStatus = XIL_ASSERT_NONE; \ + } else { \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return 0; \ + } \ +} + +/*****************************************************************************/ +/** +* @brief Always assert. This assert macro is to be used for void functions. +* 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. +* +******************************************************************************/ +#define Xil_AssertVoidAlways() \ +{ \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return; \ +} + +/*****************************************************************************/ +/** +* @brief 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. +* +******************************************************************************/ +#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 */ +/** +* @} End of "addtogroup common_assert_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache.c new file mode 100644 index 0000000..259c3b1 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache.c @@ -0,0 +1,1641 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache.c +* +* Contains required functions for the ARM cache functionality. +* +*
    +* 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.
    +* 4.00	 pkp 24/01/14 Modified Xil_DCacheInvalidateRange to fix the bug. Few
    +*			 		  cache lines were missed to invalidate when unaligned address
    +*			 		  invalidation was accommodated. That fixes CR #766768.
    +*			 		  Also in Xil_L1DCacheInvalidate, while invalidating all L1D cache
    +*			 		  stack memory which contains return address was invalidated. So
    +*			 		  stack memory was flushed first and then L1D cache is invalidated.
    +*			 		  This is done to fix CR #763829
    +* 4.01   asa 05/09/14 Made changes in cortexa9/xil_cache.c to fix CR# 798230.
    +* 4.02	 pkp 06/27/14 Added notes to Xil_L1DCacheInvalidateRange function for
    +*					  explanation of CR#785243
    +* 5.00   kvn 12/15/14 Xil_L2CacheInvalidate was modified to fix CR# 838835. L2 Cache
    +*					  has stack memory which has return address. Before invalidating
    +*					  cache, stack memory was flushed first and L2 Cache is invalidated.
    +* 5.01	 pkp 05/12/15 Xil_DCacheInvalidateRange and Xil_DCacheFlushRange is modified
    +*					  to remove unnecessary dsb in the APIs. Instead of using dsb
    +*					  for L2 Cache, L2CacheSync has been used for each L2 cache line
    +*					  and single dsb has been used for L1 cache. Also L2CacheSync is
    +*					  added into Xil_L2CacheInvalidateRange API. Xil_L1DCacheInvalidate
    +*					  and Xil_L2CacheInvalidate APIs are modified to flush the complete
    +*					  stack instead of just System Stack
    +* 5.03	 pkp 10/07/15 L2 Cache functionalities are avoided for the OpenAMP slave
    +*					  application(when USE_AMP flag is defined for BSP) as master CPU
    +*					  would be utilizing L2 cache for its operation
    +* 6.6    mus 12/07/17 Errata 753970 is not applicable for the PL130 cache controller
    +*                     version r0p2, which is present in zynq. So,removed the handling
    +*                     related to same.It fixes CR#989132.
    +* 6.6    asa 16/01/18 Changes made in Xil_L1DCacheInvalidate and Xil_L2CacheInvalidate
    +*					  routines to ensure the stack data flushed only when the respective
    +*					  caches are enabled. This fixes CR-992023.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** 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 ******************************/ + +/************************** Variable Definitions *****************************/ + +#define IRQ_FIQ_MASK 0xC0U /* Mask IRQ and FIQ interrupts in cpsr */ + +#ifdef __GNUC__ + extern s32 _stack_end; + extern s32 __undef_stack; +#endif + +#ifndef USE_AMP +/**************************************************************************** +* +* Access L2 Debug Control Register. +* +* @param Value, value to be written to Debug Control Register. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +#ifdef __GNUC__ +static inline void 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 void Xil_L2CacheSync(void) +#else +static void Xil_L2CacheSync(void) +#endif +{ + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_SYNC_OFFSET, 0x0U); +} +#endif +/****************************************************************************/ +/** +* @brief Enable the Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheEnable(void) +{ + Xil_L1DCacheEnable(); +#ifndef USE_AMP + Xil_L2CacheEnable(); +#endif +} + +/****************************************************************************/ +/** +* @brief Disable the Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheDisable(void) +{ +#ifndef USE_AMP + Xil_L2CacheDisable(); +#endif + Xil_L1DCacheDisable(); +} + +/****************************************************************************/ +/** +* @brief Invalidate the entire Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheInvalidate(void) +{ + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); +#ifndef USE_AMP + Xil_L2CacheInvalidate(); +#endif + Xil_L1DCacheInvalidate(); + + mtcpsr(currmask); +} + +/*****************************************************************************/ +/** +* @brief 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 the system memory +* before the line is invalidated. +* +* @param adr: 32bit address of the data to be flushed. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_DCacheInvalidateLine(u32 adr) +{ + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); +#ifndef USE_AMP + Xil_L2CacheInvalidateLine(adr); +#endif + Xil_L1DCacheInvalidateLine(adr); + + mtcpsr(currmask); +} + + +/*****************************************************************************/ +/** +* @brief Invalidate the Data cache for the given address range. +* If the bytes specified by the address range are cached by the Data +* cache, the cachelines containing those bytes are invalidated. If +* the cachelines are modified (dirty), the modified contents are lost +* and NOT written to the system memory before the lines are +* invalidated. +* +* In this function, if start address or end address is not aligned to +* cache-line, particular cache-line containing unaligned start or end +* address is flush first and then invalidated the others as +* invalidating the same unaligned cache line may result into loss of +* data. This issue raises few possibilities. +* +* If the address to be invalidated is not cache-line aligned, the +* following choices are available: +* 1. Invalidate the cache line when required and do not bother much +* for the side effects. Though it sounds good, it can result in +* hard-to-debug issues. The problem is, if some other variable are +* allocated in the same cache line and had been recently updated +* (in cache), the invalidation would result in loss of data. +* 2. Flush the cache line first. This will ensure that if any other +* variable present in the same cache line and updated recently are +* flushed out to memory. Then it can safely be invalidated. Again it +* sounds good, but this can result in issues. For example, when the +* invalidation happens in a typical ISR (after a DMA transfer has +* updated the memory), then flushing the cache line means, loosing +* data that were updated recently before the ISR got invoked. +* +* Linux prefers the second one. To have uniform implementation +* (across standalone and Linux), the second option is implemented. +* This being the case, follwoing needs to be taken care of: +* 1. Whenever possible, the addresses must be cache line aligned. +* Please nore that, not just start address, even the end address must +* be cache line aligned. If that is taken care of, this will always +* work. +* 2. Avoid situations where invalidation has to be done after the +* data is updated by peripheral/DMA directly into the memory. It is +* not tough to achieve (may be a bit risky). The common use case to +* do invalidation is when a DMA happens. Generally for such use +* cases, buffers can be allocated first and then start the DMA. The +* practice that needs to be followed here is, immediately after +* buffer allocation and before starting the DMA, do the invalidation. +* With this approach, invalidation need not to be done after the DMA +* transfer is over. +* +* This is going to always work if done carefully. +* However, the concern is, there is no guarantee that invalidate has +* not needed to be done after DMA is complete. For example, because +* of some reasons if the first cache line or last cache line +* (assuming the buffer in question comprises of multiple cache lines) +* are brought into cache (between the time it is invalidated and DMA +* completes) because of some speculative prefetching or reading data +* for a variable present in the same cache line, then we will have to +* invalidate the cache after DMA is complete. +* +* +* @param adr: 32bit start address of the range to be invalidated. +* @param len: Length of the range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheInvalidateRange(INTPTR adr, u32 len) +{ + const u32 cacheline = 32U; + u32 end; + u32 tempadr = adr; + u32 tempend; + u32 currmask; + volatile u32 *L2CCOffset = (volatile u32 *)(XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INVLD_PA_OFFSET); + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + + if (len != 0U) { + end = tempadr + len; + tempend = end; + /* Select L1 Data cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0U); + + if ((tempadr & (cacheline-1U)) != 0U) { + tempadr &= (~(cacheline - 1U)); + + Xil_L1DCacheFlushLine(tempadr); +#ifndef USE_AMP + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3U); + Xil_L2CacheFlushLine(tempadr); + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0U); + Xil_L2CacheSync(); +#endif + tempadr += cacheline; + } + if ((tempend & (cacheline-1U)) != 0U) { + tempend &= (~(cacheline - 1U)); + + Xil_L1DCacheFlushLine(tempend); +#ifndef USE_AMP + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3U); + Xil_L2CacheFlushLine(tempend); + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0U); + Xil_L2CacheSync(); +#endif + } + + while (tempadr < tempend) { +#ifndef USE_AMP + /* Invalidate L2 cache line */ + *L2CCOffset = tempadr; + Xil_L2CacheSync(); +#endif + + /* Invalidate L1 Data cache line */ +#if defined (__GNUC__) || defined (__ICCARM__) + asm_cp15_inval_dc_line_mva_poc(tempadr); +#else + { volatile register u32 Reg + __asm(XREG_CP15_INVAL_DC_LINE_MVA_POC); + Reg = tempadr; } +#endif + tempadr += cacheline; + } + } + + dsb(); + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief Flush the entire Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheFlush(void) +{ + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + Xil_L1DCacheFlush(); +#ifndef USE_AMP + Xil_L2CacheFlush(); +#endif + mtcpsr(currmask); +} + + +/****************************************************************************/ +/** +* @brief 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 adr: 32bit address of the data to be flushed. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_DCacheFlushLine(u32 adr) +{ + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + Xil_L1DCacheFlushLine(adr); +#ifndef USE_AMP + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3U); + + Xil_L2CacheFlushLine(adr); + + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0U); + Xil_L2CacheSync(); +#endif + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief Flush the Data cache for the given address range. +* If the bytes specified by the address range are cached by the +* data cache, the cachelines containing those bytes are invalidated. +* If the cachelines are modified (dirty), they are written to the +* system memory before the lines are invalidated. +* +* @param adr: 32bit start address of the range to be flushed. +* @param len: Length of the range to be flushed in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheFlushRange(INTPTR adr, u32 len) +{ + u32 LocalAddr = adr; + const u32 cacheline = 32U; + u32 end; + u32 currmask; + volatile u32 *L2CCOffset = (volatile u32 *)(XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INV_CLN_PA_OFFSET); + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + + if (len != 0U) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = LocalAddr + len; + LocalAddr &= ~(cacheline - 1U); + + while (LocalAddr < end) { + + /* Flush L1 Data cache line */ +#if defined (__GNUC__) || defined (__ICCARM__) + asm_cp15_clean_inval_dc_line_mva_poc(LocalAddr); +#else + { volatile register u32 Reg + __asm(XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC); + Reg = LocalAddr; } +#endif +#ifndef USE_AMP + /* Flush L2 cache line */ + *L2CCOffset = LocalAddr; + Xil_L2CacheSync(); +#endif + LocalAddr += cacheline; + } + } + dsb(); + mtcpsr(currmask); +} +/****************************************************************************/ +/** +* @brief 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 adr: 32bit address of the data to be stored. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_DCacheStoreLine(u32 adr) +{ + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + + Xil_L1DCacheStoreLine(adr); +#ifndef USE_AMP + Xil_L2CacheStoreLine(adr); +#endif + mtcpsr(currmask); +} + +/***************************************************************************/ +/** +* @brief Enable the instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ICacheEnable(void) +{ + Xil_L1ICacheEnable(); +#ifndef USE_AMP + Xil_L2CacheEnable(); +#endif +} + +/***************************************************************************/ +/** +* @brief Disable the instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ICacheDisable(void) +{ +#ifndef USE_AMP + Xil_L2CacheDisable(); +#endif + Xil_L1ICacheDisable(); +} + + +/****************************************************************************/ +/** +* @brief Invalidate the entire instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ICacheInvalidate(void) +{ + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); +#ifndef USE_AMP + Xil_L2CacheInvalidate(); +#endif + Xil_L1ICacheInvalidate(); + + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief Invalidate an instruction cache line. If the instruction specified +* by the address is cached by the instruction cache, the cacheline +* containing that instruction is invalidated. +* +* @param adr: 32bit address of the instruction to be invalidated. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_ICacheInvalidateLine(u32 adr) +{ + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); +#ifndef USE_AMP + Xil_L2CacheInvalidateLine(adr); +#endif + Xil_L1ICacheInvalidateLine(adr); + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief Invalidate the instruction cache for the given address range. +* If the instructions specified by the address range are cached by +* the instrunction cache, the cachelines containing those +* instructions are invalidated. +* +* @param adr: 32bit start address of the range to be invalidated. +* @param len: Length of the range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ICacheInvalidateRange(INTPTR adr, u32 len) +{ + u32 LocalAddr = adr; + const u32 cacheline = 32U; + u32 end; + volatile u32 *L2CCOffset = (volatile u32 *)(XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INVLD_PA_OFFSET); + + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + if (len != 0U) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = LocalAddr + len; + LocalAddr = LocalAddr & ~(cacheline - 1U); + + /* Select cache L0 I-cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 1U); + + while (LocalAddr < end) { +#ifndef USE_AMP + /* Invalidate L2 cache line */ + *L2CCOffset = LocalAddr; + dsb(); +#endif + + /* Invalidate L1 I-cache line */ +#if defined (__GNUC__) || defined (__ICCARM__) + asm_cp15_inval_ic_line_mva_pou(LocalAddr); +#else + { volatile register u32 Reg + __asm(XREG_CP15_INVAL_IC_LINE_MVA_POU); + Reg = LocalAddr; } +#endif + + LocalAddr += cacheline; + } + } + + /* Wait for L1 and L2 invalidate to complete */ + dsb(); + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief Enable the level 1 Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1DCacheEnable(void) +{ + register u32 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 u32 Reg __asm(XREG_CP15_SYS_CONTROL); + CtrlReg = Reg; } +#endif + if ((CtrlReg & (XREG_CP15_CONTROL_C_BIT)) != 0U) { + 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); +} + +/***************************************************************************/ +/** +* @brief Disable the level 1 Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1DCacheDisable(void) +{ + register u32 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 u32 Reg __asm(XREG_CP15_SYS_CONTROL); + CtrlReg = Reg; } +#endif + + CtrlReg &= ~(XREG_CP15_CONTROL_C_BIT); + + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); +} + +/****************************************************************************/ +/** +* @brief 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 u32 CsidReg, C7Reg; + u32 CacheSize, LineSize, NumWays; + u32 Way, WayIndex, Set, SetIndex, NumSet; + u32 currmask; + +#ifdef __GNUC__ + u32 stack_start,stack_end,stack_size; + register u32 CtrlReg; +#endif + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + +#ifdef __GNUC__ + stack_end = (u32)&_stack_end; + stack_start = (u32)&__undef_stack; + stack_size=stack_start-stack_end; + + /* Check for the cache status. If cache is enabled, then only + * flush stack memory to save return address. If cache is disabled, + * dont flush anything as it might result in flushing stale date into + * memory which is undesirable. + * */ + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); + if ((CtrlReg & (XREG_CP15_CONTROL_C_BIT)) != 0U) { + Xil_DCacheFlushRange(stack_end, stack_size); + } +#endif + + /* Select cache level 0 and D cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0U); + +#ifdef __GNUC__ + CsidReg = mfcp(XREG_CP15_CACHE_SIZE_ID); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_CACHE_SIZE_ID, CsidReg); +#else + { volatile register u32 Reg __asm(XREG_CP15_CACHE_SIZE_ID); + CsidReg = Reg; } +#endif + /* Determine Cache Size */ + CacheSize = (CsidReg >> 13U) & 0x1FFU; + CacheSize +=1U; + CacheSize *=128U; /* to get number of bytes */ + + /* Number of Ways */ + NumWays = (CsidReg & 0x3ffU) >> 3U; + NumWays += 1U; + + /* Get the cacheline size, way size, index size from csidr */ + LineSize = (CsidReg & 0x07U) + 4U; + + NumSet = CacheSize/NumWays; + NumSet /= (0x00000001U << LineSize); + + Way = 0U; + Set = 0U; + + /* Invalidate all the cachelines */ + for (WayIndex =0U; WayIndex < NumWays; WayIndex++) { + for (SetIndex =0U; SetIndex < NumSet; SetIndex++) { + C7Reg = Way | Set; + + /* Invalidate by Set/Way */ +#if defined (__GNUC__) || defined (__ICCARM__) + asm_cp15_inval_dc_line_sw(C7Reg); +#else + /*mtcp(XREG_CP15_INVAL_DC_LINE_SW, C7Reg), */ + { volatile register u32 Reg + __asm(XREG_CP15_INVAL_DC_LINE_SW); + Reg = C7Reg; } +#endif + Set += (0x00000001U << LineSize); + } + Set=0U; + Way += 0x40000000U; + } + + /* Wait for L1 invalidate to complete */ + dsb(); + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief 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 adr: 32bit address of the data to be invalidated. +* +* @return None. +* +* @note The bottom 5 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L1DCacheInvalidateLine(u32 adr) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0U); + mtcp(XREG_CP15_INVAL_DC_LINE_MVA_POC, (adr & (~0x1FU))); + + /* Wait for L1 invalidate to complete */ + dsb(); +} + +/****************************************************************************/ +/** +* @brief Invalidate the level 1 Data cache for the given address range. +* If the bytes specified by the address range are cached by the Data +* cache, the cachelines containing those bytes are invalidated. If the +* cachelines are modified (dirty), the modified contents are lost and +* NOT written to the system memory before the lines are invalidated. +* +* @param adr: 32bit start address of the range to be invalidated. +* @param len: Length of the range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1DCacheInvalidateRange(u32 adr, u32 len) +{ + u32 LocalAddr = adr; + const u32 cacheline = 32U; + u32 end; + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + + if (len != 0U) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = LocalAddr + len; + LocalAddr = LocalAddr & ~(cacheline - 1U); + + /* Select cache L0 D-cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0); + + while (LocalAddr < end) { + +#if defined (__GNUC__) || defined (__ICCARM__) + asm_cp15_inval_dc_line_mva_poc(LocalAddr); +#else + { volatile register u32 Reg + __asm(XREG_CP15_INVAL_DC_LINE_MVA_POC); + Reg = LocalAddr; } +#endif + LocalAddr += cacheline; + } + } + + /* Wait for L1 invalidate to complete */ + dsb(); + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief 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 u32 CsidReg, C7Reg; + u32 CacheSize, LineSize, NumWays; + u32 Way; + u32 WayIndex, Set, SetIndex, NumSet; + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + + /* 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 u32 Reg __asm(XREG_CP15_CACHE_SIZE_ID); + CsidReg = Reg; } +#endif + + /* Determine Cache Size */ + + CacheSize = (CsidReg >> 13U) & 0x1FFU; + CacheSize +=1U; + CacheSize *=128U; /* to get number of bytes */ + + /* Number of Ways */ + NumWays = (CsidReg & 0x3ffU) >> 3U; + NumWays += 1U; + + /* Get the cacheline size, way size, index size from csidr */ + LineSize = (CsidReg & 0x07U) + 4U; + + NumSet = CacheSize/NumWays; + NumSet /= (0x00000001U << LineSize); + + Way = 0U; + Set = 0U; + + /* Invalidate all the cachelines */ + for (WayIndex =0U; WayIndex < NumWays; WayIndex++) { + for (SetIndex =0U; SetIndex < NumSet; SetIndex++) { + C7Reg = Way | Set; + /* Flush by Set/Way */ + +#if defined (__GNUC__) || defined (__ICCARM__) + asm_cp15_clean_inval_dc_line_sw(C7Reg); +#else + { volatile register u32 Reg + __asm(XREG_CP15_CLEAN_INVAL_DC_LINE_SW); + Reg = C7Reg; } +#endif + Set += (0x00000001U << LineSize); + } + Set = 0U; + Way += 0x40000000U; + } + + /* Wait for L1 flush to complete */ + dsb(); + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief 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 adr: 32bit address of the data to be flushed. +* +* @return None. +* +* @note The bottom 5 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L1DCacheFlushLine(u32 adr) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0U); + mtcp(XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC, (adr & (~0x1FU))); + + /* Wait for L1 flush to complete */ + dsb(); +} + +/****************************************************************************/ +/** +* @brief Flush the level 1 Data cache for the given address range. +* If the bytes specified by the address range are cached by the Data +* cache, the cacheline containing those bytes are invalidated. If the +* cachelines are modified (dirty), they are written to system memory +* before the lines are invalidated. +* +* @param adr: 32bit start address of the range to be flushed. +* @param len: Length of the range to be flushed in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1DCacheFlushRange(u32 adr, u32 len) +{ + u32 LocalAddr = adr; + const u32 cacheline = 32U; + u32 end; + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + + if (len != 0U) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = LocalAddr + len; + LocalAddr = LocalAddr & ~(cacheline - 1U); + + /* Select cache L0 D-cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0U); + + while (LocalAddr < end) { + +#if defined (__GNUC__) || defined (__ICCARM__) + asm_cp15_clean_inval_dc_line_mva_poc(LocalAddr); +#else + { volatile register u32 Reg + __asm(XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC); + Reg = LocalAddr; } +#endif + LocalAddr += cacheline; + } + } + + /* Wait for L1 flush to complete */ + dsb(); + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief 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(u32 adr) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0U); + mtcp(XREG_CP15_CLEAN_DC_LINE_MVA_POC, (adr & (~0x1FU))); + + /* Wait for L1 store to complete */ + dsb(); +} + + +/****************************************************************************/ +/** +* @brief Enable the level 1 instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1ICacheEnable(void) +{ + register u32 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 u32 Reg __asm(XREG_CP15_SYS_CONTROL); + CtrlReg = Reg; } +#endif + if ((CtrlReg & (XREG_CP15_CONTROL_I_BIT)) != 0U) { + return; + } + + /* invalidate the instruction cache */ + mtcp(XREG_CP15_INVAL_IC_POU, 0U); + + /* enable the instruction cache */ + CtrlReg |= (XREG_CP15_CONTROL_I_BIT); + + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); +} + +/****************************************************************************/ +/** +* @brief Disable level 1 the instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1ICacheDisable(void) +{ + register u32 CtrlReg; + + dsb(); + + /* invalidate the instruction cache */ + mtcp(XREG_CP15_INVAL_IC_POU, 0U); + + /* disable the instruction cache */ +#ifdef __GNUC__ + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_SYS_CONTROL, CtrlReg); +#else + { volatile register u32 Reg __asm(XREG_CP15_SYS_CONTROL); + CtrlReg = Reg; } +#endif + CtrlReg &= ~(XREG_CP15_CONTROL_I_BIT); + + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); +} + +/****************************************************************************/ +/** +* @brief Invalidate the entire level 1 instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1ICacheInvalidate(void) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 1U); + /* invalidate the instruction cache */ + mtcp(XREG_CP15_INVAL_IC_POU, 0U); + + /* Wait for L1 invalidate to complete */ + dsb(); +} + +/****************************************************************************/ +/** +* @brief Invalidate a level 1 instruction cache line. If the instruction +* specified by the address is cached by the instruction cache, the +* cacheline containing that instruction is invalidated. +* +* @param adr: 32bit address of the instruction to be invalidated. +* +* @return None. +* +* @note The bottom 5 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L1ICacheInvalidateLine(u32 adr) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 1U); + mtcp(XREG_CP15_INVAL_IC_LINE_MVA_POU, (adr & (~0x1FU))); + + /* Wait for L1 invalidate to complete */ + dsb(); +} + +/****************************************************************************/ +/** +* @brief Invalidate the level 1 instruction cache for the given address +* range. If the instrucions specified by the address range are cached +* by the instruction cache, the cacheline containing those bytes are +* invalidated. +* +* @param adr: 32bit start address of the range to be invalidated. +* @param len: Length of the range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1ICacheInvalidateRange(u32 adr, u32 len) +{ + u32 LocalAddr = adr; + const u32 cacheline = 32U; + u32 end; + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + + if (len != 0U) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = LocalAddr + len; + LocalAddr = LocalAddr & ~(cacheline - 1U); + + /* Select cache L0 I-cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 1U); + + while (LocalAddr < end) { + +#if defined (__GNUC__) || defined (__ICCARM__) + asm_cp15_inval_ic_line_mva_pou(LocalAddr); +#else + { volatile register u32 Reg + __asm(XREG_CP15_INVAL_IC_LINE_MVA_POU); + Reg = LocalAddr; } +#endif + LocalAddr += cacheline; + } + } + + /* Wait for L1 invalidate to complete */ + dsb(); + mtcpsr(currmask); +} + +#ifndef USE_AMP +/****************************************************************************/ +/** +* @brief Enable the L2 cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheEnable(void) +{ + register u32 L2CCReg; + + L2CCReg = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CNTRL_OFFSET); + + /* only enable if L2CC is currently disabled */ + if ((L2CCReg & 0x01U) == 0U) { + /* 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 | (0x01U))); + + Xil_L2CacheSync(); + /* synchronize the processor */ + dsb(); + + } +} + +/****************************************************************************/ +/** +* @brief Disable the L2 cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheDisable(void) +{ + register u32 L2CCReg; + + L2CCReg = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CNTRL_OFFSET); + + if((L2CCReg & 0x1U) != 0U) { + + /* 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 & (~0x01U))); + /* Wait for the cache operations to complete */ + + dsb(); + } +} + +/*****************************************************************************/ +/** +* @brief Invalidate the entire level 2 cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheInvalidate(void) +{ + #ifdef __GNUC__ + u32 stack_start,stack_end,stack_size; + register u32 L2CCReg; + stack_end = (u32)&_stack_end; + stack_start = (u32)&__undef_stack; + stack_size=stack_start-stack_end; + + /* Check for the cache status. If cache is enabled, then only + * flush stack memory to save return address. If cache is disabled, + * dont flush anything as it might result in flushing stale date into + * memory which is undesirable. + */ + L2CCReg = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CNTRL_OFFSET); + if ((L2CCReg & 0x01U) != 0U) { + /*Flush stack memory to save return address*/ + Xil_DCacheFlushRange(stack_end, stack_size); + } + + #endif + u32 ResultDCache; + /* Invalidate the caches */ + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INVLD_WAY_OFFSET, + 0x0000FFFFU); + ResultDCache = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INVLD_WAY_OFFSET) + & 0x0000FFFFU; + while(ResultDCache != (u32)0U) { + ResultDCache = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INVLD_WAY_OFFSET) + & 0x0000FFFFU; + } + + /* Wait for the invalidate to complete */ + Xil_L2CacheSync(); + + /* synchronize the processor */ + dsb(); +} + +/*****************************************************************************/ +/** +* @brief 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 adr: 32bit address of the data/instruction to be invalidated. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L2CacheInvalidateLine(u32 adr) +{ + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INVLD_PA_OFFSET, (u32)adr); + /* synchronize the processor */ + dsb(); +} + +/****************************************************************************/ +/** +* @brief Invalidate the level 2 cache for the given address range. +* If the bytes specified by the address range are cached by the L2 +* cache, the cacheline containing those bytes are invalidated. If the +* cachelines are modified (dirty), the modified contents are lost and +* are NOT written to system memory before the lines are invalidated. +* +* @param adr: 32bit start address of the range to be invalidated. +* @param len: Length of the range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheInvalidateRange(u32 adr, u32 len) +{ + u32 LocalAddr = adr; + const u32 cacheline = 32U; + u32 end; + volatile u32 *L2CCOffset = (volatile u32 *)(XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INVLD_PA_OFFSET); + + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + + if (len != 0U) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = LocalAddr + len; + LocalAddr = LocalAddr & ~(cacheline - 1U); + + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3U); + + while (LocalAddr < end) { + *L2CCOffset = LocalAddr; + Xil_L2CacheSync(); + LocalAddr += cacheline; + } + + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0U); + } + + /* synchronize the processor */ + dsb(); + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief Flush the entire level 2 cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheFlush(void) +{ + u32 ResultL2Cache; + + /* Flush the caches */ + + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3U); + + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INV_CLN_WAY_OFFSET, + 0x0000FFFFU); + ResultL2Cache = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INV_CLN_WAY_OFFSET) + & 0x0000FFFFU; + + while(ResultL2Cache != (u32)0U) { + ResultL2Cache = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INV_CLN_WAY_OFFSET) + & 0x0000FFFFU; + } + + Xil_L2CacheSync(); + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0U); + + /* synchronize the processor */ + dsb(); +} + +/****************************************************************************/ +/** +* @brief Flush a level 2 cache line. If the byte specified by the address +* (adr) is cached by the L2 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 adr: 32bit address of the data/instruction to be flushed. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L2CacheFlushLine(u32 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(); +} + +/****************************************************************************/ +/** +* @brief Flush the level 2 cache for the given address range. +* If the bytes specified by the address range are cached by the L2 +* cache, the cacheline containing those bytes are invalidated. If the +* cachelines are modified (dirty), they are written to the system +* memory before the lines are invalidated. +* +* @param adr: 32bit start address of the range to be flushed. +* @param len: Length of the range to be flushed in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheFlushRange(u32 adr, u32 len) +{ + u32 LocalAddr = adr; + const u32 cacheline = 32U; + u32 end; + volatile u32 *L2CCOffset = (volatile u32 *)(XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INV_CLN_PA_OFFSET); + + u32 currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | IRQ_FIQ_MASK); + if (len != 0U) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = LocalAddr + len; + LocalAddr = LocalAddr & ~(cacheline - 1U); + + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3U); + + while (LocalAddr < end) { + *L2CCOffset = LocalAddr; + Xil_L2CacheSync(); + LocalAddr += cacheline; + } + + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0U); + } + /* synchronize the processor */ + dsb(); + mtcpsr(currmask); +} + +/****************************************************************************/ +/** +* @brief Store a level 2 cache line. If the byte specified by the address +* (adr) is cached by the L2 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 adr: 32bit address of the data/instruction to be stored. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L2CacheStoreLine(u32 adr) +{ + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_CLEAN_PA_OFFSET, adr); + /* synchronize the processor */ + dsb(); +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache.h new file mode 100644 index 0000000..b6614d5 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache.h @@ -0,0 +1,121 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache.h +* +* @addtogroup a9_cache_apis Cortex A9 Processor Cache Functions +* +* Cache functions provide access to cache related operations such as flush +* and invalidate for instruction and data caches. It gives option to perform +* the cache operations on a single cacheline, a range of memory and an entire +* cache. +* +* @{ +* +*
    +* 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.
    +* 
    +* +******************************************************************************/ +#ifndef XIL_CACHE_H +#define XIL_CACHE_H + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __GNUC__ + +#define asm_cp15_inval_dc_line_mva_poc(param) __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_DC_LINE_MVA_POC :: "r" (param)); + +#define asm_cp15_clean_inval_dc_line_mva_poc(param) __asm__ __volatile__("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (param)); + +#define asm_cp15_inval_ic_line_mva_pou(param) __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_IC_LINE_MVA_POU :: "r" (param)); + +#define asm_cp15_inval_dc_line_sw(param) __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_DC_LINE_SW :: "r" (param)); + +#define asm_cp15_clean_inval_dc_line_sw(param) __asm__ __volatile__("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_SW :: "r" (param)); + +#elif defined (__ICCARM__) + +#define asm_cp15_inval_dc_line_mva_poc(param) __asm volatile ("mcr " \ + XREG_CP15_INVAL_DC_LINE_MVA_POC :: "r" (param)); + +#define asm_cp15_clean_inval_dc_line_mva_poc(param) __asm volatile ("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (param)); + +#define asm_cp15_inval_ic_line_mva_pou(param) __asm volatile ("mcr " \ + XREG_CP15_INVAL_IC_LINE_MVA_POU :: "r" (param)); + +#define asm_cp15_inval_dc_line_sw(param) __asm volatile ("mcr " \ + XREG_CP15_INVAL_DC_LINE_SW :: "r" (param)); + +#define asm_cp15_clean_inval_dc_line_sw(param) __asm volatile ("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_SW :: "r" (param)); + +#endif + +void Xil_DCacheEnable(void); +void Xil_DCacheDisable(void); +void Xil_DCacheInvalidate(void); +void Xil_DCacheInvalidateRange(INTPTR adr, u32 len); +void Xil_DCacheFlush(void); +void Xil_DCacheFlushRange(INTPTR adr, u32 len); + +void Xil_ICacheEnable(void); +void Xil_ICacheDisable(void); +void Xil_ICacheInvalidate(void); +void Xil_ICacheInvalidateRange(INTPTR adr, u32 len); + +#ifdef __cplusplus +} +#endif + +#endif +/** +* @} End of "addtogroup a9_cache_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache_l.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache_l.h new file mode 100644 index 0000000..fa92c6b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache_l.h @@ -0,0 +1,100 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @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. +* +* @addtogroup a9_cache_apis +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a ecm  01/24/10 First release
    +* 
    +* +******************************************************************************/ +#ifndef XIL_CACHE_MACH_H +#define XIL_CACHE_MACH_H + +#include "xil_types.h" +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Function Prototypes ******************************/ + +void Xil_DCacheInvalidateLine(u32 adr); +void Xil_DCacheFlushLine(u32 adr); +void Xil_DCacheStoreLine(u32 adr); +void Xil_ICacheInvalidateLine(u32 adr); + +void Xil_L1DCacheEnable(void); +void Xil_L1DCacheDisable(void); +void Xil_L1DCacheInvalidate(void); +void Xil_L1DCacheInvalidateLine(u32 adr); +void Xil_L1DCacheInvalidateRange(u32 adr, u32 len); +void Xil_L1DCacheFlush(void); +void Xil_L1DCacheFlushLine(u32 adr); +void Xil_L1DCacheFlushRange(u32 adr, u32 len); +void Xil_L1DCacheStoreLine(u32 adr); + +void Xil_L1ICacheEnable(void); +void Xil_L1ICacheDisable(void); +void Xil_L1ICacheInvalidate(void); +void Xil_L1ICacheInvalidateLine(u32 adr); +void Xil_L1ICacheInvalidateRange(u32 adr, u32 len); + +void Xil_L2CacheEnable(void); +void Xil_L2CacheDisable(void); +void Xil_L2CacheInvalidate(void); +void Xil_L2CacheInvalidateLine(u32 adr); +void Xil_L2CacheInvalidateRange(u32 adr, u32 len); +void Xil_L2CacheFlush(void); +void Xil_L2CacheFlushLine(u32 adr); +void Xil_L2CacheFlushRange(u32 adr, u32 len); +void Xil_L2CacheStoreLine(u32 adr); + +#ifdef __cplusplus +} +#endif + +#endif +/** +* @} End of "addtogroup a9_cache_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache_vxworks.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache_vxworks.h new file mode 100644 index 0000000..6e8cfa7 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_cache_vxworks.h @@ -0,0 +1,93 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache_vxworks.h +* +* Contains the cache related functions for VxWorks that is wrapped by +* xil_cache. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a hbm  12/11/09 Initial release
    +*
    +* 
    +* +* @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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_errata.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_errata.h new file mode 100644 index 0000000..490aebe --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_errata.h @@ -0,0 +1,123 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_errata.h +* +* @addtogroup a9_errata Cortex A9 Processor and pl310 Errata Support +* @{ +* Various ARM errata are handled in the standalone BSP. The implementation for +* errata handling follows ARM guidelines and is based on the open source Linux +* support for these errata. +* +* @note +* The errata handling is enabled by default. To disable handling of all the +* errata globally, un-define the macro ENABLE_ARM_ERRATA in xil_errata.h. To +* disable errata on a per-erratum basis, un-define relevant macros in +* xil_errata.h. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a srt  04/18/13 First release
    +* 6.6   mus  12/07/17 Removed errata 753970, It fixes CR#989132.
    +* 
    +* +******************************************************************************/ +#ifndef XIL_ERRATA_H +#define XIL_ERRATA_H + +/** + * @name errata_definitions + * + * The errata conditions handled in the standalone BSP are listed below + * @{ + */ + +#define ENABLE_ARM_ERRATA 1 + +#ifdef ENABLE_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 + +/*@}*/ +#endif /* ENABLE_ARM_ERRATA */ + +#endif /* XIL_ERRATA_H */ +/** +* @} End of "addtogroup a9_errata". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_exception.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_exception.c new file mode 100644 index 0000000..d34fd21 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_exception.c @@ -0,0 +1,363 @@ +/****************************************************************************** +* +* Copyright (C) 2015 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xil_exception.c +* +* This file contains low-level driver functions for the Cortex A53,A9,R5 exception +* Handler. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 5.2	pkp  	 28/05/15 First release
    +* 6.0   mus      27/07/16 Consolidated exceptions for a53,a9 and r5
    +*                         processors and added Xil_UndefinedExceptionHandler
    +*                         for a53 32 bit and r5 as well.
    +* 6.4   mus      08/06/17 Updated debug prints to replace %x with the %lx, to
    +*                         fix the warnings.
    +* 6.7   mna      26/04/18 Add an API to obtain a corresponding
    +*                         Xil_ExceptionHandler entry from XExc_VectorTable.
    +* 6.7  asa       18/05/18 Fix bugs in the API Xil_GetExceptionRegisterHandler.
    +*
    +* 
    +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_exception.h" +#include "xpseudo_asm.h" +#include "xdebug.h" +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +typedef struct { + Xil_ExceptionHandler Handler; + void *Data; +} XExc_VectorTableEntry; + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Function Prototypes *****************************/ +static void Xil_ExceptionNullHandler(void *Data); +/************************** Variable Definitions *****************************/ +/* + * Exception vector table to store handlers for each exception vector. + */ +#if defined (__aarch64__) +XExc_VectorTableEntry XExc_VectorTable[XIL_EXCEPTION_ID_LAST + 1] = +{ + {Xil_ExceptionNullHandler, NULL}, + {Xil_SyncAbortHandler, NULL}, + {Xil_ExceptionNullHandler, NULL}, + {Xil_ExceptionNullHandler, NULL}, + {Xil_SErrorAbortHandler, NULL}, + +}; +#else +XExc_VectorTableEntry XExc_VectorTable[XIL_EXCEPTION_ID_LAST + 1] = +{ + {Xil_ExceptionNullHandler, NULL}, + {Xil_UndefinedExceptionHandler, NULL}, + {Xil_ExceptionNullHandler, NULL}, + {Xil_PrefetchAbortHandler, NULL}, + {Xil_DataAbortHandler, NULL}, + {Xil_ExceptionNullHandler, NULL}, + {Xil_ExceptionNullHandler, NULL}, +}; +#endif +#if !defined (__aarch64__) +u32 DataAbortAddr; /* Address of instruction causing data abort */ +u32 PrefetchAbortAddr; /* Address of instruction causing prefetch abort */ +u32 UndefinedExceptionAddr; /* Address of instruction causing Undefined + exception */ +#endif + +/*****************************************************************************/ + +/****************************************************************************/ +/** +* +* 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; +} + +/****************************************************************************/ +/** +* @brief The function is a common API used to initialize exception handlers +* across all supported arm processors. For ARM Cortex-A53, Cortex-R5, +* and Cortex-A9, the exception handlers are being initialized +* statically and this function does not do anything. +* However, it is still present to take care of backward compatibility +* issues (in earlier versions of BSPs, this API was being used to +* initialize exception handlers). +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void Xil_ExceptionInit(void) +{ + return; +} + +/*****************************************************************************/ +/** +* @brief Register a handler for a specific exception. This handler is being +* called when the processor encounters the specified exception. +* +* @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.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; +} + +/*****************************************************************************/ +/** +* @brief Get a handler for a specific exception. This handler is being +* called when the processor encounters the specified exception. +* +* @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.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_GetExceptionRegisterHandler(u32 Exception_id, + Xil_ExceptionHandler *Handler, + void **Data) +{ + *Handler = XExc_VectorTable[Exception_id].Handler; + *Data = XExc_VectorTable[Exception_id].Data; +} + +/*****************************************************************************/ +/** +* +* @brief 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.h for further information. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ExceptionRemoveHandler(u32 Exception_id) +{ + Xil_ExceptionRegisterHandler(Exception_id, + Xil_ExceptionNullHandler, + NULL); +} + +#if defined (__aarch64__) +/*****************************************************************************/ +/** +* +* Default Synchronous abort handler which prints a debug message on console if +* Debug flag is enabled +* +* @param None +* +* @return None. +* +* @note None. +* +****************************************************************************/ + +void Xil_SyncAbortHandler(void *CallBackRef){ + (void) CallBackRef; + xdbg_printf(XDBG_DEBUG_ERROR, "Synchronous abort \n"); + while(1) { + ; + } +} + +/*****************************************************************************/ +/** +* +* Default SError abort handler which prints a debug message on console if +* Debug flag is enabled +* +* @param None +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_SErrorAbortHandler(void *CallBackRef){ + (void) CallBackRef; + xdbg_printf(XDBG_DEBUG_ERROR, "Synchronous abort \n"); + while(1) { + ; + } +} +#else +/*****************************************************************************/ +/* +* +* Default Data abort handler which prints data fault status register through +* which information about data fault can be acquired +* +* @param None +* +* @return None. +* +* @note None. +* +****************************************************************************/ + +void Xil_DataAbortHandler(void *CallBackRef){ + (void) CallBackRef; +#ifdef DEBUG + u32 FaultStatus; + + xdbg_printf(XDBG_DEBUG_ERROR, "Data abort \n"); + #ifdef __GNUC__ + FaultStatus = mfcp(XREG_CP15_DATA_FAULT_STATUS); + #elif defined (__ICCARM__) + mfcp(XREG_CP15_DATA_FAULT_STATUS,FaultStatus); + #else + { volatile register u32 Reg __asm(XREG_CP15_DATA_FAULT_STATUS); + FaultStatus = Reg; } + #endif + xdbg_printf(XDBG_DEBUG_GENERAL, "Data abort with Data Fault Status Register %lx\n",FaultStatus); + xdbg_printf(XDBG_DEBUG_GENERAL, "Address of Instruction causing Data abort %lx\n",DataAbortAddr); +#endif + while(1) { + ; + } +} + +/*****************************************************************************/ +/* +* +* Default Prefetch abort handler which prints prefetch fault status register through +* which information about instruction prefetch fault can be acquired +* +* @param None +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_PrefetchAbortHandler(void *CallBackRef){ + (void) CallBackRef; +#ifdef DEBUG + u32 FaultStatus; + + xdbg_printf(XDBG_DEBUG_ERROR, "Prefetch abort \n"); + #ifdef __GNUC__ + FaultStatus = mfcp(XREG_CP15_INST_FAULT_STATUS); + #elif defined (__ICCARM__) + mfcp(XREG_CP15_INST_FAULT_STATUS,FaultStatus); + #else + { volatile register u32 Reg __asm(XREG_CP15_INST_FAULT_STATUS); + FaultStatus = Reg; } + #endif + xdbg_printf(XDBG_DEBUG_GENERAL, "Prefetch abort with Instruction Fault Status Register %lx\n",FaultStatus); + xdbg_printf(XDBG_DEBUG_GENERAL, "Address of Instruction causing Prefetch abort %lx\n",PrefetchAbortAddr); +#endif + while(1) { + ; + } +} +/*****************************************************************************/ +/* +* +* Default undefined exception handler which prints address of the undefined +* instruction if debug prints are enabled +* +* @param None +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_UndefinedExceptionHandler(void *CallBackRef){ + (void) CallBackRef; + xdbg_printf(XDBG_DEBUG_GENERAL, "Address of the undefined instruction %lx\n",UndefinedExceptionAddr); + while(1) { + ; + } +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_exception.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_exception.h new file mode 100644 index 0000000..8330387 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_exception.h @@ -0,0 +1,260 @@ +/****************************************************************************** +* +* Copyright (C) 2015 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_exception.h +* +* This header file contains ARM Cortex A53,A9,R5 specific exception related APIs. +* For exception related functions that can be used across all Xilinx supported +* processors, please use xil_exception.h. +* +* @addtogroup arm_exception_apis ARM Processor Exception Handling +* @{ +* ARM processors specific exception related APIs for cortex A53,A9 and R5 can +* utilized for enabling/disabling IRQ, registering/removing handler for +* exceptions or initializing exception vector table with null handler. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 5.2	pkp  	 28/05/15 First release
    +* 6.0   mus      27/07/16 Consolidated file for a53,a9 and r5 processors
    +* 6.7   mna      26/04/18 Add API Xil_GetExceptionRegisterHandler.
    +* 6.7   asa      18/05/18 Update signature of API Xil_GetExceptionRegisterHandler.
    +* 
    +* +******************************************************************************/ + +#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 0U +#if defined (__aarch64__) +#define XIL_EXCEPTION_ID_SYNC_INT 1U +#define XIL_EXCEPTION_ID_IRQ_INT 2U +#define XIL_EXCEPTION_ID_FIQ_INT 3U +#define XIL_EXCEPTION_ID_SERROR_ABORT_INT 4U +#define XIL_EXCEPTION_ID_LAST 5U +#else +#define XIL_EXCEPTION_ID_RESET 0U +#define XIL_EXCEPTION_ID_UNDEFINED_INT 1U +#define XIL_EXCEPTION_ID_SWI_INT 2U +#define XIL_EXCEPTION_ID_PREFETCH_ABORT_INT 3U +#define XIL_EXCEPTION_ID_DATA_ABORT_INT 4U +#define XIL_EXCEPTION_ID_IRQ_INT 5U +#define XIL_EXCEPTION_ID_FIQ_INT 6U +#define XIL_EXCEPTION_ID_LAST 6U +#endif + +/* + * 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 ********************/ + +/****************************************************************************/ +/** +* @brief Enable Exceptions. +* +* @param Mask: Value for enabling the exceptions. +* +* @return None. +* +* @note If bit is 0, exception is enabled. +* C-Style signature: void Xil_ExceptionEnableMask(Mask) +* +******************************************************************************/ +#if defined (__GNUC__) || defined (__ICCARM__) +#define Xil_ExceptionEnableMask(Mask) \ + mtcpsr(mfcpsr() & ~ ((Mask) & XIL_EXCEPTION_ALL)) +#else +#define Xil_ExceptionEnableMask(Mask) \ + { \ + register u32 Reg __asm("cpsr"); \ + mtcpsr((Reg) & (~((Mask) & XIL_EXCEPTION_ALL))); \ + } +#endif +/****************************************************************************/ +/** +* @brief Enable the IRQ exception. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +#define Xil_ExceptionEnable() \ + Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ) + +/****************************************************************************/ +/** +* @brief Disable Exceptions. +* +* @param Mask: Value for disabling the exceptions. +* +* @return None. +* +* @note If bit is 1, exception is disabled. +* C-Style signature: Xil_ExceptionDisableMask(Mask) +* +******************************************************************************/ +#if defined (__GNUC__) || defined (__ICCARM__) +#define Xil_ExceptionDisableMask(Mask) \ + mtcpsr(mfcpsr() | ((Mask) & XIL_EXCEPTION_ALL)) +#else +#define Xil_ExceptionDisableMask(Mask) \ + { \ + register u32 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) + +#if !defined (__aarch64__) && !defined (ARMA53_32) +/****************************************************************************/ +/** +* @brief Enable nested interrupts by clearing the I and F bits in CPSR. This +* API is defined for cortex-a9 and cortex-r5. +* +* @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__ ("stmfd sp!, {lr}"); \ + __asm__ __volatile__ ("mrs lr, spsr"); \ + __asm__ __volatile__ ("stmfd sp!, {lr}"); \ + __asm__ __volatile__ ("msr cpsr_c, #0x1F"); \ + __asm__ __volatile__ ("stmfd sp!, {lr}"); + +/****************************************************************************/ +/** +* @brief Disable the nested interrupts by setting the I and F bits. This API +* is defined for cortex-a9 and cortex-r5. +* +* @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"); \ + __asm__ __volatile__ ("ldmfd sp!, {lr}"); \ + +#endif +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +extern void Xil_ExceptionRegisterHandler(u32 Exception_id, + Xil_ExceptionHandler Handler, + void *Data); + +extern void Xil_ExceptionRemoveHandler(u32 Exception_id); +extern void Xil_GetExceptionRegisterHandler(u32 Exception_id, + Xil_ExceptionHandler *Handler, void **Data); + +extern void Xil_ExceptionInit(void); +#if defined (__aarch64__) +void Xil_SyncAbortHandler(void *CallBackRef); +void Xil_SErrorAbortHandler(void *CallBackRef); +#else +extern void Xil_DataAbortHandler(void *CallBackRef); +extern void Xil_PrefetchAbortHandler(void *CallBackRef); +extern void Xil_UndefinedExceptionHandler(void *CallBackRef); +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_EXCEPTION_H */ +/** +* @} End of "addtogroup arm_exception_apis". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_hal.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_hal.h new file mode 100644 index 0000000..d4434d0 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_hal.h @@ -0,0 +1,61 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_hal.h +* +* Contains all the HAL header files. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a hbm  07/28/09 Initial release
    +*
    +* 
    +* +* @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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_io.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_io.c new file mode 100644 index 0000000..90bfc81 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_io.c @@ -0,0 +1,102 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_io.c +* +* Contains I/O functions for memory-mapped or non-memory-mapped I/O +* architectures. +* +* @note +* +* This file contains architecture-dependent code. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 5.00 	pkp  	 05/29/14 First release
    +* 
    +******************************************************************************/ + + +/***************************** Include Files *********************************/ +#include "xil_io.h" +#include "xil_types.h" +#include "xil_assert.h" + +/*****************************************************************************/ +/** +* +* @brief Perform a 16-bit endian converion. +* +* @param Data: 16 bit value to be converted +* +* @return 16 bit Data with converted endianess +* +******************************************************************************/ +u16 Xil_EndianSwap16(u16 Data) +{ + return (u16) (((Data & 0xFF00U) >> 8U) | ((Data & 0x00FFU) << 8U)); +} + +/*****************************************************************************/ +/** +* +* @brief Perform a 32-bit endian converion. +* +* @param Data: 32 bit value to be converted +* +* @return 32 bit data with converted endianess +* +******************************************************************************/ +u32 Xil_EndianSwap32(u32 Data) +{ + u16 LoWord; + u16 HiWord; + + /* get each of the half words from the 32 bit word */ + + LoWord = (u16) (Data & 0x0000FFFFU); + HiWord = (u16) ((Data & 0xFFFF0000U) >> 16U); + + /* byte swap each of the 16 bit half words */ + + LoWord = (((LoWord & 0xFF00U) >> 8U) | ((LoWord & 0x00FFU) << 8U)); + HiWord = (((HiWord & 0xFF00U) >> 8U) | ((HiWord & 0x00FFU) << 8U)); + + /* swap the half words before returning the value */ + + return ((((u32)LoWord) << (u32)16U) | (u32)HiWord); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_io.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_io.h new file mode 100644 index 0000000..9c5aa43 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_io.h @@ -0,0 +1,345 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_io.h +* +* @addtogroup common_io_interfacing_apis Register IO interfacing APIs +* +* The xil_io.h file contains the interface for the general I/O component, which +* encapsulates the Input/Output functions for the processors that do not +* require any special I/O handling. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 5.00 	pkp  	 05/29/14 First release
    +* 6.00  mus      08/19/16 Remove checking of __LITTLE_ENDIAN__ flag for
    +*                         ARM processors
    +* 
    +******************************************************************************/ + +#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 "xil_printf.h" + +#if defined (__MICROBLAZE__) +#include "mb_interface.h" +#else +#include "xpseudo_asm.h" +#endif + +/************************** Function Prototypes ******************************/ +u16 Xil_EndianSwap16(u16 Data); +u32 Xil_EndianSwap32(u32 Data); +#ifdef ENABLE_SAFETY +extern u32 XStl_RegUpdate(u32 RegAddr, u32 RegVal); +#endif + +/***************** Macros (Inline Functions) Definitions *********************/ +#if defined __GNUC__ +#if defined (__MICROBLAZE__) +# define INST_SYNC mbar(0) +# define DATA_SYNC mbar(1) +# else +# define SYNCHRONIZE_IO dmb() +# define INST_SYNC isb() +# define DATA_SYNC dsb() +# endif +#else +# define SYNCHRONIZE_IO +# define INST_SYNC +# define DATA_SYNC +# define INST_SYNC +# define DATA_SYNC +#endif + +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__MICROBLAZE__) +#define INLINE inline +#else +#define INLINE __inline +#endif + +/*****************************************************************************/ +/** +* +* @brief Performs an input operation for a memory location by reading +* from the specified address and returning the 8 bit Value read from +* that address. +* +* @param Addr: contains the address to perform the input operation +* +* @return The 8 bit Value read from the specified input address. + +* +******************************************************************************/ +static INLINE u8 Xil_In8(UINTPTR Addr) +{ + return *(volatile u8 *) Addr; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an input operation for a memory location by reading from +* the specified address and returning the 16 bit Value read from that +* address. +* +* @param Addr: contains the address to perform the input operation +* +* @return The 16 bit Value read from the specified input address. +* +******************************************************************************/ +static INLINE u16 Xil_In16(UINTPTR Addr) +{ + return *(volatile u16 *) Addr; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an input operation for a memory location by +* reading from the specified address and returning the 32 bit Value +* read from that address. +* +* @param Addr: contains the address to perform the input operation +* +* @return The 32 bit Value read from the specified input address. +* +******************************************************************************/ +static INLINE u32 Xil_In32(UINTPTR Addr) +{ + return *(volatile u32 *) Addr; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an input operation for a memory location by reading the +* 64 bit Value read from that address. +* +* +* @param Addr: contains the address to perform the input operation +* +* @return The 64 bit Value read from the specified input address. +* +******************************************************************************/ +static INLINE u64 Xil_In64(UINTPTR Addr) +{ + return *(volatile u64 *) Addr; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an output operation for an memory location by +* writing the 8 bit Value to the the specified address. +* +* @param Addr: contains the address to perform the output operation +* @param Value: contains the 8 bit Value to be written at the specified +* address. +* +* @return None. +* +******************************************************************************/ +static INLINE void Xil_Out8(UINTPTR Addr, u8 Value) +{ + volatile u8 *LocalAddr = (volatile u8 *)Addr; + *LocalAddr = Value; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an output operation for a memory location by writing the +* 16 bit Value to the the specified address. +* +* @param Addr contains the address to perform the output operation +* @param Value contains the Value to be written at the specified address. +* +* @return None. +* +******************************************************************************/ +static INLINE void Xil_Out16(UINTPTR Addr, u16 Value) +{ + volatile u16 *LocalAddr = (volatile u16 *)Addr; + *LocalAddr = Value; +} + +/*****************************************************************************/ +/** +* +* @brief Performs an output operation for a memory location by writing the +* 32 bit Value to the the specified address. +* +* @param Addr contains the address to perform the output operation +* @param Value contains the 32 bit Value to be written at the specified +* address. +* +* @return None. +* +******************************************************************************/ +static INLINE void Xil_Out32(UINTPTR Addr, u32 Value) +{ +#ifndef ENABLE_SAFETY + volatile u32 *LocalAddr = (volatile u32 *)Addr; + *LocalAddr = Value; +#else + XStl_RegUpdate(Addr, Value); +#endif +} + +/*****************************************************************************/ +/** +* +* @brief Performs an output operation for a memory location by writing the +* 64 bit Value to the the specified address. +* +* @param Addr contains the address to perform the output operation +* @param Value contains 64 bit Value to be written at the specified address. +* +* @return None. +* +******************************************************************************/ +static INLINE void Xil_Out64(UINTPTR Addr, u64 Value) +{ + volatile u64 *LocalAddr = (volatile u64 *)Addr; + *LocalAddr = Value; +} + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +# define Xil_In16LE Xil_In16 +# define Xil_In32LE Xil_In32 +# define Xil_Out16LE Xil_Out16 +# define Xil_Out32LE Xil_Out32 +# define Xil_Htons Xil_EndianSwap16 +# define Xil_Htonl Xil_EndianSwap32 +# define Xil_Ntohs Xil_EndianSwap16 +# define Xil_Ntohl Xil_EndianSwap32 +# else +# define Xil_In16BE Xil_In16 +# define Xil_In32BE Xil_In32 +# define Xil_Out16BE Xil_Out16 +# define Xil_Out32BE Xil_Out32 +# define Xil_Htons(Data) (Data) +# define Xil_Htonl(Data) (Data) +# define Xil_Ntohs(Data) (Data) +# define Xil_Ntohl(Data) (Data) +#endif +#else +# define Xil_In16LE Xil_In16 +# define Xil_In32LE Xil_In32 +# define Xil_Out16LE Xil_Out16 +# define Xil_Out32LE Xil_Out32 +# define Xil_Htons Xil_EndianSwap16 +# define Xil_Htonl Xil_EndianSwap32 +# define Xil_Ntohs Xil_EndianSwap16 +# define Xil_Ntohl Xil_EndianSwap32 +#endif + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +static INLINE u16 Xil_In16BE(UINTPTR Addr) +#else +static INLINE u16 Xil_In16LE(UINTPTR Addr) +#endif +#else +static INLINE u16 Xil_In16BE(UINTPTR Addr) +#endif +{ + u16 value = Xil_In16(Addr); + return Xil_EndianSwap16(value); +} + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +static INLINE u32 Xil_In32BE(UINTPTR Addr) +#else +static INLINE u32 Xil_In32LE(UINTPTR Addr) +#endif +#else +static INLINE u32 Xil_In32BE(UINTPTR Addr) +#endif +{ + u32 value = Xil_In32(Addr); + return Xil_EndianSwap32(value); +} + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +static INLINE void Xil_Out16BE(UINTPTR Addr, u16 Value) +#else +static INLINE void Xil_Out16LE(UINTPTR Addr, u16 Value) +#endif +#else +static INLINE void Xil_Out16BE(UINTPTR Addr, u16 Value) +#endif +{ + Value = Xil_EndianSwap16(Value); + Xil_Out16(Addr, Value); +} + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +static INLINE void Xil_Out32BE(UINTPTR Addr, u32 Value) +#else +static INLINE void Xil_Out32LE(UINTPTR Addr, u32 Value) +#endif +#else +static INLINE void Xil_Out32BE(UINTPTR Addr, u32 Value) +#endif +{ + Value = Xil_EndianSwap32(Value); + Xil_Out32(Addr, Value); +} + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_io_interfacing_apis". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_macroback.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_macroback.h new file mode 100644 index 0000000..ebafde8 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_macroback.h @@ -0,0 +1,1052 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/*********************************************************************/ +/** + * @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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mem.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mem.c new file mode 100644 index 0000000..0929a68 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mem.c @@ -0,0 +1,83 @@ +/******************************************************************************/ +/** +* Copyright (C) 2015 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* @file xil_mem.c +* +* This file contains xil mem copy function to use in case of word aligned +* data copies. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 6.1   nsk      11/07/16 First release.
    +*
    +* 
    +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xil_types.h" + +/***************** Inline Functions Definitions ********************/ +/*****************************************************************************/ +/** +* @brief This function copies memory from once location to other. +* +* @param dst: pointer pointing to destination memory +* +* @param src: pointer pointing to source memory +* +* @param cnt: 32 bit length of bytes to be copied +* +*****************************************************************************/ +void Xil_MemCpy(void* dst, const void* src, u32 cnt) +{ + char *d = (char*)(void *)dst; + const char *s = src; + + while (cnt >= sizeof (int)) { + *(int*)d = *(int*)s; + d += sizeof (int); + s += sizeof (int); + cnt -= sizeof (int); + } + while ((cnt) > 0U){ + *d = *s; + d += 1U; + s += 1U; + cnt -= 1U; + } +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mem.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mem.h new file mode 100644 index 0000000..a2d5e66 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mem.h @@ -0,0 +1,59 @@ +/******************************************************************************/ +/** +* Copyright (C) 2015 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* @file xil_mem.h +* +* @addtogroup common_mem_operation_api Customized APIs for Memory Operations +* +* The xil_mem.h file contains prototype for functions related +* to memory operations. These APIs are applicable for all processors supported +* by Xilinx. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 6.1   nsk      11/07/16 First release.
    +*
    +* 
    +* +*****************************************************************************/ + +/************************** Function Prototypes *****************************/ + +void Xil_MemCpy(void* dst, const void* src, u32 cnt); +/** +* @} End of "addtogroup common_mem_operation_api". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_misc_psreset_api.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_misc_psreset_api.c new file mode 100644 index 0000000..e114d14 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_misc_psreset_api.c @@ -0,0 +1,524 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date   Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00b kpc   03/07/13 First release
    +* 5.4	pkp	  09/11/15 Change the description for XOcm_Remap function
    +* 
    +* +******************************************************************************/ + + +/***************************** 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(void) +{ + 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 &= (u32)(~XDDRPS_CTRL_RESET_MASK); + Xil_Out32(XDDRC_CTRL_BASEADDR,RegVal); + RegVal |= ((u32)XDDRPS_CTRL_RESET_MASK); + Xil_Out32(XDDRC_CTRL_BASEADDR,RegVal); + +} + +/*****************************************************************************/ +/** +* This function contains the implementation for remapping the ocm memory region +* to postbootrom state. +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XOcm_Remap(void) +{ + 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 & (u32)(~XSLCR_OCM_CFG_HIADDR_MASK)) | (u32)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 | (u32)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, 0x0U); + Xil_Out32(BaseAddress + XSMC_REFRESH_PERIOD_1_OFFSET, 0x0U); + /* 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(void) +{ + 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=0U; i<=1U;i++) + { + Xil_Out32((XSLCR_MIO_PIN_00_ADDR + (i * 4U)), + XSLCR_MIO_PIN_00_RESET_VAL); + } + for (; i<=8U;i++) + { + Xil_Out32((XSLCR_MIO_PIN_00_ADDR + (i * 4U)), + XSLCR_MIO_PIN_02_RESET_VAL); + } + for (; i<=53U ;i++) + { + Xil_Out32((XSLCR_MIO_PIN_00_ADDR + (i * 4U)), + 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(void) +{ + + /* 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(void) +{ + 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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~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 | ((u32)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 & (u32)(~XSLCR_GPIO_RST_CTRL_VAL); + Xil_Out32(XSLCR_GPIO_RST_CTRL_ADDR, RegVal); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_misc_psreset_api.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_misc_psreset_api.h new file mode 100644 index 0000000..c228c98 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_misc_psreset_api.h @@ -0,0 +1,277 @@ +/****************************************************************************** +* +* Copyright (C) 2013 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @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. +*
    +* +******************************************************************************/ + +#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 0xF8006000U +#define XSLCR_BASEADDR 0xF8000000U +/**< OCM configuration register */ +#define XSLCR_OCM_CFG_ADDR (XSLCR_BASEADDR + 0x00000910U) +/**< SLCR unlock register */ +#define XSLCR_UNLOCK_ADDR (XSLCR_BASEADDR + 0x00000008U) +/**< SLCR GEM0 rx clock control register */ +#define XSLCR_GEM0_RCLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000138U) +/**< SLCR GEM1 rx clock control register */ +#define XSLCR_GEM1_RCLK_CTRL_ADDR (XSLCR_BASEADDR + 0x0000013CU) +/**< SLCR GEM0 clock control register */ +#define XSLCR_GEM0_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000140U) +/**< SLCR GEM1 clock control register */ +#define XSLCR_GEM1_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000144U) +/**< SLCR SMC clock control register */ +#define XSLCR_SMC_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000148U) +/**< SLCR GEM reset control register */ +#define XSLCR_GEM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000214U) +/**< SLCR USB0 clock control register */ +#define XSLCR_USB0_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000130U) +/**< SLCR USB1 clock control register */ +#define XSLCR_USB1_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000134U) +/**< SLCR USB1 reset control register */ +#define XSLCR_USB_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000210U) +/**< SLCR SMC reset control register */ +#define XSLCR_SMC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000234U) +/**< SLCR Level shifter enable register */ +#define XSLCR_LVL_SHFTR_EN_ADDR (XSLCR_BASEADDR + 0x00000900U) +/**< SLCR ARM pll control register */ +#define XSLCR_ARM_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x00000100U) +/**< SLCR DDR pll control register */ +#define XSLCR_DDR_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x00000104U) +/**< SLCR IO pll control register */ +#define XSLCR_IO_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x00000108U) +/**< SLCR ARM pll configuration register */ +#define XSLCR_ARM_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x00000110U) +/**< SLCR DDR pll configuration register */ +#define XSLCR_DDR_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x00000114U) +/**< SLCR IO pll configuration register */ +#define XSLCR_IO_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x00000118U) +/**< SLCR ARM clock control register */ +#define XSLCR_ARM_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000120U) +/**< SLCR DDR clock control register */ +#define XSLCR_DDR_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x00000124U) +/**< SLCR MIO pin address register */ +#define XSLCR_MIO_PIN_00_ADDR (XSLCR_BASEADDR + 0x00000700U) +/**< SLCR DMAC reset control address register */ +#define XSLCR_DMAC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x0000020CU) +/**< SLCR USB reset control address register */ +/*#define XSLCR_USB_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000210U)*/ +/**< SLCR GEM reset control address register */ +/*#define XSLCR_GEM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000214U)*/ +/**< SLCR SDIO reset control address register */ +#define XSLCR_SDIO_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000218U) +/**< SLCR SPI reset control address register */ +#define XSLCR_SPI_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x0000021CU) +/**< SLCR CAN reset control address register */ +#define XSLCR_CAN_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000220U) +/**< SLCR I2C reset control address register */ +#define XSLCR_I2C_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000224U) +/**< SLCR UART reset control address register */ +#define XSLCR_UART_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000228U) +/**< SLCR GPIO reset control address register */ +#define XSLCR_GPIO_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x0000022CU) +/**< SLCR LQSPI reset control address register */ +#define XSLCR_LQSPI_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000230U) +/**< SLCR SMC reset control address register */ +/*#define XSLCR_SMC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000234U)*/ +/**< SLCR OCM reset control address register */ +#define XSLCR_OCM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x00000238U) + +/**< SMC mem controller clear config register */ +#define XSMC_MEMC_CLR_CONFIG_OFFSET 0x0000000CU +/**< SMC idlecount configuration register */ +#define XSMC_REFRESH_PERIOD_0_OFFSET 0x00000020U +#define XSMC_REFRESH_PERIOD_1_OFFSET 0x00000024U +/**< SMC ECC configuration register */ +#define XSMC_ECC_MEMCFG1_OFFSET 0x00000404U +/**< SMC ECC command 1 register */ +#define XSMC_ECC_MEMCMD1_OFFSET 0x00000404U +/**< SMC ECC command 2 register */ +#define XSMC_ECC_MEMCMD2_OFFSET 0x00000404U + +/**< SLCR unlock code */ +#define XSLCR_UNLOCK_CODE 0x0000DF0DU + +/**< SMC mem clear configuration mask */ +#define XSMC_MEMC_CLR_CONFIG_MASK 0x000005FU +/**< SMC ECC memconfig 1 reset value */ +#define XSMC_ECC_MEMCFG1_RESET_VAL 0x0000043U +/**< SMC ECC memcommand 1 reset value */ +#define XSMC_ECC_MEMCMD1_RESET_VAL 0x01300080U +/**< SMC ECC memcommand 2 reset value */ +#define XSMC_ECC_MEMCMD2_RESET_VAL 0x01E00585U + +/**< DDR controller reset bit mask */ +#define XDDRPS_CTRL_RESET_MASK 0x00000001U +/**< SLCR OCM configuration reset value*/ +#define XSLCR_OCM_CFG_RESETVAL 0x00000008U +/**< SLCR OCM bank selection mask*/ +#define XSLCR_OCM_CFG_HIADDR_MASK 0x0000000FU +/**< SLCR level shifter enable mask*/ +#define XSLCR_LVL_SHFTR_EN_MASK 0x0000000FU + +/**< SLCR PLL register reset values */ +#define XSLCR_ARM_PLL_CTRL_RESET_VAL 0x0001A008U +#define XSLCR_DDR_PLL_CTRL_RESET_VAL 0x0001A008U +#define XSLCR_IO_PLL_CTRL_RESET_VAL 0x0001A008U +#define XSLCR_ARM_PLL_CFG_RESET_VAL 0x00177EA0U +#define XSLCR_DDR_PLL_CFG_RESET_VAL 0x00177EA0U +#define XSLCR_IO_PLL_CFG_RESET_VAL 0x00177EA0U +#define XSLCR_ARM_CLK_CTRL_RESET_VAL 0x1F000400U +#define XSLCR_DDR_CLK_CTRL_RESET_VAL 0x18400003U + +/**< SLCR MIO register default values */ +#define XSLCR_MIO_PIN_00_RESET_VAL 0x00001601U +#define XSLCR_MIO_PIN_02_RESET_VAL 0x00000601U + +/**< SLCR Reset control registers default values */ +#define XSLCR_DMAC_RST_CTRL_VAL 0x00000001U +#define XSLCR_GEM_RST_CTRL_VAL 0x000000F3U +#define XSLCR_USB_RST_CTRL_VAL 0x00000003U +#define XSLCR_I2C_RST_CTRL_VAL 0x00000003U +#define XSLCR_SPI_RST_CTRL_VAL 0x0000000FU +#define XSLCR_UART_RST_CTRL_VAL 0x0000000FU +#define XSLCR_QSPI_RST_CTRL_VAL 0x00000003U +#define XSLCR_GPIO_RST_CTRL_VAL 0x00000001U +#define XSLCR_SMC_RST_CTRL_VAL 0x00000003U +#define XSLCR_OCM_RST_CTRL_VAL 0x00000001U +#define XSLCR_SDIO_RST_CTRL_VAL 0x00000033U +#define XSLCR_CAN_RST_CTRL_VAL 0x00000003U +/**************************** 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(void); +/* + * Map the ocm region to post bootrom state + */ +void XOcm_Remap(void); +/* + * Performs the smc interface reset + */ +void XSmc_ResetHw(u32 BaseAddress); +/* + * updates the MIO registers with reset values + */ +void XSlcr_MioWriteResetValues(void); +/* + * updates the PLL and clock registers with reset values + */ +void XSlcr_PllWriteResetValues(void); +/* + * Disables the level shifters + */ +void XSlcr_DisableLevelShifters(void); +/* + * 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mmu.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mmu.c new file mode 100644 index 0000000..1f58d90 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mmu.c @@ -0,0 +1,190 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xil_mmu.c +* +* This file provides APIs for enabling/disabling MMU and setting the memory +* attributes for sections, in the MMU translation table. +* +*
    +* 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.
    +* 
    +* +* @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 ******************************/ + +/*****************************************************************************/ +/** +* @brief This function sets the memory attributes for a section covering 1MB +* of memory in the translation table. +* +* @param Addr: 32-bit address for which memory attributes need to be set. +* @param attrib: Attribute for the given memory region. xil_mmu.h contains +* definitions of commonly used memory attributes which can be +* utilized for this function. +* +* +* @return None. +* +* @note The MMU or D-cache does not need to be disabled before changing a +* translation table entry. +* +******************************************************************************/ +void Xil_SetTlbAttributes(INTPTR Addr, u32 attrib) +{ + u32 *ptr; + u32 section; + + section = Addr / 0x100000U; + ptr = &MMUTable; + ptr += section; + if(ptr != NULL) { + *ptr = (Addr & 0xFFF00000U) | attrib; + } + + Xil_DCacheFlush(); + + mtcp(XREG_CP15_INVAL_UTLB_UNLOCKED, 0U); + /* Invalidate all branch predictors */ + mtcp(XREG_CP15_INVAL_BRANCH_ARRAY, 0U); + + dsb(); /* ensure completion of the BP and TLB invalidation */ + isb(); /* synchronize context on this processor */ +} + +/*****************************************************************************/ +/** +* @brief Enable MMU for cortex A9 processor. This function invalidates the +* instruction and data caches, and then enables MMU. +* +* @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 u32 Cp15Reg __asm(XREG_CP15_SYS_CONTROL); + Reg = Cp15Reg; } +#endif + Reg |= (u32)0x05U; + mtcp(XREG_CP15_SYS_CONTROL, Reg); + + dsb(); + isb(); +} + +/*****************************************************************************/ +/** +* @brief Disable MMU for Cortex A9 processors. This function invalidates +* the TLBs, Branch Predictor Array and flushed the D Caches before +* disabling the MMU. +* +* @param None. +* +* @return None. +* +* @note When the MMU is disabled, all the memory accesses are treated as +* strongly ordered. +******************************************************************************/ +void Xil_DisableMMU(void) +{ + u32 Reg; + + mtcp(XREG_CP15_INVAL_UTLB_UNLOCKED, 0U); + mtcp(XREG_CP15_INVAL_BRANCH_ARRAY, 0U); + Xil_DCacheFlush(); + +#ifdef __GNUC__ + Reg = mfcp(XREG_CP15_SYS_CONTROL); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_SYS_CONTROL, Reg); +#else + { volatile register u32 Cp15Reg __asm(XREG_CP15_SYS_CONTROL); + Reg = Cp15Reg; } +#endif + Reg &= (u32)(~0x05U); +#ifdef CONFIG_ARM_ERRATA_794073 + /* Disable Branch Prediction */ + Reg &= (u32)(~0x800U); +#endif + mtcp(XREG_CP15_SYS_CONTROL, Reg); +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mmu.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mmu.h new file mode 100644 index 0000000..dd14b63 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_mmu.h @@ -0,0 +1,108 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xil_mmu.h +* +* @addtogroup a9_mmu_apis Cortex A9 Processor MMU Functions +* +* MMU functions equip users to enable MMU, disable MMU and modify default +* memory attributes of MMU table as per the need. +* +* @{ +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- ---------------------------------------------------
    +* 1.00a sdm  01/12/12 Initial version
    +* 4.2	pkp	 07/21/14 Included xil_types.h file which contains definition for
    +*					  u32 which resolves issue of CR#805869
    +* 5.4	pkp	 23/11/15 Added attribute definitions for Xil_SetTlbAttributes API
    +* 
    +* +* +******************************************************************************/ + +#ifndef XIL_MMU_H +#define XIL_MMU_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/* Memory type */ +#define NORM_NONCACHE 0x11DE2 /* Normal Non-cacheable */ +#define STRONG_ORDERED 0xC02 /* Strongly ordered */ +#define DEVICE_MEMORY 0xC06 /* Device memory */ +#define RESERVED 0x0 /* reserved memory */ + +/* Normal write-through cacheable shareable */ +#define NORM_WT_CACHE 0x16DEA + +/* Normal write back cacheable shareable */ +#define NORM_WB_CACHE 0x15DE6 + +/* shareability attribute */ +#define SHAREABLE (0x1 << 16) +#define NON_SHAREABLE (~(0x1 << 16)) + +/* Execution type */ +#define EXECUTE_NEVER ((0x1 << 4) | (0x1 << 0)) + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void Xil_SetTlbAttributes(INTPTR Addr, u32 attrib); +void Xil_EnableMMU(void); +void Xil_DisableMMU(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_MMU_H */ +/** +* @} End of "addtogroup a9_mmu_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_printf.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_printf.c new file mode 100644 index 0000000..dc0897f --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_printf.c @@ -0,0 +1,443 @@ +/*---------------------------------------------------*/ +/* Modified from : */ +/* Public Domain version of printf */ +/* Rud Merriam, Compsult, Inc. Houston, Tx. */ +/* For Embedded Systems Programming, 1991 */ +/* */ +/*---------------------------------------------------*/ +#include "xil_printf.h" +#include "xil_types.h" +#include "xil_assert.h" +#include +#include +#include + +static void padding( const s32 l_flag,const struct params_s *par); +static void outs(const charptr lp, struct params_s *par); +static s32 getnum( charptr* linep); + +typedef struct params_s { + s32 len; + s32 num1; + s32 num2; + char8 pad_character; + s32 do_padding; + s32 left_flag; + s32 unsigned_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. */ +/* */ +static void padding( const s32 l_flag, const struct params_s *par) +{ + s32 i; + + if ((par->do_padding != 0) && (l_flag != 0) && (par->len < par->num1)) { + i=(par->len); + for (; i<(par->num1); i++) { +#ifdef STDOUT_BASEADDRESS + outbyte( par->pad_character); +#endif + } + } +} + +/*---------------------------------------------------*/ +/* */ +/* This routine moves a string to the output buffer */ +/* as directed by the padding and positioning flags. */ +/* */ +static void outs(const charptr lp, struct params_s *par) +{ + charptr LocalPtr; + LocalPtr = lp; + /* pad on left if needed */ + if(LocalPtr != NULL) { + par->len = (s32)strlen( LocalPtr); + } + padding( !(par->left_flag), par); + + /* Move string to the buffer */ + while (((*LocalPtr) != (char8)0) && ((par->num2) != 0)) { + (par->num2)--; +#ifdef STDOUT_BASEADDRESS + outbyte(*LocalPtr); +#endif + LocalPtr += 1; +} + + /* 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. */ +/* */ + +static void outnum( const s32 n, const s32 base, struct params_s *par) +{ + s32 negative; + s32 i; + char8 outbuf[32]; + const char8 digits[] = "0123456789ABCDEF"; + u32 num; + for(i = 0; i<32; i++) { + outbuf[i] = '0'; + } + + /* Check if number is negative */ + if ((par->unsigned_flag == 0) && (base == 10) && (n < 0L)) { + negative = 1; + num =(-(n)); + } + else{ + num = n; + negative = 0; + } + + /* Build number (backwards) in outbuf */ + i = 0; + do { + outbuf[i] = digits[(num % base)]; + i++; + num /= base; + } while (num > 0); + + if (negative != 0) { + outbuf[i] = '-'; + i++; + } + + outbuf[i] = 0; + i--; + + /* Move the converted number to the buffer and */ + /* add in the padding where needed. */ + par->len = (s32)strlen(outbuf); + padding( !(par->left_flag), par); + while (&outbuf[i] >= outbuf) { +#ifdef STDOUT_BASEADDRESS + outbyte( outbuf[i] ); +#endif + i--; +} + padding( par->left_flag, par); +} +/*---------------------------------------------------*/ +/* */ +/* This routine moves a 64-bit number to the output */ +/* buffer as directed by the padding and positioning */ +/* flags. */ +/* */ +#if defined (__aarch64__) +static void outnum1( const s64 n, const s32 base, params_t *par) +{ + s32 negative; + s32 i; + char8 outbuf[64]; + const char8 digits[] = "0123456789ABCDEF"; + u64 num; + for(i = 0; i<64; i++) { + outbuf[i] = '0'; + } + + /* Check if number is negative */ + if ((par->unsigned_flag == 0) && (base == 10) && (n < 0L)) { + negative = 1; + num =(-(n)); + } + else{ + num = (n); + negative = 0; + } + + /* Build number (backwards) in outbuf */ + i = 0; + do { + outbuf[i] = digits[(num % base)]; + i++; + num /= base; + } while (num > 0); + + if (negative != 0) { + outbuf[i] = '-'; + i++; + } + + outbuf[i] = 0; + i--; + + /* Move the converted number to the buffer and */ + /* add in the padding where needed. */ + par->len = (s32)strlen(outbuf); + padding( !(par->left_flag), par); + while (&outbuf[i] >= outbuf) { + outbyte( outbuf[i] ); + i--; +} + padding( par->left_flag, par); +} +#endif +/*---------------------------------------------------*/ +/* */ +/* This routine gets a number from the format */ +/* string. */ +/* */ +static s32 getnum( charptr* linep) +{ + s32 n; + s32 ResultIsDigit = 0; + charptr cptr; + n = 0; + cptr = *linep; + if(cptr != NULL){ + ResultIsDigit = isdigit(((s32)*cptr)); + } + while (ResultIsDigit != 0) { + if(cptr != NULL){ + n = ((n*10) + (((s32)*cptr) - (s32)'0')); + cptr += 1; + if(cptr != NULL){ + ResultIsDigit = isdigit(((s32)*cptr)); + } + } + ResultIsDigit = isdigit(((s32)*cptr)); + } + *linep = ((charptr )(cptr)); + 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 floating 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, ...) */ +#if HYP_GUEST && EL1_NONSECURE && XEN_USE_PV_CONSOLE +void xil_printf( const char8 *ctrl1, ...){ + XPVXenConsole_Printf(ctrl1); +} +#else +void xil_printf( const char8 *ctrl1, ...) +{ + s32 Check; +#if defined (__aarch64__) + s32 long_flag; +#endif + s32 dot_flag; + + params_t par; + + char8 ch; + va_list argp; + char8 *ctrl = (char8 *)ctrl1; + + va_start( argp, ctrl1); + + while ((ctrl != NULL) && (*ctrl != (char8)0)) { + + /* move format string chars to buffer until a */ + /* format control is found. */ + if (*ctrl != '%') { +#ifdef STDOUT_BASEADDRESS + outbyte(*ctrl); +#endif + ctrl += 1; + continue; + } + + /* initialize all the flags for this format. */ + dot_flag = 0; +#if defined (__aarch64__) + long_flag = 0; +#endif + par.unsigned_flag = 0; + par.left_flag = 0; + par.do_padding = 0; + par.pad_character = ' '; + par.num2=32767; + par.num1=0; + par.len=0; + + try_next: + if(ctrl != NULL) { + ctrl += 1; + } + if(ctrl != NULL) { + ch = *ctrl; + } + else { + ch = *ctrl; + } + + if (isdigit((s32)ch) != 0) { + if (dot_flag != 0) { + par.num2 = getnum(&ctrl); + } + else { + if (ch == '0') { + par.pad_character = '0'; + } + if(ctrl != NULL) { + par.num1 = getnum(&ctrl); + } + par.do_padding = 1; + } + if(ctrl != NULL) { + ctrl -= 1; + } + goto try_next; + } + + switch (tolower((s32)ch)) { + case '%': +#ifdef STDOUT_BASEADDRESS + outbyte( '%'); +#endif + Check = 1; + break; + + case '-': + par.left_flag = 1; + Check = 0; + break; + + case '.': + dot_flag = 1; + Check = 0; + break; + + case 'l': + #if defined (__aarch64__) + long_flag = 1; + #endif + Check = 0; + break; + + case 'u': + par.unsigned_flag = 1; + /* fall through */ + case 'i': + case 'd': + #if defined (__aarch64__) + if (long_flag != 0){ + outnum1((s64)va_arg(argp, s64), 10L, &par); + } + else { + outnum( va_arg(argp, s32), 10L, &par); + } + #else + outnum( va_arg(argp, s32), 10L, &par); + #endif + Check = 1; + break; + case 'p': + #if defined (__aarch64__) + par.unsigned_flag = 1; + outnum1((s64)va_arg(argp, s64), 16L, &par); + Check = 1; + break; + #endif + case 'X': + case 'x': + par.unsigned_flag = 1; + #if defined (__aarch64__) + if (long_flag != 0) { + outnum1((s64)va_arg(argp, s64), 16L, &par); + } + else { + outnum((s32)va_arg(argp, s32), 16L, &par); + } + #else + outnum((s32)va_arg(argp, s32), 16L, &par); + #endif + Check = 1; + break; + + case 's': + outs( va_arg( argp, char *), &par); + Check = 1; + break; + + case 'c': +#ifdef STDOUT_BASEADDRESS + outbyte( va_arg( argp, s32)); +#endif + Check = 1; + break; + + case '\\': + switch (*ctrl) { + case 'a': +#ifdef STDOUT_BASEADDRESS + outbyte( ((char8)0x07)); +#endif + break; + case 'h': +#ifdef STDOUT_BASEADDRESS + outbyte( ((char8)0x08)); +#endif + break; + case 'r': +#ifdef STDOUT_BASEADDRESS + outbyte( ((char8)0x0D)); +#endif + break; + case 'n': +#ifdef STDOUT_BASEADDRESS + outbyte( ((char8)0x0D)); + outbyte( ((char8)0x0A)); +#endif + break; + default: +#ifdef STDOUT_BASEADDRESS + outbyte( *ctrl); +#endif + break; + } + ctrl += 1; + Check = 0; + break; + + default: + Check = 1; + break; + } + if(Check == 1) { + if(ctrl != NULL) { + ctrl += 1; + } + continue; + } + goto try_next; + } + va_end( argp); +} +#endif +/*---------------------------------------------------*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_printf.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_printf.h new file mode 100644 index 0000000..016ae3b --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_printf.h @@ -0,0 +1,48 @@ + #ifndef XIL_PRINTF_H + #define XIL_PRINTF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include "xil_types.h" +#include "xparameters.h" +#include "bspconfig.h" +#if HYP_GUEST && EL1_NONSECURE && XEN_USE_PV_CONSOLE +#include "xen_console.h" +#endif + +/*----------------------------------------------------*/ +/* 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 char8* charptr; +typedef s32 (*func_ptr)(int c); + +/* */ + +void xil_printf( const char8 *ctrl1, ...); +void print( const char8 *ptr); +extern void outbyte (char8 c); +extern char8 inbyte(void); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleepcommon.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleepcommon.c new file mode 100644 index 0000000..972a310 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleepcommon.c @@ -0,0 +1,106 @@ +/****************************************************************************** +* +* Copyright (C) 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +*@file xil_sleepcommon.c +* +* This file contains the sleep API's +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 6.6 	srm  	 11/02/17 First release
    +* 
    +******************************************************************************/ + + +/***************************** Include Files *********************************/ +#include "xil_io.h" +#include "sleep.h" + +/**************************** Constant Definitions *************************/ + + +/*****************************************************************************/ +/** +* +* This API gives delay in sec +* +* @param seconds - delay time in seconds +* +* @return none +* +* @note none +* +*****************************************************************************/ + void sleep(unsigned int seconds) + { +#if defined (ARMR5) + sleep_R5(seconds); +#elif defined (__aarch64__) || defined (ARMA53_32) + sleep_A53(seconds); +#elif defined (__MICROBLAZE__) + sleep_MB(seconds); +#else + sleep_A9(seconds); +#endif + + } + +/****************************************************************************/ +/** +* +* This API gives delay in usec +* +* @param useconds - delay time in useconds +* +* @return none +* +* @note none +* +*****************************************************************************/ + void usleep(unsigned long useconds) + { +#if defined (ARMR5) + usleep_R5(useconds); +#elif defined (__aarch64__) || defined (ARMA53_32) + usleep_A53(useconds); +#elif defined (__MICROBLAZE__) + usleep_MB(useconds); +#else + usleep_A9(useconds); +#endif + + } diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleeptimer.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleeptimer.c new file mode 100644 index 0000000..5bf30cc --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleeptimer.c @@ -0,0 +1,162 @@ +/****************************************************************************** +* +* Copyright (C) 2017 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xil_sleeptimer.c +* +* This file provides the common helper routines for the sleep API's +* +*
    +* MODIFICATION HISTORY :
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 6.6	srm  10/18/17 First Release.
    +* 6.6   srm  04/20/18 Fixed compilation warning in Xil_SleepTTCCommon API
    +*
    +* 
    +*****************************************************************************/ + +/**************************** Include Files ********************************/ + +#include "xil_io.h" +#include "xil_sleeptimer.h" +#include "xtime_l.h" + +/**************************** Constant Definitions *************************/ + + +/* Function definitions are applicable only when TTC3 is present*/ +#if defined (SLEEP_TIMER_BASEADDR) +/****************************************************************************/ +/** +* +* This is a helper function used by sleep/usleep APIs to +* have delay in sec/usec +* +* @param delay - delay time in seconds/micro seconds +* +* @param frequency - Number of counts per second/micro second +* +* @return none +* +* @note none +* +*****************************************************************************/ +void Xil_SleepTTCCommon(u32 delay, u64 frequency) +{ + u64 tEnd = 0U; + u64 tCur = 0U; + XCntrVal TimeHighVal = 0U; + XCntrVal TimeLowVal1 = 0U; + XCntrVal TimeLowVal2 = 0U; + + TimeLowVal1 = XSleep_ReadCounterVal(SLEEP_TIMER_BASEADDR + + XSLEEP_TIMER_TTC_COUNT_VALUE_OFFSET); + tEnd = (u64)TimeLowVal1 + ((u64)(delay) * frequency); + do + { + TimeLowVal2 = XSleep_ReadCounterVal(SLEEP_TIMER_BASEADDR + + XSLEEP_TIMER_TTC_COUNT_VALUE_OFFSET); + if (TimeLowVal2 < TimeLowVal1) { + TimeHighVal++; + } + TimeLowVal1 = TimeLowVal2; + tCur = (((u64) TimeHighVal) << XSLEEP_TIMER_REG_SHIFT) | + (u64)TimeLowVal2; + }while (tCur < tEnd); +} + + +/*****************************************************************************/ +/** +* +* This API starts the Triple Timer Counter +* +* @param none +* +* @return none +* +* @note none +* +*****************************************************************************/ +void XTime_StartTTCTimer() +{ + u32 TimerPrescalar; + u32 TimerCntrl; + +#if (defined (__aarch64__) && EL3==1) || defined (ARMR5) || defined (ARMA53_32) + u32 LpdRst; + + LpdRst = XSleep_ReadCounterVal(RST_LPD_IOU2); + + /* check if the timer is reset */ + if (((LpdRst & (RST_LPD_IOU2_TTC_BASE_RESET_MASK << + XSLEEP_TTC_INSTANCE)) != 0 )) { + LpdRst = LpdRst & (~(RST_LPD_IOU2_TTC_BASE_RESET_MASK << + XSLEEP_TTC_INSTANCE)); + Xil_Out32(RST_LPD_IOU2, LpdRst); + } else { +#endif + TimerCntrl = XSleep_ReadCounterVal(SLEEP_TIMER_BASEADDR + + XSLEEP_TIMER_TTC_CNT_CNTRL_OFFSET); + /* check if Timer is disabled */ + if ((TimerCntrl & XSLEEP_TIMER_TTC_CNT_CNTRL_DIS_MASK) == 0) { + TimerPrescalar = XSleep_ReadCounterVal(SLEEP_TIMER_BASEADDR + + XSLEEP_TIMER_TTC_CLK_CNTRL_OFFSET); + /* check if Timer is configured with proper functionalty for sleep */ + if ((TimerPrescalar & XSLEEP_TIMER_TTC_CLK_CNTRL_PS_EN_MASK) == 0) + return; + } +#if (defined (__aarch64__) && EL3==1) || defined (ARMR5) || defined (ARMA53_32) + } +#endif + /* Disable the timer to configure */ + TimerCntrl = XSleep_ReadCounterVal(SLEEP_TIMER_BASEADDR + + XSLEEP_TIMER_TTC_CNT_CNTRL_OFFSET); + TimerCntrl = TimerCntrl | XSLEEP_TIMER_TTC_CNT_CNTRL_DIS_MASK; + Xil_Out32(SLEEP_TIMER_BASEADDR + XSLEEP_TIMER_TTC_CNT_CNTRL_OFFSET, + TimerCntrl); + /* Disable the prescalar */ + TimerPrescalar = XSleep_ReadCounterVal(SLEEP_TIMER_BASEADDR + + XSLEEP_TIMER_TTC_CLK_CNTRL_OFFSET); + TimerPrescalar = TimerPrescalar & (~XSLEEP_TIMER_TTC_CLK_CNTRL_PS_EN_MASK); + Xil_Out32(SLEEP_TIMER_BASEADDR + XSLEEP_TIMER_TTC_CLK_CNTRL_OFFSET, + TimerPrescalar); + /* Enable the Timer */ + TimerCntrl = TimerCntrl & (~XSLEEP_TIMER_TTC_CNT_CNTRL_DIS_MASK); + Xil_Out32(SLEEP_TIMER_BASEADDR + XSLEEP_TIMER_TTC_CNT_CNTRL_OFFSET, + TimerCntrl); +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleeptimer.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleeptimer.h new file mode 100644 index 0000000..4bfac0a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_sleeptimer.h @@ -0,0 +1,116 @@ +/****************************************************************************** +* +* Copyright (C) 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_sleeptimer.h +* +* This header file contains ARM Cortex A53,A9,R5 specific sleep related APIs. +* For sleep related functions that can be used across all Xilinx supported +* processors, please use xil_sleeptimer.h. +* +* +*
    +* MODIFICATION HISTORY :
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 6.6	srm  10/18/17 First Release.
    +*
    +* 
    +*****************************************************************************/ + +#ifndef XIL_SLEEPTIMER_H /* prevent circular inclusions */ +#define XIL_SLEEPTIMER_H /* by using protection macros */ +/**************************** Include Files ********************************/ + +#include "xil_io.h" +#include "xparameters.h" +#include "bspconfig.h" + +/************************** Constant Definitions *****************************/ + +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) +#define XSLEEP_TIMER_REG_SHIFT 32U +#define XSleep_ReadCounterVal Xil_In32 +#define XCntrVal u32 +#else +#define XSLEEP_TIMER_REG_SHIFT 16U +#define XSleep_ReadCounterVal Xil_In16 +#define XCntrVal u16 +#endif + +#if defined(ARMR5) || (defined (__aarch64__) && EL3==1) || defined (ARMA53_32) +#define RST_LPD_IOU2 0xFF5E0238U +#define RST_LPD_IOU2_TTC_BASE_RESET_MASK 0x00000800U +#endif + +#if defined (SLEEP_TIMER_BASEADDR) +/** @name Register Map +* +* Register offsets from the base address of the TTC device +* +* @{ +*/ + #define XSLEEP_TIMER_TTC_CLK_CNTRL_OFFSET 0x00000000U + /**< Clock Control Register */ + #define XSLEEP_TIMER_TTC_CNT_CNTRL_OFFSET 0x0000000CU + /**< Counter Control Register*/ + #define XSLEEP_TIMER_TTC_COUNT_VALUE_OFFSET 0x00000018U + /**< Current Counter Value */ +/* @} */ +/** @name Clock Control Register +* Clock Control Register definitions of TTC +* @{ +*/ + #define XSLEEP_TIMER_TTC_CLK_CNTRL_PS_EN_MASK 0x00000001U + /**< Prescale enable */ +/* @} */ +/** @name Counter Control Register +* Counter Control Register definitions of TTC +* @{ +*/ +#define XSLEEP_TIMER_TTC_CNT_CNTRL_DIS_MASK 0x00000001U + /**< Disable the counter */ +#define XSLEEP_TIMER_TTC_CNT_CNTRL_RST_MASK 0x00000010U + /**< Reset counter */ +/* @} */ + +/**************************** Type Definitions *******************************/ + +/************************** Function Prototypes ******************************/ + +void Xil_SleepTTCCommon(u32 delay, u64 frequency); +void XTime_StartTTCTimer(); + +#endif +#endif /* XIL_SLEEPTIMER_H */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testcache.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testcache.c new file mode 100644 index 0000000..157ad08 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testcache.c @@ -0,0 +1,371 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testcache.c +* +* Contains utility functions to test cache. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a hbm  07/28/09 Initial release
    +* 4.1   asa  05/09/14 Ensured that the address uses for cache test is aligned
    +*				      cache line.
    +* 
    +* +* @note +* This file contain functions that all operate on HAL. +* +******************************************************************************/ +#ifdef __ARM__ +#include "xil_cache.h" +#include "xil_testcache.h" +#include "xil_types.h" +#include "xpseudo_asm.h" +#ifdef __aarch64__ +#include "xreg_cortexa53.h" +#else +#include "xreg_cortexr5.h" +#endif + +#include "xil_types.h" + +extern void xil_printf(const char8 *ctrl1, ...); + +#define DATA_LENGTH 128 + +#ifdef __aarch64__ +static INTPTR Data[DATA_LENGTH] __attribute__ ((aligned(64))); +#else +static INTPTR Data[DATA_LENGTH] __attribute__ ((aligned(32))); +#endif + + +/*****************************************************************************/ +/** +* +* @brief 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. +* @param None +* +* @return +* - -1 is returned for a failure +* - 0 is returned for a pass +* +*****************************************************************************/ +s32 Xil_TestDCacheRange(void) +{ + s32 Index; + s32 Status = 0; + u32 CtrlReg; + INTPTR 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((INTPTR)Data, DATA_LENGTH * sizeof(INTPTR)); + + xil_printf(" flush range done\r\n"); + + dsb(); + #ifdef __aarch64__ + CtrlReg = mfcp(SCTLR_EL3); + CtrlReg &= ~(XREG_CONTROL_DCACHE_BIT); + mtcp(SCTLR_EL3,CtrlReg); + #else + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); + CtrlReg &= ~(XREG_CP15_CONTROL_C_BIT); + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); + #endif + dsb(); + + 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(" Flush worked\r\n"); + } + else { + xil_printf("Error: flush dcache range not working\r\n"); + } + dsb(); + #ifdef __aarch64__ + CtrlReg = mfcp(SCTLR_EL3); + CtrlReg |= (XREG_CONTROL_DCACHE_BIT); + mtcp(SCTLR_EL3,CtrlReg); + #else + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); + CtrlReg |= (XREG_CP15_CONTROL_C_BIT); + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); + #endif + dsb(); + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = 0xA0A0C505; + + + + Xil_DCacheFlushRange((INTPTR)Data, DATA_LENGTH * sizeof(INTPTR)); + + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = Index + 3; + + Xil_DCacheInvalidateRange((INTPTR)Data, DATA_LENGTH * sizeof(INTPTR)); + + xil_printf(" invalidate dcache range done\r\n"); + dsb(); + #ifdef __aarch64__ + CtrlReg = mfcp(SCTLR_EL3); + CtrlReg &= ~(XREG_CONTROL_DCACHE_BIT); + mtcp(SCTLR_EL3,CtrlReg); + #else + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); + CtrlReg &= ~(XREG_CP15_CONTROL_C_BIT); + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); + #endif + dsb(); + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = 0xA0A0A05; + dsb(); + #ifdef __aarch64__ + CtrlReg = mfcp(SCTLR_EL3); + CtrlReg |= (XREG_CONTROL_DCACHE_BIT); + mtcp(SCTLR_EL3,CtrlReg); + #else + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); + CtrlReg |= (XREG_CP15_CONTROL_C_BIT); + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); + #endif + dsb(); + + Status = 0; + + for (Index = 0; Index < DATA_LENGTH; Index++) { + Value = Data[Index]; + if (Value != 0xA0A0A05) { + 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; + +} + +/*****************************************************************************/ +/** +* @brief 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 +*****************************************************************************/ +s32 Xil_TestDCacheAll(void) +{ + s32 Index; + s32 Status; + INTPTR Value; + u32 CtrlReg; + + 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"); + dsb(); + #ifdef __aarch64__ + CtrlReg = mfcp(SCTLR_EL3); + CtrlReg &= ~(XREG_CONTROL_DCACHE_BIT); + mtcp(SCTLR_EL3,CtrlReg); + #else + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); + CtrlReg &= ~(XREG_CP15_CONTROL_C_BIT); + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); + #endif + dsb(); + 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(" Flush all worked\r\n"); + } + else { + xil_printf("Error: Flush dcache all not working\r\n"); + } + dsb(); + #ifdef __aarch64__ + CtrlReg = mfcp(SCTLR_EL3); + CtrlReg |= (XREG_CONTROL_DCACHE_BIT); + mtcp(SCTLR_EL3,CtrlReg); + #else + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); + CtrlReg |= (XREG_CP15_CONTROL_C_BIT); + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); + #endif + dsb(); + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = 0x505FFA0A; + + Xil_DCacheFlush(); + + + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = Index + 3; + + Xil_DCacheInvalidate(); + + xil_printf(" invalidate all done\r\n"); + dsb(); + #ifdef __aarch64__ + CtrlReg = mfcp(SCTLR_EL3); + CtrlReg &= ~(XREG_CONTROL_DCACHE_BIT); + mtcp(SCTLR_EL3,CtrlReg); + #else + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); + CtrlReg &= ~(XREG_CP15_CONTROL_C_BIT); + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); + #endif + dsb(); + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = 0x50CFA0A; + dsb(); + #ifdef __aarch64__ + CtrlReg = mfcp(SCTLR_EL3); + CtrlReg |= (XREG_CONTROL_DCACHE_BIT); + mtcp(SCTLR_EL3,CtrlReg); + #else + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); + CtrlReg |= (XREG_CP15_CONTROL_C_BIT); + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); + #endif + dsb(); + Status = 0; + + for (Index = 0; Index < DATA_LENGTH; Index++) { + Value = Data[Index]; + if (Value != 0x50CFA0A) { + 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; +} + +/*****************************************************************************/ +/** +* @brief Perform Xil_ICacheInvalidateRange() on a few function pointers. +* +* @return +* - 0 is returned for a pass +* @note +* The function will hang if it fails. +*****************************************************************************/ +s32 Xil_TestICacheRange(void) +{ + + Xil_ICacheInvalidateRange((INTPTR)Xil_TestICacheRange, 1024); + Xil_ICacheInvalidateRange((INTPTR)Xil_TestDCacheRange, 1024); + Xil_ICacheInvalidateRange((INTPTR)Xil_TestDCacheAll, 1024); + + xil_printf("-- Invalidate icache range done --\r\n"); + + return 0; +} + +/*****************************************************************************/ +/** +* @brief Perform Xil_ICacheInvalidate() on a few function pointers. +* +* @return +* - 0 is returned for a pass +* @note +* The function will hang if it fails. +*****************************************************************************/ +s32 Xil_TestICacheAll(void) +{ + Xil_ICacheInvalidate(); + xil_printf("-- Invalidate icache all done --\r\n"); + return 0; +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testcache.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testcache.h new file mode 100644 index 0000000..c35e9a4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testcache.h @@ -0,0 +1,71 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testcache.h +* +* @addtogroup common_test_utils +*

    Cache test

    +* The xil_testcache.h 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 */ + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern s32 Xil_TestDCacheRange(void); +extern s32 Xil_TestDCacheAll(void); +extern s32 Xil_TestICacheRange(void); +extern s32 Xil_TestICacheAll(void); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_test_utils". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testio.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testio.c new file mode 100644 index 0000000..e6a3680 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testio.c @@ -0,0 +1,299 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testio.c +* +* Contains the memory test utility functions. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver    Who    Date    Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a hbm  08/25/09 First release
    +* 
    +* +*****************************************************************************/ + +/***************************** 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 value. + * + */ +static u16 Swap16(u16 Data) +{ + return ((Data >> 8U) & 0x00FFU) | ((Data << 8U) & 0xFF00U); +} + +/** + * + * Endian swap a 32-bit word. + * @param Data is the 32-bit word to be swapped. + * @return The endian swapped value. + * + */ +static u32 Swap32(u32 Data) +{ + u16 Lo16; + u16 Hi16; + + u16 Swap16Lo; + u16 Swap16Hi; + + Hi16 = (u16)((Data >> 16U) & 0x0000FFFFU); + Lo16 = (u16)(Data & 0x0000FFFFU); + + Swap16Lo = Swap16(Lo16); + Swap16Hi = Swap16(Hi16); + + return (((u32)(Swap16Lo)) << 16U) | ((u32)Swap16Hi); +} + +/*****************************************************************************/ +/** +* +* @brief Perform a destructive 8-bit wide register IO test where the +* register is accessed using Xil_Out8 and Xil_In8, and comparing +* the written values by reading them back. +* +* @param Addr: a pointer to the region of memory to be tested. +* @param Length: Length of the block. +* @param Value: constant used for writting the memory. +* +* @return +* - -1 is returned for a failure +* - 0 is returned for a pass +* +*****************************************************************************/ + +s32 Xil_TestIO8(u8 *Addr, s32 Length, u8 Value) +{ + u8 ValueIn; + s32 Index; + s32 Status = 0; + + for (Index = 0; Index < Length; Index++) { + Xil_Out8((INTPTR)Addr, Value); + + ValueIn = Xil_In8((INTPTR)Addr); + + if ((Value != ValueIn) && (Status == 0)) { + Status = -1; + break; + } + } + return Status; + +} + +/*****************************************************************************/ +/** +* +* @brief 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: a pointer to the region of memory to be tested. +* @param Length: Length of the block. +* @param Value: constant used for writting the memory. +* @param Kind: Type of test. 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 +* +*****************************************************************************/ + +s32 Xil_TestIO16(u16 *Addr, s32 Length, u16 Value, s32 Kind, s32 Swap) +{ + u16 *TempAddr16; + u16 ValueIn = 0U; + s32 Index; + TempAddr16 = Addr; + Xil_AssertNonvoid(TempAddr16 != NULL); + + for (Index = 0; Index < Length; Index++) { + switch (Kind) { + case XIL_TESTIO_LE: + Xil_Out16LE((INTPTR)TempAddr16, Value); + break; + case XIL_TESTIO_BE: + Xil_Out16BE((INTPTR)TempAddr16, Value); + break; + default: + Xil_Out16((INTPTR)TempAddr16, Value); + break; + } + + ValueIn = Xil_In16((INTPTR)TempAddr16); + + if ((Kind != 0) && (Swap != 0)) { + ValueIn = Swap16(ValueIn); + } + + if (Value != ValueIn) { + return -1; + } + + /* second round */ + Xil_Out16((INTPTR)TempAddr16, Value); + + switch (Kind) { + case XIL_TESTIO_LE: + ValueIn = Xil_In16LE((INTPTR)TempAddr16); + break; + case XIL_TESTIO_BE: + ValueIn = Xil_In16BE((INTPTR)TempAddr16); + break; + default: + ValueIn = Xil_In16((INTPTR)TempAddr16); + break; + } + + + if ((Kind != 0) && (Swap != 0)) { + ValueIn = Swap16(ValueIn); + } + + if (Value != ValueIn) { + return -1; + } + TempAddr16 += sizeof(u16); + } + return 0; +} + + +/*****************************************************************************/ +/** +* +* @brief 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: a pointer to the region of memory to be tested. +* @param Length: Length of the block. +* @param Value: constant used for writting the memory. +* @param Kind: type of test. 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 +* +*****************************************************************************/ +s32 Xil_TestIO32(u32 *Addr, s32 Length, u32 Value, s32 Kind, s32 Swap) +{ + u32 *TempAddr; + u32 ValueIn = 0U; + s32 Index; + TempAddr = Addr; + Xil_AssertNonvoid(TempAddr != NULL); + + for (Index = 0; Index < Length; Index++) { + switch (Kind) { + case XIL_TESTIO_LE: + Xil_Out32LE((INTPTR)TempAddr, Value); + break; + case XIL_TESTIO_BE: + Xil_Out32BE((INTPTR)TempAddr, Value); + break; + default: + Xil_Out32((INTPTR)TempAddr, Value); + break; + } + + ValueIn = Xil_In32((INTPTR)TempAddr); + + if ((Kind != 0) && (Swap != 0)) { + ValueIn = Swap32(ValueIn); + } + + if (Value != ValueIn) { + return -1; + } + + /* second round */ + Xil_Out32((INTPTR)TempAddr, Value); + + + switch (Kind) { + case XIL_TESTIO_LE: + ValueIn = Xil_In32LE((INTPTR)TempAddr); + break; + case XIL_TESTIO_BE: + ValueIn = Xil_In32BE((INTPTR)TempAddr); + break; + default: + ValueIn = Xil_In32((INTPTR)TempAddr); + break; + } + + if ((Kind != 0) && (Swap != 0)) { + ValueIn = Swap32(ValueIn); + } + + if (Value != ValueIn) { + return -1; + } + TempAddr += sizeof(u32); + } + return 0; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testio.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testio.h new file mode 100644 index 0000000..ad68ead --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testio.h @@ -0,0 +1,94 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testio.h +* +* @addtogroup common_test_utils Test Utilities +*

    I/O test

    +* The xil_testio.h file contains utility functions to test endian related memory +* IO functions. +* +* 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. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver    Who    Date    Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00 hbm  08/05/09 First release
    +* 
    +* +******************************************************************************/ + +#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 s32 Xil_TestIO8(u8 *Addr, s32 Length, u8 Value); +extern s32 Xil_TestIO16(u16 *Addr, s32 Length, u16 Value, s32 Kind, s32 Swap); +extern s32 Xil_TestIO32(u32 *Addr, s32 Length, u32 Value, s32 Kind, s32 Swap); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_test_utils". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testmem.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testmem.c new file mode 100644 index 0000000..87426d1 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testmem.c @@ -0,0 +1,868 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testmem.c +* +* Contains the memory test utility functions. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver    Who    Date    Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a hbm  08/25/09 First release
    +* 
    +* +*****************************************************************************/ + +/***************************** 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 */ + + +/*****************************************************************************/ +/** +* +* @brief Perform a destructive 32-bit wide memory test. +* +* @param Addr: pointer to the region of memory to be tested. +* @param Words: length of the block. +* @param Pattern: constant used for the constant pattern test, if 0, +* 0xDEADBEEF is used. +* @param Subtest: test type 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. +* +*****************************************************************************/ +s32 Xil_TestMem32(u32 *Addr, u32 Words, u32 Pattern, u8 Subtest) +{ + u32 I; + u32 j; + u32 Val; + u32 FirtVal; + u32 WordMem32; + s32 Status = 0; + + Xil_AssertNonvoid(Words != (u32)0); + Xil_AssertNonvoid(Subtest <= (u8)XIL_TESTMEM_MAXTEST); + Xil_AssertNonvoid(Addr != NULL); + + /* + * variable initialization + */ + Val = XIL_TESTMEM_INIT_VALUE; + FirtVal = XIL_TESTMEM_INIT_VALUE; + + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_INCREMENT)) { + /* + * Fill the memory with incrementing + * values starting from 'FirtVal' + */ + for (I = 0U; 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 = 0U; I < Words; I++) { + WordMem32 = *(Addr+I); + + if (WordMem32 != Val) { + Status = -1; + goto End_Label; + } + + Val++; + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_WALKONES)) { + /* + * set up to cycle through all possible initial + * test Patterns for walking ones test + */ + + for (j = 0U; j < (u32)32; j++) { + /* + * Generate an initial value for walking ones test + * to test for bad data bits + */ + + Val = (1U << j); + + /* + * START walking ones test + * Write a one to each data bit indifferent locations + */ + + for (I = 0U; I < (u32)32; I++) { + /* write memory location */ + *(Addr+I) = Val; + Val = (u32) RotateLeft(Val, 32U); + } + + /* + * Restore the reference 'val' to the + * initial value + */ + Val = 1U << j; + + /* Read the values from each location that was + * written */ + for (I = 0U; I < (u32)32; I++) { + /* read memory location */ + + WordMem32 = *(Addr+I); + + if (WordMem32 != Val) { + Status = -1; + goto End_Label; + } + + Val = (u32)RotateLeft(Val, 32U); + } + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_WALKZEROS)) { + /* + * set up to cycle through all possible + * initial test Patterns for walking zeros test + */ + + for (j = 0U; j < (u32)32; j++) { + + /* + * Generate an initial value for walking ones test + * to test for bad data bits + */ + + Val = ~(1U << j); + + /* + * START walking zeros test + * Write a one to each data bit indifferent locations + */ + + for (I = 0U; I < (u32)32; I++) { + /* write memory location */ + *(Addr+I) = Val; + Val = ~((u32)RotateLeft(~Val, 32U)); + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + + Val = ~(1U << j); + + /* Read the values from each location that was + * written */ + for (I = 0U; I < (u32)32; I++) { + /* read memory location */ + WordMem32 = *(Addr+I); + if (WordMem32 != Val) { + Status = -1; + goto End_Label; + } + Val = ~((u32)RotateLeft(~Val, 32U)); + } + + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_INVERSEADDR)) { + /* Fill the memory with inverse of address */ + for (I = 0U; I < Words; I++) { + /* write memory location */ + Val = (u32) (~((INTPTR) (&Addr[I]))); + *(Addr+I) = Val; + } + + /* + * Check every word within the words + * of tested memory + */ + + for (I = 0U; I < Words; I++) { + /* Read the location */ + WordMem32 = *(Addr+I); + Val = (u32) (~((INTPTR) (&Addr[I]))); + + if ((WordMem32 ^ Val) != 0x00000000U) { + Status = -1; + goto End_Label; + } + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_FIXEDPATTERN)) { + /* + * Generate an initial value for + * memory testing + */ + + if (Pattern == (u32)0) { + Val = 0xDEADBEEFU; + } + else { + Val = Pattern; + } + + /* + * Fill the memory with fixed Pattern + */ + + for (I = 0U; 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 = 0U; I < Words; I++) { + + /* read memory location */ + + WordMem32 = *(Addr+I); + if (WordMem32 != Val) { + Status = -1; + goto End_Label; + } + } + } + +End_Label: + return Status; +} + +/*****************************************************************************/ +/** +* +* @brief Perform a destructive 16-bit wide memory test. +* +* @param Addr: pointer to the region of memory to be tested. +* @param Words: length of the block. +* @param Pattern: constant used for the constant Pattern test, if 0, +* 0xDEADBEEF is used. +* @param Subtest: type of 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. +* +*****************************************************************************/ +s32 Xil_TestMem16(u16 *Addr, u32 Words, u16 Pattern, u8 Subtest) +{ + u32 I; + u32 j; + u16 Val; + u16 FirtVal; + u16 WordMem16; + s32 Status = 0; + + Xil_AssertNonvoid(Words != (u32)0); + Xil_AssertNonvoid(Subtest <= XIL_TESTMEM_MAXTEST); + Xil_AssertNonvoid(Addr != NULL); + + /* + * variable initialization + */ + Val = XIL_TESTMEM_INIT_VALUE; + FirtVal = XIL_TESTMEM_INIT_VALUE; + + /* + * selectthe proper Subtest(s) + */ + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_INCREMENT)) { + /* + * Fill the memory with incrementing + * values starting from 'FirtVal' + */ + for (I = 0U; 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 = 0U; I < Words; I++) { + /* read memory location */ + WordMem16 = *(Addr+I); + if (WordMem16 != Val) { + Status = -1; + goto End_Label; + } + Val++; + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_WALKONES)) { + /* + * set up to cycle through all possible initial test + * Patterns for walking ones test + */ + + for (j = 0U; j < (u32)16; j++) { + /* + * Generate an initial value for walking ones test + * to test for bad data bits + */ + + Val = (u16)((u32)1 << j); + /* + * START walking ones test + * Write a one to each data bit indifferent locations + */ + + for (I = 0U; I < (u32)16; I++) { + /* write memory location */ + *(Addr+I) = Val; + Val = (u16)RotateLeft(Val, 16U); + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = (u16)((u32)1 << j); + /* Read the values from each location that was written */ + for (I = 0U; I < (u32)16; I++) { + /* read memory location */ + WordMem16 = *(Addr+I); + if (WordMem16 != Val) { + Status = -1; + goto End_Label; + } + Val = (u16)RotateLeft(Val, 16U); + } + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_WALKZEROS)) { + /* + * set up to cycle through all possible initial + * test Patterns for walking zeros test + */ + + for (j = 0U; j < (u32)16; j++) { + /* + * Generate an initial value for walking ones + * test to test for bad + * data bits + */ + + Val = ~(1U << j); + /* + * START walking zeros test + * Write a one to each data bit indifferent locations + */ + + for (I = 0U; I < (u32)16; I++) { + /* write memory location */ + *(Addr+I) = Val; + Val = ~((u16)RotateLeft(~Val, 16U)); + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = ~(1U << j); + /* Read the values from each location that was written */ + for (I = 0U; I < (u32)16; I++) { + /* read memory location */ + WordMem16 = *(Addr+I); + if (WordMem16 != Val) { + Status = -1; + goto End_Label; + } + Val = ~((u16)RotateLeft(~Val, 16U)); + } + + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_INVERSEADDR)) { + /* Fill the memory with inverse of address */ + for (I = 0U; I < Words; I++) { + /* write memory location */ + Val = (u16) (~((INTPTR)(&Addr[I]))); + *(Addr+I) = Val; + } + /* + * Check every word within the words + * of tested memory + */ + + for (I = 0U; I < Words; I++) { + /* read memory location */ + WordMem16 = *(Addr+I); + Val = (u16) (~((INTPTR) (&Addr[I]))); + if ((WordMem16 ^ Val) != 0x0000U) { + Status = -1; + goto End_Label; + } + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_FIXEDPATTERN)) { + /* + * Generate an initial value for + * memory testing + */ + if (Pattern == (u16)0) { + Val = 0xDEADU; + } + else { + Val = Pattern; + } + + /* + * Fill the memory with fixed pattern + */ + + for (I = 0U; 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 = 0U; I < Words; I++) { + /* read memory location */ + WordMem16 = *(Addr+I); + if (WordMem16 != Val) { + Status = -1; + goto End_Label; + } + } + } + +End_Label: + return Status; +} + + +/*****************************************************************************/ +/** +* +* @brief Perform a destructive 8-bit wide memory test. +* +* @param Addr: pointer to the region of memory to be tested. +* @param Words: length of the block. +* @param Pattern: constant used for the constant pattern test, if 0, +* 0xDEADBEEF is used. +* @param Subtest: type of 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. +* +*****************************************************************************/ +s32 Xil_TestMem8(u8 *Addr, u32 Words, u8 Pattern, u8 Subtest) +{ + u32 I; + u32 j; + u8 Val; + u8 FirtVal; + u8 WordMem8; + s32 Status = 0; + + Xil_AssertNonvoid(Words != (u32)0); + Xil_AssertNonvoid(Subtest <= XIL_TESTMEM_MAXTEST); + Xil_AssertNonvoid(Addr != NULL); + + /* + * variable initialization + */ + Val = XIL_TESTMEM_INIT_VALUE; + FirtVal = XIL_TESTMEM_INIT_VALUE; + + /* + * select the proper Subtest(s) + */ + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_INCREMENT)) { + /* + * Fill the memory with incrementing + * values starting from 'FirtVal' + */ + for (I = 0U; 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 = 0U; I < Words; I++) { + /* read memory location */ + WordMem8 = *(Addr+I); + if (WordMem8 != Val) { + Status = -1; + goto End_Label; + } + Val++; + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_WALKONES)) { + /* + * set up to cycle through all possible initial + * test Patterns for walking ones test + */ + + for (j = 0U; j < (u32)8; j++) { + /* + * Generate an initial value for walking ones test + * to test for bad data bits + */ + Val = (u8)((u32)1 << j); + /* + * START walking ones test + * Write a one to each data bit indifferent locations + */ + for (I = 0U; I < (u32)8; I++) { + /* write memory location */ + *(Addr+I) = Val; + Val = (u8)RotateLeft(Val, 8U); + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = (u8)((u32)1 << j); + /* Read the values from each location that was written */ + for (I = 0U; I < (u32)8; I++) { + /* read memory location */ + WordMem8 = *(Addr+I); + if (WordMem8 != Val) { + Status = -1; + goto End_Label; + } + Val = (u8)RotateLeft(Val, 8U); + } + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_WALKZEROS)) { + /* + * set up to cycle through all possible initial test + * Patterns for walking zeros test + */ + + for (j = 0U; j < (u32)8; j++) { + /* + * Generate an initial value for walking ones test to test + * for bad data bits + */ + Val = ~(1U << j); + /* + * START walking zeros test + * Write a one to each data bit indifferent locations + */ + for (I = 0U; I < (u32)8; I++) { + /* write memory location */ + *(Addr+I) = Val; + Val = ~((u8)RotateLeft(~Val, 8U)); + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = ~(1U << j); + /* Read the values from each location that was written */ + for (I = 0U; I < (u32)8; I++) { + /* read memory location */ + WordMem8 = *(Addr+I); + if (WordMem8 != Val) { + Status = -1; + goto End_Label; + } + + Val = ~((u8)RotateLeft(~Val, 8U)); + } + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_INVERSEADDR)) { + /* Fill the memory with inverse of address */ + for (I = 0U; I < Words; I++) { + /* write memory location */ + Val = (u8) (~((INTPTR) (&Addr[I]))); + *(Addr+I) = Val; + } + + /* + * Check every word within the words + * of tested memory + */ + + for (I = 0U; I < Words; I++) { + /* read memory location */ + WordMem8 = *(Addr+I); + Val = (u8) (~((INTPTR) (&Addr[I]))); + if ((WordMem8 ^ Val) != 0x00U) { + Status = -1; + goto End_Label; + } + } + } + + if((Subtest == XIL_TESTMEM_ALLMEMTESTS) || (Subtest == XIL_TESTMEM_FIXEDPATTERN)) { + /* + * Generate an initial value for + * memory testing + */ + + if (Pattern == (u8)0) { + Val = 0xA5U; + } + else { + Val = Pattern; + } + /* + * Fill the memory with fixed Pattern + */ + for (I = 0U; 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 = 0U; I < Words; I++) { + /* read memory location */ + WordMem8 = *(Addr+I); + if (WordMem8 != Val) { + Status = -1; + goto End_Label; + } + } + } + +End_Label: + return Status; +} + + +/*****************************************************************************/ +/** +* +* @brief 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 +* +* +*****************************************************************************/ +static u32 RotateLeft(u32 Input, u8 Width) +{ + u32 Msb; + u32 ReturnVal; + u32 WidthMask; + u32 MsbMask; + u32 LocalInput = Input; + + /* + * set up the WidthMask and the MsbMask + */ + + MsbMask = 1U << (Width - 1U); + + WidthMask = (MsbMask << (u32)1) - (u32)1; + + /* + * set the Width of the Input to the correct width + */ + + LocalInput = LocalInput & WidthMask; + + Msb = LocalInput & MsbMask; + + ReturnVal = LocalInput << 1U; + + if (Msb != 0x00000000U) { + ReturnVal = ReturnVal | (u32)0x00000001; + } + + ReturnVal = ReturnVal & WidthMask; + + return ReturnVal; + +} + +#ifdef ROTATE_RIGHT +/*****************************************************************************/ +/** +* +* @brief Rotates the provided value to the right one bit position +* +* @param Input: value to be rotated to the right +* @param Width: number of bits in the input data +* +* @return +* The resulting u32 value of the rotate right +* +*****************************************************************************/ +static u32 RotateRight(u32 Input, u8 Width) +{ + u32 Lsb; + u32 ReturnVal; + u32 WidthMask; + u32 MsbMask; + u32 LocalInput = Input; + /* + * set up the WidthMask and the MsbMask + */ + + MsbMask = 1U << (Width - 1U); + + WidthMask = (MsbMask << 1U) - 1U; + + /* + * set the width of the input to the correct width + */ + + LocalInput = LocalInput & WidthMask; + + ReturnVal = LocalInput >> 1U; + + Lsb = LocalInput & 0x00000001U; + + if (Lsb != 0x00000000U) { + ReturnVal = ReturnVal | MsbMask; + } + + ReturnVal = ReturnVal & WidthMask; + + return ReturnVal; + +} +#endif /* ROTATE_RIGHT */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testmem.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testmem.h new file mode 100644 index 0000000..c204728 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_testmem.h @@ -0,0 +1,158 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testmem.h +* @addtogroup common_test_utils +* +*

    Memory test

    +* +* The xil_testmem.h file contains utility functions to test memory. +* 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. +* Following list describes the supported memory tests: +* +* - XIL_TESTMEM_ALLMEMTESTS: This test runs all of the subtests. +* +* - XIL_TESTMEM_INCREMENT: This test +* starts at 'XIL_TESTMEM_INIT_VALUE' and uses the incrementing value as the +* test value for memory. +* +* - XIL_TESTMEM_WALKONES: Also known as the Walking ones test. This test +* uses a walking '1' as the test value for memory. +* @code +* location 1 = 0x00000001 +* location 2 = 0x00000002 +* ... +* @endcode +* +* - XIL_TESTMEM_WALKZEROS: Also known as the Walking zero's test. +* This test uses the inverse value of the walking ones test +* as the test value for memory. +* @code +* location 1 = 0xFFFFFFFE +* location 2 = 0xFFFFFFFD +* ... +*@endcode +* +* - XIL_TESTMEM_INVERSEADDR: Also known as the 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: Also known as the 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". +* +* @warning +* The tests are DESTRUCTIVE. 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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver    Who    Date    Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a hbm  08/25/09 First release
    +* 
    +* +******************************************************************************/ + +#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 1U + +/** @name Memory subtests + * @{ + */ +/** + * See the detailed description of the subtests in the file description. + */ +#define XIL_TESTMEM_ALLMEMTESTS 0x00U +#define XIL_TESTMEM_INCREMENT 0x01U +#define XIL_TESTMEM_WALKONES 0x02U +#define XIL_TESTMEM_WALKZEROS 0x03U +#define XIL_TESTMEM_INVERSEADDR 0x04U +#define XIL_TESTMEM_FIXEDPATTERN 0x05U +#define XIL_TESTMEM_MAXTEST XIL_TESTMEM_FIXEDPATTERN +/* @} */ + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/* xutil_testmem prototypes */ + +extern s32 Xil_TestMem32(u32 *Addr, u32 Words, u32 Pattern, u8 Subtest); +extern s32 Xil_TestMem16(u16 *Addr, u32 Words, u16 Pattern, u8 Subtest); +extern s32 Xil_TestMem8(u8 *Addr, u32 Words, u8 Pattern, u8 Subtest); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_test_utils". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_types.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_types.h new file mode 100644 index 0000000..8143aff --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xil_types.h @@ -0,0 +1,209 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_types.h +* +* @addtogroup common_types Basic Data types for Xilinx® Software IP +* +* The xil_types.h file contains basic types for Xilinx software IP. These data types +* are applicable for all processors supported by Xilinx. +* @{ +*
    +* 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
    +* 5.00 	pkp  05/29/14 Made changes for 64 bit architecture
    +*	srt  07/14/14 Use standard definitions from stdint.h and stddef.h
    +*		      Define LONG and ULONG datatypes and mask values
    +* 
    +* +******************************************************************************/ + +#ifndef XIL_TYPES_H /* prevent circular inclusions */ +#define XIL_TYPES_H /* by using protection macros */ + +#include +#include + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +# define TRUE 1U +#endif + +#ifndef FALSE +# define FALSE 0U +#endif + +#ifndef NULL +#define NULL 0U +#endif + +#define XIL_COMPONENT_IS_READY 0x11111111U /**< In device drivers, This macro will be + assigend to "IsReady" member of driver + instance to indicate that driver + instance is initialized and ready to use. */ +#define XIL_COMPONENT_IS_STARTED 0x22222222U /**< In device drivers, This macro will be assigend to + "IsStarted" member of driver instance + to indicate that driver instance is + started and it can be enabled. */ + +/* @name New types + * New simple types. + * @{ + */ +#ifndef __KERNEL__ +#ifndef XBASIC_TYPES_H +/* + * guarded against xbasic_types.h. + */ +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +/** @}*/ +#define __XUINT64__ +typedef struct +{ + u32 Upper; + u32 Lower; +} Xuint64; + + +/*****************************************************************************/ +/** +* @brief 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. +* +******************************************************************************/ +#define XUINT64_MSW(x) ((x).Upper) + +/*****************************************************************************/ +/** +* @brief 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. +* +******************************************************************************/ +#define XUINT64_LSW(x) ((x).Lower) + +#endif /* XBASIC_TYPES_H */ + +/* + * xbasic_types.h does not typedef s* or u64 + */ +/** @{ */ +typedef char char8; +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; +typedef uint64_t u64; +typedef int sint32; + +typedef intptr_t INTPTR; +typedef uintptr_t UINTPTR; +typedef ptrdiff_t PTRDIFF; +/** @}*/ +#if !defined(LONG) || !defined(ULONG) +typedef long LONG; +typedef unsigned long ULONG; +#endif + +#define ULONG64_HI_MASK 0xFFFFFFFF00000000U +#define ULONG64_LO_MASK ~ULONG64_HI_MASK + +#else +#include +#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); + +/** + * @brief Returns 32-63 bits of a number. + * @param n : Number being accessed. + * @return Bits 32-63 of number. + * + * @note A basic shift-right of a 64- or 32-bit quantity. + * Use this to suppress the "right shift count >= width of type" + * warning when that quantity is 32-bits. + */ +#define UPPER_32_BITS(n) ((u32)(((n) >> 16) >> 16)) + +/** + * @brief Returns 0-31 bits of a number + * @param n : Number being accessed. + * @return Bits 0-31 of number + */ +#define LOWER_32_BITS(n) ((u32)(n)) + + + + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +#define TRUE 1U +#endif + +#ifndef FALSE +#define FALSE 0U +#endif + +#ifndef NULL +#define NULL 0U +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_types". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc.h new file mode 100644 index 0000000..735e26d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc.h @@ -0,0 +1,172 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xl2cc.h +* +* This file contains the address definitions for the PL310 Level-2 Cache +* Controller. +* +*
    +* 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
    +* 
    +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _XL2CC_H_ +#define _XL2CC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ +/* L2CC Register Offsets */ +#define XPS_L2CC_ID_OFFSET 0x0000U +#define XPS_L2CC_TYPE_OFFSET 0x0004U +#define XPS_L2CC_CNTRL_OFFSET 0x0100U +#define XPS_L2CC_AUX_CNTRL_OFFSET 0x0104U +#define XPS_L2CC_TAG_RAM_CNTRL_OFFSET 0x0108U +#define XPS_L2CC_DATA_RAM_CNTRL_OFFSET 0x010CU + +#define XPS_L2CC_EVNT_CNTRL_OFFSET 0x0200U +#define XPS_L2CC_EVNT_CNT1_CTRL_OFFSET 0x0204U +#define XPS_L2CC_EVNT_CNT0_CTRL_OFFSET 0x0208U +#define XPS_L2CC_EVNT_CNT1_VAL_OFFSET 0x020CU +#define XPS_L2CC_EVNT_CNT0_VAL_OFFSET 0x0210U + +#define XPS_L2CC_IER_OFFSET 0x0214U /* Interrupt Mask */ +#define XPS_L2CC_IPR_OFFSET 0x0218U /* Masked interrupt status */ +#define XPS_L2CC_ISR_OFFSET 0x021CU /* Raw Interrupt Status */ +#define XPS_L2CC_IAR_OFFSET 0x0220U /* Interrupt Clear */ + +#define XPS_L2CC_CACHE_SYNC_OFFSET 0x0730U /* Cache Sync */ +#define XPS_L2CC_DUMMY_CACHE_SYNC_OFFSET 0x0740U /* Dummy Register for Cache Sync */ +#define XPS_L2CC_CACHE_INVLD_PA_OFFSET 0x0770U /* Cache Invalid by PA */ +#define XPS_L2CC_CACHE_INVLD_WAY_OFFSET 0x077CU /* Cache Invalid by Way */ +#define XPS_L2CC_CACHE_CLEAN_PA_OFFSET 0x07B0U /* Cache Clean by PA */ +#define XPS_L2CC_CACHE_CLEAN_INDX_OFFSET 0x07B8U /* Cache Clean by Index */ +#define XPS_L2CC_CACHE_CLEAN_WAY_OFFSET 0x07BCU /* Cache Clean by Way */ +#define XPS_L2CC_CACHE_INV_CLN_PA_OFFSET 0x07F0U /* Cache Invalidate and Clean by PA */ +#define XPS_L2CC_CACHE_INV_CLN_INDX_OFFSET 0x07F8U /* Cache Invalidate and Clean by Index */ +#define XPS_L2CC_CACHE_INV_CLN_WAY_OFFSET 0x07FCU /* Cache Invalidate and Clean by Way */ + +#define XPS_L2CC_CACHE_DLCKDWN_0_WAY_OFFSET 0x0900U /* Cache Data Lockdown 0 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_0_WAY_OFFSET 0x0904U /* Cache Instruction Lockdown 0 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_1_WAY_OFFSET 0x0908U /* Cache Data Lockdown 1 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_1_WAY_OFFSET 0x090CU /* Cache Instruction Lockdown 1 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_2_WAY_OFFSET 0x0910U /* Cache Data Lockdown 2 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_2_WAY_OFFSET 0x0914U /* Cache Instruction Lockdown 2 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_3_WAY_OFFSET 0x0918U /* Cache Data Lockdown 3 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_3_WAY_OFFSET 0x091CU /* Cache Instruction Lockdown 3 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_4_WAY_OFFSET 0x0920U /* Cache Data Lockdown 4 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_4_WAY_OFFSET 0x0924U /* Cache Instruction Lockdown 4 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_5_WAY_OFFSET 0x0928U /* Cache Data Lockdown 5 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_5_WAY_OFFSET 0x092CU /* Cache Instruction Lockdown 5 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_6_WAY_OFFSET 0x0930U /* Cache Data Lockdown 6 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_6_WAY_OFFSET 0x0934U /* Cache Instruction Lockdown 6 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_7_WAY_OFFSET 0x0938U /* Cache Data Lockdown 7 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_7_WAY_OFFSET 0x093CU /* Cache Instruction Lockdown 7 by Way */ + +#define XPS_L2CC_CACHE_LCKDWN_LINE_ENABLE_OFFSET 0x0950U /* Cache Lockdown Line Enable */ +#define XPS_L2CC_CACHE_UUNLOCK_ALL_WAY_OFFSET 0x0954U /* Cache Unlock All Lines by Way */ + +#define XPS_L2CC_ADDR_FILTER_START_OFFSET 0x0C00U /* Start of address filtering */ +#define XPS_L2CC_ADDR_FILTER_END_OFFSET 0x0C04U /* Start of address filtering */ + +#define XPS_L2CC_DEBUG_CTRL_OFFSET 0x0F40U /* Debug Control Register */ + +/* XPS_L2CC_CNTRL_OFFSET bit masks */ +#define XPS_L2CC_ENABLE_MASK 0x00000001U /* enables the L2CC */ + +/* XPS_L2CC_AUX_CNTRL_OFFSET bit masks */ +#define XPS_L2CC_AUX_EBRESPE_MASK 0x40000000U /* Early BRESP Enable */ +#define XPS_L2CC_AUX_IPFE_MASK 0x20000000U /* Instruction Prefetch Enable */ +#define XPS_L2CC_AUX_DPFE_MASK 0x10000000U /* Data Prefetch Enable */ +#define XPS_L2CC_AUX_NSIC_MASK 0x08000000U /* Non-secure interrupt access control */ +#define XPS_L2CC_AUX_NSLE_MASK 0x04000000U /* Non-secure lockdown enable */ +#define XPS_L2CC_AUX_CRP_MASK 0x02000000U /* Cache replacement policy */ +#define XPS_L2CC_AUX_FWE_MASK 0x01800000U /* Force write allocate */ +#define XPS_L2CC_AUX_SAOE_MASK 0x00400000U /* Shared attribute override enable */ +#define XPS_L2CC_AUX_PE_MASK 0x00200000U /* Parity enable */ +#define XPS_L2CC_AUX_EMBE_MASK 0x00100000U /* Event monitor bus enable */ +#define XPS_L2CC_AUX_WAY_SIZE_MASK 0x000E0000U /* Way-size */ +#define XPS_L2CC_AUX_ASSOC_MASK 0x00010000U /* Associativity */ +#define XPS_L2CC_AUX_SAIE_MASK 0x00002000U /* Shared attribute invalidate enable */ +#define XPS_L2CC_AUX_EXCL_CACHE_MASK 0x00001000U /* Exclusive cache configuration */ +#define XPS_L2CC_AUX_SBDLE_MASK 0x00000800U /* Store buffer device limitation Enable */ +#define XPS_L2CC_AUX_HPSODRE_MASK 0x00000400U /* High Priority for SO and Dev Reads Enable */ +#define XPS_L2CC_AUX_FLZE_MASK 0x00000001U /* Full line of zero enable */ + +#define XPS_L2CC_AUX_REG_DEFAULT_MASK 0x72360000U /* Enable all prefetching, */ + /* Cache replacement policy, Parity enable, */ + /* Event monitor bus enable and Way Size (64 KB) */ +#define XPS_L2CC_AUX_REG_ZERO_MASK 0xFFF1FFFFU /* */ + +#define XPS_L2CC_TAG_RAM_DEFAULT_MASK 0x00000111U /* latency for TAG RAM */ +#define XPS_L2CC_DATA_RAM_DEFAULT_MASK 0x00000121U /* latency for DATA RAM */ + +/* Interrupt bit masks */ +#define XPS_L2CC_IXR_DECERR_MASK 0x00000100U /* DECERR from L3 */ +#define XPS_L2CC_IXR_SLVERR_MASK 0x00000080U /* SLVERR from L3 */ +#define XPS_L2CC_IXR_ERRRD_MASK 0x00000040U /* Error on L2 data RAM (Read) */ +#define XPS_L2CC_IXR_ERRRT_MASK 0x00000020U /* Error on L2 tag RAM (Read) */ +#define XPS_L2CC_IXR_ERRWD_MASK 0x00000010U /* Error on L2 data RAM (Write) */ +#define XPS_L2CC_IXR_ERRWT_MASK 0x00000008U /* Error on L2 tag RAM (Write) */ +#define XPS_L2CC_IXR_PARRD_MASK 0x00000004U /* Parity Error on L2 data RAM (Read) */ +#define XPS_L2CC_IXR_PARRT_MASK 0x00000002U /* Parity Error on L2 tag RAM (Read) */ +#define XPS_L2CC_IXR_ECNTR_MASK 0x00000001U /* Event Counter1/0 Overflow Increment */ + +/* Address filtering mask and enable bit */ +#define XPS_L2CC_ADDR_FILTER_VALID_MASK 0xFFF00000U /* Address filtering valid bits*/ +#define XPS_L2CC_ADDR_FILTER_ENABLE_MASK 0x00000001U /* Address filtering enable bit*/ + +/* Debug control bits */ +#define XPS_L2CC_DEBUG_SPIDEN_MASK 0x00000004U /* Debug SPIDEN bit */ +#define XPS_L2CC_DEBUG_DWB_MASK 0x00000002U /* Debug DWB bit, forces write through */ +#define XPS_L2CC_DEBUG_DCL_MASK 0x00000002U /* Debug DCL bit, disables cache line fill */ + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc_counter.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc_counter.c new file mode 100644 index 0000000..d6b88cb --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc_counter.c @@ -0,0 +1,169 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @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. +* +*
    +* 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
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include +#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); + +/******************************************************************************/ + +/****************************************************************************/ +/** +* +* @brief This function initializes the event counters in L2 Cache controller +* with a set of event codes specified by the user. +* +* @param Event0: Event code for counter 0. +* @param Event1: Event code for counter 1. +* +* @return None. +* +* @note The definitions for event codes XL2CC_* can be found in +* xl2cc_counter.h. +* +*****************************************************************************/ +void XL2cc_EventCtrInit(s32 Event0, s32 Event1) +{ + + /* Write event code into cnt1 cfg reg */ + *((volatile u32*)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNT1_CTRL_OFFSET)) = (((u32)Event1) << 2); + + /* Write event code into cnt0 cfg reg */ + *((volatile u32*)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNT0_CTRL_OFFSET)) = (((u32)Event0) << 2); + + /* Reset counters */ + XL2cc_EventCtrReset(); +} + + +/****************************************************************************/ +/** +* +* @brief This function starts the event counters in L2 Cache controller. +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XL2cc_EventCtrStart(void) +{ + u32 *LocalPtr; + LocalPtr = (u32 *)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNTRL_OFFSET); + XL2cc_EventCtrReset(); + + /* Enable counter */ + /* *((volatile u32*)((void *)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNTRL_OFFSET))) = 1 */ + *LocalPtr = (u32)1; +} + +/****************************************************************************/ +/** +* +* @brief This function disables the event counters in L2 Cache controller, +* saves the counter values and resets the counters. +* +* @param EveCtr0: Output parameter which is used to return the value +* in event counter 0. +* EveCtr1: 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)) = 0U; + + /* 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(); +} + +/****************************************************************************/ +/** +* +* @brief 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)) = 0x6U; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc_counter.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc_counter.h new file mode 100644 index 0000000..8d0a61f --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xl2cc_counter.h @@ -0,0 +1,113 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xl2cc_counter.h +* +* @addtogroup l2_event_counter_apis PL310 L2 Event Counters Functions +* +* xl2cc_counter.h contains APIs for configuring and controlling the event +* counters in PL310 L2 cache controller. +* PL310 has two event counters which can be used to count variety of events +* like DRHIT, DRREQ, DWHIT, DWREQ, etc. xl2cc_counter.h contains definitions +* for different configurations which can be used for the event counters to +* count a set of events. +* +* +* @{ +* +*
    +* 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
    +* 
    +* +******************************************************************************/ + +#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(s32 Event0, s32 Event1); +void XL2cc_EventCtrStart(void); +void XL2cc_EventCtrStop(u32 *EveCtr0, u32 *EveCtr1); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* L2CCCOUNTER_H */ +/** +* @} End of "addtogroup l2_event_counter_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xparameters_ps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xparameters_ps.h new file mode 100644 index 0000000..0fa7771 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xparameters_ps.h @@ -0,0 +1,338 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xparameters_ps.h +* +* This file contains the address definitions for the hard peripherals +* attached to the ARM Cortex A9 core. +* +*
    +* 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
    +* 5.0	pkp		01/16/15 Added interrupt ID definition of ttc for TEST APP
    +* 6.6   srm     10/18/17 Added ARMA9 macro to identify CortexA9
    +*
    +* 
    +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _XPARAMETERS_PS_H_ +#define _XPARAMETERS_PS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/**************************** Include Files *******************************/ + + +/************************** Constant Definitions *****************************/ + +/* + * This block contains constant declarations for the peripherals + * within the hardblock + */ + +/* Canonical definitions for DDR MEMORY */ +#define XPAR_DDR_MEM_BASEADDR 0x00000000U +#define XPAR_DDR_MEM_HIGHADDR 0x3FFFFFFFU + +/* 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 1U +#define XPAR_XSLCR_0_DEVICE_ID 0U +#define XPAR_XSLCR_0_BASEADDR XPS_SYS_CTRL_BASEADDR + +/* Canonical definitions for SCU GIC */ +#define XPAR_SCUGIC_NUM_INSTANCES 1U +#define XPAR_SCUGIC_SINGLE_DEVICE_ID 0U +#define XPAR_SCUGIC_CPU_BASEADDR (XPS_SCU_PERIPH_BASE + 0x00000100U) +#define XPAR_SCUGIC_DIST_BASEADDR (XPS_SCU_PERIPH_BASE + 0x00001000U) +#define XPAR_SCUGIC_ACK_BEFORE 0U + +/* Canonical definitions for Global Timer */ +#define XPAR_GLOBAL_TMR_NUM_INSTANCES 1U +#define XPAR_GLOBAL_TMR_DEVICE_ID 0U +#define XPAR_GLOBAL_TMR_BASEADDR (XPS_SCU_PERIPH_BASE + 0x00000200U) +#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 0xE0000000U +#define XPS_UART0_BASEADDR 0xE0000000U +#define XPS_UART1_BASEADDR 0xE0001000U +#define XPS_USB0_BASEADDR 0xE0002000U +#define XPS_USB1_BASEADDR 0xE0003000U +#define XPS_I2C0_BASEADDR 0xE0004000U +#define XPS_I2C1_BASEADDR 0xE0005000U +#define XPS_SPI0_BASEADDR 0xE0006000U +#define XPS_SPI1_BASEADDR 0xE0007000U +#define XPS_CAN0_BASEADDR 0xE0008000U +#define XPS_CAN1_BASEADDR 0xE0009000U +#define XPS_GPIO_BASEADDR 0xE000A000U +#define XPS_GEM0_BASEADDR 0xE000B000U +#define XPS_GEM1_BASEADDR 0xE000C000U +#define XPS_QSPI_BASEADDR 0xE000D000U +#define XPS_PARPORT_CRTL_BASEADDR 0xE000E000U +#define XPS_SDIO0_BASEADDR 0xE0100000U +#define XPS_SDIO1_BASEADDR 0xE0101000U +#define XPS_IOU_BUS_CFG_BASEADDR 0xE0200000U +#define XPS_NAND_BASEADDR 0xE1000000U +#define XPS_PARPORT0_BASEADDR 0xE2000000U +#define XPS_PARPORT1_BASEADDR 0xE4000000U +#define XPS_QSPI_LINEAR_BASEADDR 0xFC000000U +#define XPS_SYS_CTRL_BASEADDR 0xF8000000U /* AKA SLCR */ +#define XPS_TTC0_BASEADDR 0xF8001000U +#define XPS_TTC1_BASEADDR 0xF8002000U +#define XPS_DMAC0_SEC_BASEADDR 0xF8003000U +#define XPS_DMAC0_NON_SEC_BASEADDR 0xF8004000U +#define XPS_WDT_BASEADDR 0xF8005000U +#define XPS_DDR_CTRL_BASEADDR 0xF8006000U +#define XPS_DEV_CFG_APB_BASEADDR 0xF8007000U +#define XPS_AFI0_BASEADDR 0xF8008000U +#define XPS_AFI1_BASEADDR 0xF8009000U +#define XPS_AFI2_BASEADDR 0xF800A000U +#define XPS_AFI3_BASEADDR 0xF800B000U +#define XPS_OCM_BASEADDR 0xF800C000U +#define XPS_EFUSE_BASEADDR 0xF800D000U +#define XPS_CORESIGHT_BASEADDR 0xF8800000U +#define XPS_TOP_BUS_CFG_BASEADDR 0xF8900000U +#define XPS_SCU_PERIPH_BASE 0xF8F00000U +#define XPS_L2CC_BASEADDR 0xF8F02000U +#define XPS_SAM_RAM_BASEADDR 0xFFFC0000U +#define XPS_FPGA_AXI_S0_BASEADDR 0x40000000U +#define XPS_FPGA_AXI_S1_BASEADDR 0x80000000U +#define XPS_IOU_S_SWITCH_BASEADDR 0xE0000000U +#define XPS_PERIPH_APB_BASEADDR 0xF8000000U + +/* Shared Peripheral Interrupts (SPI) */ +#define XPS_CORE_PARITY0_INT_ID 32U +#define XPS_CORE_PARITY1_INT_ID 33U +#define XPS_L2CC_INT_ID 34U +#define XPS_OCMINTR_INT_ID 35U +#define XPS_ECC_INT_ID 36U +#define XPS_PMU0_INT_ID 37U +#define XPS_PMU1_INT_ID 38U +#define XPS_SYSMON_INT_ID 39U +#define XPS_DVC_INT_ID 40U +#define XPS_WDT_INT_ID 41U +#define XPS_TTC0_0_INT_ID 42U +#define XPS_TTC0_1_INT_ID 43U +#define XPS_TTC0_2_INT_ID 44U +#define XPS_DMA0_ABORT_INT_ID 45U +#define XPS_DMA0_INT_ID 46U +#define XPS_DMA1_INT_ID 47U +#define XPS_DMA2_INT_ID 48U +#define XPS_DMA3_INT_ID 49U +#define XPS_SMC_INT_ID 50U +#define XPS_QSPI_INT_ID 51U +#define XPS_GPIO_INT_ID 52U +#define XPS_USB0_INT_ID 53U +#define XPS_GEM0_INT_ID 54U +#define XPS_GEM0_WAKE_INT_ID 55U +#define XPS_SDIO0_INT_ID 56U +#define XPS_I2C0_INT_ID 57U +#define XPS_SPI0_INT_ID 58U +#define XPS_UART0_INT_ID 59U +#define XPS_CAN0_INT_ID 60U +#define XPS_FPGA0_INT_ID 61U +#define XPS_FPGA1_INT_ID 62U +#define XPS_FPGA2_INT_ID 63U +#define XPS_FPGA3_INT_ID 64U +#define XPS_FPGA4_INT_ID 65U +#define XPS_FPGA5_INT_ID 66U +#define XPS_FPGA6_INT_ID 67U +#define XPS_FPGA7_INT_ID 68U +#define XPS_TTC1_0_INT_ID 69U +#define XPS_TTC1_1_INT_ID 70U +#define XPS_TTC1_2_INT_ID 71U +#define XPS_DMA4_INT_ID 72U +#define XPS_DMA5_INT_ID 73U +#define XPS_DMA6_INT_ID 74U +#define XPS_DMA7_INT_ID 75U +#define XPS_USB1_INT_ID 76U +#define XPS_GEM1_INT_ID 77U +#define XPS_GEM1_WAKE_INT_ID 78U +#define XPS_SDIO1_INT_ID 79U +#define XPS_I2C1_INT_ID 80U +#define XPS_SPI1_INT_ID 81U +#define XPS_UART1_INT_ID 82U +#define XPS_CAN1_INT_ID 83U +#define XPS_FPGA8_INT_ID 84U +#define XPS_FPGA9_INT_ID 85U +#define XPS_FPGA10_INT_ID 86U +#define XPS_FPGA11_INT_ID 87U +#define XPS_FPGA12_INT_ID 88U +#define XPS_FPGA13_INT_ID 89U +#define XPS_FPGA14_INT_ID 90U +#define XPS_FPGA15_INT_ID 91U + +/* Private Peripheral Interrupts (PPI) */ +#define XPS_GLOBAL_TMR_INT_ID 27U /* SCU Global Timer interrupt */ +#define XPS_FIQ_INT_ID 28U /* FIQ from FPGA fabric */ +#define XPS_SCU_TMR_INT_ID 29U /* SCU Private Timer interrupt */ +#define XPS_SCU_WDT_INT_ID 30U /* SCU Private WDT interrupt */ +#define XPS_IRQ_INT_ID 31U /* 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_PS7_TTC_0_INTR XPS_TTC0_0_INT_ID +#define XPAR_PS7_TTC_1_INTR XPS_TTC0_1_INT_ID +#define XPAR_PS7_TTC_2_INTR XPS_TTC0_2_INT_ID +#define XPAR_PS7_TTC_3_INTR XPS_TTC1_0_INT_ID +#define XPAR_PS7_TTC_4_INTR XPS_TTC1_1_INT_ID +#define XPAR_PS7_TTC_5_INTR XPS_TTC1_2_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 0U +#define XPAR_SCUWDT_DEVICE_ID 0U + + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xplatform_info.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xplatform_info.c new file mode 100644 index 0000000..2c08e5f --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xplatform_info.c @@ -0,0 +1,161 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xplatform_info.c +* +* This file contains information about hardware for which the code is built +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date   Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 5.00  pkp  12/15/14 Initial release
    +* 5.04  pkp  01/12/16 Added platform information support for Cortex-A53 32bit
    +*					  mode
    +* 6.00  mus  17/08/16 Removed unused variable from XGetPlatform_Info
    +* 6.4   ms   05/23/17 Added PSU_PMU macro to support XGetPSVersion_Info
    +*                     function for PMUFW.
    +*       ms   06/13/17 Added PSU_PMU macro to provide support of
    +*                     XGetPlatform_Info function for PMUFW.
    +*       mus  08/17/17 Add EL1 NS mode support for
    +*                     XGet_Zynq_UltraMp_Platform_info and XGetPSVersion_Info
    +*                     APIs.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_io.h" +#include "xplatform_info.h" +#if defined (__aarch64__) +#include "bspconfig.h" +#include "xil_smc.h" +#endif +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* +* @brief This API is used to provide information about platform +* +* @param None. +* +* @return The information about platform defined in xplatform_info.h +* +******************************************************************************/ +u32 XGetPlatform_Info() +{ + +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) || (PSU_PMU) + return XPLAT_ZYNQ_ULTRA_MP; +#elif (__microblaze__) + return XPLAT_MICROBLAZE; +#else + return XPLAT_ZYNQ; +#endif +} + +/*****************************************************************************/ +/** +* +* @brief This API is used to provide information about zynq ultrascale MP platform +* +* @param None. +* +* @return The information about zynq ultrascale MP platform defined in +* xplatform_info.h +* +******************************************************************************/ +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) +u32 XGet_Zynq_UltraMp_Platform_info() +{ +#if EL1_NONSECURE + XSmc_OutVar reg; + /* + * This SMC call will return, + * idcode - upper 32 bits of reg.Arg0 + * version - lower 32 bits of reg.Arg1 + */ + reg = Xil_Smc(GET_CHIPID_SMC_FID,0,0, 0, 0, 0, 0, 0); + return (u32)((reg.Arg1 >> XPLAT_INFO_SHIFT) & XPLAT_INFO_MASK); +#else + u32 reg; + reg = ((Xil_In32(XPAR_CSU_BASEADDR + XPAR_CSU_VER_OFFSET) >> 12U )& XPLAT_INFO_MASK); + return reg; +#endif +} +#endif + +/*****************************************************************************/ +/** +* +* @brief This API is used to provide information about PS Silicon version +* +* @param None. +* +* @return The information about PS Silicon version. +* +******************************************************************************/ +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) || (PSU_PMU) +u32 XGetPSVersion_Info() +{ +#if EL1_NONSECURE + /* + * This SMC call will return, + * idcode - upper 32 bits of reg.Arg0 + * version - lower 32 bits of reg.Arg1 + */ + XSmc_OutVar reg; + reg = Xil_Smc(GET_CHIPID_SMC_FID,0,0, 0, 0, 0, 0, 0); + return (u32)(reg.Arg1 & XPS_VERSION_INFO_MASK); +#else + u32 reg; + reg = (Xil_In32(XPAR_CSU_BASEADDR + XPAR_CSU_VER_OFFSET) + & XPS_VERSION_INFO_MASK); + return reg; +#endif +} +#endif diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xplatform_info.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xplatform_info.h new file mode 100644 index 0000000..0582222 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xplatform_info.h @@ -0,0 +1,109 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xplatform_info.h +* +* @addtogroup common_platform_info APIs to Get Platform Information +* +* The xplatform_info.h file contains definitions for various available Xilinx® +* platforms. Also, it contains prototype of APIs, which can be used to get the +* platform information. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date    Changes
    +* ----- ---- --------- -------------------------------------------------------
    +* 6.4    ms   05/23/17 Added PSU_PMU macro to support XGetPSVersion_Info
    +*                      function for PMUFW.
    +* 
    +* +******************************************************************************/ + +#ifndef XPLATFORM_INFO_H /* prevent circular inclusions */ +#define XPLATFORM_INFO_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + +#define XPAR_CSU_BASEADDR 0xFFCA0000U +#define XPAR_CSU_VER_OFFSET 0x00000044U + +#define XPLAT_ZYNQ_ULTRA_MP_SILICON 0x0 +#define XPLAT_ZYNQ_ULTRA_MP 0x1 +#define XPLAT_ZYNQ_ULTRA_MPVEL 0x2 +#define XPLAT_ZYNQ_ULTRA_MPQEMU 0x3 +#define XPLAT_ZYNQ 0x4 +#define XPLAT_MICROBLAZE 0x5 + +#define XPS_VERSION_1 0x0 +#define XPS_VERSION_2 0x1 + +#define XPLAT_INFO_MASK (0xF) +#define XPLAT_INFO_SHIFT (0xC) +#define XPS_VERSION_INFO_MASK (0xF) + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + + +u32 XGetPlatform_Info(); + +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) || (PSU_PMU) +u32 XGetPSVersion_Info(); +#endif + +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) +u32 XGet_Zynq_UltraMp_Platform_info(); +#endif +/************************** Function Prototypes ******************************/ + + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_platform_info". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpm_counter.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpm_counter.c new file mode 100644 index 0000000..d0765b6 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpm_counter.c @@ -0,0 +1,297 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a sdm  07/11/11 First release
    +* 4.2	pkp	 07/21/14 Corrected reset value of event counter in function
    +*					  Xpm_ResetEventCounters to fix CR#796275
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xpm_counter.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +typedef const u32 PmcrEventCfg32[XPM_CTRCOUNT]; + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void Xpm_DisableEventCounters(void); +void Xpm_EnableEventCounters (void); +void Xpm_ResetEventCounters (void); + +/******************************************************************************/ + +/****************************************************************************/ +/** +* +* @brief 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); +} + +/****************************************************************************/ +/** +* +* @brief 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); +} + +/****************************************************************************/ +/** +* +* @brief 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 u32 C15Reg __asm(XREG_CP15_PERF_MONITOR_CTRL); + Reg = C15Reg; } +#endif + Reg |= (1U << 1U); /* reset event counters */ + mtcp(XREG_CP15_PERF_MONITOR_CTRL, Reg); + +} + +/****************************************************************************/ +/** +* @brief 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: Configuration value based on which the event counters +* are configured. XPM_CNTRCFG* values defined in xpm_counter.h can +* be utilized for setting configuration. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void Xpm_SetEvents(s32 PmcrCfg) +{ + u32 Counter; + static PmcrEventCfg32 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 + }, + }; + const u32 *ptr = PmcrEvents[PmcrCfg]; + + Xpm_DisableEventCounters(); + + for(Counter = 0U; 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(); +} + +/****************************************************************************/ +/** +* +* @brief This function disables the event counters and returns the counter +* values. +* +* @param PmCtrValue: 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 = 0U; 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 u32 Cp15Reg __asm(XREG_CP15_PERF_MONITOR_COUNT); + PmCtrValue[Counter] = Cp15Reg; } +#endif + } +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpm_counter.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpm_counter.h new file mode 100644 index 0000000..45f0919 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpm_counter.h @@ -0,0 +1,575 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpm_counter.h +* +* @addtogroup a9_event_counter_apis Cortex A9 Event Counters Functions +* +* Cortex A9 event counter functions can be utilized to configure and control +* the Cortex-A9 performance monitor events. +* +* Cortex-A9 performance monitor has six event counters which can be used to +* count a variety of events described in Coretx-A9 TRM. xpm_counter.h defines +* configurations XPM_CNTRCFGx which can be used to program the event counters +* to count a set of events. +* +* @note +* It doesn't handle the Cortex-A9 cycle counter, as the cycle counter is +* being used for time keeping. +* +* @{ +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date     Changes
    +* ----- ---- -------- -----------------------------------------------
    +* 1.00a sdm  07/11/11 First release
    +* 
    +* +******************************************************************************/ + +#ifndef XPMCOUNTER_H /* prevent circular inclusions */ +#define XPMCOUNTER_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include +#include "xpseudo_asm.h" +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/************************** Constant Definitions ****************************/ + +/* Number of performance counters */ +#define XPM_CTRCOUNT 6U + +/* 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 0x00U + +/* + * 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 0x01U + +/* + * 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 0x02U + +/* + * 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 0x03U + +/* + * 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 0x04U + +/* + * 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 0x05U + +/* + * 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 0x06U + +/* + * 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 0x07U + +/* Exception taken. Counts the number of exceptions architecturally taken.*/ +#define XPM_EVENT_EXCEPTION 0x09U + +/* Exception return architecturally executed.*/ +#define XPM_EVENT_EXCEPRETURN 0x0AU + +/* + * Change to ContextID retired. Counts the number of instructions + * architecturally executed writing into the ContextID Register + */ +#define XPM_EVENT_CHANGECONTEXT 0x0BU + +/* + * 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 0x0CU + +/* + * 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 0x0DU + +/* + * 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 0x0FU + +/* + * 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 0x10U + +/* + * 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 0x11U + +/* + * 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 0x12U + +/* + * Java bytecode execute. Counts the number of Java bytecodes being decoded, + * including speculative ones + */ +#define XPM_EVENT_JAVABYTECODE 0x40U + +/* + * Software Java bytecode executed. Counts the number of software java bytecodes + * being decoded, including speculative ones + */ +#define XPM_EVENT_SWJAVABYTECODE 0x41U + +/* + * 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 0x42U + +/* + * 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 0x50U + +/* + * 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 0x51U + +/* + * 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 0x60U + +/* + * 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 0x61U + +/* + * 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 0x62U + +/* + * Counts the number of STREX instructions architecturally executed and + * passed + */ +#define XPM_EVENT_STREXPASS 0x63U + +/* + * Counts the number of STREX instructions architecturally executed and + * failed + */ +#define XPM_EVENT_STREXFAIL 0x64U + +/* + * Data eviction. Counts the number of eviction requests due to a linefill in + * the data cache + */ +#define XPM_EVENT_DATAEVICT 0x65U + +/* + * 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 0x66U + +/* + * Counts the number of cycles where the issue stage is empty + */ +#define XPM_EVENT_ISSUEEMPTY 0x67U + +/* + * 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 0x68U + +/* + * 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 0x6EU + +/* + * 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 0x70U + +/* + * Counts the number of instructions being executed in the processor second + * execution pipeline (ALU). The counted instructions are still speculative + */ +#define XPM_EVENT_SECEXEC 0x71U + +/* + * Counts the number of instructions being executed in the Load/Store unit. The + * counted instructions are still speculative + */ +#define XPM_EVENT_LDRSTR 0x72U + +/* + * 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 0x73U + +/* + * 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 0x74U + +/* + * Counts the number of cycles where the processor is stalled because PLD slots + * are all full + */ +#define XPM_EVENT_PLDSTALL 0x80U + +/* + * 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 0x81U + +/* + * Counts the number of stall cycles due to main TLB misses on requests issued + * by the instruction side + */ +#define XPM_EVENT_INSTRTLBSTALL 0x82U + +/* + * Counts the number of stall cycles due to main TLB misses on requests issued + * by the data side + */ +#define XPM_EVENT_DATATLBSTALL 0x83U + +/* + * 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 0x84U + +/* + * 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 0x85U + +/* + * 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 0x86U + +/* + * Counts the number of cycles during which the integer core clock is enabled + */ +#define XPM_EVENT_INT_CLKEN 0x8AU + +/* + * Counts the number of cycles during which the Data Engine clock is enabled + */ +#define XPM_EVENT_DE_CLKEN 0x8BU + +/* + * Counts the number of ISB instructions architecturally executed + */ +#define XPM_EVENT_INSTRISB 0x90U + +/* + * Counts the number of DSB instructions architecturally executed + */ +#define XPM_EVENT_INSTRDSB 0x91U + +/* + * Counts the number of DMB instructions speculatively executed + */ +#define XPM_EVENT_INSTRDMB 0x92U + +/* + * Counts the number of external interrupts executed by the processor + */ +#define XPM_EVENT_EXTINT 0x93U + +/* + * PLE cache line request completed + */ +#define XPM_EVENT_PLE_LRC 0xA0U + +/* + * PLE cache line request skipped + */ +#define XPM_EVENT_PLE_LRS 0xA1U + +/* + * PLE FIFO flush + */ +#define XPM_EVENT_PLE_FLUSH 0xA2U + +/* + * PLE request complete + */ +#define XPM_EVENT_PLE_CMPL 0xA3U + +/* + * PLE FIFO overflow + */ +#define XPM_EVENT_PLE_OVFL 0xA4U + +/* + * PLE request programmed + */ +#define XPM_EVENT_PLE_PROG 0xA5U + +/* + * 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(s32 PmcrCfg); +void Xpm_GetEventCounters(u32 *PmCtrValue); + +#ifdef __cplusplus +} +#endif + +#endif +/** +* @} End of "addtogroup a9_event_counter_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpseudo_asm.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpseudo_asm.h new file mode 100644 index 0000000..4ad9e5d --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpseudo_asm.h @@ -0,0 +1,77 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpseudo_asm.h +* +* @addtogroup a9_specific Cortex A9 Processor Specific Include Files +* +* The xpseudo_asm.h includes xreg_cortexa9.h and xpseudo_asm_gcc.h. +* +* The xreg_cortexa9.h file contains definitions for inline assembler code. +* It provides inline definitions for Cortex A9 GPRs, SPRs, MPE registers, +* co-processor registers and Debug registers. +* +* The xpseudo_asm_gcc.h contains the definitions for the most often used inline +* assembler instructions, available as macros. These can be very useful for +* tasks such as setting or getting special purpose registers, synchronization, +* or cache manipulation etc. These inline assembler instructions can be used +* from drivers and user applications written in C. +* +* @{ +*
    +* 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.
    +* 
    +* +******************************************************************************/ +#ifndef XPSEUDO_ASM_H +#define XPSEUDO_ASM_H + +#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 + +#endif /* XPSEUDO_ASM_H */ +/** +* @} End of "addtogroup a9_specific". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpseudo_asm_gcc.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpseudo_asm_gcc.h new file mode 100644 index 0000000..37971bc --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xpseudo_asm_gcc.h @@ -0,0 +1,256 @@ +/****************************************************************************** +* +* Copyright (C) 2014 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpseudo_asm_gcc.h +* +* This header file contains macros for using inline assembler code. It is +* written specifically for the GNU compiler. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 5.00 	pkp		 05/21/14 First release
    +* 6.0   mus      07/27/16 Consolidated file for a53,a9 and r5 processors
    +* 
    +* +******************************************************************************/ + +#ifndef XPSEUDO_ASM_GCC_H /* prevent circular inclusions */ +#define XPSEUDO_ASM_GCC_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include "xil_types.h" + +#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 + +#if defined (__aarch64__) +/* pseudo assembler instructions */ +#define mfcpsr() ({u32 rval = 0U; \ + asm volatile("mrs %0, DAIF" : "=r" (rval));\ + rval;\ + }) + +#define mtcpsr(v) __asm__ __volatile__ ("msr DAIF, %0" : : "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) /*({u32 rval; \ + __asm__ __volatile__(\ + "mov %0,r" stringify(rn) "\n"\ + : "=r" (rval)\ + );\ + rval;\ + })*/ + +/* memory synchronization operations */ + +/* Instruction Synchronization Barrier */ +#define isb() __asm__ __volatile__ ("isb sy") + +/* Data Synchronization Barrier */ +#define dsb() __asm__ __volatile__("dsb sy") + +/* Data Memory Barrier */ +#define dmb() __asm__ __volatile__("dmb sy") + + +/* Memory Operations */ +#define ldr(adr) ({u64 rval; \ + __asm__ __volatile__(\ + "ldr %0,[%1]"\ + : "=r" (rval) : "r" (adr)\ + );\ + rval;\ + }) + +#define mfelrel3() ({u64 rval = 0U; \ + asm volatile("mrs %0, ELR_EL3" : "=r" (rval));\ + rval;\ + }) + +#define mtelrel3(v) __asm__ __volatile__ ("msr ELR_EL3, %0" : : "r" (v)) + +#else + +/* pseudo assembler instructions */ +#define mfcpsr() ({u32 rval = 0U; \ + __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) ({u32 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) ({u32 rval; \ + __asm__ __volatile__(\ + "ldr %0,[%1]"\ + : "=r" (rval) : "r" (adr)\ + );\ + rval;\ + }) + +#endif + +#define ldrb(adr) ({u8 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) ({u8 rval; \ + __asm__ __volatile__(\ + "clz %0,%1"\ + : "=r" (rval) : "r" (arg)\ + );\ + rval;\ + }) + +#if defined (__aarch64__) +#define mtcpdc(reg,val) __asm__ __volatile__("dc " #reg ",%0" : : "r" (val)) +#define mtcpic(reg,val) __asm__ __volatile__("ic " #reg ",%0" : : "r" (val)) + +#define mtcpicall(reg) __asm__ __volatile__("ic " #reg) +#define mtcptlbi(reg) __asm__ __volatile__("tlbi " #reg) +#define mtcpat(reg,val) __asm__ __volatile__("at " #reg ",%0" : : "r" (val)) +/* CP15 operations */ +#define mfcp(reg) ({u64 rval = 0U;\ + __asm__ __volatile__("mrs %0, " #reg : "=r" (rval));\ + rval;\ + }) + +#define mtcp(reg,val) __asm__ __volatile__("msr " #reg ",%0" : : "r" (val)) + +#else +/* CP15 operations */ +#define mtcp(rn, v) __asm__ __volatile__(\ + "mcr " rn "\n"\ + : : "r" (v)\ + ); + +#define mfcp(rn) ({u32 rval = 0U; \ + __asm__ __volatile__(\ + "mrc " rn "\n"\ + : "=r" (rval)\ + );\ + rval;\ + }) +#endif + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XPSEUDO_ASM_GCC_H */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xreg_cortexa9.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xreg_cortexa9.h new file mode 100644 index 0000000..dc9a4eb --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xreg_cortexa9.h @@ -0,0 +1,591 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xreg_cortexa9.h +* +* This header file contains definitions for using inline assembler code. It is +* written specifically for the GNU, 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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 1.00a ecm/sdm  10/20/09 First release
    +* 
    +* +******************************************************************************/ +#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 0x40000000U +#define XREG_CP15_CONTROL_AFE_BIT 0x20000000U +#define XREG_CP15_CONTROL_TRE_BIT 0x10000000U +#define XREG_CP15_CONTROL_NMFI_BIT 0x08000000U +#define XREG_CP15_CONTROL_EE_BIT 0x02000000U +#define XREG_CP15_CONTROL_HA_BIT 0x00020000U +#define XREG_CP15_CONTROL_RR_BIT 0x00004000U +#define XREG_CP15_CONTROL_V_BIT 0x00002000U +#define XREG_CP15_CONTROL_I_BIT 0x00001000U +#define XREG_CP15_CONTROL_Z_BIT 0x00000800U +#define XREG_CP15_CONTROL_SW_BIT 0x00000400U +#define XREG_CP15_CONTROL_B_BIT 0x00000080U +#define XREG_CP15_CONTROL_C_BIT 0x00000004U +#define XREG_CP15_CONTROL_A_BIT 0x00000002U +#define XREG_CP15_CONTROL_M_BIT 0x00000001U + +#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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xstatus.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xstatus.h new file mode 100644 index 0000000..9937475 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xstatus.h @@ -0,0 +1,535 @@ +/****************************************************************************** +* +* Copyright (C) 2002 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xstatus.h +* +* @addtogroup common_status_codes Xilinx® software status codes +* +* The xstatus.h file contains the Xilinx® software status codes.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 *****************************/ +/** +@name Common Status Codes for All Device Drivers +@{ +*/ +#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 *********************/ +/** +@name Utility Component Status Codes 401 - 500 +@{ +*/ +#define XST_MEMTEST_FAILED 401L /*!< Memory test failed */ + +/** @} */ +/***************** Common Components statuses 501 - 1000 *********************/ +/** +@name Packet Fifo Status Codes 501 - 510 +@{ +*/ +/********************* 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 + */ +/** @} */ +/** +@name DMA Status Codes 511 - 530 +@{ +*/ +/************************** 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 */ +/** @} */ +/** +@name IPIF Status Codes Codes 531 - 550 +@{ +*/ +/************************** 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 *********************/ +/** +@name Ethernet Status Codes 1001 - 1050 +@{ +*/ +/********************* 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 */ +/** @} */ +/** +@name UART Status Codes 1051 - 1075 +@{ +*/ +/*********************** 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 + +/** @} */ +/** +@name IIC Status Codes 1076 - 1100 +@{ +*/ +/************************ 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 */ +/** @} */ +/** +@name ATMC Status Codes 1101 - 1125 +@{ +*/ +/*********************** 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 */ +/** @} */ +/** +@name Flash Status Codes 1126 - 1150 +@{ +*/ +/*********************** 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 */ +/** @} */ +/** +@name SPI Status Codes 1151 - 1175 +@{ +*/ +/*********************** 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 */ +#define XST_SPI_POLL_DONE 1163 /*!< controller completed polling the + device for status */ +/** @} */ +/** +@name OPB Arbiter Status Codes 1176 - 1200 +@{ +*/ +/********************** 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 + */ +/** @} */ +/** +@name INTC Status Codes 1201 - 1225 +@{ +*/ +/************************ Intc statuses 1201 - 1225 **************************/ + +#define XST_INTC_FAIL_SELFTEST 1201 /*!< self test failed */ +#define XST_INTC_CONNECT_ERROR 1202 /*!< interrupt already in use */ +/** @} */ +/** +@name TmrCtr Status Codes 1226 - 1250 +@{ +*/ +/********************** TmrCtr statuses 1226 - 1250 **************************/ + +#define XST_TMRCTR_TIMER_FAILED 1226 /*!< self test failed */ +/** @} */ +/** +@name WdtTb Status Codes 1251 - 1275 +@{ +*/ +/********************** WdtTb statuses 1251 - 1275 ***************************/ + +#define XST_WDTTB_TIMER_FAILED 1251L +/** @} */ +/** +@name PlbArb status Codes 1276 - 1300 +@{ +*/ +/********************** PlbArb statuses 1276 - 1300 **************************/ + +#define XST_PLBARB_FAIL_SELFTEST 1276L +/** @} */ +/** +@name Plb2Opb Status Codes 1301 - 1325 +@{ +*/ +/********************** Plb2Opb statuses 1301 - 1325 *************************/ + +#define XST_PLB2OPB_FAIL_SELFTEST 1301L +/** @} */ +/** +@name Opb2Plb Status 1326 - 1350 +@{ +*/ +/********************** Opb2Plb statuses 1326 - 1350 *************************/ + +#define XST_OPB2PLB_FAIL_SELFTEST 1326L +/** @} */ +/** +@name SysAce Status Codes 1351 - 1360 +@{ +*/ +/********************** SysAce statuses 1351 - 1360 **************************/ + +#define XST_SYSACE_NO_LOCK 1351L /*!< No MPU lock has been granted */ +/** @} */ +/** +@name PCI Bridge Status Codes 1361 - 1375 +@{ +*/ +/********************** PCI Bridge statuses 1361 - 1375 **********************/ + +#define XST_PCI_INVALID_ADDRESS 1361L +/** @} */ +/** +@name FlexRay Constants 1400 - 1409 +@{ +*/ +/********************** 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 +/** @} */ +/** +@name USB constants 1410 - 1420 +@{ +*/ +/****************** 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 +/** @} */ +/** +@name HWICAP constants 1421 - 1429 +@{ +*/ +/****************** HWICAP constants 1421 - 1429 *****************************/ + +#define XST_HWICAP_WRITE_DONE 1421 + +/** @} */ +/** +@name AXI VDMA constants 1430 - 1440 +@{ +*/ +/****************** AXI VDMA constants 1430 - 1440 *****************************/ + +#define XST_VDMA_MISMATCH_ERROR 1430 +/** @} */ +/** +@name NAND Flash Status Codes 1441 - 1459 +@{ +*/ +/*********************** 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 s32 XStatus; + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_status_codes". +*/ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xtime_l.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xtime_l.c new file mode 100644 index 0000000..e81643f --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xtime_l.c @@ -0,0 +1,122 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @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. +* +*
    +* 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
    +* 
    +* +* @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 ******************************/ + +/****************************************************************************/ +/** +* @brief Set the time in the Global Timer Counter Register. +* +* @param Xtime_Global: 64-bit Value to be written to the Global Timer +* Counter Register. +* +* @return None. +* +* @note When this function is called by any one processor in a multi- +* processor environment, reference time will reset/lost for all +* processors. +* +****************************************************************************/ +void XTime_SetTime(XTime Xtime_Global) +{ + /* Disable Global Timer */ + Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_CONTROL_OFFSET, (u32)0x0); + + /* Updating Global Timer Counter Register */ + Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_COUNTER_LOWER_OFFSET, (u32)Xtime_Global); + Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_COUNTER_UPPER_OFFSET, + (u32)((u32)(Xtime_Global>>32U))); + + /* Enable Global Timer */ + Xil_Out32((u32)GLOBAL_TMR_BASEADDR + (u32)GTIMER_CONTROL_OFFSET, (u32)0x1); +} + +/****************************************************************************/ +/** +* @brief Get the time from the Global Timer Counter Register. +* +* @param Xtime_Global: Pointer to the 64-bit location which will be +* updated with the current timer value. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XTime_GetTime(XTime *Xtime_Global) +{ + 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_Global = (((XTime) high) << 32U) | (XTime) low; +} diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xtime_l.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xtime_l.h new file mode 100644 index 0000000..9b872b6 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/standalone_v6_7/src/xtime_l.h @@ -0,0 +1,105 @@ +/****************************************************************************** +* +* Copyright (C) 2009 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xtime_l.h +* @addtogroup a9_time_apis Cortex A9 Time Functions +* +* xtime_l.h provides access to the 64-bit Global Counter in the PMU. This +* counter increases by one at every two processor cycles. These functions can +* be used to get/set time in the global timer. +* +* @{ +*
    +* 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
    +* 6.6   srm    10/23/17 Updated the macros to support user configurable sleep
    +*						implementation
    +* 
    +* +******************************************************************************/ + +#ifndef XTIME_H /* prevent circular inclusions */ +#define XTIME_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xparameters.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +typedef u64 XTime; + +/************************** Constant Definitions *****************************/ +#define GLOBAL_TMR_BASEADDR XPAR_GLOBAL_TMR_BASEADDR +#define GTIMER_COUNTER_LOWER_OFFSET 0x00U +#define GTIMER_COUNTER_UPPER_OFFSET 0x04U +#define GTIMER_CONTROL_OFFSET 0x08U + +#if defined (SLEEP_TIMER_BASEADDR) +#define COUNTS_PER_SECOND (SLEEP_TIMER_FREQUENCY) +#else +/* Global Timer is always clocked at half of the CPU frequency */ +#define COUNTS_PER_SECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ /2) +#endif + +#if defined (XSLEEP_TIMER_IS_DEFAULT_TIMER) +#pragma message ("For the sleep routines, Global timer is being used") +#endif +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void XTime_SetTime(XTime Xtime_Global); +void XTime_GetTime(XTime *Xtime_Global); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XTIME_H */ +/** +* @} End of "addtogroup a9_time_apis". +*/ \ No newline at end of file diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps.c new file mode 100644 index 0000000..88f96d7 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps.c @@ -0,0 +1,448 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2018 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xttcps.c +* @addtogroup ttcps_v3_5 +* @{ +* +* This file contains the implementation of the XTtcPs driver. This driver +* controls the operation of one timer counter in the Triple Timer Counter (TTC) +* module in the Ps block. Refer to xttcps.h for more detailed description +* of the driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- -------------------------------------------------
    +* 1.00a drg/jz 01/21/10 First release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.01	pkp	   01/30/16 Modified XTtcPs_CfgInitialize to add XTtcps_Stop
    +*						to stop the timer before configuring
    +* 3.2   mus    10/28/16 Modified XTtcPs_CalcIntervalFromFreq to calculate
    +*                       32 bit interval count for zynq ultrascale+mpsoc
    +* 3.5   srm    10/06/17 Updated XTtcPs_GetMatchValue and XTtcPs_SetMatchValue
    +*                       APIs to use correct match register width for zynq
    +*                       (i.e. 16 bit) and zynq ultrascale+mpsoc (i.e. 32 bit).
    +*                       It fixes CR# 986617
    +* 3.6   srm    04/25/18 Corrected the Match register initialization in
    +						XTtcPs_CfgInitialize API.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xttcps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* +* Initializes a specific XTtcPs instance such that the driver is ready to use. +* This function initializes a single timer counter in the triple timer counter +* function block. +* +* The state of the device after initialization is: +* - Overflow Mode +* - Internal (pclk) selected +* - Counter disabled +* - All Interrupts disabled +* - Output waveforms disabled +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param ConfigPtr is a reference to a structure containing information +* about a specific TTC device. +* @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, then use +* ConfigPtr->BaseAddress for this parameter, passing the physical +* address instead. +* +* @return +* +* - XST_SUCCESS if the initialization is successful. +* - XST_DEVICE_IS_STARTED if the device is started. It must be +* stopped to re-initialize. +* +* @note Device has to be stopped first to call this function to +* initialize it. +* +******************************************************************************/ +s32 XTtcPs_CfgInitialize(XTtcPs *InstancePtr, XTtcPs_Config *ConfigPtr, + u32 EffectiveAddr) +{ + s32 Status; + u32 IsStartResult; + /* + * Assert to validate 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; + + IsStartResult = XTtcPs_IsStarted(InstancePtr); + /* + * If the timer counter has already started, return an error + * Device should be stopped first. + */ + if(IsStartResult == (u32)TRUE) { + Status = XST_DEVICE_IS_STARTED; + } else { + + /* + * stop the timer before configuring + */ + XTtcPs_Stop(InstancePtr); + /* + * Reset the count control register to it's default value. + */ + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_CNT_CNTRL_OFFSET, + XTTCPS_CNT_CNTRL_RESET_VALUE); + + /* + * Reset the rest of the registers to the default values. + */ + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_CLK_CNTRL_OFFSET, 0x00U); + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_INTERVAL_VAL_OFFSET, 0x00U); + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_MATCH_0_OFFSET, 0x00U); + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_MATCH_1_OFFSET, 0x00U); + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_MATCH_2_OFFSET, 0x00U); + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_IER_OFFSET, 0x00U); + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_ISR_OFFSET, XTTCPS_IXR_ALL_MASK); + + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + /* + * Reset the counter value + */ + XTtcPs_ResetCounterValue(InstancePtr); + Status = XST_SUCCESS; + } + return Status; +} + +/*****************************************************************************/ +/** +* +* This function is used to set the match registers. There are three match +* registers. +* +* The match 0 register is special. If the waveform output mode is enabled, the +* waveform will change polarity when the count matches the value in the match 0 +* register. The polarity of the waveform output can also be set using the +* XTtcPs_SetOptions() function. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param MatchIndex is the index to the match register to be set. +* Valid values are 0, 1, or 2. +* @param Value is the 16-bit value to be set in the match register. +* +* @return None +* +* @note None +* +****************************************************************************/ +void XTtcPs_SetMatchValue(XTtcPs *InstancePtr, u8 MatchIndex, XMatchRegValue Value) +{ + /* + * Assert to validate input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(MatchIndex < (u8)XTTCPS_NUM_MATCH_REG); + + /* + * Write the value to the correct match register with MatchIndex + */ + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTtcPs_Match_N_Offset(MatchIndex), Value); +} + +/*****************************************************************************/ +/** +* +* This function is used to get the value of the match registers. There are +* three match registers. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param MatchIndex is the index to the match register to be set. +* Valid values are 0, 1, or 2. +* +* @return The match register value +* +* @note None +* +****************************************************************************/ +XMatchRegValue XTtcPs_GetMatchValue(XTtcPs *InstancePtr, u8 MatchIndex) +{ + u32 MatchReg; + + /* + * Assert to validate input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(MatchIndex < XTTCPS_NUM_MATCH_REG); + + MatchReg = XTtcPs_ReadReg(InstancePtr->Config.BaseAddress, + XTtcPs_Match_N_Offset(MatchIndex)); + + return (XMatchRegValue) MatchReg; +} + +/*****************************************************************************/ +/** +* +* This function sets the prescaler enable bit and if needed sets the prescaler +* bits in the control register. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param PrescalerValue is a number from 0-16 that sets the prescaler +* to use. +* If the parameter is 0 - 15, use a prescaler on the clock of +* 2^(PrescalerValue+1), or 2-65536. +* If the parameter is XTTCPS_CLK_CNTRL_PS_DISABLE, do not use a +* prescaler. +* +* @return None +* +* @note None +* +****************************************************************************/ +void XTtcPs_SetPrescaler(XTtcPs *InstancePtr, u8 PrescalerValue) +{ + u32 ClockReg; + + /* + * Assert to validate input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(PrescalerValue <= XTTCPS_CLK_CNTRL_PS_DISABLE); + + /* + * Read the clock control register + */ + ClockReg = XTtcPs_ReadReg(InstancePtr->Config.BaseAddress, + XTTCPS_CLK_CNTRL_OFFSET); + + /* + * Clear all of the prescaler control bits in the register + */ + ClockReg &= + ~(XTTCPS_CLK_CNTRL_PS_VAL_MASK | XTTCPS_CLK_CNTRL_PS_EN_MASK); + + if (PrescalerValue < XTTCPS_CLK_CNTRL_PS_DISABLE) { + /* + * Set the prescaler value and enable prescaler + */ + ClockReg |= (u32)(((u32)PrescalerValue << (u32)XTTCPS_CLK_CNTRL_PS_VAL_SHIFT) & + (u32)XTTCPS_CLK_CNTRL_PS_VAL_MASK); + ClockReg |= (u32)XTTCPS_CLK_CNTRL_PS_EN_MASK; + } + + /* + * Write the register with the new values. + */ + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_CLK_CNTRL_OFFSET, ClockReg); +} + +/*****************************************************************************/ +/** +* +* This function gets the input clock prescaler +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +*
    +* @return	The value(n) from which the prescalar value is calculated
    +*		as 2^(n+1). Some example values are given below :
    +*
    +* 	Value		Prescaler
    +* 	0		2
    +* 	1		4
    +* 	N		2^(n+1)
    +* 	15		65536
    +* 	16		1
    +* 
    +* +* @note None. +* +****************************************************************************/ +u8 XTtcPs_GetPrescaler(XTtcPs *InstancePtr) +{ + u8 Status; + u32 ClockReg; + + /* + * Assert to validate input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the clock control register + */ + ClockReg = XTtcPs_ReadReg(InstancePtr->Config.BaseAddress, + XTTCPS_CLK_CNTRL_OFFSET); + + if (0 == (ClockReg & XTTCPS_CLK_CNTRL_PS_EN_MASK)) { + /* + * Prescaler is disabled. Return the correct flag value + */ + Status = (u8)XTTCPS_CLK_CNTRL_PS_DISABLE; + } + else { + + Status = (u8)((ClockReg & (u32)XTTCPS_CLK_CNTRL_PS_VAL_MASK) >> + (u32)XTTCPS_CLK_CNTRL_PS_VAL_SHIFT); + } + return Status; +} + +/*****************************************************************************/ +/** +* +* This function calculates the interval value as well as the prescaler value +* for a given frequency. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param Freq is the requested output frequency for the device. +* @param Interval is the interval value for the given frequency, +* it is the output value for this function. +* @param Prescaler is the prescaler value for the given frequency, +* it is the output value for this function. +* +* @return None. +* +* @note +* Upon successful calculation for the given frequency, Interval and Prescaler +* carry the settings for the timer counter; Upon unsuccessful calculation, +* Interval and Prescaler are set to 0xFF(FF) for their maximum values to +* signal the caller of failure. Therefore, caller needs to check the return +* interval or prescaler values for whether the function has succeeded. +* +****************************************************************************/ +void XTtcPs_CalcIntervalFromFreq(XTtcPs *InstancePtr, u32 Freq, + XInterval *Interval, u8 *Prescaler) +{ + u8 TmpPrescaler; + u32 TempValue; + u32 InputClock; + + InputClock = InstancePtr->Config.InputClockHz; + /* + * Find the smallest prescaler that will work for a given frequency. The + * smaller the prescaler, the larger the count and the more accurate the + * PWM setting. + */ + TempValue = InputClock/ Freq; + + if (TempValue < 4U) { + /* + * The frequency is too high, it is too close to the input + * clock value. Use maximum values to signal caller. + */ + *Interval = XTTCPS_MAX_INTERVAL_COUNT; + *Prescaler = 0xFFU; + return; + } + + /* + * First, do we need a prescaler or not? + */ + if (((u32)65536U) > TempValue) { + /* + * We do not need a prescaler, so set the values appropriately + */ + *Interval = (XInterval)TempValue; + *Prescaler = XTTCPS_CLK_CNTRL_PS_DISABLE; + return; + } + + + for (TmpPrescaler = 0U; TmpPrescaler < XTTCPS_CLK_CNTRL_PS_DISABLE; + TmpPrescaler++) { + TempValue = InputClock/ (Freq * (1U << (TmpPrescaler + 1U))); + + /* + * The first value less than 2^16 is the best bet + */ + if (((u32)65536U) > TempValue) { + /* + * Set the values appropriately + */ + *Interval = (XInterval)TempValue; + *Prescaler = TmpPrescaler; + return; + } + } + + /* Can not find interval values that work for the given frequency. + * Return maximum values to signal caller. + */ + *Interval = XTTCPS_MAX_INTERVAL_COUNT; + *Prescaler = 0XFFU; + return; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps.h new file mode 100644 index 0000000..b7b4e19 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps.h @@ -0,0 +1,467 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xttcps.h +* @addtogroup ttcps_v3_5 +* @{ +* @details +* +* This is the driver for one 16-bit timer counter in the Triple Timer Counter +* (TTC) module in the Ps block. +* +* The TTC module provides three independent timer/counter modules that can each +* be clocked using either the system clock (pclk) or an externally driven +* clock (ext_clk). In addition, each counter can independently prescale its +* selected clock input (divided by 2 to 65536). Counters can be set to +* decrement or increment. +* +* Each of the counters can be programmed to generate interrupt pulses: +* . At a regular, predefined period, that is on a timed interval +* . When the counter registers overflow +* . When the count matches any one of the three 'match' registers +* +* Therefore, up to six different events can trigger a timer interrupt: three +* match interrupts, an overflow interrupt, an interval interrupt and an event +* timer interrupt. Note that the overflow interrupt and the interval interrupt +* are mutually exclusive. +* +* Initialization & Configuration +* +* An XTtcPs_Config structure is used to configure a driver instance. +* Information in the XTtcPs_Config structure is the hardware properties +* about the device. +* +* A driver instance is initialized through +* XTtcPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr). Where CfgPtr +* is a pointer to the XTtcPs_Config structure, it can be looked up statically +* through XTtcPs_LookupConfig(DeviceID), or passed in by the caller. The +* EffectiveAddr can be the static base address of the device or virtual +* mapped address if address translation is supported. +* +* Interrupts +* +* Interrupt handler is not provided by the driver, as handling of interrupt +* is application specific. +* +* @note +* The default setting for a timer/counter is: +* - Overflow Mode +* - Internal clock (pclk) selected +* - Counter disabled +* - All Interrupts disabled +* - Output waveforms disabled +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- -----------------------------------------------------
    +* 1.00a drg/jz 01/20/10 First release..
    +* 2.0   adk    12/10/13 Updated as per the New Tcl API's
    +* 3.0	pkp    12/09/14 Added support for Zynq Ultrascale Mp.Also code
    +*			modified for MISRA-C:2012 compliance.
    +* 3.2   mus    10/28/16 Modified XTtcPs_GetCounterValue and XTtcPs_SetInterval
    +*                       macros to return 32 bit values for zynq ultrascale+mpsoc
    +*       ms   01/23/17 Modified xil_printf statement in main function for all
    +*                     examples to ensure that "Successfully ran" and "Failed"
    +*                     strings are available in all examples. This is a fix
    +*                     for CR-965028.
    +*       ms   03/17/17 Added readme.txt file in examples folder for doxygen
    +*                     generation.
    +* 3.4   ms   04/18/17 Modified tcl file to add suffix U for all macros
    +*                     definitions of ttcps in xparameters.h
    +* 3.5   srm  10/06/17 Added new typedef XMatchRegValue for match register width
    +*
    +* 
    +* +******************************************************************************/ + +#ifndef XTTCPS_H /* prevent circular inclusions */ +#define XTTCPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xttcps_hw.h" +#include "xstatus.h" + +/************************** Constant Definitions *****************************/ + + +/* + * Maximum Value for interval counter + */ + #if defined(ARMA9) + #define XTTCPS_MAX_INTERVAL_COUNT 0xFFFFU + #else + #define XTTCPS_MAX_INTERVAL_COUNT 0xFFFFFFFFU + #endif + +/** @name Configuration options + * + * Options for the device. Each of the options is bit field, so more than one + * options can be specified. + * + * @{ + */ +#define XTTCPS_OPTION_EXTERNAL_CLK 0x00000001U /**< External clock source */ +#define XTTCPS_OPTION_CLK_EDGE_NEG 0x00000002U /**< Clock on trailing edge for + external clock*/ +#define XTTCPS_OPTION_INTERVAL_MODE 0x00000004U /**< Interval mode */ +#define XTTCPS_OPTION_DECREMENT 0x00000008U /**< Decrement the counter */ +#define XTTCPS_OPTION_MATCH_MODE 0x00000010U /**< Match mode */ +#define XTTCPS_OPTION_WAVE_DISABLE 0x00000020U /**< No waveform output */ +#define XTTCPS_OPTION_WAVE_POLARITY 0x00000040U /**< Waveform polarity */ +/*@}*/ +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID for device */ + u32 BaseAddress; /**< Base address for device */ + u32 InputClockHz; /**< Input clock frequency */ +} XTtcPs_Config; + +/** + * The XTtcPs driver instance data. The user is required to allocate a + * variable of this type for each PS timer/counter device in the system. A + * pointer to a variable of this type is then passed to various driver API + * functions. + */ +typedef struct { + XTtcPs_Config Config; /**< Configuration structure */ + u32 IsReady; /**< Device is initialized and ready */ +} XTtcPs; + +/** + * This typedef contains interval count and Match register value + */ +#if defined(ARMA9) +typedef u16 XInterval; +typedef u16 XMatchRegValue; +#else +typedef u32 XInterval; +typedef u32 XMatchRegValue; +#endif +/***************** Macros (Inline Functions) Definitions *********************/ + +/* + * Internal helper macros + */ +#define InstReadReg(InstancePtr, RegOffset) \ + (Xil_In32(((InstancePtr)->Config.BaseAddress) + (u32)(RegOffset))) + +#define InstWriteReg(InstancePtr, RegOffset, Data) \ + (Xil_Out32(((InstancePtr)->Config.BaseAddress) + (u32)(RegOffset), (u32)(Data))) + +/*****************************************************************************/ +/** +* +* This function starts the counter/timer without resetting the counter value. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return None +* +* @note C-style signature: +* void XTtcPs_Start(XTtcPs *InstancePtr) +* +****************************************************************************/ +#define XTtcPs_Start(InstancePtr) \ + InstWriteReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) & \ + ~XTTCPS_CNT_CNTRL_DIS_MASK)) + +/*****************************************************************************/ +/** +* +* This function stops the counter/timer. This macro may be called at any time +* to stop the counter. The counter holds the last value until it is reset, +* restarted or enabled. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return None +* +* @note C-style signature: +* void XTtcPs_Stop(XTtcPs *InstancePtr) +* +****************************************************************************/ +#define XTtcPs_Stop(InstancePtr) \ + InstWriteReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) | \ + XTTCPS_CNT_CNTRL_DIS_MASK)) + +/*****************************************************************************/ +/** +* +* This function checks whether the timer counter has already started. +* +* @param InstancePtr is a pointer to the XTtcPs instance +* +* @return Non-zero if the device has started, '0' otherwise. +* +* @note C-style signature: +* int XTtcPs_IsStarted(XTtcPs *InstancePtr) +* +****************************************************************************/ +#define XTtcPs_IsStarted(InstancePtr) \ + ((InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) & \ + XTTCPS_CNT_CNTRL_DIS_MASK) == 0U) + +/*****************************************************************************/ +/** +* +* This function returns the current 16-bit counter value. It may be called at +* any time. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return zynq:16 bit counter value. +* zynq ultrascale+mpsoc:32 bit counter value. +* +* @note C-style signature: +* zynq: u16 XTtcPs_GetCounterValue(XTtcPs *InstancePtr) +* zynq ultrascale+mpsoc: u32 XTtcPs_GetCounterValue(XTtcPs *InstancePtr) +* +****************************************************************************/ +#if defined(ARMA9) +/* + * ttc supports 16 bit counter for zynq + */ +#define XTtcPs_GetCounterValue(InstancePtr) \ + (u16)InstReadReg((InstancePtr), XTTCPS_COUNT_VALUE_OFFSET) +#else +/* + * ttc supports 32 bit counter for zynq ultrascale+mpsoc + */ +#define XTtcPs_GetCounterValue(InstancePtr) \ + InstReadReg((InstancePtr), XTTCPS_COUNT_VALUE_OFFSET) +#endif + +/*****************************************************************************/ +/** +* +* This function sets the interval value to be used in interval mode. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param Value is the 16-bit value to be set in the interval register. +* +* @return None +* +* @note C-style signature: +* void XTtcPs_SetInterval(XTtcPs *InstancePtr, XInterval Value) +* +****************************************************************************/ +#define XTtcPs_SetInterval(InstancePtr, Value) \ + InstWriteReg((InstancePtr), XTTCPS_INTERVAL_VAL_OFFSET, (Value)) + +/*****************************************************************************/ +/** +* +* This function gets the interval value from the interval register. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return zynq:16 bit interval value. +* zynq ultrascale+mpsoc:32 bit interval value. +* +* @note C-style signature: +* zynq: u16 XTtcPs_GetInterval(XTtcPs *InstancePtr) +* zynq ultrascale+mpsoc: u32 XTtcPs_GetInterval(XTtcPs *InstancePtr) +* +****************************************************************************/ +#if defined(ARMA9) +/* + * ttc supports 16 bit interval counter for zynq + */ +#define XTtcPs_GetInterval(InstancePtr) \ + (u16)InstReadReg((InstancePtr), XTTCPS_INTERVAL_VAL_OFFSET) +#else +/* + * ttc supports 32 bit interval counter for zynq ultrascale+mpsoc + */ +#define XTtcPs_GetInterval(InstancePtr) \ + InstReadReg((InstancePtr), XTTCPS_INTERVAL_VAL_OFFSET) +#endif +/*****************************************************************************/ +/** +* +* This macro resets the count register. It may be called at any time. The +* counter is reset to either 0 or 0xFFFF, or the interval value, depending on +* the increment/decrement mode. The state of the counter, as started or +* stopped, is not affected by calling reset. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return None +* +* @note C-style signature: +* void XTtcPs_ResetCounterValue(XTtcPs *InstancePtr) +* +****************************************************************************/ +#define XTtcPs_ResetCounterValue(InstancePtr) \ + InstWriteReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_CNT_CNTRL_OFFSET) | \ + (u32)XTTCPS_CNT_CNTRL_RST_MASK)) + +/*****************************************************************************/ +/** +* +* This function enables the interrupts. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param InterruptMask defines which interrupt should be enabled. +* Constants are defined in xttcps_hw.h as XTTCPS_IXR_*. +* This is a bit mask, all set bits will be enabled, cleared bits +* will not be disabled. +* +* @return None. +* +* @note +* C-style signature: +* void XTtcPs_EnableInterrupts(XTtcPs *InstancePtr, u32 InterruptMask) +* +******************************************************************************/ +#define XTtcPs_EnableInterrupts(InstancePtr, InterruptMask) \ + InstWriteReg((InstancePtr), XTTCPS_IER_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_IER_OFFSET) | \ + (InterruptMask))) + +/*****************************************************************************/ +/** +* +* This function disables the interrupts. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param InterruptMask defines which interrupt should be disabled. +* Constants are defined in xttcps_hw.h as XTTCPS_IXR_*. +* This is a bit mask, all set bits will be disabled, cleared bits +* will not be disabled. +* +* @return None. +* +* @note +* C-style signature: +* void XTtcPs_DisableInterrupts(XTtcPs *InstancePtr, u32 InterruptMask) +* +******************************************************************************/ +#define XTtcPs_DisableInterrupts(InstancePtr, InterruptMask) \ + InstWriteReg((InstancePtr), XTTCPS_IER_OFFSET, \ + (InstReadReg((InstancePtr), XTTCPS_IER_OFFSET) & \ + ~(InterruptMask))) + +/*****************************************************************************/ +/** +* +* This function reads the interrupt status. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return None. +* +* @note C-style signature: +* u32 XTtcPs_GetInterruptStatus(XTtcPs *InstancePtr) +* +******************************************************************************/ +#define XTtcPs_GetInterruptStatus(InstancePtr) \ + InstReadReg((InstancePtr), XTTCPS_ISR_OFFSET) + +/*****************************************************************************/ +/** +* +* This function clears the interrupt status. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* @param InterruptMask defines which interrupt should be cleared. +* Constants are defined in xttcps_hw.h as XTTCPS_IXR_*. +* This is a bit mask, all set bits will be cleared, cleared bits +* will not be cleared. +* +* @return None. +* +* @note +* C-style signature: +* void XTtcPs_ClearInterruptStatus(XTtcPs *InstancePtr, u32 InterruptMask) +* +******************************************************************************/ +#define XTtcPs_ClearInterruptStatus(InstancePtr, InterruptMask) \ + InstWriteReg((InstancePtr), XTTCPS_ISR_OFFSET, \ + (InterruptMask)) + + +/************************** Function Prototypes ******************************/ + +/* + * Initialization functions in xttcps_sinit.c + */ +XTtcPs_Config *XTtcPs_LookupConfig(u16 DeviceId); + +/* + * Required functions, in xttcps.c + */ +s32 XTtcPs_CfgInitialize(XTtcPs *InstancePtr, + XTtcPs_Config * ConfigPtr, u32 EffectiveAddr); + +void XTtcPs_SetMatchValue(XTtcPs *InstancePtr, u8 MatchIndex, XMatchRegValue Value); +XMatchRegValue XTtcPs_GetMatchValue(XTtcPs *InstancePtr, u8 MatchIndex); + +void XTtcPs_SetPrescaler(XTtcPs *InstancePtr, u8 PrescalerValue); +u8 XTtcPs_GetPrescaler(XTtcPs *InstancePtr); + +void XTtcPs_CalcIntervalFromFreq(XTtcPs *InstancePtr, u32 Freq, + XInterval *Interval, u8 *Prescaler); + +/* + * Functions for options, in file xttcps_options.c + */ +s32 XTtcPs_SetOptions(XTtcPs *InstancePtr, u32 Options); +u32 XTtcPs_GetOptions(XTtcPs *InstancePtr); + +/* + * Function for self-test, in file xttcps_selftest.c + */ +s32 XTtcPs_SelfTest(XTtcPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_g.c new file mode 100644 index 0000000..f88e5ef --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_g.c @@ -0,0 +1,66 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xttcps.h" + +/* +* The configuration table for devices +*/ + +XTtcPs_Config XTtcPs_ConfigTable[] = +{ + { + XPAR_PS7_TTC_0_DEVICE_ID, + XPAR_PS7_TTC_0_BASEADDR, + XPAR_PS7_TTC_0_TTC_CLK_FREQ_HZ + }, + { + XPAR_PS7_TTC_1_DEVICE_ID, + XPAR_PS7_TTC_1_BASEADDR, + XPAR_PS7_TTC_1_TTC_CLK_FREQ_HZ + }, + { + XPAR_PS7_TTC_2_DEVICE_ID, + XPAR_PS7_TTC_2_BASEADDR, + XPAR_PS7_TTC_2_TTC_CLK_FREQ_HZ + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_hw.h new file mode 100644 index 0000000..b1fa545 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_hw.h @@ -0,0 +1,233 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xttcps_hw.h +* @addtogroup ttcps_v3_5 +* @{ +* +* This file defines the hardware interface to one of the three timer counters +* in the Ps block. +* +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- -------------------------------------------------
    +* 1.00a drg/jz 01/21/10 First release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.5   srm    10/06/17 Updated XTTCPS_COUNT_VALUE_MASK,
    +*                       XTTCPS_INTERVAL_VAL_MASK, XTTCPS_MATCH_MASK macros to
    +*                       mask 16 bit values for zynq and 32 bit values for
    +*                       zynq ultrascale+mpsoc "
    +* 
    +* +******************************************************************************/ + +#ifndef XTTCPS_HW_H /* prevent circular inclusions */ +#define XTTCPS_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 *****************************/ +/* + * Flag for a9 processor + */ + #if !defined (ARMR5) && !defined (__aarch64__) && !defined (ARMA53_32) + #define ARMA9 + #endif + +/** @name Register Map + * + * Register offsets from the base address of the device. + * + * @{ + */ +#define XTTCPS_CLK_CNTRL_OFFSET 0x00000000U /**< Clock Control Register */ +#define XTTCPS_CNT_CNTRL_OFFSET 0x0000000CU /**< Counter Control Register*/ +#define XTTCPS_COUNT_VALUE_OFFSET 0x00000018U /**< Current Counter Value */ +#define XTTCPS_INTERVAL_VAL_OFFSET 0x00000024U /**< Interval Count Value */ +#define XTTCPS_MATCH_0_OFFSET 0x00000030U /**< Match 1 value */ +#define XTTCPS_MATCH_1_OFFSET 0x0000003CU /**< Match 2 value */ +#define XTTCPS_MATCH_2_OFFSET 0x00000048U /**< Match 3 value */ +#define XTTCPS_ISR_OFFSET 0x00000054U /**< Interrupt Status Register */ +#define XTTCPS_IER_OFFSET 0x00000060U /**< Interrupt Enable Register */ +/* @} */ + +/** @name Clock Control Register + * Clock Control Register definitions + * @{ + */ +#define XTTCPS_CLK_CNTRL_PS_EN_MASK 0x00000001U /**< Prescale enable */ +#define XTTCPS_CLK_CNTRL_PS_VAL_MASK 0x0000001EU /**< Prescale value */ +#define XTTCPS_CLK_CNTRL_PS_VAL_SHIFT 1U /**< Prescale shift */ +#define XTTCPS_CLK_CNTRL_PS_DISABLE 16U /**< Prescale disable */ +#define XTTCPS_CLK_CNTRL_SRC_MASK 0x00000020U /**< Clock source */ +#define XTTCPS_CLK_CNTRL_EXT_EDGE_MASK 0x00000040U /**< External Clock edge */ +/* @} */ + +/** @name Counter Control Register + * Counter Control Register definitions + * @{ + */ +#define XTTCPS_CNT_CNTRL_DIS_MASK 0x00000001U /**< Disable the counter */ +#define XTTCPS_CNT_CNTRL_INT_MASK 0x00000002U /**< Interval mode */ +#define XTTCPS_CNT_CNTRL_DECR_MASK 0x00000004U /**< Decrement mode */ +#define XTTCPS_CNT_CNTRL_MATCH_MASK 0x00000008U /**< Match mode */ +#define XTTCPS_CNT_CNTRL_RST_MASK 0x00000010U /**< Reset counter */ +#define XTTCPS_CNT_CNTRL_EN_WAVE_MASK 0x00000020U /**< Enable waveform */ +#define XTTCPS_CNT_CNTRL_POL_WAVE_MASK 0x00000040U /**< Waveform polarity */ +#define XTTCPS_CNT_CNTRL_RESET_VALUE 0x00000021U /**< Reset value */ +/* @} */ + +/** @name Current Counter Value Register + * Current Counter Value Register definitions + * @{ + */ +#if defined(ARMA9) +#define XTTCPS_COUNT_VALUE_MASK 0x0000FFFFU /**< 16-bit counter value */ +#else +#define XTTCPS_COUNT_VALUE_MASK 0xFFFFFFFFU /**< 32-bit counter value */ +#endif +/* @} */ + +/** @name Interval Value Register + * Interval Value Register is the maximum value the counter will count up or + * down to. + * @{ + */ +#if defined(ARMA9) +#define XTTCPS_INTERVAL_VAL_MASK 0x0000FFFFU /**< 16-bit Interval value*/ +#else +#define XTTCPS_INTERVAL_VAL_MASK 0xFFFFFFFFU /**< 32-bit Interval value*/ +#endif +/* @} */ + +/** @name Match Registers + * Definitions for Match registers, each timer counter has three match + * registers. + * @{ + */ +#if defined(ARMA9) +#define XTTCPS_MATCH_MASK 0x0000FFFFU /**< 16-bit Match value */ +#else +#define XTTCPS_MATCH_MASK 0xFFFFFFFFU /**< 32-bit Match value */ +#endif +#define XTTCPS_NUM_MATCH_REG 3U /**< Num of Match reg */ +/* @} */ + +/** @name Interrupt Registers + * Following register bit mask is for all interrupt registers. + * + * @{ + */ +#define XTTCPS_IXR_INTERVAL_MASK 0x00000001U /**< Interval Interrupt */ +#define XTTCPS_IXR_MATCH_0_MASK 0x00000002U /**< Match 1 Interrupt */ +#define XTTCPS_IXR_MATCH_1_MASK 0x00000004U /**< Match 2 Interrupt */ +#define XTTCPS_IXR_MATCH_2_MASK 0x00000008U /**< Match 3 Interrupt */ +#define XTTCPS_IXR_CNT_OVR_MASK 0x00000010U /**< Counter Overflow */ +#define XTTCPS_IXR_ALL_MASK 0x0000001FU /**< All valid Interrupts */ +/* @} */ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Read the given Timer Counter register. +* +* @param BaseAddress is the base address of the timer counter device. +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note C-style signature: +* u32 XTtcPs_ReadReg(u32 BaseAddress, u32 RegOffset) +* +*****************************************************************************/ +#define XTtcPs_ReadReg(BaseAddress, RegOffset) \ + (Xil_In32((BaseAddress) + (u32)(RegOffset))) + +/****************************************************************************/ +/** +* +* Write the given Timer Counter register. +* +* @param BaseAddress is the base address of the timer counter 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 XTtcPs_WriteReg(XTtcPs BaseAddress, u32 RegOffset, +* u32 Data) +* +*****************************************************************************/ +#define XTtcPs_WriteReg(BaseAddress, RegOffset, Data) \ + (Xil_Out32((BaseAddress) + (u32)(RegOffset), (u32)(Data))) + +/****************************************************************************/ +/** +* +* Calculate a match register offset using the Match Register index. +* +* @param MatchIndex is the 0-2 value of the match register +* +* @return MATCH_N_OFFSET. +* +* @note C-style signature: +* u32 XTtcPs_Match_N_Offset(u8 MatchIndex) +* +*****************************************************************************/ +#define XTtcPs_Match_N_Offset(MatchIndex) \ + ((u32)XTTCPS_MATCH_0_OFFSET + ((u32)(12U) * (u32)(MatchIndex))) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_options.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_options.c new file mode 100644 index 0000000..01dd9ef --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_options.c @@ -0,0 +1,243 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xttcps_options.c +* @addtogroup ttcps_v3_5 +* @{ +* +* This file contains functions to get or set option features for the device. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- ---------------------------------------------
    +* 1.00a drg/jz 01/21/10 First release
    +* 1.01a nm     03/05/2012 Removed break statement after return to remove
    +*                         compilation warnings.
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xttcps.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; + u32 Register; +} OptionsMap; + +static OptionsMap TmrCtrOptionsTable[] = { + {XTTCPS_OPTION_EXTERNAL_CLK, XTTCPS_CLK_CNTRL_SRC_MASK, + XTTCPS_CLK_CNTRL_OFFSET}, + {XTTCPS_OPTION_CLK_EDGE_NEG, XTTCPS_CLK_CNTRL_EXT_EDGE_MASK, + XTTCPS_CLK_CNTRL_OFFSET}, + {XTTCPS_OPTION_INTERVAL_MODE, XTTCPS_CNT_CNTRL_INT_MASK, + XTTCPS_CNT_CNTRL_OFFSET}, + {XTTCPS_OPTION_DECREMENT, XTTCPS_CNT_CNTRL_DECR_MASK, + XTTCPS_CNT_CNTRL_OFFSET}, + {XTTCPS_OPTION_MATCH_MODE, XTTCPS_CNT_CNTRL_MATCH_MASK, + XTTCPS_CNT_CNTRL_OFFSET}, + {XTTCPS_OPTION_WAVE_DISABLE, XTTCPS_CNT_CNTRL_EN_WAVE_MASK, + XTTCPS_CNT_CNTRL_OFFSET}, + {XTTCPS_OPTION_WAVE_POLARITY, XTTCPS_CNT_CNTRL_POL_WAVE_MASK, + XTTCPS_CNT_CNTRL_OFFSET}, +}; + +#define XTTCPS_NUM_TMRCTR_OPTIONS (sizeof(TmrCtrOptionsTable) / \ + sizeof(OptionsMap)) + +/*****************************************************************************/ +/** +* +* This function sets the options for the TTC device. +* +* @param InstancePtr is a pointer to the XTtcPs 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 XTTCPS_*_OPTION in +* the file xttcps.h. +* +* @return +* - XST_SUCCESS if options are successfully set. +* - XST_FAILURE if any of the options are unknown. +* +* @note None +* +******************************************************************************/ +s32 XTtcPs_SetOptions(XTtcPs *InstancePtr, u32 Options) +{ + u32 CountReg; + u32 ClockReg; + u32 Index; + s32 Status = XST_SUCCESS; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + ClockReg = XTtcPs_ReadReg(InstancePtr->Config.BaseAddress, + XTTCPS_CLK_CNTRL_OFFSET); + CountReg = XTtcPs_ReadReg(InstancePtr->Config.BaseAddress, + XTTCPS_CNT_CNTRL_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 = 0U; Index < XTTCPS_NUM_TMRCTR_OPTIONS; Index++) { + if(Status != (s32)XST_FAILURE) { + if ((Options & TmrCtrOptionsTable[Index].Option) != (u32)0) { + + switch (TmrCtrOptionsTable[Index].Register) { + + case XTTCPS_CLK_CNTRL_OFFSET: + /* Add option */ + ClockReg |= TmrCtrOptionsTable[Index].Mask; + break; + + case XTTCPS_CNT_CNTRL_OFFSET: + /* Add option */ + CountReg |= TmrCtrOptionsTable[Index].Mask; + break; + + default: + Status = XST_FAILURE; + break; + } + } + else { + switch (TmrCtrOptionsTable[Index].Register) { + + case XTTCPS_CLK_CNTRL_OFFSET: + /* Remove option*/ + ClockReg &= ~TmrCtrOptionsTable[Index].Mask; + break; + + case XTTCPS_CNT_CNTRL_OFFSET: + /* Remove option*/ + CountReg &= ~TmrCtrOptionsTable[Index].Mask; + break; + + default: + Status = XST_FAILURE; + break; + } + } + } + } + + /* + * Now write the registers. Leave it to the upper layers to restart the + * device. + */ + if (Status != (s32)XST_FAILURE ) { + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_CLK_CNTRL_OFFSET, ClockReg); + XTtcPs_WriteReg(InstancePtr->Config.BaseAddress, + XTTCPS_CNT_CNTRL_OFFSET, CountReg); + } + + return Status; +} + +/*****************************************************************************/ +/** +* +* This function gets the settings for the options for the TTC device. +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return +* +* The return u32 contains the specified options that are set. This is a bit +* mask where a '1' means the option is on, and a'0' means the option is off. +* One or more bit values may be contained in the mask. See the bit definitions +* named XTTCPS_*_OPTION in the file xttcps.h. +* +* @note None. +* +******************************************************************************/ +u32 XTtcPs_GetOptions(XTtcPs *InstancePtr) +{ + u32 OptionsFlag = 0U; + u32 Register; + u32 Index; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + /* + * Loop through the options table to determine which options are set + */ + for (Index = 0U; Index < XTTCPS_NUM_TMRCTR_OPTIONS; Index++) { + /* + * Get the control register to determine which options are + * currently set. + */ + Register = XTtcPs_ReadReg(InstancePtr->Config.BaseAddress, + TmrCtrOptionsTable[Index]. + Register); + + if ((Register & TmrCtrOptionsTable[Index].Mask) != (u32)0) { + OptionsFlag |= TmrCtrOptionsTable[Index].Option; + } + } + + return OptionsFlag; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_selftest.c new file mode 100644 index 0000000..b1dd7d0 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_selftest.c @@ -0,0 +1,109 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xttcps_selftest.c +* @addtogroup ttcps_v3_5 +* @{ +* +* This file contains the implementation of self test function for the +* XTtcPs driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- ---------------------------------------------
    +* 1.00a drg/jz 01/21/10 First release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xttcps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* +* Runs a self-test on the driver/device. +* +* +* @param InstancePtr is a pointer to the XTtcPs instance. +* +* @return +* +* - XST_SUCCESS if successful +* - XST_FAILURE indicates a register did not read or write correctly +* +* @note This test fails if it is not called right after initialization. +* +******************************************************************************/ +s32 XTtcPs_SelfTest(XTtcPs *InstancePtr) +{ + s32 Status; + u32 TempReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * All the TTC registers should be in their default state right now. + */ + TempReg = XTtcPs_ReadReg(InstancePtr->Config.BaseAddress, + XTTCPS_CNT_CNTRL_OFFSET); + if (XTTCPS_CNT_CNTRL_RESET_VALUE != (u32)TempReg) { + Status = XST_FAILURE; + } + else { + Status = XST_SUCCESS; + } + return Status; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_sinit.c new file mode 100644 index 0000000..4684c8a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/ttcps_v3_6/src/xttcps_sinit.c @@ -0,0 +1,98 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xttcps_sinit.c +* @addtogroup ttcps_v3_5 +* @{ +* +* The implementation of the XTtcPs driver's static initialization functionality. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- ------ -------- ---------------------------------------------
    +* 1.00a drg/jz 01/21/10 First release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xttcps.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +extern XTtcPs_Config XTtcPs_ConfigTable[XPAR_XTTCPS_NUM_INSTANCES]; + +/*****************************************************************************/ +/** +* +* 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 unique ID of the device +* +* @return +* +* A pointer to the configuration found or NULL if the specified device ID was +* not found. See xttcps.h for the definition of XTtcPs_Config. +* +* @note None. +* +******************************************************************************/ +XTtcPs_Config *XTtcPs_LookupConfig(u16 DeviceId) +{ + XTtcPs_Config *CfgPtr = NULL; + u32 Index; + + for (Index = 0U; Index < (u32)XPAR_XTTCPS_NUM_INSTANCES; Index++) { + if (XTtcPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XTtcPs_ConfigTable[Index]; + break; + } + } + + return (XTtcPs_Config *)CfgPtr; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps.c new file mode 100644 index 0000000..c33ec54 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps.c @@ -0,0 +1,645 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps.c +* @addtogroup uartps_v3_5 +* @{ +* +* This file contains the implementation of the interface functions for XUartPs +* driver. Refer to the header file xuartps.h for more detailed information. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	 Changes
    +* ----- ------ -------- ----------------------------------------------
    +* 1.00	drg/jz 01/13/10 First Release
    +* 2.2   hk     06/23/14 SW reset of RX and TX should be done when changing
    +*                       baud rate. CR# 804281.
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn    04/10/15 Modified code for latest RTL changes.
    +* 3.5	NK     09/26/17 Fix the RX Buffer Overflow issue.
    +* 
    +* +*****************************************************************************/ + +/***************************** 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 3U /* max % error allowed */ + +/**************************** Type Definitions ******************************/ + + +/***************** Macros (Inline Functions) Definitions ********************/ + + +/************************** Function Prototypes *****************************/ + +static void XUartPs_StubHandler(void *CallBackRef, u32 Event, + u32 ByteCount); + +u32 XUartPs_SendBuffer(XUartPs *InstancePtr); + +u32 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. +* +*****************************************************************************/ +s32 XUartPs_CfgInitialize(XUartPs *InstancePtr, + XUartPs_Config * Config, u32 EffectiveAddr) +{ + s32 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 = 0U; + InstancePtr->SendBuffer.RequestedBytes = 0U; + + InstancePtr->ReceiveBuffer.NextBytePtr = NULL; + InstancePtr->ReceiveBuffer.RemainingBytes = 0U; + InstancePtr->ReceiveBuffer.RequestedBytes = 0U; + + /* Initialize the platform data */ + InstancePtr->Platform = XGetPlatform_Info(); + + InstancePtr->is_rxbs_error = 0U; + + /* 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 = (u32)XUARTPS_DFT_BAUDRATE; + Status = XUartPs_SetBaudRate(InstancePtr, BaudRate); + if (Status != (s32)XST_SUCCESS) { + InstancePtr->IsReady = 0U; + } else { + + /* + * 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 &= (~((u32)XUARTPS_MR_CHARLEN_MASK | + (u32)XUARTPS_MR_STOPMODE_MASK | + (u32)XUARTPS_MR_PARITY_MASK)); + + /* Set the register value to the desired data format */ + ModeRegister |= ((u32)XUARTPS_MR_CHARLEN_8_BIT | + (u32)XUARTPS_MR_STOPMODE_1_BIT | + (u32)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, 0x08U); + + /* Set the RX timeout to 1, which will be 4 character time */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_RXTOUT_OFFSET, 0x01U); + + /* Disable all interrupts, polled mode is the default */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_IDR_OFFSET, + XUARTPS_IXR_MASK); + + Status = XST_SUCCESS; + } + return Status; +} + +/****************************************************************************/ +/** +* +* 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. +*

    +* +*****************************************************************************/ +u32 XUartPs_Send(XUartPs *InstancePtr, u8 *BufferPtr, + u32 NumBytes) +{ + u32 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. +* +*****************************************************************************/ +u32 XUartPs_Recv(XUartPs *InstancePtr, + u8 *BufferPtr, u32 NumBytes) +{ + u32 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. +* +*****************************************************************************/ +u32 XUartPs_SendBuffer(XUartPs *InstancePtr) +{ + u32 SentCount = 0U; + 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, + ((u32)InstancePtr->SendBuffer. + NextBytePtr[SentCount])); + + /* Increment 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) != (u32)0) || + ((ImrRegister & XUARTPS_IXR_RXEMPTY) != (u32)0)|| + ((ImrRegister & XUARTPS_IXR_RXOVR) != (u32)0)) { + + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_IER_OFFSET, + ImrRegister | (u32)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. +* +*****************************************************************************/ +u32 XUartPs_ReceiveBuffer(XUartPs *InstancePtr) +{ + u32 CsrRegister; + u32 ReceivedCount = 0U; + u32 ByteStatusValue, EventData; + u32 Event; + + /* + * 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)&& + (((CsrRegister & XUARTPS_SR_RXEMPTY) == (u32)0))){ + + if (InstancePtr->is_rxbs_error) { + ByteStatusValue = XUartPs_ReadReg( + InstancePtr->Config.BaseAddress, + XUARTPS_RXBS_OFFSET); + if((ByteStatusValue & XUARTPS_RXBS_MASK)!= (u32)0) { + EventData = ByteStatusValue; + Event = XUARTPS_EVENT_PARE_FRAME_BRKE; + /* + * 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, + Event, EventData); + } + } + + InstancePtr->ReceiveBuffer.NextBytePtr[ReceivedCount] = + XUartPs_ReadReg(InstancePtr->Config. + BaseAddress, + XUARTPS_FIFO_OFFSET); + + ReceivedCount++; + + CsrRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_SR_OFFSET); + } + InstancePtr->is_rxbs_error = 0; + /* + * Update the receive buffer to reflect the number of bytes just + * received + */ + if(InstancePtr->ReceiveBuffer.NextBytePtr != NULL){ + 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. +* +*****************************************************************************/ +s32 XUartPs_SetBaudRate(XUartPs *InstancePtr, u32 BaudRate) +{ + u32 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 = 0U; /* Best value for baud rate generator */ + u8 Best_BAUDDIV = 0U; /* Best value for baud divisor */ + u32 Best_Error = 0xFFFFFFFFU; + 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 <= (u32)XUARTPS_MAX_RATE); + Xil_AssertNonvoid(BaudRate >= (u32)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); + + /* RX and TX SW reset */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_CR_OFFSET, + XUARTPS_CR_TXRST | XUARTPS_CR_RXRST); + + /* 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, + u32 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps.h new file mode 100644 index 0000000..33758c2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps.h @@ -0,0 +1,520 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps.h +* @addtogroup uartps_v3_5 +* @{ +* @details +* +* 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 +* +* Initialization & Configuration +* +* 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. +* +* Baud Rate +* +* 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: +*
    +*	baud_rate = input_clock / (bgen * (bdiv + 1)
    +* 
    +* where bgen is the value of the baud rate generator, and bdiv is the value of +* baud rate divider. +* +* Interrupts +* +* 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. +* +* Data Transfer +* +* 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) +* +*
    +* 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.
    +* 2.0   hk      03/07/14 Version number revised.
    +* 2.1   hk     04/16/14 Change XUARTPS_MAX_RATE to 921600. CR# 780625.
    +* 2.2   hk     06/23/14 SW reset of RX and TX should be done when changing
    +*                       baud rate. CR# 804281.
    +* 3.0   vm     12/09/14 Modified source code according to misrac guideline.
    +*			Support for Zynq Ultrascale Mp added.
    +* 3.1	kvn    04/10/15 Modified code for latest RTL changes. Also added
    +*						platform variable in driver instance structure.
    +* 3.1   adk   14/03/16  Include interrupt examples in the peripheral test when
    +*			uart is connected to a valid interrupt controller CR#946803.
    +* 3.2   rk     07/20/16 Modified the logic for transmission break bit set
    +* 3.4   ms     01/23/17 Added xil_printf statement in main function for all
    +*                       examples to ensure that "Successfully ran" and "Failed"
    +*                       strings are available in all examples. This is a fix
    +*                       for CR-965028.
    +*       ms     03/17/17 Added readme.txt file in examples folder for doxygen
    +*                       generation.
    +* 3.6   ms     02/16/18 Updates the flow control mode offset value in modem
    +*                       control register.
    +*
    +* 
    +* +*****************************************************************************/ + +#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" +#include "xplatform_info.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 921600U +#define XUARTPS_MIN_RATE 110U + +#define XUARTPS_DFT_BAUDRATE 115200U /* 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 0x0080U /**< Starts break transmission */ +#define XUARTPS_OPTION_STOP_BREAK 0x0040U /**< Stops break transmission */ +#define XUARTPS_OPTION_RESET_TMOUT 0x0020U /**< Reset the receive timeout */ +#define XUARTPS_OPTION_RESET_TX 0x0010U /**< Reset the transmitter */ +#define XUARTPS_OPTION_RESET_RX 0x0008U /**< Reset the receiver */ +#define XUARTPS_OPTION_ASSERT_RTS 0x0004U /**< Assert the RTS bit */ +#define XUARTPS_OPTION_ASSERT_DTR 0x0002U /**< Assert the DTR bit */ +#define XUARTPS_OPTION_SET_FCM 0x0001U /**< 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 (u8)0x00U /**< Normal Mode */ +#define XUARTPS_OPER_MODE_AUTO_ECHO (u8)0x01U /**< Auto Echo Mode */ +#define XUARTPS_OPER_MODE_LOCAL_LOOP (u8)0x02U /**< Local Loopback Mode */ +#define XUARTPS_OPER_MODE_REMOTE_LOOP (u8)0x03U /**< 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 0U /**< 8 data bits */ +#define XUARTPS_FORMAT_7_BITS 2U /**< 7 data bits */ +#define XUARTPS_FORMAT_6_BITS 3U /**< 6 data bits */ + +#define XUARTPS_FORMAT_NO_PARITY 4U /**< No parity */ +#define XUARTPS_FORMAT_MARK_PARITY 3U /**< Mark parity */ +#define XUARTPS_FORMAT_SPACE_PARITY 2U /**< parity */ +#define XUARTPS_FORMAT_ODD_PARITY 1U /**< Odd parity */ +#define XUARTPS_FORMAT_EVEN_PARITY 0U /**< Even parity */ + +#define XUARTPS_FORMAT_2_STOP_BIT 2U /**< 2 stop bits */ +#define XUARTPS_FORMAT_1_5_STOP_BIT 1U /**< 1.5 stop bits */ +#define XUARTPS_FORMAT_1_STOP_BIT 0U /**< 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 1U /**< Data receiving done */ +#define XUARTPS_EVENT_RECV_TOUT 2U /**< A receive timeout occurred */ +#define XUARTPS_EVENT_SENT_DATA 3U /**< Data transmission done */ +#define XUARTPS_EVENT_RECV_ERROR 4U /**< A receive error detected */ +#define XUARTPS_EVENT_MODEM 5U /**< Modem status changed */ +#define XUARTPS_EVENT_PARE_FRAME_BRKE 6U /**< A receive parity, frame, break + * error detected */ +#define XUARTPS_EVENT_RECV_ORERR 7U /**< A receive overrun error detected */ +/*@}*/ + + +/**************************** 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 */ + s32 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; + u32 RequestedBytes; + u32 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, + u32 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 */ + u32 Platform; + u8 is_rxbs_error; +} 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) + (u32)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) + (u32)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) + (u32)XUARTPS_CR_OFFSET, \ + (u32)(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 + (u32)XUARTPS_CR_OFFSET), \ + ((Xil_In32((InstancePtr)->Config.BaseAddress + (u32)XUARTPS_CR_OFFSET) & \ + (u32)(~XUARTPS_CR_EN_DIS_MASK)) | ((u32)XUARTPS_CR_RX_EN | (u32)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 + (u32)XUARTPS_CR_OFFSET), \ + (((Xil_In32((InstancePtr)->Config.BaseAddress + (u32)XUARTPS_CR_OFFSET)) & \ + (u32)(~XUARTPS_CR_EN_DIS_MASK)) | ((u32)XUARTPS_CR_RX_DIS | (u32)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) + (u32)XUARTPS_SR_OFFSET) & \ + (u32)XUARTPS_SR_TXEMPTY) == (u32)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 */ +s32 XUartPs_CfgInitialize(XUartPs *InstancePtr, + XUartPs_Config * Config, u32 EffectiveAddr); + +u32 XUartPs_Send(XUartPs *InstancePtr,u8 *BufferPtr, + u32 NumBytes); + +u32 XUartPs_Recv(XUartPs *InstancePtr,u8 *BufferPtr, + u32 NumBytes); + +s32 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); + +s32 XUartPs_SetDataFormat(XUartPs *InstancePtr, XUartPsFormat * FormatPtr); + +void XUartPs_GetDataFormat(XUartPs *InstancePtr, XUartPsFormat * FormatPtr); + +/* 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 */ +s32 XUartPs_SelfTest(XUartPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_g.c new file mode 100644 index 0000000..2956620 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_g.c @@ -0,0 +1,57 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xuartps.h" + +/* +* The configuration table for devices +*/ + +XUartPs_Config XUartPs_ConfigTable[XPAR_XUARTPS_NUM_INSTANCES] = +{ + { + 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_hw.c new file mode 100644 index 0000000..724c3cb --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_hw.c @@ -0,0 +1,180 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_hw.c +* @addtogroup uartps_v3_5 +* @{ +* +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- ------ -------- ----------------------------------------------
    +* 1.00	drg/jz 01/12/10 First Release
    +* 1.05a hk     08/22/13 Added reset function
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +*****************************************************************************/ + +/***************************** 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, (u32)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) +{ + u32 RecievedByte; + /* Wait until there is data */ + while (!XUartPs_IsReceiveData(BaseAddress)) { + ; + } + RecievedByte = XUartPs_ReadReg(BaseAddress, XUARTPS_FIFO_OFFSET); + /* Return the byte received */ + return (u8)RecievedByte; +} + +/****************************************************************************/ +/** +* +* 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, + ((u32)XUARTPS_CR_RX_DIS | (u32)XUARTPS_CR_TX_DIS)); + + /* + * Software reset of receive and transmit + * This clears the FIFO. + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_CR_OFFSET, + ((u32)XUARTPS_CR_TXRST | (u32)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, + ((u32)XUARTPS_CR_RX_DIS | (u32)XUARTPS_CR_TX_DIS | + (u32)XUARTPS_CR_STOPBRK)); + +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_hw.h new file mode 100644 index 0000000..9a2bc43 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_hw.h @@ -0,0 +1,451 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2017 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xuartps_hw.h +* @addtogroup uartps_v3_5 +* @{ +* +* This header file contains the hardware interface of an XUartPs device. +* +*
    +* 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.
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn    04/10/15 Modified code for latest RTL changes.
    +* 3.6   ms     02/16/18 Updates flow control mode offset value in
    +*			modem control register.
    +*
    +* 
    +* +******************************************************************************/ +#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 0x0000U /**< Control Register [8:0] */ +#define XUARTPS_MR_OFFSET 0x0004U /**< Mode Register [9:0] */ +#define XUARTPS_IER_OFFSET 0x0008U /**< Interrupt Enable [12:0] */ +#define XUARTPS_IDR_OFFSET 0x000CU /**< Interrupt Disable [12:0] */ +#define XUARTPS_IMR_OFFSET 0x0010U /**< Interrupt Mask [12:0] */ +#define XUARTPS_ISR_OFFSET 0x0014U /**< Interrupt Status [12:0]*/ +#define XUARTPS_BAUDGEN_OFFSET 0x0018U /**< Baud Rate Generator [15:0] */ +#define XUARTPS_RXTOUT_OFFSET 0x001CU /**< RX Timeout [7:0] */ +#define XUARTPS_RXWM_OFFSET 0x0020U /**< RX FIFO Trigger Level [5:0] */ +#define XUARTPS_MODEMCR_OFFSET 0x0024U /**< Modem Control [5:0] */ +#define XUARTPS_MODEMSR_OFFSET 0x0028U /**< Modem Status [8:0] */ +#define XUARTPS_SR_OFFSET 0x002CU /**< Channel Status [14:0] */ +#define XUARTPS_FIFO_OFFSET 0x0030U /**< FIFO [7:0] */ +#define XUARTPS_BAUDDIV_OFFSET 0x0034U /**< Baud Rate Divider [7:0] */ +#define XUARTPS_FLOWDEL_OFFSET 0x0038U /**< Flow Delay [5:0] */ +#define XUARTPS_TXWM_OFFSET 0x0044U /**< TX FIFO Trigger Level [5:0] */ +#define XUARTPS_RXBS_OFFSET 0x0048U /**< RX FIFO Byte Status [11:0] */ +/* @} */ + +/** @name Control Register + * + * The Control register (CR) controls the major functions of the device. + * + * Control Register Bit Definition + */ + +#define XUARTPS_CR_STOPBRK 0x00000100U /**< Stop transmission of break */ +#define XUARTPS_CR_STARTBRK 0x00000080U /**< Set break */ +#define XUARTPS_CR_TORST 0x00000040U /**< RX timeout counter restart */ +#define XUARTPS_CR_TX_DIS 0x00000020U /**< TX disabled. */ +#define XUARTPS_CR_TX_EN 0x00000010U /**< TX enabled */ +#define XUARTPS_CR_RX_DIS 0x00000008U /**< RX disabled. */ +#define XUARTPS_CR_RX_EN 0x00000004U /**< RX enabled */ +#define XUARTPS_CR_EN_DIS_MASK 0x0000003CU /**< Enable/disable Mask */ +#define XUARTPS_CR_TXRST 0x00000002U /**< TX logic reset */ +#define XUARTPS_CR_RXRST 0x00000001U /**< 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 0x00000400U /**< Input clock selection */ +#define XUARTPS_MR_CHMODE_R_LOOP 0x00000300U /**< Remote loopback mode */ +#define XUARTPS_MR_CHMODE_L_LOOP 0x00000200U /**< Local loopback mode */ +#define XUARTPS_MR_CHMODE_ECHO 0x00000100U /**< Auto echo mode */ +#define XUARTPS_MR_CHMODE_NORM 0x00000000U /**< Normal mode */ +#define XUARTPS_MR_CHMODE_SHIFT 8U /**< Mode shift */ +#define XUARTPS_MR_CHMODE_MASK 0x00000300U /**< Mode mask */ +#define XUARTPS_MR_STOPMODE_2_BIT 0x00000080U /**< 2 stop bits */ +#define XUARTPS_MR_STOPMODE_1_5_BIT 0x00000040U /**< 1.5 stop bits */ +#define XUARTPS_MR_STOPMODE_1_BIT 0x00000000U /**< 1 stop bit */ +#define XUARTPS_MR_STOPMODE_SHIFT 6U /**< Stop bits shift */ +#define XUARTPS_MR_STOPMODE_MASK 0x000000A0U /**< Stop bits mask */ +#define XUARTPS_MR_PARITY_NONE 0x00000020U /**< No parity mode */ +#define XUARTPS_MR_PARITY_MARK 0x00000018U /**< Mark parity mode */ +#define XUARTPS_MR_PARITY_SPACE 0x00000010U /**< Space parity mode */ +#define XUARTPS_MR_PARITY_ODD 0x00000008U /**< Odd parity mode */ +#define XUARTPS_MR_PARITY_EVEN 0x00000000U /**< Even parity mode */ +#define XUARTPS_MR_PARITY_SHIFT 3U /**< Parity setting shift */ +#define XUARTPS_MR_PARITY_MASK 0x00000038U /**< Parity mask */ +#define XUARTPS_MR_CHARLEN_6_BIT 0x00000006U /**< 6 bits data */ +#define XUARTPS_MR_CHARLEN_7_BIT 0x00000004U /**< 7 bits data */ +#define XUARTPS_MR_CHARLEN_8_BIT 0x00000000U /**< 8 bits data */ +#define XUARTPS_MR_CHARLEN_SHIFT 1U /**< Data Length shift */ +#define XUARTPS_MR_CHARLEN_MASK 0x00000006U /**< Data length mask */ +#define XUARTPS_MR_CLKSEL 0x00000001U /**< 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_RBRK 0x00002000U /**< Rx FIFO break detect interrupt */ +#define XUARTPS_IXR_TOVR 0x00001000U /**< Tx FIFO Overflow interrupt */ +#define XUARTPS_IXR_TNFUL 0x00000800U /**< Tx FIFO Nearly Full interrupt */ +#define XUARTPS_IXR_TTRIG 0x00000400U /**< Tx Trig interrupt */ +#define XUARTPS_IXR_DMS 0x00000200U /**< Modem status change interrupt */ +#define XUARTPS_IXR_TOUT 0x00000100U /**< Timeout error interrupt */ +#define XUARTPS_IXR_PARITY 0x00000080U /**< Parity error interrupt */ +#define XUARTPS_IXR_FRAMING 0x00000040U /**< Framing error interrupt */ +#define XUARTPS_IXR_OVER 0x00000020U /**< Overrun error interrupt */ +#define XUARTPS_IXR_TXFULL 0x00000010U /**< TX FIFO full interrupt. */ +#define XUARTPS_IXR_TXEMPTY 0x00000008U /**< TX FIFO empty interrupt. */ +#define XUARTPS_IXR_RXFULL 0x00000004U /**< RX FIFO full interrupt. */ +#define XUARTPS_IXR_RXEMPTY 0x00000002U /**< RX FIFO empty interrupt. */ +#define XUARTPS_IXR_RXOVR 0x00000001U /**< RX FIFO trigger interrupt. */ +#define XUARTPS_IXR_MASK 0x00003FFFU /**< 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 0x00000000U /**< Disable clock */ +#define XUARTPS_BAUDGEN_MASK 0x0000FFFFU /**< Valid bits mask */ +#define XUARTPS_BAUDGEN_RESET_VAL 0x0000028BU /**< 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 0x000000FFU /**< 8 bit baud divider mask */ +#define XUARTPS_BAUDDIV_RESET_VAL 0x0000000FU /**< 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 0x00000000U /**< Disable time out */ +#define XUARTPS_RXTOUT_MASK 0x000000FFU /**< 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 0x00000000U /**< Disable RX trigger interrupt */ +#define XUARTPS_RXWM_MASK 0x0000003FU /**< Valid bits mask */ +#define XUARTPS_RXWM_RESET_VAL 0x00000020U /**< 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 0x0000003FU /**< Valid bits mask */ +#define XUARTPS_TXWM_RESET_VAL 0x00000020U /**< 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 0x00000020U /**< Flow control mode */ +#define XUARTPS_MODEMCR_RTS 0x00000002U /**< Request to send */ +#define XUARTPS_MODEMCR_DTR 0x00000001U /**< 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 0x00000100U /**< Flow control mode (FCMS) */ +#define XUARTPS_MODEMSR_DCD 0x00000080U /**< Complement of DCD input */ +#define XUARTPS_MODEMSR_RI 0x00000040U /**< Complement of RI input */ +#define XUARTPS_MODEMSR_DSR 0x00000020U /**< Complement of DSR input */ +#define XUARTPS_MODEMSR_CTS 0x00000010U /**< Complement of CTS input */ +#define XUARTPS_MODEMSR_DDCD 0x00000008U /**< Delta DCD indicator */ +#define XUARTPS_MODEMSR_TERI 0x00000004U /**< Trailing Edge Ring Indicator */ +#define XUARTPS_MODEMSR_DDSR 0x00000002U /**< Change of DSR */ +#define XUARTPS_MODEMSR_DCTS 0x00000001U /**< 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 0x00004000U /**< TX FIFO Nearly Full Status */ +#define XUARTPS_SR_TTRIG 0x00002000U /**< TX FIFO Trigger Status */ +#define XUARTPS_SR_FLOWDEL 0x00001000U /**< RX FIFO fill over flow delay */ +#define XUARTPS_SR_TACTIVE 0x00000800U /**< TX active */ +#define XUARTPS_SR_RACTIVE 0x00000400U /**< RX active */ +#define XUARTPS_SR_TXFULL 0x00000010U /**< TX FIFO full */ +#define XUARTPS_SR_TXEMPTY 0x00000008U /**< TX FIFO empty */ +#define XUARTPS_SR_RXFULL 0x00000004U /**< RX FIFO full */ +#define XUARTPS_SR_RXEMPTY 0x00000002U /**< RX FIFO empty */ +#define XUARTPS_SR_RXOVR 0x00000001U /**< 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 */ +/* @} */ + +/** @name Receiver FIFO Byte Status Register + * + * The Receiver FIFO Status register is used to have a continuous + * monitoring of the raw unmasked byte status information. The register + * contains frame, parity and break status information for the top + * four bytes in the RX FIFO. + * + * Receiver FIFO Byte Status Register Bit Definition + * @{ + */ +#define XUARTPS_RXBS_BYTE3_BRKE 0x00000800U /**< Byte3 Break Error */ +#define XUARTPS_RXBS_BYTE3_FRME 0x00000400U /**< Byte3 Frame Error */ +#define XUARTPS_RXBS_BYTE3_PARE 0x00000200U /**< Byte3 Parity Error */ +#define XUARTPS_RXBS_BYTE2_BRKE 0x00000100U /**< Byte2 Break Error */ +#define XUARTPS_RXBS_BYTE2_FRME 0x00000080U /**< Byte2 Frame Error */ +#define XUARTPS_RXBS_BYTE2_PARE 0x00000040U /**< Byte2 Parity Error */ +#define XUARTPS_RXBS_BYTE1_BRKE 0x00000020U /**< Byte1 Break Error */ +#define XUARTPS_RXBS_BYTE1_FRME 0x00000010U /**< Byte1 Frame Error */ +#define XUARTPS_RXBS_BYTE1_PARE 0x00000008U /**< Byte1 Parity Error */ +#define XUARTPS_RXBS_BYTE0_BRKE 0x00000004U /**< Byte0 Break Error */ +#define XUARTPS_RXBS_BYTE0_FRME 0x00000002U /**< Byte0 Frame Error */ +#define XUARTPS_RXBS_BYTE0_PARE 0x00000001U /**< Byte0 Parity Error */ +#define XUARTPS_RXBS_MASK 0x00000007U /**< 3 bit RX byte status 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) + (u32)(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) + (u32)(RegOffset), (u32)(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) & \ + (u32)XUARTPS_SR_RXEMPTY) == (u32)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) & \ + (u32)XUARTPS_SR_TXFULL) == (u32)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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_intr.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_intr.c new file mode 100644 index 0000000..dff02fd --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_intr.c @@ -0,0 +1,450 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_intr.c +* @addtogroup uartps_v3_5 +* @{ +* +* This file contains the functions for interrupt handling +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- ------ -------- -----------------------------------------------
    +* 1.00  drg/jz 01/13/10 First Release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.1	kvn    04/10/15 Modified code for latest RTL changes.
    +* 
    +* +*****************************************************************************/ + +/***************************** 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, u32 IsrStatus); +static void ReceiveTimeoutHandler(XUartPs *InstancePtr); +static void ModemHandler(XUartPs *InstancePtr); + + +/* Internal function prototypes implemented in xuartps.c */ +extern u32 XUartPs_ReceiveBuffer(XUartPs *InstancePtr); +extern u32 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) +{ + u32 TempMask = Mask; + /* Assert validates the input arguments */ + Xil_AssertVoid(InstancePtr != NULL); + + TempMask &= (u32)XUARTPS_IXR_MASK; + + /* Write the mask to the IER Register */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_IER_OFFSET, TempMask); + + /* Write the inverse of the Mask to the IDR register */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_IDR_OFFSET, (~TempMask)); + +} + +/****************************************************************************/ +/** +* +* 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 appropriate handler. */ + if((IsrStatus & ((u32)XUARTPS_IXR_RXOVR | (u32)XUARTPS_IXR_RXEMPTY | + (u32)XUARTPS_IXR_RXFULL)) != (u32)0) { + /* Received data interrupt */ + ReceiveDataHandler(InstancePtr); + } + + if((IsrStatus & ((u32)XUARTPS_IXR_TXEMPTY | (u32)XUARTPS_IXR_TXFULL)) + != (u32)0) { + /* Transmit data interrupt */ + SendDataHandler(InstancePtr, IsrStatus); + } + + /* XUARTPS_IXR_RBRK is applicable only for Zynq Ultrascale+ MP */ + if ((IsrStatus & ((u32)XUARTPS_IXR_OVER | (u32)XUARTPS_IXR_FRAMING | + (u32)XUARTPS_IXR_PARITY | (u32)XUARTPS_IXR_RBRK)) != (u32)0) { + /* Received Error Status interrupt */ + ReceiveErrorHandler(InstancePtr, IsrStatus); + } + + if((IsrStatus & ((u32)XUARTPS_IXR_TOUT)) != (u32)0) { + /* Received Timeout interrupt */ + ReceiveTimeoutHandler(InstancePtr); + } + + if((IsrStatus & ((u32)XUARTPS_IXR_DMS)) != (u32)0) { + /* 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, u32 IsrStatus) +{ + u32 EventData; + u32 Event; + + InstancePtr->is_rxbs_error = 0; + + if ((InstancePtr->Platform == XPLAT_ZYNQ_ULTRA_MP) && + (IsrStatus & ((u32)XUARTPS_IXR_PARITY | (u32)XUARTPS_IXR_RBRK + | (u32)XUARTPS_IXR_FRAMING))) { + InstancePtr->is_rxbs_error = 1; + } + /* + * 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. + */ + + (void)XUartPs_ReceiveBuffer(InstancePtr); + + if (!(InstancePtr->is_rxbs_error)) { + Event = XUARTPS_EVENT_RECV_ERROR; + EventData = InstancePtr->ReceiveBuffer.RequestedBytes - + InstancePtr->ReceiveBuffer.RemainingBytes; + + /* + * 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, + Event, + EventData); + } +} + +/****************************************************************************/ +/** +* +* 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 != (u32)0) { + (void)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 != (u32)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 != (u32)0) { + (void)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 == (u32)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 == (u32)0) { + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_IDR_OFFSET, + ((u32)XUARTPS_IXR_TXEMPTY | (u32)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 & ((u32)XUARTPS_IXR_TXEMPTY)) != (u32)0) { + (void)XUartPs_SendBuffer(InstancePtr); + } + else { + /* Else with dummy entry for MISRA-C Compliance.*/ + ; + } +} + +/****************************************************************************/ +/** +* +* 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_options.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_options.c new file mode 100644 index 0000000..5d8d301 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_options.c @@ -0,0 +1,764 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_options.c +* @addtogroup uartps_v3_5 +* @{ +* +* The implementation of the options functions for the XUartPs driver. +* +*
    +* 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.
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 3.2   rk     07/20/16 Modified the logic for transmission break bit set
    +*
    +* 
    +* +*****************************************************************************/ + +/***************************** 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 = 0U; + u32 Register; + u32 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 = 0U; 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) != (u32)0) { + 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) +{ + u32 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 = 0U; 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) != (u16)0) { + if(OptionsTable[Index].Option == XUARTPS_OPTION_SET_BREAK) + Register &= ~XUARTPS_CR_STOPBRK; + 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 */ + + RtrigRegister &= (u8)XUARTPS_RXWM_MASK; + return RtrigRegister; +} + +/****************************************************************************/ +/** +* +* 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 <= (u8)XUARTPS_RXWM_MASK); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + RtrigRegister = ((u32)TriggerLevel) & (u32)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; + u16 TmpRegister; + /* 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); + TmpRegister = (u16)ModemStatusRegister; + return TmpRegister; +} + +/****************************************************************************/ +/** +* +* 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; + u32 ChanTmpSRegister; + u32 ActiveResult; + u32 EmptyResult; + + /* 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 + */ + ActiveResult = ChanStatRegister & ((u32)XUARTPS_SR_TACTIVE); + EmptyResult = ChanStatRegister & ((u32)XUARTPS_SR_TXEMPTY); + ChanTmpSRegister = (((u32)XUARTPS_SR_TACTIVE) == ActiveResult) || + (((u32)XUARTPS_SR_TXEMPTY) != EmptyResult); + + return ChanTmpSRegister; +} + +/****************************************************************************/ +/** +* +* 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 &= (u32)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 & (u32)XUARTPS_MR_CHMODE_MASK) >> + XUARTPS_MR_CHMODE_SHIFT); + break; + } + + 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 &= (u32)(~XUARTPS_MR_CHMODE_MASK); + + switch (OperationMode) { + case XUARTPS_OPER_MODE_NORMAL: + ModeRegister |= (u32)XUARTPS_MR_CHMODE_NORM; + break; + case XUARTPS_OPER_MODE_AUTO_ECHO: + ModeRegister |= (u32)XUARTPS_MR_CHMODE_ECHO; + break; + case XUARTPS_OPER_MODE_LOCAL_LOOP: + ModeRegister |= (u32)XUARTPS_MR_CHMODE_L_LOOP; + break; + case XUARTPS_OPER_MODE_REMOTE_LOOP: + ModeRegister |= (u32)XUARTPS_MR_CHMODE_R_LOOP; + break; + default: + /* Default case made for MISRA-C Compliance. */ + 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 FdelTmpRegister; + + /* Assert validates the input arguments */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Read the Mode register. */ + FdelTmpRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_FLOWDEL_OFFSET); + + /* Return the contents of the flow delay register */ + FdelTmpRegister = (u8)(FdelTmpRegister & (u32)XUARTPS_FLOWDEL_MASK); + return FdelTmpRegister; +} + +/****************************************************************************/ +/** +* +* 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 > (u8)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 = ((u32)FlowDelayValue) & (u32)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; + u8 RtoRTmpRegister; + + /* Assert validates the input arguments */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Read the Receive Timeout register. */ + RtoRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_RXTOUT_OFFSET); + + /* Return the contents of the mode register shifted appropriately */ + RtoRTmpRegister = (u8)(RtoRegister & (u32)XUARTPS_RXTOUT_MASK); + return RtoRTmpRegister; +} + +/****************************************************************************/ +/** +* +* 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 = ((u32)RecvTimeout & (u32)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. +*

    +* +*****************************************************************************/ +s32 XUartPs_SetDataFormat(XUartPs *InstancePtr, + XUartPsFormat * FormatPtr) +{ + s32 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 > ((u32)XUARTPS_FORMAT_6_BITS)) || + (FormatPtr->StopBits > ((u8)XUARTPS_FORMAT_2_STOP_BIT)) || + (FormatPtr->Parity > ((u32)XUARTPS_FORMAT_NO_PARITY))) { + Status = XST_INVALID_PARAM; + } else { + + /* + * 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 != (s32)XST_SUCCESS) { + ; + } else { + + 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 &= (u32)(~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 &= (u32)(~XUARTPS_MR_STOPMODE_MASK); + ModeRegister |= (((u32)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 &= (u32)(~XUARTPS_MR_PARITY_MASK); + ModeRegister |= (FormatPtr->Parity << XUARTPS_MR_PARITY_SHIFT); + + /* Update the mode register */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_MR_OFFSET, + ModeRegister); + + Status = XST_SUCCESS; + } + } + return Status; +} + +/****************************************************************************/ +/** +* +* 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 & (u32)XUARTPS_MR_CHARLEN_MASK) >> + XUARTPS_MR_CHARLEN_SHIFT); + + /* Get the number of stop bits */ + FormatPtr->StopBits = + (u8)((ModeRegister & (u32)XUARTPS_MR_STOPMODE_MASK) >> + XUARTPS_MR_STOPMODE_SHIFT); + + /* Determine what parity is */ + FormatPtr->Parity = + (u32)((ModeRegister & (u32)XUARTPS_MR_PARITY_MASK) >> + XUARTPS_MR_PARITY_SHIFT); +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_selftest.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_selftest.c new file mode 100644 index 0000000..de58201 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_selftest.c @@ -0,0 +1,166 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_selftest.c +* @addtogroup uartps_v3_5 +* @{ +* +* This file contains the self-test functions for the XUartPs driver. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- ------ -------- -----------------------------------------------
    +* 1.00	drg/jz 01/13/10 First Release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xuartps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +#define XUARTPS_TOTAL_BYTES (u8)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. +* +******************************************************************************/ +s32 XUartPs_SelfTest(XUartPs *InstancePtr) +{ + s32 Status = XST_SUCCESS; + u32 IntrRegister; + u32 ModeRegister; + u8 Index; + u32 ReceiveDataResult; + + /* 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 & (u32)(~XUARTPS_MR_CHMODE_MASK)) | + (u32)XUARTPS_MR_CHMODE_L_LOOP)); + + /* Send a number of bytes and receive them, one at a time. */ + for (Index = 0U; 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 + */ + (void)XUartPs_Send(InstancePtr, &TestString[Index], 1U); + + /* + * Wait until the byte is received. This can hang if the HW + * is broken. Watch for the FIFO empty flag to be false. + */ + ReceiveDataResult = Xil_In32((InstancePtr->Config.BaseAddress) + XUARTPS_SR_OFFSET) & + XUARTPS_SR_RXEMPTY; + while (ReceiveDataResult == XUARTPS_SR_RXEMPTY ) { + ReceiveDataResult = Xil_In32((InstancePtr->Config.BaseAddress) + XUARTPS_SR_OFFSET) & + XUARTPS_SR_RXEMPTY; + } + + /* Receive the byte */ + (void)XUartPs_Recv(InstancePtr, &ReturnString[Index], 1U); + } + + /* + * Compare the bytes received to the bytes sent to verify the exact data + * was received + */ + for (Index = 0U; 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_sinit.c new file mode 100644 index 0000000..22e2f7a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/uartps_v3_6/src/xuartps_sinit.c @@ -0,0 +1,99 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_sinit.c +* @addtogroup uartps_v3_5 +* @{ +* +* The implementation of the XUartPs driver's static initialzation +* functionality. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date	Changes
    +* ----- ------ -------- -----------------------------------------------
    +* 1.00  drg/jz 01/13/10 First Release
    +* 3.00  kvn    02/13/15 Modified code for MISRA-C:2012 compliance.
    +* 
    +* +*****************************************************************************/ + +/***************************** 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[XPAR_XUARTPS_NUM_INSTANCES]; + +/************************** 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; + + u32 Index; + + for (Index = 0U; Index < (u32)XPAR_XUARTPS_NUM_INSTANCES; Index++) { + if (XUartPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XUartPs_ConfigTable[Index]; + break; + } + } + + return (XUartPs_Config *)CfgPtr; +} +/** @} */ diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps.c new file mode 100644 index 0000000..b76c94a --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps.c @@ -0,0 +1,364 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/******************************************************************************/ +/** + * @file xusbps.c +* @addtogroup usbps_v2_4 +* @{ + * + * 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. + * + *
    + * MODIFICATION HISTORY:
    + *
    + * Ver   Who  Date     Changes
    + * ----- ---- -------- --------------------------------------------------------
    + * 1.00a jz  10/10/10 First release
    + * 2.1   kpc 04/28/14 Removed ununsed functions
    + * 
    + ******************************************************************************/ + +/***************************** Include Files **********************************/ +#include +#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 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps.h new file mode 100644 index 0000000..b5c472e --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps.h @@ -0,0 +1,1098 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps.h +* @addtogroup usbps_v2_4 +* @{ +* @details + * + * This file contains the implementation of the XUsbPs driver. It is the + * driver for an USB controller in DEVICE or HOST mode. + * + *

    Introduction

    + * + * 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. + * + *

    USB Controller Features

    + * + * - 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 + * + *

    Initialization & Configuration

    + * + * 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 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. + * + * + *

    USB Device Endpoints

    + * + * 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. + * + * + *

    Interrupt Handling

    + * + * 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. + * + * + *

    Data buffer handling

    + * + * Data buffers are sent to and received from endpoint using the + * XUsbPs_EpBufferSend(), XUsbPs_EpBufferSendWithZLT() + * 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. + * + * From the controller perspective Data buffers can be aligned at any boundary. + * if the buffers are from cache region then the buffer and buffer size should + * be aligned to cache line aligned + * + * + *

    Zero copy

    + * + * 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. + * + * + *

    DMA

    + * + * 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. + * + * + *
    + * 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.
    + * 2.00a kpc 04/03/14 Fixed CR#777763. Corrected the setup tripwire macro val.
    + * 2.1   kpc 04/28/14 Removed unused function prototypes
    + * 2.2   kpc 08/23/14 Exported XUsbPs_DeviceReset API as global for calling in
    + *                    code coverage tests.
    + * 2.3   kpc 02/19/14 Fixed CR#873972, CR#873974. Corrected the logic for proper
    + *                    moving of dTD Head/Tail Pointers. Invalidate the cache
    + *                    after buffer receive in Endpoint Buffer Handler.
    + * 2.4   sg  04/26/16 Fixed CR#949693, Corrected the logic for EP flush
    + *       ms  03/17/17 Added readme.txt file in examples folder for doxygen
    + *                    generation.
    + *       ms  04/10/17 Modified filename tag to include the file in doxygen
    + *                    examples.
    + * 
    + * + ******************************************************************************/ + +#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 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, \ + 1 << (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_SetSetupTripwire(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_CMD_OFFSET, \ + XUSBPS_CMD_SUTW_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_ClrSetupTripwire(InstancePtr) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_CMD_OFFSET, \ + XUSBPS_CMD_SUTW_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_SetupTripwireIsSet(InstancePtr) \ + (XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_CMD_OFFSET) & \ + XUSBPS_CMD_SUTW_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); + +/** + * Common functions used for DEVICE/HOST mode. + */ +int XUsbPs_Reset(XUsbPs *InstancePtr); + +void XUsbPs_DeviceReset(XUsbPs *InstancePtr); + +/** + * DEVICE mode specific functions. + */ +int XUsbPs_BusReset(XUsbPs *InstancePtr); +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_EpBufferSendWithZLT(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_endpoint.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_endpoint.c new file mode 100644 index 0000000..7b16d22 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_endpoint.c @@ -0,0 +1,1454 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/******************************************************************************/ +/** + * @file xusbps_endpoint.c +* @addtogroup usbps_v2_4 +* @{ + * + * Endpoint specific function implementations. + * + * @note None. + * + *
    + * 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.
    + * 2.00a kpc 04/03/14 Fixed CR#777763. Updated the macro names 
    + * 2.1   kpc 04/28/14 Added XUsbPs_EpBufferSendWithZLT api and merged common
    + *		      code to XUsbPs_EpQueueRequest.
    + * 2.3   bss 01/19/16 Modified XUsbPs_EpQueueRequest function to fix CR#873972
    + *            (moving of dTD Head/Tail Pointers)and CR#873974(invalidate
    + *            Caches After Buffer Receive in Endpoint Buffer Handler...)
    + * 
    + ******************************************************************************/ + +/***************************** Include Files **********************************/ + +#include /* for bzero() */ +#include + +#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); +static int XUsbPs_EpQueueRequest(XUsbPs *InstancePtr, u8 EpNum, + const u8 *BufferPtr, u32 BufferLen, u8 ReqZero); + +/******************************* 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); + + /* 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) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(EpNum < InstancePtr->DeviceConfig.NumEndpoints); + + return XUsbPs_EpQueueRequest(InstancePtr, EpNum, BufferPtr, + BufferLen, FALSE); +} + +/*****************************************************************************/ +/** +* This function sends a given data buffer and also zero length packet if the +* Bufferlen is in multiples of endpoint max packet size. +* +* @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_EpBufferSendWithZLT(XUsbPs *InstancePtr, u8 EpNum, + const u8 *BufferPtr, u32 BufferLen) +{ + u8 ReqZero = FALSE; + XUsbPs_EpSetup *Ep; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(EpNum < InstancePtr->DeviceConfig.NumEndpoints); + + Ep = &InstancePtr->DeviceConfig.EpCfg[EpNum].In; + + if ((BufferLen >= Ep->MaxPacketSize) && + (BufferLen % Ep->MaxPacketSize == 0)) { + ReqZero = TRUE; + } + + return XUsbPs_EpQueueRequest(InstancePtr, EpNum, BufferPtr, + BufferLen, ReqZero); +} + +/*****************************************************************************/ +/** +* This function sends a given data buffer and also sends ZLT packet if it is +* requested. +* +* @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. +* @param ReqZero is the +* +* @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. +* +******************************************************************************/ +static int XUsbPs_EpQueueRequest(XUsbPs *InstancePtr, u8 EpNum, + const u8 *BufferPtr, u32 BufferLen, u8 ReqZero) +{ + 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; + u32 exit = 1; + + + /* 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 { + + /* Tell the caller if we do not have any descriptors available. */ + if (XUsbPs_dTDIsActive(Ep->dTDHead)) { + return XST_USB_NO_DESC_AVAILABLE; + } + + 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 && (ReqZero == FALSE)) { + XUsbPs_dTDSetIOC(Ep->dTDHead); + exit = 0; + } + 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); + + if (ReqZero && BufferLen == 0) { + ReqZero = FALSE; + } + + } while(BufferLen || exit); + + 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_SetSetupTripwire(InstancePtr); + + XUsbPs_dQHInvalidateCache(Ep->dQH); + + Data[0] = XUsbPs_ReaddQH(Ep->dQH, XUSBPS_dQHSUB0); + Data[1] = XUsbPs_ReaddQH(Ep->dQH, XUSBPS_dQHSUB1); + } while (FALSE == XUsbPs_SetupTripwireIsSet(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_ClrSetupTripwire(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_endpoint.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_endpoint.h new file mode 100644 index 0000000..1cb0cfc --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_endpoint.h @@ -0,0 +1,515 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps_endpoint.h +* @addtogroup usbps_v2_4 +* @{ + * + * 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. + * + *
    + * MODIFICATION HISTORY:
    + *
    + * Ver   Who  Date     Changes
    + * ----- ---- -------- --------------------------------------------------------
    + * 1.00a wgr  10/10/10 First release
    + * 
    + * + ******************************************************************************/ +#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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_g.c new file mode 100644 index 0000000..9f20ba8 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_g.c @@ -0,0 +1,55 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xusbps.h" + +/* +* The configuration table for devices +*/ + +XUsbPs_Config XUsbPs_ConfigTable[XPAR_XUSBPS_NUM_INSTANCES] = +{ + { + XPAR_PS7_USB_0_DEVICE_ID, + XPAR_PS7_USB_0_BASEADDR + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_hw.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_hw.c new file mode 100644 index 0000000..04963b2 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_hw.c @@ -0,0 +1,122 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** + * + * @file xusbps_hw.c +* @addtogroup usbps_v2_4 +* @{ + * + * The implementation of the XUsbPs interface reset functionality + * + *
    + * MODIFICATION HISTORY:
    + *
    + * Ver   Who  Date     Changes
    + * ----- ---- -------- -----------------------------------------------
    + * 1.05a kpc  10/10/10 first version
    + * 
    + * + *****************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_hw.h new file mode 100644 index 0000000..69f3ebf --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_hw.h @@ -0,0 +1,526 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps_hw.h +* @addtogroup usbps_v2_4 +* @{ + * + * 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. + * + *
    + * 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
    + * 2.00a kpc  04/03/14 Fixed CR#777764. Corrected max endpoint vale and masks 
    + * 
    + * + ******************************************************************************/ +#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 12 /**< Number of supported Endpoints in + * this core. */ +#define XUSBPS_EP_OUT_MASK 0x00000FFF /**< OUR (RX) endpoint mask */ +#define XUSBPS_EP_IN_MASK 0x0FFF0000 /**< IN (TX) endpoint mask */ +#define XUSBPS_EP_ALL_MASK 0x0FFF0FFF /**< 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_intr.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_intr.c new file mode 100644 index 0000000..83463bd --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_intr.c @@ -0,0 +1,472 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/******************************************************************************/ +/** + * @file xusbps_intr.c +* @addtogroup usbps_v2_4 +* @{ + * + * This file contains the functions that are related to interrupt processing + * for the EPB USB driver. + * + *
    + * 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.
    + * 2.3   bss 01/19/16 Modified XUsbPs_EpQueueRequest function to fix CR#873972
    + *            (moving of dTD Head/Tail Pointers properly).
    + * 
    + ******************************************************************************/ + +/***************************** 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; + do { + + 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); + } while(Ep->dTDTail != Ep->dTDHead); + } +} + + +/*****************************************************************************/ +/** + * 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_sinit.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_sinit.c new file mode 100644 index 0000000..a2070a7 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/usbps_v2_4/src/xusbps_sinit.c @@ -0,0 +1,99 @@ +/****************************************************************************** +* +* Copyright (C) 2010 - 2015 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** + * + * @file xusbps_sinit.c +* @addtogroup usbps_v2_4 +* @{ + * + * The implementation of the XUsbPs driver's static initialzation + * functionality. + * + *
    + * MODIFICATION HISTORY:
    + *
    + * Ver   Who  Date     Changes
    + * ----- ---- -------- -----------------------------------------------
    + * 1.00a wgr  10/10/10 First release
    + * 
    + * + *****************************************************************************/ + +/***************************** 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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps.c new file mode 100644 index 0000000..92a8656 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps.c @@ -0,0 +1,1831 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps.c +* @addtogroup xadcps_v2_2 +* @{ +* +* 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. +* +*
    +*
    +* 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
    +* 2.1   bss    08/05/14	Modified Assert for XAdcPs_SetSingleChParams to fix
    +*			CR #807563.
    +* 2.2	bss	   04/27/14 Modified to use correct Device Config base address
    +*						(CR#854437).
    +* 
    +* +*****************************************************************************/ + +/***************************** 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(XPAR_XDCFG_0_BASEADDR, + 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 6, 8, and 13 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_VBRAM) || + (Channel == XADCPS_CH_ADC_CALIB) || + ((Channel >= XADCPS_CH_VCCPINT) && + (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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps.h new file mode 100644 index 0000000..549bfff --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps.h @@ -0,0 +1,591 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps.h +* @addtogroup xadcps_v2_2 +* @{ +* @details +* +* 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. +* +* +* XADC Channel Sequencer Modes +* +* The XADC Channel Sequencer supports the following operating modes: +* +* - Default : 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. +* - One pass through sequence : In this mode the XADC +* converts the channels enabled in the Sequencer Channel Enable +* registers for a single pass and then stops. +* - Continuous cycling of sequence : In this mode the XADC +* converts the channels enabled in the Sequencer Channel Enable +* registers continuously. +* - Single channel mode: 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. +* - Simultaneous Sampling Mode: In this mode the XADC Channel +* Sequencer will automatically sequence through eight fixed pairs +* of auxiliary analog input channels for simulataneous conversion. +* - Independent ADC mode: 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. +* +* Initialization and Configuration +* +* 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. +* +* +* Interrupts +* +* 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. +* +* +* Virtual Memory +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* +* Threads +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* +* Asserts +* +* 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. +* +* +* Building the driver +* +* 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. +* +* Limitations of the driver +* +* 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. +* +*

    +* +*
    +*
    +* 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
    +* 1.03a bss    11/01/13 Modified xadcps_hw.h to use correct Register offsets
    +*			CR#749687
    +* 2.1   bss    08/05/14 Added declarations for XAdcPs_SetSequencerEvent,
    +*			XAdcPs_GetSamplingMode, XAdcPs_SetMuxMode,
    +*			XAdcPs_SetPowerdownMode and XAdcPs_GetPowerdownMode
    +*			functions.
    +*			Modified Assert for XAdcPs_SetSingleChParams in
    +*			xadcps.c to fix CR #807563.
    +* 2.2   bss    04/27/14 Modified to use correct Device Config base address in
    +*						xadcps.c (CR#854437).
    +*       ms     01/23/17 Added xil_printf statement in main function for all
    +*                       examples to ensure that "Successfully ran" and "Failed"
    +*                       strings are available in all examples. This is a fix
    +*                       for CR-965028.
    +*       ms     03/17/17 Added readme.txt file in examples folder for doxygen
    +*                       generation.
    +*       ms     04/05/17 Modified Comment lines in functions of xadcps
    +*                       examples to recognize it as documentation block
    +*                       for doxygen generation.
    +*
    +* 
    +* +*****************************************************************************/ +#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); + +void XAdcPs_SetSequencerEvent(XAdcPs *InstancePtr, int IsEventMode); + +int XAdcPs_GetSamplingMode(XAdcPs *InstancePtr); + +void XAdcPs_SetMuxMode(XAdcPs *InstancePtr, int MuxMode, u8 Channel); + +void XAdcPs_SetPowerdownMode(XAdcPs *InstancePtr, u32 Mode); + +u32 XAdcPs_GetPowerdownMode(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/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_g.c b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_g.c new file mode 100644 index 0000000..22757f3 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_g.c @@ -0,0 +1,55 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: +* DO NOT EDIT. +* +* Copyright (C) 2010-2018 Xilinx, Inc. All Rights Reserved.* +*Permission is hereby granted, free of charge, to any person obtaining a copy +*of this software and associated documentation files (the Software), to deal +*in the Software without restriction, including without limitation the rights +*to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +*copies of the Software, and to permit persons to whom the Software is +*furnished to do so, subject to the following conditions: +* +*The above copyright notice and this permission notice shall be included in +*all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +*(a) running on a Xilinx device, or +*(b) that interact with a Xilinx device through a bus or interconnect. +* +*THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +*IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +*FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +*XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +*WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +*OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +*Except as contained in this notice, the name of the Xilinx shall not be used +*in advertising or otherwise to promote the sale, use or other dealings in +*this Software without prior written authorization from Xilinx. +* + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xadcps.h" + +/* +* The configuration table for devices +*/ + +XAdcPs_Config XAdcPs_ConfigTable[XPAR_XADCPS_NUM_INSTANCES] = +{ + { + XPAR_PS7_XADC_0_DEVICE_ID, + XPAR_PS7_XADC_0_BASEADDR + } +}; + + diff --git a/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_hw.h b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_hw.h new file mode 100644 index 0000000..55a47a4 --- /dev/null +++ b/LED_Blink/LED_Blink.sdk/hello_bsp/ps7_cortexa9_0/libsrc/xadcps_v2_2/src/xadcps_hw.h @@ -0,0 +1,502 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps_hw.h +* @addtogroup xadcps_v2_2 +* @{ +* +* 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. +* +* +*
    +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date     Changes
    +* ----- -----  -------- -----------------------------------------------------
    +* 1.00a bss    12/22/11 First release based on the XPS/AXI xadc driver
    +* 1.03a bss    11/01/13 Modified macros to use correct Register offsets
    +*			CR#749687
    +*
    +* 
    +* +*****************************************************************************/ +#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 0x00 /**< Configuration Register */ +#define XADCPS_INT_STS_OFFSET 0x04 /**< Interrupt Status Register */ +#define XADCPS_INT_MASK_OFFSET 0x08 /**< Interrupt Mask Register */ +#define XADCPS_MSTS_OFFSET 0x0C /**< Misc status register */ +#define XADCPS_CMDFIFO_OFFSET 0x10 /**< Command FIFO Register */ +#define XADCPS_RDFIFO_OFFSET 0x14 /**< Read FIFO Register */ +#define XADCPS_MCTL_OFFSET 0x18 /**< 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 /** +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ----- -------- ----------------------------------------------------- +* 1.00a ssb 12/22/11 First release based on the XPS/AXI xadc driver +* +*
    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
    -QbCxy)E(0RI{6e}msyW{FrMoBc7l+MJ=y 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:hy6`P$9iw$GfFyJkOp@t^07JNhr*-0-tg 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�$6CCEeoA`wWQe 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

    ;YQ;`TL2{%S+JGK<$H%vq1;4 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

    Nw|g?k5Z6U!FL0% z+C_YV&bW77a|PGIiGsgC{<{|dpCtG(;7t`7%rkUQ0So__nPPh6`nk`6Z~FkAshbdX}n?osAm3?l<4T!e}(EM!!!b^Glk!g~wf8jk4-KL9VsT zg=Ee{5mhaCl_zu*n73+e|B9_^yZR<2*^<>LbnpS>j6e)ErAfx!4e6SZ%?IF0lsHy4 zF*lgYb-hO8Oo;MqN6MugDRmhw$U_~17=ssdN+2Q`ne`Y4-T;HQgMG8KRu3v}E6jQK z)}8Cn;KQips$vYJyvp4mJ^XVtSIzM6$qYV9TxR(91^)+dH6lBNzpCUd%%dC4^^o1` zz8bH7<9xWm?;Daa68LZa#2nQh{|hH!X!spiN1zbEWB{Yd(n3$}SAn&(0r(8SnE3$M zl$LVW+fO-pMagG_EcaWNgtxd@TA#sAB4b0Z-wwcbmY&hl1iX>XMpelEc!bS+JPY zRU+{rh_^r`%7bbgXxmWf#o3k0fYfb65^upB*-2RE>Ymk=JmOSRsVd1?ZLBnsgcib5rtuZh+m!l9fiMc1M=fg7Ba;IQ*l{cw< zf)4wfJ6QKV1g#j|cMGPA3i9rDlEq`LK*+~$y<67n`pKHDMxLCCu``7($6 zsgU<+@=k{w_#?}HN|S%?kjp{lT;xQ1T_?WmB=(m)pK0=Y4!K3h`6HF|F0@t}b-IwN zHM!6spG$J49^_wlM~^k@bjflh(~PEe(9!^IMV>+Okz&e6${84%lg=%Ny&D*~3Y#w1 zmEak5C1^|>brFE`0E~AyTDEHnsv?aK61LBI?K7ITfy&qZWC?m+Udw$hex+|gG0kFt zqVV0o)jY|SkC|tI*WJb<(TvZfb?i3W!e$2V7&;+>QdNJdgv>!Cyn`G@lQAk|tOxK9 zuqa!Wm{iPFqDm@ua6E;-lff5RfmHkl3W6`sxL{v)h^26DQjpy!jAN^{c|y0ayK6B@Mb2c-?knX1|_-%-P*nw^t`D`bI+L01}QN$KZni zC?dsyct+C^5NZJ&L6$)a=dL!)fijyO?WlN=>Q`3$3Clx8CnBxKeiA)ggr0iYB> zM}OeO70ufX@_GPYA!GAHeE&LKnllR3srT@if-eKE=JzZS?;_ypQ+>9}`O>U=SxfOa z3ez+BFi89$J0zr5^$a@(Vijb0PlycNkny#se#s;O3__aGlmS!;U|1QdzM7(4?@FRW zu9coZB7341iP=4oS%8EQ%wM-)NX9q`&}oXr>pu5mu1*thCPm!=e8){g+F6o@nSH5z zXdMEXS*~=l{2gSSWly6@yVFVQgI6@2cCbmMJ>jHzCM*2`s+u%XrM>B--G;k``D%>1 zD|FhIPMZ1qjxvwxw8E~^La%$b&WAE9(Sek6pp&-jy^b<>>aB8q67Oe-H( zm?gOR7-*%Hk4sDyM0{76_nk3$38tF+Q}=Dme#Trx-TstW(5%G(sTiE{1-@L|pK{t8 zCo{%J$#OjK4EH0(wfG_60RY5WY(4gf8G0aLmSx6Gu$YQf(OsytFRV2&7rZ_{KUEi3}bXteR7 z{uS89e1Xj7lv6iqp1KD$@T^nD*~~Eb{p>PUfP`D1XtlA*Sh;S+x|QpyDq)ZuCDcbC zjPkhb9H&YS+PAeLBmSY=jk^8l5O#9|nyOZ8wY=fW8Y#TNC#V#!dn%@}gP6SBKC|ssOifmBGyKN&#ygXN!#;cf0 z9-|t|gf_Svh`yo0T_qCu_sr{9F}mmAC)?l-c5PJA>+`KWJm32NpFX5wVCU(!1})L< zr0)TA(ZJ4IbC@6v?7UNl5xnS9fTz|GOy>cdKLcP6%)tJQ4=Ibu_2kjUe=IH>Irt)a z&4&|cv6p&tF2G#te8A$El^Z0xb7u85Aj7$FGX4cyK_(s|AU}|E9SC{Md>byrEWQE% z#MvVE*xXI4`NPjHlhH?HZH^YEUJ34VQ3}m?(2EOKI7>L~gCON)3kmY6=$Z|6b zB*+3$Tk-D!T=^8$Ilekj{2EB&W*A7aLgi){NDM!6YUS#E|_mYboKV=#W1c& z8OAA3#L(b2FGQwcTxiH*fXWjw)IeByB8D0XD^JAGP{PU+F*J;@@`C#*aXLm9%# z6EW08Sa~9bMiEw?h@mlrwI`w-Is=H$LqWwb&K5g@VzFZjH<)EueUh|e3u{lrB< zm(7u-Qr4v4yoKVsZ(p3TscqB<3-Ev!8eleA+CYfr=^?byPjMYOb$$K|g-q?CzLYNTk#7H%3-O(TIM?byQF6EXSgM}cTh#3b$5G!iR;9h-&=k~Ccj zJD!Ls+OdUOP1=!`Dm%9D6my0T;?RyQ+%B+@tYW3pO}4|6q#avWdm{4X+X!n<#3b$5 z!rButiMKr?tUVEv(6<_4?TMJA9a~s?A|`3a7S^7KN!qc6wI^b-H|x=!h)LS9g|#PQ zl6Gw2C474~7AL<$*|aBOl6Gui?TMJA9a~s?B1#{ul%8H&GHz*n4}$BSbHLt(2gy<&E%>}J2v*X&%=c!MLV|eb>^=?NmJ<(-fk{J zVR>Cq|CIpnpt}hF#1k=6M2dJKMso<}J%?622tZH6be1P#-WH@ik2JrL)}Dw5fTd}J zq&*SSS)PdLdm({qx-?5X5%a|pQEDhgi`C;0E?|L}#~cTO%NB@N3l(kvwAmx{#`v7plv zv7plvv7plvv7plvv7plvv7plvu^`J6F<#}y2#Y6T{A-?wT?;`E(b7r1g`{bN6fZQp z;h)cwi(l#H1_1hzkuFBJ$3Hj!4B^wXL5hE&VA>$Xk13coNO9A(o8z$;g~we2OJ`r| zlr`K)Ka5t#-L6$2rPrXqxYyN-Fl~_HT@*|kqZ1)(+^1mLAjNZCY*-$D{(wtl zbYr41Ezk8l{-tSy6!!~Xnl?yr<%yX0J+ve0?`T(!8*rL7NO8+WdYanJcu>J#vT@22 zF-;q!xbj3y(*`N7JQ35hL5e3`dF+@`tWye>&I`t&%vld}6 z6LL;UzpQ6mFQ;f( zzli}@g^bPMn*qt2TJgB4o(s~sD6T(g1C|533s}u3;F=7|qZYJ(+!9*X+zfz9d85X6 zqDuU|lQ=KanV8mz|8Np#*K{V<>%;`AmSW#I+SF0(IGs4qNgUp=mNSq0QB-hYC zb>xCLJ28@rku=}Q_gfTd)a=pZ3mx+7LVg+K)!^Qt$k+}*v&`yR*%PSwP^UhmQ&)T~ zwHCd?ygbi4JJ(E2|MNHKt3kgQ{C;R}*m*2%f@^E0mOHWg))_ThbVhoTY6))Bq(Lf= zBiWz_LB9%R)x4|=o%tUM9kc>n^*wSP1aJp{3xre5a%$cO?OxD!b=LQh=d z8J98kfr+{=bhzpxEqw=55=>8m>4X2oglTEiRD8u}LIT^rpj#4M5N4=vOa-Hd}&x-q7=ct2 z7;VhKri4f7l+;FLruXFkjGTdcLQAo~8 zf?Zi&&N(#$40i=p$XPMIa#jwiHQbfAvBIicJTnH03gc~p@;TYzg;h)2R;8;l5hP^@Hw6T0j-B_#1i_t|!>12dGPKAV^O(&$XoLa9=DO z`Vy|SJ86>ur7+<-y=L7j#jITVK$6JY#BrnV_U9HcF90TaY z_{xiY047nAL)!J%}}U6F$~O4`L0u4xrM5SPg`g9>i)Stn?t(P{K+NVhtm#^dQ!7!b%Tf zWe6)hh}A?`=|QYfgq0q|8beq+2nIu2fI#7dU(tgEBj-WDj>Cgb#Ot<1`U*9gOi+=& z@I69AMfwU26GTP&3Jn)TMfwV51W}Q`LMI5KB7KEM2%;i=g_=w*UMkX8s96vd=_@o+ z5EbbwG)fQ^=_@qaq-bd)k6GIQ%3RQqzCtbLEohL6^c5Ow{)w&N?GrjtP8L$3jWnVn zeTBwJii-55k&eTIIR#auuh4iALPh%0h(!9*u!{5*I$5}Mq_0q`IUfS(NME5T=4Kzn zp&lgEF0hL96`F3c9V*gSXoiTRB7KEsnXviSk-iY^h*L;K`U=gJ6cy~ zS|WXg&XoqJNME7Vf~ZJe8c~tHLg$OBOhx(%tr0dA=__=BAS%*V=t4nMq_5CAK~$u# z(0V~sq_5Bh^SkI<73nLK9qB8i{rM!)S7@8bg_U{`_PEc(wL>C(g|0I{1w|r#g|?g9 zP*~nXwDqR|@BrI`f8x()7m*_VeBm5|0dcpB6#N~qMR&VMoFEqX4R|mKOm{oR`^w`( zogQ|2#yUa4ILRbhRRz*IgMt+TbAp1A#R&=~uvVE6&JGI38t8+po`^aq*exJ9LBaSU z(h(Gl$bSk7_8VrR%H*3t!Bi$46pUPW(6P#QaY@5EgMzVQ9TZFiKf(b~s zt(d$6h}%|7PG9o=9975U4M5zsVsY|1LBXcsdtL_xleGyQ+zo9hT?%@LH;D>1>I4O2 zFe9I527aZRw*b%&5GN?uaFCp!U;V`osX3Xq(jU}X81pkND} zJYJkBL1wB<5EP7bCn%V}yax~zjIUZwP%we1GAU4QTTW20(?N2Ag1v?=c7lQt{#sBl zn$rJ|LBXB_lZ%!$@p^e9o{3S54}KSAxk9845%5R_zy^6-wv}TskB?f74{z%pa*QU2 zA*Z9pTPTFj`Z;*wV+aSV)GEMZ3ENh;*?>{SNvwe z9%~CL*vZp_ebzaIZz%+9TR&k1yI66;8a)FJwYL&Z8-WR6vg1FQVWA*;)5Pz40ttu# z)E)5scLQ`q=gvCMh(AEsZQaR2e@fV6UCE|DNZ4!TZ2q(4MB$2yzkJWSzy z)}w^?Jp?#lwNwKBIeCIs8~Gn095MnoLefC|(W@v>8!LNEwel7U_qb~18KfUz2A|RO zD|EHza=`H?e~e6J7oZlSEFa~YWhbLB1Ul-C3helE|HU%Lu(DrQpjQm*1H#V}_E=q6 z=0PRsPf34)Z~)G;Q;?jzDR_4{_n_4YA*n>Jb(l758z z8S6eMtP=0s2>xaxFbIV{l}M9I30kHE-GKe%MAx|yuv#xq0$jclaMJqYDWG(_88Cw7 zlBdVd09RP&;(3#(`~+~Nb$BY^UePE8{fhM7m4K@)oa$&K`pySjYrROGno9uJTR$Ps zz}o>gT9xo*P1KP;W0kY~dcw_Cfb_wHTda$yqHK5`@Hnd%%Nh1D;8trF%ReEK57QUx zGV(X|2Ru#grNl_ylI_;xxz?F1^Q7AVFR=Er-quF|FSe$g3V7oC zfR|eX*bh_VF}y@r-+}2<;*7^bEnK2pk_10mQKXWy0d#ojtVbk59@3rQW=h8<3-)GfPhRfas{Gc_HJeQks z!`Ns2l5M#%33$I1#XXd`iv7lS4$kF33Fc92;zmv|HC=8}(*;i0M&jmq$d<5P;at1r ze85SIE`^C*Hvmpsv<*t!_7lJrRuA&u@ms)^*880McYg%9xAhsT+*5?PUu^|Q|IuK; zwbnF;u4ExLr6jf&oNOw!&cq^b@%&KzSmE z4A(>yQ#kyeD8)l^*Sk=+EK!NV$-v7t;9fP#8c~5+_5#`jPh>Y12F{C69ZQ6_C*V@v zYz|=&VBxxf#K~Y%KjaUQhD@^Vd)7FdyeC7XIc3o0P|A3VDe^-XLInx>7oaGJh59^v zWcfU@Bzk_~WaSN=RWpyO0n-;wGUva%zJOQ=SgJdP!~v{Hq!pAS5z@J*BE6I=f_m{` z60-MovU7dtd?gAkRmn@7WG)%1U@4RBK<+D?Vvg4O4t6QYR8drQ?L zoKl+Re8u76y7CPk6!E!}%%vv82a2jpw=V&z)WEw@rAXmAxz0&GkI8)UW%09!$-Q$^H+zJ>!D)htX4xqM)0KYPkMrDqvBz0NIAhtS;Q3nfcUQbwmC`L zm?YA14k(B;aPsH_pXXeMlS`>8Uiwtp#-@U2r^CY~Ry8<#qz^dBTy<3uoij*AR(^O_ zps=?c?tWkA7F5r~fk?t(B^Xxp7hq}sX&w9mY1Wy-%KFeD4(nB9{dcp131DOkeV)Y* zJ6Cy`@8zI=-=T87m&THMuR}fTP*qwEW+d>kCRy)#$Sc`Gta^IAJC!BK&*^}WnXk6^$dR66M(HU&LWB!RXF5ba zOF~p=sUH@CN6A1@((NIDsBc2fATQH`xb78QM&Yanv}%;DifNb%?!^bIG4kE9T% zvbv+VTB^lUFB5-v82P+XDIMIXAq}duiI1?XayXe(g}R*K4kMp$Aw4V$0GIM17wSp@ zJMS%>=>jAL4wT_BlsNbpU~A!AJQiQ<%GO!2k$_(!rwtk&XMx0W^Y7p)EP`G>ahCZ( z5!edz@okVe$FzzufQ4_Pti-vZJnlb%EWl{YP>zF{3i>SQP?yS`CH9G z6y_;>g^%}%g7^v}OqpU1MM|LXH4I(iG;=BtyReCMP8TGi!%rkEXk}i}8tqaV%fxsxr1v&6cm){#9W?~Z`{E3m~KPli^BBRWMXrG}njuymI z$SBN#4D~Mfq8IcoBt{>2!vfrbqH^g`C5Fyk(Qhr&Tq_dSO zy$%VT&sT7kB1w4I_)Z?AG&w13yrh6Q-666QI@x8mAo*-3ncbq2^)j~=1VoU4M2RDO z{Yac?{tl$V&p!oav3#c(gi8U=@&RDELo-K$HMg>c=@_oRLEC8Zv(-iDm?1EK1|}GB&V?V zbW&5i8@w|x)^w2Et&;Jq*UUw9+IxhzMTjf!88P_76^VeC-x%u)~rD#H4=LAZb%qZDEF zTOiy+j!BA;L6&YuNEpxl*l|(@J3YX5gi|;MNX#C_6MT0DP%(QDz8rkJbQiM+K`V)h z*~7`)2^a&k$4(SgfksxUBbO`H!MK&`VBAV|FfRL_a&+552{M#mBeJ0{A;AqD5@aaB zBGw@i2;b#IMFK(h5EThdpajnW?YRv_^(+1FC8*@lyx3Lgww@C7qXdgPBq%OHq0$Ha zD8XM?he#lNp_z^Zf>sk1392cfI3eUKItAJ0;=j3LSBC_}l;CXE zArc7RO+=*+1bv36NRXrie*;?8jG{(Df}S%0v?@_t=VDN}agM>j<~_y&oA(_ZaT7a2 zwlzN-=L`kMQFTO+VsxG5h#`DUL`4ii=Moh$f)ryD(4GcrZ~K-V(F;+A3|_@&_HxeW zEk3o^IF!SyczUm)C*cqcTt(;fnt^`eRXnxVKk$zi`r<^~t{!8=V*ILY_DRd|rR9QO zB$O2V8*~(l*8jB4PA39ypcU+1k9Q%COT}42-_JqD58e0x3}Dv4-@to-6du^?j;tZ& zYX|n~Q+m6stT)_pN^i~<@O0_iK>zkJss6yiP2Vn5mvcxe(lM!sF50D}|;U5CfJK>bU*$Mv}KxZeMbY~}=?9NWOi819) zIMWG7euYfVPIx4Xpm)OW1YaKMbQaK_1G%*+Am7*tKOH2!6MjF6bauk`1MJ)h-vXw8 zvlA{%dMBJLkZ%b7?ZlN&`8s#Pp8!ekgtJ0tC!BD{PB^p0u@n9gdDTvMr$qisq%s|q z$Y1;x=Hb8D2^S`bO7#ETPB=yT-`NT0kUBfzgq@x6zoHzy6HZWi6g%Mu(LFAY#sR9G zaCVxr6FwWMdM8{>VYL&^`&+pS1j-0IJK}2!p=51VP~71u(M50Si1`ZL#;r39tx_r$&(liE+y$^r zPDHs2V4IwXPuvBtO->|`oXsA~2%_8tuuaaCd~p}RHaU@mxC>yLoC{Y{+y$^rP9!Dn z0@x-eQX=jG*d`}ZD((WaVjqod zaw5uI06XJEeBv&k5#=s`7`sfd#a#fq;S?fY+yyiu?gAQC?gH2*Cs*7McL8jZ_kaM} zT>#tUEqK!tcL8jZ6ISj5*d}K?l)C`7$yq56nm|9!GGD~M7I7EAXDK(c#)-QCw#k{& zD((W#tUWSc4O0@x-e+gx!Mz&1JA7Kpn5w#mt+ z+y$^rPPXOZE`V)vvaJwz0c?|#Z8hBmuuaaM7Iy(`ld}Qa#9aV8<3zTLyMRWNy8yPy zdBZ7p0c?|#?KW{2z&1IN-Qq5QZE_-e#9aW}mV2-;0SsZr(f%V=uVR09TD0czY;Kg>O zdIr*6AnGv(fgm$Gn(ZzS&2|@ve%)OlYMN&<)6M7sn3A(s)a?+>b{B~HgbR;0R>|F7 zX;_YO7eI_%RxIuU`C$>1+t>LK0lD{`k7~fcz3=>d0rz7|H($96a_>7I0hGYNBTMt+ z1l8Vmtm*?4EPLOvUR)wLJl*iym4@~qPD1tSA?^aPLNf$1J~WX@x|!Ys`jH{-00!iEjVqRB_FsECr zi-NiL9m{b^ecbzw`4r5(?^v#j4a?)t(@weCT_Bd{`WefjyFkn@eBv$;%W@a^(#hjB zay}q4_r7D6i*#`phy@kQz3*7W#g{8_7l=g_%)Reemb*YK>Ec=Y;w}&?aot6Jx(me8 z0(ZI##4dDQ;m1?#zjYUgZFJ2BQ^3S~xX(=SeBLPS;!AjQ8&(u#vy@ZKW4Q8&blnb? z9P;HoiJ#YT$*={CoM!=7{F6)-B;!zqT}?)}g5@Cm>T2AmUiZN_Vf5dd9D7)1W240hjCN{rzOSh{xJo;hGniDpE34hl9@ZM zMLm7lLD#$o`kj=d|8lYseTwLy4)k51eIbby;h6(NemMx@T9#-|t;P`#0#*)XJ=d}1 zu3+l_Hh_JoaJ>!k&buwx_cN%`e54IHhP3Y!_!z+R0BXop8$!B!E&!g-RY#x^tpKU00 zz|R5vfWUnK9wKlzfad_zkiGUGu*1M=e+S?z09AWX5>H`_f}rHUP~aoi=(A6!ka|AS zgo+&7&<8O{lu&lW~!CSAYrXj@*t+y%aI{s16wVpj?{BaHU|5a!?vd0eLr#!Vc4Gn zp%39v>jm{xbQ%K>;S;x@n(XdBl8tAB6jbwLM^2|Ks3x1rA)wJffvIQ0Y{N}+iH!+D zzlZQV01E+315kT5fZG8yt^v?^34Vqy04L)}3DZGxGu!6?YM9g*z)x)qKLgJIRs^8W zfs-;uotn5_9Dq@7V#LjA47Qm;<$Vl{wo2}#HgH@LNWjE|cw8F>G=Q`ag$}C#9R%Yy z4s|c6!)rT=Y5mt)GL1-OZM7p&%J0E{!dg&9Kq{QaFk%^ga0O0n%5qc~;dnlD=`q4N zs-nx#rma`Q#}5~rAVxTcGIXgL;rKwrt)?v32xD0{F3fkLaIH>Rd^Xl)7y38Cstw~; zAE2mjqfYt1@Jt5RvuEMnujCe2Zs|Gb!aU=2zAVjaB*G88l0@Gsm7GVurj`9aZ-fDmM6 zF~@~U37{xu{11>Kv5u&<(6Npv0|L#sA)tCk)3J_7cVZop-HCN{B4M8)vJ;N&M}8<~ zf|yE1dlo^*I{Fyp1W7*|7aFQ!9nA-#6*IZFvL?&E6C??6q{Bsvd``IN+2T4CNuA>$0gkK$Ss))HhyNK@obvfp>>`AV4xynE;K)j{LKWc1N)c{VF{Q0E zvlSs+bOU+$@uTuC^R=8*haHPXUOMoLC zE?NQ{>2T2!;7EsymHy9YEdh>nxM&G*q{Br^fTLhNMN2T2!;7EsymHytMN5FAP&rR7PyvoY>Kq3Na1_$#ILK^&1}qWz z>6r47gP>vFPsKk+F~f>QF%#-baxTqyEA7ENEkU9e*+VV>sG=9y4TM$nBD;~Wie6+7 zC9I+s*~18{=tcH$!YX=^ogu8E7uijORrDfz6k!#;$R0yjYhA)2o@U_l{E-3{b-_KH zbw~rkMGpW;v@TA#XwkYj;iBb`1}9v!XkDCe(V}&UWU>xvaKc54*2M`IEm{{RT(oFi zoN&>ib#cN)i`K;n7cE*Bgo~zVX(JfN-8urG%mS@-LAdD6XqM8tAYAl8wt_c~6E0e` zE>5^;Ii$e}7cE*BCtS1~(%^)P7OjgDE?TrMPPk}l9Gq~`a!5l*xMyqIGe?MT^!2;i9>iE3JzYE?TrMPPk~%x*%LM z*_77B2^TF|7bje_Xk8F4nruqz63ITK!3h^FhcqBuG})Ba#R(TJS{El=wDiGB>1olr zIN_p2>*9oq7OjgDE?N$0K)7h$iAw9@go_rfixVzdv@TA#XwkYj;i5(B;)IJ9tqa0M zuS9<;t&0;bTC^@sxMyn>Cu#CqpMA%10uEZUR1-juLm$*YQ@$ph|hhpV?wN!D3Vikl{+@V-E z!Yb}itovnvRotPN_=KsrLox9QOB%W22vJZlmKD$uq99IC#T`;G9U)kMuEZUR7yl8@ z1I8VSC)qzL?od1>qDb7KcnNouRNSGsa$B>v*tn_EGgRE6xHLn>9g6oO zkBU1KuOY1B4#jH;tGGjP<+f&Dh}X%ua$B<*cPL)Zmu?kzC_b3{D(+BRxvklZI}}%L zYc}H!#T&_^;ts`!vQ;YXP&{)Mx?aT{il0DO#T|-|U@xe+L-CeXpsTn;@i81K6?Z5; zmSsxZq4vCu|@*V-ju$#(EqtO2}V2}MBOuxbaVV}K< zbn8{X0h@2$g~9g#+cw{?3qvNxE8qSZ-tP(vasVgnAF<3h;iUc1Ho%2Rz-jyQ#{d_1 z1zce--HmcmHGnJa$MF7GSkeNxxBUUjDV+_t+TKtJIDG}+TAOd{g z0XN!wp)agB3^-#y9S7Xq8|LVYJq2)O1>hE&UkHU&M)! z0|`&FiwO@R+-~ za=>G61bv0gqw@;K{S@$OJBE*o!jstcwf3w5fXDv^^z|4XDz<{pVJvoFY~uR?lo}EX zD!!B>*Og>PvC0?I;1;kv4r0h~&S80wEVtn0* zRh+F@EzVY~7Jpr_T5OstnTd+k;%vogakgT$*e6_gHD#4lr$|G!Vzt;W6^mju*?A62 zvhy64Wal|7$bM}QJ2JmN`37dmWr|!4zMh0R#SfA6U}N$X;y>ZLvwg+y>3^|XJn>kHD$R-7tLxas9Yk;)P*jdX5U>jtKH=wmhN&8OZNuIg(mPImefYq z5->@(-2(vMPP?#rm-uf5(t`^gj1vjA3U~lu8P}@F%fONLJPBN|B2Oy9VZibd&6P`t zm0Y30Pt_bLDb~4ErsGa|x5e@fIcQ z4UDj-+R6n|wokNnxB~^1sbi*csmIxdhMJNc87$-z^zv-%+O~q|UkAvmkX1s;L zECM!^m}hbcdq%}Y`o;Ere2X}-_LP|SPSM7v%`EwBuyVe5;_Nx z>rJK8Ovy*o`L@;>LdgP*{^ku@l7~ck_Scb5;s8=g7=7oTzQ8a?SQkK4CXgbThEI6bOZu?2)fU|peW`XOBpkV$-G2kT**92_=?&* z&0?h#c_vfx9%H$ZHcA$-P;<3T10^#UYl}{~g_36(%ayc3B86H|stZ+W^!YJU`JOcu zq9RW_;|yb*+jY8YA*nr!_8DH@1vs7N4M_Up#kQHylDz=?)n3cIyK0F+oo$TOM@#A` z`4M#nYDp_3{l+qPj<@l7a0scL8NcY9y*)zbi)=mUpCtmLN3%>z; zUpa>1e&Ibk4xcyR+(mew{DAP+A-s?8OvHcC!yf0^apb%{IhNpnhXbN#$IOkdt6|5W(Tz}Ihud6#v=3*9ojtL2;ZSI!%VSNRv3QQI!X{|_)rd8vXjQftXK>U<5lGXPtH2`9ky3cUK>=3b zS59~ul!nS-s35N*Pq54l#y6hdtU}%VNa~VVRY@z|jg%UugMANi8rwm90>T*l7`qP~ zj8kb+9M6T%u^;$6yeXOnllCjR_i=j2%GGBYX0b$SI%1>c1B#Z@V!we~Tsdr`#t^lEYp_kB%VcyM%@Z zaz^}?WpZEIa4EyLEV;2ql&(g|4y$=e9=ozYcI=1B$f^XMVSlr+7*_Oe~D_BSmv;;thn`-*##Qvkhk@gOasG?QsrFBWERSlbCoIin`z{7 z%go2Aa)xD&nn%ez>k;JISBx8Gp9{%k%bbJQEcj$yz&JHWTIMP(AF1VE(2hpSyn?x% z$8;NIFfaz+!x()<&D_V(+4%Gi0f(t3IcB1tN@MVB=9v>C%@>&dQe>=nW7t#%rY!T1 z2xuzdeOaNSWf}4pfvA{WlgL0u0VQaXJKhk@A^1Y1C}VV*alRvC`^_`+#x5V&j_(01 z+Ft;)-!VC*rI7%YpB+tAod~4*3lrgpPDx&u=~z|B*<=+^xO^% zdczX%^(YL^kHYT?a0h7OEuNPV+A;;Q_mEh_0mKhubZB@5L<5J3F}w}SX6KDV)c=Mj z3_yO%R>;19{zP`JZU{We!0W6@TtOlZhm+k9M`I9w&$EhgWPl( z1V2E^!nD2a<*lT}e08ged1-qTMBSf)M5RKuF3T zx`z7u@d4lIwyzKP~VCW&K$R>kmEB4=NH1bjX^u1@;5UF0uX!uOw<=LJLJax zB@qbq&q17m_~XLtIGgdSX8ngcG@Pb|_^zqt(OD{1k3#uSqrMJunm9(}n7v*>Cba*2 zWYvT~7I&5k^aR=-HX8B}c7w3KRfn!A44n+2RMk8Xbx^xnWmx11zenrWLd^XB#m%n_ zV&=zMn<}|(fy&`hKn9cwVF~peIvP(ul1cWMisre%=wj60j8NKXVCa%&p`Cjn6g&6n z(8|Kl{Sb+ zy0lF5T6@VN9ON@xENU9Z%tlB)O^4=z9%+6Rd8+4RQi%iL`YZlgm#;ETxR4Q#wjppI zEa&G=v!kU752rHg9Ob0b3k5t;CLPgRKvw1)VLQmmlyj6b&g)=Lk{Rbue1p^j^?8!a zcps3R19l9nvutYK_;VDQWzBc9xY0{s(q#y2DFSgnh_MVEp8?0$Xybc=@S#q|4*qtxh@j8iFo7L+fXH#r7t@4>AjC32-loHiDWlj@PqZNu^8zTVvt*v&Gs{%LD?Pyqo(81K zQ^QW(<}b`| z%NE71t2qTKaB2!=&yMHTokU+8=A~pOFs>{!E@K{^9S7H`7T-#CGeS?2Maed@JIU_M zqeFj{?5$)^U`Agf`xx1wH1~3*{1(`g*%{x1-AyGBUvXnK`pD@J6(Lf~bP$6V*u*7+8 z9o8JsV&q@wAb&rjz8hp5<=#>M1BZM>232sUS>zF~i5I6^UBMUXZd3HR$4g?Y<__&+mx0vFf4O%RjxD&@}SUroYohEeCzF^D_J|vz}3X$1% zY73+=!sVgM6-hg!b)w6sukm+4RK5mXntP=Of-q)rJ+l*9tQ50@Yxb7S5UoJq7_LPa zmPEfdamFqJ$C4iZ1_JJfM#Iwxm3hc$IOvkIuU%mnyt3nGA3^=|%1-J$>n9nT{p+5F z!K^v51_FwH)r$H4zFZnHoy4r zN`~j~gA6ZgtY@|hjY?L|b^%k#^qhs=OoNxT+?wrzu9DTWr(cO73|D2zYm5k1I z5BaHHKD!0x@X9Ti&95@Nl2yhf4tl+DC7N7AuBM@x2)Q~OLw(}!$DhD-LascaIT#4$MDphPU#!RGyscd&Vn?_l$9N1n2c%`1Lj{Wl9gu-?!|+uQ?Qe7|~+`+oJx z=SJ=Owb=UyWwvZ+`z>kZ`?c6h#`hT$_=iW~(0{DBb}hOJRcOeDHlNM70k3^)1Yh&K zW1v#(osQpND2m^CxWWoa<&VNejuFv^<7@{lFqGmj6HrL1;t02l0ZFwC|Kw#YdG%Jh zjatRts~`w5@_o3%hVKXXrw_-W1W2ktX$e|Ra6y4G+MtkB0l4sosvxNXamp2vDv+SM zLQ(~iInsVZY$sj*GU9)MEkU^FQ>vpsG+s*b60ss`TMF z0;&pSltlzp>BDgZRHYBc5m1#r97jM^`fwZpRq4ZV1XQID#}QDKJ{(6tRr+uo0afY4 zaRgMQ562NuRj7%kDNvO@97jM^`fwZpRq4ZV1XLB;%+}8fs48?3=@tQ1g)XZ^I<1D> z;v}U;i;U1QR8v2f$1OlmRcIS4Eh3<*aOD*UmEIiAs@_acl|CFtKvnv19065@yY7R! z0#${(Q9ml6s&Eg|Wvb&7Eftd=c6@aU{17tS0z>ex*lWPGhRaV`R>a95FGq!sQe(o9<6t|G%pE8JCN1Zjo4ii{+! za95E$X@$Frj3KRXSCMg~749lBfwab5MI#%)6nkl?J{+eH3RP(qqjhjN&R~4{%RU7O z4##1Dkxioa;cy%>-mE?xhm1d~562-B%r1a#NnX^VS$#MTL&~yeA}bt@LnfKkhvRTm zOK0`rIAk)}XVJ7c9EVJ0Rv(T-CY#lV;;%j&~%s5UEG&+1+xYICx8lF_@}vifiwscerUwj!$!$D!J)Y~kTJQU|L|*7SzzMRGU}3$Qc$II~{%$}@19EVBo&FaH($lOz{563wl zrtixZ9*&cJ2ot4yI8L=b9EYRsBk1?6@nSCrmMVQX&g+nL9XJzFcA1-ySf~e*zX=2; zx?T9E567WIa95>1k`V!0l?Ai7Zv<>rRsgmtD*#)S6@abE3cyxn1z@YPUV~953T#!T z!B!CgTb0LKm;u375_@dB__yZ~$!F92J` z3&2+K0ioL`dY!#otKCHl2@#A2t_@wucqyk&T zC$obouvNSOY!xp6Tg6YI$qH;0F92J`3&2+KcABHWR`Ep-p!#>Cafpty3AVx$AF>JY zvCpzQhb{s3#LuFZpW?1OV98T1JwLP^y1gL`8(n$8k|$wSQiZ@C&umfY$^(`>a}>=T zlb+LrmK~D`0rp6as}WBm5IO=C^HsdPpX9Xu$Q|5QZXU9 zV=`4LBzH`vv2qr zJ*VqlB<@&3OJ%?ArZv*&`V*Ae@mRlLTHHVC6j_&$Ca%ZnqG;lJ9G@lm5!d7R6-``^ zQ*5zdA^r>rX&V8~;sHxe!0HWASK@jcTlBi}fF(!adP3Kt9A~<5uw(KxDihb^ge=Ot zo0yY2A`sW(Y_Xn)l2jWvv*AgexSk5z52h!<7nQw06?;R- zv)B0Zu#oP}MlbSg`mn|5^$RSbUBMO#KBb^WY3% zvX7FemKc=yX-%b;v{Ld3R>0;cEs4Gg$!*kW)slHgxn?dU4}1B5+SHD(X83P*SWy5E zfX*!71N8Sr5ejIsuCH%0L54an__x;IjNa|5Z*{Ge5x062;dLP1S z=dUr$$3*pQu>Dpc=OGSWSMv-0Pk%oK1m5-ZH>XC5zxcpx`@o!9-?tZ!TJA4ikf!v< z3pMQanmQm2$_r{*SL9kOHCFc3Ab0_54tYThE`Htmh;?NvL{Onp4S(X^Ov`yqNbFllA;F@Poue!=j0wk(Vz9 zichXXUCSqDhV}tBNT32LbRBsy-;|HjJIKGoepO`AvPa4Ploi&+dJOzg@U;u^zS(Cz z1GeIP)QNl~@mriE8CTf`_7d`oC*wW2;_oCcAB`0MBKUe~JjJVqTPs#s8_+N-dAQj+ zlPyt2URvgSdDcG>{NOGrICFyem@EwQ1#<-KZ>ol@DUKhbaT9{rc+((9h2X66sYc^2 z2w6+Zlu&L-G*#n0T7L0g$)DEp>%J`ScLee?+*-X$)#|IP)wtOI-2A-3*G*=}b>(iY z!hJq&h~=o~DLQd{^MOsQ&rkybSI8 zA?ldzI}nL+6vwbHiVQ2eJ*YbsbC10-P>%T1TcNFqYBfg=HSc`n*GrKW#FiUh} zn}N5=rvqt$|7OQ8izb_7{z=NmchoeQ?PmeqJG z2ewbUN$pdRqPGMf%R|n2~Vn?RwVRW*DIAP4sRgEA=Mq!(^r2u4la+0Xxb#BX10X z=@{bJ;JnqRprv@ntLb&x=oAtLkBo=b(u8Yh!qH9>Ug|XA8k$hF*)>7*dXNxpJQlU_!3Y z7=Lgv9)IH=_Rm&&2e9JI+nDex%5ji18nBjObO~U|JL-x2Xlx0v8}9zrV44`8h*OQn4;zbZAu!D5@jK4RWcrt!_Zo!wq`5@Mj zSO(%-B+dizG>MBrlwN|dtQ{?%hn>HIZ6|Gq)Y>tp-zo@I-*2<0MA!EQ2r7jYDW> z{UPcDsPIG7EX<1hoBaif%@0x5Kll*!zsQv$zBzfi<8k629W}@Y9oK*2Go;<42Fdsi zbPrFa05 z@SQ2ZcLj8r7}J9Pf-A+_k(BF7@kb#4p({mE`a7-^Y0iJymEv)WY`tSYs1FtVJFXO! zMf|w*-_MmIYqZdnB6-{v|Dh|z!&C|J<5IAy4dg#^rAU3(l_KeX)|KL0(Di%&e^-k1 zdG>$YmEr+3#(!H^ijSdi|Gq0lhWrz*6sh)4xKgCrKjBJ|YX48UQap^b)TaLbn_Ve# z!WLJG2SDH(CqE2W@JfR_Bd{H!|GFzh=1_#!yK2h&-|tG11@rx1;YyK~>J7jDv#u0b z+2Tr(X^s3};7XC{denyBf7+EI6LH9|rydSBf`KU%OHy{XgeQF~DlO z$;M-d`Y;f;=`pd}4m_xvgRb<#dQYz-@a=y$1rg57Tq!??e`d!)d@@n)+#@6hVkx7% z%8TA~va;e8b~Ra9@kTC1viE`QDQ_6Wuje7M+_7(pZ%^}5e2nn*1uOnN&FMY&F#oc{ z$agTpdN*O!uo!vv^mM_?!OD*zzY=nzrVQ4-jDYiT!DXIVXVf%7^cL7FMTA%A^tLwC zsF@7;`;gtD>BYa(NvS`+!pP!#-a^8yF>|AsYD z7j+W*HrVtJPGWxzD(>>=5NUULM8?N{{hwMMB`_H4GuKxj?w35xTYp6D`XYqY2Ks{J z%VonCzX`m37I?!x;{4uqbCnRyAs@L4^jJB`)0d|kvQtA}qyG47K(`wa);m?APl4#Ac&Z6s zrg-dcRJ`9PA==UJr9^7>b`UWa=EyJ8%9DR_h>p+14SI2yt*Vxv#gPvn2F&qC_*Y7c z$(NCkAEf*m1QAB|dYH2BQ<8*E7T-$=j*CJ0%L#Uz4_5s72gCt|^5-8Y=e@2Lp#gD0 zq5Sy=5>yYy`)opOC(kAAS0x~wVBxU{jdaKViwguA>`3Qg5z2|4L2(t>@d_|s^5<_y zpMyyJ`P(I2!72Of*a494BGfK7F)D-?;-CjRKKQs&LX>0?YA2}z`}iHW1f(>Ei*U3n z8X*#Y{&t!fDu4cVhO|aF+Et9^_=8)xlo5aa!Ap)?6ueY2)BgN}71N5KM1*57tt@Iq zs=Q)eLal^`Q(vK0Lan5mXqxipA1pZ8KB!PDp`MJZP%EK>=omrSz@hy42QT8S zul)H3FI$LoT8#+rB$862MMh*45?JZ-7zelr4Q^wlDS!T<%3mT>I&w(4jgv)as9+Hq zs%HQ7hZmmNZiKpi4t3?vKcw8og=V)P0qr(U`uzJ)DU+Yhj$if(Wa!)%;-Bj_ju{KW zG1QOZKqta6w0;1p#ukL5EeOX7g>Y2I-iL?Wi(v8RA0GM`NafEzJdCvR=O1n+t^E0i zhm%(R{KF$iD}Vmsk))MB|8SnP^5-8OLt6Rs504|Q{P~9`kk$ytNaP_felHCbgkwZJ z%cTY37#(JAKp)9G#gVL8yu=w9A{?W`h4E&HaEy)+#-Aa=F*;J1U}gb|6U_?~%@E-j z9VJXzh6u;#Xkn5WA{?V*OimB!3=xje7GW|OA{?V*g{jOC;TRn!Og2M=V|2WjR%JvO z^>PMtXvi9sL^wuUO~QTBf^dvZG#&Kl3?EXWlVrb|ktM=WGu{jlj?u{y;?EG_sF`4f z2*>CN5)#ck`w*BD#fY*DKZ|LmJPU-QrsEkR9HS?RR>G(x!ZF%ra{F_YLO4cenE!%W z%e=`-og=i7A;K|wn#po_GekH>=Srq685GKhYJdJ2A{?U&<(&7)86q5`+Mj<0lbjLN z2*(T&j?u-UHY-!l8rJ^&GekH>HNr7NgkyA>sI_N^aExky{uv@1quQT;h6u;#*`l^0 zLxf{g`}5Bb;TYBa{G|?7OHFUcE?Qwk*GK_&W{7Z%t`%lih6qQ^bYwV2N400U3=xje z^`drjh6u;#1;X5xA;J+ZPB}*G$q+^q-6+i73=xjeO~TxhCBiYf*?bVPeHkJgquQT; z=Aji()BgOkL^wuwnjCfMS&lXC_i|vVB*HOzwb=t@uO`AVy32eNiAAvY!+0A6=D1(u zpCBAd97+V?81s>o>A94~scu-U7ooH|vK@_6gRq!UO>~--FtgyQiB8jQr>faqtvOPZ zYVFUTQ3ah=D(E!HVGZJ`InZO|f@NOwRtThLmuYlbh97szG&(IqbQ%tlm2uBV3px$n z^?68phR*;v%br2%b|};6w2VH>o?4jNm?a^AQZS!U%|yy<$ym^7<;UGll^=IIRes#< zRQYkYQ{~6qPL&^bJ5?@jr`)sb=h_$t??>~*zvOnR>nh00h=EfNAk{>t#Z%@ci2Ysy zt)!Z-1|gOf8PydiS^QITEJW2rr^P>0G|_1|%UwHBbQ;dGr@Wfzw0Kz2M5o~_dp=xM z^Qk1R{P|aN5sI_y+1%Acr^VCOA{LtHw7Bv*Rn0|cTzQ@9)`?DwUub=fOl(1?*@8~9 z1)XLOLs}>T(P{B5)-RzX)mDa;6&}5aPD|LuV7i}q=0f9e@>O#X9!awc&sdD}#LeG> zHZqTo#ccJaysGhLwjKs^Ly&2~nVba;N7vhZccZI3Swyy;9J7KzIW}FYT_k`({T}idyn;*cOzS)H<+l}NO zOgiOm$Szz8=8wX(WY1kV-$))cS*_DEC)1qwP2ScsGW)ThP5w!knVA6$`9PRinNP8f zNq%VZ!TprXuc-EsWI88vCN20_n0cAaRQp7j_RQr>;LpM=$-K@up9-@)yOKrt%%tzG z6`9Ye_HX9xNP1J|AXb~nW5R6BTupSF@Xb_ z1q?BTc|7wb%_*{I^>djksn$i9Ut}U!#U_2iJfFFXYJTZY2ea*q*5D+2iz}5wnLp8j zpvBsGB{P?5Az^-YFUFe#WHk+>J&|STxnh+{B8@NI=kt(A;0)(oNB=2=>WZ zJXvLZ2D$wVO|>JaVAF0!pk?&@+88jQHpq)Sd!K8;NwOH1Du9QRM2d}GYoTX;WYHN~ zk>>z_roC^Wq?d<^kh}rOGn7ozl0%TxT#ua0u!reBcShdWhyP|rCWcowf{F-xNI!ll zcmdTY&A?^gqRbdYw+ph=TcOejdQHlNsu(cl|^@qDFhiLuiw23D6llMyf z8y4q{XAxFA8N|yVK1Lz>5yW}>`zUtZDu}@nN`j~anjoSAZuT>$xwuWgmn9w0imEmb z$o*n&gYorJkOLMAQZI#2f%Q^=heWYnjDN_Y@dG)Cnh#qXLkF&zkAoW?vG}%d;JJ%% zP{gC6Z`3@+Tt1e8@))d(BBI&xdEBkHk4@E_1{wQoaw4B{u1*t=u*#xAPOYmKEU=r?~GRE8iX zcFaxeF-fdNi%Vg--?0JbjQA&~S@iRz=uJj#^ed_$dz4u^ zV5m`BhX5AiVb@+&C#$rW-q6HmRl2=e{JtwzrF&Y73rkm7&q%nl4M^kzRwkZAmTj4J&@WjL_8Hv+fq!VRcq5*licxv zKeFS@(b`{pS$h-21CU4@%`4i&MSHIn*C{c;J#3*>fbqPd)2R(ES21U}F}ES6)~fA` zz~M-i`^%B6cgM}_rn-BJcbeK(sBmQ3?#91Ga-Ib-tMyh9V^rHORkKQqiO!R1eNO6N zr%vPrH<2nyWH-bt)jLWI?2<8Lk5-jZzDhM?KoduTgL1E%6VONNWoS64Xt~{0pc>g; z5Jfezy&%I2k>@Xp6mzRU+COKCKU67xqcg=HsuX3Qy1O8iyE{|)kxHeeJLi)-gbALR z2c!UO$EQe0%^r8iC^#ColA1k~=0ft4_#TP5g}jV{dnAMJf*+DZauZM|C_lbD7&X^1 zr;9|t3PBB+pv{guQ*KTdNlriO%t>h)m%BM#EHQ_Ymz*w^oK}JF%SS5n5(&Qwe8Z19 zZYur>hRd+8`0}s2qZH?dzR1I)ojZ8wC?hjBYqm~_KHrmmS9tdN-BBQK4%LK^K!@D1N) zcR1H9^I$_4cr|IRltwAO0+qM~*|GA6Av0DxM!*daoe9%V6j7VmX!PF+(K?8R+zf(u zw-n*Ga<|poe?GEk7ZVOG&f_&6*pA|FUG4^M03fD@r%Uxjo_8B zi^bU8;D@}2a8E`&8XkM$M<}zco^w z9f)kmpwqq5ZHO9ah__HRsv(r7Z@b$N_?n7}?L}T1qK`Dh1n{a0)Jj9FCNB-qPpbOc zcje_6k$cA$C=z&JKczs#2#=Af33`z!g|T0Zx$ zl?v;+wl8G2K(q=G{N!S*$(njrEJ}m;< zEX$`exOlr1?C?`CZXY}+Z#-U#)K_1NT54Pb(GL(dn6jo7;0}Qskz5JaS-8W;*@9gxh2q&B@u)$uKmqR{f-&+dySe}wQ^_i+iC8eMOA_RnuI z&O1I~w?cyx&TA@ek>?^Vbcd{f_rySUBG2hmt8Iap>1RaT`7AwI zYd5&s=Zbc_);>jPmx?W(AE1TS7Od`^c588OSKLjsZ-baU zC+~`H5b-?_v**kdac9pts1rHM)gCO`ujoWBamAA<9&%JCf?Hd+JXTt}QGfCdXCDaW ze4iUh-r)>+8e;b$rw*^?N3F*Vc{1CjTeZ;&0aYoA!5@8-=uwp8qDJ^4HY=A<4+A;P%np8)!W$YV_H=Z>9#&yMz^=I_A z+rXF|eBIU90MVadYGWQm=~W;mgJ>YZLmW>A(bNuN4T%*XZYQw;#4kaNs9TK%I#N5y zP3wI~B`x38I;{)|rZoV>csD}puV7Q_Yy5c|KST0Jh_xbJhc$w~+9ZU0aG-Czf*GZM zFUVP~wQV3?2eCydNc}F?Dg97nm|NP=$q`#GO-6!S)j84)*#vF3!dD~D3ExE*;uRV) zF@lQZm7HWvbT`CUU-3+sUymUcSE_1)>(H%B&j~J4%n40$6($@%LUY3LLpCRLJOrl~ zxGEA8-90xrZ*$@Y$ck6;1Z(0Qct+rrY_TQ=@t>D(jy16d!g(dXXH6V|`H7eBEpvi{ z=I2#BW8z>0^Ge=rPB&{?sSOv>w9V&b2_=zjUkqYfyiZZx-XHk)(Ds=l4EM#`KG$xkn|S=%+}}?Foj&j2Ur!_k6z20#=@KPAUqP*Wp_!ls zq2dcuT|upU5$;X{)QSh)hFc*fA0Z(>uxkzk0Y=`83&+Z@!9Rgo`R=788VvYLd0wZ0 zto&uPL4mCN<*$NNAS-{Ias{&TC#W7Q>9YwEd@%!!liL|iI<^l4Kvsba{(n{=5RjF> zeg{MW%A+VD3QCZbzoCdVf+Mrgj6p)b{Ke7n5DCbtxa3A8rR*z?eIKL?vMMfL3#C#% zp%%wk(^@GZN&>PfPErN-(c9ftTxGP+-RVDSgDLMTAge$V zO;aGNzz}xP#?aHnh&z-zO#-qC3?tnvAgjP;HmL$x1ui13KvsdvUPd~tMxYl&B&9~N z(`O&5=UtaaFDJ+dPtDI%6aEy83{L@b5I3R9UPVktCEm~4uOrO$%Zp3h*;8$H$}u!XtIR(Q$#FjCYT~(DRhE_L{rZ` z1m;9BqAW$kl4i;)fLPLWJVnG(=p@lf7!DCjp*C|43`i@)QfP*G0rE=`u@sskG!BSk zrl;X!7#coB#8POkWZIIVwW0augZS5)B4R1D&~y-Waw^P_b_r=qO(V0&ehrO-K|wpQw3wbb;6ibX4o&>AVg&J+<#p|!&7N)fT7nT`|@OQG}Si~jBu z5lf-qQW{8)k@DGRwubz*dC)0bw>4a}+1cH^F6ySTbjeN`{Cf zbB>~kSTau&S`bT7o71r5Fci_%gyJzOgC$;b83fX^ONvYmRXF=_A;7a;gz=_`SSs;J z(Sf5C#1b|Z>}Dh)mP#xMQny2iM@J%Jsl+c@m?xO!UR+WzpOIlACAMTNh^1Hw?R(~6agl>W40GJ%RetyqFmg;*-B$rYpOiC8M_BLfbahcjok z3GxVgzM97~L@br2Ogg5+acKCJYCaW&9)B|xh*tWkSqxF;>!|C}&lF9>Qt2^86R}ik zT92_kh*&DMgqF&_#Z7CZks)HK)MH)Ew1`+LEwUz(CSs|yi=v5GD)m{C9}!EXenlUl zrNtHt7U0icaEXl`bTozqtUoXPSkXi*mBuVSsbub8BBhEZVyU!T63h^>RGPMW!}bgjOQn_8x2R9VQfZaYRf1Sz zzbn1adI^2+#8R~&ma2y#6h$CnsdS6=Ehrg3>V~dhJiH0N>S?wC54L=o-Cd4Q z{B4Trr`mtySlJiklI-7ks{OAxRxa?VEDyNKo$`O^Ng2?5*x^3l@N}(?&tsbP>rpAiLBMW@7D!ZkK_-qx2{muFK33B)JW~%kgdSU1S@)uZa=( zgxp2#g>NN4BMW{h1~T=q+~q2g^04f;nJ*rexkX`m@$7l1ZTpvpA)3Qu1r3|9pW@S= zr@lQQWg5kE*C9o}J@ysIPbVF;7n7bxI%?lddOmBv%zo-+&>Gg53u58v!LHT#SEFrb%8_|MG*R`2ZYdWG0F8j~~N7SsvK; zQW6UWf~CE2qu3m1gJrbAu&W^mmJ{3RwNFR>!8ql9o6j7<1l5D3eKz4YIg~WcA7wb{ zvZoLq%Y$%t{GU`HkmW(J{te_ArhGmw6qL(@V8aYBdU+6#FdgpyQ&eJkpdW@y;m7a&rGbeoZo$+e2nlK$|P8Vur617WoXLoy3rDw!DpSssKdDlpyJThQCX zY7d6ZAupT}C7a8Gu-b!Ra}P#X?ZL3QJP20}hGx{}9*nTsgJE+IMp*5^u(<~#toC5o zb&RX_VAxz9gw-Aln|m~AuCwFkrI@*u4CVA$M)5mtLJ zZ0^AbZ)TI`?P(K1Uqrga9zgoCK1iq42-m?}l2W5ZMi?%gjbSd2`&Mx49l{aY7|tGdU^ zb`3ZaX2+D%t1}3TsO=hXCL9AN+cn@!m@2Ye1I~nn=Hds=gh|WdC$3Hj=L6PK#8cBH z5y1(sc`XET6C?_^Ya|M{Yb3tBT_a(dKW8K^eiDV-H4=r}H4=W&!Ys%vU&AE@)7v!? zwqz`epJa&`%8eAsn2=ojBuj^JjEW+o<<&qyknwM6!n?Ws9Ed;Yg`H9CC8_ z8aEF1aGXJ9u82}0i*nh+kqRrCE231);=`Hj;YgJ#nk%AI!5)rO+L{HsWDiHGQt8nq|65laS;1rbv?Qyn&_By>l7dgL}iidrt9GX7o9mxI8WI{5g zbiRp{>zr+fHNZI=7S=nH4B|TZ}`{)tIz9=_Px); zVW;{O(mzr364LvH4&0MR8PmbTsDR)KlsYY&5+J)50qN-PAoqJ8lV4U+fNQ{HCdWmf ztPL|=IW8IY6BnZYbUU$xHMWFwcg`1nS@&gnkd7juPng7OD1g6s^XW{Y{Sg%AqUVu< zVIP_Y`eGS64c}0N`n}W%EZfBAhiOb(+9)$!^w~z4lT{mi7j>JN!8-KYU)_w{XOa%u z{ZY@ES)`+OuO6UJAzfy##2Aq|m2^_tB{Q3JTG}Nuhjf)a^=hPZ+Ct>o&34`bJ(sj< zqs-}Tu(+@NCSH1E=8>+m?}3>aSxq-cdu0|--X!gnSxCBB+AGt}_EM|h%p$f|3rhNx zC~Tw>Gbv&9LO30CVAeUvwQ}8Opo9FHUb$YT2Kxz=vvLCmC9nOjYe8Q?+HZ45LFGlH zgZ5YPO|A0c^++sg*P&G^w~#Kge}y}t@)EXO(*Cdp^rhP&PY2tVo^4cKMml3Zhq6^} zy&ZIw^sUNmq`Mh`dy}ToWQ~fHB8QbLmKxS*lFB%%g~oZMovd+eC%^p}PA##R6X>a=bM`4rXBz3Q_HCq3Cf&_m!?-g@ceiU8cP8l`b_eCNNcWTqvQA|M z^|Br6%xORw``SNbI;WAYv*~HqnoGI?ZM78bBMsOOf)e?msU=v&vnknpes4L#{9cN> z--lW>czA{HF>MoOika3^c%Ccr9DcLK=ov=_X0_FZ1dgr-Di8Cm*)gsXHVLGv z+9Ew3-L#irs+8tt@&c+-{7=XWsw!u30eBi-0QTlG((Gojef~&ZP|@8br+&LIbaQEm zlePQE;pMH?f%Ef5-|r(cV-1j9We6K#Eh)!<{v>3h5TW(~5DP){V`%?hfvbB1Kh}RR$2(q(i?YkiMg6PN40R}4K58wvaAi7-(q8!9}5>+7X0#Vlo1gx!V zl>cpYqvZdr0h96nPf%#gBQI9sd#acyA3T0*8IRni!IV9sWvNaXYr4*8G|p2A)PE@e zF`5zZAyVcU*KDG-lGge7MJ=|m7SF>xKN(sWWsJrZAZ!qHpZwSAs~{nUQ7Rp=8ZU=3 z>-EPbTWt+@NLL*d?+yWANpW)v|s%Kme&}>{5Y6p3xtT zK@Z!j#n3PEmfB{>I%rEBh~I(e$It<-;QC#Un|L~ix_S6P za}QXK{|g|kTPuQ=x-Ig*wQjroZ>#H&|Fio382|m}=M8^3a_VK?QGpEJhU^E3T>EPf zhe$jR;$sqzf#~;bT+|=%0l3NF2K)uY-6V>u4C56NWgxsafXISKkf;GMn8Y9u?IiLb zt|T!D#9k0XdLh*Z97twD@+>8@Ao*nyl7*0bPUW*eWOf^Ppxgke@A|w!#ymP6@oFE2 zs2P0iJ`mGMd>_PO5;uZ4pTxI7e4WJQAZ`RP&`o5(vyl7 zUPV}KPY~~uNP{T)4u}#E4v2<4qO_om(U{&H9UHr_7q3SWLphkOK%fj}`yXU_9Ls7M zn`7B15**8BFquuzRAZS+1_?ZZu)S^qj})`4A3?N~@!kcofy8Sdwv#vr;=4@g0HT~! zU=aG@9EeVZs5jE!eY#${D(_GkI2-mLoFLtQCk(OYp|6~SPIK^8*aW_rVo#(fYm_r6M0NwKMe?mRxU&+4gY_VcM*jv?_N_`&jhrf#h6aRn&M4RDY*!nN z-PH(*&N5^L`uvk=boK9LF93vf&`ntKM6Mf7!VDc z5JxrtG>oa3RN1e0Lzo0(_BT&rLhRV5G8#MfnIzb;HBn%Vhy;4j}nX53$d)DCxQ>I1;Hy+j6_qy6YSCzsx zZaAg`(QZYa?>#yOW;aIHstN0e%9=-pGvhp_AcX9JQB@gfX=}{|FwI&WM6i0az{HSG6^W1?sj&CALrHA+sNn+$>4HeVz(@;md(c*l64jqiM#Uz8uKZ z@kpZsBbBN)IH`78dPE2I{c_-IOtzu*0+lRk-8JS@78}pPeB2#2a1(mZJd+Q)<}FB| zS)N~&pjn<>=b3zV9WKwQ3q(;J&#+KjzYLd?&lNpl?}bREUDCnVT)_hmJ8v^&d6fa@ zLY09Ms0{K28H^Ui;R0PAqcW2NHd+cYQ}l>Ev|Q8tOlXdk7n;Vfq0F(1%8_%T%25ea zj$I_j5wiQokKK4Eo*WlYEU&9a$U#8?dBd!VZ5LP-EU+q6V3nekRf--t;csD$Qe!F zr_{)YHzD0AQbn9_MoDKBew6gZDeQ_Z3s$d$^M&<@(6SKJbW&ru4mVF0Qa1L_5K@|Q zrc~Bhi_XL1W1a=w_gM%bTclf`${dZn!OCc51(;kIsitUUI-_o73<(;0ErP~8*M{nz z%$_sm#ZD4+DDo4Tgp!{~6(oI_@q0OT++_U^Q&c6anp(an)91P=86WJ!NmPhg1ezr+6%pZCUbRESWJ|2%6e>(Xex%p-5 zsHS2FiBnWI;c@dFTIk^uj`U9J9X9Ofv(H$Gpw5O>(7H=va3WJN?m8ahuH!L&*x8S)AM*W;k?+Io?vThMIwRk4 zJn|jKBkwsLc@L|@7|)Kidv)GmbhCr&t=c6J?YR-eN)S(iXx#?|J}};QkjQsQ(rCY1j{ue$1g?4FnE62$7ds*HP;h{0u&%wE*9DQTSD%3GJKl7>&#N z_Qa8>RbJJ9GCLvnIObwv34(c5rmYE|BAi$5j0x{-0stD9wR_@^AmLS9W=>cK5wEHj zJGTSie2mUL0REm6CP9;zb?F2jnu3?LW5QJAz{@{lqI(d1#hK*qy{eifAAm$V-8b zd}mOuz(>Btq!swcw`2oeHY@OvZz*X7KJtBqw0iC8TgL4L3Vh@%03Z1}!ABzz?)TQg zicpw#HG|UNBY$)N7zI8m4iTTEz8r)Pqbv%1R2;bkVt|hbrk9t3Kp;q< z>p;W~AS7#qnbb$*y9wBpkvDa7o};mmIe!c&WBXz(~Q0KVnD}Fp_o%D`2ExMp;BKl6D9yU?lAj zR=`NwA*_Irv_n_{BWZ`Q0!GpfVFiq&9l{D2NjroUFp_o%D_|t;5LUoQ!6urfz)0F5 ztbmcULs$VLX@{@^Mhb3blPWM$@FLO*j1;`=3#6mLNF=330Y>^Yswsj87~yfB6O0tx z#!6FQq)_GA2$e1!${t2t8}^jmxDBeAK4jI~2piWSl*JfwdY*g&LFcxWD^LK=mKkyc2fa5HIz zGzt$Vt&m3H5u_E;C_Iw1LK=nhq!rRAJchJF8imJ^R!F1p1k#<}UWbD5dvB+K4oKzg zHRXDH{Rkqb(A%rSy%VmtSBHBiTyL)q_fELpUY!Lfj_d8!`4!s0_4ev;?}Y2^)zRKw zgJ|8f!@U#m_DUw>Jj*y^g{gG3w^xQ_9qyfgw^y20WrQg!Le6@mso>rTczd0M(3I=# z^_!46ym8>*l^w}Q^U+>2UPpU-Wr*M5-U)bnB@=YsUIgX@VWQ5n4}m#REGlzef1r~o zPb+V)v?T6mZ?9w$MuqnFS^@(yYVQQRz1E}FoHwBWZ?B{cM|*o^IlPYc_9{KzK`6bw zK8Am-4);#D-d-Ji2c@@HhO{|&V(9et>J)l=b+orvs?BlkWZi3|k;A>LVJ6?0g_7X?R5ka3-bwgJ_t-*Gw@G)d! zMll~rg)}OSe+RT6jY<h6T4nG6=k3r}jTUl^ANq9TLo<&&1sML;O9|l+X z9heKpuqtkw(^OBKP)0)G~!MVh#>!O3j5HBO5IDnv)=qo1k1HjT|oP%Qe!- z;WmqM7ipBrA>k!BF=Z1Y5ouJekw$Xolxw7s!)+Gje$m1d$1Jzwl7jgRIs3famW%~y z6qf@bWSd1iM*F=)8pY)x2rrRFahd%EX%t81P$1GME_1&ijp6`5p|S;Ol&ImM?}9W+ ze91AaJeDL7R>Eg3)Vd#ZRV@X4m{QLvmE3!gNSQ+*#_kOKO5L9XLd-8RDk~5<@u~R^ z6f3#+BJr7`i8M+aQ#6rA3DdfjjkFhuCoG|*jjwal8fjE=??u96eGQ^YB8?J7)=1Js z8YQ|Ynn=Qt5TucBa}>IQH1b{a80%b+M!t(>=rnu^;zS*VG^&`!w55$I zri(t?sN!VRMnoD_%wQcVq*298(h6x*F^jZ98daP^S|N=pP9?37MisM3E2L4y9MTGD zRB>8a3EPNBql&qtRU1_lAdM>KwZVFYG^&uLvqBnGETCK=jVcO|MiuRBFSX>YSj6@s z(x?KZlfj>vl(2dsECQ{NM(K5TfEJ`tdc8~yf;38R;449eG)iAUS|N?n7m-#-qjUk% zC|!UwN?*d3Q%IxqrQ4yekVfgtNGqgKdg~3K71AiZjdVAoyS!uV#__SpvkMrR?tIfK z8?lN!9mLGYOIA8~AY_Juk2hoF?8)jV^6aGGFLy%F>uab7_^4$P?MvatskajBhM?zj zjB@J@c(^I@%sSFy^t$IF2$nI8RTt)sU5ILSY%0SCPC?x)BiVElSOMLL-nnGuHLOKub%bGr^wK9qdU6toe#zp3VHO2h-uc!vCOW$KH*`pcX`?7u5PCAX-4YE2$uRHZ8I*@~}y1fjQ8qXL(sLA4)0( z8!txkz+_|4UIfy8DpGq6%{&`qU(o|ja{wrUG};@Y;^M@s1BB{F8pA2a-o`@#)G3-%kUxciJ%|#n}}022mBkQ zD_6lo@PNaR;tXXtzO3gBJ5*3xGlva9x0=Ej%+$e6EzestB6a|>jL}@+PG$JG+f9R4 z<{QJK7h#0J)n!cc=P;93y1^R$LkxYq((g8hfh**dPMO1JK*THk(Qx-|awcTNF|K%x z4VU3py=EPDG42Fd=a17MlsNm}@ii-5pZx71$DC>Y?h93ppAAsZu1|c?-e8pL6F+wS zBDCfF%cc9`vh{W|tAk7Sw>yto+w03Z{8^!gB zU2wjXy_rp_T%Xu7wJX;r_GQ0CI&ghbhhUOYqebvlfa>|g<+7N>k@c1uJKI zQ8(rkstPb)$i9shJJ71pZhwI8O!U$U_XkL zE0)lZ1cqO6#S$9Y3#4+z5*kKYxnc=5lUA-+Lc>WbS1h3sq?Id{&`8qC6-y{jTDf8g zjUlaEv4qBvR<2k=6G-dViQz~Nj5WuEEsS!-5*Z`!LzF9)NQ*Ga6-#8SdV?aa zSR&(uQLb1b zCQFEN#iAMIiY0P_geX@mkrTxT<%&f!;)+Gn$`woGB+=5YSR!pE_l0U#ERh*byTicBKmcrxMGPc6E)?EC9+)9lq;5q-nb~PSR!YOnsUVgZ&zH4C|4{Iy>XGQ zSR$*Xro|OYWQ`O+xnhZ|6-K#Y(TsA%649>{#T5%qFy<|)>c+@6v;)(_D2&p2jSgbjU*6#=@mv@9Qc}FNYyoh*eKBFs^Qm^U9+$cS}RKFt> zS1hIa9ig~lDRtiwDpxFcc{iMq_>K@~nsC@sw?nCZN0{O}!cxCzVcuevCm@0pOuJ$! zwIySDM_5)OhH_a|788>12+RHlac>^jMs>A~&qyO%wnn4TE?crB+sfuRv7Ol27X>>Z zAr2VA9s>zUNCE)@BoMaXKp+9a5(p5$l(2n-HWb=Y))c}HEwoUUm!&OGD5Wg#OIv7x zLis(v{Rs1;vS)8usd-Rm9jJxOWf0lNPTn%#{G(>J1}15VaKX@xV}`bhGM}E#uu|(x&z|@(Gw_^xN-+pUx)7V z15(|u%15Y7cVIl|kq=Ah4vagBraLgM+<^kc5?AiPI=Tb(4#on-63=*^VyEd2j4OAb zK(WM?J5WKf(3*{}Q`=dIJMce2vBWoc+TlM)x@Puf{EbRDPfq4mR1Aas(pc5X3qQYlYYW^e>>=g|2`KMMkB>O?~a=~jfU6HgJ9Q2+(muf zRj`p8Yzm%Mg1)yQc$`^&tpuB((fAMr&$Fu7`XZja!1edQ%~cR9`gxL9-v+~2tZ30Q z_a7oQv|pbg7NM zWqIRRUIyhgd)dlQ;L%d$jbnMQp}c~$QuMwgEA14v_WyvDmX2eYlfe#MgaMyGu9qA@ zM<=p^Gsy5<2zM>GVVA{V-w9i_gZX%Ngxw45uyN<1HNq|=+cv-!?f^S%fL%(~9AJM2 zcKC+%MT7kqZk$^*z92E7MD&1=q=hA7Rf*W3i4nJg@WO(7B?#{X0r#849v*SOmVfdc z`ERt`hnmXuKh^TO@5tTrRQVm>kr%Xl-go4)wS4J!}i7@sC{zS#=L!GmLgkc(f%u;xMF(&l~kHw^v~Bbz_RJmW99 zz~Gi?mhtF?I4aAyV*{>34^C0Skbl1@{9jte6*lM9zd=s&+Gv#FEyDx#M!2j1%5%Ai zKmURU>di4j<>fdCT#{FuZ2v!7UBAo{H6AG6rIo`aDZC}WMS0~%I0!J3Z|vJ735?_$ z1V-`=0wehZ7)daZdn}v)$NnOXbU=c3u_9vXF=o;9Y_b{Nc&0wIYF_Y193th z#fT2119Fs-vY;KJ0|io4LHht)Yw*z_&h`xk<}GD2jn>8Fx)yI$00h9 z4#;tc4x|He9HIm1fE3|$(7}j|m zkmJ0JQ(&*>DJ?og2eQv4-Q^G+$le%&=4>OtD~+U#sLu#|f?>*)cuaN`ki$U>3OZ0Q zdk#`%3hN!3ow9%&hv+~$AScGpI)jaOK;3ru38&tn*(u+lS!VkUP;uqZgVv~de+y)o z_f7ay+M$^h>wp}JgR9W*;m*YAKD0*#s(sC2c!| z{&A*}b{#_hIMYeT976v%Mbar}%?ijnNoO2F|2VTq=N&@-ICDr31mx@k#&12y2C9IZ zF&OC@i>sVF)TG$wBtsw%89Rg7Zy=C|jGNJcJY-@S9mqo_m05=NV%uge zYMIO(EV@gWx{MCwVM;cm19`~gGCGilP0Jer%I1NT*^@KsD%pzJ(&2O|kmpVILI?72 z0vcHz$V0};=s+Ga{)`UfA!BEBAP*TgqXT(ZVJxEqdC0`GDv*bCBBKL&$Rv$A9msPS z8ju?Z{Lr*61TkX z;g1gFp+pDrkPPs?{xS$X4f8rWhiwb+DdHof*+yPR=e!LrucLFQlGo8WLTk&Lv{>G1 z+h(a@JT6OhAM_ga+_sq)pv>&jw#^ydeM{RmXBeF`ux)c%qH_={a|1Kc@-A)LESE!R z+vbekwwYSE-?7R&@so~KA}j&pgKe8xu~^=5`Ji8-bK((cGshzy6_S>BTpk6)@{Y$v zDz{I05D?2do}@Gg$An=ensQhK9O3{aMskVZ=^27!LkAZJPD1rOl4l?ewr!q)KhVHY zhWQW>(o&z1Pa_+)Z6-QXo`E>nwpnOe-q^NTXjWxoG^SO1 zKEj_oEpKewOqDzXarCy$0b1TI7#!WN${grCEpKewOnIJ`H@0mS`WtpG;-Nn>&p;e( z+blFKZ@q1Eo`E>nws|N-d0O6j+vYq2arCy$jRS!=*tYp$RPrAofAV_U=B-eYVIwS( zH1$VD;RD=LOrQC4h38wdgQ1Jl~bUyt1MgW{GxFVWUmg$R34+b9Vr(h-Fu4*GXm zbB*TTApIevuh8jhQ1Si;uXTFYi6ey9@g zjvgg>i=73I1BVgg(9Ok<*HUX}Zww`Vo=s+3>8*1z*xEJ&UpeFFPV%&tz1(hnv1l0l zxxe+c9yAA|h@X46xAmnBKm)+f{f)Qv!ED_CRx6TVx5LzeL0@?;I`4aO8qkF8gOE`1uX};~JKMicm9d;<>|y&? zVlNP7`&(B*r;>Ytc!yA3+x}BXaxW0?IFe|{whEqv-+{57qeM9XtpAc!*$_nVk}Xxr zRCLl}+#K>y#WK(a?F;x2yk`~^d=ow=soVmcB>5WMcbHV3uLiknG4qaRUVftFTd{^( z#P0Q7Mbei?6DtEOTz{ejL?ti^ML1wLgWiZ=(C`u3*YBPM#?c;v`#^`3hkykbA>|=> z0kmaUSKyD!4v-I%kOPX|1%b`X@8B0StXJ{J$1Iy%&IyHy1-;lPGjy;L|@DSKT@b~aCf%Xva!O^CC6@KU_KfbMQ zUkXNh2t3E^jeFMF998EQR%*LHMrw%80y}&c#Hy)w@;fS-qj=u|~IGqJ{f_b%4 zQj|h;7T77OpsAPO&tLINu&I8961?3`r_kpRodtG=6&fKr3+y`5Jw}R;sCJ&&YW%?s zUDV}Z1kWFAQSbuYB5@W3(;c`9LUa}cGpa?iQEISGwTRAwV3u-!h|Ypwj=_w&P3xex;_KP7p3xem8?h4Ua5ZpKu znzIe@8^e2R- zkoJe@PY6vVZHMSj2u&mHhUiZSO(z`-(Vq}1l1_!_PY89A&V=Ys2+bm$57D0xnnSu^ z_=vjdhHe4lx7bkeC%BOV(5X7{3xp?|N8;RO=@$r3!R;JP%+fD_KzTA&mexUdnlSz> z{Q}|X!q{0%bR%38#?8_%5S}4SEK9#YcrRg6S^5RSohBE!OqPCuaF;N3S^5RSGlj`! z=@$sk5+;|WUm(1dBet~eer1-P+3uwm9(k~F6Cn;{0k8a_8r4g|#{Q{ba=iwL7bRtW?KzKjVN*X!( z1;Rb%87Q<~`31rUo7dw4%f5?thkJ!Kvh)jtk1*K}D@(sX_(-X=D~n+?!i!Aaab{=f z7YHvlc{}UQ;_<==FOigOTR#Pg{Upe(k~D` zPSloU=@$sE6t(49`US$ri`vR8{Q}_=MQv436aHD$!e|&#OmPjonzGE@m(MpoeR-BG} z%$|iNg|5YuTuc^LBfk3RHAbwF3!epgr4cKT_J>ZT&JfaeXq^js=%t|D&<{~gOcvr) z=r+=_5N8aB&%pk8;y6~Iu!>3I_Oc!~sU&F&Jz@RMvTcU3JCWvhEpd!WBEvy3LPRJ? z)Jao9N8?7E$o4_(5B&wzB=o)Fax^8O?-h$Fmu|#D_mP%vq(bdzNuq`2WI~@@33@E) zeCPw}w39A`p1TUPzE`ZHzP?u+j)|O@!24Ber~}PROr(B$=vC&`_lieI>w5)*>=RR{ zQw%-KwoPTPx+W)Ul!F*~%9^bFG7q2s8(7e}Ed^gQX=Yal-~bS(4E;f2#13R8a{ zmbox~>}n%1H;N*cgf>&Xy9V^~5MO&G4yMYc(0bB`klq|RnZ?NC+2x^aqz|WjYlsi^ zi3Oy$g@%w`!shgcxELgs{sF_k9Vh1`G^_e@B>OD~)!2M4905WvU7iP+^8{)&Qrw_@ zOI)#RjHl59VbEyMzNMK|(Y__BG-%(F(Au{|+BXbYlYu@QrN(~bQ;$?$qhO~j^LYql zbxiq8cEQN-Lx)kKA)Z>c6GzNOlca?`?q4?(|%Tn9PULL9hI8V&R<)z+ANkM6fF!cm5K7YO~> z(Lmo)?U&|p5H--ZRQr{p>07G(TG8|^)tVm8oCf-qYCS^BVEbVdOIg$Li4%HV>-BuW zvgli?^?7!Zrf;dXLecas)mD0>KKhnw{feeNt35psHPE+I z8xXw)`j%>K54&pfyMnEyJU+wPKxO)tYJ(oi8|YiAbrenCQf zE(JEww^W;vFV-69TdK`^Zsm~Dw^W-KdZ_r8`XH@c=V`=Ml$NNDw0z{19t}lLdNNYc zg;gwJgXc@MM22k=wDBZ=^G}f}&;rKy`y!T`ExcC@TRa1q43Ckyel1esi%(u`Wcv3; ziV>p2C$pVm>=)Py$;BXtKMCR=Fd$%FA#3KQ9tiF65Z(j=%lg&$X!Ryz&J63W%^Aqygo1AB!Zvbsvtthf!MQsS`mqoHhc>!h>F3j1BxAD*KS4`8`y2 zm(Wei0Gl+T7OSVmZ!4H z7&U`gjJh4Z&sr)fhyEJHUX9aYK4Yn3cfSS6zLfl0 zOLkE539EinOY*3?`9(_pt|iY!~9W;RRq6=2(@p!9zffWwIL#t?&y zeIJ8o=}E@eB}f}%_5l8-2T4T1L4xnE<^gS)G5A2_ujc$llsOZL;SArRd?gF58hPG z_q+krHx2xR%Q*xA&)V+|KcL7 zV_;G;6`#x0ieKr6NNalrNnwoc`AEV%@Of9f)5%HVEfxz#$J;tpQlf853O-iC6yYaJ z#^kLSXx{uAVmOCfQq55o*HoOJRu05yi|gU*tY{}x>rm1EsEXjFMJ=8+XK^038*RIg zJOarMNUaUk?MRk}Oh!XcVh?0&`b3q*=Y8NU$lF#zT!eUk5yK768j42S zCM{p_9r@+xBa7}U74xdYA(hw2Q{y-7F&SXSvXD!pqt51=HoSIaV&4z)!%-WpkXgR`Sbbvr_mR($!_~xOev!%)fEG@GtR}T@Ft@ zjLYF}Tn^{qr!I$+r0JI-Z`)^=7x4ua?0+O;z=;ss;i4c;8qB)VgfZH_zz9=#y(kVO zw7Do?5#;xj$@y-gt%!u#8P#kt+S<{!wMZYX()l4Fn(6cYROV?BsXJlt&no5SiwUGt&1maGDqFN#QdJj9 z4MH(&kjz^)2-hgIc@bWz%F-91#ZGWq??UqJb$GY_ovJ*iT1LlnNMtVtrZC!IZP@`l zR%7%6&RSQ_-g_6|EgojJ*}o-KnzgRX+IN3anzc%^?w-=D4NJ~xf3jYXq?>Xx7~H4)%l#U%U&iN@3kI8Wp0$~FPj1S!8j>R5>^ z=SfHS!ijx94Z6nYb?n4P@*KMfm#gZ;{F+iHKJxJXG8HAXG_g@i^K$ZX>3u9Ye23F-MRL0zhfs92vnvz@fQ!9I}^%S!I63?+FL}b z41PD~#k4OV<}9C{xuj@Z3&JR-*seFFp3iW$mOy6q-;HcDPHAHTO@xzC=8P3%N_soM zwhh0cXxxetZd5gJE_BS+GG0L7jnOA_cpjI+-`iL;nx*iOwWZ;CT!!a2C{EpemF73( zWq1^yy$`&c<0oWzrh{+$0>yD=)uS-!;G0|^r+*FcT@V|^Guf|uJ$!t8?aHFjDpmi8 zRm-`(*Yg}C3t2RM_s~2D{Ce_#W205h$HBKs9QZEL|B6+AfZ}$-n!8R_&8H+|FJr4( z7D{V{f(|Smx(Q`nBxN6p!C{?dKQpUVTqLEY?#J-TQhSk{!g1tfalFXWhaA^|Z$$|7 zW+~@>awn|C6NBPE0YB-r1Xd&z+j{CEOq?Z5AI1)_C|}2TaH3Irg)q`R0NQGRaf#Y?&uratWx!E}0*imbo!U z=Ek@Muc3gs9_Aglf`xTU3ubpyFyb%>7JAMCZOl~M63-TL>ZyMvNafF{H0)nPO3lQR zAUuY}L=iHB2)%~29`tB0r`iJXUA%Cqx+=~7B-TXr%)Y?nB5*v$U(Ir*c`146h2kG1 zFFjdcauN6%{9YfRxZl>xxx$1xfGap2zOnq6?Q=po*t-HyS&SZw1}J}YKTgOLG}!Ft zqTDisLoipItivA!FLPUI&H>NozIl?m4BV*s4z%|bFR0lwN+4JF6Q` z+NDiB$dQ*eF`sHvyR_-A18r)THZ?uOG2#c}csGERWG?u&g~9(Y zBV!cbKOYt5q{2^e8W&21-wsrmlL}X$z?S{ENGSel@S|iF)SH}VuzaR>p=eG5V;>JE z+N)fs%)4;*=gI{k{9Ktyij?fHat_UvJE2Isv3|V9oZYgp2sux#$k*Aid2%9z?8cl> z1g_CHc!_rN5`BYL=bzhgFI_RSRV8UITbZp@s8&o8QEtPEq{0B7GCCQP}o z2q!tX{_FApY>=yZ4KItw(c%51AENgSS?PxF9a+mFzYk{r(bG`o z>13ZFEB!r#Z0u)P6??D*9gF&U*ucvuo(pl?%V-RnaTtD>F9zpk*#MJNDJ*eaJeorhS;4OSjZ;-LC!>%68D%QeyR$aXbCv86&;dwGd?-^9?$aZu<}f}Fzl+4lTT#+%lsFIN9DtM2%ah^RvhV<&k6vX8_qOeZ7ER%a z(BiY3cT2A}hYtj6tBd3{DCz$ByzZB{RT^y;`oqV-Gno;?Fo{;omL7TjgJDC9TK@RC zo==ZKn-H%iuSeUq zr$J{@A7<26DqaA^d!T4c+6K|>6x{;RI~29`AoH&=M2|wu8AaoGe~*8vG5s~9@H|Za z6vS^qwE3|%d;sE)S{KhvZGDjOlvZO5YFgkWZ zIB=G4d$eSkV{G}zQNUWwxo!5}&$0a(MCNWj4nxi}aC=F*H>8J`q=)?+dRT@Ids+T2 z=~xbRHjWMZx2_kXV-r;PsKw`Ge;(EI{_o$4Q;TZM{!0p|K7lbm1{EFF0K&WF(-RLJ z4dMz&4yguF@fD9Z9`aA*toVw@8xQ%5&^+Ea36av+D-GGFOZK-C`jh-yso?p;ZG8@N z^X4%}a^u!Mhq)m+0PmV^>x8QYKWAdEgWCXqb^9Gr7NB)R3FtX{yxCiaIl^B)ctlxT zRc|TGt3KE}3RfzBbxV7Hb_~8x!Oxj|#G)~PAjB`b((E0NRQ~FY=)L*-romtR%HD0~ zn-yLKBT`1U|QD7FMzOx_Ziq= zC|Jc+(D~O;uDYdIQbIEj8y5L-sY{`e!&)Z_)_iR98~ zDH6%0(NZLMsVYfz70FeV@}r@QFc%t6J_zs(saagl|>HuYr<;Z)vm?6^>RGzEz!~3feaVe{RPw@gy6n!?&u_ z&p{;NTh$p>sKU3Z>qzVHt?E3p)c`H!3+gh&Bv2N<71$$uE0BgKSA}nBw3HAZ6ar=8 zTN*7z!nXoyCwK|p3gkKSRQOh)p0o`C7TsbZn*$)r^*ls$#CiiNVLl2)-$ z_B7He7RsJZTE#-yMbau3%I+ksVxjC=q*W}GJ%_aZwkjC96^!4C;V7|CK|v>}l~^ce zvU!vbZ}k`p_sNz#mkax^+g`e<~=DJpc5G-IJ0jZTtgER>_s zNz#mkaykXeBa>zzLTScMGZxCx=p<>zLOB|pB+XbT z&BW^v3#I8qn&A&l37sUvSSY8*JQEGbevOtcF`a|We$_sNz#mka&#zLOB|pB+XbTN28OZ z84KlTbdoy8LOJWrn^DgFX~sf18l5D~SSUw-BUQ&(C}*q5C5*999C5$Jt2Dz{DCcUk z3O&p*7RuRX?tsX)QU5PM;8w94f8-mfP%S0$jg(tSQpG}r?Y%K_5(^cURZ7J|g&Vng zsaU9RfwYQ+3J)QzVxhuiu~1=I)l@80SXQ-CEL0@1k`*u(Dv~6rVxbhxSSZ%7Vxgkx zDvT9lp`sZMii(Ab)=5(&7Al(UgIL8vMfJkVSg5F8co_>7m2Rk5sHk*9#X?0}SdNN? zijF0%Vxgk#q*W|bR4=@Yg^KEhm$6XMvRJ6-MCz+psHlRe3NaQcs$i-@jD?C$p^l1$ zicV#(R4i1qI2xx$#X?1AkXEr!(Y-hdDi$g_yB%^B3l*I+477@citfWQB^D|=H-;ir zEL60cfXylvDta(gR4i2V5Yj3ZDk`6?t5~S$;gqXbsOSRHDi$ibgw0X0P|>CDWB9k@ zzrTcABwJ11Q+F3}Ye+wl{!GjD;$p zV9SzPLcvaJ6l`kYS%XzF;7mGNY2;W4P_S9CM!{yIH43(njD<=>g;XfmLNXRAF^F)J z7(}>92*Qnug-SM^kGdolD!B*3O#|Vl!<+=_Sun>~C;(pH&Q@9kqLyL)83<{q&&YB8 z1>p5ch;kb6T4=^X0q|OA#zFz`nlmTIr#S##la|4*vUOS0jT~d40C@c+%VI1P0I%;P ztpTrvW-Jr{ucchZLILnvXvRVT@R}X7d012`7f9xeg#zI9{t)FD3kASys^l08r2(%c z7V4@}9-mQhK9v~@1)KuPbBu)o;I+_sv8a zImSW(@S3#x&aRImxXx1uVp)(_D174s+qxjJP=(1zMHd(g1;FdC(2^kxm9Zy5-EZ-` z$f5hip?RS}Q%G|CqvX_&k{xRy64+@*#t+JwI+e7v=21BxR7M_k)aiz~@eruMHbwt$$~y$3%;xx$D2##^Q0|p3z8|v{h%%QuV5cvQ;W9X9$+7DLpop!0vm<10LOs+ zXC%x3rENjKI}S|gtDciUi!E5?umEKXR)sEt7`PwZ_#?I;`8{kwnt?VmUyol9m?-$8 zaX%=LuX_FhLVwl6Hk7{Vc^_oys~*ZrU-eME^i_`+y`wG2bkeciAWC2L#L5KvtDYY) zFXc`6XAJz^2}BP+z$qqi!G>eKcun}?uR3v^4RJ3 zusF!4JR0{yY(b6t5h}y|5L-}h#3Qz##{G~_c{J{ae9EJ7Kg1T)xF2E*YTOU81vT!6 z*n)Z^9$`%ZEl2*20a29E03kK(q9zd$R5e&Bez)@^LC&Fi6WeWnS z@^CyWi!BJGN+uX$3j(Q`OGuSs3j(QfxEFo2jEm%UT6k8BTl~h|L zwqOaVQf$EzQYCFcAXRdt#TEooB|ETHY(aoilG!G74hC1MMPD@iI_FkDyO>CsEg0Fu7K|pAu>#tH(IiP_3o4qnAnRAQU@UFnxrer3 zEW<%jwqUHx7K~-jgjm^vu`*jQR%Q#v%51?{nJpMAvjt;iwqUHx7L1kIg0V7NFgD?* zs8@X#6DzX?V`a8rtjrdSmDz%^sqB@q1!G0}jg>7Jn?YLHg0a0g3d$CY&Bjn^TQD|< zb6DAeu|ZofHkXE(vIS$^anQ;ZjFs7fu`*jQR%Q#v%51?{nJpMw!saMjFt+p^4F7hV zoa50fZ3|YT8k^5dMEcN6m)L@_6R4G^SZqOWT;{iZIdr=r)V82EDM%q=3wjrbir9kQ zUPaRu^d2F!H4Itff_5r3ZbK>Rp~MT!m4szJ3xTYT35|9twqQb|or*1(D50GyTM#=D z{gat!3nnz$sVu1pjdm)wV8Sn2c-CN*{1Qkys%^nUKq?knFd61GEVf`WA|!3WWK>An zg2|YWv;~uKA^BZQG9e_ti%BL)DqAqs)Q7sn7EF!gZHAZl5F8t>hCIwkP-Y9JYD_|8 z`mGCalwrOfgtS!Kf~hafWe|xinEFc5v;|XNE1I@o%JgvNh%K1%2rYwc!ElhWv@MwO zdOl-Wv;|W>&koYG1ydD@rY)GN^hkZQ1@US@Xxf6QDi1qm^Uzx=SKETAYEL&rVhg4M zq9?XsN}-+F*P;8Dm-6_G%04R77EA>_l#4BxauiKlFctCeX;*B)R8-Nl1ygGCBe4Zj z8P7&`dKMe1&`!k`OyxZ{BJUvPN@|@a2ixm^w*^xhJfEW_LxQ;H3Cx#g%BAok75Za>Z-zaq@Gl`3VBa1M9`{J3MS~)g||`H+Cn{2&n+xM zuFZuRkX%yu1=@CXp$oNKQ}_$Y++KJC^i748INn^?iMHKR_#Yf^Eqn|8+Y0A_{y&8u zq0HM09njxVI1FXpQFsuk-!I&RTt6s$53Su<;BFFk7OIf?!@`-U@vg#$XyM(30BZbE zp$hbm3qM2ZPYR!)o%a-mqU4_z9zfoE3%6k0?km)yU-uU#L-V!5aX7xN7G8e53UiB} zUeyFR(d?Ho&-nEzZuGa}kM-tEJVM4P8A|_z`z$DI8H*V|Z2PsCjm@#EipEN0GW&mt zGddihNu!?z>)En;L?xP$LNYFG!)zUj#lf zE=|c`Qh-`z`{iKjU}S~YN7_z0z8iJJ>*MgbV_BI%ygtD(|3sY*(^31SNc$YUUrN4CO8t#yzk*SV!k5MD<&+^Px>kn<1MO`tb&;LGD zRb`Iz}--dzN!6E+}TJDsr^!1dVNA!w$$$uz$K)N50?NgA!U5H z1aJw}QzzyUz$GMxNXq>Uo>@XF0>Eu$Ua^nzE&*IZDgwY=gUUn7_;3l}5>m#8O8}S9 z1U9YJC4fsv?U&*bz$K)N4|f>zD&xZ?fJ;cBy}AT&2`RK!mjEuIjeA2=Z@)}ZMikpG z55e#pQsQwr(CZVrkb_nw04{F!KBUSNc5}R743_{dZl1H%atYw#)|2)p_{Eaj_zu)< zmjEtqf%>kypbN*Lq+@EfzXFwr90sO*4j=47D{nMG#mOYHPF{ zwKY0TQWR=yv>dfHT9g!p+8Ui9j6!XV?j?*uZH<YXh1wd``=tnKYqT7-HM&gH6l!Z!@0TK|tx+A3AgHa;<3vrNwnp`S zDT3M>)e#AT+8RAk)D&uKRPUD}sI5^QkwDbeXc=m2^i=79LT!z%6-J@9YDS^9M$a&L zH7V5A=$WFXP+OyC3!_k5qvfcr(Q_n4p|(c*gi)xi(e<(ui9&6S>WBnEZH?-P1VL?$ zZZ)~2(hJ2A_gh>w1hqAKwK;&=8r^0RwbkJZG#bUYbq%1l#%d`MFI2peWc{yjh{#>G zN`P7tb}QC4m(RKh<&a7cs3oBsQlM8F3FVM-3DlBM4k?#FEeYk2atYLuP!1`VKrIRF zkg5`(mSo}}RzQbTGD#A*k@YmkNz)<4`l|$}B_+3af$6H>|{+r*ydlYDpE( z!daT_5~w9LgLJn`pqA8L9EBd2KrN}+=R$s{OQ4q29Gdar5sW&fm%|^A>|UNC8ZovE`eH7$|2vVfoVF9lG2_!(V#u@Ph9tLf>7h!$#*rfgLX_N5_G{mVF${o z8xDH7`xu@dJ=v+Co83=XPVNxUt?v5ap!4fNx4Se3JPlWap5XFR7Ej~dpr^PDA@&qr z0bO*TO@bc!73eOPn>2Wa*Mxa?xQ&CSiTd5{Q!KxgZR>I0WW8;q4|K03-9h?LH%)pR z>0Wmv>G7l&y4)$z)A?kWr;6Jndb(Z(z1-!tiJqC?f?nyqup0Wa*`8JI?^l7|Ckr!U zwfpT6pt~o4UhBqB20f2`Kg;DSW6!>aK;DPb^95#>Lnq z#PWac`L&~kn^mdcv0keTbe9b_MrT-Dr&~F_|rK#A!QvPf3L_$HNL(*mHXR7ZJ92BcEPXeRT3obC8i zb?8Z0v9qUh5lnD@+U%LU%^2>p>)}B?i@tZueRD17vq}41Zs(jmm$dC(gmp5jHk5W- z*FnC44U4(2c7r~j=OX2P)&%;3%OTGsmaI6@$ZjNE=e}?b5(3f)2!rWuW}lkFf$Y1uup}takHN*t-cC&HgKqG_oJ;10cj7xBfQ_ z1g8y1!aRiL=t^ew_d$S313^padz6~Eu^4_&%XksbG1`eW^%CX8dLac}{JXacH>aVv zjy&aYM*j(e*!TYggV;X>4SfZ_DjwjVQ<%in)}O$Z;D~=uS_L0fTV$-yanN6*bdo%G zBZPwx!`8CJ)JkBu1!CA5gcw#IrU=AvMS#TwtZHjNDBAu2jtlV9xWbig517)|C5Hn0V>omKQWajHp&0!&3e`(rqtuc1W2+#fla6s1;fwMQ!Qatk0{u10lPrhw zF8nmEa8>(6Fy*+y)n&NC0rvu=>R_b1P^xNbV2=+|0`dExq=S)oO0`nihbe&+RnSz1 z7cufk&iLRaL?1(>gOONaDHw_Lz$Qe@#!ZL>gP3k9`~1Nc*?WALVy7AOt%H$Ni)N!# zyX?ahy9`&@F2fbJ^VC-#rr7nQ)rTo|8LqHhhAV8B;R@SjxWaZBuCT4KBI%a0C$MRy zU?k38g)3}ptVp`0>@r+odp*x?DHw@#DHy2+nzIdmD~cc~BkD8!f5$M5DDk)iR4@_; zP2ma$vlk*&;^~4pHJkSzf$30&D;%sp2!$$K;b7xWpssL*g9YjMk=xDzs?+G@w2YU>|Dvtqpo5ydqFxWd6Rd0(s*T;W>56;3N$;f&RXoYpX z-U+!I3Q}k4tDs|{?^8baE6^!yQ;9!eIrJe@cs*HC=*@UJa^R~iHb5@^o2Vd%+d(0P zZLSu`scP$zk`^mcT6^PEhUf6m2XzI2S8e^Iq{vp3DT+2*k0O7Aq!Qrr`Iu4~aQSMG zCBS9UCBS9UCBS9UCBS9UCBS9UCBS9UCBS9UCBS9UCBS9U1AxnygF$z36qlYGX+y8F zCBWsmxCiBa!G2CLnPB8ncvb}9G8rqU0hh`6bNt8%fXig;+|ket7lmXh$B&EvxXhGnP6IBJ$>lWQGMko%`xUYUAms|m8F_wW z1i)o}4U;VaF8>L#92Xs6Eb}5X>NVgp87rp&m&y2Z8gQA6ozsBJWZWD-G6JqLD~#nd z;4+zbJ=|G3A(7L7%S=eZoWS)Az~yCVK*QG%EinPOya`re?p<&ITqbSg_>mC+m)Q?1 zrvaB)DZfQW$|94O$Lt(GG6LW-r&D(hkHQ38W=c1pW{bH09^hYWo^&#BO?GVGv(IY6Py)i3$r8lXXaTa%+8z! zT&CLHISsf>=AL>DxO^$b^Zr~p;BxL!Jf4*Rm+Lj)GH*vuVBT}Yt1Yg$c@4PyIV6o5 zaCs{V^TUr~+y??r06XzV11?jN>W$<+!{5+FMSS#A|0FtMgjidofntA%Kr)d=hC*cw zd0ZkX6BRx;u0Z^}MfmB4=W?uxks(jBier%!t&}R3M{RB{BvnL%BvlnrXBlW!MKp98 zXjn-@(Nv11NIXf9XOi%h>RQ=Y;!))qR2g;oK})s8ZdS{4m;d*u5pB=SULT%3zt#9ku81favC$ycY%*xn4~UkeC(n!>5pBgh36Mmxe-4- z9*z2A7gj95zlpFkl)%4&#GCa~i(6x7EqLaL8lg!~z*PRKK!j{#1JB&DT~UHCnT z{@8`f9S3*_j&&g$Gm;mSx^XnVh9ShqE@_CXt#6S@hPe%_wA5!brjZRFyS$CGM*Xpi z&~#nkV;7<6y1>US-{bkX8-?Rz7t%7=XP3&Fjvaw<4dY{%;~{EffD=A;sVA*Jb`hGc z3w-P%qyE@MP8#p@{6t?oZ zqOl4En~$1v;IL^M1!Mg~)YeuH!jA>AEe;}0q6)-l5M!u6b|ScLaP6B=!flX@NA?cJ zvfSo$fj9t|n8rB!dX2Q2PGuEqKx`$k0>mdIjsTH( z3YAiSEF);z!HvBb!~q~i-VO0vsCj%pB;GCk=ZxI};$$SXe~nsxgydhUh5?VIgII`L z&oRd3(X5{#2?A->gk}g@(Y&$uBKO~rd*Wjt+9yE#4D=kd61rw9`ehc4ab1wVr1P&~ zw~TiGbw%TYD1GHJ44yTrwolg??HMF-gbq_l09KU|61cVYA`;(1;;K^O1xN&fE5v}K zyiAvNhBTEuH~=LZc zdo{~qU%t=@OdBN)oTNrWu7t^QCFmvgZDf{Zt!Pa5FyB{Pp!jbk zerEqQa2XZls{e`?ebv)oUt35$+7V4)6<*(0eMp_nRO$FX*zaS&?zMsK{|AflY%zw) z$bG|s1ISsYz*GK{6>flPJO0Y_VJIF>Dgj}5LI7&Ub8E=yBBT(7r}5MYU{$pMFi&61 zdfqQJemV5b{b0Q9; zm#!+6#A|5J0Z{kDOCXn%8m`uh_58+it7k$NvPr4?)^ z`XH!i`+^y_96A4{n}H=CbDce(egntk2^RhFwxV&M6wSa!P1x zraM@4>^nv8{VChAoaq~`QR|G^e=7@>DY2XtKZA@j7O%#aj?4L&@h8^t2-_lT{8_Mk zwlY_+lo?>h-HM{jn$lqH4;aN|tY#4v?m-$)k=dV*m#SIBYK})vRm~z+b17N5FplPw z-Z@as(S6AM8rZ#z-=dhKSt#c4xaUxCP%0%R;Q=_M_%k1M&tlz&QSCLTsJc&$m+C%@ zb$`jyhln0c_S&E0lt_;kP;mm-aUURWO7#gy&^RZ29^U(2=9za8%KjSZ6Y$sU{{~sq z@Xce{hak7=*F5%X3s^OL`;xtjtPJ12EagqG?HQcj0;>8L1#v2JJ(NBn78pr-WFbZa zUgn9I#jNc}%18qk9jqEKiw&s!MX3R^SmSWAGO&AdU=IYV8nAaCa`%B%1G_g1<-pEH z!7YPlQ@3Ssd|%`kOrv%W8;-wb|3?E&n8qgD#7bm*r*V8A1FOcjNX56owl73pj_(@~ zu+#qKxDX(lq-y4^1%pn5WA7hcj4Ik#;c6(TK|eWJ>T??_{3nW3gWkqIPk0WgGG~Q7 zn5+!?7?yG_*!Ha`Y9{Jhgo3^^=>16AW6(2fKohg>M3Nfx&j%XN#0LBjWvT`=u>rp# zD}&y|LI1}<14j0tlwr@827M$8<)H6I!9D-WpbzCup@G`ZKvNC+LaZ6;yf?53vr(!V z^ac+43b1O>3sl?)w*58a<)H5efed=DG45^17VI(TG%RPoybNx-gm)b@=iJpxnjJ9& zORq-k4=?ZfbBLu^BgjQ_dEc#3SbE)MxM1CUdoOSBFEZzqfV^r~&MRSo)dssu$YH7D z&F(U|uzAmJHVpnM()0LApTCM>-Ha;WFLkYVUL6)p{?ftj(mRsWHt)P7GVvFU%^QP1 z{6(Yl{)qF)Uon5ktkFle^I64E*v!S7Zt3gD(H4J zlT@2P3b_l-vc}G)lzTQ>hfE@=UZ{vd9<#t&b`GQ!G@L92?{x!sKdl?zgWk_c)4GB6 zDm1Md-!7r6wjgmIN>?HJo&NZha;{}7}lal>{( zhCrfb?IhK0i5s?4N0as&(st7EA;^SxHC2bB@KeeJ*8iYRdkiO873CM=hmI0C%x+%? z#^bkoaNhJ)c}rA=Jog7R+MGC~qJ9E|@NN)k65Oz^a-P6U%LgR~@W zIGCae+IKzvm?%EU_Lbs>gXy6VN!)NS!wOa0aIlWFjvEfrPC6rT!_ElODsI?mB3+QUVP_oa;Sx9Oj3?bJal_68HciD1I}>?5jFY%wXA*TL zNZhb9ne-Hi8+O+7lous#*g2PUm&6S_8|R~(*+vzoI7t~%pHbC@;aObbG5&l(<6Ou= z3rXB?DEl~4WeSIKY6|lOO(@UVs^W%2^`uqYaH#PUsH?c)P=Wd?Za6fQG~$M-`VLeg zau}HM5x#Q4ygvbdeAYstS+O;hm5o+nUcaGLRUD^@7y3{%qleu|*MU^g!|r6#Dtg$R zLRv)+yHiQ4=wWvnX%#)}PA9FRhutD+6+P^Bl2*~f?kv(Odf1&qx?lu0q7mWHRxm!x z!qH;%a5&=PB2dx8k;&$M5M_P=Nn{Fk>P8bYDNL})RAH29**>w$Dsi^^{OFqu({cf=DZ7qNUzW;dN^`~ z$$qHl;mDCvsfr$sEHYO?d$vRmM;60QhhHYcR}GORlF}p5!;z&Xr{aMbzG{dp6Ezh* z99b@Ey%IefSs`i*C3-k=oT#bjVMN`qp5+of964UpR!a16R4@cGs zvoph24Uuz%QPIPZK4Db!aAduC1;$oI4@Wjg%XUfhaAb=xyCr%!vK4qteAVEyIO0Bw zYllP+N3J%%gv8HR4Uui;HWXGx|Hwlia09y=e*)awFA;WQdJT3?c z8IH@^X-LR$ype00B_YG{0%^a549AC%wk2dZK6D3YS3-v4veu>~WH>HsZN>;m$Z#Uj z%L*7WoJf*XA;XHs>rspKha_Y;nf?-E#gO4-hJ&I)hLd&D6bTtl%8sCZ2^mi6+ri~< z9VPYcfFZ+4=|)UKhLh5bl!Oc?TUbs;LWYxLN#`YGIN46RAR)s^eLG;ta8ln67&4rk zz*|zQgbXJqQomh7hLiesz>wjjz8x@>FFA!eMF|;BPGzrD$Z)dAZ=O`haB>D|6*8RM zi=&`IhLf`|g4C66VbaQTs1vX zZelnAd`4`z9&)T1IB?-K{I8+BH1N$J_E{I>D8v3U5c)~OPa7o-d^3preC3n=O3{4f zlLo#SVNdw=EdHBjFZF|_&st0hms+5QL zW>n@YpEU5zNb{9X8u(^X2s; zUyh}+TXi~e{^}cO#9RhCm@iPCGC~ic_>}oOmg&k1r{8;B=C~7b^Svt2mMbr&-e(5C zJ8~il`hZp0iBs?i@~0HLs?0x=j$u&Q*bo~PGe4uM+k`HfUohElN0a`R6RoDVd?9yWF4+~B-)vgJr%<8NMK}S z=Zc6hR;C_fYev!MoEX3*pxhp=9=TAHlH{D&n}}rW==8F zVKn}=g-DvJ8^1T7R;Ni$EAu?8adWyb{>(8aL#-%`o%u0~n<0#A)P2il?`6J#E~MX+ zv7ckEM$uWcbRT)>!dgt7eRaXLoFDtCg0st(V(Xy!=7q>$XU^sj9Vm>e3>M-BM0mg; z4Z|Ow#iG-HhN5lGsd@rT=JQLCYo98f9wT!&J3qH-ENCkuZ#uiHW`My0ei@Ws#!r^A zYGc@;?8ba4!{;?#=`uzfxCN3koxjo)@_zAdm(g@HB?mez?z!zn(D=W9SQIb#8r&$^N90gR{eY>9 z*WhKwVGd_o)35OEY6m=Ye~Um-rrt5);5ZTqErpx#vTr<|5|P--cb<=6V~|$7npum) zO-TFpF?c12^8s1E7-IC*zB zPU!I;T#7=+i^lkOc~&Nf+!$+I3C5Db&1|exn-X-$09mSBDXl`4jL}!r_;c9UN+m_j zepOrH6iBP2&~dA<^H{YiVik5BE0JSMq|x+Cw&#f;XJGT~MPnCkJ!b#DNw^85=PKna zoS=~}ULl%eq4_HKQ7>`2J{2VYIrwI2TJ0kveii51la=UEmSh!Y6I^c+152k+@?$CcWx|w zHG6^0Z(Cl_C0$vbAeZxdNI3@O-TSZQaV*b3shj|8^RIMf85_3w1q=h*{H{)56W)W2 zZT@DDnocvZB^?HXEl(nqjgzw`%}(iI8mUuIPTNi`8?#$yLzX={Ym8mX$@+-QW0O^? z1wsjorf;~Ohl6~?_1{o5@)&)y|2?QpkiY?z@?*@uk@6NN9DEBJFM;RP5tV$Oadx`M zd=i@df@&OJU1L!3XMbZ%9%)=C**5R^C0!_?=@VXy6_S5Z$9jx0uR-{o3Z^aLQu8-)aIbuz^b(h7L1Q+7Wf913qAk<@i;LYG zqB$H%Y@XTw1~iAst>L$lV)hJkOe_z-vw3I4yZecEwW4v*zdsHA-`h_h!=zo1%||nh zF}+CPn?+Q@&2KTk#^A;BIG&4#RDn!w$0Nr>HeD(ma!XT5x20IhvyGl}eND;NkMNb+ygMEYFs%VQHK_ zbB)dC6YrM0&r!9UDg}>{`}5b$YNhEDUqDi_#?=+OzFzu_8`&e^SJwDIFy+TVH~LcgxOm#tet_&tQ0Jx7>OT zuh^5I)bc5Eb9rfkHqw0FSqyh+VIgNjOk5=q^C^v)*5G&m_VmF8)vk*qI+5t?i>$if zmZDDFR7#vbm^h|eCze_HO|N44 zr|y(B;C!!v=mT*(iHkry31Z?6AnyNZ(dc8DKM$OqLFNY`dl!k5o&r(%I*1>F7y@E4 z)u#L!T+q;gia)(gM3@v@&WhMK7=#bz1ipjpGM3J12lY zdysGG0?(Y=_Q)xBo3;0;q#y5*#3gQnPI-Qh6s%oF%jG)hgFTZ@LsGv^@}SRXcv&NN zASI%t(w+OYX7j&jzKoP9gPNUhgXe~irGc>SS8YD#yE(_WIz`uPU=+{7xxH{ObLZB3 zuvO|H-|__bSKIK)d9W~}is}CIK_P~kn<5)6Um)$Wdc%0Hl(tJwLz~ey8z-oB zEb3f^@&2Z)jve4xTuoj1ph$6@yO1_Q$vG^YpMjrP#vADToI$>2IC!>q$sT3#v~;#3 zX?3}(9*qkJRRLxNA=`4>pm3mT3z5dIJy=R(e^==Yua<-|?NsA8Anko6m&R`g|F=PY z%oE@_@dnRF@o_vnJco0V!pSkW*h_G|O?nx!ci%9Ku2RC3w;=f&BrPvP^|}#o@B5ZA~@_c2!@bw7Li^|)tpQ2X2SxRISgYjr>SpO#^) z!_dx_yU~7fH!}Bc#+`G2NxKng#@KDFU}FH|gD6M~)5i#+y(TeK=52qO77sSw#t{ zXngbK$dn$eD6fhfdnXI?$xC;$2B)o^t?&hwq8Gy@hNUt_37r*OARCE$a@|Hs~&$460R?c-J59n$IQba%+oNmtV8gsKp-kcB`N z0(2m(0)`y{6(J~_3W5&f3W|yjjxaKU8Z;=5sHivt${->tqqxkB3o4Eqiu<7BHZC(R zzvnr(I%((iec$iz``7mm`OuZ;o^$TGOWnG4>z=A}o)^{t38sEXaQ&B;LG}fOH{A#P zqK|!6zlZ(zlHd^o&N&5-z@Li{ZZvf)rBGNqHpgLIMY4l8_y+0MLLd9}C7gwF*>o!O zadYRNNLSuTrA0pO{8YY*v9ll9neijkl@}xj+hNdT+3<qWavjTa!?$yffS`W@OqVQ`F54n)+ zI3FXfTn5WEX&fwfBabTJ8Y!UnYpA^J$^BMzE=9URo}jOnU69R^)^wG6jMB0jaf6i8 z^L0qmcbKlyHqwnOa`%mKZ3Wg(`rT|>e4C&1!0L~(e-Hay=6v%b`e8{7V^|6Qo3K`BQ zwSIu)=e$8{L5L&QBP{t56!AY08r6vo|;s(f%b zgS_En!3)gS2Yba;g6BkRG)2cX6#w)3l39AbbU9 zfqRAd37EC}!Ca5FaU7frp{lK@8VMU94WcxrYCDL00NJL9GA{Rm##`Y-iiX&sXuei; z0AzO7^GTwILF4AYM_n{_igyqmVNg6rzScW&W~*XOjj|L;%Blm6N=qHuFHle`Xzbr+ zp~U5Nx;ABA4s);m-~e1vI})(pMs~$|)n{{{Rr+kbw4lE< zUh#Nizb2L2yY+Hg+K|dy-GEaxeUs!JfPPS@{(Vk42`bxvowQ%;cQU7rD{$)b?w zO37XSIM+mLQ%O||4z8$W!C`4-`*{xD>cP|c%pJIZQ<3cWxC$3Ad;hH-JX!v?(EEjK z%iHp%Z-s^b~k9Jg4whkU_HP(n(PI;*T>PJaj+=f(8bcKrh~?_H8x4b3eec` z3%Y3N>lF6@H_Ke-FfaQt^R@~yI~-B~lQ}7Fm2EGWtk|<%Os)0^XdH=b z*9vqy2FX2fja#hWc1dw`_t$E_03#uaF3<*9JJi16<2*|z;4Ia!H|GHiCs+#54$#O; zs133q6X&h1#~g^uCG-n0YiEIxbP3gzBF$TTRUH5?hsz)?*HXNPTo1T0j|Gc0xuKhd zCv*_Gl-kuzWW`}CS?!2BTAUia4{9lEG_A+K6E(V;HTnV!RU=%$lUb--+ZvkBm0t*h zJ)x;;xuU0G= zXA5!mYa2lRJ#wHDftvNBdfHT-9 z{;SGzz}tz!d2?*VCCJ{@`n|CZ-Sb0AKVbbToK3my{gA?232$Y(Oycz)^3D@dShmVD z6qZ|H&mOl@8aKvFx#f(W3_WU{Q7dBF=nF|nV^PCYMp+BDig>-OCl$uxT^{b{3I~Ji z4(3_s(Yf8v+vGYAw+^`OS?7_p_VAalhQuWv{c%U)5|PmQjbhF-J<_nF4)08dSN9w6 zS{2V%qcpb)Pc|Y(2uB-ku+<;9^}&wF2W}QV0H#x2BznhLw#!34UQzfGXHGT=jz?PF z*n%m(-yoLtoLlO_tsb`GIZ;%<rW?sL9jOd9Ol_Bd2V#FY?mxr+2w53 zt-@M?HB>&&TL*U;8=&`A5xN^Ayn7HVo&V!TvXO1lyhleA)us6U=^3*?N9sDGvn z)~7|1ss5#Ij2e&po`c{#{Qzp_M_TWg0i|P~MzYH&wskg!hBo|HzXAIk-F-F$`o9vF z1PAd1ZDI!2_puuHB#z<@U7D_kVAElc4x;b1Nt~LV-V)c)uPEk8G8;hp0L<27phHkm z%0B|qCUMx8-i);|%FsJ%`-A%hNYlY>{vP0ZfPn||u<|BZ(71P@wUO6EGcq0lPoLr` zVa_mUe_{p_n~RV-id0KEfExRa9QMrhHFNdwtf)h-*`VnkBNvIy3y~^Bs`(s%=>Rp0 zA%Bn)kyf=9khiY2$cGWZXV#id&}3fQ0q{JSRbK#bee-~lQblt%T><9UTNLx~PcavR zN&UyV^;fNMXc}6`GO1*(L(6h#s7Gz5qu413HS;HOqMtbwvoMxdYV7Cdkgw@UkXE39 zO@{!k1!&}m%!g1eS2n+J@1oSdLEA~GPXP`Bv{pl+0&1H1IQ=dtRii-Rmdq_l)tLoa z;x>)yA>VvZEC4C*8>(at{Qn?x64yJQKwtwBddKns;BE)05Zspg0QAX&a&L{xGy2>F za}t=X3F^3yQTXH!V`u^7Fjh2uuD9vmNH3*Wg4oidD6v~w+X_Lx{=i<9ovIY~rgUBf z_*dHwX7bj=BrZnYza3W$xOxY#nqcZVcMeSavEY`iN z9Bs<_-=Nd*OI_rix(B0;zqH;{CxgUae#Vr<7m2A0-BT-1#&a5eX@jODzBf$S#$7W~rsP2p=E{G~3}r_wbre`&c>6JI!{nNz;M3g5BfmvX&( zDxC!L7mZCzz^S2&u_D7SZP?Te*I;_YFRf_m-m5i@zcg#=bo}8jc=gma)SSQko>Pb6 z4}XR6sbj(9FF#Yl#CWu}EqG^6f7XLbq%W=tetC9;w^IDeJmIIjNd82$+7y2q#8cF_ zkIA7>-2Q4X-0F)(m-=GyJW|wWkZ$$8qg#Ey*yHR5&0WY0sq1j)ady92%`K5kBwDSz zJ6f$860J5hDO#;JeW{MV=Zel7pn`<2$SXnqzl&Duz3&F(6s(9_2sbdm4irMc$ZXsK`I8_{}`>-*B!0amlUnmmmICu=R~VDx}((^m)_A;m~ojD zrm1MPMt8JYL&YtTXthRxsu90GG*sLYiB@YAvetfyR%^tFm4iq_#VwI&wT6mYBGGD% zQp)5@v|2;OEsOSD=;`KXs@ zwZNQzc#T>ga{GqEPuA7RdZ$o)6bYK^35wf^pCwf>}Nwf>}Nwf>}Nwf>}N zwf>}Nwf>}Nwf>}Nwf>}Nwf>}Nwf^L2wdukCh*q1P6s>V@%%o_wnMu)VGn1m#W;zq^I#eao znRxl7U#1EU61<-{DOzo&3Jwzd2+N|(q-eF7b!?IqeEPSbI}lo-7wfSg zgM(xyMXSwBidLJcf`eq^OTWydXtkM1(P}fNvMFnV3=Wd1f`bGZ93)c(2MIDbNTv!7 z5@c|YOcfj?XcH$ztIhoX6|FY&KcdyTemYvMD=AtnoH_CmkZ858q-eFSq-eES5{Tj_ zqSeBg;}br-bj|Oe;mnau)+AbOc5<}Z>_i|66|EKl+`6LG!kJ?mGfA{sICG>1k3_4@ z{vV^&W+z3f&BT;e)C&fspxC*J4k*eS% zV15Rp(tgOkfW-HxVik857hq?xNB#+mjB9(5LGLI=f!q_fC+)rb`Z2D zz%1Jfa15ZP0uptqhAHm32hm?DXKNy7RR2vPr{{AgXK#R-w&a}WOU}Nzpv9q$0Z-7_ z6!#R+ReNii9iGq^chPZzo<{4(A{RYR%6U7E+WNi?@^p}Cz(6Lwnu>7pz5tzt1keUi zCgL^h5^50*pTESGG`z^J%g}X>(Z-jblmtGa)SASVVU|qs+CU5Y2D+MYbq>)+>2XD9 z8dn0QM@`4g#gu%$jXin`1P6(rqz8-K3uFyhj`R1TO#1OuWH2k;13yGXTpL7-n`5fc zzDx*@L%xxf0h1NeS`vFXu0`$^#apm>A%!Jx#@jNFCXQPD)H+@K@OhdahH#b^RP7pOQAK+=| zRP+E&kb7z&(hDx36!%naL!R$I~P&PP*?5muJ#hT_Z zM(4q6)JY5<={1JGisQ+|e&aOa*~B5^55%X;g?yIr)Zc*Td!O&7N{ znqkjDrUDl3#2-nIFZ1SlmDpWg3j$%sY^{*cM8A}lT^5kl!vgvI?cy61;P8ke|oZ^cgYi6g0Ch8CeC zDa5Q`!V{q*sf@vr@J4RK$wABta{LjD8Z9F(iBQCeSwT)#=1ra)uLd*&#qLFi{dW0kjBSR@RQfJj-8owOS<^f8t7sBfXMMvp(qCt5> zjz<|8WAxA23Jz4ntl){$@|~C!On4$EFw0oscq2~C3Ud4rCuRi`p~znzhS+$iL{@}v z)jNsod~B^aI49!7tYEdmn(4%>Sc(cDDjw`gj9EdyJ`p;SLd**B@e^@kR-T#H^s${D>2?f?|s!PRt65Er~cWD=4-+;>4_=*b3=`v!$oc&z~nT zE7)rrB2LT-CN@R>2_=YG!9+*IiCOUu5}lEY+353xvo+$xtf1Jo$fwM6p>VcGoR}5l z?1;R?(YI1KJM*2G74-eIJL1HwV9oYM9$o^m_0l){^PQL#oWdA}mObwE@G3Q(m=!;O z5_Mu$+{kH#JERW-;I45W{x~r!NO59I5cV;_n3lYYi z&9aES24l}=*~ET>+e=v`HgL$`_EMJ2YPkltm$GD5%h!Cey_B6pH$w(rqsWD3a+eDe;A16-Vr1Tm;Zi%1UZ%@o;!ajef2 zktiKW>9Z8Rm-s}%5-TKZR6v20cn$KY

    =|<$Cl3Ajs^Po1(J`@WO-(C%1~o>L^v#nuLRSe(%7#tcTD&ozsBzhfRlw9(U9p>!ANQF@b#1Qh0;Q>3Ts@5mFSH>pUb!t^E;$rgoC zdXtLeyDny&` zjkxZtPx;7b9mY|&P77n%Z0+p{rWL^hi^qCA1Ea}040;di-7GxSStsT2=!1;c>deJx zwALVRnpK^LQDaTR(Xb97uivVMjNjS_`E+Y;6uo3^0wrk8g`TKYfxLy*C!oZvanN66 z<=|LsO#;1_rPe4M`&hdRc%;vRGOHHca_cy>t-^W- z&8oC61--9zA?j0Q@xA71>jhA1EIPWcwRYjy&$u;?FWq@@dmI?LNN61xg zxlwMTMIY!*)*#fR*;<7f#;qK1TdaMMY_ooeawk|hsL4d@dC(_WHt3Trz7apex)bv4 z)?u{q3~L;;ooVq){v}o?xJ#|yBJWvNPt@Uj+o86)a;oCMtGImA+48IDCkHYsw^9uQWF z@@4i%3cMA^qHaBxFC}wZaMWB{!3{1H@VSsmy0Q7pO!0tWNxgerBXCiI&MOw4C z*QHxaq0*)KmVSvTFIvow_Ai?EOD)>#X~?J=MJ?9bW2^}vBCY)-^~(An+IueOel=B+ zoWVTmzzwm)^E8#Zd!v5QQWo!F;1J(0QF{n2h*Ha3Clzq@v@YoR$>_pBG*^o@NJ^!H)!1pZpf;Jh77B2GPV$`Avk7QkAae99R)Yr`okpL(5>0P zVe3)k%C*+D;kISni?SltbYRn3g=4;TAtVc|8qlLw`xMSGouJ38!zi)H`VF|n*8cIF zW6pw%WkpbmZP_@MSW{8M-qs2nORZeU^syd7P0B3Bd?>dTB5#Ft0dS@D9B^N2##GKO z*FbZ%bp>+OSZAV!wbmj~`dJx}sk7p!ZGS5Tcz~6Sy!BQ-WE!knaK!8aZj&_}r4O`9 zz-_ktsMR3r2b4b8Iv&R%))UYcx0XS&#d;HxL#>m5hglb*Zmp%?K=VbK@A)H0c=vpm zg`Sojtp_+PHUENk&Aa!+o;Xv+yO8%jxFZ`!W1;0Yi#U zAkH$DVK2IP263*Om*Sbk`Ep*0XA#GYiPu8UiT9vX%ZR)Sd=jxbN5vY8IbDTqozNcn)!coUh`!#LaTPiraa<)W&4-Jf5#s^vr!|smwbpB!k@xVkfZs zl8w0PQuhOTJ&)nohpJN2MxtH;xeZLmKzHEtyfzi}rP+W%5qJYvvIFh0UGS9{U`Pah zhcn_pgD^v=7#8XwW>athE(a@Ds25PLg0<|2JfS`{1~4MuE^I!@p`!tsPM;pMQRoRktz9c~|`8g39B&wy8X2xl79FF_gdIVQ@nU~j~# z<1sMB5X8J%^>mPL23f25l4_1~b3o{|UvEHSge3YElhIG`j=gd0uCk0mEI;ZPTgo*+ zIQ@5nbr%#tw_byZ_Is9JrquO&>$gbsl0*mOaP33IxlmDmG#^VTN2|+rH~fI~Y}B{m z3xE{>joZL|LMe86Z$Zuh1yuc>EYkI+R3=`QM8B6=(`NOBDbptntx4kmr&n-Ag*3I?`Y~E^-FmWZT^%!w?ps_NHjN7(qNpu3sco+YjtOqA zVy6WJuRy(HQr3{Cnm~P5kAKAaKgj{O68cqBAA$ZBKEb=5w!yd?>W41STz{q1Ye@9% zfanpl=tc;_44UHJdkPxfcPq#uWJ2um2Ls)_c0)Ahu7aT6`}%Wj!-2fw~I( z#aA=P+PDTuKG(=q*bG;RG~qU(?jG-(jTY>Yeb^6c&qr<5$+!TyMqEI3YpD+BVq^nT zb4O-Sa?Z$R{yAmj9sDzU*eE{XKO0NxMa0tXmF1oxt8(2f9l(pa2V zH8jR^ju?f;I!R7TZC%OZdHHkFXodp4gZ`r$-$pVRmGkKG?#G8!MHq%(fEX89#S!f zJj1{i^Khzo>vPP*$#3O*e&P8G*2m&$$R~t{yeuXWo{2}F)#-8Cd}#Ds%?!7dAU*$FmOuk`j|GXcD;i_pb z06Dg7U+76Blr7sx$5*|o?M8qdq-@znFbXnO;71@CqE4nW2;>0OJ`e)TT!kO@3M~8) zTefi@DX?YxGcN-WTed%oblYkEjy5110k_x2XdI#5ekct*s=q;6hT#AL18U`*{o{9mK`upWht~}2l82qK(i<#F|*N5gLi@P!?^3Mv`$B0art4Bu@9rqK(i<974*XjnGKsD2p~i zBXQzW7Hxz^qL{L1BQz4lltmk%ktn7t+6awAF=f$4Xe5d$i#9?dQA}C15gLhN%A$?X zNEA~RZG=Xmm{_zC8i_qE7Hxz^Vgr;#8_|%MP!??`p)A@6jl|hpS+o%viDJs4jnGI; zD2p~iBQc>Y+6axrgtBNOG!hfaqKz;oL(!kgqK(i7 zvTG|$yEe;LcI~iv4<7Pq*AC~iYm{9(Tp(2uyLLFrrIlCg+F@rBrd>PiOv1Elhou?H zt{s+UD7$vJih7h?JKT?0*|o!U#LBK6b|zukwZqON%m=@418)S%t{rZqys~SDok^H> z?XWWm)2Wd?y!E0 zB3rn8m?O)+GaU#HmHNg#<5t| zi7jAeFgvKVz`drCz@ecQj$+tGn54NNdp#p@l+OPpfOD4@!#2Vs^#n-_+X#~+*a?#) z_)VM{gh}Ff62msaBoWIg_)|icW7tNRq+QfS!#2VsEg*KnBnf^HGZVrjiC!AE5hh76 z4ciEl#O4NgD8SVsb#x5d2$Pf!k{GrTCW#_q*hZKnp0mIn93~|4z_8syVH&m(CW&-0 zY$HsP;P2372$RI6u^6@yCP}apCW#8gu#GTDwK%b2*hZM7BcwZFl87z%|Is`gjR=!; z1clfSaCWjQp;x#2qSsvZKoHObCrr|P5GoPFHgoCC$7euX4BNICwrw$N+hW+Z#jtIQ zVcQnNwk?KjTMXN_7`AOOY};bkw#Be*i(%Uq!?rDkZCec6wivc;F>Kpn*tW&6ZHr;s z7Q?nJhHYC6+qM|CZ82=yV%WCDux;Kpn*tW&6ZHr;s z7Q?nJhHYC6+qM|CZ82=yV%WCDux*QB+ZMyNErxA-We#>EZ82=yV%WCDux*QB+ZMyN zErxAd4BNICwrw$N+hW+Z#jtIQVcQnNwk?KjTMXN_7`AOOY}-dr)(Tq;+qM|CZ82=y zV%WCDux*QB+ZMyNErxBIrqNq$F>Kpn*tW&6ZHr;s7Q?nJhHYC6+qM|CZ82=yV%WCD zux*QB+ZMyNErxAd4BNICwrw$N+hW+Z#jtJPf^%`dErxAd4BNJ2*yeOR1C_$FnX+DU zpp}Tdl!Ln<5Xr>A6MLyG_EKByrMB2h?JLG%SlePRwZ&d)i@ntT0CcY{_EKByrMB2h zZLycyVlTDDUTTZI)E0ZGE%s7d?4`EYOKq{2+F~!Y#a?QQz0?+asV(+WTkNH_*h_7( zm)c@4wZ&d)i@nqqd#Nq2eing?VX2{ ztE{GJ5AMU3hq9Wc?c?o1SxwU(B34$@wEe`&YMS;iv9g+`JwmLkrfH87E30YR0b*q} zP5TqEvdE=9#-XIFrfH88E30YRL1JY!O?!e^SxwWPV(`p*sE7-R)jy4who6tP5nifhR72IC$1EVlBoXz$W$&sC;tfsMI?f{9^ zG}eo^MP)UOS=+FasjQ|kn=343HI0=J(`q^a*_72ZZPg#Cf>zVCi}}Q$tfpy~u(sH< z*&szyMp;c`lc-zHQEalv^Bl#dsB=WCX>2O{P+3i5(}?C4!j$$XPb406YY_>W_J68gqqRtVm+_5=wj>Kvj zn@g;$rm=ROFSP|0o5%A-tLXu>RMs9WB!k@x;@!Y0Z^dE0Ue94!I=2O6&7~FH@Fh6% zZcI@JHK@)j>LeNO##Donh8edH*KqP~jO$`#E!y%I@B{VW7J`dsmMr{{cVmjSlOpfN z6y4PX==D%RiM$)bdunmcT%>JzH^!ECW9+3+nRqv*xVRH+c{irGSNG{GwpefVZcMSg zk9x(rU)-Dhfp=s0hvW?AQHMB_q@xa0>f*aG#icCXa{veRZcK4qMi|ZJyD`Q6d4E-V zTEzocS@mvAaXqnmH>P+<95P++#xSpx-2{*!2dO}E*?&b@UQa#*Quf8sd5;}pWt0tj z7N}m&930D7Q{TR!P;Onm2?W{svesM*vSu&_o^=JW$M`B6_)220=G%(C^IFe7$PDLi z1>?D-49`mj&37HNhOB@5i$agbF%CabLY`LOPesUh12WcU#9reNlv4=;gCe{PL8$OEZ8AQdvr#^_qm z>)CU0&G#Z&@Qi&fYiICN0Q)>EB!0tEaTo5 z;A@FE`C*`U8>!oah{D8@?}_8Zi*-00O4_)XGR7;U5+oI^ zWL6sm?6;4O172fnqWs4Tf!7)}EcYM8>x{30z@HFrFcz?GpRNYpWIRj!8F7bk2lanW z+-W?03_8EN4tT3k&A$4c`nN?kv;IDvm&5kRL3WT|9vSyW)*L}1ARA2kBO93|q;Ex@ z1Nkx-vvfYD9gG~$&d!lMPvgqusPDzGmcauEyoS7E_ZYAw_xdiGQD|2N8=4`sjbK1fdc?y^-0L|bk?FDj zE)y9LTp;3HmP;9b|FJle5Sl8@crGE7jZva1+g%6JAjzjeuji|TB*(jw?5Z-@MWFWL z@DvsZabPK)<2^}Uh7Z;@2{wm%Hyat3Bsd)S32j#b7jBNTA~yjRxk^rR{{p*fYtw4kuzAyOWjA2O1TWUcO}Pj zfMYpSC{JzsP;l?QDM+LoxgO2W<4jR_>n5amD2m-KWPrz%uRk@e-r(y`Wh2r{__KL+oUPI|t9F^Hj2gQaLMX39VojunQQ>&2Y1SOVciV6SHYjwyFshbrX>d>1X~ z6A^e4+S#X%z_%z+Ch%HP%LRT$YK6cZq*e;tPuQ2xt-Ef+dIYQ-oiw@*_i{)XV^1Vd|^1a3K zT%q#4MF;Y|#qvC%^1a3Kh(Nx#SY9BI?=3oz?=6-$2=#vU!$5&|5snsEPB=#3TvlhS zz`>-B6F84>JfUkqZw#!4W({z*4cPd1!XT+l0^ha(2XYMgX7<8mS}|f4{up;tVk9Lr zgFyl-MjZk48V`b5F`C$K6#N2s3~@-l;I251I7{>WfRaipHZxj~ELf(6{nf^&_LxEWU5LLAe46Co6;_`^`t*H{SAik(k_p&9R% z0PorX=<>Ip@=LAaK4Q0VJC)u~>@lul({~f67`|1&e3p_we~kt1Me#uirYQDQu8k$!*~yjsck zkd)2aipQ@7v@bv@nw8Ge@Y? zxS#ZAiTzsM7>rm?Wt#27^PH2i&RBdO+n`30ex7}Lz97fjRej&-ou4gX)guFiw>0O{VQP0I0s9g z%F;c+rN)tIz~wIkR~X-uUhy$-wE>$m;*V68v7*mWrr%iL2ICKu>AwiL*(jY3Tu=G9 z(Tn;Uh+7Rm>5asrjEiRg5Bx3U#~S6-Gx(3dZN|;i-*OmuvT+6FhkXS+U9P3d;k+bg z8IMwCL{2%MaWvx5!-3n4MbtTNA@F=-Kg(@f4ZPTxegg2M-vci(YS|CdUISikTzNA3 zVTNA8XPoC){}Wla^NrhBpOZ|`R~kpCe|9zSYGXQep2GfIV}xb`&zS-GT4M{#op&Md zI^#3uU9cH=gYhxtmp%o&$;c)BY__q(_>A%^{tbGk@iOuGC6#=}>A`wlGzEB@F`4q0 zu#MY|(^-d07lFRRIE^xwuL9m_)Uys({0?}xF`F{KdKh@G@fh23)vLh!4UUA$t6xOF z(MHX&?2BR?wN-BB08_)|Mm1bKCnDQTc3%#c7dY0oGy&%uk8r%-d;)OHxPW-;GGNQ- zP5Iw#1THm>aqQoDFK~tNHH+N-H{fc+Px?LI0M{9x;-aejeKD?y24e&D?5YQDHtyjV zzkeEV+&Giv?qPLXjd!T$0pd{x=fujr#ADHncQMkVO;BB7>73D{y&ziATVZhkX&*HN|FhwGOstzw7m*tX?8OT(Cuf@ z0+$wg4W zhYyq)-AIzO9zYRqO z0Q_FO=9N{GEM)&8k)1O@x4koCmtyw=RdoW{qF8jY?#Mkc!M>Vo7L*}KdMi-^PKejD zG$F~WN0lRzqRo-KAtA$=<3D7e;-LhalSu||8LBX+eXl3jyxtT?lsoM266_&l^WK&u zBd3B46hp<>1Vlm_-rl86P(ldf)9X1dA;c-FTOBw{5*$ug8N*{ZNQHR^Q!SIebhI%( zkrehUrA1I`#3YoxggME z_6T%A*)0j_fBaZllFk@p&>?(kjuYzjJe!b@VBS>P1v#QIQ1NCCMuOL)14~yNPtl(m z4`e`)E%bUS65^b}Wu#YwIx|7#TrQ0zb!mdynV_n^WD;!IZ}MD@L@!SDNqyv;rR`*K z=1&?avNz!MJPvBfCd_tfcDp78ld?TbX1CtB&UAYLde52N^1#cGLm?0f=Cal6;W`s8 z6hM;Z^Y$Q8AeJYHyia7*a}daZO2CdM*t~UQ&@h_FcyfZn8;NSHj3YKxW<2EnWkQBG z7$xIenwt|G-fl8Dh}E^kxlv7;&IECPLhu_3$|cezjS`L|*t|U@={bVhs{$Q8KO_Ws z@5*paODS+K-oP^6V%K+HRZgZsVEGOd;W?o4nTvsq1?{-yJ;(cvGD=iFPsxy$_Z%*A zf8`SWen>?kgK^Vas^3)uu}Buy{gun~KO^CZ9EGmRb7Y^>t9hu>E62PEP+3|zUZ04S zp~`=}NNJH_vys0|e;Eu<R6 zX6qH;u(Kg0^2 zk3{7N9X10bB;!a)cp`ktsT?Hy8MADq;>#$Lf#6)?ZzN>c_-+~KaDyPZ*?8fASdbvH6S~D^w18ckV6$5k z+nMGjfZ+AaMQM3&bFopmNWTuG$T$B)V;0LZ2s}`*YfjfWb34~0hd~CPDCC|14a_99 zdc2E61kO_Y@p}G%W8P4d;IF($_ri!0`5Sw6m0l05sWZJ=pMZoXaw9pH>5GuSfO;M| zMRPgQ8FHv0>bk6|~T>#8W*k+K^Zs$xGtEaf2jsj5ieXQUPjJh>3iT8Ap6 z9E^3riwWhEjg;}-u#$S)xJgvQ4;n`>w6oXqih*y#j^N-Lo8m5o8`Z!BY|K@HCkw|s zt>3Zh!Tj1)01~3!yx6MMop=K%e|2Z=k7G1qM(wy3y#D(_LM8t0bEFq-l=Ny`@X;@@ zkc>h6+0`? zDpiWiCJ<3DD)BaDI+46VWFo9&zQ}CrlJV9-W(ShDiOlb)=VP&t>;|!2^z4RA6Aycx zY_3oBfz!Oqob)7#3NvOkslukUIF3e<3Stp1;8+Xi2wuN zhr~mY9c|x&?5N6N(4GQqz}EmT0o;we(mBuneHaVU<649Fp}2MwJZ;bw*uQigmHO(9 zPqCvOmqb1!Vi3?fwEj?5isZ-0@MS{T4wlwX4f4N4&t7Joqx1|eVJDpED1C;BDUuiq z@hnj~A4-ROJ^)WsAW0*q>&-!ET8MTvdjKv57&sl=aD&v}<=u*$jVoE-!J=(;m$n&s;~vSE_dWCD$Wyf^^y})R(7Q?-)y$uXC{&X0W&9*y*#Z5W`Xc(iT6U%g`so}WsvKc#0A=_mBQnnF2`gSiKf`K574 z?geKhetj5cr4Jnpjkj8nnuMqG(l!Vj1aqSZV5?;^cv{(XkZ%JCPaM^_EXqG>g4#5e z&421Cx8msqn#N!5c2`AGXcO&;-h8P0;-0RDy7e9Ep>7HG-}rCmIX~qv2EJ9`8v+qo zQ!mDIyN6LkQvbW)tv_}XqoRnM2hBhB4U-hS)l*mvcIrADBzUW*J9w+7J9w){BCvHi zc{xOl|22546Xe7ImcK$8%!Jx)6b zFcq)&B^)TI$329A^AWTnsAWZ*J;Mer*zd$HkMdn~$_0*W26!4NDBNKNDBNKNDBNKh*4ezehm~6XG!4KKvLk>K+*$Y zASv)`ASv)`z==PoB6Cnrg#>;LG_Y#bK^2*Uqk4b@ehoBHra=O~1_ly0OW@bQDxO^x z_%(1bacfXT=BS1qC-5tw^e6(q2GEu9L>iaCt4If~V5bFsQHuE`80`dCMsu)Gjphm1 zKnlhJng_ z16%^f;g8qDJr;aC1ne5b!upaNkVqk+#@TqV3NlhisA(yn7G$K5&_H5OkdZ<{&BWdy zBZY(p5&MIT6cQRt910#Bj^hyGtRN$WgyO`xK}HG*4I|DEGEzur1aU0LNFkxo#4w*- zj>|D4xCjYYBv?V^S7i`-I^y9})AK632R?irIUU%XKMixYIR)5djt6#|4*+}2V^d+G zFq=T>VHV(+YF2{oH8+EvW@duoGq(X7<_kFb%`3r8Hy;NMm>YqE<{yAV<{LO>n6n_? z(<}l#(;SFnmU%9Y+2(`b=9p&yhs|FD=bCeX^AZ)k_Yf=kY$q#v-xgMM6mAwS^M;#P z(UWduMK1+C#r*STR`gTgRC7Ayz2(yJRG*TLo^4c@W1QW&=SqzJz1YoC2AUSqPkA{(Cs9y9+Xz=8HIHnOEbOZQc)Vj(Gu&VbcfsT=PmC z^UM=KiI^?Grg;@`zWF8O3(O~RjG8xtQfR&p9MkgEP$|*hNQH3OrEJq!9CfqzYPP8! z*lnia=rO+oCB@7J?x7V(FdDe-xxx#T3`PUjJsf*lG#6_Hxb9)X6J_88xb9)X8)d)2 zbq^E%C?-k`u6vjWMH!3+u6vlsiZU1tT=y`M8)YyWxbEQ%GC#^-G;rO+L_zc~%rjgP z(I|t_z;zEfg;55hf$JVtEvETNyACjCKT0gr3b_XY*F9`-D(M9hkp}*IDp1!bCuq3r z;e@5d7?H+Fc%qC*1D8GIc%zI+<0Sl1Mx=rN9&$p_zdVe@c&SNNl%JtFiR>66(l|IL z${-Z*-^03vwL(Uuf&ZR6P@AG}L2B3WF6C2bMf50A@ZUqMMax*|i8?Foi83M${P)Pr z8U>gBdmhK1QPElKn7LTm;f=T`j1?OE_mI;Toy3F_@HondH1OX;vFXuTcC!=kILe4L z@ZZBZadwmuY2d$yV(n2zq=Ek)YMUQrL>l<-q1fW+m8{#DBDN&Th&1ruL$T#iMx=rN z9*V7yJ~&%?`urFo(!hTY8?YhDh%|87!^EcOKXG&t9Z^Q4f&U)P+MQ8Gq=Ek)ifxT@ zriT9>CbmUCWu6Nqu|4`3n|6^Tc0?JG2L5{}wll_vH1OZ^EChB(8IcAqKv=WAQGQ|w z|2<6XkMYh8|2@2Q^W8}HI9^mid4-Hf1OGh@P+HuN)7>WhB`E840P~8vmU_AJ3|vJ8 zAi#OX7G6u|W1?}HHJ!MYU~xx9EJ$EoMM2M3=&Z~LDV~MMl9fsrkk~cZ{!ZW^W7lLS zg+|Vnn8F@}NnQ+x=Jm+r4W2`pq|nIOC0BqRlF-Q6NuiOme-s)yC+ANrfU#?G!h~4O ztiq)t*uz^N>vGyA^hwy9gJ%J5nS}G%eOmB=Z5X@-EZ!4j?3!>=XymZ7G*Lc&C=&`Q zA3wxd5*j%y&BzVbq3YqJ(8%GW(8%GW(8ytDX`+1mP)|ir`S{rdtU@D)8%eK|(8ytD zX`+1mklq|rK7NSf5*j%?h^=Z3u3;VGc;QwX6=dw1a0{^tjT|1zUQnTt!=q+{uC`3V zqj^!x3Nm(0xH~j*__))dvOUPyHQ}+#faeEaBc94)RcPe!G~%@q8aaFd@j3~O9G*eE zK|&*kXA*Cc(8%F-R;MG#X(K#u2&&VGlk*h*`c&+i`6xymYImi0N7}W7ojP&rK9@eEd+Pn6Yc%<43ULPO8(DL^LnD8Qe2Fa+ zn?8ORo>k^i`1oNHv?x8_!p9F2o+xA2z{d|SG_O`5v1{PtXBIQvgzF7He#lajFMRx{ zOpcEqN?|q5A{PTnLsPY4DuIt57VNnK7ic6yD#|-Zq^H2!(Z)!oK;`2{pz`q}@Ie$E z$q~rV$dNFi3XN=*y$;0^8rdwTPSins{FHnFy819ts$6^+*9E-!;A;m+ybY#wa}JVH z(-f`PL}qyN`4f1>3{wMdK7v0+@#eP*JKlUaa*7$I2Ht##<@C-;=o+FGGfWM<`Ah_< z*zxAmgV^!rBiQlgBV{<=d;~k*eAqBQ4|@`N-I&(c3ZLr^>iQ1732#0WDQ1`&c=KUX z{jlO{A1CspXsNGL*zx8=dNH?5;LS(ycWhiw7at9a8Kwr_d<5TtNz_!Kk&79o2Ht$$ zVWUT|P!$@v*zxAW$+SB(GQ9a*5Q2<&^D#N0>ZW+}F$Y2pO>n&VOoC8v@#Z7X-p$8) zBGae&kTJ!Zk15`KO!4MpiZ>rqy!n`i!(6zDHy=~H`ItUr^_rczT)wS=1}x(8xQG*P zKBjo{F{>ftH^rNeDc*cc@#bTSHy=~H`Iw(TCT5B^A5*;fnBvXH6mLGJc=IvEn~y2p zd`$7?V~#?JeazhjJc>6TQ@r_@;?2htZ$74Y^D)Jnk15`KO!4Mp4$6Y<-V|>>rg-x) z#hZ^Q-h9jpBQVdK;?2htZ$9SA9K4@niZ>rqy!n{o&Bxpa$u?8G`IzF(#}scqrg-x) z#hZ^Q-h52)=3|OCA5*;fnBvXH6mLGJc=IvEn~!+}Wvwv9n~y2pd`$7?V~RH)vlZ># zXo@!rqy!n{o&BqjPKIRtaxziMHKBjo{ zF~ysYDc*d{57Dk2rg-x)#hZ^Q-h52)=3|OCA5*;fnBvXH6mLGJc=IupH=km@ke|N? zb0`Kcqe|pIpfLTTson&(FwA7bsQ7fR(T=bU}2rpMeYuwoJAi`AN)!#!Q(vwmuTqwqe@RJB}9cJrGuVri;}+`~}idbtU-~(^7qv z&iNbt0UmS}dZ*Q%vevs`SIYrUs>a&{8eTk|H{c9M$)PekUL2s`m) z7pr(1(zSfQN}nytejxu<%B%E)U*ffvd1sxa=})<4KOWcWatpB{Lf`iPCmX#?l(^Q< z8t?&>zyBCEX2I9bcEwPGdg6xLY!GHN9s}<_K3~7hn=VJ;eq#BefK%fg=I5uK^|j^dUGIU<$z^fK>p^zW^9`2@Vf1bu~cq4J6%$ z!)qW7+SLmeG+KjOqozNkKZD9PJqB9FH}IN29SnZmGX!4e)BXkN=fK&Nkp7eY9i@+g zW>dPeTbeg)Q5`xMSFa+zq?faCRNYA7Trj#+ufH$_o5y{5K8?# zq$YaS??%dXfySik0#73CcaI-wfe>=7pRC1Mvp?H-t4^tatcE@9xb`w=*C`r&;J-Qy z#j{={qofq~LXto{2I4!4=w5yRL!xEdpW;w~F&@TPXy<9ZL{9T~G$DQv%ugV$g9$y% zGDM%`UcOCdP2J14>stI($b1W#TqTp@zE_HW-yuu!`=t0muNUJ2cqFdgrd;6S4BzxI zXqTX@rf&dlCh(vGA0`L_ya6!O1o#^H>QGO8Tne-G2I({Kh9&3&YeDhh3=SLwPzn&& z9>qy7!K~-h{%kb3(F0;8h>d=LLV$QaKsmr`-C{f|=YnN{H2^Hm&1^q446XpN1;hja z6#dJ@3kItV1jgZFl5KZYjFf})v_hcegMIKpg!!Ql3_ zqo6OqpRWo^aUZZ-(fR>%&`YgQbP(f6U+nq;3$3OLKwHM5t^v4-U=6@Qg0lcV1*oTd z^NmOiyd8&ve*^3U7!A-m3lj--zE7Pe)<=+UGf1<*Yq}j^HNh@`?F6R-P-W9E0i@XV z0EfuB6yP&}dTJW@FjAp!QS6@q8eYc1wSIcTJMwqdz)$h_cyQ%{Tb$^-a`zc|P{a#v z4w!?NclR0Jr1kR6mAD2(ZOl!(82AjJOK+m1heo!jIMZPznZtzx6_ew^X+xFwWjehf^UhK;oI$<4>(KF7m0LG^c8ea{CtoPL3U9>b{%Bd6O_F;A=_VMw}N~GvKte! zzkw_}hO&1jWG9L2(;y#%EIqhL>#o6+@Tw!*_&&hb;KsiN;Pc;y39+>}kL=E_3H2hX z!}WNy2=BClf#*<7KhrfOA1Cq)&^|-YH07d;dVUAs2dE~{0LB9heifZ&BY`%%*SE@T z;1{fsYX!8*FrNaUd;+L^~v=DG9evL!tjgB)%3R$3ferjv}gDv-T#(zrRZbp!ZUVkn;gn9`-z&_WS^WCiU=@6z|MQZH-)zEAci zD*`un;YwN6-LJMBynHV|;iaT+E~O?5XZFK!Ev_TkF%3hwid(!6=i2X(mO4(BGIug9 z^-<|>nC339BR}nXq@^xXq%JFvu9o_!G}f(E(u66ZZY$ZJUxMsYbw4WLTJNuxPMfN8 zz3y87|FQQb;89dr-*{DZb*Gc+J)KT>r#tCDXCZ7MB&-QE5FuZ4tCBe5yzl$}f8X0e%KB31BG2M!pPcDX82gWL$t@f3{2w{b%|NEw=+q&g(A~)9vcOwtbipQP;%) zt_yHlt*zAtRKti^sEvBn7ME4)1|;I&5cXUBqj>nIRyXT!K&uItf;VCVPMxTF#A<*C z36=u93NVziBe#P30+hPLp#-_~kJQga33BPzXjp<4Bcbc!{t6ArfpH=las|Yki@Oax zw&SOY=XO0n<#Kau_CANLKLhrtwKiLtaR`#mBBbRWM+6<01@Q1la13^tE)qV@P>o?#>!4~ zV3Q2D&Y|wx`}!_M-}AQ#{sMx1W!8+6Up;D(SDR6ish@ngkQ3XyHu3Qrk)cx8xmv4| zDn+WVOj#SxR6=qYN$zTuyXMcVI;?cznyp?#!|Ih(-sM!HdJVO)yu(FwzQbvgs%N2u zclmm%^8s$MWD9!iDbkXI%%Dx3L%n87WILsGRi^#d*~6QpiFgsZwI zbk{9Os%{0P?iOkFw0mzr=E3?zW|Vi(5nL>ST1_V&_6_B6a{bv!JkCx$3UeXyOQRRma{05!$!$@< zAci5}7F@P9J5YM$5u=VWgSuoMQ8H7{n1+XiRjVNGnvBHhYi&xK!MQbmUk+V@|DD_) zVnhR2qd@MDbRQ(>Kgv} zzMR&9OD`9CB&T%(d;qRmH+a*O%Mf>HT&jAV++1exLYnvS`Cw zAjGu+@|~z_59E*h_wua5wR$U`l}*>`PCT~lN2Yzqbcvlw-S+unG+nfF^n#9(2Tv?` z`c{uD2auP`l{SOsiEWSK5e|gjNkc^AS76QD4xX4L+IQe)&cpSZG0XY3$9TJaGYnZg zT!)Qz?zF`N-v-SZj>~|DKihr+2A4|Bk|WL>i6uL1XX^k0Ua|Xg?R}JR<9ib|+xXwZhdt7_vMf zHAedt_{$@5pR0W`WO+pHakU?Pfu`|@>~Xc<4jzxlZddzTkmV8inX7$2`hZ8|C$9Ff z;PHsu>uT4);}O|zwEr2Mz$0>tG0TTCc%*CEdwj^%z5*;Bk!ST;Bk-3;dcdrW)v)g1 z2(D@$hXQy+-qPFm;xCWLA-(-QNb-n8UG2T0EDslYc?s4L9+}{SQ7V~xm==Fh!*BpVf<>Sp5 zJ4i8Zjh|_GLnA?`0KI(w>A(`wlpkOLDnKtk_#?0ppf?SF#8^za+gOaE&j!QC%-e9l zk$e^YNPu4cedHiOub}X+0O~WSD0NT)dId#)1XKZf1u^nffL=i{#Z`b_LEH;P8K5WW zz|nmW{MHW8OY~q!fL=k}F6JeFAPze~ub@5)!Vb_=QF&JAc(5cY&*~ACXMHCs&no&c zgd{4@iplLu8e#Q_%Cq7WfqrA~2OE)UG3w_;s5~o8Y)9o;8D>j( zeVhJ9Sq6RhF5oRz^_cHFQF*?S4_ruKRGyFDfdaSS$R82+Y`G#}Ss;E3)kElFfkElG~ zMh>Zp%JZE^tfKOK7k!Cx?5I3K=}|=Gy@Kw^$L&IB%zH-V`7UOsVXGx%SFv#Z;Wt1= zV&VKFcJb~av2gy8#3~lf-$<-t;rva+Di+Q^ide^cZ$d(v>qT&~yjy8y3=*>mGtF23;1o&mruiao6TUQ!1i`72 z5=zs85Ij;eiKh9kWfMhZFn!oKmS(g^@F&5 z%}z5&ENBObr5Pj^w1dRb3=#{j5V6H+28jjjAh9%q#DaE^So#v`cCv`AN;60-Xa|X< z86*}wMP4P>N*}C|o<64xL1Mwvr2$*g3=#{j6=G|eL1H%1nZAatIZHnP)wiV?Bo;hd z#I~pT#uZ#A#E$eQ%yX^~JJSpj3$7PpSDHa$!3{#}DPxdWaHHM_ya&<@5)0ZvVrd46 z1v^B|ePs+13vSVQCt;8ndmKM@fci=qBo@3{zZ`$c`GObRst-hAKALc*1K^H50e>X) zE0iQhLchX!gevqa;(H!gLcbzCLcbzCLcbzCLcbzCLcbzCLcbzCLcb#43H>UJeZ~qH z`c+s=s6xLKX6P5|SD|0glFKa>`V~#FQ&i|zv`6Syv`6Syv`6Sy)V}{Q^eZaOP@!MZ z9-&{+9-&{+9-&{+9-&{+9-&`R`~Jt!ujnwoBdgG_=y2W_Rp?i=N9b47zW*`wE80jI z75WuzVyjf>S2Q;OL!&~!qGO0v=vQfl;ZlWuMSFyPMSFyPMHf>Y75Wujaw62(hQav~f9=q( zt5J=_2JHs0*DneEik?KNUSyZspdr3EoXS zSFnVB6?KPxW#Oe!&xS6ow=ZVuGr^G6F=mH;r5XAavqQhq4E>5ZpXKSOE|9_s}&_A8!m zuw_1;KENS5;*&?le#Hxn*H{)~zv7n2m5-ucJz~Fj%dp#($De&GXY5zpZ;)Tk*spj% zVa9&NBgP-m_HxF4#S0Z?>{ndHew8!!E1oh6*)fd$imTYK@)IbZG4MjFRmv~9!KI6lrvN;`JjtSOgTfvk`F1olz6XTiTw($MJBJg7Yl*!hk!iff-44>bGgsB zn_$GdM?V+X?OJ^8IIV_eB>hi1MfW|Q(?Y02@7xcnFCA)slE;>V8ZOQnT9foQg|QTp zF!(|8$_QR7#q6$9Ja{PXCwA*Mb+)64G@pR%oX3(D`}Oa1Ht|f*{UyrkccKFv76YCw zhCLBAU|G`iKj?Ux)Oj zHh|3lD@AY`GGlPvu4~^Khs32w+=9gORVi*)K-g=+-UjxM?ZQuoXeW4gfcH$#3f-=2 zkUjzoY*xX%YeooAa`7^Gg zwsKC~Aaz7yP8~w4Iuw*TZs@LKTX!8drIAgm;5jTW11K1H)J7KEAO%0xRj|;iUM7!J)P>dfX5lFjk=a~ z%Uwg4m^|e>WoFfPk~CVXlRJtU_z3%sqa8f}$=rGtQuH_~Pdjf@er|LBwbj9SkvF} zFxWtkVDOg`>F=7}CI3r<^4f%FF;hFy0joghovjJ1HLrtp3_5GzL4Z364g-8j@HIfG zscS7B4AmlliF=S2m#+2?lqNY(2Ul`lO2C|V5-{gu0F#^ylP^Y&+NY77m%m(}vk`lS zmCEh9=QUY44DU~|YPelLZ)-*k+7$NF0c4Py*gZAWmFwbrD7N+x_&wJ}%CX=Hkdnf0 zQiU_VXX;@j5==NATKS$uD3`SUk4cnxI#_?B#v1`9y8$i*xP;)x0M7tSzKKb9;xw@t zna@GyUpQH_9$Rn(0ka-Yz``~GOmZ@`Tm;2#0;lCtfO`Rs+zNHuP)^JJ5Pl1srllzT zYjE?xMaSs1SWWeu*0c%ycQFF}gx@N+V|(?MWqyV}LTlOyA+F!!l#soC*X{+IR{&@K z8PHsAH(S8;vJXssBgCa!BYEi7P9*f~);7>AbgNV7Dh!p@#Qf~-dmZ+fGJ?~jx3?jY zK&xfr|C7=FNJe|NjP?Xx_Xi-qm}+%Ck9B3>$zWANtAS?$Odz-bU024#M%t;jEWlj;#FawMDJpqgOlz>IJy%-`V!(@IXG`TNMwJDV0$=EZ=7nSMQ z^fze7zSs^4nPNA-%D(VIHUim)gpJw!BH2gPgUvqYJ(f3PwBQyz95sV|sWkEN6qlvSinpI7O)gx zl9OSw8#yNXajIR5GXCwzxC)l*GBoe23$bY{q|<2Pc4X~pliPKuH#(+v4-%`9hy+ep zd)C(R{=W`dPUww^yPq=heDzQ%T0I!7i>cx$fZGWs0vH7VZ2-prOr8fYc{xvOc-p|z z4|uworyFrPau){UM<{O^%hOEBdpiqZX)hD7`~pkYrc<=#Yp6d8REq|i>@)&5z(oM9 z1pw^hp!}WF62;%!D3Jho0bt@VJR%N5H6Mb}awp3D8wLW2f20&F5^0eFU>4Ito0 zH}^vpPVQDG!*SqBhSdbja1{YF+y_vbLx%rkCeKha`E^mMZVH6?qM)^P2U*N?A_Ril zjhTPmrXmD_w-{|F;pvD+$?}=+E=M3Aj?_DznP*}kdAL^VZT;tA18N+3O>N6>MqmYw zk`*&=UZH6`Ql)t_dxSc){R!(lk940l6SIRyx@KmNxQ@1O=fdBMBQM@oKT6Yhl=^4( z2e_OJIt* zS7Hgwe~KkAyJHDF)Uquf1%U!@K za=_26eezZ0fS-P_{9=mx!hJUY$G;%P&k|F2;>bP#L=F_tXqsnqGbC~#zwUa-6p)|B zfrfHxpZxj=2s?7XcQYis1)(;u{5>{!75xhA$N}FH*!)@xiY|aqA@}nsP>};lNJS3# zmqDf=P7&zGK!vMtM5&)wE8?s1wt|ue!SZuIpMn%C)ch3-ktt2ws>LW&kYToBueIrY z{FNTCROEnEX4#PgzC(BfZna8YLC^UaIbf;C0e=fhwN&JQe;72fROEpFb1b-)@|^g0 zQ$8~kk|F;Pbho7<2mH@dUPTW0-$eQL2Cx2F=2ejc{)Nn|A_x3yOkm|X@i$Rkc~1N- z#KWjst)Kh(SSoVB{~WRMocODlS9wnSFJTC*jU3XPf5s$W6*=JNem>Ske?U1cT0t$6 z38hEfTEP?Op1(RYu7x*&t&7=dKG{FVH~b=0;phH2z7bmiH9z;y@r@)l{oFst*GTO3 zbN?J)6S2?F{d0Vyh(mtvpW_=%9QAYm9AAz&?q9PE{Bgu7Kljh^jVI3dxqpstBC#Da z;16B_!fP5hOU!^@Vg};kw+@WNCskO=eu>rxY`=Aae(Qkkw@%P+9kBh@3Hq%Aw%jYo-Y@(BMu3v)s z67RB8=LpskbXf=H>THLZpvyX7yQ~xFMlG;Fe-3|I5_8xmw#zyZV9H`iX-&)^VY{po zbXjAA*DBO7J3*IqV5x}BNzi2-uwB*(x~v1X%Q``qbzr54Eltp69k5;23A(HUw#zy} zmvvy3h^}i;$yU{2TLuA3_Nc$RTmX@Zw5g$<=29>6}(KuE_(sVZ(%H5cz zyV2<3ZVZdNQEHfg?COT%(n@_1Q(p^)%?hI}$KSlglAuyBia9H%7c7h5H1nd>Dr`EKhA$5wWCVaW@uryBiC;-HnCa?#9Ay zcVl68@MjyIIGov;15%?d*1c-je-B@-6_(4u-bstaD+Zavg)4;}l@Hk61 zp8z15y0O_4S{D6MkAan@w=w#a!XKmM(Qg!{w=t?4FL6BRZHyX%rL*sG${MYu>1~X< zjGI{&y^T?~F^ibq#;8YOdK;s8hSW!IW7MlKy^Ya)gAFU-$s)ZE%DFJnhzpFbSr)yG zQA^~~^fpG7x3S<_h>mvhV5f1~WEZ)2L?#;Ec( zrs-{rri>xbJxy<8RCycI^fpG7w=vV@ZH%64JP-MD*=eG@KdREp2SCs$AE}x^Z)0?m zu^mFaR&NJ3iWs&r$z+VEr^H$p6jFz^l1bnSTD9s=kKU ztM%SYp<7u)>etF3rFWj?!~HcQ3C#TpUXHTz*~qOV|3*^ExRqrL3g}wJ<^w3@ZiY_4 zO;Gt4R96SEqgAbi%*`RhpDP&}efn$w z?=JBAY_@?`b0(Eq%aWP79|yCu6-6uc);@=XRj5*_C**A;MZLAW_?`f%^gD~CybH4L zqJ^t8{cIMK3ZgBX1Nu3yV>-Axo;$lzdTw1iQb!=Q-+Oph*RMbD0)BU;I)l%gV3DsJ zunsxSTLzJHAySn?;)Bq8Fw)RoerZ?L2Hq3kwJDzK?EPn>50F%?j2nFxLx7E~S_#11 zrzlCh-)ntVgSVfFn*rEO+)#q~nRq#Pl5;BnbKW6|VlU{k4Lr&D00477ZzrB1`ARjfO(;*z*EDCqL1>=cjFHt#e}WWG$e96UoB>&om8alQSTCpWSdwE{sF0VDl)2uE zllvW#GS`LF@HjXqm%)(#kyE^eB1ePQe?EANg5cM%q=8g#FZflp`&IvqLK^!D)4D1L z9*2ax{*bo@Hi$XkadbGQkkRV)fl&*vtE*61Zw|81{dNIY_9);z@ctnM&^D`zu}4Fz z>qH_9R_GXLC>Q7aR*;1eT^qa;X`)4sOlKjnDuaZ4yy<^y*Rom!y#2JQrFKflM;%umQ%pab3!$Iubm>Z*54A;l}} z4W#lYn%>~pUW^s4`e!bMr3r_pq<(uFESWewgX`x*kVo93y$c0Q?d*qeR`!u&Zoyo} zeQj3;3gX{Qc)BwxaoaKcwIE@AxCVqN_&d8NySaO^+cy(J9@D)Huf;Cia~(4t#vRP% zlN^ToadNnOvMaKI<(YX)(G@PQ`(gQ$cO3rYtr@1dWcOtAD#+xm8C<8iDkyH$u@A%tDKC-<?7ltm)}~LM@umoES}~Gi@-JcdV^0?fR}hV637Wt0rO8QVCHLZz&7zi z{Beu<UK;ew17Aa+f?#XJLbj=dB6tKIfj`@DM5$l5sf6$M zwyA^_I;IlhE>j7!(NyvYW%&kbUC^zOb)l`1Z7O*OQ_wb*D2-ZBs+Cq6DN_mgUfWbc z?6XZJ#Ez+iIBJ_ph~u`Ygg9lJN{BPIsf0Ldn@WhQZBq$xKigD7)f`g^XX_B#R6?0y zwyA`;@xL&Ye2Q{xQwgE;C`={$(LFRl2o0!ACG0fER6;X_Z7Siby<;jNc1$J2j;Vy$ zF_jQIrV?VuR6^{SN{Ag(39(};A@t9OvhA0!t0nyNcbF635hOK35lpAECrNa?lzUsD9~jp`GT$Z z-)SmY4F$SQC0Ai-c1$J2U8WMYU&Kk6mv`^?CJllrV`!=yG$k2Y_DS~A<<4Z|aZ?MW&aflk-rW01|<|duWbmC^DwlbZ#8L6#ICvHY+E7OU4A07vk z>BRjos#c~G_d{4eziT>~#8pa}PPk-nxGHcin-6}FlTzK+9n;B5u)St0&IRoD^8iHC zZqvyiupHBgVB2&e*fyPT7iq_ILM)xnZw92SZqv!nS(a@&IhEKpod~u~CsM9$IuUG} zPS~&lo+{B3Qf{~DBnFmaI-!VTI^pOP+(mv ziuL*<5(-x=Ia7=E<|~C#HI`+AOh4ZyV-@*6ROsiX$+0T-rcXU~lHKDq0z^_W{debn%gt)}&d*M^S%MbN@VtPJOZr zMAZ(+>y>Px+qLQCX02)w8CA@L9|8UrFZ%b8vAF}nh@t!geuw5rGR|fe?{9K=egxI| z6TGq4$jkKE%vu-GwVD}to!5n&0kZGOG`&#kQ<%uE)z4ueSAgu7K}kOfY1%xL)1Nkm zt#}R8`qhGcE!g~YqCd?Dzl=9C9dFM45#>~?4anINNQFJ3XOhvPH66mFP#uJ-s!7(e)p~nXj>Mob zSR7m(ht>^}w$!mLtq@iF6b)v*i$L~Ey_nM;LhX4$-Z{@P4E9tB1hj5GYjw zZr3?~#mw(F8*JJ?#yD(e_)h2WG18~sQi!liW-1Zktp$$_Sk}!Ou+=V#^>*df`mAR& zBGh{aI%vMMeIbfdLmXjauR#k``=XS)pY21qXAxWXTc(}DGGZh@137qW2KGM`QN>3~ zJ;pp9*G^3Q8wS!9=Wt#kXVCm+%51Rn)>n4tqZV$-r#09aPZ1U~!fY|EOEk5iTXevi zXvQ0$IXz%aRQD)m9Kw}Tk(BR2^14yv&|}dQ9Kg3A4(fBk9fsUCuqb|r7@7x)Rw}JXq!1+y$!11{=T7{N+Ce117;30 zZ>tAahHchRMhtT>QVsP3QHBb)fB| z@z4fhM5Z#;+hz4I$|zz&e`WPBDk$Ko!M)aK=toGahcQGTfAYyS3u~XwPshyMmCv^W?gU&`W!UX~7(%W}Mac2c?&I-O zC9nEzEOv(5T!6D>=Kmgl=1E2`%^==T8wh0v$@l*VSk~|S0BcbZBl*D{V8aZu9Df2V zjC7DdPAGc|82QZnA2^`WUHIdr86^Kca$p82D1=wSwje~QgC-Fp1w}6bni4Tm5F_6! zMu381iYqfnLA;#UtBLN!kqQXnZk|5`h1d09c>at!3+kQ$JD>a(90i(}W{`sVCJ+W5 z=P-mSV#Erq2TRN#Rv5F)*3XJO1L&ARtfE~I5;KSu<5;OiSj8eFW)Le*5$Jae{_MjM zrGAbX#40%mmY6}T6f0C_5Gze=n?bA$vlU~ni7>R29`IeztSTO%=p_)2I95HpA` zr8H_mslK$*h-MI9Df!9_;wvLoW)NS7SeZe5<;2Pi;_F4M%pksMVr2&L^&wVf5MK?k zGK2VJE-N#LZz%c74B{I`)sz{;H+(es$_(NgK^bKR@r@)_W)R;-4!MdL@tsH9ED-Yd{1b_@nwMsffP4$;Hv5C+ zN#b%3!1at0oShEVy77iYGYED%V1hD(V5b8T$_#>?4oE072zELkq0AuI>41bXgJ7ov z63PsMoeoGSGYED%;5w3$h!N~`Kq4&>BiQMHM5#oKV5b8TWfC!hoerp4M$0E}GobXk zZ3e+k2hXEH$_#={4q|ASyc}X*0}h;e&$9^?F@k*!nBtX)5t~pEBiQ7CDItj%!CnTe zFe(uvHX#usHdYZM*yMmx#hOHnV3UI_P|!AmV3UJ;G3&()f=v#Hl^Fz^9IzeA41!G# zSZQ+tCvI{u1-+#rMzG1jbP&o6f=v#Xq9R7H$pP0nWd^|}2NY9g5NvWlF%>a_O%5og z%pln0fMUuFf=v!6rXohL$pOWb83dagP)wOYu*m_%RKy52IiQ%BL4s?fr^O6{O%B+A zEfO(;eGN!#m533WP!S{83!>@yr$MtwPp_#ap!0a4Pbt8w$-Hg{FQp7&5a9-8z>l zW%ela2%*d#g?Z9+$Lvw4>$GBs*#o~@!Cq09L!rygM6*YsSEO*CV3mh(NW*NiN1-JZ zdujHFhS~pKnmwWsfi!zW3kA~b5tUo0cV7Wuk#K4Dh^iYX%^uNWa#h4gQOz+}mBj2( z)R#*Hhlh90G6vZNISJK$T+ALt3H=;9*`vs#FwGuCd4|+SvqzCv zVVXUP@(ngDpQj=0i3+sLHhUBm7?og&*`vr3IWc<_`3#Ou{#`gNck;mOA?6L5J&ODW z`C|4c3MfpoM^VJ!lZr%)6cs9bJ1Q=C=Eny3MsZNVH??|x@%4b?9Cn# zvxn!rF(~E65SZTaqXBpFQPE2?M@-BdZj%|ZKiYu;sA91t`wLuu8*up}KgH`tc@wZv z{>rWB8XW2chHWNf}Y%^$!Az5hdR63qbYs7au}3P5<#ZH`g%5-7M?1}@I(z0|5t8Ne#?Pdn4KZD-79-DJq;h=9a2~b& zLZ}y!Iv`ZeomTMrDtpoz2JJncB4Hr6=U)j$Y9XMzjed}+Jp;TFyb;u{1ZV~r#MHX; zK%EF`@DBklMV>hNN&jFsUc~Dk0;_%(PPMn-v;k7}*8(&+Vndz;g?Joh-HWWWb?YDV zN55*BbsKAA_In9f#IFcg#1{Y!P8KO<=*wV}(@LFp*S-(3fFFG00h&p^S8|wPNcu#Q z(kf|qBiPpz!G=J4)wi&Nj1YU(2z`3Q#V=|;)2HEoZJ%n{fms`{6s14LF1wh0S!Qq` zYEjn6!zkz$6m&5XQ5d5|MtWaWh3`~67+NrqSiu^cxx1(~JPMIrs(#_B@5mZoLTOY> zYx)mZ-1RqPL?4G$rIk(SJR3#?*H(3hqon?4z|OpP~WYFx%-vEjWb1>Hr3 z-$ZE-p^7Gy1)X3n1VbD75zbG7Jx|!^6!t<_r@)9e{2N<>tz<)J-$Qedq&2-e4B9>+ zmF#&5Efa0|(@RR*Cq&y9sE%l>=#NQnJ^<~XkY_tz0{c$GkoT0%6~*Y7KZ=&Tr*xJB z3*A8e&{OSibJ~Fnviw#b1a_^CA?}ZSgUGD&gUW##*$6Ry3SR~pdsK$EfOiCVHjOra z4po1RHn&qs%z<+}_zQDj8~(r?ILD(6uST{vA>?Fp%X-)JcP#AsL#o9u<}~yg#%C)E z>MK^iheYcc&_x^lF-33D7o#97QxH3VhV&J?-z_4x8e-LA_`6MAvhCF}YCCjF!it%b zZ3=!WwOs+>fk`xU7s~q^yJDBVh&?k7yq_Vlb|`>}C#c%K0KEVPQLOGLP&rT|pGL+% zphc6B3$5xN>eE3=_}}n2E+~p{l)Jbv5poC)AUn#_uqXTjtd~Qu0_8S12{H`3Skobh zau{w^H8HYq_~+m`!vGq?upOLFQP~TQJ{Qq0Is8?yosOrVJP}a=S-=f#Y$Y$nE2UF( zcE~vCv@4|xo6q6`dX*$5{d;%&ju+q{t+Z-bsN8 z*Rc3IDbNC|=iLOj%~5LnX>{ivu)+02miI5=nT-BE2!+QeG4Bll6O zm29+rWtZ4W5tIHnNyJ)NL=;z9EAr@_F${9;Ibf}V9(5N1{19MT3j}!md;*3fKMHPx z!yR%r*u&c()3sjzlJf%-Cj%yDh+AeVS0!!uF!26i)2BnImHn|8Or-+LsGSMcZ>hq3 zfX}GHRtWGevD!(l!t&eTaEH`^J$yT4x>Wd~t->lWslsL)Tp`v#a5H#4RhaHXt9e$q zX4Ih*dBk3v;n;4?su_++IKE=W@pxC`k&Mr9Ov3S_W;iBcvuTE7{Y_R(cZ|ZG)%px4 z_6^2d{y>YVefTKOD&TDj9xi2b;d1sHzJL9(9q{J*?*zQ%{kwoS^Irnq%*X~5|8E1{ z%$@;ngNA5kFAk){zL^!wDY0*6ckG+_-PpJHSh#JB{vEMxtiGo&CV>>-HOV*jg5eo_ zn2;7^&n(tsY^=~V&+H9^G$wnxgX26ZIF8Zi5*+904vzD52giA>uaOtu5#ELydt3go zN8owQdhq~QbB@KOsaae~^5?z+Xj&7o6z3nuP(QDA#GByHBlcM*5YHzLS@#exm<=KFC3HFGEaNI0N%A34}_*;g2Fp*((r;)_xT%_;}OSL6dWt$C>57bD+m(Glb; zrnuU3*%vP(_G+R#adbcO!w$}E<+a)#3<(GH)jfqe1LTj#frio!?yDaO!VU*4kS{0w zp><$c{BqJCeh@_|{rnOP0x!CJIq5ID3qrm{2od$i8oPyxp8z(kWqHUPrwH_$jXyuf zQAGW`>Z8bQ{*rgWviRksKg9|)t70KCrHNa$Vt#kz&oEou8`u;ykuFhI7j$bBxKJw7 z3d9Z`DAC*y+Ju+nKuT%Uf>Hx%r4jAmfl~6l7QdVflo9(ZemNP)5QnTG=r(86G1aEhR5k#0#iwTIT>yiBAtAmd5#dGG|4X~!{dc0 zOY+Of@B~pUqXn4tLTD+yUZ$1s%gJzy{u~;VkS{00lk_NfNlw)8WL>W36rX}@!b~2` zEK?-Ko8*_1HsMS1%gOLmNeLyNe+0ylqC_;w=M9@EO5w{%8^@CTax#3BNEK@(Z{z9? zx9V4*(DXOZbg>?8*YCk>P4dgh@EpNfl3z}S=jv>SndFy~;p3#zX53RjEYP{Sw)69fMQl!zL6YHRA~rwCFDJt* zL~L=AUrvTsirCU5znl!8C}Jy<{BkmUvWTrp^2^EaDiK?q7-Q$%d7^uZeG>2p$e zg9@K64cL<8my_YOLTpX)%SoH)O!CXg@L4(+?`=tbIT=1%#I`5-`d~@$?$q1b|v}cWO#!Rds6&zGQ3g$52*e?l3z}SH;HC@laH)|Scee%Qe45pTXZgA z3qT_o%E=ns4>OHCnVcR}m9o1Vsd5@K3@SN;Juf$U96ix2G zv9zdSEi8wLp>zY-Uh7j-6SEiI%b`llUU<3LZ%mpIweBaDX2dQ2&U{GIn$J4H5I8;NHTUuyAdl$bogU2bh9K8E}) zR+2>?OT5*pAYM#$IxQ{+u_b>;_iw}CTnx3!)bG4kqM8678piAeCJZ+M$BW^v2qEN^6Oh{_Dk_nd$V6+2`MeMHlP5haS!sT zhZ5`)>x-NEK`>->jJtI<0Y93)2saUr5N48J-^TOg^6_d3`T91l>x?T)GK4g4hmgvW z8h6>5=u5#qM3lm_2CJ+Al!oSMr7R?FNyQREnh1-cd^Ai%1k#t1C=^IvNNv_M+eNCfO|bf24{wP zKrH1axygk7BG_K@ew?N6X*0HO?4>2_qc8RI!7Ak^xyi2-rh_Hr_0m zFdZz(h`~qTQht(~EL4~dmSm9>SjtawlPTk7HhMfOEj2KCv{E`)k{QA3$KN-An>^Q$ zk2d9#+$?Y7dUgN=jqFIIq6z#YH@V5E#P#QXCx;cfgSUzbC$6;Qx*s9M$GFmxPEH-o zdUZaewvlbB$FZ9LEB7O*JFc|k#uLB{3!$(u2UxSPfzX}Y(Ycj9Y{UShEPNG21x|br!Yu<~q`{yXFvlD@@DPRHz)i_UsxBQl+XmmKuS8*72r z5qqscF9DxN?6WSxM|`E{Q}K{hdoK8!h@;laQ-CkvwHmiRuK~W0%VNs6c-hHX=|#k8 zYyW!iH{T7MkzOvnm^h2i4L?GaocCpcHrVsBKS5zy_UfZJ@3g6$cX41>_F`Z&TMg{a z{(3rI*t12D%*%cNzBjv(FSOYQz$wVKO-6@je+Nll)&ssj`!k#a*`FdcnB9%kP_`B& zgtPT{C5~iA<6M}15}auEU8ELe@4<6hEIS{#IQtlK#j}^UVqMGbMqSD5Y~YgYMx0aG zb0L||4g$Y4yBMt~%WeZdlYJF6mS?X(YOn0RBjHZWo(h?4Hi=p)vK2U2X4|1*Rdy}T z)!8^?`ec6rO=_}7qny6k<;dGFyAHU2_BX%-vd6T;XO+DYCD&#zMy^5Glc8Zl8l|2gQ z(b;EES}uDUB*$dmhUD1nalqrU=R&vU>Mv39dadBa10eDr>{p1M7CXm7yp}W{cDu~q z%eiG*??XQS;pZXYwWb>|PyC!qyw92hH+udrh(p%IKR{+5anyPnW`g`jh~w6?u+8K@ zN}RH8AbyNEWA&*4ew;XKU4RzlKS5k=eF)9-pG1T34!Mf>DdJk|G4xXY)5P`G@#H^4 zJj{3Us?)UmXZZ-ysLUU~b`u!;@WpG;!2A4YiaXLmZbrFF%$zC4F8#hd5(RzZ&Jt{S|7> zTFLi;k0Vz7Up|k$)X#bs7kc@8;#zAD)GS{>TrXo$zL0pBj79k(;zk*Z^2HnrWr`|a z!m(&ZOJ71uWg%oGVRkQ=KL;+j56+@t#+XAzXwYe^mTAUVLbae7&0Nq-=@w%=yTxmL z1+%U(;VOz)N9VAnv=IAc?2U=rfdgVzGA7>*9I}3a{xYTzN3E+j08b^3TXQjr#*xG+ z>lETvmXon6&}L&Aak+KV2H@$$y{w~I&J5z-)(+yC#98Zf=4~gguxglh7ICH3N&al& zDp^#GV>pwltt4gU_+#wfpRt^|#I@Fb${$BukFE*ex|9CO10yUasv5?H#h!Z+J?Aw) zF2X`{0)nDzxW%y7oMK_gnG?Wj+t2N~6u#=d`FDUA!0d?WhpW0@AsLJ1N%Nc6a#{+d z>7D)i-;O`y^jdJ96V5foSfs>Ha)ik0tpgXXIbPGp%d6xF*wAZFUb9-$=jc0-XApk^ zeG>q*(%|v?81>bC4c=K0tUC;F8Noq-n+aYApc{1XR^;KvsrA^lym@T49zWokYr-G- ziD#{$8OaeO=R=!%*xGIE5%p2&Rz7@>z zIUkVBj>F%c(Rk95GvM!+Yog<$Z_j9wJu({gL9FRH)GPg8rO%6_|2KkHl}2x$4$wrf z0$>Kf-~$kCmnQV=cHD$6gT!GZBEJUn$^$It=in`8_Im)XBiI43o8Tt^Pq9ER`eebs z6o^4EI}Uw&20C&B3S9|-cTplbu6wwMX5a)Tt=aJ&WE-|Xlw=ACjk8Z#Md1rOuGu?uEs8jtjKt})>aSRrs2 zw~SeF5q!5eN?soO<)dm_2K@5Vn6EIQco;t&^8=*vD0y?tV(7xdxPD9?+Qh@?81n&2 z;$dtXdoSwZkssB^?70vjkvK|zKeop(Pno zV*&dc1Q#Rp-TqNXcD^wXtUh6|KUu)k1n@e2iyPjaZQ5?p^FC(;k1 z=J_nt-k0I6USP-gcFMgOJY~#c-XbLSX7E%D!TnaVp_O3V}ho^T4dW~9r7(VxcR2n+;_x}1oQ)v- zwkKyVaDY#DR)D#*fb!)078p+>KgOTnBCtt^2;_uY$|GP{%=|tMpJu*+Kei`_oG?8( zP0%x-JUP?>o&*pgcL`djraoLvdfE?*^RXM-qGC`$0N!;X&kwC&wC$zw>%9 zT>PTJSN8?vEb`YdqvOe04#NJT!FBuuG zPMtu}AqYk3)Ct6x*A^-kp#YsafjC8=Dt%l0QO6>x>Ns@*C26!dK&MV1#R}nzT8LAc z*mmj!GRzkD1~*NlEIT83LAOT13vG?WsS_+2VM2&bonT67)PhojX{8aJI>A!%y#YFP zf@Q?M0G&F)3~?wxr%te(I2xc+C)kTP9-vbvSWTP?(5VybL!1fFsS~Ur&Iahz3CfhO z4$!F+97=w_0G&F)VN|U)K&MV{IA{5g0G&F)5tJDgpi?I}lDIKIr%rGqM>iLsQzv*H zadUu9o!~{2Alaf>ydDXqN8Q+}6Ww!+Lu204sS~`Io#q#(PH6atNDa`b6B_X~pcbH0 zCp41S4A7|)Y9#gs=+p@{5&Hsk>V!rShXQo!ghmrb19a+ya>VffojRd$#Hj$CI-&8z znE;(Sp^3z{Qzsn!3ka{d1ZNjNZU{$sjhYm3ZN=IhE?h|3a^p^Q#$7;M1B{oOK_`cU z#;@5xN>6^i6YS(;cOsisA}*oGNd03-rRWlhG)e%KmZD22(jS&A;9$OKU>qgl-Q4`?Z4R;H!t5`tTc%_|X?P-K#RDY_-aX&#xZbJ(>~x`b@P zOwlD2nIb9P6kS3#;Y-ma6qzb1p%h(0kt0QkXo@Z&nOwlD2Ia$P3rRWlhtP-)+DY}Frr-;~E>4P=W)8~}J zB@{Vb8n7irmr!J_5L;7p3E4zviY}qZS@Mm{wiI1Lk+Vf?dx|ch$T}f*r05cgoGZl6 z6kS4*^+N1Q(IphwAjF)Zf%a(`TK?U|`d<9W(DLs-Rzxzi z{JZBUOv}G}u3)kJ$1GmlQbQp+N8Q9|`7bv0W-#O;D0b_UAf=^vr!4jeVWw#LFV2%* z@@gew`7hS>GnwfIbXKt;N$ScecG;O|`7id06mCeYk`4`NSe}+)A;p$dESCRxm=~XH z9ubcSq~$+eD3F%_cvRp%4060kAT9s#n81h72k~M;zgYegHD9Byz{423L|-mC97*1- zdxeod#EV2dJ7j3&PbBm-{&-CtXX$1d&FzIgQ-W-XFZFj&V1`Ei#8(Q_$e;K|VH)`p zy0MMpK_h>{5GrjbA4QJ6;lM4ln_-A(LOm`46Y zzU-}Ov30LF<+?B@nO0yt#j2KgBp z`4a(!Y2;5t3_cxYXyi{6Doi7PqDTtN(8!-i83sFsM*c*p!RONqjr@s>U}fazyi1&G zT#HJQV&qSXkv}O${^Urcq6sweCpHHep*a9uOWbJC@lfn&@ zkBP}Rdt5!TB~w!%ULANj1AdygU*HVPh-9yYz_kIs1|+i#;I9u{0?Sjf4`qf0#!;q* zxG}K#0P+st?8pVOrvVS-McJ&LI>$pK#1kgUtqO*dab{gFBsE)}y!|Deh7* zEatu#2c8MPK@*b`&Lx+Ry4wL{U<}Q@n@KHOm~;d(^ScDBFL&dQdtMHAt_V3LAKif| zuOD(%`f(MqGxQH!AF-~~sYua36v9j$vmL}AT_YgnO&ws$N3QuGe5EHYKzQ@VuB$+V zQtuo>%3;?Y5K+}!<_Mhy)trZHR@Cd5?{Gsx@`QGCh`eSFMDTIIizz9m9}zLN`vgHg zgLqAktg**46D3%`%ETg^ny&-bdKQg-7C?FlPdMp2p>ezUAXwOh0%oL&XYjzH@A1e~ zLGG7u=$-VkR=)PEq;O#0f+e8x)!st0yNXIdzo>GO9s;`R-zft>urUO5V{TB_-fdm2&n7f7l(tBHx2h&c48J+I(S-1lzq%F19Vxf!62;Ku-y z2z~%C7oeY$r~gCXAm(}i8Ry`kbD&so21@w;K>ny269)3fH0BJ1JwmSsSxeq#2!Dd= zx-;NyLQ=LMB?MJ_rl2StTVpWeHmPNr{D_ap-vLHrPkHRoI!zUIKa%G4OhU+MmsU#T zF^HV`Pa>+K=cOVVq}Uv2r&W0GMmMeR8Z$4J9levk@G-t1MZty75toza89;CPKjhv7iaHGSgwu?Q_!^Ont z$YnocRp)!ChO1-O`YOaPZxR&`qoV93yOFABSI74C*_Bkpp?9pW66=_vb69f*FGQ>P zPbS?Zp36d5flejwyL06lk2`G7mDR{5b7eCD=gKw$&Xs!rzB^Z39Xr?m*OTRRjgtkx z$kMak3<&)vo^?*WPdfD;bn5-PQ*Q{Xq}0niGDrVs>%GzQ7pLCdC|ue*mVoU&hJfuo z@qa)Aex}GTZ*OG|H>$zJb8KP9dhJTZiBOYp$;4z}4YM zGW!=wQl+Yk?>}2hY&p&1qC61OUKUxGR&h4x`be4k7 zku2$RNarMdEa`Qm#|XWE^k<~U3e7uxb^+;eLSxmeK9QGqvyeNGT!kMcJVGe5H#`Px zCnrl|R81CKIT%Hlhb1M7xR@n9Qm}|(0=U(p%qwhd55X-x1X+Zvx&L1Lv41PRF5axJ zU#IlE(VF(rzlytEemt$92Kl8Wwq!nfxEKeg{aPyE>6qeKt@WbJXxLeM3lQW z_YhbOFAK{$vh=$>g3|I&0971Wb-0LEe>%r8k)ct1c$YdnmQC^p}#tK^%d8 zuAIn0R+5*Ieu1N+=(|8SoW5YCrpIN9=rihMNsddom@wH96i&*F(2vW$MXJQZYV_lv zNemAa6@579d2)ZCCT*h0oiLQEJ4>ES-9xNd?kssyb~KCW!dD+X->z$A^{XtsK<*?t zBv(sAEUEiA(9(B>7>^TC_P?$!9I31SDMc29u8~^&-QHC<$2Cy5;s!S1EjQGWf6w8p zcMgj?O?b=Ao8vjqq4JDfU6R+5{)nCXmYesthd`_A?JYNNmgv4}xfLCdfL$>|)geoIU)7-)U$lZaJ7r zc+?OnK3QDVQ>yEFDMS7TREpbv#Nls@v4ozJ{_XE%KAY)om%R*kO?sB~kAE)9DTTAR z6n)5{5=9Lu1rH@^9GDqtJ(a*v6z)WmcXbT~Z-sj2@4AL!mkh-<=nU2MyQFXTlb(~p zv*T`e3FhP{q`%~J+U;fubcR>cZKK~KCC>xh)lCoEI?8;I2e4ttqOne>$6fQ$cKn%+ z?!})OQ1Vn3eNmT^c%+At;iNNPE)pfzp_0m3C!$g%$=_8`N^TYZWblu)tCU{ zR=vc{vhZP~dc^sGRP+-hi_X05oS5j*cZ$v1&gF`2cQ+ekKgM?FyzO6evOv1^x&}i@ z*I<0!u?y^&jfv)r6gy)^cZpwg$$bB~vg`0#@hLi~9LP!>LaLS}%+7zf4m|s1&{js3KK%OpN1r`yDH_vyk~X^iEc<*21yU zsM*j*kGr7ijf^)y-1U;16*x2xM{PzM2ccYCOSoH= z%H8TMB#837{d{FBuU2(gX4KuM>&7qzQb`oieR(LUwg2>lsIvOM$elf;6p^x+QH`4tgXrtws?cG*b7w zNB;q|N1og0>I}4j{!`C4Xu&lxz9kI04nz_z;6J?Sa=}oUyPH{(b~T^ z{<=E$uJ1oU7`gt#}mfWZ&qx`-akY1LHe19L$c zuGHUx_Z4dB`z*k?0nmV{xdWi?2ZdZeMAj|H)xum~neSzg>+j&X2I|`A`vE*+thu57 zG2p(R@Pw4U?*mLEcmv>kf)@a8B)9`$KrO%x0J8uZS#~ZTrwyR`7XcU@Q~H;)#`au) z{P_j=SDG`fG(8=cum8eZAxjlj?dDEM z{i0h+-Zr@Ab8$m#%8vCOM|8k@5M5-?Mii(|%Ug?z&fxRBT_-eOi+RL1n16gnb4=JH zI+21!vI6tupPJW0#6uq2ZYX(y7aM_f2wWgskVvUDshVFeV*vuB6^>%u;_ihNi*vdD!56? znnL|-D0(ZbdS#R96?vz=Po6B zYpFCcCXIX>*Jh=t6%)03*Wpc(4ObcQZc_y!E@|_SCfELa6gP~+5jQJQo?QE9AW^RU zy8#-RD%bu&P%zBVWVa2uGE^dE=8#L7>;_y4E-!Y>Sv)}E5nNsGayuCEA)DZq%Hyx& z!+dE1%}c5YZfQdKU^HP9d)Y0$e=O)hY=TGHewC0IKSjO(vO&gB(P-g_MX=j@rIrzp zv(aLdprEuli~0}Yg3}AkBovS~=hxe99s|(GRB7`WpzP&-7;^DtUboCvC)Yhrt^>@) zRLK>?RfSMM-XvxtSBANKrqnYENz%6~02-MhIj)u*+SFfj(tqyy9Jyvo4^>v8hvcgM z+{LT*3;``xS4CHY&dOW)UtPTV_14-DhKcXwI*RUI zUSM$^P>U2U>pi(xJl!s_vB;Y$_O;>i@svxSiR@Fj28c7IMJD1?Qioh^Pl;sj_k-Kj|eYCqd_D zx>CBO-|yndVq6W2q&AF2oz-)e^4(|}9#}5q3iX1x?pFsSVzYFoy+ ztR(Z{<*r`MEBn`yvj((OabeFY_`=_cDjr-4!H@`E{w}t5mMVT+?F?~9s+fu*Dz8{3 zk}*`d0yNF+5y^KGsH}8$p+Tz>o??_y#vx}{Uy{=`Ju1@sm{*MMihc`pwMli043_-~ z=$faSa0$PcgQFe%I-?Hy^!+_}Hx0vFeF@-RfPRid?n7{%1_w8`o$uzfE6~vK$ihj3 zNmTnPc-MosvWv%|QqPjS@!{sxid!P2Zim!`|0JaiXn`j8sm>EO$kdZ=f?6-@hu+4* zhg$W{udraMm$R28y5bEe!wz~?JnebIK`nQvWuTN*N~NB|)YT_qm3U18D1HQbsOmoKtts? zc~9~g9nDo@Cpsu{{YPL*r{2kFe2qU39y9jcTJ&8%@HovoZJwIuXCq}8QXWOG?CMI< zYUhCWJb3%Nc(_>YCj`8H)UHDM>q!4l((M;Qz5ov2fRuwssoe%}7$5|Nsf0Y4xLqT7 zrPS^~;@3#bb|q@HFM;RDVZ;^B#G{c1K)&ZXKQ)+)Dax^fE8 z-m6|l@yDdD&33MzeP6CA-~=L**K{ReuI$|4FDWZU;u0)_yXcL5qt>nDnKJM=CVlt0#t4Q zK))t{5dbp@#si!NQ2RM*;oazmsDc9{ua}q+15ET}I`>^BCS^0^`K-NP$-7<0$>hMZ zHWg=2^EHG$T{|D5|AV_XkCURh-o~q{t7m$8tD2ea>7J<>dX^scWq=tN_F*3oaFAUP z7Z^YV!H7z51A~Ibs3fSUlW%Z|dyEV2L~%(>lq8z3i5iX37>#j>TVh;@{+{QYs-7{L zyuUx+&pV$_*F5LkbMHNOsav<|-g{0zr10lL(y){V9={WP?DP2T=yX5Hri%ft8inH_ zC`AulRzi@a(H_nDG&`p3(qRkw-|eQKz!{b9>N4k|;%CYF z@iucax*n#_SkK=kov!`%v+?BECLOL_dbZ+OSg<-ry3J?|v)cvD2;YK4cPRcFAD!o^ z1cui0WoR{Kf0rZWH<1ZiA3w9}6J)L<_ctZOz32h@>EoL+PX3m(%vLrF{SoM)ve>cN z+=~=4Wu@`QG7 zDl&}O9X~>ft3=NWM9<$13G`egdbT28)pM2TwUD&vxmxJ6K&zgsrBc5SS{LqC2YRa7 z0cq64}0_Y-G+lF9t%?1mbU*Sh)0Ss`wTY1 zaw!}qCT7Q6i5< z&;_ZZq>ZedwwCoMzvvNdqGP_)L{#EGH4$2B9!tp9VJm5qMNBpsEdLp7vWe_*Go(~q zQmUIUv}&nlNU63^Ybn)C(ei%^rJ5;C^mw6EGeyt$3Z**a%cVL*#8E13&_jY!X(4C% zWLz6`j*v-Az@$MZqG<{ZdM-5lw+59Ga*h0S{fzNnn$#CXMavBOT1((8@I2d*vZmpKLo7>n(PX_yRj~&p2N(? z{@CWPF}4m5^c*I7{;Z(qFwyfb1wEA>IWf?4xHQ9d(Ao~e13gvkfVBI31CzJ05_kiI zoBoWvcaFx|9dhng-M^psu#p9#p52YDVT^hY@i?@$#{Iz>k;9=|-;fVGJ%$uK&?j;B zP%c?kBi0SlA15>iB`w#ILK%G^r$zG5p!I=WA#?)G+2u<@219=)AAIhWhahD+0`X<>1_<_i_H@i1&w_PZ`k#S@~`P5Ft<4YEXEtK z0w6O5U@^dag4qD46HEfQ0$}mLad?+S{5&!#HgjN_sed(RY*scl};z%(# z7c8dAj2{=3A4c=YN?0>D2sTsQW~w?c5DC=8#wa$-y@+`ObG~;18>NsR8z#t)ZG-&S zGUkG@`ym~)Nq@G<-;qQFnWIg{LHP-6lOUaeLEuuhjWLJ~V=hIr96+S6Z59?$n+5Vl z(*?LUc!zFB%7rHU(jB@75`3w?vLInJ9RQCn)ejeVe5uwg06W_x`F5k}4M_2&`h|a! zGMa2?$Cv7N3n5063m$La5bjZGaw>*_YVc$rX$9c4ytf~y!vI>iX_Fsqba%9-mwnzG zpNBDN@Y{Y;NID#9K_#FE-_Pg4Pk56)_F|iHG5(uf>@GS){Decq{pf=8uCK>znVQ- zD(EozJ}7d>l9c?{Gym-%=gBAH6Pd~nK_1G_&leyOxUYL?GMX1Db0cdbSgZ?O?Ueml z^7y$J;j`PYUh*Hp_aK~gw8Rf*z3l~$4Iy2jT81gSuQ5Bmui>GlpS`Jtys~5ro5kul z?i!SE5jFk$3m7Kx-|YIvn4r9iSl(Z;fU+fL5ew*|Y7dinj*vq^&Xqb}%$e*-Adi%n z;KfW76W62UWx}WIc>`F%hck?A)Z{{MelQq_JPZAT&wk_Ru?S+9IaGtd{P!&n_XTc0txW4>Wn|DudB z{b+>SZ_0{uhz|{UAqImzs-1VPAK1=Y2bh}AqMr6!vVFjq{=c^%K)0WT_`uQ>bk~`t zpn;l#?l#jD{uoA!8l(CB1rHdWE;OcZyBVoHp!)D@tfuxr4}COHQ+uF?KKn!;P3^%j zUxJMlznp{A-VJ?(gk&VK-(|UE?6Kd)=NMz)VT=X zAmO}un3hmR=S9aG27h)}xbt7PVa9}?z2EA*1CvVraEy7?F4Pi#C4)LAXR*YNpM8Vb znLroi&)#OPIuybD*|)4(0bTgB@9Rt;G5+jHp;gmvG7bJ}F6ulRcOQTDnc-D|5$BR| zod=FJ4E|vAw$ns2^JfpXR|Te`dzG!a8VT@Mv$pe^;|+s9yI1k5B>wYfU(hwJdN6^rB^feW*jLcQNWXfpq`__M6)q)}z z53q8KP`m?|qLX1fz-pwp7`L`sh7i(NfHi^;iSSfo#6CbmjRh3{R04cs0VKqXb!ZXh zscO4Av_z7rMWI8h7lK>-cLv>n@`f&118CFxVK|1Ng$Aqtihq4jT=?$&4Md9EY7pwi zusE>@SUji{Cn>IO42$7oixpbT1=(af*rXi-xj^A%U_=>tD}FJf_!RuJX-J^>ZgSwp zFjD>;K!U?#Bt;zzabp-szXYgm3?mifs~f{ehT`hRFp~W%F}z+goVe^>fG^;hum=A> z?ZFW9&5>a{!HSaaqJ$_Y%{NDy!>o~>ZVXG@>0pT)!;;dgk(BCJQij_Y<&Dcp|C013 z2#FiRk_y(eFO(4>absALr3mz^$G;u;rKn%v#<0Zu5m@5Ju%wz9svEc%j-l})N{45Mcgs~f}U_TM9&b|cysEJCT#uo1l%)$?XR zqnE!396gVfrfv*lqc-CyBW?_1qrc4uPU5$7&mF^shls~f}EWMXw=7@J0{ZVY2Hi1UU`H->TN91sy(MhBkskC)l#i|WQOF~)4e zGg#ahCdQf!P&bB&aYCpY!^C(Y)Qw?cf)MJ)FwrK2x-m>l6hhq?;){-CQ^~XXiOD8M z0d-@Tm?DI_F-%MqLfsf9rU{{L3=`8uwOS*}s2$K!YTb8Zm}oaIMZ)UFFfkK5+Mzf* zYT^)+4X1wFd_vtACT2;9x-s+#bz_*AEg|a0Ffm7zP&bA?A#MzPtZobwhl-T%#xT)g zE`tKT8^gpx^9=NQabuWRCRp7VCXT?{AR4}sXY~`yB~x`{m^j+xgizfWCRUhLXb5#< zm{=(x>c%k9Y4YAuH-?GTBBpK(6Kh0F-54g06)|;Vm^fa<)Qw?ct%#``!^AofQ#Xc* z^&+Nj3=~p--qA!^CEjgSWadOq?cS z>c%i}h7jt;Fma|3>c%i}mJsU3FtJ4lbz_*=YJLlqr)~@r+eEW{l@D(~eeM)O-54fz znH<7+R-ZKp zK87WS(UIVRLN|t`ws|}l(z8p$CWk6@V^~@wgt{>-EtaAOZVX{$jpr4`jbW)JL3%rs zhWto8fL|IBDLf~bB`pg`!F)G{r7_9aX8n|vQfV8jQASyrKpwy^D;LNE_+|14wfEzh zUzQdw58#){1Jr&1HD8t?SKSzv_pdKOYw-Yn`2ZPk&^&x{=32pb*z@%{E^Z9VE5#5% z#O{kgsb;zf^v7RuV_5!)Spt^0F)aU7F%RIEA5{Db@-H{7$JriSZ7#P2OJ!ddq~*IY zEDu?iGOg2aDGysSiFp9Oyht$*;FlL$k{=J?mq!%y0DgIi#ezk7`5Zsd(RX859<~0) zw0Ho&JSKAD#;`nYwWH+G@8U8HY53(Tt_QB+0sQiWMZUN(EKe%t0sQhZi!&8*V_06U zmd$Jeo-SOzW>y=HcR>7WX0@TOcy9@nod(hWII9hb z_m<*|AtSTeP$R`fZ7ayL1c z>z0&%1R!(Wk`#5&xo%1NeL$V-mQ;|hbKQ~*#dWS*k}Za!oa-{2xNJWnajwhO&h}u) zT(@M{k0BQ&e=vUjT(_jT0mPT)x>2_iESc*@OK(C_s$aD1F2G=}8%qfmN!IHUdw3->}TsK-n?9X+hwTzaD#J2sDvYbN1 z&gs@DcCN3H%ynbl8@PdFt{baXjd=gYYE&c6bz{BA*ST&iN33(*SS_*6bz^nJI@gWW z6YE?z)|Xi4y0L!5I@gW$C)T-cOnR}-bz>vR*ST)2m8$7nH#UmBRp+{~(Uj4-Zfp#( z&UIs3*`zwxjh#)bbKThXkC6`My6pReQlpsb{tnd>!JsWPdO7F1vGZ7II@gVl+Rd3B zty;xL-w3F4-S`+{o$JQO66;(yK8{%Dy7BSEI@gU)AlA8Vyp34ry79@xI@gU)Bi6ZY zdtbD-adfVmoG66Ob(52XP?z1w$tFhuo$Ds22%&S`A?5N2@Og5Z8+{o$Dr# z7crgdCfACX&UKUPL`>(p$@LPs- zbgrA+DTK~-leXW%~o{B9_7T`MiRMK4Ae9tlXHhQ_8W*n8qM<0^~?)>09XxvsTLG3UD0 z5rSo|TN>l@Q*v00c=|x$Toy|}C3eO2<`78XSVE$aUEG8MtT(=x^X;cO0y5-0UkaOK~I0^^k zT(?{vp)%JkPYaiG-Ew(=%3QY`=CDvfs2;;k^>4$(L*}}v0W#pAc^Xl!+(Pgj_I!Pg z%Um~AX&wW1#GZz$RP!bP(KKwxTsQTJ*#|6{>!vOJAT2AJ=DNC?a z_G3X>{#-W|vi349&UI5^i#GXWuA3@S%(-r=*pmD>*G)wfbFP~zu~@JuFV&>?qfGu> zHx;$wV98uJ6%#p`>!#us@8>ALrFR5z!bWi$g*n$vB`oq~uA53K=3F;bW^tw>bKO+A zV$O9_X-QD#x~XbwIvPjjx~X2)4=B&MZmL$W&UM-EQfFF!L?-`zuAACs-36igJMTmr zGFIBFLUY#T_X5|Qb_ZVG>YhcIRW}dUP~CUHv5opC3gQhTDSkR=qpl2*@JKu!GS%t6 zyAdGMymY^p5o#pvhfuozTgc8%(4bX%0JDlDxK5cK$b!TZ|Dwzw%DahG#Dj@biIqq* zJ%l)G*jIt5@Ob0e^9ie2+wn&r?pD-Pe#J;)D{%sGtIh_)(6(aK z>);n962zmEh#E=kco}#MJ1kD+T*L@9w^C1=(V{GF9&)Muph8B&6%a7J6gc_u$kZG` zUHFGK!V+5Jn+Q+0kQq82LcMPkS|D%u^oWBZY%^VBN|v>I_^)x*H;#?ai*FpYyp!pT57j!>cnWQc6r|CmmOtzXn_{h}@gd5hzRBfvMv8zQ!Qd{(#P60OH)b-V0*O=u0r z0sX9Q>t}V^FYlmK}FvBqu3TTyT7 z6tT$0^ zSOmjAms*o9C6Eh}z8Q=-BR_>-!U+8o|HKAw^lozCO)*y92P!&j`&f!P!0;>X-dNfN zwjJ8wja85zab$v?p}2ZejAdJiBZlZsoI+3GD@vUGU`7vyyrRU0y^M6?cS~X%%Nz|xDd__t0B0u8L@NObU9CvP~d@Zr- zj6iiK>WEVg4euuEiL(w3?ZS35Mko9IVe>(KCSqCauoq2b+x^z*(B4eusKl0VRC zCvK%`P0sh2{wQiS!lB{a#AwR2I(-;-4Dnd!854Lbo4n1LHxu}5;wcUd?IO^*6CWE{SzBuBptXgK^RpBzJMJ2bzW z97`N=Xnr?2jyUen{BCkQvFp(MZgK)~%Axt)WE*kTIr&)dClgmYG{2jiMqKOA{BCjv zv2T9YaefaXV$*D}yr?)ZbcBJQE@7;c*ou15p9?nEI{9u4TalZ426{3!2EHaSpKdo-ZyP7$KUqXAuP!DC1- zj|OzzX+q>Y8qmcK6RK8g#3}GYK&ktjQC&>YcJnPHTqOo{-I?ZaG`hzd);$DHuAx~C z&l>rJ?a_d)J4-?$9u4UFMBJkRU3a#GxZbZG1~EsJNO?4%>l5i37|```g+~Lr?x7-; zF{)p|4dZs0w?n~R2a)qi(_Lu(2Kjlff^wG$Har^8b&oJv4%_2Ld3U*FI>m#shI_R6 zJN#?+ma$G&m|Rhuh_)y6!p=TkFw)uDf2uHh46k>uwOSjUEl?x+jX*CaHsyrKV4> zfdO6j6e++i@8`^NlMuVTf3VO>ba|JvG@DHh;d{KZnbv6{cCE*~sqPs<+~9F%s(Ypo zw|F10XlDs=n@0n>?iL~T*3f{iyVZOS>D=qlfUdhuG~4I#qrAIQi2XGj$J|{e2Qt2> zu*M@c@6~D=&~-0`5iiV&X+YQAZN3Cnd?@ngiv=DSAAuGFx}{a*hyh(p&H1tMr;mEA6MpSW* zsl%+U*ZE*a9QssD`@=7NDyIG6mp&EKQjC;y53v*@>oi04^bn>~?a-%UdN^^dL!XN2 zX5zdCmTQdKPE?YaIGiOfRI!4reRzBH{}i`czCWA->q5PsQ}%#Je2& zR7@`=-t9CJi#zHrhl4@7vl{B`LF3$j|Iv#P9I>Y&n>Z&`M*;Xlm-tjnpFpWvvU9#q zMUGf;PU*ITnJ{v75C~<=(<#E2-Oy6G1#-SmMT+NqpNho3W##jcfaLhUh^JGNkRg_p zZA@-ubcAJP7Qyg1|AA#?61K-}eR!4R&=P^ETHGFM@TNVAk$lU_4ALPLmX$S^ZsHkT@(W6H8@Jz*~i+HNnXFmX(KqmE+4UEGxgtbh)qt z%gTcJvJ1<~lCE!ASukIAVOg04i}P|>kZuTr6~m&|cBadP9avVTNY1yc%+`tDh|7~f zoUjpkfWp3IW%6^gsd&;7%$HqQR_2^H=UY}5>|0i5f;r!^@*^ztG-le%x|Mvs?834# zv07F>9|)F}c`82t07`9qjr+u$Z&|qsLX8R3xy@MC*k9mY$-iICNYCMF=2vIH&hINj zr_WcVA(wx=6n!ZF9QZ}~*Hd`y$uFQ=6ZS^y~5!xYpVv{HLi{M zfr#5Xe+<&>lfNH%_06~A+An`ERulW>*F(O4ei%Xrum1&L53f7vv{`^PT*Y(CyOv z6y$PQ{sW}BC;xlktMY4cy*hsjbh{@1F0R++zkvJ?^WOr#E`K}HyguIo`5W>}kmil~ z`w@Cm{wl<}IsZS<_Lh7EoFC;&5PEC=H01c>{F~75wtNgZ-kvW3z9at=gx;Bd2YT+! z_eRQhyYtte-tNiMn$o@bF_3&Ne>|?wtB202ou8s#^KTN`$Aa02P|Ojk@J~E+R^395 zc<8M9Q5#^yW&(|UCi(r_t2h?)*Ldhmiib|G{yGGw>7mnW_#HA(jl4YdwjFxt^co*y zy7FZA`Wy~^Twi_3E@d3OOe4u)=)gq9L#Nl5*@vFMCHc+Cn0t858C0G_51n31HK4v| zdLwu<+RmyrjQAsoBMv=udK0EWCT>L4Lnq_PYj+z!sa!;Xo_YTkc}47c2#ANys-OKH zjNGaHFq61H!~r}<51rKyC|*OnPjFv4XDdGk5hM2TQQTGi5wRu{4!!W?WTW3K@L{DZ zbOTIm_djVjh<`19v&}#3T7ph9;8FCkHDF<+#azyO0}%#31KxCObsn?<0WX6XjD7Yc zn3@bZ9SrvOFCYeHIP}2BsGp`SV7~=9V<_D=nXj`#_x`obxR!}_eTaO94Z4c~Z0u!7 zdH6RvVVUC%winE0H_MjlzlKrF%?NA}dk}9jkrCYdA3`S%hhE3&>5=at(T|YPbx2b3 zXTb)G`G&#RslO2z=ZlsN=JxPYvA~J5nc!JxMDWiTnWgr)7k(GS-t@=GhynW{ch)nR zc~<0IM%B!WLCug)K%T{C(zNHtY)*w{@mF!7X7UV+8X=Z)=(o3{l>4dqGjE{k@ZaoO zj{C7y4l(a%v+qU;hb@?o^CKenG|1*ooJoF!b@M@?_>cZu@n1mkN4DNF+wcv&|x>Cg!4W{_#Tv|3IENmRS+7+50d6Q)Evt#^f z67oJ_E*Rf(7YKQwFy{|?42g_^0?3z@jSQUW2%g3&T!}C~S8W_PCx`1K5820h&ZFnYu>f)HMsrI7K zT%>AD8jtrVYo)v|g*fIZ?SK(`H?D~!_xxkI%W#5Khs!~f$f`pu z@eHubn>?0eZicI#|K0%`p8tM~f8qq4bQxPjE=c-$FvNe`=Kyfw{vrPPp8v=xr{})~ zD38mx?s$qi7%o>G;^`t_+vTc5yn_6Q%a54x48`NA0b6j*t|E@WTOPuR(?3OgJnNF| zOsDo>$f`qpSQ4xx`QO101?8$ky!mVp{>G@1YnW5QeGDv@s}70MA0sK%FHv?sply`M zszW0E4+vFo)ge*AHuHrtBII(_A(5pB^y9Yz+Ck1xKdhSbL)@N(*B>mGs}6~3W{BN; z#~@M-afeY!p+qgCRYj897E)IBo1D|FQSw}0BUyDwdeia5bGhn}tX7TMk!rF=HR7s6 zvKRRgm#YrR9C6&`szb7t*mb$;kgOw4xmNABszY)N@mQCAExDCV z+U9cAA$d0O6n7}`_C=6vHdC6pQs8_5<_55K1ijhlq44$1RaX(gxjMG2fwb8H}EfFe{OB`|4 z{UCANRriC$uB+|`iBqn+A0*DYT>o$<6IZ+Hevr7E6u$j1 zdIt^!XQSZ)2Z9VJI1nUJa3Dyc;6RW>!GR!&f&)Pk1qXs83JwH0z7-q@k|;P3BvEi6 zNTT3CkgC-hN%D>WlveL{Ab1T5RB#~p7E8e!2R;MYkqQn3NfaCik|;P3BvEi6NTT3C zkQo*n2$BdK2oe_@2$JY_Ab2bk=yo7@KJK2tfgo|gfgsCKa3IJ`3l0Q1-z+!~AV{L%K#)Yifgp*31Hp??p9Kek)U4n@ zkVL_OAcs`0f3U_QHb;%XfgsNu1P%l*MPf-FZ@UiwkFHzs&vzh5j_*K_uuQk$n;)u(okaQz)+~rb8y7z^^uFIv6v<$de zmrEgO8E~tO5?KnVsOV${Tneek5aKbi6&+A8mqM6-i7bU=JS&C}EQMsMSwDu$*OW|+ zsN!-dB-3jP*b$dYAsPRfz@?Ck|4iUgNJfg0a=8?ekz!dQb=aj^}uUfE`?+kQe=nArI5@b;tO0Zg=A!+cCpK)kj&xa z?{c{ml37Z;+vQS7W+m0>a=8?e>0~$AgT^_YjdL-Aw`E(Hr`xdspNXR@@Oc3PH(I1J z_9VW(*e<=}RK|%TE`8-yCjJB*cR8`HOnwOLx}26*I^RUxlzSiMca;@SgP(PO%rrB^ z)$aSdfGaPAOs)ILBf#D+;Jkan4M?ZvhroT^M@|I4*Zsf)-FKKy?it`FcWYnZ+RuTT zT~6dH>&wge#D4u8;D$lKV_lxrt;`<=+~)oQFBX-(PX(Uh&YTO}_fp_?m$rf``%`|F z`?HgPo2Xld`vUVFN<81aoVbN}vFj0!AYSGUARbA4lzRuJ%axPwMmj6qg~U@H2VUdy zSx`BZUv}5JPi=&JJN4P%{)zQ4(@9~>a(U9Ya#la!O>X)dz_VHQ)7_(o0ncd%e+!x? zf}WN94cg)!w2l8{k>#n(32eD~vc>Ty_F{7QNurM%FM;W(<4^3x{9lT2c?x?mDI$(P zu@_UYzZa8OmZz#>TabX{*dMQAI)}ynt+;2KOTmzbmlrnKt<>?SS0scw{`87Xj&6bD zPtPBgL3FPur zb-6$;PgTpTJa=jVJXI}oc3GaP&X8Lo%TqP|%WxaHT%M{Kz*ztkm*uH^T|WfK zAgb>U;`y_t(rf`cVprlS^?V3`s2VoJ^JmQ`<|oizJb%`Fs+j9jH3t=QeX7Q^csq;d z&l*dx)b?dTS`*asXHCf34wiWStO;9Vh`ByhQ>2*dQ#Hkwon3CMI&?`LiZ&vE`Cn-fZA#@l$}XVV47o=g*piMZS3ctVt^7 z`czGs#kV8z{8>}3nCnwDX-Tk_>r*w=RwXNj>r*wotZR|9c>b)Z72G(V(~T|Q)|_eG zflPYK`c&^hNZ0HwoqnVZ86R`~iO0G-UPj!(9L?KY`UA}k;fOy)XXhIsQpO9q57#N+W*bBuQx|p_U*5sp zLN4=B?g8aq3PzH#@4*kHr9aTz^jpY%4-&rtkmmCJf#%vDVbD9c@aG3bY^D(2d=KhA z{Raw2dt)36;`YVYkJ_rw5md{SfV%rbyjNWSmVy*<#?Gs$`93GWT^+k6h1*y>b z2%)|g)<^lEaHT@)5-E4Lz~f@>!YT_f2(E*CQ!_K=M&qfOw@^Iw0Cw%v=F4OcAzGdU8> zn*cE3{{jBVVrIiF z%*@vhNJAqoX675DVMU|7d{?ktE@tK%XFwz(qi0_3uDI4N+1)*&jBCxow>2gzi<$Yp z%--hL+Y(vK%r|!dyIjo7w_F9NpQiF7sI2X-YJR?K@8+-W;%wM zWW;_Xj_<`MU38-_=pYI*?0)brL*TGm0d4{q-VBK;IXt_}4s&QTmK9HiJ`#6q z5Z4Q}X8gDh263Ne-1Z)EhcWKPAZ|wxHy7F%#Ck+q!aZf?qmJ3itRSmFx ziAc~W9BN%S1?=5E`|5x_Uf9?A?E3=tRAKK0`@Kp$`joB3Lh>z-`2k!WW_d+tl(*#> zKfp%26ar9~mbd+YT0ej_6b}6w%h^VYjS?`Mu{|OMVby-v;;)8{I0|9x0K<3rLP3sx zWMkx;Z22dwU4LscZbPk@UCWS7%e5e1@vs*|(+r1d`>}5B_1O;w?7qU@@3XmEMQU=Y zu%GeSZwKtz!hX?bhmes-A5V7c-+gvfz&=T&4b(~_T4`v&9=(E^xIVl6OYBj3pDpQ% zq%nH#Jt)>ga#w6a9_Z32<(Qr1?zPMz7qe^cmf#ECX*1d+Sn7J$AS_mENE}}z$6kny zgP;#UVhQM`f!h)D3W@nW(BoEiVtMvTxoNHgJ>p&@$Am^50Py?0uILRpika>Z(Ul17 zE1Ax!LIcZk=?+QsF=i@jh&v?HKNT`LUt)$1Mc>|t=uM~}lvtN!$IrS5X>YYU5P$&? zWgXq|UHm&;(rg1)YhcJ^*1$&L_5~M>1lb=^hssbPqyl*i=2sN+6p@7c!68Gb{1PD% z$6xrp7QJO0jF2xCek-G`W7k?{F~r)rVFYE@RO1^r!N~zA0%#$JpbVlYh&ftWV^}U_ zVVzxW2TC?$X@6L^#KQlh#HO#8XzotqivJ{0P*!Jqdm$&YJ=+*EpS3zgiu=^tZN6I= z-ZUc&RHu|Q4#1Kc6Zmn${M0mA$~LUiermECO`Nm>j@ZL~RZig74D;8f*^5G0-~YAw zJj*+IH!Jdh8EOT8%6c~20eyv?oMBTuX@)xdWS^8|jmbsiKVgQb1yg!LQ<}S<`#axmCuciy%h4I7GPB52mo&iO^n z+{v=o7!C!Du_|Pp%*LlE<|4oG`SL}eB4SK-?kVs!dY7Y__V-9Nt-G%_{HhO~Ex|+yaZCKa=*~Le!*1hZ3 z{RY48%f3|i>=m9!FHIgxSIWsAt1x7S-YQ7J9TBu=Q-riBW<)9TQHXUoQ(EgIN*scQ z_(*#DtbMG)_sI;gj#Nl!W7g}enYSg31FD7zZOs0hVXGOo?ael0AO4$NmqBQb4AxGHf$OnNvcFg#1VC_ScMOzxN z$t~avod-QRg470gSFc$K;uo9$>GY$2a0&N4y0jClK z`k>ilEZ|6VmXw=A`7H(cd6Yi@k|WxTZh1b5zD@bV*h2h6G}O~=5RrE24K<`WrUT5U z04E8Dv+X2&4cO8+K@b|}a5l~`Hq3bl#ot0!EB`cc&Z4C3VTpDbX$@W?r?6t|3Eq(4TbOQWxYnKKlG>iK$y&W9> zdOxvjJ8nk)to7DXeq`q_Tes|Fu=umqSxe{OM&z&0oMlJ-5+Bj=vo=`EcHuvN77j%& zMfq&w^=EO_eK`m2*L^u|A1VhgS&x3*zML;_$q_r5MgLb?6tZ+n&S@x#^#+DFyAMZz zh>hY08*^SJd>>)qac>do9-Z-ox-n-Yp>E7s4p`h5J;dLQvjMc&)GUsD1XwuM%coq# zJ{s3pyav~G_$AcxP{ch3gdXcHNqiqzj`fx#nSdVaEphG!8y5dx0f!rG zVrqFvj~)A#hxAx)Ed3zj$+6y;S{_m%wLB!pdSh9NK)*Hk_bdD=s9$ibH|Bi^mK^Ji zRWn09)*GuK_K)?(Y8kCE65o~!AzZc?opTdJwZ`J-;wIx)BiUdR_gotR++Y(|%R^!$ zEv}Y_9B#0QtK}g%)*H{U$LO)%crCFW>y6hD>#^RrS{{;Py>YcXB*%K=YI#VG^~U>C zUXS(0)$))W>y3{jUyt?1TdA5J>y4}BAvx9?SIa|ktT(QfhvZmqd@Gw&kM+jSCe~xU z@$I!p2giDwkTjvxD30}hj%sQOX!Lt-u!*0?O49?qiBbCzDhGNKqn`%U1HFkc#Co7N zF_u^l^d`m;>w(_Hcw#-!o0veX2YM52#Co7NF_~Bo^d_be>w(_H3}WB%P||r4M8qD0 zt88dVmbIc}dZ5=CW1btvn%I-zIAg{3j2`H9#tESZdY$n?=z(5mf)IM3*J%?%5A-?{ zh0p`N&Lko9K(8~|%^VdY#oGrU!Z*-|~-d(3c%augS!!Ai^g5?V0rWtxvq=a&(CZU=px4=K za`4szz0PSOrU!bRGlb9sz0R3J=z(76EFttjud_u6J<#iHHGhG+)dRhbZ+S=#^g6!f zAvw_N>@qooaYGAh99x>vS>!;kbE(;cz9I*Do!#cIIXn$VZGQlON5x<8Pb?3)Rpf}} zq0(YPJGxJ`Y$A^p?q}rU!b< zWK;_d^p;nAj~Q?mOL>M+5A-VLE*9pm2YORp69!!#=uK6#QuIJ?szy|i1HGwUe75U> z-jqM^a;-1r54_yPl9FQRf!>r9Ll5+(hATQ*D?N`UiSb6N&XeZ)y^2 zK@aq%+LwZ_2YOR8c;o1S-qcK{DF=E}hm1jzdZ0HoYa*~7=uIu8h#u%oEh5$fy(zJt zs0Vsehm)@ddQ(e@^+0cGCDqXby{XOw)Y*f^xg7uf1HB`VO`J2Sxd8sqB|9ckCs3-E zY&p=29TOa};uk}96PW&iUhJ4yM-hL=1V!XPFLq1__IFGWi}k9sSg(>CA45Eyl<+`r zg>C)=3>h6OeCt(mptr)eUL^;5VJ4~r3IqpwD@?OLwtUEe-U{D(mDotA@U2&Q+%ZuR z5h=_ynB{0hkb?RLdMjd*u~@Ill!~I`plzm1Aa_h;$^~-AL`J4zV!bMp7A|*8WMmR1 z)~hlZa`ixOw*M{2OAhpA2k>bI#q~h%BjA^^6X;w}4)kU#&0m2XvG2fDs`<|VqN#tN zH~WeCJ+S0JZ}wBg+%S^$gSH zhKX#EVs4m#@k+^$8z!<5#oREFEwNazI4?Vbbo~Rp*{HRN>2kwFHYRd%pf{`5tKwMp zHTDH@V7=-V3iCj3Her!32YRzf#oREFEweb=l>@!ma>d**kyYzea-cU`ZQaR2bHhYd ztyjr`-mF@$(gVF5W3p#jha@m8{MQ4$*=<%GgsN8DhvlNm`PN@Rc<15eqH=-7&S!WF zNh}n?_U<6DNQj7+N1V#VLc~38-mY9CgzFVE|b);u<`-L++|R?PjDkw=u&BnRWRa@8cD803aP`k3Pl^JT&~5}>6H>uDrlzPg&B!l>TGR7{JU_&Qw9$4~BJ z6FvfuKIKTmthK%gUO03wPXF~`<(U($aOg#>{q^~f)Fe>Pk@|wvWKhq5>bsT+-(Yd< z3Wpy1Jvcu`{h2rVoR=ZfZ#=cR$zoIX8^_R_CA4oN`L|kpf`>!<8Fx83xBGDqF#W$W z{k=ZtDRP#QbC0zMYJ@}AGW{$$4~tCy7nnkO30r)vIniHv*o;TW03LfhAHaw|gA0+| zrE#N}!TnpP*bs?`VBdA&&k-{4Y$mTEgE1}-k}q;fah{3YA%KR&<#hUO^=n7`aQ~2Pl!B^zX?$Kt!=G>i-ADEOIO-z%syP1Jb<3dmP*uBP%! ztbAbV|Kl}?7ZQmrpSBro(9-O>8M{3O!x?Ny6f0Q>Z*h;XMwIRYx;F|Ik%F1ahO9Vg zvtgEqY&*k9#)LE%w%kN5OGWfb1ooXtx=ccgPBuyoR{dazR9aeecnl&VcK607B&g7G z5i`w+?8gWgc>o&DLg|LALk_tJ)vQ)O4?wDO?i=RhskAapOGy|Pm=Nl7^W#C>`j%Jt6ze!Sgi?JrL8z}ub=yA&+%*I*@ zVSZfSjJ3kk!DG)}@AEc-x6PM3S9#&h#wkX__eqqnNGM|MTylkn4-s)%K%Xj>TPUb}^rU^I3ci8Hl;5w&(gHcD)s#r9C$a zdCW4@)^LiSQp7e4AAuY047SOs5{}zZTJW0^x(=b*f}16@H!R$=oW|Ivi5kBo%@+sr z43QsuBQoGf+l77$^n@F!ePi*ygKfr$pW`O~KJK%Y3&?z15}AbWeywZ%h3zS*j&m7! zfEv7A#KB=R0$X0~ra$CI!qL^A<3wz=cAZW9IxL$%+J1q^{UqgslJdlUlF~s*sh^~x z7{krW(4-D+qnbpdtFAo;nk+-wo1lryK#3nIrY6@SP&HAyW(76bj~iDtQ5{BnjCA>l zTGP!*y5~W(wF#0e;hI9aIZ5|n1ZuiU527`q(Fgu5-ARA{Ooz8|an$2Ks~gU*VT zp4VwO~@IgpV;Una2g~zVkWSH-S`ONGm zz431%-R~TBf_Fux-z?(yR9<@2`bd3Jot#AI;rUD!O-e$N(AiJhl z1_SVKW%$1wmD#eB(SC2s?bHdnl=KS{eirB(+yH;HpND)c>1)|NUzYfPB3(2TH{2`sNQA@HiP7RP{7(|T3bfuJuS$AXke1^9 zS?KpjpNLwP+^1tkAY;Q{MA=I~PGt#i`?$^6f_`THB-{dW+I(D|LEv;U+m8hG0jT!l z0eT+?a4Ntmf^PwABe)3QGJ-1s?kBh&;5C9f0leb@9s*cE@Fc*c05hHi821J;rv(^V zkYU$28NBB{QC@$ahXHle;!m~vV0m#1+UGEIS%~YSZ{{jCK_AE6L~i&=oFRx#2kUW*CY z`n9;Trc1i!{N5*Yo{IUhQVU1Fji`PenE3=*;1F>KR_SK#W=i9&&}`0bkAgZ+NiJ(V zbeuA-Xf)+Gf)M~`5KIEN7+}sE0K*;8fj%}lh{qYTt$;90scWJb<$Z zE(Exb;Cle?5bOrXo&fNDfDr^&1I#D59^hhvTL4}pxE-L+defNn6x3#21Jp3xZ7c!2)kb`ZYFXF1pi{E}gmlt>Rk@Sp~ zU;e+cy!h2M#sA|%BEL<1bs_OB)J$O^aWq6C@WIH1MBY1mM<^^L&H@oEByI=x7ZRC3 zu#mV1Y%C<=QLhV$q`$O~cmWu3M!p?Cd>y_H|NMnSa%3SffBRhFRdxY(|1D1HxdlbKl{SXV*6tRi|mTxMU z83v|;i3_HJ8I7ibQ}~$Xn+opMDDkB=#e^5eblNu+tQxf=)kKdq#YB%a#YB%a#f1N9 zn}_xjJ=PQx^-L!)6-*qM3MLLr1rrCRf{6oD!Nh^7V5%0F3LX!BU@Dk0fvI5Pz*I0> zH!u}U9GD7DBOQNDkx*(BYl>W+Z47AK0$fu}oX1KFj0E3>P~S-K&j14>!Nh@)VB)|? zFmYfcm^d&JOdJ>qCJu}Q69-0uiFHjeIfK|=Q*@mDAaqs5HxgWrk`;^upN2J;z(_Cy z3PyrS6pRFuC>RMQQ7{rrqF^MLM8QZfiGq<}4iN<-!6XVsf=LvN1d}Kj38reb@H7bC zw*jTryNv{M-LzmNxUvX}^N|m`z-+jJkzf)9Bf%sJMuJHcj0BS?7zt*E1tY;E0wcl1 z1tY;Ex{U;11_ir~1mBBquz`_a;)0Q2mZM-Kn3?LDB8&t-4yl5X;8uhbj07{JU?jK$ zM8QZf#R^7(DONBNOtFHIV2Txt1XHYFB$#3aBf%6a7zw6W!ALO00wck!>A*-Z3s5i; zOrl^Um_)%yFvszNkzj@tj0BS?7zrj(FcM6nU?iAC!AS6f#le~)j097&f{|bn1tY;6 z!nmf$8pnbII!j|h3b8B1jdbxlz**A$t5U?jLP zs%whrYF0{MBv@3DHN|v~HN|v~HN~_)@N!KtErV@fB$#mnBf-RhkznG$NHB3=B$&9b z!!^Zpk2S?~k2S?~k2S?~k2S?~k2S?~k2S^gIF>3f5p!IZ*W zgINv%l!A5}31-H!rkL&ah?DL1h?DL1h?DL1h?DL1h?DL1h?5nMIDwJitB{v(B$$sG z=%8zg_kdr@PS9gbv9i*9lv>)?<0{qsJb-B0Z6tUHSb>pX!CX^>kzm1GQ-qOV_ME^- zaAC=~5g(W(t!^X1X|Mt#!M|X-TvLRRV8L8dgppuLmurfZ5yf0ngppttEY8arLAu>W zg4Z!!t|`JuFhv3*!E7B_Q@lNhgEhsgDC`>vCOAsw-~`ri9Ayl8OXj-d>_Ln zPDHzxWXryQd=g~84I5#UueT)Hn{RriOT5jTXf#O%gD^g7iY_yFsgQ(p;V%kFlrvg? zeySLU82XulNcshyDokgZCn;<)ghDE(nxhswA7~C$#l$UVTx6EDp z^)0i#FGTUz^&9^!Gn}A?zO#2*@RvNki*dP<|72XQNOs4Cdbp-3D%-;J)Z@D?_)Biz zX<@D?$9(K7a1jf0MU9jb3v)#+V+rY>rbw)%6fDf4EL8JqbRhd#;vN>}iZy{g4fni zK1%p+sfh~m^({4#p}4-KCbCP2F&s0TIQ0bL2XCpz^47RSmr8@2-2$i=~r*tpas;X0lHbT*L=c|+En~}VwIu(rT3uQz|cD_1Uia^!x zGc$~@6;w5NOLaVPQbW^nPBk;sw^XNw*ndlPY8kCE;%=Ld|MHgVp3|+7d#X z>h>dF-%?#QEhi3bTs0#kJ6~NjBP0%O+*YclZ>g@DmXn>Y?r5f?Z>g@D5t5y+?pC(0 zzNNZn6YE>5yL|!D@!wJjrAG0VIvmy08PK>J_?GIP$4ZOXMToBNs->eogN(eZmX3~N z(yZ^QrDKToUA1&9vA(O8jw9B0)zb0A`mS0!fmq*FOWTO`UA1&FvA(O8P9xTL)zTTn zzCpJ#rwByEJ_VY{yJ}h4F;KAT(S1;13skbsoCX1}?}NbJE^tlnBw))k_M;bh(m37J87O-D|6ow_p58-6@4kwPws%p{D}O*mm;VnHJqP@-_sj27(f5Iiy~U7^ zcyquh@g9Io)Ef->nD-($ac>Yf39lBCNpBALj<*GAy53)bOTEt_Q|A2y*K+R_q?7VG zaZP*Q$F;&63(1UkB~r+G^MNb9i@>i6)cy2C+$`RVX$G#l+o^6Hu9mlE2G!j#o$3xj zXxRHXu0>ueIK|#+kcoIna7w%;;HY;k_%ZKzaN^#XzzOdS;H38~u8y|=GOm{cF7-Z} zN_FpoOu6?vTvOgfxTd{(5L)4#fosN#LO$!Ak87p31e_{wBCzLu2e{h%2=X=F6S(&B zt_COPy#ZWn)Yw~446C50*Aa3Ty5`P;Do(2aFNkVObl9M z%y|(c_M{2fu_n8!k)w+xYn%{vjxLt0@j^s$*CP*Wf)MfCG0eA32scL;OV&goQaQR< zvL*?U&C$49sMl%gq@?GC2N+1L~``Ah$g8V{Ve%Jx(-{CeO!^FJu&N0k;)jguV7HOI?Rnwp#C6oUTInj%}Y>< z+^e9liIUjJ(a#cmfU+=lj((P`<&r6n7lJt2d>a4SbIVvUE6h!ZIxENN7)%5+q$4+v zM5i2coS&ngB`g|JY;lf$maH`*wk$_KOV+U>c2tgjmaOANY-NsqmaMfRwkAhEOV&CO zTbrYwC2PHiZOC0kVuOfn%+b%1b)txEk~%n9YWnoL&JBijiWFd1j((P`O+xI>{ey*8 zqAN!~OBSXj;O)uL&ysbTh+Ug|jB(Bo;)Wb257wDN+>)c8CF?99Zp+cnlC?#My>;}n zWNkICguuNy`dPBJiDvt94{w0jP9gT!(Q>P`%jENwpHNuius($RYUyXmy419gXaoH$ zS-Z`vkXWy6XwbNIxA_i;I+|s^N0KsfWAJU?x>xkKbEiFo821SgF=|iR2kL&4uZ}k3 z~=_a5I8qBw=} zEg_0iDBlvIIEC^pA&OI|bnovWG2KJ%TS644P=O^xbqZBcQHGZ@`QB5JA=K|Ziut{V z`Rn(djQ3-_@Nf@#rkX9N-+O#Zi1NM1w}dE8p?ph-P7h0n4!`&KmJr1$ly3=9oI?4Q z5XC8!ZwXPHLiv^u#VM3;2~ocH_?8eIwSq>0t@c;U03|5~4VT z%8X;F^m|XH?JP8ae(%XlB-ZaenMte#{oa#lKL>o>L!Ozz+gHE$_?8gq6e@Gb{YX;3 z_he@62iEUBz9mF)3gufu6sJ(WB}8!w3L%|@*5Rb|N4?>%1s0r4H=_8B6TvTKC(swH20DfED$UtoN9>`vN;R(l@MpsfSPVA2Ps}o~8t4?t`&2Q% z_jm^t^LvkHTI@Luw;^%Q5-gQX`=yfB1fzjYp}dgw1Exi%P+r)YN6ha%UXfyc@9~N) z$&cTAyoh3c@9|137A($7vFoP`%ZW6)=S8i5GA(}Z@nRy^K&Mci8r_Rui*k$!;=t(M z0N@6G@9`2A`3 zC{LV1dG{l)zFs@7{XB6B<*kQ&e{UFa9N>vlDDO2CbC4%ap*(R4<%v@$Pn<$|;uOjg zr%;|ah4R)TwH8mDLV4m8$`hwho;Zc_wm|>U9?imy^|nI8Hcy;FdEykx6Q@v~IEC`W zDU>Hpp*(R4<=qVVm7X|-^28~W$1NTkJaG!;iBl-A4Emqsnb3cu_cHR@Ybb=^<6O$JMPem191vf-L(iI>Vm0y57}@E)dUV(qu&z%-FDQf zubKj8d?c8c0APl3KK_Xvwdz~Q5j$$tKe`PN=J#-|D%er0so=&{Pwc39Vn@w85!zUW zI)$pKuSh{7+EJ@%cp4d~Mm2frtxln88k-@aPN8c0aIylYQ2a-BDdXsc_G5!@N=#Jj zsMYjk_V#Gd>J+M`c{{K;g{o<}08qcf)Qs2ys7|43MiQ%2sG13PL#E&qig6|H+W<=C zA`0}(dn$q=_IGhjiXF9HvtI$0FJrytXc1{gt=FN{-?yVy{j-@Ms%>VRtIVJqddacC z-n`Kq5w644@;=5jkI3cTMy$$6u5L17I6uUUBUjJJhEs&eXRd)y0mwej zfP6gyYzkJUa=mvm!WIltxjxL(a2`4wxUbgwgX19Ik2vBShv!wUKXKf7^aSt+EP%Lc zSpUGNmK!*a>BVz{pJIAz7;gw=4d)KxCQa{hsGJ-6EZ7lzxn#Uy*FfGcZu6(W-T*1C zg{$e^2$3%gYZ8cD>k9?RT4xUKLvJpJQ}0ZqZ+bLIZF#j)F+*4}UJjvQ@0;Kkd4B^g z_T~adyl)}2#IRlgtF|hPbgJzwNT;^?Ql@zlLJjY`kTkt(kh10N!ZqYw4UX+iM`+j^ zg=>+=PpZX+btThjT!Ofj)wO*-$A9O$TTP?3FOxHzHyGTH>e}+zvbH~`(GjNtY19s2 zv&0>KbE_S=0OGFmx{J7jremN=Nk^$2Y(OS!BwZwwsvXJ@hcA`2!%hb@oIBqK9)2A# zzC)b^-24=9#2K*;xaD2oxKm6#f|lA`bV%xG9m)KMTm>k-_!P*M%7qh1nd<+4?7azi zR8`t8x~HmCl1im2ge0V@GB6JTQY2wW7!nd7K)^tPAVfeJL_tLjLkkEfDB9SX78NyW zRBUNQn^sg*Y(cTbp%rIrC%Q$OcErCOP_e!5`>nN$Lh#)Gp69>k+`Fd&0!h*!!%E_Fwz!hC@@KJw{f5h? z;lc*-YY=<#3{!C?s6OXyOhf$NVRY^ZRHhys3?~5hNDRK*qQfKE2(-{D%o%< zDfJkoW|Qo(+qP(_#jaGo;moDflV~^Q6(oD?oO`uYt1IO-ob{A?W*4OHCD~)wL06y^ z%KhfUAApkn9#w2ttv-bEFdt!oJJSD{j~;}G&v5SNKZnWjGtj^BNSbWJ`5bUBDl{J_ znQrc}mB+?}#N26m>;pKQRFqC^7ck-Rbe8#~#(F=^ps$!a&`)^m7ybdqi+xe}W;ZX* z*pymjtiykt17596j4#?|FYgq>e9tzE z1n$STWV5$-7U;!LQ8N2x@cM{~@xc4Z9dUgn@=Ji1?tukugYfAe)0Q%|KezNCXkQkf z+Czz=m6;88^JcRQZq)4NEeK}#tBfrOR+b<#!ESCd%W%(I%WPaL34!etknP|I&z--> zW4@THE6aVdEaET)K8J7hee&C2>t*sb+&QJnSjA+u{xgD%`JP#(I9p(K-=3!kz7U!4 z5pl`5%RJ1ur1OCDQ;xaL!_Q0=zz4jFz8W}nSuMtZPCEsi4sol+iG4)wZ#>NA;vqW# zUn8*9(pcN>g&9(ErkCsFcRv33#SD0!Rsb%I|*yaTmfFZdsU7k~aV@QohU zL|nC3d~-R_8^lDbrD4!*cynN)`Lb=cdM*iLwsk*fA0ntx@dXU80hgZs%)K51=-|vK zM11(M&o_XD79;k2-_`{UIcQ?k@)plzBc^xoBi+`v|8%$FVkwNH%bpc z-$CfRD;~X3dIYquK-(3kiT1HZ>2jp%pUBJC;~b;^de96M0TSe~?}fpvg~O58!&mJ> z9xwKo_aaBCrIZ#+DOF3=SRz%UTI$78fd|52-Gx%jG3j5Hc`k#p*axgRD?HRvvk^Zr z+55d*2m|>M(^PP5W(@?FdsZP(%_R^l)`AZJ#sN(97{-W^I>3`hX~qa8c#-Gj1ftIw zkFNmoPDt5NoJJ~?QVHn(INImiTVX(+q+qMB%4kL=n5_#6+-9dZPoa{iW|!w-vpYas znq8hWJI@7fv&)y<>I7UhyZmFDUB2g-W>=Wd>=Ybtb}p)$T}RdIq?vURYikgPYG$1U zKOMMgW?kH7RwAC(6uJuResj*}>bi(O0KE2^kCEDLf*U0=R&@8AkF@`Tx*pyEW)Ba? zXLCvgo9G^7(7|p%i#%QPbrbb4$4bfZqe2Y=8I_8){t!rPIO7xvyX}oqf3j*gOX4(X zGH)JKO$H4EO@;?(O6wuXHuH>@WNV?nwWDojk!mw+c5E_i9%wQT*Hw$WQ`RX3QwvuQk>DobeSH zY=ToX16k4EhX#9G6C95jio?p+r{p$dbB2`67Gxyq9I7RUB~|S*q}t^m?^SP~A=PdW z@j1I7+Rnp~Wh(J2Sd0o^27EMYd2gf&DdGVWWGMbkWH0nDvjH)maVz9^I~<^wCsi56 zCS!i4Bm4!*=(^kC=-NunuQI0HGLSt=Tt-`k?;|dw^wToNeFJ>JmsF*2j6?n4*6#|7ls2CSfvHNsW0#5rQ$St;^0HqF zw;TejBENOR)l0amL4LIlu4oprJCHEG2D@@_XB;Tj@kwfbFTH!8OIWIhY?kUe4~7a8 zXe-;anq4T)bI3o{%^kAY&GlalT)MeKHfI;N6PMY=mo{e?F9ILHg%a~ioAr&ei?6BK zMV;auoCo~NR+G58lEY8L(Jv6V_|;v&ztZgbVyQtc+NdTRhiy(cis#=9$scVsftXTU zMZN#lXj4gl>iJ3Z*h^4*USvFm)SfKjr|to6ISgG2Tx!sMudYEG9J{lwK@DK`KM00f zgNC3_V>bCw+EU$eok9w8c5()Um8t@ldy6yPRdpd%bqB*$H59@XsHFozL!KFCrL%y- zV?p~3Rh8~T$*eg6Uv#`nRgYVXf0(7z zVb%i;to8LugU9|%lJOPDtkh??@w$yo+gw7-geMJx^zVgksx#JwJ4%HSg5nXepuPU9u$3Mkk#!Zr3m4Ws|fq+c-WI{ zZtB>Lu&NqQ(Dim<@jY#joT$-eR0Qm+M=+#P_01EI(US2C5X-Z-K)AQW@~Km0ERUw4;nk`%2MJ=;;wpxl!F-WnkHW)u zrKJ#Ht?F{T0BWGozZQJfr+8r0CCn(<-1?le6LIB8zP<*lRlZ(Dt7UeQBZ)r~R*gOY z_OH5&7WFENo)^y3(`uLnI;X35L0db~wj-{Mr^S@EcB1WCYI`A38(*JATi3=!ZPRF5 zK(uX&YwHCQl(v9q+eK~L61DNgUbKDHGf`VHt5&jTTOZfP1SxIFqU|$kYfaR~4*;TV z^)a@+&6IvC-mNPkUWdFiTlZ5NFJSj?=*p9>_bTV@De#UlSeO z9TDg?Th~*E6yZ}+D0$dQaMI$_7EqGIvpGS!ff|hP3EhC?b9Ecoe-eGccmm&w z+w>=~X$6kD{B}_`pUQlR%Hnn3PE;Zb#&bSi^NSL7{fma(WpQS>6Ve5eYcJC<$+f#A*Y1U~F=t9oO0H;dL(NC6cBMzz4mL zF#MCsa+&oJVjFx2Gz>F}IP3_p34T-$^~J4}j2F?QpM)rCjG{`1LXIJ|=`Gbc$9eEY z1NR(W^sD9wS4L-+PgtFNVCr@?f}_QmKT8|!R5^C0r0sq;ZD&f_UX7=1zNGD^(ww^1&3}QmI2eKrlCj7&ZE=V&xbk`Ou15sip_ZA)sos;zXD08azgK14iSuyAZCA zwE$s?5s%r*X@6gC8~}APYET8jl&%7sGpZ-RlspcXjm8n`E-EzO|3VWBD+#Sm5L*@B4sHJ=Ti7?yC%75GR&clXlzGl7*3hA>~> zu7{|kZaY$E^sfi`dxSpvg>o&ykp~*P*SXIV6NgUtNR2=^hPCsZZmONCrIjKax zIUO{&LB3vF@K4ziHH#L!235460~Cn`f2IYc2SKI<0~A?i;&EF_9c}h_H_&}zcI2qp z5`dF#V_cvOcE2VYNzC6Mz(8cd8)CqSfs#A>goj#qkkxg!Yz8r3f@HOf^}A(bTeZ0D zQt%{t(cf)yU9ehQ=szuCjK+J}mPez|aF!3hX6s#;bdQl!7o$ziaBpV@%$tqxL}N|z zh>wJ_I*G$;Gvuw6doknsI);qJ=f6`$^-jnY@0$sgY73y%GIONV85f;hA|D86NK)Qo z#!}U@_&pbjkg@VLhBQ{@^@0DMWfKOR8!Q8GiGBCiTfN{T98(Ng#j8~=2K zDNh|^VB?dHk%CgFq$)YQ^xTU`_{ZjAPBL%q2k+B#f^IgR@L#WeYIfi>U@7ybs_qy*LLx*jGjjYZ*a5SQ=o3O83_p705> zp%~@`XYfL$Xy~!J#aPe;-9#5Qw zyhU&tKQWnqC78V$uhmrHsSvyQH4Y1EJ6YA`o0c(UHKTgQjf#~C_fR2>GXEJy)e~B# zg;T(JmP#9ds_330+H36D$l>R?bJlLzzH<805}{$Vp(`_A`UzH-zX#G>gerdpz=Z%* zUFEQr4+=Asuj3q9+2!~umC;-z2TzRF@9SV0GmQCYbGh4Ksy!LOXR?=da@olmGkEmO zk!^A|zh<7s<7bYX-kHf9azcY4WlU_%Mqt&0+HCBTFna|421|Y7S+!`-x$?egGc{7< zL111~%SP{9`AlaFKY14u8YT6u#U0#}_}&4=WZE=w`DjReAVa#Hj6On1eqd3b zG4U=8;MS`mYIlosU)9`SVX9=kD8sfrBF=qLb5C6h?hEo3V6!(;nqSb|lQ18#o>$z} zaqjb)`}fqn{Neom*RdG=kC(n zk&Jhz;%1|2E1P#}?&s9}gyNRPxld^BUF1HlxD9dc5i;%x;GJ@;%^7-{M*kQ~uP>6i2P1c+*+6;q_b*D8a36oAf)^K~y6K7%4ipSb- z&*`}n`GluqvNPu*R31Lo3Tw_JRDM3zR(sA^(D+yn*mK-_Q#|wSxdWcSbPrGd(77Yd z#=<0?{1J2CUSJq}@`ug&9&Ln=)nv`(-I;vszs;eKJ3d$|o6C#M`E*K~JLqN%;ds(J z&#gzVz$d-y9A0+D$8(lF_a;QfC%wyDPCxjhbepsLPxzRK$65_jN5ND))+P3w?ueO> zb&ECU8&oSk9ew894fmiN@uc*g%j?Sdq~y%qag|~4N$EVd6%~?C=j^#PYccD=lTtr- zE4nW}oqEjuEo|V^B``O-1m||}bVfY05W1Yma zu_w6TCFz$gc<~%}EY_2;44U<^SX-Tlwcf*0h$m|U8NQ_Hs1{xvj`hgl*rc04^)4#u zXL!0Wq#Ta*l%ct!uS-TSal#%y9Q!_XsKc>I`v|MUu|9`L(kBeX1Fzo6C_;70)q9HQ z;sICh8Ph4{hXHcH)qCbbO7%ut@t%D-!Oh4W@3o}L)h@nNYK)(C9fN>AXBvJ}{U(0T zz=Pe6uOLuzunCAd>za~wJ>Yas{Zj%|pw7Ccq;p0Ok4#vcRvwv%ALEg!6$C#6@4|yq z&=29Ccw|a>h!mW4O>LKh*ksdKY9?(k(hD)?Pi_AVK;@As72eHZryTE0&8E0I>zbO= zgD|$DlTSGFc?9}Ndt@q4AjnzQ)P65R&QE$h9wd}kyQG$m0Frpt)t}&zDJ}S0aOJFP zTIfM&SEi;&kZbxmtePa|^H73Xq~3T2CsoOMmhp$JSp8~);El>5Tl5%m}PKYEj@)iA>+}5(v{rk(_l6B;4{6h>DQh z@)Ah!$P~z@)#{d)fOZT*k4%9=($!hlK!Qi6fcP#^9+?6Ox4Z-rZg~kvJy#x?0t2W= zd1ML+>&ned zWiE~;z_YG_%b96D=S!HO&bp=#;yo*J)-}ES9f0brYkCD?b=Ea~FkyApHGK$Sb=Ea~ zC}DNhHGLRib=Eb#lCV1KnqEy;RBf_Hj6``@GE^f-H2NaLj1VL*%EOYO zk%Ht$c~~+uN=z#-{0!O*E2TQ+8+kk|8LBl|7)hi@HR6wQUu$TbaDq|31>yz-#+n)B99kpo^YIF);jAd%AwwsLRJM`F z!;+zTb1jq>96`X@X6R(|cX-c;egG`gB(M?XVad>`CXIHYJS-WSE|GFaKakVRSMaYk z%EOYOS!OMQ)tSQRFk|BMEO_YZvL-R#! zc9e%DLkmP~UX+I=L;4PzC=W}9&K0qRQ682IEflflC=W}9^c^;m2a6=9m*?ZKWN5J@ zU_+F90Pr%yY~L8=4gig`MtN8gH?DJ(YK!u)WN4X)ZHjVtNN9y1o1@$s61qr`Em0np z46PJoYm|p2L#qVYme0eIq1EOVn7%#A!;&HGZz{^ek|BMEO+GiOgf^J$pm|u5Iqq}V z2j%gwWav7x9sU(^ojA17ydTOs$~i}A=AEpsK=|czju@hhpCEzJlY-)zDkGN^x$UN1 z5klWlxM2UgxhX16K=c7?8?cEI;ohM;F&7(7|&Ggv)UK| zJyW&MCa6v-Dwrn~8NWKIm=zw9iZK!Smla|5sgsIXQ4R!-oK(z8@JyAZ2OyqQ%+do8 zPby|5c&5tg#IVXURaU}nH(3d{-DH(gMtP>n(gP4ZQ)TG^h$j`Z2JVE6y6q-w5arcv zH(3dusj?D0Q)MN1rpg+^RH>7SS(PWDXw*r?tSZ9lq+-@^=7Kt@m{mIobahfOYc!jf zI;og-^tPLAaX+CtshD*#O;et!vL+K&o~g2A`lmcoWhLBplQoSp$}?5g zY?`A^DrU{eg*j~~oZsQUKB-uZX#AXEP6wcSIytGBbq=LEkzB}=icWiJ3I3ZPyB5SW zqmU;Roow?$itwZ&=8tTLg*>U~G%1)T6`fNB7SB}K$}<&Xd>P@?Jk2&b`*R%A^6P#y zN8ff6uKs z=($W`7-G5KnQb5y@}y$!_X_?T(dQmfFi$GxnigwLAt&IumcUZHL(;UaVMZZOD(2c& zZ;%RELvuaW->8=-6?44`=1IleBunDsNyS{Bf_YLgH`!vs{QSAr)eG-pJgJzQVy&fK zo>a_D6}dv5RLs@4-Q0uzT08I&&&xML$LA^X_ei>xW=On&jCVj)i|=B}~& zK&Y#nRAi{|;AhYq{r5@5|30bsUwl%r8xQv6yo}1_bIwEs?#|Cf=3lt6%kYQr*$HjI zY`r!E@3gYD>@Ozaz$Nfj_SSPE$v&ir_}JTlzbGNc0PiU~W?wXKg8YrZd&!R2z29fe;4J z^`KQFQ1NO2Cj*GN68)~%6r9`Wj8KmQeFj13k-izUfuQXH?d_wqvRcqy1+An}13xIH z$37=m1M*Ce-v>V(NpbZwgZ2q%of2qQgZ2$*Lo{s(q-ABgq!kfJw(|Ti2j>d^Ch{tm*V)0N#U*LP}yvKzgeGNWeh6~RvC>Dn3Rdve!eT2b7Uf6 zwM?m!#T*xH>c0S@9Z^22Lcn!DQc=ncqqU`K!zlha=0N;n!{}7}^P4gJVxxXN{$blF z;u*Fd8NU$meaZNOG-#b0U!^Y*Z7TT`qO7FXLlkj(Y%jN%mKZR*56s}vS=On3VoAMN z(rA=Kz-Fjd-B2|M<<`p1V3s57KNOSgqpS|J)g53`U$|T{HXxBwh1Qrk_`F*j25kf~ zuQ&+c6aYrw0}$Q{F=?I=vp>bY0_|*aOLoHQk%(dp$ZpeFrENM*(LDC5-Au`PkS9WP zsY~80Z#`fP0@|_S>Nku+;>|Z|v23jYp z_JA+iP{a#a1rOlV+y>;3*?LC~7IUTZT*$ujV&vOEX*UbmZgMXJDh+2L8_oovs;!*Q z#<7lQ!BbFk0nt{XpR$@aGdg1(&<^A-ViU;&S}i^6Vp`Bl?n@M2LiD#lYoskaJ)*4# z-UPC-<)#M%UtWvA&w*VsI8EhW6g*ZUDFw6AD47BVyRjj{sJB!hvHzQhvtc;!0RA7r zpMDIVH}t4u17+_(U}a>CEEb7_`Y%ZAsm-yifH&m-(qeU>-5tMqhvP)5h4qP z#6neFx=1l$Wv_wH=2CVD!21v^I}Cs)?@EG51k*fG2UU4;G|eRgb&Fo61aQI>MxMxs zS_pm%O;^P=8T}hUV^Uz0$5!VaMssP%95)3uYdtc?Y^7nUW{qRbiXaOIN5kYaHx)KbXV{`){%pPtEs|_jeI@_AMR{Z5U&f|2;6P5SXR>_Ns88f;C9RiPum z6DqeRyv241o`Z6>k}gJ(T53Vg`v4Sqx{QFBm)>eU zJ*NV+9SNsb1x@cwc#-rTvhm};PAR_u6ia#8^?pr8hN$2IqBrYN%BTfIC8v=}=eSA37ZBuHVbWxNxb@N_Zqg|t%eBI!Gky)K z6E(r2Gu)&zH&Kdfg-K`Q8;jxPT4B<)LhTBxeQC7D_w-QHNcPteEPx>?sp#9?6-3)P z59(}(3*)JBNyBddr5Qf1Af^WKh7tFc`zOG%g6I!Wf$J^zO_1R&_Xhk6G7jP)0`ddZ zPl4cP;DdOuWcM!q`EG?F{)b2rZ@I$|oA#EQ0h(GtOj9nz(`P_7EsJ#5TQ0?2Z@F9u zy5z^jrDFRbB;NSOnvS_Nif|wr8N93}C zm>yw-uD4vmac{W{MsK-eDa)mc;M$`W1uxYWX>YlMQTesETxC%$v<9QfBIPZYbf5N? zOIWQS1`7zg-f{`M-f{`M-f{`66~tf|2PNs|Np@Itv2_2R{sA}7G_md z>1v9zw*S2M+o$dQI%LGSV$G6*=3U-K?SFnRH3bf-}B2J!md`rZarybuC@#ksBw?u+@ zFYbbZ@nS?~p6rKINc#e;hsu5!tpJK z*2X;T_?BW*^0ebyDrm~nj&CV8Gfz9drP%B|?f8~r^YXOgTZ%2n<615p-%@O0o_2go zvF1GO_?BWzB@Y&v%<1I?%JD4|upy6Yxi|(wWMdxJay8PLrybvNzR;GZ9p6%HQy#x- zS}P>X<~)AXgyUOsw&Zaw7mjaj9+SLV3wa5Tu*j&FB^(vhFo;P`eHly#D|TbjYI9b z5LP!1weQL~rt5*0^c?MhmT<&yJNKP@nc;#JHo7V zJFyM(a1aVWc#uv*v6 z*3$y6>t^d|f$~865oFZ5ZZ?mR>vi31JuOfkXh|QeJ%!j|iSHWjezftDg_T{n9&VYRNCEmL*1uA4oT zbamrU_B6t3T{n9+&2c@@zKQH_L*dMVS+cHcJE&QPpRXig0J_8TKEjMThfX{%JkYYy`HZNn>%s%=R}92;U3j1+OLfHX zK&t|2544oROqfwR=;b7#Nk&I1fd^Vf?7JL&WNwHp-!}w5xfuc~53~X*53~aAL`LSe z7m(|^x$14V?_BgnS19KVvy z_W{r|On$Sb2ij9X>Zm=?3j8^uhX-1LxvmQjw5&NDxvmQjw1g$Izjt*FGdgMyv>#I! z*LC56_7=k01FgW?1Fh)Q9%u#D9%z{`KYu2os)&s?x;UmH#TpJ$N9}=@A|15{T9%Ig zdHh`JhJgp##T3>aXi4ulj)n&;fw`^=541@jb<`ec1?IXgJkU~MN9}=j1rx13(C#Ij z>$>njOIY1F#Ciu0wC#iV_ZSoyC-6YqQ6@EOtWRKxn!DM#%Nbz8pBZ5G9(>FS-|`H4 z^6+PX?eHUjo$zH(;q^W|@M->fck}m3{CdM>kVy)k4Vk3yHc))wh0v31bdx1x8e|WC zKLd*Y+qvz3JGcF>b#B|8OU7CMMCG!bu4o%Qxar>vB}pUfS!FCha|Y)@Gm3?*^8`6=-^yC9m86a+u*3gF_dN#TQl_j(y0lgv!fJQaA6e4TEe#C}jN zsxq?#hPRGBvU;2?qJ4iHiS8ekV4{TMVM({N!%&COP^}LJm&u^CCH;5$x{KI-) z6EldDGTWiSJ@`4)EcG&*nmSh*TRlKqZ-pT$n@YXRri+;klFU*sLuFu}U(cTG9Ll_u zT}FH?x&w{h2)tCXwZCY_B5UbW%rzHvO4%dCQD5nvTY(PnE`woKi@)@GbQ?ff1XfG1 zbbcb5+3V3W!5t);A4N>6KotHR@$6dg%e|aopRyjftj$&kekt%ibI-&Y^I$J0D7|F~ zcZk6Br6X$#L%m-jD3%&}J&umf940Y6i;zWGG(_QLvhZ3d`GIUL+cy&|g__e;J%XPDsw)Sv$k%HwBYxM*A@my>ugkEWu^b|K2v7V%Sl0JWRF$o$ zWIiC~SZ^DG7C!`9H+~cCdn($(ZkIdW`y#pLfL0D}$qQig5M5lhgLEZ02SJq9G{O5R zr6+(kj=Bbt`zg5Hdm*L`-geoVI}_YNhqNvg zAWEv|dH?Pz4O~S7nd<$nu0`H`0fxb)kVgRiVJGeT_NJx z_`F^N{$SRGE4-aLK-HC??V^U&0A3@o2*5u8#2O)5fl2#&h?2cuf;zZvvujWvXG5eC zv3;#XJoaIS=FrQnS_4q~ymM(4~a0_D-N#%#ZJxp7mh3RZt4! zLU2gLe916>>%E53*MpXJHEjPifC2y|t&mvK?bz6v4gGZf`?~4)HhG_P<11mnAQ(D6 z<@r>~cN3_7M);WbKPb*RKat{FkBU2Rl!~mAot#Ey&f$nM?UvFx=!w>tyX& z=t}SQ4y81;{|eGdSDVXy-MhfmwVt{*C+J#?*i`!iaUrY9LGR73u16?+_^7le`P-v4 zaTWRtG1ZgwysQ2z23QA%YwBXmWMk|m*fV_&F)62v3GO;u5XL&y}QzOHhbFF#U)Df7T(aTJOz0RJ#z&5jvn+7$5KLy6dRsom|fZmCbQBKQJ?0ku>2X!H+ zV{~w;WE*5AoS|qQd#z-Gs(8D>q&=4&AD>xpqf|<*x%F|u_mw|MZeSics90$VHSza4(Ku=#ng>ZQXYGwDq00@1oS%ecGGuZ(T)~gT zAaH(a^x(p|`Mrlo1Z}wz|IJp8C2F$zy@!+4!WK+MWm5IMhdPH7m&xl79!_3o0#{SW zA4Stez>B7%qci{QITw62o%~67_k$NJMO19&beqduZN}WD7BsdKh3ihoC~w#UH6Ke* z^G1jdmZ|2)9!@nY!~>>cR`Bbp7Bq(ZjS#F~TG3Drtso4{wKn5y_5d!U}~Av0pzH1j-{*^tC8W)H~g5ax#Cb$aY| z6WC+py~T*_)4?BdgFkMm-kiD*YUW>DrqX>x>;C#gy6J{e>kbwwyE6(UT^@UHg6_^> z(!g@X)SaCqTJ4C_N(O2rlU*erB`B%WN>-jo3Ee1bB{Q{>R#(Z91SRXh+yG1V9IpgZ zXJ}CGZw9k#lUDS;tEhYyb9+6!8FmJyO-qd>MyyA7eA8|R zppO7*qGpu5qk~9GWfW?BMJv3259-#fQg`Z63`GX3EE|ZbvbRc=O}WOcvP!Z$acPxp zQY%LTSGDwZskCPSS8q*sh-Ry$IW|)l@?R4g+5|d9K&`~TiOiRl1x86TvXv6D*EMWI3O*ROZk4ufLF_Oz zx1r3=hF-?ZdV@Fi+fl4WETT=nE|ICmd5_)WB&nagm!M=I1h+s-T!Rwg9LDHzDlN#A z7=apXCeT*SYE({VN;+_?4mh_>E4(l8vg@CLXqL9MPIYP7f=&ZlB~9Ts5}!_Sg+E37 z9pX8n{!^-3N4$epSKrI|GtgW?J6;R%&zOs0!Rvrm?!=7y;x5=`*q@AI(SyOZ*Xu-M zlH02pu7Y?!33n^;eT=3=_>Tiu^`TTpJ4L;mmwD97dDAfL{Od2gcNphB#L1r!z|rZSS{xwiF0AJxmn_^ ziO0(qGZpV}S0jZ`ISR=T|DlB|)g>+#30PqQsA7!)g}U zy?Jh?U(nq(qFIcX9XCQrt_41npRSrE&fn379kgMwYeUI?DC6Y%7oxqY3euGl?Q2m? zY$fe{9am|ulxUxUUey5&7s(HaOFvvKc!!OMSNgLW!8yGVCs-o{odR}WewvsKTjW)I zn$xWZ-d*`=;zls#)5LuQ_-W!z042>3bw5o=x2@VLDlR7IFqG}E20B=Kb+@kC;UO^p z3g#5eWaY|5}$nK@a?k5qKb&Y?Tit#-@7?4&3W>;FmOi zDVv+syb?1uaF~_<{8>m$5OkOyHHRJEHXTnqMMvW>dVD+r#q_z&)^CKXjMprntrz!k zi|KQFIhx$Z$he-9Sm%_a4?7aoN6$mTw_Dm)svi1Fn?1DMvT3C%#{Uq_T`6D9diXCJ zDFc7=%Cg>11OH0+cFUHPYMT1B;MYKYxa{=r<5a?`%B4u`_}UD2AWKtW_9Zo>a4 zI3>+c!rqz1oRB^o{J@MHqZi$*A&yujW!FwCd+a#VvK^7x<(0j?5XUzVy&7y z%_V;ZlkMgB~s>VT_i zk*n%*SJhoqHSai8^2Q>aR}pxee$W^3(Q*~O-Lg>?L@NqnIpkQp^pguY93k|n3BH;W z@WpEjM0}%B*?+D|GGh~z?1n@pB%RX{wS^6%t19!Z^wU> z?xR9_e8sHTH&X=J?NrE$%>B}(RGhmT^!sgwEfUwN+w5E);CD!WP!tzU{59Z*q>Cv! z!U!L>xlgEQA7!>HnFza`M+C-)2lhri?j-wqA^CDKsDWm-Za}}#Q;fM@jC>UN-}5E* zVM=lzaf$GHn^V7Uh>KwxCDP1R6W5ne^G2Jxunrb0g7%)sn@var^G9l-$A0p&YGis1 zm}Ou-ubDEtk|AiKOxGI3^4f=E>0U%QhhI>zMcdV2)m(iUW8h9<#MC z`V%!xxWMLTnSRJiH6>J%4aC>%k&v8NGz0IAm!L&>$}-RNdnBV=Jgk~1Awd7sez&yDJ`jlc0E}9JU>QDcYyqujhy(7#nVB89nP%MGj{ee z%AgKn&@4tM1}Vuk#HDF;koJ0K+<>q)pt;2V%LdFI4a zTgRe2l>tYrbAzcXCN(4&HiHl)slKM?s}ZrIMUSTxM&(=T|7>a^hmb-D1Ln zz*P}!af_f=Ek7+N^lxDI;=vp9UW-xL`2NwWjxGK^Yaj}s2zaa**09L_eWHw$Igr%i zl6uH-#6#wK?EaFS>becv@p+J^r>uqE>&1*FWXfPkAYbcL0nEfMw4#;sG59}}0C*Ck?I>TRxdzdF{s3nlmfuw$j#y808n)OqY{6RfL+ z=&!`O_gEh%i_Qb>+`Qv!p|WnWs2>CMD({r!eB$zoJ6Wt-AGhw5W38Ji!MD@8!_dyW z`~1Y#H5~0U2Kiy#TCwhK=G_3%xjAkfKNl+N28jCS?$=O#f`WZReUxU8HfS$ITg13Y_%+qezNH{y97WgGX`pLddr@Bp^*s-= z1-7@)u^5*CFO%LRTdXlB=nr^;JxXKNLmA&4>I77? z<$Dmv*J@iS;z4*=vn_7T*CzYDeY8emSCZcmmx1_eld`#YxOw%hXu?pe8o^-+J`!vu z;+HyFveZz_E|w#Ek7sGtTcWHso=Myfpi1y9(R&K?DzlX2g~Vl5Qh>_gTB;|It%1T-#-&M}h8PcStOy>$p@8_dOmZO`Mvc1q`Q5gL{ z%~50A5^#FGYhV?tMb0(+1L7rz!HjpZ<($zP1DRFZK=01Co2Sk5DzKLN3~0rV;pYd0 zD*gk2&UfMknj&Lg1}3ld#h7(rXf(|6=C_DU-mV5fOx~`>65!iaGk}sxh`Qf%5~j@Z zN>m3P-vm<;FJr`xO7^ni_(~4r=DpE>o?09R``B(nrVZv|D!I z4b{k2>(#L!0BZMRD1&_-d#qluqxJ$Y`K`3KVyf;z8E>~d0X5wra5MU**g&nO!Bulw zf|@!oIT8HT@oG>Nr4`p8x3!AvTop?aR4mZUdtIhV=Tc36&Lv-w5N4fb{>^2oFgrlz zm}m_-u0-sX$C0Sr5a0@b>@}^RyOQ+SHz#QS3QP`OqfeyfPf&9N0#m5QudDmHu9^oD z)C>fZ)4;2aS0i8QYjxl)Zs2DV0#DJ*r(CAa6_6)G=LaX!S%caxYW0S8tIk>qgNdvy{h^SI7(o65nx!aIS;QCHRuV= z*5oR;i}s3=%g|A%@xd#K9stfR+A9j)Cs+F9B*A|K-s=d5++@MSze8s!?^h`%XL{T# zDz8_my6>D)CNDdF-NEA%^&SLH6K)LxtFAR5_{GGrdZn;7V59#q%|C=;RYVABaCOxpqW~vWVr^|Nu%#G#t%jy^Ol^B*hVQ|x~JE`!-ed&;I&G| z8z_%@8LivYU_E7m?54Pl*jHdqkk!)L`RO9#E}*hbdP!}r#O;B!;a z-%b#o`d4ZFChBv%IN~1+|u3brBoZ52#O*rR|7Zhu^!6Wfg;!167S>HBn5wRb#oB*eoz%8E(2j z{uoo+6@LUY z`EInvw*hnmFlH}+;-~R5g5*a5Oa)L)`4L|NTM8`Z!@J0X7*HR9Im}_T#P2JIXD@Je zf^(G0&$#pmhQE{Plg1p!B&~`ki596OjboDTgMO8yaZJ(+L?ub%nWXQCezY4}#xqIT z_vj?8fx5#zK(3c0m4PlvY5;IFN#~KwBwY%in(~sQO~7KCpn*wR5B5>xeVyP+37lU{ zQqvu*OP!e{ljj_!eo{%CDVh2Kv%WK{!c-}v&P>o$NlX_eW~zK{>cWJadI8Q*o81`9 zXrj*~C--fDb_djfQ`E&jtTjfHy7-6Rm~HNXo~kbXq3kK@;-4-6jq;(lLSVMZ2yLEK z78+F%U^g>>Sr9iCT05lXW>H?p6D)fy6XtZca}ZrH$5 z{9CXDgvWZ$oX#6e`B<-+)2rLy{SuG$o;lrht`zl|(_c6fRS-{fi#5IHPAstCi6%SK zt8*ZaC%W03p7uvQgj&i6KFntX5Ivvh9n)31drA1lY2u?amXpOlgru9K;PG~;j~YO^u?GyE!F zPMx2Hh-Da8_crA3u7CX}uX*t$Ui0FuM_^m|XtL;|=|p$EtfGu^1EueJ(HFeXKa;xP z#d|Ge#6Od#3&sD37rc1UIN)aNJ^bohUc7G-R!*fXI+gN@7N0}9_iOxE%C*zS1eHIh zp#)cVF^!}ts|a3v87w$@4NTG*vq1G0nP4f`PMisP2NPFLoruc?Fv+QmA$|eOY>4=r zMfgqi7vgs{9(@5!N^mg{bpcFj+8+Un`=-=<60*-{t45Etjx@&nZm zf#7H0xACMI-o5xI7r>-GL<-zD`P=nF(Te*feF%Q zP5zu}!Z-;|KH*Ge_fK%&)CK<=69{qvjKAL}kn@v%79M>8jK6dS5PboR^4XLYybUCM z>kE1?ZC_f(qX1o>O=<1v<>~~tzKD>%^@Sp^Z#n+`9Z!~22P2zKCfd@%NvMVT))z+T z-ugl~e(MW^@z$3T%F;ziVC_+h0+(uw#Aj0=+}VN9niL2fbL)$;XkZfP|J!bTp=tk5 zZhc{qy0^X%c5i(tg`QeNu4y7DISQXm8OWX*7e~EUx4tmb-1}Z$16SYo@*zO?z8Avo zeJ_OF`(6mU_q`By?|UKa-uFV-z3+vvd*2IT_r4dx@%vuh2jX*1!mqyXr4A{}UHm+# zp;%Im2irIJWir$+iJg@Z=89gZL=axDa0mf&#q*9`VeX;y^9XMb#$~CLrso}dh#*dw zo_Fk_g80Jpykid-E#vUa5)!7x4V*j0jLhUt079xg~u_zWV|CVQ1gn4Wj+8bP9A zdfu@|2$C13=N)^bAo*c>-myoCX$6L#LHEH*DWiNNLeD#Pt(gZ>u6W+D$Cz`yFr3xe z9&56gjVL|uXv7Kggr{969AB88cQoP;bEVB5C!ApT#a%$gixHV&e(2Ch`zUt!X*es) z&(QWsB9(1K{)UES*P91mP2Lg2JlnKSHa$L=^8qlsNnj&P&pY<1Cez`B>3Ij&AxeD= z!&t*UO)mMY4b$_EJW+a%KysKHNY=-=Y$x=NswU9^t^-Z1B`TGn4Wj+g(B7*rso}7-=ZRUut;)x zc@(ood$A;7LwFCPTq?-M@YhVVLR!Q0yklQzva4?kUrb%gL~K)dH^ZzDWOMjShPg

    x%S}IzRo$I^|o8d#_X&_-ioG4$S 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

    3U(_ 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%0D1aen0$^L`uZCKKZv<@G<0@VV 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 Bo4CW4O;D{vJpBf$deRy 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�Vk6 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

    qjPPvm{5|~cJ{aNI;Q7Dfy&8`2Z1DWYNf$&$ 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.KsCZpViG!9AqluM%)Vw7&|b6nGYvmR-&u%y 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

    J47bvH6p3GA)rSoLaC;3r2Plgms={%Y5W5vRJ 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

    1ebk%EH=4j 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�M}WO(uLyF*^!OH8HT^~>_~(|TxUok9}U-N7|sIt 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

    AT;uI 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

    q5SX&JDY7hCH^6oV)AZ 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%0Dqd^&`w4+>Ks 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 S(;=H*iGL)0QDz*t{QeJrM$rlY literal 0 HcmV?d00001 diff --git a/zynqberrydemo1/prebuilt/software/te0726_m/zynq_fsbl.elf b/zynqberrydemo1/prebuilt/software/te0726_m/zynq_fsbl.elf new file mode 100644 index 0000000000000000000000000000000000000000..3e11dfc676440f728ae8b7aaa03b38587533f003 GIT binary patch literal 205840 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�nL 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

    SxP;?r*U+ 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 0 } { + if {[catch {init_board [TE::BDEF::find_id $BOARD] 0} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-137 ERROR "Script (TE::INIT::init_board /[TE::BDEF::find_id/]) failed: $result."; return -code error} + } + switch $RUN { + -1 {TE::UTILS::te_msg TE_INIT-138 INFO " Clear only Mode selected..."} + 0 {start_existing_project $GUI } + 1 {generate_single_project $GUI } + 2 {generate_single_project_all $GUI } + 3 {generate_board_file_project_all $GUI } + default {abort_status "Error Initialisation..."; create_allboardfiles_status; return -code error "Error: Design run option $OPT not available, use [show_help]";} + } + TE::UTILS::te_msg TE_INIT-139 INFO "Run project finished without Error. \n \ + ------" + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished cmd functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--generate_dummi_project: for external programming without labtools and sdk only + proc generate_dummi_project {} { + file mkdir $TE::VPROJ_PATH/tmp + cd $TE::VPROJ_PATH/tmp + TE::UTILS::te_msg TE_INIT-140 STATUS "Create temporary vivado project in: [pwd]" + ::create_project -force tmp $TE::VPROJ_PATH/tmp + } + #-------------------------------- + #--delete_dummi_project: for external programming without labtools and sdk only + proc delete_dummi_project {oldpath} { + ::close_project + TE::UTILS::te_msg TE_INIT-141 STATUS "Delete temporary vivado project in: [pwd]" + cd $oldpath + if {[catch {file delete -force -- $TE::VPROJ_PATH/tmp} result ]} { + # somtimes is locked from other process + # puts "Info:(TE) Can't delete temporary folder." + } + } + #-------------------------------- + #--start_existing_project: + proc start_existing_project {GUI} { + if { [file exists $TE::VPROJ_PATH] } { + cd $TE::VPROJ_PATH + if { [file exists ${TE::VPROJ_NAME}.xpr] } { + TE::UTILS::te_msg TE_INIT-142 STATUS "Open existing project (File: ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.xpr)." + if {[catch {TE::VIV::open_project} result]} { TE::UTILS::te_msg TE_INIT-143 ERROR "Script (TE::VIV::open_project) failed: $result."; return -code error} + if {$GUI >= 1} {start_gui} + } else { + return -code error "Error: $TE::VPROJ_NAME.xpr not found in [pwd]"; + } + } else { + return -code error "Error: ${TE::VPROJ_PATH}/$TE::VPROJ_NAME.xpr not found"; + } + #--------------------------------------------- + } + #-------------------------------- + #--generate_single_project: + proc generate_single_project {GUI } { + if { [file exists $TE::VPROJ_PATH] } { + cd $TE::VPROJ_PATH + if { [file exists *.xpr] } { + return -code error "Error: Project folder not empty, clear [pwd]"; + } + } else { + TE::UTILS::te_msg TE_INIT-144 STATUS "Generate new project (Path: ${TE::VPROJ_PATH})." + file mkdir $TE::VPROJ_PATH + cd $TE::VPROJ_PATH + if {[catch {TE::VIV::create_project} result]} { TE::UTILS::te_msg TE_INIT-145 ERROR "Script (TE::VIV::create_project) failed: $result."; return -code error} + if {$GUI == 1} { start_gui } + if {[catch {TE::VIV::import_design} result]} { TE::UTILS::te_msg TE_INIT-146 ERROR "Script (TE::VIV::import_design) failed: $result."; return -code error} + if {$GUI == 2} { start_gui } + } + } + #-------------------------------- + #--generate_single_project_all: + proc generate_single_project_all {GUI} { + if {$GUI == 1} { generate_single_project 1 } else {generate_single_project 0 } + #-------------------------------------------------------- + run_current_project_all + #-------------------------------------------------------- + if {$GUI == 2} { start_gui} + } + #-------------------------------- + #--generate_board_file_project_all: + proc generate_board_file_project_all {GUI} { + + + foreach sublist $TE::BDEF::BOARD_DEFINITION { + set rundesign true + set id [lindex $sublist 0] + if {$id ne "ID" } { + if {[llength $TE::DESIGNRUNS] > 0} { + if {[lsearch -exact $TE::DESIGNRUNS $id] == -1} { + TE::UTILS::te_msg TE_INIT-147 STATUS "Skip ID: $id" + set rundesign false + } + } + if {$rundesign == true} { + TE::UTILS::te_msg TE_INIT-148 STATUS "Run project id $id (Path: [pwd]) \n \ + ------" + if {[catch {TE::UTILS::clean_vivado_project} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-149 ERROR "Script (TE::UTILS::clean_vivado_project) failed: $result."; return -code error} + if {[catch {TE::UTILS::clean_workspace_hsi} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-150 ERROR "Script (TE::UTILS::clean_workspace_hsi) failed: $result."; return -code error} + if {[catch {init_board $id 0} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-151 ERROR "Script (TE::init_board) failed: $result."; return -code error} + if {[catch {generate_single_project_all 0} result]} {abort_status "Error generate projects..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-152 ERROR "Script (TE::generate_single_project_all) failed: $result."; return -code error} + + TE::VIV::close_project + } + } + } + create_allboardfiles_status + } + #-------------------------------- + #--run_current_project_all: + proc run_current_project_all {} { + # if {[catch {TE::VIV::build_design ${TE::GEN_HW_BIT} ${TE::GEN_HW_MCS} ${TE::GEN_HW_RPT}} result]} {TE::VIV::report_summary;set message "Error:(TE) Script (TE::VIV::build_design) failed: $result."; abort_status $emessage; puts $emessage; return -code error} + set hw_options [list] + if {!${TE::GEN_HW_BIT}} {lappend hw_options "-disable_bitgen"; TE::UTILS::te_msg TE_INIT-153 WARNING "Auto-generation of Bit-file is disabled."} + if {!${TE::GEN_HW_RPT}} {lappend hw_options "-disable_reports"; TE::UTILS::te_msg TE_INIT-154 WARNING "Auto-generation of Report-file is disabled."} + if {!${TE::GEN_HW_HDF}} {lappend hw_options "-disable_hdf"; TE::UTILS::te_msg TE_INIT-155 WARNING "Auto-generation of HDF-file is disabled."} + if {!${TE::GEN_HW_MCS}} {lappend hw_options "-disable_mcsgen"; TE::UTILS::te_msg TE_INIT-156 WARNING "Auto-generation of MCS-file is disabled."} + if {[catch {eval TE::hw_build_design ${hw_options}} result]} {TE::VIV::report_summary;set emessage "Error: Script (TE::hw_build_design) failed: $result."; abort_status $emessage; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-157 ERROR "$emessage" ; return -code error} + #---------------------------------------------------------- + set sw_options [list] + if {!${TE::GEN_SW_HSI}} {lappend sw_options "-no_hsi"; TE::UTILS::te_msg TE_INIT-158 WARNING "Auto-generation of ELF-files is disabled."} + if {!${TE::GEN_SW_BIF}} {lappend sw_options "-no_bif"; TE::UTILS::te_msg TE_INIT-159 WARNING "Auto-generation of BIF-files is disabled."} + if {!${TE::GEN_SW_BIN}} {lappend sw_options "-no_bin"; TE::UTILS::te_msg TE_INIT-160 WARNING "Auto-generation of BIN-files is disabled."} + if {!${TE::GEN_SW_BITMCS}} {lappend sw_options "-no_bitmcs"; TE::UTILS::te_msg TE_INIT-161 WARNING "Auto-generation of BIT-files and MCS-files is disabled."} + if {${TE::GEN_SW_USEPREBULTHDF}} {lappend sw_options "-prebuilt_hdf_only"; lappend sw_options "$TE::SHORTDIR"; TE::UTILS::te_msg TE_INIT-162 WARNING "Prebuilt HDF is used."} + if {${TE::GEN_SW_FORCEBOOTGEN}} {lappend sw_options "-force_bin"; TE::UTILS::te_msg TE_INIT-163 WARNING "Force Boot.bin is used."} + lappend sw_options "-clear" + if {[catch {eval TE::sw_run_hsi ${sw_options}} result]} { set emessage "Error: Script (TE::sw_run_hsi) failed: $result."; abort_status $emessage; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-164 ERROR "$emessage" ; return -code error} + abort_status "Ok" + } + #-------------------------------- + #--generate_labtools_project: + proc generate_labtools_project { {gui ""} } { + if { [file exists $TE::VLABPROJ_PATH] } { + cd $TE::VLABPROJ_PATH + if { [file exists ${TE::VPROJ_NAME}.lpr] } { + if {[catch {TE::VLAB::open_project} result]} { TE::UTILS::te_msg TE_INIT-165 ERROR "Script (TE::VLAB::open_project) failed: $result."; return -code error} + } else { + if {[catch {TE::VLAB::create_project} result]} { TE::UTILS::te_msg TE_INIT-166 ERROR "Script (TE::VLAB::create_project) failed: $result."; return -code error} + } + } else { + TE::UTILS::te_msg TE_INIT-167 STATUS "Generate new project (Path: $TE::VLABPROJ_PATH)" + file mkdir $TE::VLABPROJ_PATH + cd $TE::VLABPROJ_PATH + if {[catch {TE::VLAB::create_project} result]} { TE::UTILS::te_msg TE_INIT-168 ERROR "Script (TE::VLAB::create_project) failed: $result."; return -code error} + } + if {$gui ne ""} { + start_gui + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished project design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # status files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--remove_status_files: + proc remove_status_files {} { + if { [file exists ${TE::LOG_PATH}/allboardparts.txt] } { + file delete -force ${TE::LOG_PATH}/allboardparts.txt + } + if { [file exists ${TE::LOG_PATH}/status.txt] } { + file delete -force ${TE::LOG_PATH}/status.txt + } + } + #-------------------------------- + #--create_allboardfiles_status: + proc create_allboardfiles_status {} { + set report_file ${TE::LOG_PATH}/allboardparts.txt + set fp_w [open ${report_file} "w"] + puts $fp_w "it's generate only for powershell polling..." + close $fp_w + } + #-------------------------------- + #--abort_status: + proc abort_status {message} { + set report_file ${TE::LOG_PATH}/status.txt + + if { ![file exists ${report_file}]} { + set fp_w [open ${report_file} "w"] + puts $fp_w "Run ${TE::BOARDPART} with Status $message" + close $fp_w + } else { + set fp_a [open ${report_file} "a"] + puts $fp_a "Run ${TE::BOARDPART} with Status $message" + close $fp_a + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished status files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "INFO:(TE) Load Designs script finished" +} + + diff --git a/zynqberrydemo1/scripts/script_environment.tcl b/zynqberrydemo1/scripts/script_environment.tcl new file mode 100644 index 0000000..c81803b --- /dev/null +++ b/zynqberrydemo1/scripts/script_environment.tcl @@ -0,0 +1,46 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/03 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/02/02 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval ::TE { + namespace eval ENV { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # initial vivado lib paths + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--set_path_boarddef: + proc set_path_boarddef {} { + TE::UTILS::te_msg TE_INIT-69 INFO "Set Board Definition path: $TE::BOARDDEF_PATH" + set_param board.repoPaths $TE::BOARDDEF_PATH + } + #-------------------------------- + #--set_path_boarddef: + proc set_path_ip {} { + TE::UTILS::te_msg TE_INIT-70 INFO "Set IP path : $TE::IP_PATH" + set_property IP_REPO_PATHS $TE::IP_PATH [current_fileset] + ::update_ip_catalog + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished vivado lib paths + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + + } + puts "INFO:(TE) Load environment script finished" +} + + diff --git a/zynqberrydemo1/scripts/script_external.tcl b/zynqberrydemo1/scripts/script_external.tcl new file mode 100644 index 0000000..7e17185 --- /dev/null +++ b/zynqberrydemo1/scripts/script_external.tcl @@ -0,0 +1,786 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/11 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/05/13 $ +# -------------------------------------------------------------------- +# -- 2017/05/12 bugfix missing bracket +# -- 2017/05/18 add pmuf to zynqmp bif +# -- 2017/06/13 add pmuf hsi/sdk support +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval EXT { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # *elf generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--run_sdk: + proc run_sdk {} { + set cur_path [pwd] + cd $TE::WORKSPACE_SDK_PATH + set tmplist [list] + if {[file exists ${TE::XILINXGIT_DEVICETREE}]} { + TE::UTILS::te_msg TE_SW-0 STATUS "Include Xilinx Device Tree git clone." + lappend tmplist "-lp" $TE::LIB_PATH + lappend tmplist "-lp" ${TE::XILINXGIT_DEVICETREE} + } else { + TE::UTILS::te_msg TE_SW-1 WARNING "Xilinx Device Tree git clone path not found (${TE::XILINXGIT_DEVICETREE})." + lappend tmplist "-lp" $TE::LIB_PATH + } + set command exec + lappend command xsdk + lappend command -workspace ${TE::WORKSPACE_SDK_PATH} + set hdffilename "" + [catch {set hdffilename [glob -join -dir ${TE::WORKSPACE_SDK_PATH}/ *.hdf]}] + if {[file exists ${TE::WORKSPACE_SDK_PATH}/${TE::PR_TOPLEVELNAME}.hdf]} { + lappend command -hwspec ${TE::WORKSPACE_SDK_PATH}/${TE::PR_TOPLEVELNAME}.hdf + } elseif {[file exists ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf]} { + lappend command -hwspec ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + } else { + lappend command -hwspec ${hdffilename} + } + # lappend command -hwspec ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + # lappend command -bit ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.bit + lappend command {*}$tmplist + # lappend command --vivrun + TE::UTILS::te_msg TE_SW-2 INFO "Start SKD: \n \ + Run \"$command\" in $TE::WORKSPACE_SDK_PATH \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-0 INFO "Command results from SDK \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } + #-------------------------------- + #--run_hsi: + proc run_hsi {} { + # list 0 for table header + if { [llength $TE::SW_APPLIST] > 1} { + set cur_path [pwd] + cd $TE::WORKSPACE_HSI_PATH + set tmp_libpath [list] + lappend tmp_libpath $TE::LIB_PATH + if {[file exists ${TE::XILINXGIT_DEVICETREE}]} { + TE::UTILS::te_msg TE_SW-3 STATUS "Include Xilinx Device Tree git clone." + lappend tmp_libpath ${TE::XILINXGIT_DEVICETREE} + } else { + TE::UTILS::te_msg TE_SW-4 WARNING "Xilinx Device Tree git clone path not found (${TE::XILINXGIT_DEVICETREE})." + } + set tmp_sw_liblist [list] + lappend tmp_sw_liblist $tmp_libpath + set tmp_sw_applist [list] + lappend tmp_sw_applist $TE::SW_APPLIST + # + set command exec + lappend command hsi + lappend command -source ${TE::SCRIPT_PATH}/script_hsi.tcl + lappend command -tclargs + lappend command "--sw_list ${tmp_sw_applist} --lib $tmp_sw_liblist --vivrun" + # lappend command --vivrun + TE::UTILS::te_msg TE_SW-5 INFO "Start HSI: \n \ + Run \"$command\" in $TE::WORKSPACE_HSI_PATH \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-1 INFO "Command results from HSI \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + TE::UTILS::copy_sw_files + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished *elf generation + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # *bit/*mcs generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--generate_app_bit_mcs: + proc generate_app_bit_mcs {{fname ""}} { + #microblaze + set int_shortdir ${TE::SHORTDIR} + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + } + #run only if *.mmi exists + if {[file exists ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi]} { + # read processor from mmi + set fp [open "${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi" r] + set file_data [read $fp] + close $fp + set tmp [split $file_data "\n"] + foreach t $tmp { + if {[string match *InstPath=* $t] } { + set splittstring [split $t "="] + set next false + set hitval "NA" + foreach part $splittstring { + if {$next} { + set hitval $part + break + } + if {[string match *InstPath* $part] } { + set next true + } + } + set hitval [string map {">" ""} $hitval] + set hitval [string map {"\"" ""} $hitval] + if { $hitval eq "NA"} { + TE::UTILS::te_msg TE_SW-6 ERROR "Processor not found in ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi." + return -code error "Processor not found in ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi."; + } + } + } + #--------------- + foreach sw_applist_line ${TE::SW_APPLIST} { + #generate modified mcs or bit only if app_list.csv->steps=0(generate all), add file to mcs use "FIRM" + set app_name [lindex $sw_applist_line 1] + if {[lindex $sw_applist_line 2] eq "0"} { + #read app name + #delete old one + if {[file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/${app_name}.bit]} { + file delete -force ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/${app_name}.bit + } + #make folder if not exists + file mkdir ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + # + #todo:hier noch in default suche? + TE::UTILS::te_msg TE_SW-7 STATUS "Generate ${app_name}.bit with app: ${app_name}." + set command exec + lappend command updatemem + lappend command -force + lappend command -meminfo ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi + lappend command -data ${TE::PREBUILT_SW_PATH}/${int_shortdir}/${app_name}.elf + lappend command -bit ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.bit + lappend command -proc $hitval + lappend command -out ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/${app_name}.bit + TE::UTILS::te_msg TE_SW-8 INFO "Start Update Memory: \n \ + Run \"$command\" in ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-2 INFO "Command results from Update Memory \"$command\": \n \ + $result \n \ + ------" + } + #write mcs + if {[lindex $sw_applist_line 2] eq "0" || [lindex $sw_applist_line 2] eq "FIRM"} { + if {$TE::CFGMEM_MEMSIZE_MB ne "NA"} { + #todo generate relativ path from absolute paths + set rel_bitfile "../prebuilt/hardware" + set rel_bitfile2 "../prebuilt/boot_images" + set rel_data_file ".." + #make folder if not exists + file mkdir ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + # + TE::UTILS::te_msg TE_SW-8 STATUS "Generate ${app_name}.mcs with app: ${app_name}." + #set bitfile to mcs load + if {[lindex $sw_applist_line 2] eq "FIRM"} { + set load_data "up 0x0 ${rel_bitfile}/${int_shortdir}/${TE::VPROJ_NAME}.bit " + } else { + set load_data "up 0x0 ${rel_bitfile2}/${int_shortdir}/${app_name}/${app_name}.bit " + } + #get upload data 01: + set data_index 5 + while {$data_index < [llength $sw_applist_line] } { + if {[lindex $sw_applist_line 5] ne "NA"} { + set load_data "$load_data up [lindex $sw_applist_line [expr $data_index+1]] ${rel_data_file}/[lindex $sw_applist_line $data_index] " + } + set data_index [expr $data_index+3] + } + #write mcs + # -loadbit $load_bit + write_cfgmem -force -format mcs -checksum FF -interface $TE::CFGMEM_IF -size $TE::CFGMEM_MEMSIZE_MB \ + -loaddata $load_data \ + -file ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/${app_name}.mcs + } else { + TE::UTILS::te_msg TE_SW-9 {CRITICAL WARNING} "FPGA FLASH TYP is not specified in *.board_files.csv. *.mcs file is not generated." + } + } + } + } else { + TE::UTILS::te_msg TE_SW-10 WARNING "${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi not found. Nothing is done." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished *bit/*mcs generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # *bin/*bif generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--generate_bif_files: + proc generate_bif_files {{fname ""}} { + set int_shortdir ${TE::SHORTDIR} + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + } + #todo generate relativ path from absolute paths + set checkfile "" + set fsbl_name "" + set rel_bif_bitfile "../../../hardware" + set rel_bif_fsbl "../../../software" + set rel_bif_hsipmu "../../../software" + set rel_bif_data01_file "../../../../" + set rel_bif_appfile "../../../" + set rel_base "" + set bif_bitfile "" + set bif_fsbl "" + set bif_data01_file "" + set bif_appfile "" + + #check bitfile + if {![file exists ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.bit]} { + # search default + if {![file exists ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit]} { + # default not found + TE::UTILS::te_msg TE_SW-11 ERROR "Bit-file was not found (${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.bit or ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit)" + return -code error "Project bit-file was not found (${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.bit or ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit)"; + } else { + set bif_bitfile "${rel_bif_bitfile}/default/${TE::VPROJ_NAME}.bit" + } + } else { + set bif_bitfile "${rel_bif_bitfile}/${int_shortdir}/${TE::VPROJ_NAME}.bit" + } + #search for fsbl + foreach sw_applist_line ${TE::SW_APPLIST} { + #read fsbl name + if {[lindex $sw_applist_line 2] eq "FSBL" || [lindex $sw_applist_line 2] eq "FSBL_EXT"} { + set fsbl_name [lindex $sw_applist_line 1] + if {![file exists ${TE::PREBUILT_SW_PATH}/${int_shortdir}/${fsbl_name}.elf]} { + # generate fsbl not found search default + if {![file exists ${TE::PREBUILT_SW_PATH}/default/${fsbl_name}.elf]} { + # default fsbl not found + TE::UTILS::te_msg TE_SW-12 ERROR "FSBL ELF-file was not found (${TE::PREBUILT_SW_PATH}/${int_shortdir}/${fsbl_name}.elf or ${TE::PREBUILT_SW_PATH}/default/${fsbl_name}.elf)." + return -code error "FSBL ELF-file was not found (${TE::PREBUILT_SW_PATH}/${int_shortdir}/${fsbl_name}.elf or ${TE::PREBUILT_SW_PATH}/default/${fsbl_name}.elf)."; + } else { + set bif_fsbl "${rel_bif_fsbl}/default/${fsbl_name}.elf" + TE::UTILS::te_msg TE_SW-13 INFO "Use FSBL from: ${bif_fsbl}" + } + } else { + set bif_fsbl "${rel_bif_fsbl}/${int_shortdir}/${fsbl_name}.elf" + TE::UTILS::te_msg TE_SW-14 INFO "Use FSBL from: ${bif_fsbl}" + } + } + } + foreach sw_applist_line ${TE::SW_APPLIST} { + #generate *.bif only if app_list.csv->steps=0(generate all) or steps=1(*.bif and *.bin use *.elf from prebuild folders ) + if {[lindex $sw_applist_line 2] eq "0" || [lindex $sw_applist_line 2] eq "1" || [lindex $sw_applist_line 2] eq "FSBL_APP"} { + #set correct folders + switch [lindex $sw_applist_line 3] { + "petalinux" { + set checkfile "${TE::PREBUILT_OS_PATH}/petalinux" + set rel_base "${rel_bif_appfile}os/petalinux" + + } + default {#standalone + set checkfile "${TE::PREBUILT_SW_PATH}" + set rel_base "${rel_bif_appfile}software" + } + } + #read fsbl name + #read app name and additional configs + set app_name [lindex $sw_applist_line 1] + TE::UTILS::te_msg TE_SW-15 STATUS "Generate BIF-file for: ${app_name}" + #delete old folder + if {[file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}]} { + file delete -force ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + } + #make new one + file mkdir ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + + if {![file exists ${checkfile}/${int_shortdir}/${app_name}.elf]} { + if { [lindex $sw_applist_line 2] eq "FSBL_APP"} { + # fsbl boot.bin only + set bif_appfile "" + } elseif {![file exists ${checkfile}/default/${app_name}.elf]} { + # search default + # default not found + TE::UTILS::te_msg TE_SW-16 ERROR "Application ELF-file was not found (${checkfile}/${int_shortdir}/${app_name}.elf or ${checkfile}/default/${app_name}.elf)." + return -code error "Application ELF-file was not found (${checkfile}/${int_shortdir}/${app_name}.elf or ${checkfile}/default/${app_name}.elf)."; + } else { + set bif_appfile "${rel_base}/default/${app_name}.elf" + } + + } else { + set bif_appfile "${rel_base}/${int_shortdir}/${app_name}.elf" + } + if {$TE::IS_ZSYS} { + #Zynq + set data01_file [lindex $sw_applist_line 5] + set data01_load [lindex $sw_applist_line 6] + set data01_offset [lindex $sw_applist_line 7] + #replace na with "" + if {[string match $data01_file "NA"]} { set bif_data01_file ""} else { set bif_data01_file "${rel_bif_data01_file}${data01_file}"} + if {[string match $data01_load "NA"]} { set data01_load ""} + if {[string match $data01_offset "NA"]} { set data01_offset ""} + + write_bif ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif $bif_fsbl $bif_bitfile $bif_appfile $bif_data01_file $data01_load $data01_offset "" "" "" + } elseif {$TE::IS_ZUSYS} { + #uzynq + set fsbl_config [lindex $sw_applist_line 5] + if {[string match $fsbl_config "NA"]} { set fsbl_config ""} + set destination_cpu [lindex $sw_applist_line 6] + if {[string match $destination_cpu "NA"]} { set destination_cpu ""} + set exception_level [lindex $sw_applist_line 7] + if {[string match $exception_level "NA"]} { set exception_level ""} + set atf [lindex $sw_applist_line 8] + if {[string match $atf "NA"]} { set atf ""} elseif {[file exists ${checkfile}/${int_shortdir}/${atf}]} { + set atf ${rel_base}/${int_shortdir}/${atf} + } elseif {[file exists ${checkfile}/default/${atf}]} { + set atf ${rel_base}/default/${atf} + } else { + TE::UTILS::te_msg TE_SW-17 WARNING "ATF File was not found in ${checkfile}/${int_shortdir}/${atf} or ${checkfile}/default/${atf}" + set atf "" + } + set pmu [lindex $sw_applist_line 9] + if {[string match $pmu "NA"]} { + set pmu "" + TE::UTILS::te_msg TE_SW-65 WARNING "PMU File not selected on apps_list.csv" + } elseif {[file exists ${TE::PREBUILT_SW_PATH}/${int_shortdir}/${pmu}]} { + set pmu ${rel_bif_hsipmu}/${int_shortdir}/${pmu} + } elseif {[file exists ${TE::PREBUILT_SW_PATH}/default/${pmu}]} { + set pmu ${rel_bif_hsipmu}/default/${pmu} + } elseif {[file exists ${checkfile}/${int_shortdir}/${pmu}]} { + set pmu ${rel_base}/${int_shortdir}/${pmu} + } elseif {[file exists ${checkfile}/default/${pmu}]} { + set pmu ${rel_base}/default/${pmu} + } else { + TE::UTILS::te_msg TE_SW-64 WARNING "PMU File ($pmu) was not found in all possible prebuilt folders" + set pmu "" + } + TE::UTILS::te_msg TE_SW-66 INFO "Use PMU from: ${pmu}" + + write_zusys_bif -biffile ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif -fsbl_config $fsbl_config -bootloader $bif_fsbl -pmu $pmu -bitfile $bif_bitfile -app $bif_appfile -destination_cpu $destination_cpu -exception_level $exception_level -atf $atf + + } else { + #error + TE::UTILS::te_msg TE_SW-18 ERROR "ZSYS or ZUSYS is not defined." + } + } + } + } + #-------------------------------- + #--write_bif: + proc write_bif { biffile {fsblfile "zynq_fsbl.elf"} {bitfile ""} {elffile ""} {data01_file ""} {data01_load ""} {data01_offset ""} {dtbfile ""} {intfile ""} {ssblfile ""} } { + + set bif_fp [open "$biffile" w] + + puts $bif_fp "the_ROM_image:\n\u007B" + # + # init data + # + if {$intfile!=""} { puts -nonewline $bif_fp { [init]}} + if {$intfile!=""} { puts $bif_fp $intfile} + if {$intfile == ""} {TE::UTILS::te_msg TE_SW-19 STATUS "INT FILE NOT DEFINED..."} + # + # FSBL + # + if {$fsblfile!=""} { puts -nonewline $bif_fp { [bootloader]}} + if {$fsblfile!=""} { puts $bif_fp $fsblfile} + if {$fsblfile == ""} {TE::UTILS::te_msg TE_SW-21 STATUS "FSBL FILE NOT DEFINED..."} + # + # BIT file + # + if {$bitfile!=""} { puts $bif_fp " $bitfile"} + if {$bitfile == ""} {TE::UTILS::te_msg TE_SW-22 STATUS "BIT FILE NOT DEFINED..."} + # + # .ELF file + # + if {$elffile!=""} { puts $bif_fp " $elffile"} + if {$elffile == ""} {TE::UTILS::te_msg TE_SW-23 STATUS "ELF FILE NOT DEFINED..."} + # + # SSBL + # + if {$ssblfile!=""} { puts $bif_fp " $ssblfile"} + if {$ssblfile == ""} {TE::UTILS::te_msg TE_SW-24 STATUS "SSBL FILE NOT DEFINED..."} + # + # DTB file + # + if {$dtbfile!=""} { puts $bif_fp " $dtbfile"} + if {$dtbfile == ""} {TE::UTILS::te_msg TE_SW-25 STATUS "DTB FILE NOT DEFINED..."} + # + # image.ub ore IMAGE file + # + + if {$data01_load!="" || $data01_offset!=""} { puts -nonewline $bif_fp { [}} + if {$data01_load!="" } { puts -nonewline $bif_fp {load = };puts -nonewline $bif_fp "$data01_load"} + if {$data01_load!="" && $data01_offset!=""} { puts -nonewline $bif_fp { , }} + if {$data01_offset!="" } { puts -nonewline $bif_fp {offset = };puts -nonewline $bif_fp "$data01_offset"} + if {$data01_load!="" || $data01_offset!=""} { puts -nonewline $bif_fp {]}} + if {$data01_file!=""} { puts $bif_fp $data01_file} + + if {$data01_load == ""} {TE::UTILS::te_msg TE_SW-26 STATUS "FILE01 LOAD NOT DEFINED..."} + if {$data01_offset == ""} {TE::UTILS::te_msg TE_SW-27 STATUS "FILE01 OFFSET NOT DEFINED..."} + if {$data01_file == ""} {TE::UTILS::te_msg TE_SW-28 STATUS "FILE01 FILE NOT DEFINED..."} + + + puts $bif_fp "\u007D" + + close $bif_fp + + } + #-------------------------------- + #--write_zusys_bif: + proc write_zusys_bif {{args ""}} { + set biffile "" + set fsbl_config "" + set bootloader "" + set pmu "" + set bitfile "" + set destination_cpu "" + set exception_level "" + #bl31.elf + set atf "" + set app "" + + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-biffile" { incr option; set biffile [lindex $args $option]} + "-fsbl_config" { incr option; set fsbl_config [lindex $args $option]} + "-bootloader" { incr option; set bootloader [lindex $args $option]} + "-pmu" { incr option; set pmu [lindex $args $option]} + "-bitfile" { incr option; set bitfile [lindex $args $option]} + "-destination_cpu" { incr option; set destination_cpu [lindex $args $option]} + "-exception_level" { incr option; set exception_level [lindex $args $option]} + "-atf" { incr option; set atf [lindex $args $option]} + "-app" { incr option; set app [lindex $args $option]} + default {TE::UTILS::te_msg TE_SW-29 ERROR "unrecognised option for BIF generation: [lindex $args $option]";return -code error } + } + } + set bif_fp [open "$biffile" w] + + puts $bif_fp "//arch = zynqmp; split = false; format = BIN" + puts $bif_fp "the_ROM_image:\n\u007B" + #fsbl_config + if {$fsbl_config!=""} { puts -nonewline $bif_fp { [fsbl_config]}} + if {$fsbl_config!=""} { puts $bif_fp $fsbl_config} + if {$fsbl_config == ""} {TE::UTILS::te_msg TE_SW-30 STATUS "FSBL_CONFIG NOT DEFINED..."} + #bootloader + if {$bootloader!=""} { puts -nonewline $bif_fp { [bootloader]}} + if {$bootloader!=""} { puts $bif_fp $bootloader} + if {$bootloader == ""} {TE::UTILS::te_msg TE_SW-31 STATUS "BOOTLOADER NOT DEFINED..."} + #pmuf + if {$pmu!=""} { puts -nonewline $bif_fp { [pmufw_image]}} + if {$pmu!=""} { puts $bif_fp $pmu} + if {$pmu == ""} {TE::UTILS::te_msg TE_SW-31 STATUS "PMU NOT DEFINED..."} + #bitfile + if {$bitfile!=""} { puts -nonewline $bif_fp { [destination_device = pl]}} + if {$bitfile!=""} { puts $bif_fp $bitfile} + if {$bitfile == ""} {TE::UTILS::te_msg TE_SW-32 STATUS "BITFILE NOT DEFINED..."} + #atf + if {$atf!=""} { puts -nonewline $bif_fp { [}} + if {$atf!=""} { puts -nonewline $bif_fp "destination_cpu =$destination_cpu"} + if {$atf!=""} { puts -nonewline $bif_fp ", exception_level =el-3"} + if {$atf!=""} { puts -nonewline $bif_fp {]}} + if {$atf!=""} { puts $bif_fp $atf} + if {$atf == ""} {TE::UTILS::te_msg TE_SW-33 STATUS "ATF BL31 ELF NOT DEFINED..."} + #elf + if {$app!=""} { puts -nonewline $bif_fp { [}} + if {$app!=""} { puts -nonewline $bif_fp "destination_cpu =$destination_cpu"} + if {$app!="" && $exception_level!=""} { puts -nonewline $bif_fp ", exception_level =$exception_level"} + if {$app!=""} { puts -nonewline $bif_fp {]}} + if {$app!=""} { puts $bif_fp $app} + if {$app == ""} {TE::UTILS::te_msg TE_SW-34 STATUS "APPLICATION ELF NOT DEFINED..."} + + puts $bif_fp "\u007D" + + close $bif_fp + + } + #-------------------------------- + #--generate_bootbin: + proc generate_bootbin {{fname ""}} { + set int_shortdir ${TE::SHORTDIR} + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + } + foreach sw_applist_line ${TE::SW_APPLIST} { + #generate *.bin only if app_list.csv->steps=0(generate all) or steps=1(*.bif and *.bin use *.elf from prebuild folders ) or steps=2(*.bin use *.elf and *.bif from prebuild folders) + if {[lindex $sw_applist_line 2]==0 || [lindex $sw_applist_line 2]==1 || [lindex $sw_applist_line 2]==2 || [lindex $sw_applist_line 2] eq "FSBL_APP"} { + #read app name + set app_name [lindex $sw_applist_line 1] + #delete old one + if {[file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bin]} { + file delete -force ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bin + } + # + if {![file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif]} { + TE::UTILS::te_msg TE_SW-35 ERROR "Application BIF-File found (${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif)." + return -code error "Application BIF-File found (${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif)."; + } + #todo:hier noch in default suche? + TE::UTILS::te_msg TE_SW-36 STATUS "Generate Boot.bin for Application: ${app_name}" + set cur_path [pwd] + cd ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + set command exec + lappend command bootgen + lappend command -image boot.bif + #Ultrascale+Zynq + if {$TE::IS_ZUSYS} { + lappend command -arch zynqmp + } + lappend command -w -o BOOT.bin + # puts $command + TE::UTILS::te_msg TE_SW-37 INFO "Start BootGen: \n \ + Run \"$command\" in ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-3 INFO "Command results from BootGen \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished *bin/*bif generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--get_available_apps: + proc get_available_apps {{fname ""}} { + set int_shortdir ${TE::SHORTDIR} + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + } + set applist [] + [catch {set applist [glob -join -dir ${TE::PREBUILT_BI_PATH}/${int_shortdir}/ *]}] + set app_txt "Following Applications are available: \n" + foreach app $applist { + set tmp [split $app "/"] + set app_txt "$app_txt [lindex $tmp [expr [llength $tmp]-1]]\n" + } + TE::UTILS::te_msg TE_PR-38 INFO "$app_txt ------" + } + #-------------------------------- + #--excecute_zynq_flash_programming: + proc excecute_zynq_flash_programming {use_basefolder app_name {fname ""}} { + set return_filename "" + set int_shortdir ${TE::SHORTDIR} + set int_flashtyp $TE::ZYNQFLASHTYP + set run_path "" + set bootbinname BOOT.bin + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + #get flashtyp form shortdir + set int_flashtyp "[TE::BDEF::get_zynqflashtyp $int_shortdir 4]" + } + if {![string match $int_flashtyp "NA"]} { + set cur_path [pwd] + if {$use_basefolder} { + set binfilename "" + if { ![catch {set binfilename [glob -join -dir ${TE::BASEFOLDER}/ *.bin]}] } { + TE::UTILS::te_msg TE_PR-39 STATUS "Used file:${binfilename}" + set return_filename ${binfilename} + set run_path $TE::BASEFOLDER + set nameonly [file tail [file rootname $binfilename]] + set bootbinname ${nameonly}.bin + } else { + TE::UTILS::te_msg TE_PR-40 ERROR "Bin-File was not found in ${TE::BASEFOLDER}." + return -code error "Bin-File was not found in ${TE::BASEFOLDER}."; + } + cd ${TE::BASEFOLDER} + } else { + if {![file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/BOOT.bin]} { + TE::UTILS::te_msg TE_PR-41 ERROR "Application Bin-File was not found (${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/BOOT.bin)." + return -code error "Application Bin-File was not found (${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/BOOT.bin)."; + } + cd ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + set run_path ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + set bootbinname BOOT.bin + TE::UTILS::te_msg TE_PR-40 STATUS "Used file:${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/Boot.bin" + set return_filename ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/Boot.bin + } + set command exec + + # lappend command zynq_flash + lappend command program_flash + lappend command -f $bootbinname + lappend command -flash_type $int_flashtyp + TE::UTILS::te_msg TE_PR-41 INFO "Start program flash: \n \ + Run \"$command\" in ${run_path} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-4 INFO "Command results from program flash \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } else { + TE::UTILS::te_msg TE_PR-42 ERROR "Programming failed: Zynq Flash Typ is not specified for this board part. See ${TE::BOARDDEF_PATH}/..._board_files.csv" + } + return $return_filename + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # utilities functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--svn_checkin: + proc svn_checkin {foldername {mgs ""}} { + set message $mgs + if {![file exists $foldername]} { + set message "Error: Folder not found ( $foldername)" + } else { + set cur_path [pwd] + cd ${foldername} + set command exec + lappend command svn + lappend command ci + lappend command -m $message + TE::UTILS::te_msg TE_UTIL-72 INFO "Start SVN Checkin: \n \ + Run \"$command\" in ${foldername} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-5 INFO "Command results from SVN check in \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } + } + #-------------------------------- + #--unzip_project: + proc unzip_project {zipname file_location} { + set command exec + if {${TE::ZIP_PATH} ne ""} { + if {[file tail [file rootname ${TE::ZIP_PATH}]] eq "7z"} { + lappend command ${TE::ZIP_PATH} + lappend command x ${file_location}/${zipname} + lappend command -o${file_location} + } else { + lappend command ${TE::ZIP_PATH} + lappend command -help + # lappend command -e ${file_location}/${zipname} + # lappend command ${file_location} + } + TE::UTILS::te_msg TE_UTIL-73 INFO "Start UNZIP: \n \ + Run \"$command\" \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-6 INFO "Command results from UNZIP \"$command\": \n \ + $result \n \ + ------" + } else { + TE::UTILS::te_msg TE_UTIL-74 {CRITICAL WARNING} "Zip not specified. Set zip path and *exe of the zip program in \"design_basic_settings.cmd\" file : example 7zip: @set ZIP_PATH=C:/Program Files (x86)/7-Zip/7z.exe" + } + } + #-------------------------------- + #--zip_project: + proc zip_project {zipname {excludelist ""}} { + #todo mit übergabeparameter prebuilt weglassen oder so + #remove old backup project copy + set sourcepath [string trim $TE::VPROJ_PATH "vivado"] + set destinationpath ${TE::BACKUP_PATH}/${TE::VPROJ_NAME} + if {[file exists ${destinationpath}]} { + file delete -force ${destinationpath} + } + #create new destination folder + file mkdir ${destinationpath} + set cur_path [pwd] + cd ${TE::BACKUP_PATH} + #get all files + set filelist [ glob ${sourcepath}*] + #remove backup folder + set findex [lsearch $filelist *backup] + set filelist [lreplace $filelist[set filelist {}] $findex $findex] + + foreach el $filelist { + file copy -force ${el} ${destinationpath} + } + set excludelist + foreach el $excludelist { + set find "" + if {[catch {set find [glob -join -dir $destinationpath $el]}]} { + TE::UTILS::te_msg TE_UTIL-75 INFO "$el not found." + } else { + TE::UTILS::te_msg TE_UTIL-76 INFO "Excluded from backup:$find" + file delete -force $find + } + } + set command exec + if {${TE::ZIP_PATH} ne ""} { + if {[file tail [file rootname ${TE::ZIP_PATH}]] eq "7z"} { + lappend command ${TE::ZIP_PATH} + lappend command a -tzip "$zipname.zip" + lappend command "./${TE::VPROJ_NAME}/" + lappend command -r + } else { + lappend command ${TE::ZIP_PATH} + lappend command -r + lappend command "$zipname.zip" + lappend command "./${TE::VPROJ_NAME}/*.*" + } + TE::UTILS::te_msg TE_UTIL-77 INFO "Start ZIP: \n \ + Run \"$command\" \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-7 INFO "Command results from ZIP \"$command\": \n \ + $result \n \ + ------" + } else { + TE::UTILS::te_msg TE_UTIL-78 {CRITICAL WARNING} "Zip not specified. Set zip path and *exe of the zip program in \"design_basic_settings.cmd\" file : example 7zip: @set ZIP_PATH=C:/Program Files (x86)/7-Zip/7z.exe" + } + #remove project copy + if {[file exists ${destinationpath}]} { + file delete -force ${destinationpath} + } + cd $cur_path + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished utilities functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # SDSoC functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--run_sdsoc: + proc run_sdsoc {} { + set cur_path [pwd] + cd ${TE::SDSOC_PATH} + set command exec + lappend command sdsoc + lappend command -workspace ${TE::SDSOC_PATH} + # lappend command -lp ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + TE::UTILS::te_msg TE_SW-38 INFO "Start SDSoC: \n \ + Run \"$command\" in ${TE::SDSOC_PATH} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-8 INFO "Command results from SDSoC \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished sdsoc functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "INFO:(TE) Load Vivado script finished" +} + + diff --git a/zynqberrydemo1/scripts/script_hsi.tcl b/zynqberrydemo1/scripts/script_hsi.tcl new file mode 100644 index 0000000..3fa4ab1 --- /dev/null +++ b/zynqberrydemo1/scripts/script_hsi.tcl @@ -0,0 +1,270 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/05 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/06/13 $ +# -------------------------------------------------------------------- +# -- 2017/06/13 add pmuf hsi support +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval HSI { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # TE HSI variablen declaration + # ----------------------------------------------------------------------------------------------------------------------------------------- + variable HDF_NAME + variable LIB_PATH + variable SW_APPLIST + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished TE HSI variablen declaration + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hsi hw functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--open_project: + proc open_project {} { + if {[catch {set TE::HSI::HDF_NAME [glob -join -dir [pwd] *.hdf]} result]} { puts "Error:(TE) Script (TE::HSI::hsi_open_project) failed: $result."; return -code error} + #todo: eventuell mal extra verzeichnis erstellen, wie sdk + open_hw_design ${TE::HSI::HDF_NAME} + } + #-------------------------------- + #--set_repopath: + proc set_repopath {} { + set_repo_path ${TE::HSI::LIB_PATH} + } + #-------------------------------- + #--close_project: + proc close_project {} { + close_hw_design [current_hw_design] + } + #-------------------------------- + #--get_processors: + proc get_processors {PROCESSOR_ID} { + set proc [get_cells -filter {IP_TYPE==PROCESSOR}] + if {[llength $proc] == 0} { + return -code error "Error:(TE) No Processor found in design ${TE::HSI::HDF_NAME}"; + } else { + if {[llength $proc] > 1} { + puts "Info:(TE) Multiple Processors found." + } + if {[llength $proc] > $PROCESSOR_ID} { + puts "Info:(TE) Processor [lindex $proc $PROCESSOR_ID] is used." + return [lindex $proc $PROCESSOR_ID] + } else { + return -code error "Error:(TE) No Processor ID $PROCESSOR_ID not found in design ${TE::HSI::HDF_NAME}"; + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished hw functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hsi sw functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--create_sw_project: + proc create_sw_project {app_name os uart {proc_id 0}} { + puts "Test: $app_name , $proc_id" + set cpu [get_processors $proc_id] + set hwdesign [current_hw_design] + set swdesign [hsi::create_sw_design system -proc $cpu -app $app_name -os $os] + set os [hsi::get_os] + if {$uart ne "NA"} { + #workaround to change uart -> currently generate_app will delete bsp and write default one + generate_app -hw $hwdesign -sw $swdesign -app $app_name -proc $cpu -dir $app_name -os $os + hsi::close_sw_design $swdesign + hsi::open_sw_design ${app_name}/${app_name}_bsp/system.mss + #reset old variables + set swdesign [get_sw_designs] + set os [hsi::get_os] + #set uart properties + common::set_property CONFIG.stdin $uart $os + common::set_property CONFIG.stdout $uart $os + #generate bsp + hsi::generate_bsp -dir ${app_name}/${app_name}_bsp/ -compile + cd ${app_name} + set result "" + #run make + if {[catch {set result [eval exec make]}]} {puts "Info:(TE) $result"} + cd .. + } else { + generate_app -hw $hwdesign -sw $swdesign -app $app_name -proc $cpu -os $os -dir $app_name -verbose -compile + } + close_sw_design $swdesign + } + #-------------------------------- + #--create_devicetree_project: + proc create_devicetree_project {app_name os} { + set cpu [get_processors 0] + set hwdesign [current_hw_design] + set swdesign [hsi::create_sw_design $app_name -proc $cpu -os $os] + generate_target -dir $app_name + close_sw_design $swdesign + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished sw functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hsi run functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--run_sw_apps: + proc run_sw_apps {} { + #search and generate fsbl and device tree + foreach sw_applist_line ${TE::HSI::SW_APPLIST} { + #generate fsbl only + if {[lindex $sw_applist_line 2] eq "FSBL" } { + set name [lindex $sw_applist_line 1] + set os [lindex $sw_applist_line 3] + set uart [lindex $sw_applist_line 4] + puts "Info:(TE) generate FSBL: $name os: $os Uart: $uart" + create_sw_project $name $os $uart + } + #generate pmu UynqMP only + if {[lindex $sw_applist_line 2] eq "PMU" } { + set name [lindex $sw_applist_line 1] + set os [lindex $sw_applist_line 3] + set uart [lindex $sw_applist_line 4] + #select pmu + set proc_id 6 + puts "Info:(TE) generate PMU: $name os: $os Uart: $uart" + create_sw_project $name $os $uart $proc_id + } + #generate device tree only + if {[lindex $sw_applist_line 2] eq "DTS" } { + set name [lindex $sw_applist_line 1] + set os [lindex $sw_applist_line 3] + puts "Info:(TE) generate Device-Tree: $name os: $os" + create_devicetree_project $name $os + } + } + #search and generate software apps + foreach sw_applist_line ${TE::HSI::SW_APPLIST} { + #generate *.bin only if app_list.csv->steps=0(generate all) or steps=3(*.elf only ) + if {[lindex $sw_applist_line 2] == 0 || [lindex $sw_applist_line 2] == 3} { + set name [lindex $sw_applist_line 1] + set os [lindex $sw_applist_line 3] + set uart [lindex $sw_applist_line 4] + puts "Info:(TE) generate app: $name os: $os Uart: $uart" + create_sw_project $name $os $uart + } + } + } + #-------------------------------- + #--debug_sw_app_list: + proc debug_sw_app_list {} { + set TE::HSI::SW_APPLIST [list] + foreach lpath ${TE::HSI::LIB_PATH} { + if {[file exists ${lpath}/apps_list.csv]} { + puts "Info:(TE) Read Software list from ${lpath}/apps_list.csv" + set fp [open "${lpath}/apps_list.csv" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + # set fsbl_name "" + foreach line $data { + # check file version ignore comments and empty lines + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #check version + set tmp [split $line "="] + #version is ignored for debug only + } elseif {[string match *#* $line] != 1 && [string length $line] > 0} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #splitt and append + set tmp [split $line ","] + lappend TE::HSI::SW_APPLIST $tmp + } + } + } + } + puts "------------------------------------------" + } + #-------------------------------- + #--run_all: + proc run_all {} { + #todo: run all als option und hsi auch über batch separat startbar + puts "Info:(TE) HSI...run all..." + if {[catch {open_project} result]} { puts "Error:(TE) Script (TE::HSI::open_project) failed: $result."; return -code error} + if {[catch {set_repopath} result]} { puts "Error:(TE) Script (TE::HSI::set_repopath) failed: $result."; return -code error} + #---------------------------------------- + if {[catch {run_sw_apps} result]} { puts "Error:(TE) Script (TE::HSI::run_sw_apps) failed: $result."; return -code error} + #---------------------------------------- + if {[catch {close_project} result]} { puts "Error:(TE) Script (TE::HSI::close_project) failed: $result."; return -code error} + } + #-------------------------------- + #--return_option: + proc return_option {option argc argv} { + if { $argc <= [expr $option + 1]} { + return -code error "Error:(TE) Read parameter failed" + } else { + puts "Info:(TE) Parameter Option Value: [lindex $argv [expr $option + 1]]" + return [lindex $argv [expr $option + 1]] + } + } + #-------------------------------- + #--hsi_main: + proc hsi_main {} { + global argc + global argv + set tmp_argc 0 + set tmp_argv 0 + if {$argc >= 1 } { + set tmp_argv [lindex $argv 0] + set tmp_argc [llength $tmp_argv] + } + + set vivrun false + variable SW_APPLIST + variable LIB_PATH + + for {set option 0} {$option < $tmp_argc} {incr option} { + puts "Info:(TE) Parameter Index: $option" + puts "Info:(TE) Parameter Option: [lindex $tmp_argv $option]" + switch [lindex $tmp_argv $option] { + "--sw_list" { set SW_APPLIST [return_option $option $tmp_argc $tmp_argv];incr option } + "--lib" { set LIB_PATH [return_option $option $tmp_argc $tmp_argv];incr option } + "--vivrun" { set vivrun true } + default { puts "" } + } + } + if {$vivrun==true} { + if {[catch {run_all} result]} { puts "Error:(TE) Script (TE::HSI::run_all) failed: $result."; exit} + exit + } + + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished run functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hsi run scripts + # ----------------------------------------------------------------------------------------------------------------------------------------- + if {[catch {hsi_main} result]} { puts "Error:(TE) Script (TE::HSI::hsi_main) failed: $result."; exit} + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished hsi run scripts + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "Info: Load HSI scripts finished" +} + + diff --git a/zynqberrydemo1/scripts/script_main.tcl b/zynqberrydemo1/scripts/script_main.tcl new file mode 100644 index 0000000..28d8483 --- /dev/null +++ b/zynqberrydemo1/scripts/script_main.tcl @@ -0,0 +1,184 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/02 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/06/30 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +puts "-----------------------------------------------------------------------" +#load source scripts +source ../scripts/script_settings.tcl +source ../scripts/script_environment.tcl +source ../scripts/script_vivado.tcl +source ../scripts/script_te_utils.tcl +source ../scripts/script_external.tcl +source ../scripts/script_designs.tcl +source ../scripts/script_usrcommands.tcl +source ../scripts/script_sdsoc.tcl +#sources from other programs: +# source ../scripts/main.tcl +# source ../scripts/hsi.tcl +set sdsoc_available "0" +catch {set sdsoc_available $::env(SDSOC_AVAILABLE)} +if {$sdsoc_available} { + set x_dir "" + set x_vers "" + catch {set x_dir $::env(XILDIR)} + catch {set x_vers $::env(VIVADO_VERSION)} + puts "INFO:(TE) Source Xilinx SDSoC Scripts (${x_dir}/SDx/${x_vers}/scripts/vivado/sdsoc_pfm.tcl)." + source -notrace ${x_dir}/SDx/${x_vers}/scripts/vivado/sdsoc_pfm.tcl +} +puts "-----------------------------------------------------------------------" + +namespace eval TE { + namespace eval INIT { + variable my_script $argv0 + # + + proc return_option {option} { + global argc + global argv + + if { $argc <= [expr $option + 1]} { + puts "ERROR:(TE) Read Parameter failed" + show_help + } else { + puts "INFO:(TE) Parameter Option Value: [lindex $argv [expr $option + 1]]" + return [lindex $argv [expr $option + 1]] + } + } + + proc show_help_batchfile_commands {} { + variable my_script + puts "--TODO: Rework Info for main" + puts "INFO:(TE) Batch-File TCL-Script start options:" + puts "write: vivado -source ../scripts/script_main.tcl -mode batch -notrace -tclargs " + puts "Options:" + puts "Programming:" + puts "--TODO: explanation" + puts "Create/Run Vivado project:" + puts "--run : run option: \ + -1-no nothing is done \ + 0 -open existing project(default) \ + 1 -create selected boardpart project \ + 2 -run selected boardpart project \ + 3 -run all boardpart project" + puts "--boardpart : Trenz Board ID from TEXXXX_boardfiles.csv (you can use ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list)" + puts "--gui : gui mode option:\ + 0 -disable(default) \ + 1 -before project generation \ + 2 -after project generation" + puts "--clean : clean project option:\ + 0 -no(default) \ + 1 -vivado project \ + 2 -vivado and hsi workspace \ + 3 -all (vivado, hsi and sdk workspace )\ + 4 -all and prebuilt (vivado, hsi and sdk workspace and prebuilt)" + puts "--help : display this help and exit" + puts "" + puts "Example: vivado -source ../scripts/script_main.tcl -mode batch -notrace -tclargs --part xc7z020clg484-1 --boardpart trenz.biz:te0720-02-1cf:part0:1.0 --clean" + } + + proc main {} { + global argc + global argv + # + set use_teprocedure "NA" + set use_labtoolsonly false + set use_run_labtools false + set use_clear_all false + set use_run_prebuild_sdk false + set use_zynq_programming false + set use_mcs_programming false + set use_bit_programming false + set use_basefolder false + set use_programming_app "NA" + set use_vivadogui 0 + set use_run 0 + set use_clean 0 + set use_board "NA" + cd .. + + puts "-----------------------------------------------------------------------" + init_pathvar + # + puts "-----------------------------------------------------------------------" + # + if {$argc == 0} { + puts "" + puts "INFO:(TE) Default configuration will be used." + puts "" + } else { + for {set option 0} {$option < $argc} {incr option} { + puts "INFO:(TE) Parameter Index: $option" + puts "INFO:(TE) Parameter Option: [lindex $argv $option]" + switch [lindex $argv $option] { + "--clear_all" { set use_clear_all true } + "--run_te_procedure" { set use_teprocedure [return_option $option]; incr option } + "--run_prebuild_sdk" { set use_run_prebuild_sdk true } + "--run_labtools" { set use_run_labtools true } + "--program_bin" { set use_zynq_programming true } + "--program_mcs" { set use_mcs_programming true } + "--program_bit" { set use_bit_programming true } + "--program_swapp" { set use_programming_app [return_option $option]; incr option } + "--use_basefolder" { set use_basefolder [return_option $option]; incr option } + "--labtools" { set use_labtoolsonly true } + "--run" { set use_run [return_option $option]; incr option } + "--boardpart" { set use_board [return_option $option]; incr option } + "--gui" { set use_vivadogui [return_option $option]; incr option } + "--clean" { set use_clean [return_option $option]; incr option } + "--help" { show_help_batchfile_commands } + "" { } + default { puts "Warning:(TE) unrecognised option: [lindex $argv $option]"; show_help } + } + } + } + + set starttime [clock seconds] + puts "-----------------------------------------------------------------------" + if {$use_clear_all} { + if {[catch {clear_project_all } result]} { puts "ERROR:(TE) Script (TE::INIT::clear_project_all) failed: $result."; return -code error} + } elseif {$use_teprocedure ne "NA"} { + if {[catch {run_te_procedure $use_teprocedure $use_board} result]} { puts "ERROR:(TE) Script (TE::INIT::run_te_procedure) failed: $result."; return -code error} + } elseif {$use_run_labtools} { + if {[catch {run_labtools $use_board } result]} { puts "ERROR:(TE) Script (TE::INIT::run_labtools) failed: $result."; return -code error} + } elseif {$use_run_prebuild_sdk} { + if {[catch {run_sdk $use_board } result]} { puts "ERROR:(TE) Script (TE::INIT::run_sdk) failed: $result."; return -code error} + } elseif {$use_bit_programming} { + if {[catch {program_fpga_bit $use_basefolder $use_board $use_programming_app $use_labtoolsonly} result]} { puts "ERROR:(TE) Script (TE::INIT::program_fpga_bit) failed: $result."; return -code error} + } elseif {$use_mcs_programming} { + if {[catch {program_fpga_mcs $use_basefolder $use_board $use_programming_app $use_labtoolsonly} result]} { puts "ERROR:(TE) Script (TE::INIT::program_fpga_mcs) failed: $result."; return -code error} + } elseif {$use_zynq_programming} { + if {[catch {program_zynq_bin $use_basefolder $use_board $use_programming_app $use_labtoolsonly} result]} { puts "ERROR:(TE) Script (TE::INIT::program_zynq_bin) failed: $result."; return -code error} + } else { + if {[catch {run_project $use_board $use_run $use_vivadogui $use_clean} result]} { puts "ERROR:(TE) Script (TE::INIT::run_project) failed: $result."; return -code error} + } + puts "-----------------------------------------------------------------------" + set stoptime [clock seconds] + set timeelapsed [expr $stoptime -$starttime] + + set report_file ${TE::LOG_PATH}/time_elapsed.txt + set fp_w [open ${report_file} "w"] + puts $fp_w "Times elapsed..." + puts $fp_w "$timeelapsed seconds" + puts $fp_w "..." + close $fp_w + + #--------------------------------------------- + } + + + + if {[catch {main} result]} { + puts "ERROR:(TE) Script (TE::main) failed: $result." + } + } +} \ No newline at end of file diff --git a/zynqberrydemo1/scripts/script_sdsoc.tcl b/zynqberrydemo1/scripts/script_sdsoc.tcl new file mode 100644 index 0000000..4f4e2c2 --- /dev/null +++ b/zynqberrydemo1/scripts/script_sdsoc.tcl @@ -0,0 +1,367 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/04/11 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2016/10/06 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval SDSOC { + + #------------------------------------ + #--create_sdsoc_structure: ... + proc create_sdsoc_structure {} { + #clear old sdsoc + puts "Info:(TE) Delete old SDSOC Project Structure (${TE::SDSOC_PATH})." + TE::UTILS::clean_sdsoc + puts "Info:(TE) Create new SDSOC Project Structure(${TE::SDSOC_PATH})." + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + #-------------------- + #old 2015.4 + # if {[file exists ${TE::SET_PATH}/sdsoc/arm-xilinx-eabi]} { + # file copy -force ${TE::SET_PATH}/sdsoc/arm-xilinx-eabi ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + # } else { + # file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/arm-xilinx-eabi + # } + # if {[file exists ${TE::SET_PATH}/sdsoc/arm-xilinx-linux-gnueabi]} { + # file copy -force ${TE::SET_PATH}/sdsoc/arm-xilinx-linux-gnueabi ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + # } else { + # file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/arm-xilinx-linux-gnueabi + # } + #new 2016.2 + #different settings between 7Series and UltraScaleZynq + if {$TE::IS_ZSYS || $TE::IS_MSYS } { + if {[file exists ${TE::SET_PATH}/sdsoc/aarch32-none]} { + file copy -force ${TE::SET_PATH}/sdsoc/aarch32-none ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + #used for different memory versions + if {[file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld_${TE::SHORTDIR}]} { + if {[file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld]} { + file delete -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld + } + file copy -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld_${TE::SHORTDIR} ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld + } + } else { + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none + } + } elseif {$TE::IS_ZUSYS} { + if {[file exists ${TE::SET_PATH}/sdsoc/aarch64-none-elf]} { + file copy -force ${TE::SET_PATH}/sdsoc/aarch64-none-elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + #used for different memory versions + if {[file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld_${TE::SHORTDIR}]} { + if {[file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld]} { + file delete -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld + } + file copy -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld_${TE::SHORTDIR} ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld + } + } else { + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf + } + } + #-------------------- + if {[file exists ${TE::SET_PATH}/sdsoc/boot]} { + file copy -force ${TE::SET_PATH}/sdsoc/boot ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + set prebuit_pl_path ${TE::PREBUILT_OS_PATH}/petalinux/default/ + if {[file exists ${TE::PREBUILT_OS_PATH}/petalinux/${TE::SHORTDIR}]} { + set prebuit_pl_path ${TE::PREBUILT_OS_PATH}/petalinux/${TE::SHORTDIR} + } + if {$TE::IS_ZSYS || $TE::IS_MSYS } { + #search for petalinux generated fsbl.elf + set elf_list [] + if { [catch {set elf_list [ glob ${prebuit_pl_path}/*.elf ] }] } { + } else { + foreach elf $elf_list { + if {[string match *fsbl* $elf]} { + file copy -force $elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/zynq_fsbl.elf + } + } + } + #search for sdk generated fsbl.elf -> overwrite petalinux fsbl.elf if exist + set elf_list [] + if { [catch {set elf_list [ glob ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/*.elf ] }] } { + } else { + foreach elf $elf_list { + if {[string match *fsbl* $elf]} { + file copy -force $elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/zynq_fsbl.elf + } + } + } + #copy rest of prebuilt files + # if {[file exists ${prebuit_pl_path}/urootfs.cpio.gz]} { + # file copy -force ${prebuit_pl_path}/urootfs.cpio.gz ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/uramdisk.image.gz + # } + # if {[file exists ${prebuit_pl_path}/system.dtb]} { + # file copy -force ${prebuit_pl_path}/system.dtb ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/devicetree.dtb + # } + # if {[file exists ${prebuit_pl_path}/uImage]} { + # file copy -force ${prebuit_pl_path}/uImage ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + if {[file exists ${prebuit_pl_path}/image.ub]} { + file copy -force ${prebuit_pl_path}/image.ub ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + if {[file exists ${prebuit_pl_path}/u-boot.elf]} { + file copy -force ${prebuit_pl_path}/u-boot.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + } elseif {$TE::IS_ZUSYS} { + #search for petalinux generated fsbl.elf + set elf_list [] + if { [catch {set elf_list [ glob ${prebuit_pl_path}/*.elf ] }] } { + } else { + foreach elf $elf_list { + if {[string match *fsbl* $elf]} { + file copy -force $elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/fsbl.elf + } + } + } + #search for sdk generated fsbl.elf -> overwrite petalinux fsbl.elf if exist + set elf_list [] + if { [catch {set elf_list [ glob ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/*.elf ] }] } { + } else { + foreach elf $elf_list { + if {[string match *fsbl* $elf]} { + file copy -force $elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/fsbl.elf + } + } + } + # #copy rest of prebuilt files + # if {[file exists ${prebuit_pl_path}/urootfs.cpio.gz]} { + # file copy -force ${prebuit_pl_path}/urootfs.cpio.gz ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/uramdisk.tar.gz + # } + # if {[file exists ${prebuit_pl_path}/system.dtb]} { + # file copy -force ${prebuit_pl_path}/system.dtb ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + # if {[file exists ${prebuit_pl_path}/uImage]} { + # file copy -force ${prebuit_pl_path}/uImage ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + # if {[file exists ${prebuit_pl_path}/bl31.elf]} { + # file copy -force ${prebuit_pl_path}/bl31.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + # if {[file exists ${prebuit_pl_path}/u-boot.elf]} { + # file copy -force ${prebuit_pl_path}/u-boot.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + #copy rest of prebuilt files + if {[file exists ${prebuit_pl_path}/image.ub]} { + file copy -force ${prebuit_pl_path}/image.ub ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + if {[file exists ${prebuit_pl_path}/bl31.elf]} { + file copy -force ${prebuit_pl_path}/bl31.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + if {[file exists ${prebuit_pl_path}/u-boot.elf]} { + file copy -force ${prebuit_pl_path}/u-boot.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + } + } else { + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot + } + #-------------------- + if {[file exists ${TE::SET_PATH}/sdsoc/samples]} { + file copy -force ${TE::SET_PATH}/sdsoc/samples ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + } else { + # file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/samples + } + #-------------------- + if {[file exists ${TE::SET_PATH}/sdsoc/hardware]} { + file copy -force ${TE::SET_PATH}/sdsoc/hardware ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit]} { + file copy -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/hardware/prebuilt/bitstream.bit + } + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf]} { + file copy -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/hardware/prebuilt/export/${TE::PR_TOPLEVELNAME}.hdf + } + } else { + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/hardware + } + } + #------------------------------------ + #--check_vivado_project: ... + proc check_and_modify_vivado_project {check_only} { + if {$check_only} { + puts "---------------------" + puts "Info:(TE) Run SDSOC check:" + puts " Notes:" + puts " -Errors: could not fixed automaticly" + puts " -Warnings: can be fixed automaticly or can be ignored." + puts " Run:" + } else { puts "Info:(TE) Run SDSOC check (modify project):"} + #------------------ + #check sdsoc environment : + # + if {!$TE::SDSOC_AVAILABLE } { + set txt "Error:(TE) SDSOC environment not set." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) SDSOC environment check passed";} + #------------------ + #check zip program : + # + if {![file exists $TE::ZIP_PATH]} { + set txt "Error:(TE) SDSOC ZIP program not found ($TE::ZIP_PATH)." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) SDSOC ZIP program check passed";} + #------------------ + #check pfm settings : + #file to generate hw.pfm + if {![file exists ${TE::SET_PATH}/sdsoc/sdsoc_pfm.tcl]} { + set txt "Error:(TE) Project specific TCL-File for HW_PFM-generation not found (${TE::SET_PATH}/sdsoc_pfm.tcl)." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) HW PFM check passed";} + #------------------ + #check pfm settings : + #file to generate sw.pfm (currently is only a copy) + if {![file exists ${TE::SET_PATH}/sdsoc/sdsoc_sw.pfm]} { + set txt "Error:(TE) Project specific File for SW_PFM-generation not found (${TE::SET_PATH}/sdsoc_sw.pfm)." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) SW PFM check passed";} + #------------------ + #check project name: + #must be platform_name (${TE::VPROJ_NAME}) + if {![file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.xpr]} { + set txt "Error:(TE) Vivado project name is not SDSOC compatible, should be: ${TE::VPROJ_NAME}.xpr" + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Vivado project name check passed";} + #------------------ + #check toplevel name: + #should be _wrapper + set toplevel [get_property top [current_fileset]] + if {![string match *_wrapper $toplevel]} { + set txt "Error:(TE) Top level is not SDSOC compatible, should be: *_wrapper" + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Top Level Name check passed";} + # if {![string match ${TE::VPROJ_NAME}* $toplevel]} { + # set txt "Warning:(TE) Current top level should be: ${TE::VPROJ_NAME}*" + # if {!$check_only} { + # # currently nothing must be done + # # return -code error $txt + # } else {puts " $txt";} + # } + #------------------ + #check processor system: + #must be processor system + if {!$TE::IS_ZSYS && !$TE::IS_ZUSYS && !$TE::IS_MSYS } { + set txt "Error:(TE) Block Design contains no processor system (Checked with TE::INIT::check_bdtyp)." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Processor check passed";} + #------------------ + #check project language: + #must be verilog + if {[get_property target_language [current_project]] ne "Verilog"} { + set txt "Warning:(TE) Vivado isn't a Verilog Project." + if {!$check_only} { + #change language + set_property target_language Verilog [current_project] + puts "Info:(TE) Target Language check passed (Project Modify:Set target Language to Verilog)" + # return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Target Language check passed";} + #------------------ + #check bd files: + #currently only one bdfile supported (TE) + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + set txt "Error:(TE) No Block Design found. Should be only one!" + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } elseif {[llength $bd_files]>1 } { + set txt "Error:(TE) More than one Block Design found. Should be only one!" + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) BD-Design count check passed";} + #------------------ + #check top level file language: + #must be verilog + set bd $bd_files + # open_bd_design $bd -quiet + # set bd_name [get_bd_designs] + set bd_name [open_bd_design $bd -quiet] + if {![file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.v]} { + set txt "Warning:(TE) Toplevel file should be Verilog." + if {!$check_only} { + #remove old vhdl toplevel + remove_files ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.vhd + file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.vhd + #make verilog top + make_wrapper -files [get_files $bd] -top + add_files -norecurse ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.v + update_compile_order -fileset ${TE::SOURCE_NAME} + update_compile_order -fileset ${TE::SIM_NAME} + puts "Info:(TE) Top Level check passed (Project Modify: Regenerate Toplevel as Verilog file)" + # return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Top Level check passed";} + close_bd_design [get_bd_designs $bd] + #------------------ + #check board part : + #board part not allowed + if {[get_property board_part [current_project]] ne ""} { + set txt "Warning:(TE) Board Part usage is not allowed for SDSOC." + if {!$check_only} { + TE::ADV::beta_hw_remove_board_part + puts "Info:(TE) Board Part check passed (Project Modify: Remove Board Part properties)" + # return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Board Part check passed";} + #------------------ + puts "---------------------" + } + + #------------------------------------ + #--export_vivado_project: ... + proc export_vivado_sdsoc_project {} { + puts "Info:(TE) Create SDSOC Vivado Project on: ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/vivado" + if { [file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/vivado] } { + file delete -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/vivado + } + archive_project ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/${TE::VPROJ_NAME}.xpr.zip -temp_dir ${TE::VPROJ_PATH}/.Xil/Vivado-xxxx- -force -include_config_settings + TE::EXT::unzip_project ${TE::VPROJ_NAME}.xpr.zip ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + file rename -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/${TE::VPROJ_NAME} ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/vivado + file delete -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/${TE::VPROJ_NAME}.xpr.zip + } + #------------------------------------ + #--create_sdsoc_pfm: ... + proc create_sdsoc_pfm {} { + puts "Info:(TE) Create SDSOC Vivado Project pfm: ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/" + #open bd design + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + puts "Warning:(TE) No BD-File found." + } + foreach bd $bd_files { + open_bd_design $bd + } + #generate hw pfm + puts "Info:(TE) Generate ${TE::VPROJ_NAME}_hw.pfm" + source -notrace ${TE::SET_PATH}/sdsoc/sdsoc_pfm.tcl + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}_hw.pfm ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + #generate sw pfm (todo generate content from existing files) + puts "Info:(TE) Generate ${TE::VPROJ_NAME}_sw.pfm" + file copy -force ${TE::SET_PATH}/sdsoc/sdsoc_sw.pfm ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/${TE::VPROJ_NAME}_sw.pfm + } + # # ------------------------------------------------------- + } + + puts "Info:(TE) Load SDSOC script finished" +} + + diff --git a/zynqberrydemo1/scripts/script_settings.tcl b/zynqberrydemo1/scripts/script_settings.tcl new file mode 100644 index 0000000..be6c429 --- /dev/null +++ b/zynqberrydemo1/scripts/script_settings.tcl @@ -0,0 +1,874 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/02 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/06/28 $ +# -------------------------------------------------------------------- +# -- 2017/06/13 new release version +# -- 2017/06/28 new board part csv version +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval ::TE { + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # TE variable declaration + # ----------------------------------------------------------------------------------------------------------------------------------------- + # overwrite Setting: + # create TCL file: /settings/development_settings.tcl + # overwrite example: + # set TE:: + # set TE::GEN_HW_BIT false + # ----------------------------------- + # Unsupported Settings: + # --------------------- + # Currently only one BD is allowed + # Multi BD Design is official not supported (maybe not all functions run correctly): + # For Multi BD Design do following: + # 1. set variable BD_MULTI to true + # 2. Make own Top-level File (Name: _top) in the folder "/hdl/" with file name: "_top.vhd" or "_top.v" + variable BD_MULTI false + # + variable DESIGNRUNS [list] + # ----------------------------------- + # Build Settings: + # Attention: there are dependencies between this properties! + # --------------------- + variable GEN_HW_DELETEOLDFILES true + variable GEN_HW_BIT true + variable GEN_HW_MCS true + variable GEN_HW_RPT true + variable GEN_HW_HDF true + variable GEN_SW_HSI true + variable GEN_SW_BIF true + variable GEN_SW_BIN true + variable GEN_SW_BITMCS true + variable GEN_SW_USEPREBULTHDF false + variable GEN_SW_FORCEBOOTGEN false + # ----------------------------------- + # Basic Settings: + # Attention: do not change following variables manually! + # --------------------- + # project path + variable BASEFOLDER + variable VPROJ_NAME + variable VPROJ_PATH + variable VLABPROJ_PATH + variable BOARDDEF_PATH + variable FIRMWARE_PATH + variable IP_PATH + variable BD_PATH + variable XDC_PATH + variable HDL_PATH + variable SET_PATH + variable WORKSPACE_PATH + variable WORKSPACE_HSI_PATH + variable WORKSPACE_SDK_PATH + variable LIB_PATH + variable PREBUILT_PATH + variable PREBUILT_HW_PATH + variable PREBUILT_SW_PATH + variable PREBUILT_BI_PATH + variable PREBUILT_OS_PATH + variable SCRIPT_PATH + variable DOC_PATH + variable LOG_PATH + variable BACKUP_PATH + variable ZIP_PATH + variable SDSOC_PATH + # ----------------------------------- + variable ZIP_IGNORE_LIST [list] + # ----------------------------------- + variable BATCH_FILE_NAME + variable VIVADO_AVAILABLE + variable LABTOOL_AVAILABLE + variable SDK_AVAILABLE + variable SDSOC_AVAILABLE + # ----------------------------------- + variable XILINXGIT_DEVICETREE + variable XILINXGIT_UBOOT + variable XILINXGIT_LINUX + # ----------------------------------- + # board_files + variable ID "NA" + variable PRODID "NA" + variable BOARDPART "NA" + variable PARTNAME "NA" + variable SHORTDIR "NA" + variable ZYNQFLASHTYP "NA" + variable FPGAFLASHTYP "NA" + variable CFGMEM_IF "NA" + variable CFGMEM_MEMSIZE_MB "NA" + # ----------------------------------- + #project run (use default name) + #for renaming use prefix sim*, syn*, imp* and con*! + variable TIMEOUT 120 + variable RUNNING_JOBS 4 + #todo: multiple runs and strategies and modified strategies + variable SIM_NAME sim_1 + variable SYNTH_NAME synth_1 + variable IMPL_NAME impl_1 + variable CONST_NAME constrs_1 + variable SOURCE_NAME sources_1 + # ----------------------------------- + # check csv file ids + variable SCRIPTVER "2017.1.03" + variable BOARDDEF_CSV "1.3" + variable SW_IP_CSV "2.0" + variable BDMOD_CSV "1.1" + variable ZIP_CSV "1.0" + # ----------------------------------- + variable SW_APPLIST [list] + #BOARD_DEFINITION currently in BDEF todo set to init in settings + variable BD_MOD_COMMENT [list] + variable BD_MOD_ADD [list] + variable BD_MOD_PCOMMENT [list] + variable BD_MOD_PADD [list] + variable BD_TCLNAME "NA" + variable PR_TOPLEVELNAME "NA" + variable IS_ZSYS false + variable IS_ZUSYS false + variable IS_MSYS false + variable IS_FSYS false + # ----------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished TE variables declaration + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + namespace eval INIT { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # initial functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--import_usr_tcl: + proc init_usr_tcl {} { + # hidden function: official not supported + set usr_script [] + if { ![catch {set usr_script [glob -join -dir ${TE::SET_PATH}/usr/ *.tcl]}] } { + TE::UTILS::te_msg TE_INIT-58 INFO "Load additional user TCL-script:\n ${usr_script}" + uplevel 1 [ list ::source ${usr_script}] + } + } + #-------------------------------- + #--print_version: + proc print_version {} { + set viv_version "NA" + if {[catch {set viv_version [lindex [split [::version] "\n"] 0]}]} { set viv_version "NA" } + set TE::BATCH_FILE_NAME "NA" + if {[catch {set TE::BATCH_FILE_NAME $::env(batchfile_name)}]} { set TE::BATCH_FILE_NAME "NA" } + + TE::UTILS::te_msg TE_INIT-0 INFO "Script Info:\n \ + Vivado Version: $viv_version\n \ + TE Script Version: $TE::SCRIPTVER\n \ + Board Part (Definition Files) CSV Version: $TE::BOARDDEF_CSV\n \ + Software IP CSV Version: $TE::SW_IP_CSV\n \ + Board Design Modify CSV Version: $TE::BDMOD_CSV\n \ + ZIP ignore CSV Version: $TE::ZIP_CSV\n \ + ---\n \ + Start project with: $TE::BATCH_FILE_NAME\n \ + ------" + } + #-------------------------------- + #--print_environment_settings: + proc print_environment_settings {} { + set TE::VIVADO_AVAILABLE 0 + set TE::LABTOOL_AVAILABLE 0 + set TE::SDK_AVAILABLE 0 + set TE::SDSOC_AVAILABLE 0 + [catch {set TE::VIVADO_AVAILABLE $::env(VIVADO_AVAILABLE)}] + [catch {set TE::LABTOOL_AVAILABLE $::env(LABTOOL_AVAILABLE)}] + [catch {set TE::SDK_AVAILABLE $::env(SDK_AVAILABLE)}] + [catch {set TE::SDSOC_AVAILABLE $::env(SDSOC_AVAILABLE)}] + TE::UTILS::te_msg TE_INIT-1 INFO "Script Environment:\n \ + Vivado Setting: $TE::VIVADO_AVAILABLE \n \ + LabTools Setting: $TE::LABTOOL_AVAILABLE \n \ + SDK Setting: $TE::SDK_AVAILABLE \n \ + SDSOC Setting: $TE::SDSOC_AVAILABLE \n \ + ------" + + if {$TE::SDK_AVAILABLE==1 && $TE::SDSOC_AVAILABLE==1} { + TE::UTILS::te_msg TE_INIT-2 WARNING "SDK settings are overwritten by SDSOC settings." + } + } + #-------------------------------- + #--init_pathvar: + proc init_pathvar {} { + set tmppath [pwd] + if {[file tail [pwd]]=="vivado"} { + cd .. + } + set TE::BASEFOLDER [pwd] + set TE::VPROJ_NAME [file tail [pwd]] + set TE::VPROJ_PATH [pwd]/vivado + set TE::VLABPROJ_PATH [pwd]/vivado_lab + #-- + set TE::BOARDDEF_PATH [pwd]/board_files + set TE::FIRMWARE_PATH [pwd]/firmware + #-- + set TE::IP_PATH [pwd]/ip_lib + set TE::BD_PATH [pwd]/block_design + set TE::XDC_PATH [pwd]/constraints + set TE::HDL_PATH [pwd]/hdl + set TE::SET_PATH [pwd]/settings + #-- + set TE::WORKSPACE_PATH [pwd]/workspace + set TE::WORKSPACE_HSI_PATH ${TE::WORKSPACE_PATH}/hsi + set TE::WORKSPACE_SDK_PATH ${TE::WORKSPACE_PATH}/sdk + #-- + set TE::LIB_PATH [pwd]/sw_lib + set TE::SCRIPT_PATH [pwd]/scripts + set TE::DOC_PATH [pwd]/doc + #-- + set TE::PREBUILT_PATH [pwd]/prebuilt + set TE::PREBUILT_BI_PATH ${TE::PREBUILT_PATH}/boot_images + set TE::PREBUILT_HW_PATH ${TE::PREBUILT_PATH}/hardware + set TE::PREBUILT_SW_PATH ${TE::PREBUILT_PATH}/software + set TE::PREBUILT_OS_PATH ${TE::PREBUILT_PATH}/os + #-- + set TE::LOG_PATH [pwd]/v_log + set TE::BACKUP_PATH [pwd]/backup + #-- + set TE::ZIP_PATH "" + [catch {set TE::ZIP_PATH $::env(ZIP_PATH)}] + #-- + set TE::SDSOC_PATH [pwd]/sdsoc + set TE::XILINXGIT_DEVICETREE "" + [catch {set TE::XILINXGIT_DEVICETREE $::env(XILINXGIT_DEVICETREE)}] + set TE::XILINXGIT_UBOOT "" + [catch {set TE::XILINXGIT_UBOOT $::env(XILINXGIT_UBOOT)}] + set TE::XILINXGIT_LINUX "" + [catch {set TE::XILINXGIT_LINUX $::env(XILINXGIT_LINUX)}] + #-- + TE::UTILS::te_msg TE_INIT-3 INFO "Initial project names and paths:\n \ + TE::VPROJ_NAME: $TE::VPROJ_NAME \n \ + TE::VPROJ_PATH: $TE::VPROJ_PATH \n \ + TE::VLABPROJ_PATH: $TE::VLABPROJ_PATH \n \ + TE::BOARDDEF_PATH: $TE::BOARDDEF_PATH \n \ + TE::FIRMWARE_PATH: $TE::FIRMWARE_PATH \n \ + TE::IP_PATH: $TE::IP_PATH \n \ + TE::BD_PATH: $TE::BD_PATH \n \ + TE::XDC_PATH: $TE::XDC_PATH \n \ + TE::HDL_PATH: $TE::HDL_PATH \n \ + TE::SET_PATH: $TE::SET_PATH \n \ + TE::WORKSPACE_HSI_PATH: $TE::WORKSPACE_HSI_PATH \n \ + TE::WORKSPACE_SDK_PATH: $TE::WORKSPACE_SDK_PATH \n \ + TE::LIB_PATH: $TE::LIB_PATH \n \ + TE::SCRIPT_PATH: $TE::SCRIPT_PATH \n \ + TE::DOC_PATH: $TE::DOC_PATH \n \ + TE::PREBUILT_BI_PATH: $TE::PREBUILT_BI_PATH \n \ + TE::PREBUILT_HW_PATH: $TE::PREBUILT_HW_PATH \n \ + TE::PREBUILT_SW_PATH: $TE::PREBUILT_SW_PATH \n \ + TE::PREBUILT_OS_PATH: $TE::PREBUILT_OS_PATH \n \ + TE::LOG_PATH: $TE::LOG_PATH \n \ + TE::BACKUP_PATH: $TE::BACKUP_PATH \n \ + TE::ZIP_PATH: $TE::ZIP_PATH \n \ + TE::SDSOC_PATH: $TE::SDSOC_PATH \n \ + TE::XILINXGIT_DEVICETREE: $TE::XILINXGIT_DEVICETREE \n \ + TE::XILINXGIT_UBOOT: $TE::XILINXGIT_UBOOT \n \ + TE::XILINXGIT_LINUX: $TE::XILINXGIT_LINUX \n \ + ------" + + cd $tmppath + } + #-------------------------------- + #--init_board: + proc init_board {ID POS} { + TE::BDEF::get_check_unique_name $ID $POS + + set TE::ID [TE::BDEF::get_id $ID $POS] + set TE::PRODID [TE::BDEF::get_prodid $ID $POS] + set TE::BOARDPART [TE::BDEF::get_boardname $ID $POS] + set TE::PARTNAME [TE::BDEF::get_partname $ID $POS] + set TE::SHORTDIR [TE::BDEF::get_shortname $ID $POS] + set TE::ZYNQFLASHTYP [TE::BDEF::get_zynqflashtyp $ID $POS] + set tmp [TE::BDEF::get_fpgaflashtyp $ID $POS] + #todo extrakt CFGMEM_IF and CFGMEM_MEMSIZE_MB from FPGAFLASHTYP-name and from bitfile configuration + set tmp [split $tmp "|"] + if {[llength $tmp] eq 3} { + set TE::FPGAFLASHTYP [lindex $tmp 0] + set TE::CFGMEM_IF [lindex $tmp 1] + set TE::CFGMEM_MEMSIZE_MB [lindex $tmp 2] + } else { + set TE::FPGAFLASHTYP $tmp + set TE::CFGMEM_IF "NA" + set TE::CFGMEM_MEMSIZE_MB "NA" + } + TE::UTILS::te_msg TE_INIT-4 INFO "Board Part definition:\n \ + TE::ID: $TE::ID \n \ + TE::PRODID: $TE::PRODID \n \ + TE::PARTNAME: $TE::PARTNAME \n \ + TE::BOARDPART: $TE::BOARDPART \n \ + TE::SHORTDIR: $TE::SHORTDIR \n \ + TE::ZYNQFLASHTYP: $TE::ZYNQFLASHTYP \n \ + TE::FPGAFLASHTYP: $TE::FPGAFLASHTYP \n \ + ------" + } + #-------------------------------- + #--init_part_only: init fpga part if found in csv (used if board part is not defined on open project) + proc init_part_only {partname} { + #--check if fpga part is unique + #-2 not found + #-1 some same + #0 unique + #1 all same + set pcheck [TE::BDEF::get_check_unique_name $partname 2] + if {$pcheck == 0 } { + set TE::ID [TE::BDEF::get_id $partname 2] + set TE::PRODID "NA" + set TE::BOARDPART "NA" + set TE::PARTNAME [TE::BDEF::get_partname $partname 2] + set TE::SHORTDIR [TE::BDEF::get_shortname $partname 2] + set TE::ZYNQFLASHTYP [TE::BDEF::get_zynqflashtyp $partname 2] + set tmp [TE::BDEF::get_fpgaflashtyp $partname 2] + #todo extrakt CFGMEM_IF and CFGMEM_MEMSIZE_MB from FPGAFLASHTYP-name and from bitfile configuration + set tmp [split $tmp "|"] + if {[llength $tmp] eq 3} { + set TE::FPGAFLASHTYP [lindex $tmp 0] + set TE::CFGMEM_IF [lindex $tmp 1] + set TE::CFGMEM_MEMSIZE_MB [lindex $tmp 2] + } else { + set TE::FPGAFLASHTYP $tmp + set TE::CFGMEM_IF "NA" + set TE::CFGMEM_MEMSIZE_MB "NA" + } + + TE::UTILS::te_msg TE_INIT-5 WARNING "Board Part definition initialisation with unique part name:\n \ + TE::ID: $TE::ID \n \ + TE::PRODID: $TE::PRODID \n \ + TE::PARTNAME: $TE::PARTNAME \n \ + TE::BOARDPART: $TE::BOARDPART \n \ + TE::SHORTDIR: $TE::SHORTDIR \n \ + TE::ZYNQFLASHTYP: $TE::ZYNQFLASHTYP \n \ + TE::FPGAFLASHTYP: $TE::FPGAFLASHTYP \n \ + ------" + } elseif {$pcheck == 1 } { + #todo check if flash is the same on all definitions + set TE::ID "NA" + set TE::PRODID "NA" + set TE::BOARDPART "NA" + set TE::PARTNAME [TE::BDEF::get_partname $partname 2] + #short name is fpga name + set TE::SHORTDIR [TE::BDEF::get_shortname $partname 2] + set TE::ZYNQFLASHTYP "NA" + set TE::FPGAFLASHTYP "NA" + set TE::CFGMEM_IF "NA" + set TE::CFGMEM_MEMSIZE_MB "NA" + TE::UTILS::te_msg TE_INIT-6 WARNING "Board Part definition initialisation with same part name:\n \ + TE::ID: $TE::ID \n \ + TE::PRODID: $TE::PRODID \n \ + TE::PARTNAME: $TE::PARTNAME \n \ + TE::BOARDPART: $TE::BOARDPART \n \ + TE::SHORTDIR: $TE::SHORTDIR \n \ + TE::ZYNQFLASHTYP: $TE::ZYNQFLASHTYP \n \ + TE::FPGAFLASHTYP: $TE::FPGAFLASHTYP \n \ + ------" + } else { + set TE::ID "NA" + set TE::PRODID "NA" + set TE::BOARDPART "NA" + set TE::PARTNAME $partname + set TE::SHORTDIR $partname + set TE::ZYNQFLASHTYP "NA" + set TE::FPGAFLASHTYP "NA" + set TE::CFGMEM_IF "NA" + set TE::CFGMEM_MEMSIZE_MB "NA" + puts "Warning:(TE) Part name not found, use requested name:" + TE::UTILS::te_msg TE_INIT-7 {CRITICAL WARNING} "Board Part definition initialisation with unknown part name:\n \ + TE::ID: $TE::ID \n \ + TE::PRODID: $TE::PRODID \n \ + TE::PARTNAME: $TE::PARTNAME \n \ + TE::BOARDPART: $TE::BOARDPART \n \ + TE::SHORTDIR: $TE::SHORTDIR \n \ + TE::ZYNQFLASHTYP: $TE::ZYNQFLASHTYP \n \ + TE::FPGAFLASHTYP: $TE::FPGAFLASHTYP \n \ + ------" + } + + } + #-------------------------------- + #--check_bdtyp: check BD typ + proc check_bdtyp {} { + set bd_files [] + set TE::BD_TCLNAME "NA" + set TE::PR_TOPLEVELNAME "NA" + set TE::IS_ZSYS false + set TE::IS_ZUSYS false + set TE::IS_MSYS false + set TE::IS_FSYS false + #get bd_filelist + set bd_files [TE::UTILS::search_bd_files] + foreach bd $bd_files { + set TE::BD_TCLNAME [file tail [file rootname $bd]] + set TE::PR_TOPLEVELNAME "[string trim $TE::BD_TCLNAME "_bd"]_wrapper" + TE::UTILS::te_msg TE_INIT-8 INFO "Found BD-Design:\n \ + TE::BD_TCLNAME: $TE::BD_TCLNAME \n \ + TE::PR_TOPLEVELNAME: $TE::PR_TOPLEVELNAME \n \ + ------" + #check typ for other functions + if {[string match *zsys* $TE::BD_TCLNAME ]} {set TE::IS_ZSYS true; TE::UTILS::te_msg TE_INIT-9 STATUS " TE::IS_ZSYS: $TE::IS_ZSYS" + } elseif {[string match *zusys* $TE::BD_TCLNAME ]} {set TE::IS_ZUSYS true; TE::UTILS::te_msg TE_INIT-10 STATUS " TE::IS_ZUSYS: $TE::IS_ZUSYS" + } elseif {[string match *msys* $TE::BD_TCLNAME ]} {set TE::IS_MSYS true; TE::UTILS::te_msg TE_INIT-11 STATUS " TE::IS_MSYS: $TE::IS_MSYS" + } elseif {[string match *fsys* $TE::BD_TCLNAME ]} {set TE::IS_FSYS true; TE::UTILS::te_msg TE_INIT-12 STATUS " TE::IS_FSYS: $TE::IS_FSYS" + } else { + TE::UTILS::te_msg TE_INIT-13 WARNING "Not all TE-functions support unknown BD Filename. Use: \n \ + \"*zsys*.tcl\" for Systems with Zynq \n \ + \"*zusys*.tcl\" for Systems with UltraScale Zynq \n \ + \"*msys*.tcl\" for Systems with MicroBlaze \n \ + \"*fsys*.tcl\" for Systems with FPGA-Fabric design only \n \ + ------" + } + } + } + #-------------------------------- + #--init_boardlist: + proc init_boardlist {} { + set board_files "" + set TE::BDEF::BOARD_DEFINITION [list] + if { [catch {set board_files [ glob $TE::BOARDDEF_PATH/*board_files_mod.csv ] }] } { + if { [catch {set board_files [ glob $TE::BOARDDEF_PATH/*board_files.csv ] }] } { + TE::UTILS::te_msg TE_INIT-14 WARNING "No board part definition list found (Path: ${TE::BOARDDEF_PATH})." + } + } else { + TE::UTILS::te_msg TE_INIT-15 WARNING "Modified board part definition list found (File: ${board_files})." + } + if {$board_files ne ""} { + TE::UTILS::te_msg TE_INIT-16 INFO "Read board part definition list (File ${board_files})." + set fp [open "${board_files}" r] + set file_data [read $fp] + close $fp + # set TE::BDEF::BOARD_DEFINITION [list] + set data [split $file_data "\n"] + foreach line $data { + # check file version ignore comments and empty lines + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + set tmp [split $line "="] + if {[string match [lindex $tmp 1] $TE::BOARDDEF_CSV] != 1} { + TE::UTILS::te_msg TE_INIT-17 ERROR "Wrong board part definition CSV version (${TE::BOARDDEF_PATH}/board_files.csv) get [lindex $tmp 1] expected ${TE::BOARDDEF_CSV}." + return -code error "Wrong board part definition CSV version (${TE::BOARDDEF_PATH}/board_files.csv) get [lindex $tmp 1] expected ${TE::BOARDDEF_CSV}." + } + } elseif {[string match *#* $line] != 1 && [string length $line] > 0} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #splitt and append + set tmp [split $line ","] + lappend TE::BDEF::BOARD_DEFINITION $tmp + } + } + } + } + #-------------------------------- + #--init_app_list: + proc init_app_list {} { + set TE::SW_APPLIST [list] + if {[file exists ${TE::LIB_PATH}/apps_list.csv]} { + TE::UTILS::te_msg TE_INIT-18 INFO "Read Software list (File: ${TE::LIB_PATH}/apps_list.csv)." + set fp [open "${TE::LIB_PATH}/apps_list.csv" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + # set fsbl_name "" + foreach line $data { + # check file version ignore comments and empty lines + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #check version + set tmp [split $line "="] + if {[string match [lindex $tmp 1] $TE::SW_IP_CSV] != 1} { + TE::UTILS::te_msg TE_INIT-19 ERROR "Wrong Software Definition CSV Version (${TE::LIB_PATH}/apps_list.csv) get [lindex $tmp 1] expected ${TE::SW_IP_CSV}." + return -code error "Wrong Software Definition CSV Version (${TE::LIB_PATH}/apps_list.csv) get [lindex $tmp 1] expected $TE::SW_IP_CSV" + } + } elseif {[string match *#* $line] != 1 && [string length $line] > 0} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #splitt and append + set tmp [split $line ","] + lappend TE::SW_APPLIST $tmp + } + } + #------------------------------------------ + if {![file exists ${TE::XILINXGIT_DEVICETREE}]} { + set tmp_index -1 + foreach sw_applist_line ${TE::SW_APPLIST} { + incr tmp_index + #currently remove Device Tree from list (currently only additonal files) + if {[lindex $sw_applist_line 2] eq "DTS" } { + TE::UTILS::te_msg TE_INIT-20 {CRITICAL WARNING} "Xilinx Devicetree git clone path not found (Path: ${TE::XILINXGIT_DEVICETREE}). Device-Tree generation will be removed from apps_list.csv" + set TE::SW_APPLIST [lreplace $TE::SW_APPLIST $tmp_index $tmp_index] + } + } + } + #------------------------------------------ + } else { + TE::UTILS::te_msg TE_INIT-21 INFO "No software apps_list used." + } + } + #-------------------------------- + #--init_zip_ignore_list: + proc init_zip_ignore_list {} { + set TE::ZIP_IGNORE_LIST [list] + if {[file exists ${TE::SET_PATH}/zip_ignore_list.csv]} { + TE::UTILS::te_msg TE_INIT-22 INFO "Read ZIP ignore list (File: ${TE::LIB_PATH}/apps_list.csv)." + set fp [open "${TE::SET_PATH}/zip_ignore_list.csv" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + foreach line $data { + # check file version ignore comments and empty lines + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #check version + set tmp [split $line "="] + if {[string match [lindex $tmp 1] $TE::ZIP_CSV] != 1} { + TE::UTILS::te_msg TE_INIT-23 ERROR " Wrong Zip ignore definition CSV Version (${TE::SET_PATH}/zip_ignore_list.csv) get [lindex $tmp 1] expected ${TE::ZIP_CSV}." + return -code error "Wrong Zip ignore definition CSV Version (${TE::SET_PATH}/zip_ignore_list.csv) get [lindex $tmp 1] expected ${TE::ZIP_CSV}." + } + } elseif {[string match *#* $line] != 1 && [string length $line] > 0} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #splitt and append + set tmp [split $line ","] + lappend TE::ZIP_IGNORE_LIST $tmp + } + } + } else { + TE::UTILS::te_msg TE_INIT-24 INFO "No Zip ignore list used." + } + } + #-------------------------------- + #--init_mod_list: + proc init_mod_list {} { + set TE::BD_MOD_COMMENT [list] + set TE::BD_MOD_ADD [list] + set TE::BD_MOD_PCOMMENT [list] + set TE::BD_MOD_PADD [list] + if {[file exists ${TE::BD_PATH}/mod_bd.csv]} { + TE::UTILS::te_msg TE_INIT-25 INFO "Read BD modify list (File: ${TE::BD_PATH}/mod_bd.csv)." + set fp [open "${TE::BD_PATH}/mod_bd.csv" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + foreach line $data { + #ignore comments and empty lines + if {[string match *#* $line] != 1 && [string length $line] > 0} { + # check file version + if {[string match *CSV_VERSION* $line] } { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #check version + set tmp [split $line "="] + if {[string match [lindex $tmp 1] $TE::BDMOD_CSV] != 1} { + TE::UTILS::te_msg TE_INIT-26 ERROR " Wrong BD Modify CSV Version (${TE::BD_PATH}/mod_bd.csv) get [lindex $tmp 1] expected ${TE::BDMOD_CSV}." + return -code error " Wrong BD Modify CSV Version (${TE::BD_PATH}/mod_bd.csv) get [lindex $tmp 1] expected $TE::BDMOD_CSV" + } + } else { + #split line + set temp [split $line ","] + if {[llength $temp] <3} { + TE::UTILS::te_msg TE_INIT-27 WARNING "Not enough elements on line ($line). Line ignored." + } else { + #get line id +remove spaces and tabs + set line_id [string map {"\t" ""} [string map {" " ""} [lindex $temp 0]]] + #sort + if {$line_id eq "id"} { + #table header + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + set temp [split $line ","] + lappend TE::BD_MOD_COMMENT $temp + lappend TE::BD_MOD_ADD $temp + lappend TE::BD_MOD_PCOMMENT $temp + lappend TE::BD_MOD_PADD $temp + } elseif {$line_id==0} { + # ID 0: remove(comment) line + lappend TE::BD_MOD_COMMENT $temp + } elseif {$line_id==1} { + # ID 1: add line + if {[llength $temp] >3} { + # replaced removed comma from modify txt + set newinsert_list [list] + lappend newinsert_list [lindex $temp 0] + lappend newinsert_list [lindex $temp 1] + set addstring [lindex $temp 2] + for {set i 3} {$i < [llength $temp]} {incr i} { + set addstring "${addstring},[lindex $temp $i]" + } + lappend newinsert_list $addstring + set temp $newinsert_list + } + lappend TE::BD_MOD_ADD $temp + } elseif {$line_id==2} { + # ID 2: remove(comment) property + lappend TE::BD_MOD_PCOMMENT $temp + } elseif {$line_id==3} { + # ID 3: add property + lappend TE::BD_MOD_PADD $temp + } else { + #unsupported lines ignored + TE::UTILS::te_msg TE_INIT-28 WARNING "Unsupported id ($line_id). Line ignored." + } + } + } + } + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished initial functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + + namespace eval BDEF { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # board part definition functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + variable BOARD_DEFINITION [list] + #{"ID" "PRODID" "PARTNAME" "BOARDNAME" "SHORTDIR"} + #extract board definition list from board definition file "board_files.csv" + #-------------------------------- + #--find_shortdir: + proc find_shortdir {NAME} { + variable BOARD_DEFINITION + #search in id + set value [get_shortname $NAME 0] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-29 STATUS "Found Shortname: $value";return $value} + #search in productid + set value [get_shortname $NAME 1] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-30 STATUS "Found Shortname: $value";return $value} + #search in boardname + set value [get_shortname $NAME 3] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-31 STATUS "Found Shortname: $value";return $value} + #search in shortname + set value [get_shortname $NAME 4] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-32 STATUS "Found Shortname: $value";return $value} + #search in part name (only if unique) + if {[get_check_unique_name $NAME 2]==0} { + set value [get_shortname $NAME 2] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-33 STATUS "Found Shortname: $value";return $value} + } + #default + TE::UTILS::te_msg TE_INIT-34 STATUS "No Shortname found for ${NAME}, use default " + return "default" + } + #-------------------------------- + #--find_id: + proc find_id {NAME} { + variable BOARD_DEFINITION + #search in id + set value [get_id $NAME 0] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-35 STATUS "Found ID: $value";return $value} + #search in productid + set value [get_id $NAME 1] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-36 STATUS "Found ID: $value";return $value} + #search in boardname + set value [get_id $NAME 3] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-37 STATUS "Found ID: $value";return $value} + #search in shortname + set value [get_id $NAME 4] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-38 STATUS "Found ID: $value";return $value} + #search in part name (only if unique) + if {[get_check_unique_name $NAME 2]==0} { + set value [get_id $NAME 2] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-39 STATUS "Found ID: $value";return $value} + } + #default + TE::UTILS::te_msg TE_INIT-40 STATUS "No ID found for ${NAME}, use NA " + return "NA" + } + #-------------------------------- + #--find_partname: + proc find_partname {NAME} { + variable BOARD_DEFINITION + #search in id + set value [get_partname $NAME 0] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-41 STATUS "Found part name: $value";return $value} + #search in productid + set value [get_partname $NAME 1] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-42 STATUS "Found part name: $value";return $value} + #search in boardname + set value [get_partname $NAME 3] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-43 STATUS "Found part name: $value";return $value} + #search in shortname + set value [get_partname $NAME 4] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-44 STATUS "Found part name: $value";return $value} + #search in part name (only if unique) + if {[get_check_unique_name $NAME 2]==0} { + set value [get_partname $NAME 2] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-45 STATUS "Found part name: $value";return $value} + } + #default + TE::UTILS::te_msg TE_INIT-46 STATUS "No part name found for ${NAME}, use NA " + return "NA" + } + #-------------------------------- + #--get_check_unique_name: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_check_unique_name {NAME POS} { + variable BOARD_DEFINITION + set part_count 0 + set max_count [expr [llength $BOARD_DEFINITION] -1] + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + set part_count [expr $part_count+1] + } + } + #-2 not found + #-1 some same + #0 unique + #1 all same + if {$part_count==0} { + TE::UTILS::te_msg TE_INIT-47 STATUS "Board part csv name check: $NAME not found on position $POS." + return -2 + } elseif {$part_count==$max_count} { + TE::UTILS::te_msg TE_INIT-48 STATUS "Board part csv name check: All names ($NAME) are equal on position $POS." + return 1 + } elseif {$part_count==1} { + TE::UTILS::te_msg TE_INIT-49 STATUS "Board part csv name check: $NAME is unique on position $POS." + return 0 + } else { + TE::UTILS::te_msg TE_INIT-50 STATUS "Board part csv name check: Only some names ($NAME) are equal on position $POS." + return -1 + } + } + #-------------------------------- + #--get_id: Name--> search name, POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_id {NAME POS} { + variable BOARD_DEFINITION + set last_id 0 + foreach sublist $BOARD_DEFINITION { + if {$last_id < [lindex $sublist 0] && [lindex $sublist 0] ne "ID"} { + set last_id [lindex $sublist 0] + } + # if { [string equal $NAME [lindex $sublist $POS]] } { + # return [lindex $sublist 0] + # } + if { [string match -nocase $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 0] + } + } + if {$NAME eq "LAST_ID"} { + #return the the highest id from the list + return $last_id + } + #default + TE::UTILS::te_msg TE_INIT-51 STATUS "ID not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_prodid: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_prodid {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 1] + } + } + #default + TE::UTILS::te_msg TE_INIT-52 STATUS "Product ID not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_partname: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_partname {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 2] + } + } + #default + TE::UTILS::te_msg TE_INIT-53 STATUS "Part Name not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_boardname: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_boardname {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 3] + } + } + #default + TE::UTILS::te_msg TE_INIT-54 STATUS "Board Name not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_shortname: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_shortname {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 4] + } + } + #default + TE::UTILS::te_msg TE_INIT-55 STATUS "Short Name not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_zynqflashtyp: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_zynqflashtyp {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 5] + } + } + #default + TE::UTILS::te_msg TE_INIT-56 STATUS "Zynq Flash typ not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_fpgaflashtyp: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_fpgaflashtyp {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 6] + } + } + #default + TE::UTILS::te_msg TE_INIT-57 STATUS "FPGA Flash typ not found for $NAME $POS, return default: NA" + return "NA" + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished initial functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "INFO:(TE) Load Settings Script finished" +} \ No newline at end of file diff --git a/zynqberrydemo1/scripts/script_te_utils.tcl b/zynqberrydemo1/scripts/script_te_utils.tcl new file mode 100644 index 0000000..003af23 --- /dev/null +++ b/zynqberrydemo1/scripts/script_te_utils.tcl @@ -0,0 +1,766 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/04 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/05/18 $ +# -------------------------------------------------------------------- +# -- 2017/06/13 rise te_msg cnt +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval UTILS { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #-------------------------------- + #--te_msg: + proc te_msg {vmsg_id vmsg_sev vmsg_msg} { + # vmsg_id: TE_INIT, TE_UT, TE_EXT, TE_BD, TE_HW, TE_SW, TE_PR + #last vmsg_nr: + #TE_INIT 169 -> TE initialisation + #TE_UTIL 99 -> TE utilities + #TE_EXT 8 -> External + #TE_PS 1 -> PS modification 0,1-> external tcl-scripts with settings! + #TE_BD 26 -> Block Design + #TE_HW 81 -> HW Design + #TE_SW 66 -> SW Design + #TE_PR 84 -> Programming + # vmsg_sev: STATUS, INFO, WARNING, {CRITICAL WARNING}, ERROR + # set vmsg_id TE_DEF;set vmsg_sev STATUS;set vmsg_msg "Info"; + # common::send_msg_id "$vmsg_id" $vmsg_sev $vmsg_msg + if {[catch {common::send_msg_id "$vmsg_id" $vmsg_sev $vmsg_msg}] } {puts "${vmsg_sev}: ($vmsg_id) $vmsg_msg"} + #Info: Do not start Text with: -- + #TE::UTILS::te_msg TE_INIT-2 WARNING "SDK settings are overwritten by SDSOC settings." + #TE::UTILS::te_msg TE_INIT-0 INFO "Script Info: \n \ + # ------" + + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # search source files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--search_bd_files: search in TE::BD_PATH for *.tcl files return list + proc search_bd_files {} { + # search for block design for the board part only (folder with tcl must exist, otherwise base BD_Path is used!) + #currently only on bd.tcl is allowed + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::BD_PATH}/${TE::SHORTDIR} *.tcl]}] } { + if { [catch {set bd_files [glob -join -dir ${TE::BD_PATH}/ *.tcl]}] } { + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + TE::UTILS::te_msg TE_UTIL-0 WARNING "No Block-Design Export was found in ${TE::BD_PATH}, start vivado without bd-design" + } else { + TE::UTILS::te_msg TE_UTIL-1 WARNING "No Block-Design Export was found, use current Vivado project Block-Designs from:${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ ." + } + } + } + set bd_names "" + foreach bd $bd_files { + set bd_names "$bd_names $bd \n" + } + TE::UTILS::te_msg TE_UTIL-2 INFO "Following block designs were found: \n \ + $bd_names \ + ------" + if {!$TE::BD_MULTI} { + if {[llength $bd_files]>1 } { + TE::UTILS::te_msg TE_UTIL-3 WARNING "Currently only one Block-Design is supported with TE-scripts, deleted or rename file-extension from unused *.tcl in ${TE::BD_PATH} or ${TE::BD_PATH}/${TE::SHORTDIR}." + return -code error "Currently only one Block-Design is supported with TE-scripts, deleted or rename file-extension from unused *.tcl in ${TE::BD_PATH} or ${TE::BD_PATH}/${TE::SHORTDIR}." + } + } + return $bd_files + } + #-------------------------------- + #--search_xdc_files: search in TE::XDC_PATH for *xdc files return list + proc search_xdc_files {} { + # search for xdc file if bord part folder exist, this used too + set xdc_files [] + set base_xdc_files [] + set bp_xdc_files [] + if { [catch {set base_xdc_files [ glob $TE::XDC_PATH/*.xdc ] }] } { + TE::UTILS::te_msg TE_UTIL-4 WARNING "*.xdc search: ${TE::XDC_PATH}/ is empty." + } + if {[file exists ${TE::XDC_PATH}/${TE::SHORTDIR}/]} { + if { [catch {set bp_xdc_files [ glob $TE::XDC_PATH/${TE::SHORTDIR}/*.xdc ] }] } { + TE::UTILS::te_msg TE_UTIL-5 WARNING "*.xdc search: ${TE::XDC_PATH}/${TE::SHORTDIR}/ is empty." + } + #generate empty target xdc for gui constrains + if { ![file exists ${TE::XDC_PATH}/${TE::SHORTDIR}/vivado_target.xdc]} { + TE::UTILS::te_msg TE_UTIL-6 INFO "Generate ${TE::XDC_PATH}/${TE::SHORTDIR}/vivado_target.xdc" + close [ open ${TE::XDC_PATH}/${TE::SHORTDIR}/vivado_target.xdc w ] + lappend bp_xdc_files ${TE::XDC_PATH}/${TE::SHORTDIR}/vivado_target.xdc + } + set xdc_files [concat $base_xdc_files $bp_xdc_files] + } else { + set xdc_files $base_xdc_files + #generate empty target xdc for gui constrains + if { ![file exists ${TE::XDC_PATH}/vivado_target.xdc]} { + TE::UTILS::te_msg TE_UTIL-7 INFO "Generate ${TE::XDC_PATH}/vivado_target.xdc" + close [ open ${TE::XDC_PATH}/vivado_target.xdc w ] + lappend xdc_files ${TE::XDC_PATH}/vivado_target.xdc + } + } + + set xdc_names "" + foreach xdc $xdc_files { + set xdc_names "$xdc_names $xdc \n" + } + TE::UTILS::te_msg TE_UTIL-8 INFO "Following xdc files were found: \n \ + $xdc_names \ + ------" + + return $xdc_files + } + #-------------------------------- + #--search_xci_files: search in TE::HDL_PATH for *.xci files return list + proc search_xci_files {} { + set xci_files [list] + set xci_files_main [list] + set xci_files_sub [list] + catch {set xci_files_main [glob -join -dir $TE::HDL_PATH/xci/ *.xci]} + catch {set xci_files_sub [glob -join -dir $TE::HDL_PATH/xci/${TE::SHORTDIR}/ *.xci]} + set xci_files [concat $xci_files_main $xci_files_sub] + set xci_names "" + foreach xci_f $xci_files { + set xci_names "$xci_names $xci_f \n" + } + TE::UTILS::te_msg TE_UTIL-9 INFO "Following xci files were found: \n \ + $xci_names \ + ------" + + return $xci_files + } + #-------------------------------- + #--search_elf_files: search in TE::FIRMWARE_PATH for *.elf files return list + proc search_elf_files {} { + set elf_files_sub [list] + catch {set elf_files_sub [glob -join -dir ${TE::FIRMWARE_PATH} */*.elf]} + + set elf_names "" + foreach elf_f $elf_files_sub { + set elf_names "$elf_names $elf_f \n" + } + TE::UTILS::te_msg TE_UTIL-10 INFO "Following elf files were found: \n \ + $elf_names \ + ------" + + return $elf_files_sub + } + #-------------------------------- + #--search_hdl_files: search in TE::HDL_PATH for *.vhd and *.v files return list + proc search_hdl_files {} { + set hdl_files [list] + set vhd_files [list] + set vhd_files_sub1 [list] + set vhd_files_sub2 [list] + set v_files [list] + set v_files_sub1 [list] + set v_files_sub2 [list] + set sv_files [list] + set sv_files_sub1 [list] + set sv_files_sub2 [list] + catch {set vhd_files [glob -join -dir ${TE::HDL_PATH} *.vhd]} + catch {set vhd_files_sub1 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ *.vhd]} + catch {set vhd_files_sub2 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.vhd]} + catch {set v_files [glob -join -dir ${TE::HDL_PATH} *.v]} + catch {set v_files_sub1 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.v]} + catch {set v_files_sub2 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.v]} + catch {set sv_files [glob -join -dir ${TE::HDL_PATH} *.sv]} + catch {set sv_files_sub1 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.sv]} + catch {set sv_files_sub2 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.sv]} + set hdl_files [concat $vhd_files $vhd_files_sub1 $vhd_files_sub2 $v_files $v_files_sub1 $v_files_sub2 $sv_files $sv_files_sub1 $sv_files_sub2] + + set hdl_names "" + foreach hdl_f $hdl_files { + set hdl_names "$hdl_names $hdl_f \n" + } + TE::UTILS::te_msg TE_UTIL-11 INFO "Following hdl files were found: \n \ + $hdl_names \ + ------" + + return $hdl_files + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished search source files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # modify block design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--modify_block_design_tcl: + proc setinfo_to_block_design_tcl {datalist mod_file} { + TE::UTILS::te_msg TE_UTIL-22 INFO "Block Design tcl: info lines were added." + set data $datalist + if {$mod_file} { + # set data [linsert $data[set data {}] 0 "puts \"Info:(TE) This block design file has been modified. Modifications labelled with comment tag # #TE_MOD# on the Block-Design tcl-file.\""] + set data [linsert $data[set data {}] 0 "TE::UTILS::te_msg TE_BD-1 INFO \"This block design tcl-file was modified by TE-Scripts. Modifications are labelled with comment tag # #TE_MOD# on the Block-Design tcl-file.\""] + } + # set data [linsert $data[set data {}] 0 "puts \"Info:(TE) This block design file has been exported with Reference-Design Scripts from Trenz Electronic GmbH for Board Part:${TE::BOARDPART} with FPGA ${TE::PARTNAME} at [ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"].\""] + set data [linsert $data[set data {}] 0 "TE::UTILS::te_msg TE_BD-0 INFO \"This block design tcl-file was generate with Trenz Electronic GmbH Board Part:${TE::BOARDPART}, FPGA: ${TE::PARTNAME} at [ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"].\""] + return $data + } + #-------------------------------- + #--modify_block_design_tcl: load and save block design tcl (sub functions used for modifications) + proc modify_block_design_tcl {file_name mod_file} { + TE::UTILS::te_msg TE_UTIL-12 STATUS "Open bd design export [file tail [file rootname $file_name]]" + #read file to string list + set fp_r [open ${file_name} "r"] + set file_data [read $fp_r] + close $fp_r + + set data [split $file_data "\n"] + + #modify list elements () + if {$mod_file} { + if {[catch {set data [modify_block_design_commentlines $data]} result]} { TE::UTILS::te_msg TE_UTIL-13 ERROR "Script (TE::UTILS::modify_block_design_commentlines) failed: $result."; return -code error} + if {[catch {set data [modify_block_design_commentdesignprops $data]} result]} { TE::UTILS::te_msg TE_UTIL-14 ERROR "Script (TE::UTILS::modify_block_design_commentdesignprops) failed: $result."; return -code error} + if {[catch {set data [modify_block_design_add_lines $data]} result]} { TE::UTILS::te_msg TE_UTIL-15 ERROR "Script (TE::UTILS::modify_block_design_add_lines) failed: $result."; return -code error} + if {[catch {set data [modify_block_design_add_designprops $data]} result]} { TE::UTILS::te_msg TE_UTIL-16 ERROR "Script (TE::UTILS::modify_block_design_add_designprops) failed: $result."; return -code error} + } + # write info header + if {[catch {set data [TE::UTILS::setinfo_to_block_design_tcl $data $mod_file]} result]} { TE::UTILS::te_msg TE_UTIL-17 ERROR "Script (TE::UTILS::setinfo_to_block_design_tcl) failed: $result."; return -code error} + #write all list elements to file + set fp_w [open ${file_name} "w"] + foreach line $data { + puts $fp_w $line + } + close $fp_w + } + #-------------------------------- + #--modify_block_design_commentlines: + proc modify_block_design_commentlines {datalist} { + #data=tcl content + set data $datalist + #modify list elements + set line_index -1 + set mod_count 0 + foreach line $data { + incr line_index + foreach cname $TE::BD_MOD_COMMENT { + set line_check [lindex $cname 1] + #comment lines on tcl file, modified lines are ignored + if {[string match $line_check $line] && ![string match *#TE_MOD#* $line]} { + set data [lreplace $data[set data {}] $line_index $line_index "# #TE_MOD# $line"] + incr mod_count + } + } + } + TE::UTILS::te_msg TE_UTIL-18 INFO "Block Design tcl: $mod_count lines were commented out." + return $data + } + #-------------------------------- + #--modify_block_design_commentdesignprops: + proc modify_block_design_commentdesignprops {datalist} { + #data=tcl content + set data $datalist + #modify list elements + set mod_count 0 + foreach cname $TE::BD_MOD_PCOMMENT { + set prop_start_name "set_property -dict" + #get instant name + set inst_name [lindex $cname 1] + set prop_stop_name "\] \$$inst_name" + #modify list elements + set line_index -1 + set prop_start -1 + set prop_stop -1 + #search for property boundaries + foreach line $data { + incr line_index + if {[string match *$prop_start_name* $line] && ![string match *#TE_MOD#* $line]} { + set prop_start $line_index + } + if {[string match *$prop_stop_name $line] && ![string match *#TE_MOD#* $line]} { + set prop_stop $line_index + break; + } + } + #only if component found + if {$prop_start>=0 && $prop_stop>$prop_start} { + + set removed_items [list] + set item_cnt -1 + #removed items + foreach item $cname { + incr item_cnt + #ignore id and line_check + if {$item_cnt>1} { + set i $prop_stop + while {$i >= $prop_start} { + set i [expr $i-1] + set newline "[lindex $data $i]" + if {[string match *$item* $newline] && ![string match *#TE_MOD#* $newline]} { + lappend removed_items "# #TE_MOD# $newline" + set data [lreplace $data[set data {}] $i $i] + incr mod_count + } + } + } + } + #add removed items as comment after the component list + set inserpos [expr $prop_stop + 2 - [llength $removed_items]] + set data [linsert $data[set data {}] $inserpos "# #TE_MOD# #Empty Line"] + foreach el [lreverse $removed_items] { + set data [linsert $data[set data {}] $inserpos $el] + } + # if all properties are removed, clear empty property container + if {[expr $prop_stop-$prop_start]==[llength $removed_items]} { + set tmp "# #TE_MOD# [lindex $data $prop_start]" + set data [lreplace $data[set data {}] $prop_start $prop_start $tmp] + set tmp "# #TE_MOD# [lindex $data [expr $prop_start+1]]" + set data [lreplace $data[set data {}] [expr $prop_start+1] [expr $prop_start+1] $tmp] + } + } + } + TE::UTILS::te_msg TE_UTIL-19 INFO "Block Design tcl: $mod_count properties were commented out." + return $data + } + #-------------------------------- + #--modify_block_design_add_lines: + proc modify_block_design_add_lines {datalist} { + #data=tcl content + set data $datalist + #modify list elements + set line_index -1 + set mod_count 0 + foreach cname $TE::BD_MOD_ADD { + set line_check [lindex $cname 1] + set line_index -1 + foreach line $data { + incr line_index + #add lines on tcl file, modified lines are ignored + if {[string match $line_check $line] && ![string match *#TE_MOD#* $line]} { + # set data [lreplace $data[set data {}] $line_index $line_index "# #TE_MOD# $line"] + set data [linsert $data[set data {}] [expr $line_index+1] "# #TE_MOD#_Add next line#"] + set data [linsert $data[set data {}] [expr $line_index+2] [lindex $cname 2]] + incr mod_count + break + } + } + } + TE::UTILS::te_msg TE_UTIL-20 INFO "Block Design tcl: $mod_count lines were added." + return $data + } + #-------------------------------- + #--modify_block_design_add_designprops: + proc modify_block_design_add_designprops {datalist} { + #data=tcl content + set data $datalist + #modify list elements + set mod_count 0 + foreach cname $TE::BD_MOD_PADD { + #get instant name + set inst_name [lindex $cname 1] + set prop_stop_name "\] \$$inst_name" + #modify list elements + set line_index -1 + set prop_start -1 + set prop_stop -1 + set all_props_removed -1 + #search for property boundaries + foreach line $data { + incr line_index + if {[string match *$prop_stop_name $line]} { + if {![string match *#TE_MOD#* $line] } { + set prop_stop $line_index + } else { + set all_props_removed $line_index + } + break; + } + } + #if component props found + if {$prop_stop>-1} { + #add removed items as comment after the component list + set inserpos [expr $prop_stop + 1] + set el_index -1 + #add property as comment + foreach el $cname { + incr el_index + #ignore id and line_check + if {$el_index>1} { + set data [linsert $data[set data {}] $inserpos "# #TE_MOD#_add_property# $el"] + } + } + #add property + set inserpos [expr $prop_stop + -1] + set el_index -1 + foreach el $cname { + incr el_index + #ignore id and line_check + if {$el_index>1} { + set data [linsert $data[set data {}] $inserpos "$el \\"] + incr mod_count + } + } + } elseif {$all_props_removed>-1} { + #add removed items as comment after the component list + set inserpos [expr $all_props_removed + 1] + set el_index -1 + #add property as comment + foreach el $cname { + incr el_index + #ignore id and line_check + if {$el_index>1} { + set data [linsert $data[set data {}] $inserpos "# #TE_MOD#_add_property# $el"] + } + } + #add property + set inserpos [expr $all_props_removed + 1] + set el_index -1 + set data [linsert $data[set data {}] $inserpos " set_property -dict \[ list \\"] + incr inserpos + foreach el $cname { + incr el_index + #ignore id and line_check + if {$el_index>1} { + set data [linsert $data[set data {}] $inserpos "$el \\"] + incr inserpos + incr mod_count + } + } + set data [linsert $data[set data {}] $inserpos " \] \$[lindex $cname 1]"] + } + } + TE::UTILS::te_msg TE_UTIL-21 INFO "Block Design tcl: $mod_count properties were added." + return $data + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished modify block design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # generate workspace functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--workspace_info: + proc workspace_info {infofile info} { + set report_file ${infofile} + set fp_w [open ${report_file} "w"] + puts $fp_w "$info" + close $fp_w + } + #-------------------------------- + #--generate_workspace_hsi: + proc generate_workspace_hsi {{fname ""}} { + if {$fname eq ""} { + #use generated vivado data for workspace + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef]} { + file mkdir ${TE::WORKSPACE_HSI_PATH}/ + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef ${TE::WORKSPACE_HSI_PATH}/${TE::VPROJ_NAME}.hdf + # file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit ${TE::WORKSPACE_HSI_PATH} + workspace_info "${TE::WORKSPACE_PATH}/hsi_info.txt" "HSI Data used from ${TE::VPROJ_PATH}" + } else {TE::UTILS::te_msg TE_UTIL-23 WARNING "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef not found, HSI workspace was not generated."} + } else { + #use prebuilt data for workspace + set shortname "[TE::BDEF::find_shortdir $fname]" + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf]} { + file mkdir ${TE::WORKSPACE_HSI_PATH}/ + file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf ${TE::WORKSPACE_HSI_PATH}/${TE::VPROJ_NAME}.hdf + # file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.bit ${TE::WORKSPACE_HSI_PATH} + workspace_info "${TE::WORKSPACE_PATH}/hsi_info.txt" "HSI Data used from ${TE::PREBUILT_HW_PATH}/${shortname}" + } else {TE::UTILS::te_msg TE_UTIL-24 WARNING "${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf not found, HSI workspace was not generated."} + } + } + #-------------------------------- + #--generate_workspace_sdk: + proc generate_workspace_sdk {{fname ""}} { + #todo mal schauen ob vorher gelöcht werden muss oder ob überschreiben reicht + if {$fname eq ""} { + #use generated vivado data for workspace + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef]} { + file mkdir ${TE::WORKSPACE_SDK_PATH}/ + # file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + #use Toplevelname instead fo Project name -> export from Vivado GUI can used to + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef ${TE::WORKSPACE_SDK_PATH}/${TE::PR_TOPLEVELNAME}.hdf + # file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit ${TE::WORKSPACE_SDK_PATH} + workspace_info "${TE::WORKSPACE_PATH}/sdk_info.txt" "SDK Data used from ${TE::VPROJ_PATH}" + } else {TE::UTILS::te_msg TE_UTIL-25 WARNING "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef not found, SDK workspace was not generated."} + } else { + #use prebuilt data for workspace + set shortname "[TE::BDEF::find_shortdir $fname]" + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf]} { + file mkdir ${TE::WORKSPACE_SDK_PATH}/ + # file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + #use Toplevelname instead fo Project name -> export from Vivado GUI can used to + file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + # file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf ${TE::WORKSPACE_SDK_PATH}/${TE::PR_TOPLEVELNAME}.hdf + # file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.bit ${TE::WORKSPACE_SDK_PATH} + workspace_info "${TE::WORKSPACE_PATH}/sdk_info.txt" "SDK Data used from ${TE::PREBUILT_HW_PATH}/${shortname}" + } else {TE::UTILS::te_msg TE_UTIL-26 WARNING "${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf not found, SDK workspace was not generated."} + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished generate workspace functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # copy files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--copy_hw_files: + proc copy_hw_files { {deleteOldFile true}} { + #make new one + file mkdir ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR} + if {${TE::PR_TOPLEVELNAME} eq "NA" } { + TE::UTILS::te_msg TE_UTIL-27 {CRITICAL WARNING} "Script variable TE::PR_TOPLEVELNAME was not set, script properties will be reload." + TE::VIV::restore_scriptprops + } + #copy files only if bitfiles exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit]} { + #delete old prebuilt bitfile + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit} result]} {TE::UTILS::te_msg TE_UTIL-28 {CRITICAL WARNING} " $result"} + } + #copy and rename bitfile + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit + TE::UTILS::te_msg TE_UTIL-29 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit" + #-------------------------------- + #delete old prebuilt lpr + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.lpr] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.lpr} result]} {TE::UTILS::te_msg TE_UTIL-30 {CRITICAL WARNING} " $result"} + } + #copy and rename lpr + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.hw/${TE::VPROJ_NAME}.lpr ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.lpr + TE::UTILS::te_msg TE_UTIL-31 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.lpr was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.hw/${TE::VPROJ_NAME}.lpr" + #-------------------------------- + #delete old prebuilt ltx_file + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.ltx] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.ltx} result]} {TE::UTILS::te_msg TE_UTIL-32 {CRITICAL WARNING} " $result"} + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/debug_nets.ltx]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/debug_nets.ltx ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.ltx + TE::UTILS::te_msg TE_UTIL-33 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.ltx was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/debug_nets.ltx" + } else {TE::UTILS::te_msg TE_UTIL-34 INFO "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/debug_nets.ltx was not found."} + #delete old prebuilt hdf_file (hdf only on processor systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf} result]} {TE::UTILS::te_msg TE_UTIL-35 {CRITICAL WARNING} " $result"} + } + if {!$TE::IS_FSYS} { + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef]} { + #optional only on processor system: check bd file name --> for fsys no *hwdef and *sydef files needed + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf + TE::UTILS::te_msg TE_UTIL-35 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef" + } else {TE::UTILS::te_msg TE_UTIL-36 {CRITICAL WARNING} "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef was not found."} + } + #delete old prebuilt mmi (not for zynq systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mmi] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mmi} result]} {TE::UTILS::te_msg TE_UTIL-38 {CRITICAL WARNING} " $result"} + } + #delete old prebuilt mcs_file (not for zynq systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mcs] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mcs} result]} {TE::UTILS::te_msg TE_UTIL-39 {CRITICAL WARNING} " $result"} + } + #delete old prebuilt prm_file (not for zynq systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.prm] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.prm} result]} {TE::UTILS::te_msg TE_UTIL-40 {CRITICAL WARNING} " $result"} + } + #copy mmi + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mmi]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mmi ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mmi + TE::UTILS::te_msg TE_UTIL-41 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mmi was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mmi" + } else {TE::UTILS::te_msg TE_UTIL-42 WARNING "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mmi was not found."} + #copy mcs + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs]} { + #optional only on systems without processor used see TE::VIV::write_cfgmem for selection + #compare timestamps, if mcs is older than bitfile, rerun write mcs_file --> if gui is used to generate bitfile mcs will not recreate + set bittime [file mtime ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit] + set mcstime [file mtime ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs] + if {$mcstime < $bittime} { + TE::UTILS::te_msg TE_UTIL-43 INFO "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs is older as ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit . Regenerate mcs." + + if {[catch {TE::VIV::write_viv_cfgmem} result]} { TE::UTILS::te_msg TE_UTIL-44 ERROR "Script (TE::VIV::write_viv_cfgmem) failed: $result."; return -code error} + } + file mkdir ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.prm ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.prm + TE::UTILS::te_msg TE_UTIL-45 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.prm was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.prm" + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mcs + TE::UTILS::te_msg TE_UTIL-46 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.mcs was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs" + } else {TE::UTILS::te_msg TE_UTIL-47 WARNING "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs was not found."} + + } else {TE::UTILS::te_msg TE_UTIL-48 {CRITICAL WARNING} "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit was not found. Nothing was copied to prebuilt folder."} + } + #-------------------------------- + #--copy_sw_files: + proc copy_sw_files {} { + set dirs [glob -directory $TE::WORKSPACE_HSI_PATH *] + if { [llength $dirs] >0} { + #make new one + file mkdir ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR} + #copy files + foreach dir $dirs { + if {[file exists $dir/executable.elf]} { + #apps+fsbl + set fname [file tail $dir] + #delete old prebuilt elf file + if {[file exists ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/${fname}.elf]} { + if {[catch {file delete -force ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/${fname}.elf} result]} {TE::UTILS::te_msg TE_UTIL-49 {CRITICAL WARNING} " $result"} + } + #copy file + file copy -force $dir/executable.elf ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/${fname}.elf + TE::UTILS::te_msg TE_UTIL-50 INFO "${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/${fname}.elf was replaced with $dir/executable.elf" + } elseif {[file exists $dir/skeleton.dtsi]} { + #device tree + set fname [file tail $dir] + set devtree_folder ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${fname} + file mkdir ${devtree_folder} + if {[file exists ${devtree_folder}/skeleton.dtsi]} { + if {[catch {file delete -force ${devtree_folder}/skeleton.dtsi} result]} {TE::UTILS::te_msg TE_UTIL-51 {CRITICAL WARNING} " $result"} + } + if {[file exists ${devtree_folder}/system.dts]} { + if {[catch {file delete -force ${devtree_folder}/system.dts} result]} {TE::UTILS::te_msg TE_UTIL-52 {CRITICAL WARNING} " $result"} + } + if {[file exists ${devtree_folder}/zynq-7000.dtsi]} { + if {[catch {file delete -force ${devtree_folder}/zynq-7000.dtsi} result]} {TE::UTILS::te_msg TE_UTIL-53 {CRITICAL WARNING} " $result"} + } + file copy -force $dir/skeleton.dtsi ${devtree_folder}/skeleton.dtsi + file copy -force $dir/system.dts ${devtree_folder}/system.dts + file copy -force $dir/zynq-7000.dtsi ${devtree_folder}/zynq-7000.dtsi + TE::UTILS::te_msg TE_UTIL-54 INFO "Following device tree files are replaced \n \ + ${devtree_folder}/skeleton.dtsi was replaced with $dir/skeleton.dtsi \n \ + ${devtree_folder}/system.dts was replaced with $dir/system.dts \n \ + ${devtree_folder}/zynq-7000.dtsi was replaced with $dir/zynq-7000.dtsi \n \ + ------" + } + } + } else { + TE::UTILS::te_msg TE_UTIL-55 {CRITICAL WARNING} "$TE::WORKSPACE_HSI_PATH was empty. Nothing was copied to prebuilt folder." + } + } + #-------------------------------- + #--copy_hw_reports: + proc copy_hw_reports {} { + TE::UTILS::te_msg TE_UTIL-56 STATUS "Create reports in ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports" + file mkdir ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + #copy only if new bitfile exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit]} { + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + } + } + #create allways summary + create_prebuilt_hw_summary + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished copy files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--create_prebuilt_hw_summary: + proc create_prebuilt_hw_summary {} { + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}_summary.csv + set prebuilt_file ${TE::PREBUILT_HW_PATH}/hardware_summary.csv + #todo hardware_summary.csv erase of to large + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + if { ![file exists ${prebuilt_file}]} { + set fp_w [open ${prebuilt_file} "w"] + puts $fp_w [lindex $data 0] + puts $fp_w [lindex $data 1] + close $fp_w + } else { + set fp_a [open ${prebuilt_file} "a"] + puts $fp_a [lindex $data 1] + close $fp_a + } + TE::UTILS::te_msg TE_UTIL-57 INFO "Add HW report to: ${TE::PREBUILT_HW_PATH}/hardware_summary.csv" + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # clear functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--clean_vivado_project: + proc clean_vivado_project {} { + if { [file exists $TE::VPROJ_PATH] } { + if {[catch {file delete -force $TE::VPROJ_PATH} result]} {TE::UTILS::te_msg TE_UTIL-59 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-56 INFO "$TE::VPROJ_PATH was deleted."} + } + } + #-------------------------------- + #--clean_labtools_project: + proc clean_labtools_project {} { + if { [file exists $TE::VLABPROJ_PATH] } { + if {[catch {file delete -force $TE::VLABPROJ_PATH} result]} {TE::UTILS::te_msg TE_UTIL-60 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-61 INFO "$TE::VLABPROJ_PATH was deleted."} + } + } + #-------------------------------- + #--clean_workspace_hsi: + proc clean_workspace_hsi {} { + if { [file exists ${TE::WORKSPACE_HSI_PATH}] } { + if {[catch {file delete -force $TE::WORKSPACE_HSI_PATH} result]} {TE::UTILS::te_msg TE_UTIL-62 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-63 INFO "$TE::WORKSPACE_HSI_PATH was deleted."} + } + } + #-------------------------------- + #--clean_workspace_sdk: + proc clean_workspace_sdk {} { + if { [file exists ${TE::WORKSPACE_SDK_PATH}] } { + if {[catch {file delete -force $TE::WORKSPACE_SDK_PATH} result]} {TE::UTILS::te_msg TE_UTIL-64 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-65 INFO "$TE::WORKSPACE_SDK_PATH was deleted."} + } + } + #-------------------------------- + #--clean_workspace_all: + proc clean_workspace_all {} { + if { [file exists ${TE::WORKSPACE_PATH}] } { + if {[catch {file delete -force $TE::WORKSPACE_PATH} result]} {TE::UTILS::te_msg TE_UTIL-66 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-67 INFO "$TE::WORKSPACE_PATH was deleted."} + } + } + #-------------------------------- + #--clean_sdsoc: + proc clean_sdsoc {} { + if { [file exists ${TE::SDSOC_PATH}] } { + if {[catch {file delete -force $TE::SDSOC_PATH} result]} {TE::UTILS::te_msg TE_UTIL-68 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-69 INFO "$TE::SDSOC_PATH was deleted."} + } + } + #-------------------------------- + #--clean_all_generated_files: + proc clean_all_generated_files {} { + clean_vivado_project + clean_labtools_project + clean_workspace_hsi + clean_workspace_sdk + clean_workspace_all + clean_sdsoc + TE::UTILS::te_msg TE_UTIL-71 INFO "Clean all generated files finished." + } + #-------------------------------- + #--clean_prebuilt_all: + proc clean_prebuilt_all {} { + if { [file exists ${TE::PREBUILT_PATH}] } { + if {[catch {file delete -force $TE::PREBUILT_PATH} result]} {TE::UTILS::te_msg TE_UTIL-70 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-71 INFO "$TE::PREBUILT_PATH was deleted."} + } + } + #todo clean prebuilt single part -> bi hw ,sw, os + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "INFO:(TE) Load Utilities script finished" +} + + diff --git a/zynqberrydemo1/scripts/script_usrcommands.tcl b/zynqberrydemo1/scripts/script_usrcommands.tcl new file mode 100644 index 0000000..a6b12a9 --- /dev/null +++ b/zynqberrydemo1/scripts/script_usrcommands.tcl @@ -0,0 +1,991 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/16 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/02/06 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +# source in namespace of TE +namespace eval TE { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # help functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--help: + proc help {{args ""}} { + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-help" { set run_help true; incr option } + + default {TE::UTILS::te_msg TE_UTIL-79 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Help: \n\ + Description:\n\ + \ Display currently available user functions\n\ + Syntax:\n\ + \ help \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE\n\ + " + TE::UTILS::te_msg TE_INIT-93 STATUS $te_txt + } else { + TE::INIT::print_version + set te_txt "TE Script Help:\n\ + Available TE-Functions:" + if {![catch {set projectname [get_projects]} result]} { + set te_txt "$te_txt\n\ + \ ---------------------------------\n\ + \ Beta Test (advanced usage only!):\n\ + \ TE::ADV::beta_util_sdsoc_project \[-check_only\] \[-start_sdsoc\] \[-help\]\n\ + \ TE::ADV::beta_hw_remove_board_part \[-permanent\] \[-help\]\n\ + \ TE::ADV::beta_hw_export_rtl_ip \[-help\]" + } + set te_txt "$te_txt\n\ + \ ----------\n\ + \ Utilities:\n\ + \ TE::util_zip_project \[-save_all\] \[-remove_prebuilt\] \[-manual_filename \] \[-help\]\n\ + \ ------------\n\ + \ Programming:\n\ + \ TE::pr_init_hardware_manager \[-help\]\n\ + \ TE::pr_program_jtag_bitfile \[-used_board \] \[-swapp \] \[-available_apps\] \[-used_basefolder_bitfile\] \[-help\]\n\ + \ TE::pr_program_flash_binfile \[-no_reboot\] \[-used_board \] \[-swapp \] \[-available_apps\] \[-force_hw_manager\] \[-used_basefolder_binfile\] \[-help\]\n\ + \ TE::pr_program_flash_mcsfile \[-no_reboot\] \[-used_board \] \[-swapp \] \[-available_apps\] \[-used_basefolder_mcsfile\] \[-help\]" + if {![catch {set projectname [get_projects]} result]} { + # # on vivado project + set te_txt "$te_txt\n\ + \ ----------\n\ + \ Software Design:\n\ + \ TE::sw_run_hsi \[-run_only\] \[-prebuilt_hdf \] \[-no_hsi\] \[-no_bif\] \[-no_bin\] \[-no_bitmcs\] \[-force_bin\] \[-clear\] \[-help\]\n\ + \ TE::sw_run_sdk \[-open_only\] \[-update_hdf_only\] \[-prebuilt_hdf \] \[-clear\] \[-help\]\n\ + \ ----------\n\ + \ Hardware Design:\n\ + \ TE::hw_blockdesign_create_bd \[-bd_name\] \[-msys_local_mem\] \[-msys_ecc\] \[-msys_cache\] \[-msys_debug_module\] \[-msys_axi_periph\] \[-msys_axi_intc\] \[-msys_clk\] \[-help\]\n\ + \ TE::hw_blockdesign_export_tcl \[-no_mig_contents\] \[-no_validate\] \[-mod_tcl\] \[-svntxt \] \[-board_part_only\] \[-help\]\n\ + \ TE::hw_build_design \[-disable_bitgen\] \[-disable_hdf\] \[-disable_mcsgen\] \[-disable_reports\] \[-export_prebuilt\] \[-export_prebuilt_only\] \[-help\]" + } + set te_txt "$te_txt\n\ + ------------------------------------------\n\ + Note:Run only predefined TE-functions from this list. Run other TE-functions directly may cause errors.\n\ + Note:For more Informations see Trenz Electronic Wiki: https://wiki.trenz-electronic.de/display/PD/Project+Delivery \n\ + ------------------------------------------\n\ + " + TE::UTILS::te_msg TE_INIT-94 STATUS $te_txt + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished help functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hardware generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--hw_blockdesign_create_new_bd: + proc hw_blockdesign_create_bd {{args ""}} { + set bd_name "fsys" + set msys_local_mem "8KB" + set msys_ecc "None" + set msys_cache "None" + set msys_debug_module "Debug Only" + set msys_axi_periph "Enabled" + set msys_axi_intc "0" + set msys_clk "None" + + + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-bd_name" {incr option; set bd_name [lindex $args $option]} + "-help" {set run_help true} + default {TE::UTILS::te_msg TE_UTIL-80 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Create Block Design: \n\ + Description:\n\ + \ Create new Block Design with specified name. \n\ + \ Special Block Design names: \n\ + \ fsys -> used for FPGA-Fabric Design only. Generate empty Block Design. \n\ + \ msys -> used for Microblaze Design only. Generate Microblaze with defined parameters. \n\ + \ zsys -> used for 7Series Zynq Design only. Generate 7 Series Zynq with Board Part configuration and Carrier Board extended settings (if available). \n\ + \ zusys -> used for UltraScale Plus Zynq Design only. Generate UltraScale Plus Zynq with Board Part configuration and Carrier Board extended settings (if available). \n\ + Syntax:\n\ + \ TE::hw_blockdesign_create_bd \[-bd_name\] \[-msys_local_mem\] \[-msys_ecc\] \[-msys_cache\] \[-msys_debug_module\] \[-msys_axi_periph\] \[-msys_axi_intc\] \[-msys_clk\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-help\] Print help.\n\ + \ \[-bd_name\] Use one of the predefined names (def:fsys): fsys, msys, zsys, zusys \n\ + \ \[-msys_local_mem\] Use one of the predefined values(def:8KB): None, 4KB, 8KB, 16KB, 32KB, 64KB, 128KB \n\ + \ \[-msys_ecc\] Use one of the predefined values(def:None): None, Basic, Full \n\ + \ \[-msys_cache\] Use one of the predefined values(def:None): None, 4KB, 8KB, 16KB, 32KB, 64KB \n\ + \ \[-msys_debug_module\] Use one of the predefined values(def:Debug Only): None, Debug Only, \"Debug \& UART\", \"Extended Debug\" \n\ + \ \[-msys_axi_periph\] Use one of the predefined values(def:Enabled): Disabled, Enabled \n\ + \ \[-msys_axi_intc\] Use one of the predefined values(def:0): 0, 1 \n\ + \ \[-msys_clk\] Use one of the predefined values(def:None): None, \"New Clocking Wizard (100 MHz)\", \"New External Port (100 MHz)\" \n\ + Categories:\n\ + \ TE::VIV\n\ + " + TE::UTILS::te_msg TE_BD-19 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_BD-20 STATUS "Start Create Block Design." + # m_settings only used for msys + set m_settings {local_mem $msys_local_mem ecc $msys_ecc cache $msys_cache debug_module $msys_debug_module axi_periph $msys_axi_periph axi_intc $msys_axi_intc clk $msys_clk} + if {[catch {TE::VIV::create_new_blockdesign $bd_name $m_settings } result]} {TE::UTILS::te_msg TE_BD-21 ERROR "Script (TE::VIV::create_new_blockdesign) failed: $result."; return -code error} + TE::UTILS::te_msg TE_BD-22 STATUS "Create Block Design finished." + } + } + #-------------------------------- + #--hw_blockdesign_export_tcl: + proc hw_blockdesign_export_tcl {{args ""}} { + set no_mig "" + set no_validate "" + set boardpart_only "" + set mod_tcl "" + set svn_check false + set svn_msg "" + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-no_mig_contents" {set no_mig [lindex $args $option]} + "-mod_tcl" {set mod_tcl [lindex $args $option]} + "-no_validate" {set no_validate [lindex $args $option]} + "-svntxt" {incr option; set svn_check true; set svn_msg [lindex $args $option]} + "-board_part_only" {set boardpart_only [lindex $args $option]} + "-help" {set run_help true} + default {TE::UTILS::te_msg TE_UTIL-81 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Export Block Design: \n\ + Description:\n\ + \ Export Block Design as TCL-file. \n\ + \ File destination is $TE::BD_PATH or ${TE::BD_PATH}/${TE::SHORTDIR}/, if sub-folder exists. \n\ + \ If ${TE::BD_PATH}/${TE::SHORTDIR}/ exists, Block Designs from $TE::BD_PATH are ignored on project creation. \n\ + \ Attention: Open block-design will be saved automatically before export is run.\n\ + Syntax:\n\ + \ TE::hw_blockdesign_export_tcl \[-no_mig_contents\] \[-no_validate\] \[-mod_tcl\] \[-svntxt \] \[-board_part_only\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-no_mig_contents\] Vivado specific option when MIG is used: MIG-Configuration is excluded from TCL-File. Reference to mig.prj is used instead. Wrong usage will damaged design functionality!\n\ + \ \[-no_validate\] Design is saved without validation.\n\ + \ \[-board_part_only\] Export for this bord part only (tcl is stored in ${TE::BD_PATH}/${TE::SHORTDIR}/). \n\ + \ \[-mod_tcl\] TCL Content would be modified with content from $TE::BD_PATH\\mod_bd.tcl. If mod_bd.tcl don't exist or all commands inside are commented, nothing is changed. Wrong usage will damaged design functionality! \n\ + \ \[-svntxt \] Send svn commit with Text if SVN-versioning is used for the files in $TE::BD_PATH.\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VIV, TE::UTILS, TE::EXT\n\ + " + TE::UTILS::te_msg TE_BD-23 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_BD-24 STATUS "Start Export Block Design." + if {[catch {TE::VIV::export_blockdesign $no_mig $no_validate $boardpart_only $mod_tcl} result]} {TE::UTILS::te_msg TE_BD-24 ERROR "Script (TE::VIV::export_blockdesign) failed: $result."; return -code error} + if {$svn_check} { + if {[catch {TE::EXT::svn_checkin ${TE::BD_PATH} $svn_msg} result]} {TE::UTILS::te_msg TE_BD-25 ERROR "Script (TE::EXT::svn_checkin) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_BD-26 STATUS "Export Block Design finished." + } + } + #-------------------------------- + #--hw_build_design: + proc hw_build_design {{args ""}} { + set run_build true + set bitgen true + set mcsgen true + set reportgen true + set hdfgen true + set export_prebuild false + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-disable_bitgen" { set bitgen false} + "-disable_hdf" { set hdfgen false} + "-disable_mcsgen" { set mcsgen false} + "-disable_reports" { set reportgen false} + "-export_prebuilt_only" { set export_prebuild true; set run_build false} + "-export_prebuilt" { set export_prebuild true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-82 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Build Design: \n\ + Description:\n\ + \ Run Synthesises and Implementation with Bitstream generation. \n\ + \ Generate BIT-File on all BD-Names and MCS-File only on none Zynq/UltraScale Systems. \n\ + Syntax:\n\ + \ TE::hw_build_design \[-disable_bitgen\] \[-disable_hdf\] \[-disable_mcsgen\] \[-disable_reports\] \[-export_prebuilt\] \[-export_prebuilt_only\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-disable_bitgen\] Bit-File generation is disabled. \n\ + \ \[-disable_hdf\] HDF-File generation is disabled(delete *.sysdef). \n\ + \ \[-disable_mcsgen\] MCS-File generation for none Zynq/UltraScale Systems is disabled. \n\ + \ \[-disable_reports\] Report-Files generation for prebuilt folder is disabled. \n\ + \ \[-export_prebuilt\] Export generated HW-Files to the prebuilt folder (copy is done automatically, when hsi, sdk or jtag programming scripts starts in VIVADO). \n\ + \ \[-export_prebuilt_only\] Export generated HW-Files to the prebuilt folder without rebuild the design. \n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VIV,TE::UTILS\n\ + " + TE::UTILS::te_msg TE_HW-59 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_HW-60 STATUS "Start Build Design." + if {$run_build} { + if {[catch {TE::VIV::build_design $bitgen $mcsgen $reportgen $hdfgen} result]} {TE::UTILS::te_msg TE_HW-61 ERROR "Script (TE::VIV::build_design) failed: $result."; return -code error} + } + # copy is done if hsi, sdk or jtag programming is started or + if {$export_prebuild} { + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_HW-62 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_HW-63 INFO "No Hardware Reports found."} + } + TE::UTILS::te_msg TE_HW-64 STATUS "Build Design finished." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished hardware generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # software generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--sw_run_hsi: + proc sw_run_hsi {{args ""}} { + set run_help false + set run_copy true + set run_clear false + set run_prebuilt false + set run_prebuilt_hdf_only false + set run_hsi true + set run_bif true + set run_bin true + set force_bin false + set run_bitmcs true + set prebuilt_name "" + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-run_only" { set run_copy false} + "-prebuilt_hdf" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-prebuilt_hdf_only" { incr option; set run_prebuilt_hdf_only true; set prebuilt_name [lindex $args $option]} + "-no_hsi" { set run_hsi false} + "-no_bif" { set run_bif false} + "-no_bin" { set run_bin false} + "-no_bitmcs" { set run_bitmcs false} + "-force_bin" { set force_bin true} + "-clear" { set run_clear true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-83 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Run HSI: \n\ + Description:\n\ + \ Start HSI and create all software apps (*elf) and corresponding boot.bif and boot.bin (for Zynq/UZynq only) or .bit and .mcs (for MicroBlaze only), which are specified in apps_list.csv\n\ + \ Copy HW File and reports from the vivado project to the prebuilt folder if -prebuild_hdf isn't set (default)\n\ + \ *.hdef and *.sysdef are ignored if BD-Name is fsys (Without processor system). \n\ + \ Attention: Need SDK installation! \n\ + Syntax:\n\ + \ TE::sw_run_hsi \[-run_only\] \[-prebuilt_hdf \] \[-no_hsi\] \[-no_bif\] \[-no_bin\] \[-no_bitmcs\] \[-clear\] \[-help\]\n\ + Returns:\n\ + No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-prebuilt_hdf \] used *.bit and *.hdf from prebuilt folder instead of vivado project. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used. \n\ + \ \[-run_only\] used old data in workspace (*.bit and *.hdf)\n\ + \ \[-no_hsi\] disable *.elf generation\n\ + \ \[-no_bif\] disable boot.bif generation (for Zynq System only)\n\ + \ \[-no_bin\] disable boot.bin generation (for Zynq System only)\n\ + \ \[-force_bin\] disabllefor Zynq check for bif and bin generation\n\ + \ \[-no_bitmcs\] disable {appname}.bit and .mcs (for MicroBlaze System only) generation\n\ + \ \[-clear\] delete old data before workspace is created\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::UTILS, TE::EXT\n\ + " + TE::UTILS::te_msg TE_SW-39 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_SW-40 STATUS "Start HSI." + if {$run_clear} { + if {[catch {TE::UTILS::clean_workspace_hsi} result]} {TE::UTILS::te_msg TE_SW-41 ERROR "Script (TE::UTILS::clean_workspace_hsi) failed: $result."; return -code error} + } + + if {$run_hsi} { + if {$run_copy} { + if {$run_prebuilt} { + if {[catch {TE::UTILS::generate_workspace_hsi $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-42 ERROR "Script (TE::UTILS::generate_workspace_hsi) failed: $result."; return -code error} + } elseif {$run_prebuilt_hdf_only} { + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_SW-43 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_SW-44 INFO "No Hardware Reports found. "} + if {[catch {TE::UTILS::generate_workspace_hsi $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-45 ERROR "Script (TE::UTILS::generate_workspace_hsi) failed: $result."; return -code error} + } else { + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_SW-46 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_SW-47 INFO "No Hardware Reports found. "} + if {[catch {TE::UTILS::generate_workspace_hsi} result]} {TE::UTILS::te_msg TE_SW-48 ERROR "Script (TE::UTILS::generate_workspace_hsi) failed: $result."; return -code error} + } + } + if {[catch {TE::EXT::run_hsi} result]} {TE::UTILS::te_msg TE_SW-49 ERROR "Script (TE::EXT::run_hsi) failed: $result."; return -code error} + } + if {$TE::IS_ZSYS || $TE::IS_ZUSYS || $force_bin} { + #.bif and .bin only on zynq systems + if {$run_bif} { + if {[catch {TE::EXT::generate_bif_files $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-50 ERROR "Script (TE::EXT::generate_bif_files) failed: $result."; return -code error} + } + if {$run_bin} { + if {[catch {TE::EXT::generate_bootbin $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-51 ERROR "Script (TE::EXT::generate_bootbin) failed: $result."; return -code error} + } + } elseif {$TE::IS_MSYS} { + if {$run_bitmcs} { + if {[catch {TE::EXT::generate_app_bit_mcs $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-52 ERROR "Script (TE::EXT::generate_app_bit_mcs) failed: $result."; return -code error} + } + } else { + set te_txt "Boot.bif and Boot.bin only for Zynq-FPGAs available. .bit and .mcs only for MicroBlaze available. System will be checked with block design name, current BD file name is $TE::BD_TCLNAME .Use:\n\ + \ \"zsys_bd.tcl\" for Systems with Zynq \n\ + \ \"zusys_bd.tcl\" for Systems with UltraScale Zynq\n\ + \ \"msys_bd.tcl\" for Systems with MicroBlaze\n\ + \ \"fsys_bd.tcl\" for Systems with FPGA-Fabric design only\n\ + " + TE::UTILS::te_msg TE_SW-53 INFO $te_txt + } + TE::UTILS::te_msg TE_SW-54 STATUS "HSI finished." + } + } + #-------------------------------- + #--sw_run_sdk: + proc sw_run_sdk {{args ""}} { + set run_help false + set run_copy true + set start_sdk true + set run_clear false + set run_prebuilt false + set prebuilt_name "" + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-open_only" { set run_copy false} + "-update_hdf_only" { set start_sdk false} + "-prebuilt_hdf" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-clear" { set run_clear true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-84 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Run SDK: \n\ + Description:\n\ + \ Start SDK project in external folder $TE::WORKSPACE_SDK_PATH\n\ + \ Copy HW File and reports from the vivado project to the prebuilt folder if -prebuild_hdf isn't set (default)\n\ + \ *.hdef and *.sysdef are ignored if BD-Name is fsys (Without processor system). \n\ + \ Attention: If you use VIVADO GUI Command (File->Export-> Export Hardware..(Include Bit-file!) or File->Launch SDK) to Update or open SKD set new export path and workspace: $TE::WORKSPACE_SDK_PATH\n\ + \ Attention: Need SDK installation! \n\ + Syntax:\n\ + \ TE::sw_run_sdk \[-open_only\] \[-update_hdf_only\] \[-prebuilt_hdf \] \[-clear\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-prebuilt_hdf \] used *.hdf from prebuilt folder instead of vivado project. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used. \n\ + \ \[-open_only\] open SDK without update the *.hdf file \n\ + \ \[-update_hdf_only\] copy the new *.hdf file into the SDK workspace without open SDK\n\ + \ \[-clear\] delete old data before workspace is created\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::UTILS, TE::EXT\n\ + " + TE::UTILS::te_msg TE_SW-55 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_SW-56 STATUS "Start SDK" + if {$run_clear} { + if {[catch {TE::UTILS::clean_workspace_sdk} result]} {TE::UTILS::te_msg TE_SW-57 ERROR "Script (TE::UTILS::clean_workspace_sdk) failed: $result."; return -code error} + } + if {$run_copy} { + if {$run_prebuilt} { + if {[catch {TE::UTILS::generate_workspace_sdk $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-58 ERROR "Script (TE::UTILS::generate_workspace_sdk) failed: $result."; return -code error} + } else { + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_SW-59 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_SW-60 INFO "No Hardware Reports found."} + if {[catch {TE::UTILS::generate_workspace_sdk} result]} {TE::UTILS::te_msg TE_SW-61 ERROR "Script (TE::UTILS::generate_workspace_sdk) failed: $result."; return -code error} + } + } + if {$start_sdk} { + if {[catch {TE::EXT::run_sdk} result]} {TE::UTILS::te_msg TE_SW-62 ERROR "Script (TE::EXT::run_sdk) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_SW-63 STATUS "SDK finished." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished software generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--pr_program_flash_binfile: + proc pr_program_flash_binfile {{args ""}} { + set return_filename "" + set use_basefolder false + set use_sdk_flash true + set run_help false + set run_prebuilt false + set appname "" + set prebuilt_name "" + set print_available_apps false + set reboot true + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-no_reboot" { set reboot false} + "-used_board" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-swapp" { incr option; set appname [lindex $args $option]} + "-available_apps" { set print_available_apps true} + "-force_hw_manager" { set use_sdk_flash false} + "-used_basefolder_binfile" {set use_basefolder true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-85 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Program Flash with Bin-File: \n\ + Description:\n\ + \ Programming specified FPGA-Flash with bin-file (Zynq-Processors only).\n\ + \ It will be program the boot.bin from the corresponding prebuilt folder, which is set in the vivado project, if -used_board isn't set.\n\ + Syntax:\n\ + \ TE::pr_program_flash_binfile \[-no_reboot\] \[-used_board \] \[-swapp \] \[-available_apps\] \[-used_basefolder_binfile\] \[-help\]\n\ + Returns:\n\ + \ Programming file-name.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-no_reboot\] Memory will be only configured, no JTag reboot is done.\n\ + \ \[-used_board \] Used prebuilt folder board version instead of Vivado project settings. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used.\n\ + \ \[-swapp \] Software APP name which should be programmed.\n\ + \ \[-available_apps\] Return available software APP names from selected the prebuilt boot_images folder.\n\ + \ \[-force_hw_manager\] Force LabTools Hardware-Manager instead of SDK-Programmer. Boot.bin can be configured via SDK-Programmer or LabTools Hardware-Manager. If both available SDK-Programmer is used default. \n\ + \ \[-used_basefolder_binfile\] Use base-folder bin-file ($TE::BASEFOLDER). Should be only one *.bin!\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::EXT, TE::VLAB\n\ + " + TE::UTILS::te_msg TE_PR-43 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_PR-44 STATUS "Start Flash Programming with BIN File" + set starttime [clock seconds] + if {$print_available_apps} { + if {[catch {TE::EXT::get_available_apps $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-45 ERROR "Script (TE::EXT::get_available_apps) failed: $result."; return -code error} + } else { + if {$appname eq ""} {TE::UTILS::te_msg TE_PR-46 ERROR "No APP name is selected see \[pr_program_flash_binfile -help\]: $result."; return -code error} + if {$prebuilt_name ne ""} { + set id "[TE::BDEF::find_id $prebuilt_name]" + set zynqflashtyp_int [TE::BDEF::get_zynqflashtyp $id 0] + } else { + set zynqflashtyp_int $TE::ZYNQFLASHTYP + } + + set check_zynqflash false + if {$zynqflashtyp_int ne "NA"} { + set check_zynqflash true + } + + if {$::env(SDK_AVAILABLE) && $check_zynqflash && $use_sdk_flash} { + if {[catch {set return_filename [TE::EXT::excecute_zynq_flash_programming $use_basefolder $appname $prebuilt_name]} result]} {TE::UTILS::te_msg TE_PR-47 ERROR "Script (TE::EXT::excecute_zynq_flash_programming) failed: $result."; return -code error} + if {$reboot} { + set hw_close true + if {[catch {set hw_close [TE::VLAB::hw_open_jtag]} result]} {TE::UTILS::te_msg TE_PR-48 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + if {[catch {TE::VLAB::hw_fpga_boot_from_memory $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-49 ERROR "Script (TE::VLAB::hw_fpga_boot_from_memory) failed: $result."; return -code error} + if {$hw_close} { + if {[catch {TE::VLAB::hw_close_jtag} result]} {TE::UTILS::te_msg TE_PR-50 ERROR "Script (TE::VLAB::hw_close_jtag) failed: $result."; return -code error} + } + } + } else { + set hw_close true + if {[catch {set hw_close [TE::VLAB::hw_open_jtag]} result]} {TE::UTILS::te_msg TE_PR-51 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + + if {[catch {TE::VLAB::hw_create_flash_device $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-52 ERROR "Script (TE::VLAB::hw_create_flash_device) failed: $result."; return -code error} + if {[catch {set return_filename [TE::VLAB::hw_program_fpga_flash $use_basefolder "" bin $appname $prebuilt_name]} result]} {TE::UTILS::te_msg TE_PR-53 ERROR "Script (TE::VLAB::hw_program_fpga_flash) failed: $result."; return -code error} + + if {$reboot} { + if {[catch {TE::VLAB::hw_fpga_boot_from_memory $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-54 ERROR "Script (TE::VLAB::hw_fpga_boot_from_memory) failed: $result."; return -code error} + } + if {$hw_close} { + if {[catch {TE::VLAB::hw_close_jtag} result]} {TE::UTILS::te_msg TE_PR-55 ERROR "Script (TE::VLAB::hw_close_jtag) failed: $result."; return -code error} + } + } + } + set stoptime [clock seconds] + set timeelapsed [expr $stoptime -$starttime] + TE::UTILS::te_msg TE_PR-56 INFO "Programming elapsed time: $timeelapsed seconds" + TE::UTILS::te_msg TE_PR-57 STATUS "Flash Programming with BIN File finished" + } + return $return_filename + } + #-------------------------------- + #--pr_program_flash_mcsfile: + proc pr_program_flash_mcsfile {{args ""}} { + set return_filename "" + set run_help false + set run_prebuilt false + set appname "" + set prebuilt_name "" + set print_available_apps false + set reboot true + set term "pull-none" + set use_basefolder false + #pull-none (default)#pull-up #pull-down + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-no_reboot" { set reboot false} + "-used_board" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-unused_io_termination" { incr option; set term [lindex $args $option]} + "-swapp" { incr option; set appname [lindex $args $option]} + "-available_apps" { set print_available_apps true} + "-used_basefolder_mcsfile" {set use_basefolder true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-86 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Program Flash with MCS File: \n\ + Description:\n\ + \ Programming specified FPGA-Flash with mcs-File (No Zynq-Processors only).\n\ + \ It will be program the .mcs from the corresponding prebuilt folder which is set in the vivado/labtool project, if -used_board isn't set. \n\ + Syntax:\n\ + \ TE::pr_program_flash_mcsfile \[-no_reboot\] \[-used_board \] \[-unused_io_termination \] \[-swapp \] \[-available_apps\] \[-used_basefolder_mcsfile\] \[-help\]\n\ + Returns:\n\ + \ Programming file-name.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-no_reboot\] Memory will be only configured, no JTag reboot is done.\n\ + \ \[-used_board \] Used prebuilt folder board version instead of vivado project settings. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used.\n\ + \ \[-unused_io_termination \] Set termination for unused Device IO-Pins Available Settings are: pull-none, pull-up or pull-down. Default pull-none is used.\n\ + \ \[-swapp \] Software app name which should be programmed(If app name isn't set, the mcs-file from the prebuilt hardware folder is used). \n\ + \ \[-available_apps\] Return available software app names from selected the prebuilt boot_images folder.\n\ + \ \[-used_basefolder_mcsfile\] Use base-folder mcs-file ($TE::BASEFOLDER). Should be only one *.mcs!\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::EXT, TE::VLAB\n\ + " + TE::UTILS::te_msg TE_PR-58 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_PR-59 STATUS "Start Flash Programming with BIN File" + set starttime [clock seconds] + if {$print_available_apps} { + if {[catch {TE::EXT::get_available_apps $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-60 ERROR "Script (TE::EXT::get_available_apps) failed: $result."; return -code error} + } else { + if {!$run_prebuilt} { + if {![catch {set projectname [get_projects]} result]} { + #copy only on vivado project + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_PR-61 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_PR-62 INFO "No Hardware Reports found."} + } + } + set hw_close true + if {[catch {set hw_close [TE::VLAB::hw_open_jtag]} result]} {TE::UTILS::te_msg TE_PR-63 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + + if {[catch {TE::VLAB::hw_create_flash_device $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-64 ERROR "Script (TE::VLAB::hw_create_flash_device) failed: $result."; return -code error} + if {[catch {set return_filename [TE::VLAB::hw_program_fpga_flash $use_basefolder $term mcs $appname $prebuilt_name]} result]} {TE::UTILS::te_msg TE_PR-65 ERROR "Script (TE::VLAB::hw_program_fpga_flash) failed: $result."; return -code error} + + if {$reboot} { + if {[catch {TE::VLAB::hw_fpga_boot_from_memory $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-66 ERROR "Script (TE::VLAB::hw_fpga_boot_from_memory) failed: $result."; return -code error} + } + if {$hw_close} { + if {[catch {TE::VLAB::hw_close_jtag} result]} {TE::UTILS::te_msg TE_PR-67 ERROR "Script (TE::VLAB::hw_close_jtag) failed: $result."; return -code error} + } + } + set stoptime [clock seconds] + set timeelapsed [expr $stoptime -$starttime] + TE::UTILS::te_msg TE_PR-68 INFO "Programming elapsed time: $timeelapsed seconds" + TE::UTILS::te_msg TE_PR-69 STATUS "Flash Programming with BIN File finished." + } + return $return_filename + } + #-------------------------------- + #--pr_program_jtag_bitfile: + proc pr_program_jtag_bitfile {{args ""}} { + set return_filename "" + set print_available_apps false + set run_help false + set run_prebuilt false + set use_basefolder false + set prebuilt_name "" + set appname "" + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-used_board" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-swapp" { incr option; set appname [lindex $args $option]} + "-available_apps" { set print_available_apps true} + "-used_basefolder_bitfile" {set use_basefolder true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-87 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Program FPGA with Bit File: \n\ + Description:\n\ + \ Programming FPGA with BIT-File.\n\ + \ Copy HW File and reports from the Vivado project to the prebuilt folder, if -used_board isn't set (default)\n\ + Syntax:\n\ + \ TE::pr_program_jtag_bitfile \[-used_board \] \[-used_basefolder_bitfile\] \[-help\]\n\ + Returns:\n\ + \ Programming file-name.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-used_board \] Used prebuilt folder board version instead of vivado project settings. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used.\n\ + \ \[-swapp \] Software app name which should be programmed. (If app name isn't set, the bit-file from the prebuilt hardware folder is used)\n\ + \ \[-available_apps\] Return available software app names from selected the prebuilt boot_images folder.\n\ + \ \[-used_basefolder_bitfile\] Use base-folder bit-file ($TE::BASEFOLDER). Should be only one *.bit!\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VLAB\n\ + " + TE::UTILS::te_msg TE_PR-70 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_PR-71 STATUS "Start FPGA Programming with Bit File" + set starttime [clock seconds] + if {$print_available_apps} { + if {[catch {TE::EXT::get_available_apps $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-72 ERROR "Script (TE::EXT::get_available_apps) failed: $result."; return -code error} + } else { + if {!$run_prebuilt} { + if {![catch {set projectname [get_projects]} result]} { + #copy only on vivado project + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_PR-73 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_PR-74 INFO "No Hardware Reports found. "} + } + } + set hw_wasclosed false + if {[current_hw_server] eq ""} {set hw_wasclosed true} + if {[catch {TE::VLAB::hw_open_jtag} result]} {TE::UTILS::te_msg TE_PR-75 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + if {[catch {set return_filename [TE::VLAB::hw_program_fpga_device $use_basefolder $appname $prebuilt_name]} result]} {TE::UTILS::te_msg TE_PR-76 ERROR "Script (TE::VLAB::hw_program_fpga_device) failed: $result."; return -code error} + if {$hw_wasclosed} { + if {[catch {TE::VLAB::hw_close_jtag} result]} {TE::UTILS::te_msg TE_PR-77 ERROR "Script (TE::VLAB::hw_close_jtag) failed: $result."; return -code error} + } + } + set stoptime [clock seconds] + set timeelapsed [expr $stoptime -$starttime] + TE::UTILS::te_msg TE_PR-78 INFO "Programming elapsed time: $timeelapsed seconds" + TE::UTILS::te_msg TE_PR-79 STATUS "FPGA Programming with BIT File finished." + } + return $return_filename + } + #-------------------------------- + #--pr_init_hardware_manager: + proc pr_init_hardware_manager {{args ""}} { + set run_help false + set run_prebuilt false + set prebuilt_name "" + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-88 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Initialise Hardware Manager: \n\ + Description:\n\ + \ Open Hardware-Manager, auto-connect target device and initialise flash memory with configuration from *_board_files.csv.\n\ + \ If flash memory isn't specified, it will be ignored. \n\ + Syntax:\n\ + \ TE::pr_init_hardware_manager \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VLAB\n\ + " + TE::UTILS::te_msg TE_PR-80 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_PR-81 STATUS "Start Init Hardware Manager" + if {[catch {TE::VLAB::hw_open_jtag} result]} {TE::UTILS::te_msg TE_PR-82 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + if {${TE::FPGAFLASHTYP} ne "NA"} { + if {[catch {TE::VLAB::hw_create_flash_device} result]} {TE::UTILS::te_msg TE_PR-83 ERROR "Script (TE::VLAB::hw_create_flash_device) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_PR-84 STATUS "Initialise Hardware Manager finished." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # utilities functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--util_zip_project: + proc util_zip_project {{args ""}} { + set run_help false + set manual_name false + set tmp [split $TE::SHORTDIR "_"] + set zipname "" + + #settings + set remove_prebuilt false + set save_all false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-manual_filename" { incr option; set zipname [lindex $args $option];set manual_name true} + "-remove_prebuilt" { set remove_prebuilt true} + "-save_all" { set save_all true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-89 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {!$manual_name} { + #boardname + set zipname [lindex $tmp 0] + #projectname + set zipname "${zipname}-${TE::VPROJ_NAME}" + if {$remove_prebuilt} { + set zipname "${zipname}_noprebuilt" + } + if {$save_all} { + set zipname "${zipname}_all" + } + #vivado version + set zipname "${zipname}-vivado_$::env(VIVADO_VERSION)" + #Scipt version (last id) + set tmp [split $TE::SCRIPTVER "."] + set scriptver [lindex $tmp [expr [llength $tmp]-1]] + set zipname "${zipname}-build_${scriptver}" + #timestamp + set date "[ clock format [clock seconds] -format "%Y%m%d%H%M%S"]" + set zipname "${zipname}_${date}" + } + if {$run_help} { + set te_txt "TE Script Backup Project: \n\ + Description:\n\ + \ Generate Zip file from current project in folder $TE::BACKUP_PATH.\n\ + \ Supported ZIP-Programs:7z.exe (7 zip) and zip.exe (Info ZIP) \n\ + \ Did not save files, which are specified in /settings/zip_ignore_list.csv.\n\ + Syntax:\n\ + \ TE::util_zip_project \[-save_all\] \[-remove_prebuilt\] \[-manual_filename \] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-manual_filename \] Specify name instead auto-generate name.\n\ + \ \[-remove_prebuilt\] Save backup without prebuilt(Command is ignored if -save_all is selected).\n\ + \ \[-save_all\] Save all, otherwise work path like vivado, workspace, vlog and other specified folders/files are excluded.\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::EXT\n\ + " + TE::UTILS::te_msg TE_UTIL-95 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_UTIL-96 STATUS "Start Backup Project:" + if {$save_all} { + if {[catch {TE::EXT::zip_project $zipname} result]} {TE::UTILS::te_msg TE_UTIL-97 ERROR "Script (TE::EXT::zip_project) failed: $result."; return -code error} + } else { + #default list for old projects: + set excludelist "vivado vivado_lab workspace v_log run_prebuilt_all.cmd block_design/mod_bd.csv scripts/.svn sdsoc settings/development_settings.tcl" + #read ignore list from file + if {[llength $TE::ZIP_IGNORE_LIST] > 0} { + set excludelist [] + foreach entry $TE::ZIP_IGNORE_LIST { + if {[lindex $entry 0]==0} { + #only id0 objects + lappend excludelist [lindex $entry 1] + } elseif {[lindex $entry 0]==1} { + #only id1 objects + set find [] + catch {set find [glob -join -dir $TE::BASEFOLDER [lindex $entry 1]]} + foreach el $find { + set sl_start [expr [string length $TE::BASEFOLDER]+1] + set sl_stop [string length $el] + lappend excludelist [string range $el $sl_start $sl_stop] + } + } + } + } + if {$remove_prebuilt} { + lappend excludelist "prebuilt" + } + if {[catch {TE::EXT::zip_project $zipname $excludelist} result]} {TE::UTILS::te_msg UTIL-98 ERROR " Script (TE::EXT::zip_project) failed: $result."; return -code error} + } + TE::UTILS::te_msg UTIL-99 STATUS "Backup Project finished." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished utilities functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # beta test functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + namespace eval ADV { + #-------------------------------- + #--beta_util_sdsoc_project: + proc beta_util_sdsoc_project {{args ""}} { + set run_help false + set start_sdsoc false + set check_sdsoc false + + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-check_only" { set check_sdsoc true} + "-start_sdsoc" { set start_sdsoc true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-90 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + + if {$run_help} { + set te_txt "TE Script SDSoC Project: \n\ + Description:\n\ + \ Generate SDSoC project structure in $TE::SDSOC_PATH.\n\ + \ 7-ZIP-Program is required (see design_basic_settings.cmd).\n\ + \ Attention: This Project will be modified! To restore, close this Project after SDSOC generation an run create project batch file.\n\ + Syntax:\n\ + \ TE::ADV::beta_util_sdsoc_project \[-check_only\] \[-start_sdsoc\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-check_only\] Check this project for SDSOC support (no modification are done).\n\ + \ \[-start_sdsoc\] Start SDSOC with workspace: $TE::SDSOC_PATH.\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::SDSOC, TE::EXT\n\ + " + TE::UTILS::te_msg TE_HW-65 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_HW-66 STATUS "Start SDSoC Project:" + if {$check_sdsoc} { + if {[catch {TE::SDSOC::check_and_modify_vivado_project true} result]} {TE::UTILS::te_msg TE_HW-67 ERROR "Script (TE::SDSOC::check_and_modify_vivado_project) failed: $result."; return -code error} + } elseif {$start_sdsoc} { + if {[catch {TE::EXT::run_sdsoc} result]} {TE::UTILS::te_msg TE_HW-68 ERROR "Script (TE::EXT::run_sdsoc) failed: $result."; return -code error} + } else { + if {[catch {TE::SDSOC::create_sdsoc_structure} result]} {TE::UTILS::te_msg TE_HW-69 ERROR "Script (TE::SDSOC::create_sdsoc_structure) failed: $result."; return -code error} + if {[catch {TE::SDSOC::check_and_modify_vivado_project false} result]} {TE::UTILS::te_msg TE_HW-70 ERROR "Script (TE::SDSOC::check_and_modify_vivado_project) failed: $result."; return -code error} + #todo rebuild project files + if {[catch {TE::SDSOC::export_vivado_sdsoc_project} result]} {TE::UTILS::te_msg TE_HW-71 ERROR "Script (TE::SDSOC::export_vivado_sdsoc_project) failed: $result."; return -code error} + if {[catch {TE::SDSOC::create_sdsoc_pfm} result]} {TE::UTILS::te_msg TE_HW-72 ERROR "Script (TE::SDSOC::create_sdsoc_pfm) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_HW-73 STATUS "SDSoC Project finished." + } + } + #-------------------------------- + #--beta_hw_remove_board_part + proc beta_hw_remove_board_part {{args ""}} { + set temp_only true + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-permanent" {set temp_only false} + "-help" {set run_help true} + default {TE::UTILS::te_msg TE_UTIL-91 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Remove Board part: \n\ + Description:\n\ + \ Remove board part from project.\n\ + \ Attention:\n\ + \ Function not supported for all Block-Design IPs.\n\ + \ Check design after automatically modifications are done!\n\ + \ To restore project after permanent modification do:\n\ + \ Delete ${TE::BD_PATH}/*.tcl.\n\ + \ Rename ${TE::BD_PATH}/*.tcl_backup into ${TE::BD_PATH}/*.tcl.\n\ + \ Delete ${TE::BOARDDEF_PATH}/*_board_files_mod.csv.\n\ + Syntax:\n\ + \ TE::ADV::beta_hw_remove_board_part \[-permanent\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-permanent\] Board Part is removed permanently for this vivado project.TCL-File is generated and alternative board_part.cvs is used on design creation.\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VIV, TE::UTILS\n\ + " + TE::UTILS::te_msg TE_HW-74 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_HW-75 STATUS "Start Remove Board Part:" + if {[catch {TE::VIV::design_exclude_boarddef $temp_only} result]} {TE::UTILS::te_msg TE_HW-76 ERROR "Script (TE::VIV::design_exclude_boarddef) failed: $result."; return -code error} + TE::UTILS::te_msg TE_HW-77 STATUS "Remove Board Part finished." + } + } + #-------------------------------- + #--beta_hw_export_rtl_ip + proc beta_hw_export_rtl_ip {{args ""}} { + set run_help false + set board_part_only false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-help" {set run_help true} + default {TE::UTILS::te_msg TE_UTIL-92 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Remove Board part: \n\ + Description:\n\ + \ Export RTL-IP Cores (*.xci), which are not included in a Block-Design to ${TE::HDL_PATH}/xci/${TE::SHORTDIR}.\n\ + \ HDL and *.xci files, which include in the folder $TE::HDL_PATH are load automatically on project creation.\n\ + Syntax:\n\ + \ TE::ADV::beta_hw_export_rtl_ip \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VIV, TE::UTILS\n\ + " + TE::UTILS::te_msg TE_HW-78 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_HW-79 STATUS "Start Export RTL-IPs:" + if {[catch {TE::VIV::export_xci} result]} {TE::UTILS::te_msg TE_HW-80 ERROR "Script (TE::VIV::export_xci) failed: $result."; return -code error} + TE::UTILS::te_msg TE_HW-81 STATUS "Export RTL-IPs finished." + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished beta test functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + puts "INFO:(TE) Load User Command scripts finished" +} \ No newline at end of file diff --git a/zynqberrydemo1/scripts/script_vivado.tcl b/zynqberrydemo1/scripts/script_vivado.tcl new file mode 100644 index 0000000..78317ca --- /dev/null +++ b/zynqberrydemo1/scripts/script_vivado.tcl @@ -0,0 +1,1556 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/03 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/04/13 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval VIV { + + # ------------------------------------------------------- + # ----advanced functions are currently official not supported + # ------------------------------------------------------- + #-------------------------------- + #--export_vivado_setting: + proc export_vivado_setting {} { + # hidden function: official not supported + set old_file_data "" + if {![file exists $TE::SET_PATH]} { + file mkdir ${TE::SET_PATH}/ + } elseif {[file exists ${TE::SET_PATH}/project_settings.tcl]} { + # additional project settings + set fp_r [open ${TE::SET_PATH}/project_settings.tcl "r"] + set old_file_data [read $fp_r] + close $fp_r + } + set fp_w [open ${TE::SET_PATH}/project_settings.tcl "w"] + + puts $fp_w "##############################" + puts $fp_w "# --------------------------------------------------------------------" + puts $fp_w "# -- ***************************** " + puts $fp_w "# -- * Trenz Electronic GmbH * " + puts $fp_w "# -- * Holzweg 19A * " + puts $fp_w "# -- * 32257 Bünde * " + puts $fp_w "# -- * Germany * " + puts $fp_w "# -- ***************************** " + puts $fp_w "# --------------------------------------------------------------------" + puts $fp_w "##############################" + puts $fp_w "##Automatically exported settings:" + puts $fp_w "##Creation time: [ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"]" + puts $fp_w "##Board Part: [get_property board_part [current_project]]" + puts $fp_w "##Part: [get_property part [current_project]]" + puts $fp_w "#Export Settings currently not available." + puts $fp_w "#This file will be read on project generation only." + puts $fp_w "##############################" + puts $fp_w "#Old file settings:" + puts $fp_w $old_file_data + puts $fp_w "##############################" + puts $fp_w "#exported file settings:" + puts $fp_w "puts \"Info:(TE) Automatically exported settings.\"" + puts $fp_w "#set_property \"board_part\" [get_property board_part [current_project]] \[current_project\]" + puts $fp_w "#set_property \"part\" [get_property part [current_project]] \[current_project\]" + close $fp_w + TE::UTILS::te_msg TE_HW-0 STATUS "${TE::SET_PATH}/project_settings.tcl was created." + } + #-------------------------------- + #--import_vivado_setting: + proc import_vivado_setting {} { + # hidden function: official not supported + if {[file exists ${TE::SET_PATH}/project_settings.tcl]} { + # additional project settings + TE::UTILS::te_msg TE_HW-1 INFO "Load additional project properties from ${TE::SET_PATH}/project_settings.tcl" + source ${TE::SET_PATH}/project_settings.tcl + } + } + + #-------------------------------- + #--design_exclude_boarddef: + proc design_exclude_boarddef {temp_only} { + # hidden function: official not supported + #run only if board part is defined + if {[get_property board_part [current_project]] ne ""} { + #get bd files + set bd_files [list] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + } + if {[llength $bd_files]>1} { + TE::UTILS::te_msg TE_HW-1 ERROR "Exclude Board part failed. Only one Block Design supported for this function." + return -code error; + } + #run rtl for xdc export + synth_design -rtl -name rtl_1 + set pjc_xdc_path "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::CONST_NAME}" + file mkdir $pjc_xdc_path + #export io locs (needed if constrain in board part only) + write_xdc -force -mode port ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc + #remove wrong properties + set fp_r [open ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc "r"] + set file_data [read $fp_r] + close $fp_r + set data [split $file_data "\n"] + set fp_w [open ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc "w"] + puts $fp_w "##############################" + puts $fp_w "# --------------------------------------------------------------------" + puts $fp_w "# -- ***************************** " + puts $fp_w "# -- * Trenz Electronic GmbH * " + puts $fp_w "# -- * Holzweg 19A * " + puts $fp_w "# -- * 32257 Buende * " + puts $fp_w "# -- * Germany * " + puts $fp_w "# -- ***************************** " + puts $fp_w "# --------------------------------------------------------------------" + puts $fp_w "##############################" + puts $fp_w "##Automatically exported port constrains from exclude board part function:" + puts $fp_w "##Creation time: [ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"]" + puts $fp_w "##Board Part: [get_property board_part [current_project]]" + puts $fp_w "##Part: [get_property part [current_project]]" + puts $fp_w "##############################" + foreach line $data { + #ignore some properties + if {![string match "*set_property DIRECTION*" $line] && ![string match "*set_property IBUF_LOW_PWR*" $line] && ![string match "*current_instance -quiet*" $line]} { + puts $fp_w $line + } + } + close $fp_w + + #add constrains file + add_files -fileset ${TE::CONST_NAME} ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc + set_property used_in_synthesis false [get_files ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc] + #modify some ip setting manually + set mig_project "" + # set mig_addr_offset "" + foreach bd $bd_files { + open_bd_design $bd + TE::UTILS::te_msg TE_HW-2 INFO "Exclude Board part: Remove Board Part settings from IPs in $bd" + #------------- + #mig + if {[catch {[get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]}]} { + TE::UTILS::te_msg TE_HW-3 WARNING "Exclude Board part: MIG was found modified. Check Settings after run in $bd" + catch {set_property CONFIG.BOARD_MIG_PARAM Custom [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]} + catch {set mig_project [get_property CONFIG.XML_INPUT_FILE [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]]} + # catch {set mig_addr_offset [get_property range [get_bd_addr_segs -of_objects [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]]]} + } + #------------- + #TE ASIO + if {[catch {[get_bd_cells -hierarchical -filter {VLNV=~"*axis_asio_gpio*"}]}]} { + TE::UTILS::te_msg TE_HW-4 WARNING "Exclude Board part: ASIO IP was found and modified. Check Settings after run in $bd" + catch {set_property CONFIG.USE_BOARD_FLOW false [get_bd_cells -hierarchical -filter {VLNV=~"*axis_asio_gpio*"}]} + catch {set_property CONFIG.P0_BOARD_INTERFACE Custom [get_bd_cells -hierarchical -filter {VLNV=~"*axis_asio_gpio*"}]} + } + } + #disable board definition + set_property "part" "[get_property part [current_project]]" [current_project] + #update ip's + set ip_names [get_ips] + if {[llength $ip_names]>0 } { + ::report_ip_status -name ip_status + foreach ip $ip_names { + TE::UTILS::te_msg TE_HW-5 INFO "Exclude Board part: Upgrade IP: $ip_names" + if {[catch {::upgrade_ip [get_ips $ip]}] } {TE::UTILS::te_msg TE_HW-6 {CRITICAL WARNING} "Exclude Board part: Upgrade IP: $ip_names failed and will be ignored." } + } + ::report_ip_status -name ip_status + } + #restore some ip setting manually + foreach bd $bd_files { + #------------- + #mig + if {[catch {[get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]}]} { + catch {set_property CONFIG.XML_INPUT_FILE $mig_project [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]} + catch {assign_bd_address [get_bd_addr_segs -of_objects [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]]} + # catch {set_property range $mig_addr_offset [get_bd_addr_segs -of_objects [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]]} + } + #------------- + #TE ASIO + if {[catch {[get_bd_cells -hierarchical -filter {VLNV=~"*axis_asio_gpio*"}]}]} { + } + #------------- + validate_bd_design + save_bd_design + close_bd_design [current_bd_design] + } + + if {!$temp_only} { + TE::UTILS::te_msg TE_HW-7 WARNING "Exclude Board part: Remove Board part on Backup files permanently." + # ----------------------------------------------------------------- + #copy exported xdc fie + file copy -force ${pjc_xdc_path}/exclude_boardpart_io_loc.xdc ${TE::XDC_PATH}/_i_exclude_boardpart_io_loc.xdc + # ----------------------------------------------------------------- + #backup old block designs tcl files + set bd_folder ${TE::BD_PATH}/ + if {[file exists ${TE::BD_PATH}/${TE::SHORTDIR}/]} { + set bd_folder ${TE::BD_PATH}/${TE::SHORTDIR}/ + } + set bd_names [] + if { ![catch {set bd_names [glob -join -dir ${bd_folder}/ *.tcl]}] } { + foreach bd $bd_names { + if {![file exists ${bd}_backup]} { + TE::UTILS::te_msg TE_HW-8 STATUS "Exclude Board part: Write Backup file: ${bd}_backup" + file copy -force ${bd} ${bd}_backup + } + } + } + # ----------------------------------------------------------------- + #write new bd file + TE::hw_blockdesign_export_tcl + # ----------------------------------------------------------------- + # write new board_files. + set board_files "" + if { [catch {set board_files [ glob $TE::BOARDDEF_PATH/*board_files.csv ] }] } { + TE::UTILS::te_msg TE_HW-9 WARNING "Exclude Board part: Board Part CSV list not found. Create *board_file_mod.csv generation failed." + } else { + set fp [open "${board_files}" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + set newdata [] + #boardname:3 + foreach line $data { + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + lappend newdata $line + lappend newdata "#Attention:This is a modified Board part CSV files." + } elseif {[string match *#* $line] != 1 && [string length $line] > 7} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #split and replaced + set tmp [split $line ","] + set tmp [lreplace $tmp[set tmp {}] 3 3 NA] + set newstring "" + set first 1 + foreach el $tmp { + if {$first} { + set newstring "$el" + set first 0 + } else { + set newstring "$newstring,$el" + } + } + lappend newdata $newstring + } else { + lappend newdata $line + } + } + #write all list elements to file + set new_name [file tail $board_files] + set new_name [file rootname $new_name] + set board_files "$TE::BOARDDEF_PATH/${new_name}_mod.csv" + set fp_w [open ${board_files} "w"] + foreach line $newdata { + puts $fp_w $line + } + close $fp_w + } + #----------------------------------------------------------------- + } + TE::UTILS::te_msg TE_HW-10 INFO "Exclude Board Part is done." + } else { + TE::UTILS::te_msg TE_HW-11 WARNING "Exclude Board Part failed, Board Part is not specified." + } + } + #-------------------------------- + #--design_include_boarddef: + proc design_include_boarddef {} { + TE::UTILS::te_msg TE_HW-12 WARNING "Sorry design_include_boarddef currently not available." + } + + #-------------------------------- + #--import_hdl: + proc import_hdl {} { + # hidden function: official not supported + if {[file exists $TE::HDL_PATH]} { + TE::UTILS::te_msg TE_HW-13 INFO "Import HDL files." + set hdl_names [TE::UTILS::search_hdl_files] + add_files $hdl_names + if {[lsearch $hdl_names *${TE::VPROJ_NAME}_top.vhd*]==0} { + #vhdl + set_property top ${TE::VPROJ_NAME}_top [current_fileset] + #overwrite bd_import toplevel_settings + set TE::PR_TOPLEVELNAME ${TE::VPROJ_NAME}_top + TE::UTILS::te_msg TE_HW-14 INFO "Set TE::PR_TOPLEVELNAME:$TE::PR_TOPLEVELNAME" + } elseif {[lsearch $hdl_names *${TE::VPROJ_NAME}_top.v*]==0} { + #Verilog + set_property top ${TE::VPROJ_NAME}_top [current_fileset] + #overwrite bd_import toplevel_settings + set TE::PR_TOPLEVELNAME ${TE::VPROJ_NAME}_top + TE::UTILS::te_msg TE_HW-15 INFO "Set TE::PR_TOPLEVELNAME:$TE::PR_TOPLEVELNAME" + } + # set attributes + foreach hdl $hdl_names { + set hdl_name [file tail [file rootname $hdl]] + if {[string match "*_simonly_*" $hdl_name] } { + set_property used_in_synthesis false [get_files $hdl] + TE::UTILS::te_msg TE_HW-16 INFO "Set $hdl_name synthesis property to false." + } + if {[string match "*_synonly_*" $hdl_name] } { + set_property used_in_simulation false [get_files $hdl] + TE::UTILS::te_msg TE_HW-17 INFO "Set $hdl_name simulation property to false." + } + } + } + } + + #------------------------------------ + #--import_xci: import xci files + proc import_xci {} { + # hidden function: official not supported + if {[file exists $TE::HDL_PATH/xci]} { + TE::UTILS::te_msg TE_HW-18 INFO "Import XCI files." + set ip_names [TE::UTILS::search_xci_files] + import_ip -files $ip_names + catch {set ip_names [get_ips]} + foreach ip $ip_names { + ##ips without block design ips + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] } { + TE::UTILS::te_msg TE_HW-19 INFO "Run out of context IP for: $ip" + generate_target {instantiation_template} [get_files ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] + update_compile_order -fileset ${TE::SOURCE_NAME} + generate_target all [get_files ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] + if {[get_property generate_synth_checkpoint [get_files ${ip}.xci]] == 1 && [get_property is_enabled [get_files ${ip}.xci]] == 1} { + create_ip_run [get_files -of_objects [get_fileset ${TE::SOURCE_NAME}] ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] + launch_run -jobs $TE::RUNNING_JOBS ${ip}_synth_1 + } + } + } + foreach ip $ip_names { + ##ips without ips from block design + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] } { + if {[get_property generate_synth_checkpoint [get_files ${ip}.xci]] == 1 && [get_property is_enabled [get_files ${ip}.xci]] == 1} { + wait_on_run -timeout ${TE::TIMEOUT} ${ip}_synth_1 + } + } + } + } + } + #------------------------------------ + #--export_xci: export xci files + proc export_xci {} { + # hidden function: official not supported + set ip_names [list] + catch {set ip_names [get_ips]} + if {[llength $ip_names] > 0} { + file mkdir $TE::HDL_PATH/xci/${TE::SHORTDIR} + + set ip_report "" + foreach ip $ip_names { + ##ips without block design ips + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] } { + set ip_report "$ip_report \n $ip" + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci $TE::HDL_PATH/xci/${TE::SHORTDIR}/${ip}.xci + } + } + TE::UTILS::te_msg TE_HW-20 INFO "Export: \n \ + $ip_report \n \ + to folder $TE::HDL_PATH/xci/${TE::SHORTDIR}/ \n \ + ------" + } + } + # ------------------------------------------------------- + # finished advanced function + # ------------------------------------------------------- + # ------------------------------------------------------- + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project creation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #------------------------------------ + #--create_project: create vivado project, set board definition and ip path, set default vivado properties + proc create_project {} { + #set board part file definition path + TE::ENV::set_path_boarddef + #create vivado project + ::create_project -force $TE::VPROJ_NAME $TE::VPROJ_PATH + #set local ip path + TE::ENV::set_path_ip + #set vivado properties + set_vprops + + } + #------------------------------------ + #--open_project: open excisting vivado project and restore importent script variables with settings from project + proc open_project {} { + #set board part file definition path + TE::ENV::set_path_boarddef + #open vivado project + ::open_project ${TE::VPROJ_NAME}.xpr + #restore vivado properties to script variables + restore_scriptprops + } + #------------------------------------ + #--close_project: close excisting vivado project + proc close_project {} { + #close vivado project + ::close_project + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished creation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project property functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #------------------------------------ + #--set_vprops: + proc set_vprops {} { + #set std properties + set_property "default_lib" "xil_defaultlib" [current_project] + set_property "simulator_language" "Mixed" [current_project] + set_property "target_language" "VHDL" [current_project] + if {[info exists TE::PARTNAME]} { + if {![string match $TE::PARTNAME "NA"]} { + set_property "part" $TE::PARTNAME [current_project] + } + } + if {[info exists TE::BOARDPART]} { + if {![string match $TE::BOARDPART "NA"]} { + set_property "board_part" $TE::BOARDPART [current_project] + } + } + #---------------------------------------------------------- + #hidden function write settings + import_vivado_setting + #---------------------------------------------------------- + #overwrite xilinx defaults + set_property name $TE::SIM_NAME [get_filesets sim_1] + set_property name $TE::SYNTH_NAME [get_runs synth_1] + set_property name $TE::IMPL_NAME [get_runs impl_1] + set_property name $TE::CONST_NAME [get_filesets constrs_1] + #---------------------------------------------------------- + } + #------------------------------------ + #--restore_scriptprops: + proc restore_scriptprops {} { + set ID [get_property board_part [current_project]] + if {$ID ne ""} { + TE::INIT::init_board $ID 3 + } else { + TE::INIT::init_part_only [get_property part [current_project]] + } + #check bd file names for some additional functions + if {[catch {TE::INIT::check_bdtyp} result]} {TE::UTILS::te_msg TE_HW-21 Error "Script (TE::INIT::check_bdtyp) failed: $result."; return -code error} + #check board parts + if { ![string equal $TE::PARTNAME [get_property part [current_project]]] } { + TE::UTILS::te_msg TE_HW-22 {CRITICAL WARNING} "Current part name is set to [get_property part [current_project]], expect $TE::PARTNAME for board part definition file $TE::BOARDPART" + } + #check top level name + if { ![string equal $TE::PR_TOPLEVELNAME [get_property top [current_fileset]]] } { + TE::UTILS::te_msg TE_HW-23 WARNING "Current top level name is set to [get_property top [current_fileset]], expect $TE::PR_TOPLEVELNAME from default initialisation. Set TE::PR_TOPLEVELNAME to [get_property top [current_fileset]]." + set TE::PR_TOPLEVELNAME [get_property top [current_fileset]] + } + #---------------------------------------------------------- + #set run paths + set TE::SIM_NAME [get_property name [get_filesets sim*]] + set TE::SYNTH_NAME [get_property name [get_runs syn*]] + set TE::IMPL_NAME [get_property name [get_runs imp*]] + set TE::CONST_NAME [get_property name [get_filesets con*]] + + TE::UTILS::te_msg TE_HW-24 INFO "Restore project parameters:\n \ + TE::SIM_NAME: $TE::SIM_NAME \n \ + TE::SYNTH_NAME: $TE::SYNTH_NAME \n \ + TE::IMPL_NAME: $TE::IMPL_NAME \n \ + TE::CONST_NAME: $TE::CONST_NAME \n \ + ------" + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished project property functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project source functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--import_design: + proc import_design {} { + TE::UTILS::te_msg TE_HW-25 STATUS "Start import design" + #load backup constrains and block design + set xdc_files [TE::UTILS::search_xdc_files] + import_xdc $xdc_files + set_xdcsetting $xdc_files + import_blockdesign + import_hdl + import_xci + import_elf + } + #-------------------------------- + #--import_xdc: + proc import_xdc {xdc_files} { + set target_file "" + foreach xdc $xdc_files { + read_xdc $xdc + if {[file tail $xdc] eq "vivado_target.xdc"} { + set target_file $xdc + } + } + + set_property target_constrs_file $target_file [current_fileset -constrset] + } + #-------------------------------- + #--set_xdcsetting: + proc set_xdcsetting {xdc_files} { + #set xdc properties depending on xdc name: processing order an usage + foreach xdc_file $xdc_files { + if {[string match *_e_* $xdc_file] == 1} { + set_property PROCESSING_ORDER EARLY [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-26 STATUS "Set processing order early for $xdc_file" + } elseif {[string match *_l_* $xdc_file] == 1} { + set_property PROCESSING_ORDER LATE [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-27 STATUS "Set processing order late for $xdc_file" + } else { + set_property PROCESSING_ORDER NORMAL [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-28 STATUS "Set processing order normal for $xdc_file" + } + if {[string match *_s_* $xdc_file] == 1} { + set_property USED_IN_IMPLEMENTATION 0 [get_files $xdc_file] + set_property USED_IN_SYNTHESIS 1 [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-29 STATUS "Set use for synthesis only for $xdc_file" + } elseif {[string match *_i_* $xdc_file] == 1} { + set_property USED_IN_SYNTHESIS 0 [get_files $xdc_file] + set_property USED_IN_IMPLEMENTATION 1 [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-30 STATUS "Set use for implementation only for $xdc_file" + } else { + set_property USED_IN_SYNTHESIS 1 [get_files $xdc_file] + set_property USED_IN_IMPLEMENTATION 1 [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-31 STATUS "Set use for synthesis and implementation for $xdc_file" + } + } + } + #-------------------------------- + #--reload_blockdesign: delete all bd and load bd.tcl files from backup + proc reload_blockdesign {} { + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + } + foreach bd $bd_files { + TE::UTILS::te_msg TE_HW-32 STATUS "Remove:$bd" + remove_files $bd + set bd_dir [file dirname $bd] + file delete -force $bd_dir + } + import_blockdesign + } + #-------------------------------- + #--import_blockdesign: imports and compile bd designs for vivado + proc import_blockdesign {} { + #check bd filenames for some additional functions + if {[catch {TE::INIT::check_bdtyp} result]} {TE::UTILS::te_msg TE_HW-33 ERROR "Script (TE::INIT::check_bdtyp) failed: $result."; return -code error} + + set bd_files [TE::UTILS::search_bd_files] + if {[llength $bd_files]>0 } { + #run bd tcl + foreach bd $bd_files { + # + if {[file extension $bd] eq ".tcl"} { + source $bd + close_bd_design [get_bd_designs] + } + } + #compile bd + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + } + foreach bd $bd_files { + open_bd_design $bd + validate_bd_design -force + generate_target all [get_files $bd] + #check if hdf to exists + set bd_name [get_bd_designs] + set tl_name "NA" + if { [catch {set tl_name [glob -join -dir $TE::HDL_PATH/ ${TE::VPROJ_NAME}_top.*]}] & [catch {set tl_name [glob -join -dir $TE::HDL_PATH/${TE::SHORTDIR}/ ${TE::VPROJ_NAME}_top.*]}] } { + TE::UTILS::te_msg TE_HW-34 INFO "Generate top level wrapper" + make_wrapper -files [get_files $bd] -top + add_files -norecurse ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.vhd + } else { + TE::UTILS::te_msg TE_HW-35 INFO "Use custom HDL top level file" + } + close_bd_design [get_bd_designs $bd] + #todo: use more bd files -> currently its check on init function only one is allowed + } + update_compile_order -fileset ${TE::SOURCE_NAME} + update_compile_order -fileset ${TE::SIM_NAME} + } + } + #-------------------------------- + #--export_blockdesign: export bd designs to clear vivado folder (if folder ${TE::BD_PATH}/${TE::SHORTDIR} exist it will be export for this boardpart only) + #-- create pdf for each bd and sub hierarchy + proc export_blockdesign {{args ""}} { + #read args + set bd_folder ${TE::BD_PATH} + set no_mig "" + set valid_bd true + set this_boardpart_only false + set mod_tcl false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-no_mig_contents" {set no_mig [lindex $args $option]} + "-no_validate" {set valid_bd false} + "-mod_tcl" {set mod_tcl true} + "-board_part_only" {set this_boardpart_only true} + "" {} + default { TE::UTILS::te_msg TE_HW-36 {CRITICAL WARNING} "Unrecognised option [lindex $args $option]is ignored" } + } + } + if {$this_boardpart_only} { + file mkdir ${TE::BD_PATH}/${TE::SHORTDIR}/ + } + if {[file exists ${TE::BD_PATH}/${TE::SHORTDIR}/]} { + set bd_folder ${TE::BD_PATH}/${TE::SHORTDIR}/ + } + #search for open projects + set bd_open false + set bd_open_file "" + set bd_open_name "" + + if {[current_bd_design -quiet] ne ""} { + #save currend bd configuration + # validate_bd_design -force + save_bd_design + set bd_open true + set bd_open_name "[current_bd_design]" + TE::UTILS::te_msg TE_BD-2 INFO "$bd_open_name was saved." + set bd_open_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/${bd_open_name}/${bd_open_name}.bd + # close_bd_design [get_bd_designs $bd_open_file] + } + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + TE::UTILS::te_msg TE_BD-3 WARNING "No BD-File was found." + } + if {!$TE::BD_MULTI} { + if {[llength $bd_files]>1 } { + TE::UTILS::te_msg TE_BD-4 WARNING "Currently only one block design supported, deleted unused bd.tcl from ${bd_folder}." + } + } + + foreach bd $bd_files { + open_bd_design $bd + if {$valid_bd} { + TE::UTILS::te_msg TE_BD-5 INFO "Validate Design." + validate_bd_design + } else { + TE::UTILS::te_msg TE_BD-6 WARNING "Validate Design disabled." + } + } + set vivado_bd_design_name [] + if { [catch {set vivado_bd_design_name [get_bd_designs]}] } { + TE::UTILS::te_msg TE_BD-7 {CRITICAL WARNING} "Block designs was not found." + + } else { + + set txt "Stored Block Designs: \n " + foreach bd $vivado_bd_design_name { + # puts "-exclude Layout, IP-Version and MIG-content" + # write_bd_tcl -force -exclude_layout -no_ip_version -no_mig_contents ${bd_folder}/${bd}_bd.tcl + set bf_tcl_name ${bd_folder}/${bd}_bd.tcl + set txt "${txt} File: ${bf_tcl_name} \n" + if {$no_mig eq ""} { + write_bd_tcl -force ${bf_tcl_name} + } else { + set txt "${txt} -Option: Remove MIG-Contents \n" + write_bd_tcl -force $no_mig ${bf_tcl_name} + } + # modify bd + if {[catch {TE::UTILS::modify_block_design_tcl ${bf_tcl_name} ${mod_tcl}} result]} { TE::UTILS::te_msg TE_BD-8 ERROR "Script (TE::UTILS::modify_block_design_tcl) failed: $result."; return -code error} + #export blockdesign as pdf + #sel doc_path + set doc_path ${TE::DOC_PATH}/ + if {[file exists ${TE::BD_PATH}/${TE::SHORTDIR}/]} { + set doc_path ${TE::DOC_PATH}/${TE::SHORTDIR}/ + } + file mkdir ${doc_path}/ + #delete old bd_*.pdf + set old_pdfs [] + if { [catch {set old_pdfs [glob -join -dir ${doc_path}/ bd_*.pdf]}] } { + } else { + TE::UTILS::te_msg TE_BD-9 INFO "Delete old Block Design PDFs in ${doc_path}" + foreach old_pdf $old_pdfs { + if {[catch {file delete -force ${old_pdf}}]} { + TE::UTILS::te_msg TE_BD-10 WARNING "Delete ${old_pdf} failed." + } + } + } + set txt "${txt} -Option: Write PDF-Layouts \n" + set sname bd_${TE::VPROJ_NAME}_hier_top.pdf + if {[catch {write_bd_layout -force -format pdf -scope all -orientation landscape ${doc_path}/${sname}}]} { + TE::UTILS::te_msg TE_BD-11 WARNING "Write ${doc_path}/${sname} failed." + } + set allsubs [get_bd_cells -filter {TYPE == hier}] + foreach sub $allsubs { + set tmp [string map {"/" ""} [join $sub]] + set sname bd_${TE::VPROJ_NAME}_hier_${tmp}.pdf + if {[catch {write_bd_layout -force -format pdf -hierarchy [get_bd_cells $sub] -orientation landscape ${doc_path}/${sname}}]} { + TE::UTILS::te_msg TE_BD-12 WARNING "Write ${doc_path}/${sname} failed." + } + } + # save is needed because print subsystem mod bd file + save_bd_design + # + if { $bd ne $bd_open_name || !$bd_open} { + close_bd_design [get_bd_designs ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/${bd}/${bd}.bd] + } + } + TE::UTILS::te_msg TE_BD-13 INFO "$txt" + } + } + #-------------------------------- + #--import_elf: + proc import_elf {} { + if {[file exists $TE::FIRMWARE_PATH]} { + set elf_names [TE::UTILS::search_elf_files] + # set microblaze elf + foreach elf_f $elf_names { + add_files -norecurse $elf_f + set tmp [split $elf_f "/"] + set tmpLength [llength $tmp] + if {$tmpLength>2} { + set elf_file [lindex $tmp [expr $tmpLength-1]] + set m_name [lindex $tmp [expr $tmpLength-2]] + set f_obj "*${m_name}/${elf_file}" + #todo multi bd design + set bd_files [list] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + } + foreach bd $bd_files { + set bd_name [file tail [file rootname $bd]] + set_property SCOPED_TO_REF $bd_name [get_files -all -of_objects [get_fileset sources_1] ${f_obj}] + #mcs only used if name contains SYSCONTROL or MCS + if {[string match -nocase *SYSCONTROL* $m_name] || [string match -nocase *MCS* $m_name]} { + set_property SCOPED_TO_CELLS "${m_name}/U0/microblaze_I" [get_files -all -of_objects [get_fileset sources_1] ${f_obj}] + } else { + set_property SCOPED_TO_CELLS "${m_name}" [get_files -all -of_objects [get_fileset sources_1] ${f_obj}] + } + } + } + } + } + } + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished project source functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project new block design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--creat_new_blockdesign: create empty block design with zynq initialisation: fsys,msys,zsys,zusys + proc create_new_blockdesign {{type fsys} {msys_conf {local_mem "8KB" ecc "None" cache "None" debug_module "Debug Only" axi_periph "Enabled" axi_intc "0" clk "None"}}} { + #check other bd files exists, currently only one is supported with this function + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + create_bd_design $type + if {$type eq "fsys"} { + TE::UTILS::te_msg TE_BD-14 INFO "For fsys Block Design is currently no additional initialisation intended." + } elseif {$type eq "zusys"} { + create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e zynq_ultra_ps_e_0 + apply_bd_automation -rule xilinx.com:bd_rule:zynq_ultra_ps_e -config {apply_board_preset "1" } [get_bd_cells zynq_ultra_ps_e_0] + + set tcl_ext [] + if { [catch {set tcl_ext [glob -join -dir ${TE::BOARDDEF_PATH}/carrier_extension/ *_preset.tcl]}] } { + } + foreach carrier_ext $tcl_ext { + TE::UTILS::te_msg TE_BD-15 INFO "Import carrier_settings from:[file tail $carrier_ext]." + source $carrier_ext + } + } elseif {$type eq "zsys"} { + create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7 processing_system7_0 + apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1" Master "Disable" Slave "Disable" } [get_bd_cells processing_system7_0] + set tcl_ext [] + if { [catch {set tcl_ext [glob -join -dir ${TE::BOARDDEF_PATH}/carrier_extension/ *_preset.tcl]}] } { + } + foreach carrier_ext $tcl_ext { + TE::UTILS::te_msg TE_BD-16 INFO "Import carrier_settings from:[file tail $carrier_ext]." + source $carrier_ext + } + } elseif {$type eq "msys"} { + create_bd_cell -type ip -vlnv xilinx.com:ip:microblaze microblaze_0 + #set test {local_mem "8KB" ecc "None" cache "None" debug_module "Debug Only" axi_periph "Enabled" axi_intc "0" clk "None"} + apply_bd_automation -rule xilinx.com:bd_rule:microblaze -config $msys_conf [get_bd_cells microblaze_0] + } else { + TE::UTILS::te_msg TE_BD-17 {CRITICAL WARNING} "Unknown Block-Design Type. No Type specific initialisation is done." + } + } else { + TE::UTILS::te_msg TE_BD-18 ERROR "Currently TE-Scripts supports only one Block-Design. Generation is cancelled." + return -code error + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished new block design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project build functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--build_design: + proc build_design {{bitgen true} {mcsgen true} {reportgen true} {hdfgen true}} { + if {[catch {run_synth} result]} {TE::UTILS::te_msg TE_HW-37 ERROR "Script (TE::VIV::run_synth) failed: $result."; return -code error} + if {[catch {run_impl} result]} {TE::UTILS::te_msg TE_HW-38 ERROR "Script (TE::VIV::run_impl) failed: $result."; return -code error} + if {$bitgen} { + if {[catch {write_viv_bitfile} result]} {TE::UTILS::te_msg TE_HW-39 ERROR "Script (TE::VIV::write_viv_bitfile) failed: $result."; return -code error} + } else { + #delete old one if exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit} result]} {TE::UTILS::te_msg TE_HW-40 WARNING "$result"} + } + TE::UTILS::te_msg TE_HW-41 WARNING "Bit-file generation is disabled on build design run." + } + if {$mcsgen} { + if {[catch {write_viv_cfgmem} result]} {TE::UTILS::te_msg TE_HW-42 ERROR "Script (TE::VIV::write_viv_cfgmem) failed: $result."; return -code error} + } else { + #delete old one if exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs} result]} {TE::UTILS::te_msg TE_HW-43 WARNING "$result"} + } + TE::UTILS::te_msg TE_HW-44 WARNING "MCS-file generation is disabled on build design run" + } + if {$reportgen} { + if {[catch {report_design} result]} {TE::UTILS::te_msg TE_HW-45 ERROR "Script (TE::VIV::report_design) failed: $result."; return -code error} + } else { + #delete old one if exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt} result]} {TE::UTILS::te_msg TE_HW-46 WARNING "$result"} + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt} result]} {TE::UTILS::te_msg TE_HW-47 WARNING "$result"} + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv} result]} {TE::UTILS::te_msg TE_HW-48 WARNING "$result"} + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc} result]} {TE::UTILS::te_msg TE_HW-49 WARNING "$result"} + } + TE::UTILS::te_msg TE_HW-50 WARNING "Report-files generation is disabled on build design run." + } + if {$hdfgen} { + #is done automatically with bitgen -> *.sysdef + } else { + #delete old one if exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef} result]} {TE::UTILS::te_msg TE_HW-51 WARNING "$result"} + } + TE::UTILS::te_msg TE_HW-52 WARNING "HDF-files generation is disabled on build design run." + } + } + #-------------------------------- + #--run_synth: + proc run_synth {} { + #syntheses + reset_run $TE::SYNTH_NAME + launch_runs $TE::SYNTH_NAME -jobs $TE::RUNNING_JOBS + wait_on_run -timeout $TE::TIMEOUT $TE::SYNTH_NAME + } + #-------------------------------- + #--run_impl: + proc run_impl {} { + #implementation and bitgen + reset_run $TE::IMPL_NAME + # launch_runs $TE::IMPL_NAME + launch_runs $TE::IMPL_NAME -to_step route_design -jobs $TE::RUNNING_JOBS + wait_on_run -timeout $TE::TIMEOUT $TE::IMPL_NAME + } + #-------------------------------- + #--write_viv_bitfile: + proc write_viv_bitfile {} { + launch_runs $TE::IMPL_NAME -to_step write_bitstream -jobs $TE::RUNNING_JOBS + wait_on_run -timeout $TE::TIMEOUT $TE::IMPL_NAME + } + #-------------------------------- + #--write_viv_cfgmem: + proc write_viv_cfgmem {} { + #used only if bd name is no zynq design (without processor system)! + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs]} { file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs } + if {!$TE::IS_ZSYS && !$TE::IS_ZUSYS} { + if {$TE::CFGMEM_MEMSIZE_MB ne "NA"} { + #check supported from *board_files.csv + #write mcs with *board_files.csv settings + if {[catch { write_cfgmem -force -format mcs -interface $TE::CFGMEM_IF -size $TE::CFGMEM_MEMSIZE_MB \ + -loadbit "up 0x0 ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit" \ + -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs\ + }]} { + #if failed try SPIX1 (default ) (faster than open design) + TE::UTILS::te_msg TE_HW-53 INFO "Generate MCS failed with $TE::CFGMEM_IF from *board_files.csv specification, try to generate SPIx1." + if {[catch { write_cfgmem -force -format mcs -interface SPIX1 -size $TE::CFGMEM_MEMSIZE_MB \ + -loadbit "up 0x0 ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit" \ + -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs\ + }]} { + #if failed get propery from design (needs some time) + TE::UTILS::te_msg TE_HW-54 INFO "Generate MCS failed with SPIx1, try to get information from implemented Design." + open_run $TE::IMPL_NAME + set tmp_cfgmem_if "SPIx[get_property BITSTREAM.CONFIG.SPI_BUSWIDTH [current_design]]" + close_design + write_cfgmem -force -format mcs -interface $tmp_cfgmem_if -size $TE::CFGMEM_MEMSIZE_MB \ + -loadbit "up 0x0 ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit" \ + -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs + TE::UTILS::te_msg TE_HW-55 INFO "Generate MCS with $tmp_cfgmem_if from current design setting (BITSTREAM.CONFIG.SPI_BUSWIDTH), but current Board Part supports $TE::CFGMEM_IF" + } else { + TE::UTILS::te_msg TE_HW-56 INFO "Generate MCS with SPIX1 (BITSTREAM.CONFIG.SPI_BUSWIDTH 1) from Bitfile, but current Board Part supports $TE::CFGMEM_IF also!" + } + } + } else { + TE::UTILS::te_msg TE_HW-57 {CRITICAL WARNING} "FPGAFLASHTYP Mem Size in MB is not specified in *.board_files.csv. *.mcs file is not generated." + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished built functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # report functions (todo to utilities) + # ----------------------------------------------------------------------------------------------------------------------------------------- + + #-------------------------------- + #--report_design: + proc report_design {} { + #-------------check toplevel name (if modified) + if { ![string equal $TE::PR_TOPLEVELNAME [get_property top [current_fileset]]] } { + TE::UTILS::te_msg TE_HW-58 INFO "Top Level Name ([get_property top [current_fileset]]) is not same then exspected from BD-File delivery ($TE::PR_TOPLEVELNAME). [get_property top [current_fileset]] is used in Script settings now." + set TE::PR_TOPLEVELNAME [get_property top [current_fileset]] + } + #-------------block design reports + #-------------synthese reports + #-------------implement reports + open_run $TE::IMPL_NAME + + #todo: + # report_debug_core -file ${TE::VPROJ_NAME}_debug_cores.txt + report_ip_status -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt + report_io -force -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt -format text + write_csv -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv + write_xdc -force -mode port ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc + + report_summary + close_design + } + #-------------------------------- + #--report_run: + proc report_run {} { + #todo eventuell auftrennen und dann noch report schreiben, wenn nicht alles durch geht + set date "[ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"]" + set status "Error" + set founderror -1 + #synth + set sythn_counts [extract_synth_summary] + set sythn_counts_split [split $sythn_counts ","] + set value [lindex $sythn_counts_split [expr [llength $sythn_counts_split]-1]] + if {$value != 0} {set founderror 1} + #impl + set impl_counts [extract_impl_summary] + set impl_counts_split [split $impl_counts ","] + set value [lindex $impl_counts_split [expr [llength $impl_counts_split]-1]] + if {$value != 0} {set founderror 1} + #drc + set drc_counts [extract_drc_summary] + set drc_counts_split [split $drc_counts ","] + set value [lindex $drc_counts_split [expr [llength $drc_counts_split]-1]] + if {$value != 0} {set founderror 1} + #timing + set timing_counts [extract_timing_summary] + set timing_counts_split [split $timing_counts ","] + set value [lindex $timing_counts_split [expr [llength $timing_counts_split]-1]] + if {[string compare "NA" $value ]==0} {set founderror 0} elseif {$value != 0} {set founderror 1} + if {$founderror == -1} {set status "Ok"} elseif {$founderror == 0} {set status "Ok(NA)"} + #write report + set report "[format "%-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s," "$date" "$status" "$TE::VPROJ_NAME" "$TE::SHORTDIR" "$TE::BOARDPART" "$TE::SYNTH_NAME" "$TE::IMPL_NAME" "[lindex $sythn_counts_split 0]" "[lindex $sythn_counts_split 1]" "[lindex $sythn_counts_split 2]" "[lindex $sythn_counts_split 3]" "[lindex $impl_counts_split 0]" "[lindex $impl_counts_split 1]" "[lindex $impl_counts_split 2]" "[lindex $impl_counts_split 3]" "[lindex $drc_counts_split 0]" "[lindex $drc_counts_split 1]" "[lindex $timing_counts_split 0]" "[lindex $timing_counts_split 1]" "[lindex $timing_counts_split 2]"]" + return $report + } + #-------------------------------- + #--report_summary: + proc report_summary {} { + set fp_w [open ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}_summary.csv "w"] + #write header + puts $fp_w [format "%-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s," "Date" "Status" "ProjName" "BoardDefShortName" "BoardDefName" "SynthName" "ImplName" "SynthInfo" "SynthWarnings" "SynthCritWarnings" "SynthError" "ImplInfo" "ImplWarnings" "ImplCritWarnings" "ImplError" "ImplDRCWarnings" "ImplDRCError" "ImplTimingWNS" "ImplTimingFaildEndpoints" "ImplTimingTNS"] + + puts $fp_w [report_run] + close $fp_w + } + #-------------------------------- + #--extract_synth_summary: + proc extract_synth_summary {} { + set synth_returns "0,0,0,FileNotFound" + + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::SYNTH_NAME}/${TE::PR_TOPLEVELNAME}.vds + if { ![file exists ${report_file}]} {return $synth_returns} + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + + foreach line $data { + if {[string match "*Infos*Warnings*Critical Warnings*Errors encountered*" $line]} { + set tmp [string map {"and" "," " " "" "Infos" "" "Warnings" "" "Critical" "" "Errors" "" "encountered." ""} "$line"] + #use only last log output + #return Infos, Warnings, Critical Warnings , Errors + set synth_returns $tmp + } + } + return $synth_returns + } + #-------------------------------- + #--extract_impl_summary: + proc extract_impl_summary {} { + set impl_returns "0,0,0,FileNotFound" + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.vdi + if { ![file exists ${report_file}]} {return $impl_returns} + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + + foreach line $data { + if {[string match "*Infos*Warnings*Critical Warnings*Errors encountered*" $line]} { + set tmp [string map {"and" "," " " "" "Infos" "" "Warnings" "" "Critical" "" "Errors" "" "encountered." ""} "$line"] + #use only last log output + #return Infos, Warnings, Critical Warnings , Errors + set impl_returns $tmp + } + } + return $impl_returns + } + #-------------------------------- + #--extract_drc_summary: + proc extract_drc_summary {} { + set drc_returns "0,FileNotFound" + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.vdi + if { ![file exists ${report_file}]} {return $drc_returns} + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + set err_count 0 + set warn_count 0 + + foreach line $data { + if {[string match "*DRC finished with*" $line]} { + set index [string first "with" $line 0] + set tmp [string range $line $index [string length $line]] + set tmp [string map {" " "" "with" "" "Errors" "" "Warnings" "" "Advisories" ""} "$tmp"] + set tmp [split $tmp ","] + if {[llength $tmp]==1} { + if {[string is integer [lindex $tmp 0]]} { + set err_count [expr $err_count + [lindex $tmp 0]] + } else { + set err_count 999999 + } + } else { + if {[string is integer [lindex $tmp 0]]} { + set err_count [expr $err_count + [lindex $tmp 0]] + } else { + set err_count 999999 + } + if {[string is integer [lindex $tmp 1]]} { + set warn_count [expr $warn_count + [lindex $tmp 1]] + } else { + set warn_count 999999 + } + } + } + } + #return Warnings, Errors + set drc_returns "$warn_count, $err_count" + return $drc_returns + } + #-------------------------------- + #--extract_timing_summary: + proc extract_timing_summary {} { + set timing_returns "0,0,FileNotFound" + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}_timing_summary_routed.rpt + if { ![file exists ${report_file}]} {return $timing_returns} + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + + set lineindex -1 + foreach line $data { + incr lineindex + if {[string match "*Design Timing Summary*" $line]} { + break; + } + } + set lineindex [expr $lineindex +6] + set tmp [join [lindex $data $lineindex] " "] + set timing_returns "[lindex $tmp 0],[lindex $tmp 2],[lindex $tmp 1]" + #return WNS, Faild Endpoints, TNS + return $timing_returns + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + namespace eval VLAB { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # vlab project functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + #-------------------------------- + #--create_project: + proc create_project {} { + #create vivado lab project + ::create_project -force $TE::VPROJ_NAME $TE::VLABPROJ_PATH + #set props.. + } + #-------------------------------- + #--open_project: + proc open_project {} { + #open vivado lab project + ::open_project ${TE::VPROJ_NAME}.lpr + } + #-------------------------------- + #--close_project: + proc close_project {} { + #close vivado project + ::close_project + } + #-------------------------------- + #--hw_open_jtag: + proc hw_open_jtag {} { + + #start new session + ::open_hw + if {[current_hw_server -quiet] eq ""} { + ::connect_hw_server + } + if {[current_hw_device -quiet] eq ""} { + ::open_hw_target + return true + } else { + return false + } + } + #-------------------------------- + #--hw_close_jtag: + proc hw_close_jtag {} { + ::close_hw + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished vlab project functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # device functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--hw_create_flash_device: + proc hw_create_flash_device {{fname ""}} { + #todo configs auswählbar + set partname_int "" + set flashtyp_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set id "[TE::BDEF::find_id $fname]" + set tmp [TE::BDEF::get_fpgaflashtyp $id 0] + set tmp [split $tmp "|"] + if {[llength $tmp] eq 3} { + set flashtyp_int [lindex $tmp 0] + } else { + set flashtyp_int $tmp + } + + } else { + set partname_int $TE::PARTNAME + set flashtyp_int $TE::FPGAFLASHTYP + } + set hw_fpga_name [hw_get_fpga $partname_int] + set_property PROBES.FILE "" $hw_fpga_name + #reset old propefiles + create_hw_cfgmem -hw_device $hw_fpga_name -mem_dev [lindex [get_cfgmem_parts ${flashtyp_int}] 0] + set_property PROGRAM.BLANK_CHECK 0 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.ERASE 1 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.CFG_PROGRAM 1 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.VERIFY 0 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.CHECKSUM 0 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if {[catch {refresh_hw_device $hw_fpga_name}] } {} + } + #-------------------------------- + #--hw_get_fpga: + proc hw_get_fpga {{partname ""}} { + set partname_int $partname + if {$partname_int eq ""} {set partname_int $TE::PARTNAME} + set hw_fpga_name NA + set hw_fpga_found false + + foreach hwd [get_hw_devices] { + set name [lindex [split $hwd "_"] 0] + set hw_fpga_found [string match *$name* $partname_int] + if {$hw_fpga_found} {set hw_fpga_name $hwd;break;} + } + if {$hw_fpga_found} { + # ::refresh_hw_device $hw_fpga_name + } else { + # change compared name from automotive and defence grade fpga (has same hw-id than commercial) + set alt_partname [string map {xa xc xq xc} $partname_int] + foreach hwd [get_hw_devices] { + set name [lindex [split $hwd "_"] 0] + set hw_fpga_found [string match *$name* $alt_partname] + if {$hw_fpga_found} {set hw_fpga_name $hwd;break;} + } + if {$hw_fpga_found} { + # ::refresh_hw_device $hw_fpga_name + } else { + set rpt_txt "$partname_int Device not found. \n" + foreach hwd [get_hw_devices] { + set name [lindex [split $hwd "_"] 0] + set rpt_txt "$rpt_txt $partname_int and $alt_partname compare with *$name* failed. \n" + } + TE::UTILS::te_msg TE_PR-0 WARNING "$rpt_txt" + } + } + return $hw_fpga_name + } + #-------------------------------- + #--hw_fpga_boot_from_memory: + proc hw_fpga_boot_from_memory {{fname ""}} { + set partname_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + } else { + set partname_int $TE::PARTNAME + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$hw_fpga_name ne "NA"} { + ::boot_hw_device $hw_fpga_name + TE::UTILS::te_msg TE_PR-1 INFO "Reboot Device is done." + ::refresh_hw_device $hw_fpga_name + TE::UTILS::te_msg TE_PR-2 INFO "Reboot Device is done." + } else { + TE::UTILS::te_msg TE_PR-3 ERROR "Boot from Memory failed. Device not found." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished device functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # property functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--hw_set_bit_and_ltx_files: setup for bitfile configuration via labtools/vivado + proc hw_set_bit_and_ltx_files {use_basefolder app_name {fname ""}} { + set return_filename "" + set partname_int "" + set shortdir_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set shortdir_int "[TE::BDEF::find_shortdir $fname]" + } else { + set partname_int $TE::PARTNAME + set shortdir_int $TE::SHORTDIR + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$hw_fpga_name ne "NA"} { + if {$use_basefolder} { + set bitfilename "" + if { ![catch {set bitfilename [glob -join -dir ${TE::BASEFOLDER}/ *.bit]}] } { + TE::UTILS::te_msg TE_PR-4 INFO "Used file:${bitfilename}" + set return_filename ${bitfilename} + set_property PROGRAM.FILE ${bitfilename} $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-5 ERROR "Bitfile not found in ${TE::BASEFOLDER}. Nothing is done." + return -code error + } + } else { + if {$app_name eq "" || $app_name eq "NA"} { + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit]} { + #use bitfile from hardware folder (with bootloop for microblaze systems) + set_property PROGRAM.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit $hw_fpga_name + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-6 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-7 INFO "Used file:${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit" + set return_filename ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit + } else { + #use default bit from hardware folder (with bootloop for microblaze systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit]} { + set_property PROGRAM.FILE ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit $hw_fpga_name + if {[file exists ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-8 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-9 INFO "Used file:${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit" + set return_filename ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit + } else { + TE::UTILS::te_msg TE_PR-10 ERROR "${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit not found. Nothing is done." + return -code error + } + } + } else { + #use bitfile from bootimage folder (with programmed apps for microblaze systems) + set bitfilename "" + if { ![catch {set bitfilename [glob -join -dir ${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/ *.bit]}] } { + set_property PROGRAM.FILE ${bitfilename} $hw_fpga_name + #search in hardware folder for ltx + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-11 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-12 INFO "Used file:${bitfilename}" + set return_filename ${bitfilename} + } else { + TE::UTILS::te_msg TE_PR-13 ERROR "${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/*.bit not found. Nothing is done." + return -code error + } + } + } + } else { + TE::UTILS::te_msg TE_PR-14 ERROR "Program FPGA failed. Device not found." + return -code error + } + return $return_filename + } + #-------------------------------- + #--hw_set_bin_and_ltx_files: setup for binfile configuration via labtools/vivado + proc hw_set_bin_and_ltx_files {use_basefolder app_name fname} { + set return_filename "" + set partname_int "" + set shortdir_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set shortdir_int "[TE::BDEF::find_shortdir $fname]" + } else { + set partname_int $TE::PARTNAME + set shortdir_int $TE::SHORTDIR + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$hw_fpga_name ne "NA"} { + if {$use_basefolder} { + set binfilename "" + set ltxfilename "" + if { ![catch {set binfilename [glob -join -dir ${TE::BASEFOLDER}/ *.bin]}] } { + TE::UTILS::te_msg TE_PR-15 INFO "Used file:${binfilename}" + set return_filename ${binfilename} + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${binfilename}" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if { ![catch {set ltxfilename [glob -join -dir ${TE::BASEFOLDER}/ *.ltx]}] } { + set_property PROBES.FILE ${ltxfilename} $hw_fpga_name + } else { + set_property PROBES.FILE "" $hw_fpga_name + } + } else { + TE::UTILS::te_msg TE_PR-16 {CRITICAL WARNING} "Bin file not found in ${TE::BASEFOLDER}. Nothing is done." + return -code error + } + } else { + set binfilename "" + if { ![catch {set binfilename [glob -join -dir ${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/ *.bin]}] } { + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${binfilename}" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-17 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-18 INFO "Used file: ${binfilename}" + set return_filename ${binfilename} + } else { + TE::UTILS::te_msg TE_PR-19 ERROR "${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/*.bin not found. Nothing is done." + return -code error + } + } + } else { + TE::UTILS::te_msg TE_PR-20 ERROR "Program FPGA failed. Device not found." + return -code error + } + return $return_filename + } + #-------------------------------- + #--hw_set_mcs_and_ltx_files: setup for mcsfile configuration via labtools/vivado + proc hw_set_mcs_and_ltx_files {use_basefolder term app_name fname} { + set return_filename "" + set partname_int "" + set shortdir_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set shortdir_int "[TE::BDEF::find_shortdir $fname]" + } else { + set partname_int $TE::PARTNAME + set shortdir_int $TE::SHORTDIR + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$hw_fpga_name ne "NA"} { + if {$use_basefolder} { + set mcsfilename "" + set ltxfilename "" + if { ![catch {set mcsfilename [glob -join -dir ${TE::BASEFOLDER}/ *.mcs]}] } { + TE::UTILS::te_msg TE_PR-21 INFO "Used file:${mcsfilename}" + set return_filename ${mcsfilename} + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${mcsfilename}" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.UNUSED_PIN_TERMINATION ${term} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if { ![catch {set ltxfilename [glob -join -dir ${TE::BASEFOLDER}/ *.ltx]}] } { + set_property PROBES.FILE ${ltxfilename} $hw_fpga_name + } else { + set_property PROBES.FILE "" $hw_fpga_name + } + } else { + TE::UTILS::te_msg TE_PR-22 ERROR "MCS-file not found in ${TE::BASEFOLDER}. Nothing is done." + return -code error + } + } else { + if {$app_name eq "" || $app_name eq "NA"} { + #use mcs from hardware folder (with bootloop for microblaze systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs]} { + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.UNUSED_PIN_TERMINATION ${term} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-23 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-24 INFO "Used file:${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs" + set return_filename ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs + } else { + TE::UTILS::te_msg TE_PR-25 ERROR "${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs not found. Nothing is done" + return -code error + } + } else { + #use mcs from bootimage folder (with configured app for microblaze systems) + set mcsfilename "" + if { ![catch {set mcsfilename [glob -join -dir ${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/ *.mcs]}] } { + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${mcsfilename}" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.UNUSED_PIN_TERMINATION ${term} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + #search ltx from hardware folder + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-26 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-27 INFO "Used file:${mcsfilename}" + set return_filename ${mcsfilename} + } else { + TE::UTILS::te_msg TE_PR-28 ERROR "${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/*.mcs not found. Nothing is done." + return -code error + } + } + } + } else { + TE::UTILS::te_msg TE_PR-29 ERROR "Program FPGA failed. Device not found." + return -code error + } + return $return_filename + } + + #-------------------------------- + #--hw_reload_prope_file_device: + proc hw_reload_prope_file_device {{fname ""}} { + set partname_int "" + set shortdir_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set shortdir_int "[TE::BDEF::find_shortdir $fname]" + } else { + set partname_int $TE::PARTNAME + set shortdir_int $TE::SHORTDIR + } + set hw_fpga_name [hw_get_fpga $partname_int] + + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + TE::UTILS::te_msg TE_PR-30 INFO "New Probes file is set: ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx" + + } else { + TE::UTILS::te_msg TE_PR-31 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished property functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--hw_program_fpga_device: + proc hw_program_fpga_device { use_basefolder appname {fname ""}} { + #bitfile + set return_filename "" + set partname_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + } else { + set partname_int $TE::PARTNAME + } + set hw_fpga_name [hw_get_fpga $partname_int] + + if {![catch {set return_filename [hw_set_bit_and_ltx_files $use_basefolder $appname $fname]}] } { + program_hw_devices $hw_fpga_name + TE::UTILS::te_msg TE_PR-32 INFO "Programming BIT-file finished." + if {[catch {refresh_hw_device $hw_fpga_name}] } {} + } else { + TE::UTILS::te_msg TE_PR-33 ERROR "Program FPGA failed." + return -code error + } + return $return_filename + } + #-------------------------------- + #--hw_program_fpga_flash: + proc hw_program_fpga_flash {use_basefolder term bin appname {fname ""}} { + set return_filename "" + set partname_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + } else { + set partname_int $TE::PARTNAME + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$bin eq "bin"} { + #program bin file + if {![catch {set return_filename [hw_set_bin_and_ltx_files $use_basefolder $appname $fname]}] } { + program_hw_cfgmem -hw_cfgmem [get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + TE::UTILS::te_msg TE_PR-34 INFO "Programming BIN-file finished." + if {[catch {refresh_hw_device $hw_fpga_name}] } {} + } else { + TE::UTILS::te_msg TE_PR-35 ERROR "Program Flash failed." + return -code error + } + } else { + #program mcs file + if {![catch {set return_filename [hw_set_mcs_and_ltx_files $use_basefolder $term $appname $fname]}] } { + if {![string equal [get_property PROGRAM.HW_CFGMEM_TYPE $hw_fpga_name] [get_property MEM_TYPE [get_property CFGMEM_PART [get_property PROGRAM.HW_CFGMEM $hw_fpga_name]]]] } { create_hw_bitstream -hw_device $hw_fpga_name [get_property PROGRAM.HW_CFGMEM_BITFILE $hw_fpga_name]; program_hw_devices $hw_fpga_name; }; + program_hw_cfgmem -hw_cfgmem [get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + TE::UTILS::te_msg TE_PR-36 INFO "Programming MCS-file finished." + if {[catch {refresh_hw_device $hw_fpga_name}] } {} + } else { + TE::UTILS::te_msg TE_PR-37 ERROR "Program Flash failed." + return -code error + } + } + return $return_filename + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + + puts "INFO:(TE) Load Vivado script finished" +} + + diff --git a/zynqberrydemo1/settings/project_settings.tcl b/zynqberrydemo1/settings/project_settings.tcl new file mode 100644 index 0000000..777dc02 --- /dev/null +++ b/zynqberrydemo1/settings/project_settings.tcl @@ -0,0 +1,2 @@ +set_property flow {Vivado Implementation 2017} [get_runs ${TE::IMPL_NAME}] +set_property strategy Performance_Explore [get_runs ${TE::IMPL_NAME}] diff --git a/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/data/zynq_fsbl.tcl b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/data/zynq_fsbl.tcl new file mode 100644 index 0000000..e072f6f --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/data/zynq_fsbl.tcl @@ -0,0 +1,97 @@ +proc swapp_get_name {} { + return "Zynq FSBL - TE modified"; +} + +proc swapp_get_description {} { + return "First Stage Bootloader (FSBL) for Zynq. The FSBL configures the FPGA with HW bit stream (if it exists) \ + and loads the Operating System (OS) Image or Standalone (SA) Image or 2nd Stage Boot Loader image from the \ + non-volatile memory (NAND/NOR/QSPI) to RAM (DDR) and starts executing it. It supports multiple partitions, \ + and each partition can be a code image or a bit stream.\ + TE-Modification: Modified HDMI Output DMA and Camera Input DMA on fsbl_hooks.c. Add. vdma.h, vdma.c\ + FSBL Template: 2017.1 \ + "; +} + +proc swapp_get_supported_processors {} { + return "ps7_cortexa9"; +} + +proc swapp_get_supported_os {} { + return "standalone"; +} + +proc check_standalone_os {} { + set oslist [hsi::get_os]; + + if { [llength $oslist] != 1 } { + return 0; + } + set os [lindex $oslist 0]; + + if { $os != "standalone" } { + error "This application is supported only on the Standalone Board Support Package."; + } +} + +proc swapp_is_supported_sw {} { + # make sure we are using standalone OS + #check_standalone_os; + + # make sure xilffs and xilrsa libraries are available + + set librarylist_1 [hsi::get_libs -filter "NAME==xilffs"]; + + + if { [llength $librarylist_1] == 0 } { + error "This application requires xilffs library in the Board Support Package."; + } +} + +proc swapp_is_supported_hw {} { + + # check processor type + set proc_instance [hsi::get_sw_processor]; + set hw_processor [common::get_property HW_INSTANCE $proc_instance] + + set proc_type [common::get_property IP_NAME [hsi::get_cells -hier $hw_processor]]; + + if { $proc_type != "ps7_cortexa9" } { + error "This application is supported only for CortexA9 processors."; + } + + return 1; +} + + +proc get_stdout {} { + set os [hsi::get_os]; + set stdout [common::get_property CONFIG.STDOUT $os]; + return $stdout; +} + +proc check_stdout_hw {} { + set p7_uarts [hsi::get_cells -hier -filter "IP_NAME=ps7_uart"]; +} + +proc swapp_generate {} { + # generate/copy ps init files + ::hsi::utils::generate_psinit + + #delete unnecessary files (only ps7_init.c & ps7_init.h are needed for FSBL) + + set files(0) "ps7_init.html" + set files(1) "ps7_init.tcl" + set files(2) "ps7_init_gpl.c" + set files(3) "ps7_init_gpl.h" + + foreach init_file [array get files] { + file delete -force $init_file + } + +} + +proc swapp_get_linker_constraints {} { + + # don't generate a linker script. fsbl has its own linker script + return "lscript no"; +} diff --git a/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl.h new file mode 100644 index 0000000..a0cf67b --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl.h @@ -0,0 +1,546 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file fsbl.h +* +* Contains the function prototypes, defines and macros for the +* First Stage Boot Loader (FSBL) functionality +* +*

    +* 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
    +*
    +* 7.00a kc  10/18/13    Integrated SD/MMC driver
    +*			10/23/13	Support for armcc compiler added
    +*						741003 FSBL has to check the HMAC error status after 
    +*						decryption
    +*						Resolution: Added code for checking the error status 
    +*						after PCAP completion
    +*						739968 FSBL should do the QSPI config settings for 
    +*						Dual parallel configuration in IO mode
    +*						Resolution: Added QSPI config settings in qspi.c
    +*						724620 FSBL: How to handle PCAP_MODE after bitstream 
    +*						configuration.
    +*						Resolution: PCAP_MODE and PCAP_PR bits are now cleared  
    +* 						after PCAP transfer completion
    +*						726178 In the 14.6 FSBL function FabricInit() PROG_B 
    +*						is kept active for 5mS.
    +*						Resolution: PROG_B is now kept active for 5mS only incase 
    +*						if efuse is the aes key source.
    +*						755245 FSBL does not load partition if eMMC has only 
    +*						one partition
    +*						Resolution: Changed the if condition for MMC
    +*			12/04/13    764382 FSBL: How to handle PCAP_MODE after bitstream 
    +*						configuration
    +*						Resolution: Reverted back the changes of 724620. PCAP_MODE
    +*						and PCAP_PR bits are not changed
    +* 8.00a kc  01/16/13    767798 Fsbl MD5 Checksum failiure for encrypted images
    +* 						Resolution: For checksum enabled partitions, total 
    +*						total partition image length is copied now.
    +*						761895 FSBL should authenticate image only if
    +*						partition owner was not set to u-boot
    +*						Resolution: Partition owner check added in 
    +*						image_mover.c
    +* 			02/20/14	775631 - FSBL: FsblGetGlobalTimer() is not proper
    +*						Resolution: Function argument is updated from value
    +*						to pointer to reflect updated value
    +* 9.00a kc  04/16/14	773866 - SetPpk() will fail on secure fallback
    +*						unless FSBL* and FSBL are identical in length
    +*						Resolution: PPK is set only once now.
    +*						785778 - FSBL takes 8 seconds to
    +* 						authenticate (RSA) a bitstream on zc706
    +* 						Resolution: Data Caches are enabled only for
    +* 						authentication.
    +* 						791245 - Use of xilrsa in fsbl
    +* 						Resolution: Rsa library is removed from fsbl source
    +* 						and xilrsa is used from BSP
    +* 10.00a kc 07/15/14	804595 Zynq FSBL - Issues with
    +* 						fallback image offset handling using MD5
    +* 						Resolution: Updated the checksum offset to add with
    +* 						image base address
    +* 						782309 Fallback support for AES
    +* 						encryption with E-Fuse - Enhancement
    +* 						Resolution: Same as 773866
    +* 						809336 Minor code cleanup
    +* 						Resolution Minor code changes
    +*        kc 08/27/14	820356 - FSBL compilation fails with IAR compiler
    +* 						Resolution: Change of __asm__ to __asm
    +* 11.00a kv 10/08/14	826030 - FSBL:LinearBootDeviceFlag is not initialized
    +*						in IO mode case.Due to which the variable is
    +*						remaining in unknown state.
    +*						Resolution: LinearBootDeviceFlag is initialized 0
    +*						in main.c
    +* 12.00a ssc 12/11/14	839182 - FSBL -In the file sd.c, f_mount is called with
    +*                       two arguments but f_mount is expecting the 3 arguments
    +*                       from build 2015.1_1210_1, causing compilation error.
    +*						Resolution: Arguments for f_mount in InitSD() are
    +*						changed as per new signature.
    +* 13.00a ssc 04/10/15	846899 - FSBL -In the file pcap.c, to clear DMA done
    +*                       count, devcfg.INT_STS register is written to, which is
    +*                       not correct.
    +*                       Resolution: Corresponding fields in the devcfg.STATUS
    +*                       register are written to, for clearing DMA done count.
    +* 14.00a gan 01/13/16   869081 -(2016.1)FSBL -In qspi.c, FSBL picks the qspi
    +*						read command from LQSPI_CFG register instead of hard
    +*		   				coded read command (0x6B).
    +* 15.00a gan 07/21/16   953654 -(2016.3)FSBL -In pcap.c/pcap.h/main.c,
    +* 						Fabric Initialization sequence is modified to check
    +* 						the PL power before sequence starts and checking INIT_B
    +* 						reset status twice in case of failure.
    +* 16.00a gan 08/02/16   Fix for CR# 955897 -(2016.3)FSBL -
    +* 						In pcap.c, check pl power through MCTRL register
    +* 						for 3.0 and later versions of silicon.
    +* 
    +* +* +* +* @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 +#endif + + +/************************** Constant Definitions *****************************/ +/* + * SDK release version + */ +#define SDK_RELEASE_YEAR 2017 +#define SDK_RELEASE_QUARTER 1 + +#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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h new file mode 100644 index 0000000..2c41c23 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h @@ -0,0 +1,82 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file fsbl_debug.h +* +* This file contains the debug verbose information for FSBL print functionality +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 3.00a mb	01/09/12 Initial release
    +*
    +* 
    +* +* @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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c new file mode 100644 index 0000000..851d11d --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c @@ -0,0 +1,206 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/***************************************************************************** +* +* @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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date        Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 3.00a np   08/03/12 Initial release
    +* 
    +* +* @note +* +******************************************************************************/ + + +#include "fsbl.h" +#include "xstatus.h" +#include "fsbl_hooks.h" + +#include "vdma.h" +#include "xparameters.h" +#include "xil_hal.h" +#include "sleep.h" + +#include "xvtc.h" + +#define ENABLE_CAMERA +#define DIRECT_CAMERA_VIEW + +#ifdef DIRECT_CAMERA_VIEW +#define HDMI_FB_ADDR 0x1FC00000 +#define CAMERA_FB_ADDR 0x1FC00000 +#endif + +#ifndef DIRECT_CAMERA_VIEW +#define HDMI_FB_ADDR 0x1FC00000 +#define CAMERA_FB_ADDR 0x1F700000 +#endif +/************************** 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; + XVtc Vtc; + /* + * 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"); + + xil_printf("FSBL: Enabling VTC..\n\r"); + XVtc_Config *Config; + Config = XVtc_LookupConfig(XPAR_VTC_0_DEVICE_ID); + if (NULL == Config) { + xil_printf("XVtc_LookupConfig failure\r\n"); + return XST_FAILURE; + } + + Status = XVtc_CfgInitialize(&Vtc, Config, Config->BaseAddress); + if (Status != XST_SUCCESS) { + xil_printf("XVtc_CfgInitialize failure\r\n"); + return XST_FAILURE; + } + + XVtc_DisableSync(&Vtc); + XVtc_EnableGenerator(&Vtc); + + xil_printf("FSBL: Enabling Out VDMA at 0x%08x..\n\r",HDMI_FB_ADDR); + vdma_out_init(XPAR_VIDEO_OUT_AXI_VDMA_0_DEVICE_ID, HDMI_FB_ADDR, 1280, 720, 4); +#ifdef ENABLE_CAMERA + xil_printf("FSBL: Enabling In VDMA at 0x%08x..\n\r",CAMERA_FB_ADDR); + vdma_in_init(XPAR_VIDEO_IN_AXI_VDMA_0_DEVICE_ID, CAMERA_FB_ADDR, 1280, 720, 4); +#endif + 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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h new file mode 100644 index 0000000..784f7ed --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h @@ -0,0 +1,81 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file fsbl_hooks.h +* +* Contains the function prototypes, defines and macros required by fsbl_hooks.c +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 3.00a	np/mb	10/08/12	Initial release
    +*				Corrected the prototype
    +*
    +* 
    +* +* @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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/image_mover.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/image_mover.c new file mode 100644 index 0000000..1bad673 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/image_mover.c @@ -0,0 +1,1335 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file image_mover.c +* +* Move partitions to either DDR to execute or to program FPGA. +* It performs partition walk. +* +*
    +* 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 Secure bootmode error in devcfg test
    +*						Fix for CR#695578 FSBL failed to load standalone 
    +*						application in secure bootmode
    +*
    +* 4.00a sgd	04/23/13	Fix for CR#710128 FSBL failed to load standalone 
    +*						application in secure bootmode
    +* 5.00a kc	07/30/13	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#732062 FSBL fails to build if UART not 
    +*						available 
    +* 7.00a kc  10/30/13    Fix for CR#755245 FSBL does not load partition
    +*                       if eMMC has only one partition
    +* 8.00a kc  01/16/13    Fix for CR#767798  FSBL MD5 Checksum failure
    +* 						for encrypted images
    +*						Fix for CR#761895 FSBL should authenticate image
    +*						only if partition owner was not set to u-boot
    +* 9.00a kc  04/16/14    Fix for CR#785778  FSBL takes 8 seconds to 
    +* 						authenticate (RSA) a bitstream on zc706
    +* 10.00a kc 07/15/14	Fix for CR#804595 Zynq FSBL - Issues with
    +* 						fallback image offset handling using MD5
    +* 						Fix for PR#782309 Fallback support for AES
    +* 						encryption with E-Fuse - Enhancement
    +*
    +* 
    +* +* @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" +#include "xil_cache.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%08lx\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%08lx\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%08lx\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: %lu\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; + + /* + * Partition owner should be FSBL to validate the partition + */ + if ((PartitionAttr & ATTRIBUTE_PARTITION_OWNER_MASK) != + ATTRIBUTE_PARTITION_OWNER_FSBL) { + /* + * if FSBL is not the owner of partition, + * skip this partition, continue with next partition + */ + fsbl_printf(DEBUG_INFO, "Skipping partition %0lx\r\n", + PartitionNum); + /* + * Increment partition number + */ + PartitionNum++; + continue; + } + + 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), + ImageStartAddress + + (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 + Xil_DCacheEnable(); + Status = AuthenticatePartition((u8*)PartitionStartAddr, + (PartitionTotalSize << WORD_LENGTH_SHIFT)); + if (Status != XST_SUCCESS) { + Xil_DCacheFlush(); + Xil_DCacheDisable(); + fsbl_printf(DEBUG_GENERAL,"AUTHENTICATION_FAIL\r\n"); + OutputStatus(AUTHENTICATION_FAIL); + FsblFallback(); + } + fsbl_printf(DEBUG_INFO,"Authentication Done\r\n"); + Xil_DCacheFlush(); + Xil_DCacheDisable(); +#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%08lx\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: %lu\r\n", PartitionCount); + + /* + * Partition Count check + */ + if (PartitionCount >= MAX_PARTITION_NUMBER) { + fsbl_printf(DEBUG_GENERAL, "Invalid Partition Count\r\n"); + return XST_FAILURE; +#ifndef MMC_SUPPORT + } else if (PartitionCount <= 1) { + fsbl_printf(DEBUG_GENERAL, "There is no partition to load\r\n"); + return XST_FAILURE; +#endif + } + + 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%08lx\r\n", + Header->ImageWordLen); + fsbl_printf(DEBUG_INFO, "Data Word Len: 0x%08lx\r\n", + Header->DataWordLen); + fsbl_printf(DEBUG_INFO, "Partition Word Len:0x%08lx\r\n", + Header->PartitionWordLen); + fsbl_printf(DEBUG_INFO, "Load Addr: 0x%08lx\r\n", + Header->LoadAddr); + fsbl_printf(DEBUG_INFO, "Exec Addr: 0x%08lx\r\n", + Header->ExecAddr); + fsbl_printf(DEBUG_INFO, "Partition Start: 0x%08lx\r\n", + Header->PartitionStart); + fsbl_printf(DEBUG_INFO, "Partition Attr: 0x%08lx\r\n", + Header->PartitionAttr); + fsbl_printf(DEBUG_INFO, "Partition Checksum Offset: 0x%08lx\r\n", + Header->CheckSumOffset); + fsbl_printf(DEBUG_INFO, "Section Count: 0x%08lx\r\n", + Header->SectionCount); + fsbl_printf(DEBUG_INFO, "Checksum: 0x%08lx\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.8lx != 0x%8.8lx\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<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 or checksum enabled partition, + * Total partition image need to copied to DDR + */ + if (SignedPartitionFlag || PartitionChecksumFlag) { + 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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/image_mover.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/image_mover.h new file mode 100644 index 0000000..dad66f1 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/image_mover.h @@ -0,0 +1,161 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file image_mover.h +* +* This file contains the interface for moving the image from FLASH to OCM + +* +*
    +* 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
    +* 8.00a kc	01/16/13	Added defines for partition owner attribute
    +* 
    +* +* @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 */ +#define ATTRIBUTE_PARTITION_OWNER_MASK 0x30000 /* Partition Owner */ + +#define ATTRIBUTE_PARTITION_OWNER_FSBL 0x00000 /* FSBL Partition Owner */ + + +/**************************** 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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/main.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/main.c new file mode 100644 index 0000000..958e3c0 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/main.c @@ -0,0 +1,1532 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file main.c +* +* The main file for the First Stage Boot Loader (FSBL). +* +*
    +* 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
    +* 7.00a kc  10/18/13    Integrated SD/MMC driver
    +* 8.00a kc  02/20/14	Fix for CR#775631 - FSBL: FsblGetGlobalTimer() 
    +*											is not proper
    +* 9.00a kc  04/16/14	Fix for CR#724166 - SetPpk() will fail on secure
    +*		 									fallback unless FSBL* and FSBL
    +*		 									are identical in length
    +* 10.00a kc 07/24/14	Fix for CR#809336 - Minor code cleanup
    +*        kc 08/27/14	Fix for CR#820356 - FSBL compilation fails with
    +* 											IAR compiler
    +* 11.00a kv 10/08/14	Fix for CR#826030 - LinearBootDeviceFlag should
    +*											be initialized to 0 in IO mode
    +*											case
    +* 15.00a gan 07/21/16   Fix for CR# 953654 -(2016.3)FSBL -
    +* 											In pcap.c/pcap.h/main.c,
    +* 											Fabric Initialization sequence
    +* 											is modified to check the PL power
    +* 											before sequence starts and checking
    +* 											INIT_B reset status twice in case
    +* 											of failure.
    +* 
    +* +* @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 +#ifdef XPAR_XUARTPS_0_BASEADDR +#include "xuartps_hw.h" +#endif +#endif + +#ifdef RSA_SUPPORT +#include "rsa.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 + +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=0; + +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; + + /* + * 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(); + } + + /* + * 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 %s-%s\r\n", + 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 & XDCFG_CTRL_PCFG_AES_FUSE_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 + */ +#if defined(XPAR_PS7_SD_0_S_AXI_BASEADDR) || defined(XPAR_XSDPS_0_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%08lx\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%08lx\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 & XDCFG_CTRL_PCFG_AES_FUSE_MASK) { + /* + * Next valid image search can happen only + * when system initialization done + */ + if (SystemInitFlag == 1) { + /* + * Clean the Fabric + */ + Status = FabricInit(); + if(Status != XST_SUCCESS){ + ClearFSBLIn(); + FsblHookFallback(); + } + +#ifdef RSA_SUPPORT + + /* + * Making sure PPK is set for efuse error cases + */ + SetPpk(); +#endif + + /* + * 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 +#ifdef XPAR_XUARTPS_0_BASEADDR + u32 UartReg = 0; +#endif + + fsbl_printf(DEBUG_GENERAL,"FSBL Status = 0x%.4lx\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 + */ +#ifdef XPAR_XUARTPS_0_BASEADDR + 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 +#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%08lx\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; + +#if defined(STDOUT_BASEADDRESS) + 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 %lu.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.8lx\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%.8lx\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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/md5.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/md5.c new file mode 100644 index 0000000..e7cf7ea --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_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 +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 5.00a sgd	05/17/13 Initial release
    +*
    +*
    +* 
    +* +* @note +* +******************************************************************************/ +/****************************** Include Files *********************************/ + +#include "md5.h" + +/******************************************************************************/ +/** +* +* This function sets the memory +* +* @param dest +* +* @param ch +* +* @param count +* +* @return None +* +* @note None +* +****************************************************************************/ +inline void * MD5Memset( 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 * MD5Memcpy( 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 ) { + MD5Memcpy( p, buffer, len, doByteSwap ); + return; + } + + MD5Memcpy( 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 ) { + MD5Memcpy( 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 + */ + MD5Memcpy( 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 + */ + MD5Memset( p, 0, count ); + + MD5Transform( context->buffer, (u32 *)context->intermediate ); + + /* + * Now fill the next block with 56 bytes + */ + MD5Memset( context->intermediate, 0, 56 ); + } else { + /* + * Pad block to 56 bytes + */ + MD5Memset( 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 + */ + MD5Memcpy( 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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/md5.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/md5.h new file mode 100644 index 0000000..1b28ddd --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/md5.h @@ -0,0 +1,120 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file md5.h +* +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 5.00a sgd	05/17/13 Initial release
    +*
    +* 
    +* +* @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 * MD5Memset( void *dest, int ch, u32 count ); + +void * MD5Memcpy( 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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nand.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nand.c new file mode 100644 index 0000000..9bf4ec0 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nand.c @@ -0,0 +1,295 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nand.c +* +* Contains code for the NAND FLASH functionality. Bad Block management +* is simple: skip the bad blocks and keep going. +* +*
    +* 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
    +* 
    +* +* @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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nand.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nand.h new file mode 100644 index 0000000..1f5ee52 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nand.h @@ -0,0 +1,91 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nand.h +* +* This file contains the interface for the NAND FLASH functionality +* +*
    +* 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
    +* 10.00a kc 08/04/14 Fix for CR#809336 - Removed smc.h
    +* 
    +* +* @note +* +******************************************************************************/ +#ifndef ___NAND_H___ +#define ___NAND_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + + +#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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nor.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nor.c new file mode 100644 index 0000000..4705bcc --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nor.c @@ -0,0 +1,144 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nor.c +* +* Contains code for the NOR FLASH functionality. +* +*
    +* 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
    +*
    +* 
    +* +* @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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nor.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nor.h new file mode 100644 index 0000000..4c15825 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/nor.h @@ -0,0 +1,87 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nor.h +* +* This file contains the interface for the NOR FLASH functionality +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a ecm	01/10/10 Initial release
    +* 10.00a kc 08/04/14 Fix for CR#809336 - Removed smc.h
    +*
    +* 
    +* +* @note +* +******************************************************************************/ +#ifndef ___NOR_H___ +#define ___NOR_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +/************************** 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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/pcap.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/pcap.c new file mode 100644 index 0000000..40351c8 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/pcap.c @@ -0,0 +1,816 @@ +/***************************************************************************** +* +* Copyright (C) 2012 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file pcap.c +* +* Contains code for enabling and accessing the PCAP +* +*
    +* 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
    +* 7.00a kc	10/25/13	Fix for CR#724620 - How to handle PCAP_MODE after
    +*						                    bitstream configuration
    +*						Fix for CR#726178 - FabricInit() PROG_B is kept active
    +*						                    for 5mS.
    +* 						Fix for CR#731839 - FSBL has to check the
    +* 											HMAC error status after decryption
    +*			12/04/13	Fix for CR#764382 - How to handle PCAP_MODE after
    +*						                    bitstream configuration - PCAP_MODE
    +*											and PCAP_PR bits are not modified
    +* 8.00a kc  2/20/14		Fix for CR#775631 - FSBL: FsblGetGlobalTimer() 
    +*						is not proper
    +* 10.00a kc 07/24/14    Fix for CR#809336 - Minor code cleanup
    +* 13.00a ssc 04/10/15   Fix for CR#846899 - Corrected logic to clear
    +*                                           DMA done count
    +* 15.00a gan 07/21/16   Fix for CR# 953654 -(2016.3)FSBL -
    +* 											In pcap.c/pcap.h/main.h,
    +* 											Fabric Initialization sequence
    +* 											is modified to check the PL power
    +* 											before sequence starts and checking
    +* 											INIT_B reset status twice in case
    +* 											of failure.
    +* 16.00a gan 08/02/16   Fix for CR# 955897 -(2016.3)FSBL -
    +* 											In pcap.c, check pl power
    +* 											through MCTRL register for
    +* 											3.0 and later versions of silicon.
    +* 
    +* +* @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" +#include "xtime_l.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; +extern u32 Silicon_Version; +#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 IntrStsReg; + 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 = %lu \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"); + + /* + * Check for errors + */ + IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr); + if (IntrStsReg & FSBL_XDCFG_IXR_ERROR_FLAGS_MASK) { + fsbl_printf(DEBUG_INFO,"Errors in PCAP \r\n"); + return XST_FAILURE; + } + + /* + * 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 IntrStsReg; + 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 + */ + Status = FabricInit(); + if (Status != XST_SUCCESS) { + 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 = %lu \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"); + + /* + * Check for errors + */ + IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr); + if (IntrStsReg & FSBL_XDCFG_IXR_ERROR_FLAGS_MASK) { + fsbl_printf(DEBUG_INFO,"Errors in PCAP \r\n"); + return XST_FAILURE; + } + + /* + * 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 +* - XST_SUCCESS if the Fabric initialization is successful +* - XST_FAILURE if the Fabric initialization fails +* @note None +* +****************************************************************************/ +u32 FabricInit(void) +{ + u32 PcapReg; + u32 PcapCtrlRegVal; + u32 StatusReg; + u32 MctrlReg; + u32 PcfgInit; + u32 TimerExpired=0; + XTime tCur=0; + XTime tEnd=0; + + + /* + * 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%lx \r\n", + Xil_In32(PS_LVL_SHFTR_EN)); + + /* + * Get DEVCFG controller settings + */ + PcapReg = XDcfg_ReadReg(DcfgInstPtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET); + + /* + * Check the PL power status + */ + if(Silicon_Version >= SILICON_VERSION_3) + { + MctrlReg = XDcfg_GetMiscControlRegister(DcfgInstPtr); + + if((MctrlReg & XDCFG_MCTRL_PCAP_PCFG_POR_B_MASK) != + XDCFG_MCTRL_PCAP_PCFG_POR_B_MASK) + { + fsbl_printf(DEBUG_INFO,"Fabric not powered up\r\n"); + return XST_FAILURE; + } + } + + + /* + * Setting PCFG_PROG_B signal to high + */ + XDcfg_WriteReg(DcfgInstPtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (PcapReg | XDCFG_CTRL_PCFG_PROG_B_MASK)); + + /* + * Check for AES source key + */ + PcapCtrlRegVal = XDcfg_GetControlRegister(DcfgInstPtr); + if (PcapCtrlRegVal & XDCFG_CTRL_PCFG_AES_FUSE_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)); + + /* + * Check for AES source key + */ + if (PcapCtrlRegVal & XDCFG_CTRL_PCFG_AES_FUSE_MASK) { + /* + * 5msec delay + */ + usleep(5000); + } + + /* + * Polling the PCAP_INIT status for Reset or timeout + */ + + XTime_GetTime(&tCur); + do + { + PcfgInit = (XDcfg_GetStatusRegister(DcfgInstPtr) & + XDCFG_STATUS_PCFG_INIT_MASK); + if(PcfgInit == 0) + { + break; + } + XTime_GetTime(&tEnd); + if((u64)((u64)tCur + (COUNTS_PER_MILLI_SECOND*30)) > (u64)tEnd) + { + TimerExpired = 1; + } + + } while(!TimerExpired); + + if(TimerExpired == 1) + { + TimerExpired = 0; + /* + * Came here due to expiration and PCAP_INIT is set. + * Retry PCFG_PROG_B High -> Low again + */ + + /* + * Setting PCFG_PROG_B signal to high + */ + XDcfg_WriteReg(DcfgInstPtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (PcapReg | XDCFG_CTRL_PCFG_PROG_B_MASK)); + + /* + * Check for AES source key + */ + PcapCtrlRegVal = XDcfg_GetControlRegister(DcfgInstPtr); + if (PcapCtrlRegVal & XDCFG_CTRL_PCFG_AES_FUSE_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)); + + /* + * Check for AES source key + */ + if (PcapCtrlRegVal & XDCFG_CTRL_PCFG_AES_FUSE_MASK) { + /* + * 5msec delay + */ + usleep(5000); + } + /* + * Polling the PCAP_INIT status for Reset or timeout (second iteration) + */ + + XTime_GetTime(&tCur); + do + { + PcfgInit = (XDcfg_GetStatusRegister(DcfgInstPtr) & + XDCFG_STATUS_PCFG_INIT_MASK); + if(PcfgInit == 0) + { + break; + } + XTime_GetTime(&tEnd); + if((u64)((u64)tCur + (COUNTS_PER_MILLI_SECOND*30)) > (u64)tEnd) + { + TimerExpired = 1; + } + + } while(!TimerExpired); + + if(TimerExpired == 1) + { + /* + * Came here due to PCAP_INIT is not getting reset + * for PCFG_PROG_B signal High -> Low + */ + fsbl_printf(DEBUG_INFO,"Fabric Init failed\r\n"); + return XST_FAILURE; + } + } + + /* + * 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%lx \r\n",StatusReg); + + fsbl_printf(DEBUG_INFO,"PCAP:Fabric is Initialized done\r\n"); + + return XST_SUCCESS; +} +/******************************************************************************/ +/** +* +* 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 %lx\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%.8lx\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_SetStatusRegister(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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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 %lx\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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/pcap.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/pcap.h new file mode 100644 index 0000000..d9400b0 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/pcap.h @@ -0,0 +1,108 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file pcap.h +* +* This file contains the interface for intiializing and accessing the PCAP +* +* +*
    +* 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
    +* 15.00a gan 07/21/16   953654 -(2016.3)FSBL -In pcap.c/pcap.h/main.c,
    +* 						Fabric Initialization sequence is modified to check
    +* 						the PL power before sequence starts and checking INIT_B
    +* 						reset status twice in case of failure.
    +* 
    +* +* @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 +/*Miscellaneous Control Register mask*/ +#define XDCFG_MCTRL_PCAP_PCFG_POR_B_MASK 0x00000100 +#define COUNTS_PER_MILLI_SECOND (COUNTS_PER_SECOND/1000) + +#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); +u32 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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c new file mode 100644 index 0000000..cd8a445 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c @@ -0,0 +1,12946 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file ps7_init.c +* +* This file is automatically generated +* +*****************************************************************************/ + +#include "ps7_init.h" + +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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0x23 + // .. ==> 0XF8000128[13:8] = 0x00000023U + // .. ==> MASK : 0x00003F00U VAL : 0x00002300U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF8000128[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00302301U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xe + // .. ==> 0XF800015C[13:8] = 0x0000000EU + // .. ==> MASK : 0x00003F00U VAL : 0x00000E00U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF800015C[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00300E01U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. 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 = 0x14 + // .. ==> 0XF8000170[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000170[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000180[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000180[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000180[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000190[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000190[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000190[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000190, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF80001A0[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF80001A0[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF80001A0[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF80001A0, 0x03F03F30U ,0x00101400U), + // .. 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 = 0x1 + // .. ==> 0XF800012C[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. 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 = 0x0 + // .. ==> 0XF800012C[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00001081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27087290U), + // .. .. 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 = 0x105 + // .. .. ==> 0XF8006034[13:4] = 0x00000105U + // .. .. ==> MASK : 0x00003FF0U VAL : 0x00001050U + // .. .. 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 ,0x00011054U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B5C[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B5C[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. reserved_SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B60[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B60[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F9861CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B64[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B64[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F9861CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B68[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B68[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. reserved_VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. reserved_REFIO_TEST = 0x3 + // .. ==> 0XF8000B6C[11:10] = 0x00000003U + // .. ==> MASK : 0x00000C00U VAL : 0x00000C00U + // .. reserved_REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. reserved_DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. reserved_CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x00007FFFU ,0x00000E09U), + // .. .. 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 + // .. .. reserved_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 + // .. .. reserved_VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reserved_VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reserved_VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. reserved_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[15:14] = 0x00000000U + // .. .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. reserved_INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reserved_TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reserved_TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reserved_TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. reserved_TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reserved_INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FEFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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: TRACE CURRENT PORT SIZE + // .. FINISH: TRACE CURRENT PORT SIZE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 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(), + + // +}; + +unsigned long ps7_debug_3_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0x23 + // .. ==> 0XF8000128[13:8] = 0x00000023U + // .. ==> MASK : 0x00003F00U VAL : 0x00002300U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF8000128[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00302301U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xe + // .. ==> 0XF800015C[13:8] = 0x0000000EU + // .. ==> MASK : 0x00003F00U VAL : 0x00000E00U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF800015C[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00300E01U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. 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 = 0x14 + // .. ==> 0XF8000170[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000170[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000180[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000180[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000180[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000190[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000190[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000190[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000190, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF80001A0[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF80001A0[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF80001A0[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF80001A0, 0x03F03F30U ,0x00101400U), + // .. 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 = 0x1 + // .. ==> 0XF800012C[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. 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 = 0x0 + // .. ==> 0XF800012C[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27287290U), + // .. .. 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 = 0x105 + // .. .. ==> 0XF8006034[13:4] = 0x00000105U + // .. .. ==> MASK : 0x00003FF0U VAL : 0x00001050U + // .. .. 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 ,0x00011054U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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_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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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_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 = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. 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 = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 ,0x00000E09U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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: TRACE CURRENT PORT SIZE + // .. FINISH: TRACE CURRENT PORT SIZE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 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_debug_2_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0x23 + // .. ==> 0XF8000128[13:8] = 0x00000023U + // .. ==> MASK : 0x00003F00U VAL : 0x00002300U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF8000128[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00302301U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xe + // .. ==> 0XF800015C[13:8] = 0x0000000EU + // .. ==> MASK : 0x00003F00U VAL : 0x00000E00U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF800015C[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00300E01U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. 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 = 0x14 + // .. ==> 0XF8000170[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000170[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000180[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000180[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000180[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000190[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000190[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000190[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000190, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF80001A0[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF80001A0[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF80001A0[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF80001A0, 0x03F03F30U ,0x00101400U), + // .. 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 = 0x1 + // .. ==> 0XF800012C[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. 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 = 0x0 + // .. ==> 0XF800012C[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27287290U), + // .. .. 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 = 0x105 + // .. .. ==> 0XF8006034[13:4] = 0x00000105U + // .. .. ==> MASK : 0x00003FF0U VAL : 0x00001050U + // .. .. 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 ,0x00011054U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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_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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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_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 = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. 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 = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 ,0x00000209U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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: TRACE CURRENT PORT SIZE + // .. FINISH: TRACE CURRENT PORT SIZE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 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_debug_1_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 ) { + volatile unsigned long *addr = (volatile 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; + case OPCODE_MASKDELAY: + addr = (unsigned long*) args[0]; + mask = args[1]; + int delay = get_number_of_cycles_for_delay(mask); + perf_reset_and_start_timer(); + while ((*addr < delay)) { + } + 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_debug() +{ + // 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_debug_1_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else if (si_ver == PCW_SILICON_VERSION_2) { + ret = ps7_config (ps7_debug_2_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else { + ret = ps7_config (ps7_debug_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 ret; + //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 + 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; +} + + + + +/* For delay calculation using global timer */ + +/* start timer */ + void perf_start_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = ((1 << 0) | // Timer Enable + (1 << 3) | // Auto-increment + (0 << 8) // Pre-scale + ); +} + +/* stop timer and reset timer count regs */ + void perf_reset_clock(void) +{ + perf_disable_clock(); + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_L32 = 0; + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_U32 = 0; +} + +/* Compute mask for given delay in miliseconds*/ +int get_number_of_cycles_for_delay(unsigned int delay) +{ + // GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + return (APU_FREQ*delay/(2*1000)); + +} + +/* stop timer */ + void perf_disable_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = 0; +} + +void perf_reset_and_start_timer() +{ + perf_reset_clock(); + perf_start_clock(); +} + + + + diff --git a/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h new file mode 100644 index 0000000..7b2f445 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h @@ -0,0 +1,140 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 OPCODE_MASKDELAY 5U +#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 +#define EMIT_MASKDELAY(addr,mask) ( (OPCODE_MASKDELAY << 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 666666687 +#define DDR_FREQ 533333374 +#define DCI_FREQ 10158731 +#define QSPI_FREQ 200000000 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 25000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 50000000 +#define UART_FREQ 50000000 +#define SPI_FREQ 10000000 +#define I2C_FREQ 111111115 +#define WDT_FREQ 111111115 +#define TTC_FREQ 50000000 +#define CAN_FREQ 23809523 +#define PCAP_FREQ 200000000 +#define TPIU_FREQ 200000000 +#define FPGA0_FREQ 50000000 +#define FPGA1_FREQ 50000000 +#define FPGA2_FREQ 50000000 +#define FPGA3_FREQ 50000000 + + +/* For delay calculation using global registers*/ +#define SCU_GLOBAL_TIMER_COUNT_L32 0xF8F00200 +#define SCU_GLOBAL_TIMER_COUNT_U32 0xF8F00204 +#define SCU_GLOBAL_TIMER_CONTROL 0xF8F00208 +#define SCU_GLOBAL_TIMER_AUTO_INC 0xF8F00218 + +int ps7_config( unsigned long*); +int ps7_init(); +int ps7_post_config(); +int ps7_debug(); +char* getPS7MessageInfo(unsigned key); + +void perf_start_clock(void); +void perf_disable_clock(void); +void perf_reset_clock(void); +void perf_reset_and_start_timer(); +int get_number_of_cycles_for_delay(unsigned int delay); +#ifdef __cplusplus +} +#endif + diff --git a/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/qspi.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/qspi.c new file mode 100644 index 0000000..6fdf055 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/qspi.c @@ -0,0 +1,764 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file qspi.c +* +* Contains code for the QSPI FLASH functionality. +* +*
    +* 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
    +* 7.00a kc  10/25/13 Fix for CR#739968 - FSBL should do the QSPI config
    +*                    					 settings for Dual parallel
    +*                    					 configuration in IO mode
    +* 14.0 gan 01/13/16  Fix for CR#869081 - (2016.1)FSBL picks the qspi read
    +*                                        command from LQSPI_CFG register
    +*					 					 instead of hard coded read
    +*					 					 command (0x6B).
    +*
    +* 
    +* +* @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) + +#define SINGLE_QSPI_IO_CONFIG_QUAD_READ (LQSPI_CR_1_DUMMY_BYTE | \ + LQSPI_CR_FAST_QUAD_READ) + +#define DUAL_QSPI_IO_CONFIG_QUAD_READ (XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \ + XQSPIPS_LQSPI_CR_SEP_BUS_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); + } else { + /* + * Single flash IO read + */ + XQspiPs_SetLqspiConfigReg(QspiInstancePtr, SINGLE_QSPI_IO_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); + } else { + /* + * Dual flash IO read + */ + XQspiPs_SetLqspiConfigReg(QspiInstancePtr, DUAL_QSPI_IO_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 "); + } else if(ReadBuffer[1] == MACRONIX_ID) { + QspiFlashMake = MACRONIX_ID; + fsbl_printf(DEBUG_INFO, "MACRONIX "); + } + + /* + * 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) + || (ReadBuffer[3] == MACRONIX_FLASH_SIZE_ID_512M)) { + QspiFlashSize = FLASH_SIZE_512M; + fsbl_printf(DEBUG_INFO, "512M Bits\r\n"); + } else if ((ReadBuffer[3] == FLASH_SIZE_ID_1G) + || (ReadBuffer[3] == MACRONIX_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 + */ + u32 LqspiCrReg; + u8 ReadCommand; + + LqspiCrReg = XQspiPs_GetLqspiConfigReg(QspiInstancePtr); + ReadCommand = (u8) (LqspiCrReg & XQSPIPS_LQSPI_CR_INST_MASK); + WriteBuffer[COMMAND_OFFSET] = ReadCommand; + 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 %lu\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 + * Macronix bank select is same as Micron + */ + if (QspiFlashMake == MICRON_ID || QspiFlashMake == MACRONIX_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 || QspiFlashMake == MACRONIX_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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/qspi.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/qspi.h new file mode 100644 index 0000000..18dc374 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/qspi.h @@ -0,0 +1,128 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file qspi.h +* +* This file contains the interface for the QSPI FLASH functionality +* +*
    +* 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
    +* 
    +* +* @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 MACRONIX_ID 0xC2 + +#define FLASH_SIZE_ID_128M 0x18 +#define FLASH_SIZE_ID_256M 0x19 +#define FLASH_SIZE_ID_512M 0x20 +#define FLASH_SIZE_ID_1G 0x21 +/* Macronix size constants are different for 512M and 1G */ +#define MACRONIX_FLASH_SIZE_ID_512M 0x1A +#define MACRONIX_FLASH_SIZE_ID_1G 0x1B + +/* + * 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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/rsa.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/rsa.c new file mode 100644 index 0000000..ef6e506 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/rsa.c @@ -0,0 +1,361 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file rsa.c +* +* Contains code for the RSA authentication +* +*
    +* 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
    +* 9.00a kc  04/16/14 Fix for CR#724166 - SetPpk() will fail on secure
    +*					 					 fallback unless FSBL* and FSBL are
    +*					 					 identical in length
    +*					 Fix for CR#791245 - Use of xilrsa in FSBL
    +* 
    +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#ifdef RSA_SUPPORT +#include "fsbl.h" +#include "rsa.h" +#include "xilrsa.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 *****************************/ + +static u8 *PpkModular; +static u8 *PpkModularEx; +static u32 PpkExp; +static u32 PpkAlreadySet=0; + +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 +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 4.00a sg 02/28/13 Initial release +* +* +* +* @note +* +******************************************************************************/ +#ifndef ___RSA_H___ +#define ___RSA_H___ + +#ifdef __cplusplus +extern "C" { +#endif +/***************************** Include Files *********************************/ + + +#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 */ + +void SetPpk(void ); +u32 AuthenticatePartition(u8 *Buffer, u32 Size); +u32 RecreatePaddingAndCheck(u8 *signature, u8 *hash); + +#ifdef __cplusplus +} +#endif + +#endif /* ___RSA_H___ */ diff --git a/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/sd.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/sd.c new file mode 100644 index 0000000..9fb8086 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/sd.c @@ -0,0 +1,191 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file sd.c +* +* Contains code for the SD card FLASH functionality. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a jz	04/28/11 Initial release
    +* 7.00a kc  10/18/13 Integrated SD/MMC driver
    +* 12.00a ssc 12/11/14 Fix for CR# 839182
    +*
    +* 
    +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xparameters.h" +#include "fsbl.h" + +#if defined(XPAR_PS7_SD_0_S_AXI_BASEADDR) || defined(XPAR_XSDPS_0_BASEADDR) + +#ifndef XPAR_PS7_SD_0_S_AXI_BASEADDR +#define XPAR_PS7_SD_0_S_AXI_BASEADDR XPAR_XSDPS_0_BASEADDR +#endif + +#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; + TCHAR *path = "0:/"; /* Logical drive number is 0 */ + + /* Register volume work area, initialize device */ + rc = f_mount(&fatfs, path, 0); + 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 %lx\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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/sd.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/sd.h new file mode 100644 index 0000000..6283eb6 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/sd.h @@ -0,0 +1,79 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file sd.h +* +* This file contains the interface for the Secure Digital (SD) card +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a bh	03/10/11 Initial release
    +* 7.00a kc  10/18/13 Integrated SD/MMC driver
    +*
    +* 
    +* +* @note +* +******************************************************************************/ +#ifndef ___SD_H___ +#define ___SD_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************** Function Prototypes ******************************/ + +#if defined(XPAR_PS7_SD_0_S_AXI_BASEADDR) || defined(XPAR_XSDPS_0_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/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/vdma.c b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/vdma.c new file mode 100644 index 0000000..329f185 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/vdma.c @@ -0,0 +1,167 @@ +/* + */ + +#include "xil_printf.h" +//#include "sleep.h" + + +#include "vdma.h" + +XAxiVdma OutVdma; +XAxiVdma InVdma; + +XAxiVdma_DmaSetup VDMAOutCfg; +XAxiVdma_DmaSetup VDMAInCfg; + +u32 vdma_version() { + return XAxiVdma_GetVersion(&OutVdma); +} + +int vdma_out_start() { + int Status; + + // MM2S Startup + Status = XAxiVdma_DmaStart(&OutVdma, XAXIVDMA_READ); + if (Status != XST_SUCCESS) + { + xil_printf("Start read transfer failed %d\n\r", Status); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +int vdma_in_start() { + int Status; + + // MM2S Startup + Status = XAxiVdma_DmaStart(&InVdma, XAXIVDMA_WRITE); + if (Status != XST_SUCCESS) + { + xil_printf("Start read transfer failed %d\n\r", Status); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +int vdma_stop() { + XAxiVdma_DmaStop(&OutVdma, XAXIVDMA_READ); + return XST_SUCCESS; +} + + +int vdma_out_init(short DeviceID, int base_address, int h_width, int v_width, int bpp) +{ + XAxiVdma_Config *Config; + int Status; + + + Config = XAxiVdma_LookupConfig(DeviceID); + if (NULL == Config) { + xil_printf("XAxiVdma_LookupConfig failure\r\n"); + return XST_FAILURE; + } + + Status = XAxiVdma_CfgInitialize(&OutVdma, Config, Config->BaseAddress); + if (Status != XST_SUCCESS) { + xil_printf("XAxiVdma_CfgInitialize failure\r\n"); + return XST_FAILURE; + } + + VDMAOutCfg.EnableCircularBuf = 1; + VDMAOutCfg.EnableFrameCounter = 0; + VDMAOutCfg.FixedFrameStoreAddr = 0; + + VDMAOutCfg.EnableSync = 1; + VDMAOutCfg.PointNum = 1; + + VDMAOutCfg.FrameDelay = 0; + + VDMAOutCfg.VertSizeInput = v_width; + VDMAOutCfg.HoriSizeInput = h_width * bpp; + VDMAOutCfg.Stride = VDMAOutCfg.HoriSizeInput; + + Status = XAxiVdma_DmaConfig(&OutVdma, XAXIVDMA_READ, &VDMAOutCfg); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_ERROR, + "Read channel config failed %d\r\n", Status); + + return XST_FAILURE; + } + + VDMAOutCfg.FrameStoreStartAddr[0] = base_address; + + Status = XAxiVdma_DmaSetBufferAddr(&OutVdma, XAXIVDMA_READ, VDMAOutCfg.FrameStoreStartAddr); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_ERROR,"Read channel set buffer address failed %d\r\n", Status); + return XST_FAILURE; + } + + + Status = vdma_out_start(); + if (Status != XST_SUCCESS) { + xil_printf("error starting VDMA..!"); + return Status; + } + return XST_SUCCESS; + +} + +int vdma_in_init(short DeviceID, int base_address, int h_width, int v_width, int bpp) +{ + XAxiVdma_Config *Config; + int Status; + + Config = XAxiVdma_LookupConfig(DeviceID); + if (NULL == Config) { + xil_printf("XAxiVdma_LookupConfig failure\r\n"); + return XST_FAILURE; + } + + Status = XAxiVdma_CfgInitialize(&InVdma, Config, Config->BaseAddress); + if (Status != XST_SUCCESS) { + xil_printf("XAxiVdma_CfgInitialize failure\r\n"); + return XST_FAILURE; + } + + VDMAInCfg.EnableCircularBuf = 1; + VDMAInCfg.EnableFrameCounter = 0; + VDMAInCfg.FixedFrameStoreAddr = 0; + + VDMAInCfg.EnableSync = 1; + VDMAInCfg.PointNum = 1; + + VDMAInCfg.FrameDelay = 0; + + VDMAInCfg.VertSizeInput = v_width; + VDMAInCfg.HoriSizeInput = h_width * bpp; + VDMAInCfg.Stride = VDMAInCfg.HoriSizeInput; + + Status = XAxiVdma_DmaConfig(&InVdma, XAXIVDMA_WRITE, &VDMAInCfg); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_ERROR, + "Read channel config failed %d\r\n", Status); + + return XST_FAILURE; + } + + VDMAInCfg.FrameStoreStartAddr[0] = base_address; + + Status = XAxiVdma_DmaSetBufferAddr(&InVdma, XAXIVDMA_WRITE, VDMAInCfg.FrameStoreStartAddr); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_ERROR,"Write channel set buffer address failed %d\r\n", Status); + return XST_FAILURE; + } + + + Status = vdma_in_start(); + if (Status != XST_SUCCESS) { + xil_printf("error starting VDMA..!"); + return Status; + } + + return XST_SUCCESS; + +} + diff --git a/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/vdma.h b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/vdma.h new file mode 100644 index 0000000..79c1662 --- /dev/null +++ b/zynqberrydemo1/sw_lib/sw_apps/zynq_fsbl/src/vdma.h @@ -0,0 +1,14 @@ + +#ifndef VDMA_H_ +#define VDMA_H_ + +#include "xaxivdma.h" + + +extern XAxiVdma Vdma; /**< Instance of the VDMA Device */ +int vdma_out_init(short DeviceID, int base_address, int h_width, int v_width, int bpp); +int vdma_in_init(short DeviceID, int base_address, int h_width, int v_width, int bpp); + +u32 vdma_version(); + +#endif /* VDMA_H_ */ diff --git a/zynqberrydemo3/_readme.txt b/zynqberrydemo3/_readme.txt new file mode 100644 index 0000000..4a7d866 --- /dev/null +++ b/zynqberrydemo3/_readme.txt @@ -0,0 +1,73 @@ +Project Description +========================================================================== +Important notes: + 1.Please use short path name on Windows OS. The OS allows only 256 characters in normal path. + 2.Please do not use space character on path name. +========================================================================== +1. Create Command Files and open documentation links: + On Windows OS: run "_create_win_setup.cmd" and follow setup instructions + On Linux OS: run "_create_linux_setup.sh" and follow setup instructions +============================== +2. Create Vivado Project on Windows OS use instructions from option 1 of: + ===== + https://wiki.trenz-electronic.de/display/PD/Vivado+Projects + ===== + 1.Modify start setting: + ===== + Edit "design_basic_settings.cmd" with text editor: + Set your vivado installation path for edit: + @set XILDIR=C:\Xilinx + @set VIVADO_VERSION=2017.1 + In this example the it search in + C:\Xilinx\Vivado\2017.1 for VIVADO + C:\Xilinx\SDK\2017.1 for SDK (optional for some functionality, HSI/SDK) + C:\Xilinx\Vivado_Lab\2017.1 for VIVADO Labtools (optional for some functionality) + Set the correct part number for your pcb variant (see board_files/TE0710_board_files.csv), edit: + @set PARTNUMBER=1 + ===== + 2.Run "vivado_create_project_guimode.cmd" +============================== +2. Create Vivado Project on Linux use instructions from option 1 of: + ===== + https://wiki.trenz-electronic.de/display/PD/Vivado+Projects + ===== + 1.Modify start setting: + ===== + Edit "design_basic_settings.sh" with text editor: + Set your vivado installation path for edit: + @set XILDIR=/opt/Xilinx + @set VIVADO_VERSION=2017.1 + In this example the it search in + /opt/Vivado/2017.1 for VIVADO + /opt/SDK/2017.1 for SDK (optional for some functionality, HSI/SDK) + /opt/Vivado_Lab/2017.1 for VIVADO Labtools (optional for some functionality) + Set the correct part number for your pcb variant (see board_files/TE0710_board_files.csv), edit: + @set PARTNUMBER=1 + ===== + 2.Run "vivado_create_project_guimode.sh" +============================== +There are also other options available: + ===== + https://wiki.trenz-electronic.de/display/PD/Vivado+Projects +============================== +Attention: + ===== + Run design_clear_design_folders.cmd/sh clear all generated files and folders (vivado, workspace(hsi & sdk), vlog,...)! +============================== +Basic documentations: + ===== + Project Delivery: + https://wiki.trenz-electronic.de/display/PD/Project+Delivery + == + VIVADO/SDK/SDSoC + https://wiki.trenz-electronic.de/pages/viewpage.action?pageId=14746264 + == + Trenz Electronic SoMs + https://wiki.trenz-electronic.de/display/PD/All+Trenz+Electronic+SoMs + == + Additional Information for the are available on the download page of the design + https://shop.trenz-electronic.de/en/Download/?path=Trenz_Electronic //Reference_Design// +============================== +===== +NOTES +===== \ No newline at end of file diff --git a/zynqberrydemo3/block_design/zsys_bd.tcl b/zynqberrydemo3/block_design/zsys_bd.tcl new file mode 100644 index 0000000..6b47c52 --- /dev/null +++ b/zynqberrydemo3/block_design/zsys_bd.tcl @@ -0,0 +1,1126 @@ +TE::UTILS::te_msg TE_BD-0 INFO "This block design tcl-file was generate with Trenz Electronic GmbH Board Part:trenz.biz:te0726_7s:part0:3.1, FPGA: xc7z007sclg225-1 at 2017-06-12T13:37:13." +TE::UTILS::te_msg TE_BD-1 INFO "This block design tcl-file was modified by TE-Scripts. Modifications are labelled with comment tag # #TE_MOD# on the Block-Design tcl-file." + +################################################################ +# This is a generated script based on design: zsys +# +# Though there are limitations about the generated script, +# the main purpose of this utility is to make learning +# IP Integrator Tcl commands easier. +################################################################ + +namespace eval _tcl { +proc get_script_folder {} { + set script_path [file normalize [info script]] + set script_folder [file dirname $script_path] + return $script_folder +} +} +variable script_folder +set script_folder [_tcl::get_script_folder] + +################################################################ +# Check if script is running in correct Vivado version. +################################################################ +set scripts_vivado_version 2017.1 +set current_vivado_version [version -short] + +if { [string first $scripts_vivado_version $current_vivado_version] == -1 } { + puts "" + catch {common::send_msg_id "BD_TCL-109" "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."} + + return 1 +} + +################################################################ +# START +################################################################ + +# To test this script, run the following commands from Vivado Tcl console: +# source zsys_script.tcl + +# If there is no project opened, this script will create a +# project, but make sure you do not have an existing project +# <./myproj/project_1.xpr> in the current working folder. + +set list_projs [get_projects -quiet] +if { $list_projs eq "" } { + create_project project_1 myproj -part xc7z007sclg225-1 + set_property BOARD_PART trenz.biz:te0726_7s:part0:3.1 [current_project] +} + + +# CHANGE DESIGN NAME HERE +set design_name zsys + +# If you do not already have an existing IP Integrator design open, +# you can create a design using the following command: +# create_bd_design $design_name + +# Creating design if needed +set errMsg "" +set nRet 0 + +set cur_design [current_bd_design -quiet] +set list_cells [get_bd_cells -quiet] + +if { ${design_name} eq "" } { + # USE CASES: + # 1) Design_name not set + + set errMsg "Please set the variable to a non-empty value." + set nRet 1 + +} elseif { ${cur_design} ne "" && ${list_cells} eq "" } { + # USE CASES: + # 2): Current design opened AND is empty AND names same. + # 3): Current design opened AND is empty AND names diff; design_name NOT in project. + # 4): Current design opened AND is empty AND names diff; design_name exists in project. + + if { $cur_design ne $design_name } { + common::send_msg_id "BD_TCL-001" "INFO" "Changing value of from <$design_name> to <$cur_design> since current design is empty." + set design_name [get_property NAME $cur_design] + } + common::send_msg_id "BD_TCL-002" "INFO" "Constructing design in IPI design <$cur_design>..." + +} elseif { ${cur_design} ne "" && $list_cells ne "" && $cur_design eq $design_name } { + # USE CASES: + # 5) Current design opened AND has components AND same names. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 1 +} elseif { [get_files -quiet ${design_name}.bd] ne "" } { + # USE CASES: + # 6) Current opened design, has components, but diff names, design_name exists in project. + # 7) No opened design, design_name exists in project. + + set errMsg "Design <$design_name> already exists in your project, please set the variable to another value." + set nRet 2 + +} else { + # USE CASES: + # 8) No opened design, design_name not in project. + # 9) Current opened design, has components, but diff names, design_name not in project. + + common::send_msg_id "BD_TCL-003" "INFO" "Currently there is no design <$design_name> in project, so creating one..." + + create_bd_design $design_name + + common::send_msg_id "BD_TCL-004" "INFO" "Making design <$design_name> as current_bd_design." + current_bd_design $design_name + +} + +common::send_msg_id "BD_TCL-005" "INFO" "Currently the variable is equal to \"$design_name\"." + +if { $nRet != 0 } { + catch {common::send_msg_id "BD_TCL-114" "ERROR" $errMsg} + return $nRet +} + +################################################################## +# DESIGN PROCs +################################################################## + + +# Hierarchical cell: video_out +proc create_hier_cell_video_out { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_msg_id "BD_TCL-102" "ERROR" "create_hier_cell_video_out() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 CLKWIZ_AXI + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 VDMA_AXI + create_bd_intf_pin -mode Master -vlnv xilinx.com:interface:aximm_rtl:1.0 VIDEO_OUT_AXI + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 VTC_AXI + + # Create pins + create_bd_pin -dir I -type clk axi_aclk + create_bd_pin -dir I -from 0 -to 0 -type rst axi_int_aresetn + create_bd_pin -dir I -from 0 -to 0 -type rst axi_per_aresetn + create_bd_pin -dir O hdmi_clk_n + create_bd_pin -dir O hdmi_clk_p + create_bd_pin -dir O -from 2 -to 0 hdmi_data_n + create_bd_pin -dir O -from 2 -to 0 hdmi_data_p + create_bd_pin -dir I -type clk ref_clk + create_bd_pin -dir O -type intr tx_dma_int + + # Create instance: Video_IO_2_HDMI_TMDS_0, and set properties + set Video_IO_2_HDMI_TMDS_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:Video_IO_2_HDMI_TMDS:1.0 Video_IO_2_HDMI_TMDS_0 ] + set_property -dict [ list \ +CONFIG.C_CLK_SWAP {true} \ +CONFIG.C_D0_SWAP {true} \ +CONFIG.C_INT_CLOCKING {false} \ +CONFIG.C_VIDEO_MODE {0} \ + ] $Video_IO_2_HDMI_TMDS_0 + + # Create instance: axi_mem_intercon, and set properties + set axi_mem_intercon [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 axi_mem_intercon ] + set_property -dict [ list \ +CONFIG.NUM_MI {1} \ + ] $axi_mem_intercon + + # Create instance: axi_vdma_0, and set properties + set axi_vdma_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_vdma:6.3 axi_vdma_0 ] + set_property -dict [ list \ +CONFIG.c_include_s2mm {0} \ +CONFIG.c_m_axi_mm2s_data_width {32} \ +CONFIG.c_mm2s_genlock_mode {0} \ +CONFIG.c_mm2s_linebuffer_depth {1024} \ +CONFIG.c_mm2s_max_burst_length {16} \ +CONFIG.c_num_fstores {1} \ +CONFIG.c_s2mm_genlock_mode {0} \ + ] $axi_vdma_0 + + # Create instance: axis_fb_conv_0, and set properties + set axis_fb_conv_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axis_fb_conv:1.0 axis_fb_conv_0 ] + + # Create instance: clk_wiz_1, and set properties + set clk_wiz_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz:5.4 clk_wiz_1 ] + set_property -dict [ list \ +CONFIG.CLKIN1_JITTER_PS {50.0} \ +CONFIG.CLKOUT1_JITTER {333.287} \ +CONFIG.CLKOUT1_PHASE_ERROR {322.999} \ +CONFIG.CLKOUT1_REQUESTED_OUT_FREQ {74.250} \ +CONFIG.CLKOUT2_JITTER {256.477} \ +CONFIG.CLKOUT2_PHASE_ERROR {322.999} \ +CONFIG.CLKOUT2_REQUESTED_OUT_FREQ {371.250} \ +CONFIG.CLKOUT2_USED {true} \ +CONFIG.CLKOUT3_JITTER {325.031} \ +CONFIG.CLKOUT3_PHASE_ERROR {569.784} \ +CONFIG.CLKOUT3_REQUESTED_OUT_FREQ {100.000} \ +CONFIG.CLKOUT3_USED {false} \ +CONFIG.CLKOUT4_JITTER {357.108} \ +CONFIG.CLKOUT4_PHASE_ERROR {569.784} \ +CONFIG.CLKOUT4_REQUESTED_OUT_FREQ {100.000} \ +CONFIG.CLKOUT4_USED {false} \ +CONFIG.JITTER_SEL {Min_O_Jitter} \ +CONFIG.MMCM_BANDWIDTH {HIGH} \ +CONFIG.MMCM_CLKFBOUT_MULT_F {37.125} \ +CONFIG.MMCM_CLKIN1_PERIOD {5.000} \ +CONFIG.MMCM_CLKIN2_PERIOD {10.0} \ +CONFIG.MMCM_CLKOUT0_DIVIDE_F {10.000} \ +CONFIG.MMCM_CLKOUT1_DIVIDE {2} \ +CONFIG.MMCM_CLKOUT2_DIVIDE {1} \ +CONFIG.MMCM_CLKOUT3_DIVIDE {1} \ +CONFIG.MMCM_DIVCLK_DIVIDE {10} \ +CONFIG.NUM_OUT_CLKS {2} \ +CONFIG.USE_DYN_RECONFIG {true} \ + ] $clk_wiz_1 + + # Create instance: v_axi4s_vid_out_0, and set properties + set v_axi4s_vid_out_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:v_axi4s_vid_out:4.0 v_axi4s_vid_out_0 ] + set_property -dict [ list \ +CONFIG.C_HAS_ASYNC_CLK {1} \ + ] $v_axi4s_vid_out_0 + + # Create instance: v_tc_0, and set properties + set v_tc_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:v_tc:6.1 v_tc_0 ] + set_property -dict [ list \ +CONFIG.GEN_F0_VBLANK_HEND {1280} \ +CONFIG.GEN_F0_VBLANK_HSTART {1280} \ +CONFIG.GEN_F0_VFRAME_SIZE {750} \ +CONFIG.GEN_F0_VSYNC_HEND {1280} \ +CONFIG.GEN_F0_VSYNC_HSTART {1280} \ +CONFIG.GEN_F0_VSYNC_VEND {729} \ +CONFIG.GEN_F0_VSYNC_VSTART {724} \ +CONFIG.GEN_F1_VBLANK_HEND {1280} \ +CONFIG.GEN_F1_VBLANK_HSTART {1280} \ +CONFIG.GEN_F1_VFRAME_SIZE {750} \ +CONFIG.GEN_F1_VSYNC_HEND {1280} \ +CONFIG.GEN_F1_VSYNC_HSTART {1280} \ +CONFIG.GEN_F1_VSYNC_VEND {729} \ +CONFIG.GEN_F1_VSYNC_VSTART {724} \ +CONFIG.GEN_HACTIVE_SIZE {1280} \ +CONFIG.GEN_HFRAME_SIZE {1650} \ +CONFIG.GEN_HSYNC_END {1430} \ +CONFIG.GEN_HSYNC_START {1390} \ +CONFIG.GEN_VACTIVE_SIZE {720} \ +CONFIG.HAS_AXI4_LITE {true} \ +CONFIG.VIDEO_MODE {720p} \ +CONFIG.enable_detection {false} \ +CONFIG.max_clocks_per_line {4096} \ +CONFIG.max_lines_per_frame {2048} \ + ] $v_tc_0 + + # Create interface connections + connect_bd_intf_net -intf_net CLKWIZ_AXI_1 [get_bd_intf_pins CLKWIZ_AXI] [get_bd_intf_pins clk_wiz_1/s_axi_lite] + connect_bd_intf_net -intf_net Conn1 [get_bd_intf_pins VIDEO_OUT_AXI] [get_bd_intf_pins axi_mem_intercon/M00_AXI] + connect_bd_intf_net -intf_net Conn2 [get_bd_intf_pins VDMA_AXI] [get_bd_intf_pins axi_vdma_0/S_AXI_LITE] + connect_bd_intf_net -intf_net Conn3 [get_bd_intf_pins VTC_AXI] [get_bd_intf_pins v_tc_0/ctrl] + connect_bd_intf_net -intf_net axi_vdma_0_M_AXIS_MM2S [get_bd_intf_pins axi_vdma_0/M_AXIS_MM2S] [get_bd_intf_pins axis_fb_conv_0/S_AXIS] + connect_bd_intf_net -intf_net axi_vdma_0_M_AXI_MM2S [get_bd_intf_pins axi_mem_intercon/S00_AXI] [get_bd_intf_pins axi_vdma_0/M_AXI_MM2S] + connect_bd_intf_net -intf_net axis_fb_conv_0_video_out [get_bd_intf_pins axis_fb_conv_0/video_out] [get_bd_intf_pins v_axi4s_vid_out_0/video_in] + connect_bd_intf_net -intf_net v_axi4s_vid_out_0_vid_io_out [get_bd_intf_pins Video_IO_2_HDMI_TMDS_0/vid_io_in] [get_bd_intf_pins v_axi4s_vid_out_0/vid_io_out] + connect_bd_intf_net -intf_net v_tc_0_vtiming_out [get_bd_intf_pins v_axi4s_vid_out_0/vtiming_in] [get_bd_intf_pins v_tc_0/vtiming_out] + + # Create port connections + connect_bd_net -net ARESETN_2 [get_bd_pins axi_int_aresetn] [get_bd_pins axi_mem_intercon/ARESETN] + connect_bd_net -net Video_IO_2_HDMI_TMDS_0_hdmi_clk_n [get_bd_pins hdmi_clk_n] [get_bd_pins Video_IO_2_HDMI_TMDS_0/hdmi_clk_n] + connect_bd_net -net Video_IO_2_HDMI_TMDS_0_hdmi_clk_p [get_bd_pins hdmi_clk_p] [get_bd_pins Video_IO_2_HDMI_TMDS_0/hdmi_clk_p] + connect_bd_net -net Video_IO_2_HDMI_TMDS_0_hdmi_data_n [get_bd_pins hdmi_data_n] [get_bd_pins Video_IO_2_HDMI_TMDS_0/hdmi_data_n] + connect_bd_net -net Video_IO_2_HDMI_TMDS_0_hdmi_data_p [get_bd_pins hdmi_data_p] [get_bd_pins Video_IO_2_HDMI_TMDS_0/hdmi_data_p] + connect_bd_net -net aclk_1 [get_bd_pins axi_aclk] [get_bd_pins axi_mem_intercon/ACLK] [get_bd_pins axi_mem_intercon/M00_ACLK] [get_bd_pins axi_mem_intercon/S00_ACLK] [get_bd_pins axi_vdma_0/m_axi_mm2s_aclk] [get_bd_pins axi_vdma_0/m_axis_mm2s_aclk] [get_bd_pins axi_vdma_0/s_axi_lite_aclk] [get_bd_pins axis_fb_conv_0/s_axis_aclk] [get_bd_pins clk_wiz_1/s_axi_aclk] [get_bd_pins v_axi4s_vid_out_0/aclk] [get_bd_pins v_tc_0/s_axi_aclk] + connect_bd_net -net aresetn_1 [get_bd_pins axi_per_aresetn] [get_bd_pins axi_mem_intercon/M00_ARESETN] [get_bd_pins axi_mem_intercon/S00_ARESETN] [get_bd_pins axi_vdma_0/axi_resetn] [get_bd_pins axis_fb_conv_0/s_axis_aresetn] [get_bd_pins clk_wiz_1/s_axi_aresetn] [get_bd_pins v_axi4s_vid_out_0/aresetn] [get_bd_pins v_tc_0/s_axi_aresetn] + connect_bd_net -net axi_vdma_0_mm2s_introut [get_bd_pins tx_dma_int] [get_bd_pins axi_vdma_0/mm2s_introut] + connect_bd_net -net clk_in1_1 [get_bd_pins ref_clk] [get_bd_pins clk_wiz_1/clk_in1] + connect_bd_net -net clk_wiz_1_clk_out2 [get_bd_pins Video_IO_2_HDMI_TMDS_0/video_clk5x_in] [get_bd_pins clk_wiz_1/clk_out2] + connect_bd_net -net clk_wiz_1_locked [get_bd_pins Video_IO_2_HDMI_TMDS_0/lock_in] [get_bd_pins clk_wiz_1/locked] + connect_bd_net -net v_axi4s_vid_out_0_vtg_ce [get_bd_pins v_axi4s_vid_out_0/vtg_ce] [get_bd_pins v_tc_0/gen_clken] + connect_bd_net -net video_clk_in_1 [get_bd_pins Video_IO_2_HDMI_TMDS_0/video_clk_in] [get_bd_pins clk_wiz_1/clk_out1] [get_bd_pins v_axi4s_vid_out_0/vid_io_out_clk] [get_bd_pins v_tc_0/clk] + + # Restore current instance + current_bd_instance $oldCurInst +} + +# Hierarchical cell: video_in +proc create_hier_cell_video_in { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_msg_id "BD_TCL-102" "ERROR" "create_hier_cell_video_in() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 VDMA_AXI + create_bd_intf_pin -mode Master -vlnv xilinx.com:interface:aximm_rtl:1.0 VIDEO_IN_AXI + + # Create pins + create_bd_pin -dir I -type clk axi_aclk + create_bd_pin -dir I -from 0 -to 0 -type rst axi_aresetn + create_bd_pin -dir I -from 0 -to 0 axi_int_aresetn + create_bd_pin -dir I colors_mode + create_bd_pin -dir I csi_clk_n + create_bd_pin -dir I csi_clk_p + create_bd_pin -dir I -from 0 -to 0 csi_data_lp_n + create_bd_pin -dir I -from 0 -to 0 csi_data_lp_p + create_bd_pin -dir I -from 1 -to 0 csi_data_n + create_bd_pin -dir I -from 1 -to 0 csi_data_p + create_bd_pin -dir I -from 0 -to 0 enable + create_bd_pin -dir I -type rst ext_reset_in + create_bd_pin -dir I processing_clk + create_bd_pin -dir I ref_clk + create_bd_pin -dir O rx_dma_int + + # Create instance: axi_interconnect_0, and set properties + set axi_interconnect_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 axi_interconnect_0 ] + set_property -dict [ list \ +CONFIG.NUM_MI {1} \ + ] $axi_interconnect_0 + + # Create instance: axi_vdma_0, and set properties + set axi_vdma_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_vdma:6.3 axi_vdma_0 ] + set_property -dict [ list \ +CONFIG.c_include_mm2s {0} \ +CONFIG.c_include_s2mm_dre {1} \ +CONFIG.c_m_axi_s2mm_data_width {64} \ +CONFIG.c_mm2s_genlock_mode {0} \ +CONFIG.c_num_fstores {1} \ +CONFIG.c_s2mm_genlock_mode {0} \ +CONFIG.c_s2mm_linebuffer_depth {4096} \ +CONFIG.c_s2mm_max_burst_length {32} \ + ] $axi_vdma_0 + + # Create instance: axis_data_fifo_0, and set properties + set axis_data_fifo_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:1.1 axis_data_fifo_0 ] + set_property -dict [ list \ +CONFIG.FIFO_DEPTH {16384} \ +CONFIG.HAS_TLAST {1} \ +CONFIG.IS_ACLK_ASYNC {1} \ +CONFIG.TDATA_NUM_BYTES {2} \ +CONFIG.TUSER_WIDTH {1} \ + ] $axis_data_fifo_0 + + # Create instance: axis_data_fifo_3, and set properties + set axis_data_fifo_3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:1.1 axis_data_fifo_3 ] + + # Create instance: axis_data_fifo_4, and set properties + set axis_data_fifo_4 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axis_data_fifo:1.1 axis_data_fifo_4 ] + set_property -dict [ list \ +CONFIG.FIFO_DEPTH {4096} \ +CONFIG.IS_ACLK_ASYNC {1} \ + ] $axis_data_fifo_4 + + # Create instance: axis_raw_demosaic_0, and set properties + set axis_raw_demosaic_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axis_raw_demosaic:1.0 axis_raw_demosaic_0 ] + set_property -dict [ list \ +CONFIG.C_COLOR_POS {2} \ +CONFIG.C_IN_TYPE {1} \ +CONFIG.C_MODE {1} \ + ] $axis_raw_demosaic_0 + + # Create instance: axis_raw_unpack_0, and set properties + set axis_raw_unpack_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axis_raw_unpack:1.0 axis_raw_unpack_0 ] + set_property -dict [ list \ +CONFIG.C_IMP_TYPE {1} \ +CONFIG.C_OUT_TYPE {1} \ + ] $axis_raw_unpack_0 + + # Create instance: csi2_d_phy_rx_0, and set properties + set csi2_d_phy_rx_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:csi2_d_phy_rx:1.0 csi2_d_phy_rx_0 ] + set_property -dict [ list \ +CONFIG.C_ADD_IDELAYCTRL {true} \ +CONFIG.C_CALIB_WAIT {8191} \ +CONFIG.C_NUM_LP_LANES {1} \ +CONFIG.C_RATE_LIMIT {50} \ +CONFIG.C_USE_DELAY {true} \ + ] $csi2_d_phy_rx_0 + + # Create instance: csi_to_axis_0, and set properties + set csi_to_axis_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:csi_to_axis:1.0 csi_to_axis_0 ] + set_property -dict [ list \ +CONFIG.C_TIMEOUT {255} \ + ] $csi_to_axis_0 + + # Create instance: proc_sys_reset_0, and set properties + set proc_sys_reset_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset_0 ] + + # Create instance: proc_sys_reset_1, and set properties + set proc_sys_reset_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset_1 ] + + # Create interface connections + connect_bd_intf_net -intf_net Conn2 [get_bd_intf_pins axis_data_fifo_0/S_AXIS] [get_bd_intf_pins csi_to_axis_0/M_AXIS] + connect_bd_intf_net -intf_net Conn3 [get_bd_intf_pins VDMA_AXI] [get_bd_intf_pins axi_vdma_0/S_AXI_LITE] + connect_bd_intf_net -intf_net Conn4 [get_bd_intf_pins VIDEO_IN_AXI] [get_bd_intf_pins axi_interconnect_0/M00_AXI] + connect_bd_intf_net -intf_net axi_vdma_0_M_AXI_S2MM [get_bd_intf_pins axi_interconnect_0/S00_AXI] [get_bd_intf_pins axi_vdma_0/M_AXI_S2MM] + connect_bd_intf_net -intf_net axis_data_fifo_0_M_AXIS [get_bd_intf_pins axis_data_fifo_0/M_AXIS] [get_bd_intf_pins axis_raw_unpack_0/S_AXIS] + connect_bd_intf_net -intf_net axis_data_fifo_3_M_AXIS [get_bd_intf_pins axis_data_fifo_3/M_AXIS] [get_bd_intf_pins axis_raw_demosaic_0/S_AXIS] + connect_bd_intf_net -intf_net axis_data_fifo_4_M_AXIS [get_bd_intf_pins axi_vdma_0/S_AXIS_S2MM] [get_bd_intf_pins axis_data_fifo_4/M_AXIS] + connect_bd_intf_net -intf_net axis_raw_demosaic_0_M_AXIS [get_bd_intf_pins axis_data_fifo_4/S_AXIS] [get_bd_intf_pins axis_raw_demosaic_0/M_AXIS] + connect_bd_intf_net -intf_net axis_raw_unpack_0_M_AXIS [get_bd_intf_pins axis_data_fifo_3/S_AXIS] [get_bd_intf_pins axis_raw_unpack_0/M_AXIS] + connect_bd_intf_net -intf_net csi2_d_phy_rx_0_RX_MIPI_PPI [get_bd_intf_pins csi2_d_phy_rx_0/RX_MIPI_PPI] [get_bd_intf_pins csi_to_axis_0/RX_MIPI_PPI] + connect_bd_intf_net -intf_net csi_to_axis_0_data_err [get_bd_intf_pins csi2_d_phy_rx_0/data_err] [get_bd_intf_pins csi_to_axis_0/data_err] + + # Create port connections + connect_bd_net -net CSI_AXIS_RSTN [get_bd_pins axis_data_fifo_0/s_axis_aresetn] [get_bd_pins csi_to_axis_0/m_axis_aresetn] [get_bd_pins proc_sys_reset_0/peripheral_aresetn] + connect_bd_net -net ENABLE_STREAM [get_bd_pins enable] [get_bd_pins csi_to_axis_0/enable_in] + connect_bd_net -net axi_int_aresetn_1 [get_bd_pins axi_int_aresetn] [get_bd_pins axi_interconnect_0/ARESETN] + connect_bd_net -net axi_vdma_0_s2mm_introut [get_bd_pins rx_dma_int] [get_bd_pins axi_vdma_0/s2mm_introut] + connect_bd_net -net colors_mode_1 [get_bd_pins colors_mode] [get_bd_pins axis_raw_demosaic_0/colors_mode] + connect_bd_net -net csi_clk_n_1 [get_bd_pins csi_clk_n] [get_bd_pins csi2_d_phy_rx_0/clk_rxn] + connect_bd_net -net csi_clk_p_1 [get_bd_pins csi_clk_p] [get_bd_pins csi2_d_phy_rx_0/clk_rxp] + connect_bd_net -net csi_data_lp_n_1 [get_bd_pins csi_data_lp_n] [get_bd_pins csi2_d_phy_rx_0/data_lp_n] + connect_bd_net -net csi_data_lp_p_1 [get_bd_pins csi_data_lp_p] [get_bd_pins csi2_d_phy_rx_0/data_lp_p] + connect_bd_net -net csi_data_n_1 [get_bd_pins csi_data_n] [get_bd_pins csi2_d_phy_rx_0/data_rxn] + connect_bd_net -net csi_data_p_1 [get_bd_pins csi_data_p] [get_bd_pins csi2_d_phy_rx_0/data_rxp] + connect_bd_net -net ext_reset_in_1 [get_bd_pins ext_reset_in] [get_bd_pins proc_sys_reset_0/ext_reset_in] [get_bd_pins proc_sys_reset_1/ext_reset_in] + connect_bd_net -net m_axi_aclk [get_bd_pins axi_aclk] [get_bd_pins axi_interconnect_0/ACLK] [get_bd_pins axi_interconnect_0/M00_ACLK] [get_bd_pins axi_interconnect_0/S00_ACLK] [get_bd_pins axi_vdma_0/m_axi_s2mm_aclk] [get_bd_pins axi_vdma_0/s_axi_lite_aclk] [get_bd_pins axi_vdma_0/s_axis_s2mm_aclk] [get_bd_pins axis_data_fifo_4/m_axis_aclk] + connect_bd_net -net m_axis_aresetn_1 [get_bd_pins axi_aresetn] [get_bd_pins axi_interconnect_0/M00_ARESETN] [get_bd_pins axi_interconnect_0/S00_ARESETN] [get_bd_pins axi_vdma_0/axi_resetn] [get_bd_pins axis_data_fifo_4/m_axis_aresetn] + connect_bd_net -net proc_sys_reset_1_peripheral_aresetn [get_bd_pins axis_data_fifo_0/m_axis_aresetn] [get_bd_pins axis_data_fifo_3/s_axis_aresetn] [get_bd_pins axis_data_fifo_4/s_axis_aresetn] [get_bd_pins axis_raw_demosaic_0/axis_aresetn] [get_bd_pins axis_raw_unpack_0/axis_aresetn] [get_bd_pins proc_sys_reset_1/peripheral_aresetn] + connect_bd_net -net processing_clk_1 [get_bd_pins processing_clk] [get_bd_pins axis_data_fifo_0/m_axis_aclk] [get_bd_pins axis_data_fifo_3/s_axis_aclk] [get_bd_pins axis_data_fifo_4/s_axis_aclk] [get_bd_pins axis_raw_demosaic_0/axis_aclk] [get_bd_pins axis_raw_unpack_0/axis_aclk] [get_bd_pins proc_sys_reset_1/slowest_sync_clk] + connect_bd_net -net ref_clk_in_1 [get_bd_pins ref_clk] [get_bd_pins csi2_d_phy_rx_0/in_delay_clk] + connect_bd_net -net s_axis_aclk_1 [get_bd_pins axis_data_fifo_0/s_axis_aclk] [get_bd_pins csi2_d_phy_rx_0/rxbyteclkhs] [get_bd_pins csi_to_axis_0/m_axis_aclk] [get_bd_pins csi_to_axis_0/rxbyteclkhs] [get_bd_pins proc_sys_reset_0/slowest_sync_clk] + + # Restore current instance + current_bd_instance $oldCurInst +} + +# Hierarchical cell: resets +proc create_hier_cell_resets { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_msg_id "BD_TCL-102" "ERROR" "create_hier_cell_resets() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + + # Create pins + create_bd_pin -dir I -type clk axi_clk + create_bd_pin -dir O -from 0 -to 0 -type rst axi_int_aresetn + create_bd_pin -dir O -from 0 -to 0 -type rst axi_per_aresetn + create_bd_pin -dir I -type rst ext_reset_in + + # Create instance: rst_processing_system7_0_50M, and set properties + set rst_processing_system7_0_50M [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 rst_processing_system7_0_50M ] + + # Create port connections + connect_bd_net -net ext_reset_in_1 [get_bd_pins ext_reset_in] [get_bd_pins rst_processing_system7_0_50M/ext_reset_in] + connect_bd_net -net rst_processing_system7_0_50M_interconnect_aresetn [get_bd_pins axi_int_aresetn] [get_bd_pins rst_processing_system7_0_50M/interconnect_aresetn] + connect_bd_net -net rst_processing_system7_0_50M_peripheral_aresetn [get_bd_pins axi_per_aresetn] [get_bd_pins rst_processing_system7_0_50M/peripheral_aresetn] + connect_bd_net -net slowest_sync_clk_1 [get_bd_pins axi_clk] [get_bd_pins rst_processing_system7_0_50M/slowest_sync_clk] + + # Restore current instance + current_bd_instance $oldCurInst +} + +# Hierarchical cell: audio +proc create_hier_cell_audio { parentCell nameHier } { + + variable script_folder + + if { $parentCell eq "" || $nameHier eq "" } { + catch {common::send_msg_id "BD_TCL-102" "ERROR" "create_hier_cell_audio() - Empty argument(s)!"} + return + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + # Create cell and set as current instance + set hier_obj [create_bd_cell -type hier $nameHier] + current_bd_instance $hier_obj + + # Create interface pins + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:axis_rtl:1.0 DMA_RX_ACK + create_bd_intf_pin -mode Master -vlnv xilinx.com:interface:axis_rtl:1.0 DMA_RX_REQ + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:axis_rtl:1.0 DMA_TX_ACK + create_bd_intf_pin -mode Master -vlnv xilinx.com:interface:axis_rtl:1.0 DMA_TX_REQ + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 S00_AXI + create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vp_Vn + + # Create pins + create_bd_pin -dir I audio_clk + create_bd_pin -dir I -type clk axi_aclk + create_bd_pin -dir I -from 0 -to 0 -type rst axi_resetn + create_bd_pin -dir O pwm_l_out + create_bd_pin -dir O pwm_r_out + + # Create instance: axi_i2s_adi_0, and set properties + set axi_i2s_adi_0 [ create_bd_cell -type ip -vlnv digilentinc.com:user:axi_i2s_adi:1.2 axi_i2s_adi_0 ] + set_property -dict [ list \ +CONFIG.C_DMA_TYPE {1} \ + ] $axi_i2s_adi_0 + + # Create instance: axis_to_i2s_0, and set properties + set axis_to_i2s_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axis_to_i2s:1.0 axis_to_i2s_0 ] + + # Create instance: i2s_to_pwm_0, and set properties + set i2s_to_pwm_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:i2s_to_pwm:1.0 i2s_to_pwm_0 ] + + # Create instance: xadc_wiz_0, and set properties + set xadc_wiz_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xadc_wiz:3.3 xadc_wiz_0 ] + set_property -dict [ list \ +CONFIG.ADC_CONVERSION_RATE {1000} \ +CONFIG.DCLK_FREQUENCY {150} \ +CONFIG.ENABLE_AXI4STREAM {true} \ +CONFIG.ENABLE_RESET {true} \ +CONFIG.ENABLE_VCCDDRO_ALARM {false} \ +CONFIG.ENABLE_VCCPAUX_ALARM {false} \ +CONFIG.ENABLE_VCCPINT_ALARM {false} \ +CONFIG.INTERFACE_SELECTION {None} \ +CONFIG.OT_ALARM {false} \ +CONFIG.SINGLE_CHANNEL_SELECTION {VP_VN} \ +CONFIG.USER_TEMP_ALARM {false} \ +CONFIG.VCCAUX_ALARM {false} \ +CONFIG.VCCINT_ALARM {false} \ + ] $xadc_wiz_0 + + # Create interface connections + connect_bd_intf_net -intf_net Conn1 [get_bd_intf_pins Vp_Vn] [get_bd_intf_pins xadc_wiz_0/Vp_Vn] + connect_bd_intf_net -intf_net Conn2 [get_bd_intf_pins DMA_TX_ACK] [get_bd_intf_pins axi_i2s_adi_0/DMA_TX_ACK] + connect_bd_intf_net -intf_net Conn3 [get_bd_intf_pins DMA_TX_REQ] [get_bd_intf_pins axi_i2s_adi_0/DMA_TX_REQ] + connect_bd_intf_net -intf_net Conn4 [get_bd_intf_pins DMA_RX_REQ] [get_bd_intf_pins axi_i2s_adi_0/DMA_RX_REQ] + connect_bd_intf_net -intf_net Conn5 [get_bd_intf_pins DMA_RX_ACK] [get_bd_intf_pins axi_i2s_adi_0/DMA_RX_ACK] + connect_bd_intf_net -intf_net Conn6 [get_bd_intf_pins S00_AXI] [get_bd_intf_pins axi_i2s_adi_0/S00_AXI] + connect_bd_intf_net -intf_net xadc_wiz_0_M_AXIS [get_bd_intf_pins axis_to_i2s_0/s_axis] [get_bd_intf_pins xadc_wiz_0/M_AXIS] + + # Create port connections + connect_bd_net -net BCLK [get_bd_pins axi_i2s_adi_0/BCLK_O] [get_bd_pins axis_to_i2s_0/i2s_bclk] [get_bd_pins i2s_to_pwm_0/i2s_bclk] + connect_bd_net -net DATA_CLK_I_1 [get_bd_pins audio_clk] [get_bd_pins axi_i2s_adi_0/DATA_CLK_I] + connect_bd_net -net LRCLK [get_bd_pins axi_i2s_adi_0/LRCLK_O] [get_bd_pins axis_to_i2s_0/i2s_lrclk] [get_bd_pins i2s_to_pwm_0/i2s_lrclk] + connect_bd_net -net i2s_to_pwm_0_pwm_l_out [get_bd_pins pwm_l_out] [get_bd_pins i2s_to_pwm_0/pwm_l_out] + connect_bd_net -net i2s_to_pwm_0_pwm_r_out [get_bd_pins pwm_r_out] [get_bd_pins i2s_to_pwm_0/pwm_r_out] + connect_bd_net -net m_axis_resetn_1 [get_bd_pins axi_resetn] [get_bd_pins axi_i2s_adi_0/DMA_REQ_RX_RSTN] [get_bd_pins axi_i2s_adi_0/DMA_REQ_TX_RSTN] [get_bd_pins axi_i2s_adi_0/s00_axi_aresetn] [get_bd_pins axis_to_i2s_0/s_axis_aresetn] [get_bd_pins xadc_wiz_0/m_axis_resetn] + connect_bd_net -net play_sdata [get_bd_pins axi_i2s_adi_0/SDATA_O] [get_bd_pins i2s_to_pwm_0/i2s_sdata] + connect_bd_net -net rec_sdata [get_bd_pins axi_i2s_adi_0/SDATA_I] [get_bd_pins axis_to_i2s_0/i2s_sdata] + connect_bd_net -net s_axis_aclk_1 [get_bd_pins axi_aclk] [get_bd_pins axi_i2s_adi_0/DMA_REQ_RX_ACLK] [get_bd_pins axi_i2s_adi_0/DMA_REQ_TX_ACLK] [get_bd_pins axi_i2s_adi_0/s00_axi_aclk] [get_bd_pins axis_to_i2s_0/s_axis_aclk] [get_bd_pins i2s_to_pwm_0/clk_in] [get_bd_pins xadc_wiz_0/m_axis_aclk] [get_bd_pins xadc_wiz_0/s_axis_aclk] + + # Restore current instance + current_bd_instance $oldCurInst +} + + +# Procedure to create entire design; Provide argument to make +# procedure reusable. If parentCell is "", will use root. +proc create_root_design { parentCell } { + + variable script_folder + + if { $parentCell eq "" } { + set parentCell [get_bd_cells /] + } + + # Get object for parentCell + set parentObj [get_bd_cells $parentCell] + if { $parentObj == "" } { + catch {common::send_msg_id "BD_TCL-100" "ERROR" "Unable to find parent cell <$parentCell>!"} + return + } + + # Make sure parentObj is hier blk + set parentType [get_property TYPE $parentObj] + if { $parentType ne "hier" } { + catch {common::send_msg_id "BD_TCL-101" "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be ."} + return + } + + # Save current instance; Restore later + set oldCurInst [current_bd_instance .] + + # Set parent object as current + current_bd_instance $parentObj + + + # Create interface ports +# #TE_MOD# set DDR [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:ddrx_rtl:1.0 DDR ] +# #TE_MOD# set FIXED_IO [ create_bd_intf_port -mode Master -vlnv xilinx.com:display_processing_system7:fixedio_rtl:1.0 FIXED_IO ] + set GPIO_1 [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:gpio_rtl:1.0 GPIO_1 ] + set Vp_Vn [ create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vp_Vn ] + + # Create ports + set PWM_L [ create_bd_port -dir O PWM_L ] + set PWM_R [ create_bd_port -dir O PWM_R ] + set csi_c_clk_n [ create_bd_port -dir I csi_c_clk_n ] + set csi_c_clk_p [ create_bd_port -dir I csi_c_clk_p ] + set csi_d_lp_n [ create_bd_port -dir I -from 0 -to 0 csi_d_lp_n ] + set csi_d_lp_p [ create_bd_port -dir I -from 0 -to 0 csi_d_lp_p ] + set csi_d_n [ create_bd_port -dir I -from 1 -to 0 csi_d_n ] + set csi_d_p [ create_bd_port -dir I -from 1 -to 0 csi_d_p ] + set hdmi_clk_n [ create_bd_port -dir O hdmi_clk_n ] + set hdmi_clk_p [ create_bd_port -dir O hdmi_clk_p ] + set hdmi_data_n [ create_bd_port -dir O -from 2 -to 0 hdmi_data_n ] + set hdmi_data_p [ create_bd_port -dir O -from 2 -to 0 hdmi_data_p ] + + # Create instance: audio + create_hier_cell_audio [current_bd_instance .] audio + + # Create instance: axi_reg32_0, and set properties + set axi_reg32_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axi_reg32:1.0 axi_reg32_0 ] + set_property -dict [ list \ +CONFIG.C_NUM_RO_REG {1} \ +CONFIG.C_NUM_WR_REG {1} \ + ] $axi_reg32_0 + + # Create instance: processing_system7_0, and set properties + set processing_system7_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 ] +# #TE_MOD#_Add next line# + apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1"} [get_bd_cells processing_system7_0] +# #TE_MOD#_Add next line# + set tcl_ext [];if { [catch {set tcl_ext [glob -join -dir ${TE::BOARDDEF_PATH}/carrier_extension/ *_preset.tcl]}] } {};foreach carrier_ext $tcl_ext { source $carrier_ext}; + set_property -dict [ list \ +CONFIG.PCW_ACT_ENET0_PERIPHERAL_FREQMHZ {125.000000} \ +CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {160.000000} \ +CONFIG.PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ {100.000000} \ +CONFIG.PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ {200.000000} \ +CONFIG.PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ {12.307692} \ +CONFIG.PCW_ACT_QSPI_PERIPHERAL_FREQMHZ {200.000000} \ +CONFIG.PCW_ACT_SDIO_PERIPHERAL_FREQMHZ {100.000000} \ +CONFIG.PCW_ACT_UART_PERIPHERAL_FREQMHZ {100.000000} \ +CONFIG.PCW_CLK0_FREQ {160000000} \ +CONFIG.PCW_CLK1_FREQ {100000000} \ +CONFIG.PCW_CLK2_FREQ {200000000} \ +CONFIG.PCW_CLK3_FREQ {12307692} \ +CONFIG.PCW_CPU_CPU_6X4X_MAX_RANGE {667} \ +CONFIG.PCW_DCI_PERIPHERAL_DIVISOR0 {15} \ +CONFIG.PCW_DCI_PERIPHERAL_DIVISOR1 {7} \ +CONFIG.PCW_DM_WIDTH {2} \ +CONFIG.PCW_DQS_WIDTH {2} \ +CONFIG.PCW_DQ_WIDTH {16} \ +CONFIG.PCW_ENET0_PERIPHERAL_CLKSRC {External} \ +CONFIG.PCW_EN_CLK1_PORT {1} \ +CONFIG.PCW_EN_CLK2_PORT {1} \ +CONFIG.PCW_EN_CLK3_PORT {1} \ +CONFIG.PCW_EN_EMIO_CD_SDIO0 {0} \ +CONFIG.PCW_EN_EMIO_GPIO {1} \ +CONFIG.PCW_EN_EMIO_I2C0 {1} \ +CONFIG.PCW_EN_EMIO_PJTAG {0} \ +CONFIG.PCW_EN_EMIO_SDIO0 {0} \ +CONFIG.PCW_EN_EMIO_SPI0 {0} \ +CONFIG.PCW_EN_EMIO_SPI1 {0} \ +CONFIG.PCW_EN_EMIO_TTC0 {1} \ +CONFIG.PCW_EN_EMIO_TTC1 {0} \ +CONFIG.PCW_EN_EMIO_UART0 {0} \ +CONFIG.PCW_EN_EMIO_WP_SDIO0 {0} \ +CONFIG.PCW_EN_GPIO {1} \ +CONFIG.PCW_EN_I2C0 {1} \ +CONFIG.PCW_EN_I2C1 {1} \ +CONFIG.PCW_EN_QSPI {1} \ +CONFIG.PCW_EN_SDIO0 {0} \ +CONFIG.PCW_EN_SDIO1 {1} \ +CONFIG.PCW_EN_SPI0 {0} \ +CONFIG.PCW_EN_SPI1 {0} \ +CONFIG.PCW_EN_TTC0 {1} \ +CONFIG.PCW_EN_TTC1 {0} \ +CONFIG.PCW_EN_UART0 {0} \ +CONFIG.PCW_EN_UART1 {1} \ +CONFIG.PCW_EN_USB0 {1} \ +CONFIG.PCW_FCLK0_PERIPHERAL_CLKSRC {IO PLL} \ +CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR0 {5} \ +CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR1 {2} \ +CONFIG.PCW_FCLK1_PERIPHERAL_CLKSRC {IO PLL} \ +CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR0 {4} \ +CONFIG.PCW_FCLK2_PERIPHERAL_CLKSRC {IO PLL} \ +CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR0 {4} \ +CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR0 {26} \ +CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR1 {5} \ +CONFIG.PCW_FCLK_CLK1_BUF {TRUE} \ +CONFIG.PCW_FCLK_CLK2_BUF {TRUE} \ +CONFIG.PCW_FCLK_CLK3_BUF {TRUE} \ +CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {160} \ +CONFIG.PCW_FPGA1_PERIPHERAL_FREQMHZ {100} \ +CONFIG.PCW_FPGA2_PERIPHERAL_FREQMHZ {200} \ +CONFIG.PCW_FPGA3_PERIPHERAL_FREQMHZ {12.288} \ +CONFIG.PCW_FPGA_FCLK1_ENABLE {1} \ +CONFIG.PCW_FPGA_FCLK2_ENABLE {1} \ +CONFIG.PCW_FPGA_FCLK3_ENABLE {1} \ +CONFIG.PCW_FTM_CTI_IN0 {} \ +CONFIG.PCW_FTM_CTI_IN2 {} \ +CONFIG.PCW_FTM_CTI_OUT0 {} \ +CONFIG.PCW_FTM_CTI_OUT2 {} \ +CONFIG.PCW_GPIO_EMIO_GPIO_ENABLE {1} \ +CONFIG.PCW_GPIO_EMIO_GPIO_IO {24} \ +CONFIG.PCW_GPIO_EMIO_GPIO_WIDTH {24} \ +CONFIG.PCW_GPIO_MIO_GPIO_ENABLE {1} \ +CONFIG.PCW_GPIO_MIO_GPIO_IO {MIO} \ +CONFIG.PCW_I2C0_GRP_INT_ENABLE {1} \ +CONFIG.PCW_I2C0_GRP_INT_IO {EMIO} \ +CONFIG.PCW_I2C0_I2C0_IO {EMIO} \ +CONFIG.PCW_I2C0_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_I2C1_GRP_INT_ENABLE {1} \ +CONFIG.PCW_I2C1_GRP_INT_IO {EMIO} \ +CONFIG.PCW_I2C1_I2C1_IO {MIO 48 .. 49} \ +CONFIG.PCW_I2C1_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_I2C_PERIPHERAL_FREQMHZ {111.111115} \ +CONFIG.PCW_I2C_RESET_ENABLE {0} \ +CONFIG.PCW_I2C_RESET_SELECT {} \ +CONFIG.PCW_SD0_GRP_WP_ENABLE {0} \ +CONFIG.PCW_SD0_GRP_WP_IO {} \ +CONFIG.PCW_SD1_GRP_CD_ENABLE {1} \ +CONFIG.PCW_SD1_GRP_CD_IO {MIO 0} \ +CONFIG.PCW_SD1_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_SD1_SD1_IO {MIO 10 .. 15} \ +CONFIG.PCW_SDIO_PERIPHERAL_CLKSRC {IO PLL} \ +CONFIG.PCW_SDIO_PERIPHERAL_DIVISOR0 {16} \ +CONFIG.PCW_SDIO_PERIPHERAL_VALID {1} \ +CONFIG.PCW_SPI0_GRP_SS0_ENABLE {0} \ +CONFIG.PCW_SPI0_GRP_SS0_IO {} \ +CONFIG.PCW_SPI0_GRP_SS2_ENABLE {0} \ +CONFIG.PCW_SPI0_GRP_SS2_IO {} \ +CONFIG.PCW_SPI1_GRP_SS0_ENABLE {0} \ +CONFIG.PCW_SPI1_GRP_SS0_IO {} \ +CONFIG.PCW_SPI1_GRP_SS2_ENABLE {0} \ +CONFIG.PCW_SPI1_GRP_SS2_IO {} \ +CONFIG.PCW_SPI_PERIPHERAL_DIVISOR0 {1} \ +CONFIG.PCW_SPI_PERIPHERAL_VALID {0} \ +CONFIG.PCW_S_AXI_HP0_DATA_WIDTH {32} \ +CONFIG.PCW_TTC0_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_TTC0_TTC0_IO {EMIO} \ +CONFIG.PCW_TTC1_TTC1_IO {} \ +CONFIG.PCW_UART1_GRP_FULL_ENABLE {0} \ +CONFIG.PCW_UART1_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_UART1_UART1_IO {MIO 8 .. 9} \ +CONFIG.PCW_UART_PERIPHERAL_DIVISOR0 {16} \ +CONFIG.PCW_UART_PERIPHERAL_VALID {1} \ +CONFIG.PCW_UIPARAM_GENERATE_SUMMARY {NONE} \ +CONFIG.PCW_USB0_PERIPHERAL_ENABLE {1} \ +CONFIG.PCW_USB0_RESET_ENABLE {1} \ +CONFIG.PCW_USB0_RESET_IO {MIO 7} \ +CONFIG.PCW_USB0_USB0_IO {MIO 28 .. 39} \ +CONFIG.PCW_USB_RESET_ENABLE {1} \ +CONFIG.PCW_USB_RESET_SELECT {Share reset pin} \ +CONFIG.PCW_USE_DMA0 {1} \ +CONFIG.PCW_USE_DMA1 {1} \ +CONFIG.PCW_USE_FABRIC_INTERRUPT {1} \ +CONFIG.PCW_USE_M_AXI_GP0 {1} \ +CONFIG.PCW_USE_S_AXI_HP0 {1} \ +CONFIG.PCW_USE_S_AXI_HP1 {1} \ + ] $processing_system7_0 + +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_T_RC {48.91} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_T_FAW {40.0} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_ROW_ADDR_COUNT {15} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_PARTNO {MT41J256M16 RE-125} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_MEMORY_TYPE {DDR 3 (Low Voltage)} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DRAM_WIDTH {16 Bits} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQ_3_PACKAGE_LENGTH {780} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQ_2_PACKAGE_LENGTH {550} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQ_1_PACKAGE_LENGTH {53.995} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQ_0_PACKAGE_LENGTH {77.166} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQS_3_PACKAGE_LENGTH {700} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQS_2_PACKAGE_LENGTH {520} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQS_1_PACKAGE_LENGTH {57.044} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DQS_0_PACKAGE_LENGTH {81.244} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_DEVICE_CAPACITY {4096 MBits} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_CLOCK_3_PACKAGE_LENGTH {86.1835} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_CLOCK_2_PACKAGE_LENGTH {86.1835} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_CLOCK_1_PACKAGE_LENGTH {86.1835} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_CLOCK_0_PACKAGE_LENGTH {86.1835} \ +# #TE_MOD# CONFIG.PCW_UIPARAM_DDR_BUS_WIDTH {16 Bit} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_3 {-0.614} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_2 {-0.434} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_1 {0.029} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_DQS_TO_CLK_DELAY_0 {0.005} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY3 {0.433} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY2 {0.318} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY1 {0.070} \ +# #TE_MOD# CONFIG.PCW_PACKAGE_DDR_BOARD_DELAY0 {0.082} \ +# #TE_MOD# #Empty Line + # Create instance: processing_system7_0_axi_periph, and set properties + set processing_system7_0_axi_periph [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect:2.1 processing_system7_0_axi_periph ] + set_property -dict [ list \ +CONFIG.NUM_MI {6} \ + ] $processing_system7_0_axi_periph + + # Create instance: resets + create_hier_cell_resets [current_bd_instance .] resets + + # Create instance: video_in + create_hier_cell_video_in [current_bd_instance .] video_in + + # Create instance: video_out + create_hier_cell_video_out [current_bd_instance .] video_out + + # Create instance: xlconcat_0, and set properties + set xlconcat_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 xlconcat_0 ] + set_property -dict [ list \ +CONFIG.NUM_PORTS {2} \ + ] $xlconcat_0 + + # Create instance: xlslice_0, and set properties + set xlslice_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_0 ] + set_property -dict [ list \ +CONFIG.DIN_FROM {0} \ +CONFIG.DIN_TO {0} \ +CONFIG.DIN_WIDTH {32} \ + ] $xlslice_0 + + # Create instance: xlslice_1, and set properties + set xlslice_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_1 ] + set_property -dict [ list \ +CONFIG.DIN_FROM {1} \ +CONFIG.DIN_TO {1} \ +CONFIG.DIN_WIDTH {32} \ +CONFIG.DOUT_WIDTH {1} \ + ] $xlslice_1 + + # Create interface connections + connect_bd_intf_net -intf_net Vp_Vn_1 [get_bd_intf_ports Vp_Vn] [get_bd_intf_pins audio/Vp_Vn] + connect_bd_intf_net -intf_net audio_DMA_RX_REQ [get_bd_intf_pins audio/DMA_RX_REQ] [get_bd_intf_pins processing_system7_0/DMA1_REQ] + connect_bd_intf_net -intf_net audio_DMA_TX_REQ [get_bd_intf_pins audio/DMA_TX_REQ] [get_bd_intf_pins processing_system7_0/DMA0_REQ] +# #TE_MOD# connect_bd_intf_net -intf_net processing_system7_0_DDR [get_bd_intf_ports DDR] [get_bd_intf_pins processing_system7_0/DDR] + connect_bd_intf_net -intf_net processing_system7_0_DMA0_ACK [get_bd_intf_pins audio/DMA_TX_ACK] [get_bd_intf_pins processing_system7_0/DMA0_ACK] + connect_bd_intf_net -intf_net processing_system7_0_DMA1_ACK [get_bd_intf_pins audio/DMA_RX_ACK] [get_bd_intf_pins processing_system7_0/DMA1_ACK] +# #TE_MOD# connect_bd_intf_net -intf_net processing_system7_0_FIXED_IO [get_bd_intf_ports FIXED_IO] [get_bd_intf_pins processing_system7_0/FIXED_IO] + connect_bd_intf_net -intf_net processing_system7_0_GPIO_0 [get_bd_intf_ports GPIO_1] [get_bd_intf_pins processing_system7_0/GPIO_0] + connect_bd_intf_net -intf_net processing_system7_0_M_AXI_GP0 [get_bd_intf_pins processing_system7_0/M_AXI_GP0] [get_bd_intf_pins processing_system7_0_axi_periph/S00_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M00_AXI [get_bd_intf_pins processing_system7_0_axi_periph/M00_AXI] [get_bd_intf_pins video_out/VDMA_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M01_AXI [get_bd_intf_pins processing_system7_0_axi_periph/M01_AXI] [get_bd_intf_pins video_in/VDMA_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M02_AXI [get_bd_intf_pins audio/S00_AXI] [get_bd_intf_pins processing_system7_0_axi_periph/M02_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M03_AXI [get_bd_intf_pins axi_reg32_0/S_AXI] [get_bd_intf_pins processing_system7_0_axi_periph/M03_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M04_AXI [get_bd_intf_pins processing_system7_0_axi_periph/M04_AXI] [get_bd_intf_pins video_out/VTC_AXI] + connect_bd_intf_net -intf_net processing_system7_0_axi_periph_M05_AXI [get_bd_intf_pins processing_system7_0_axi_periph/M05_AXI] [get_bd_intf_pins video_out/CLKWIZ_AXI] + connect_bd_intf_net -intf_net video_in_M00_AXI [get_bd_intf_pins processing_system7_0/S_AXI_HP1] [get_bd_intf_pins video_in/VIDEO_IN_AXI] + connect_bd_intf_net -intf_net video_out_M00_AXI [get_bd_intf_pins processing_system7_0/S_AXI_HP0] [get_bd_intf_pins video_out/VIDEO_OUT_AXI] + + # Create port connections + connect_bd_net -net audio_pwm_l_out [get_bd_ports PWM_L] [get_bd_pins audio/pwm_l_out] + connect_bd_net -net audio_pwm_r_out [get_bd_ports PWM_R] [get_bd_pins audio/pwm_r_out] + connect_bd_net -net axi_reg32_0_WR0 [get_bd_pins axi_reg32_0/WR0] [get_bd_pins xlslice_0/Din] [get_bd_pins xlslice_1/Din] + connect_bd_net -net csi_c_clk_n_1 [get_bd_ports csi_c_clk_n] [get_bd_pins video_in/csi_clk_n] + connect_bd_net -net csi_c_clk_p_1 [get_bd_ports csi_c_clk_p] [get_bd_pins video_in/csi_clk_p] + connect_bd_net -net csi_d_lp_n_1 [get_bd_ports csi_d_lp_n] [get_bd_pins video_in/csi_data_lp_n] + connect_bd_net -net csi_d_lp_p_1 [get_bd_ports csi_d_lp_p] [get_bd_pins video_in/csi_data_lp_p] + connect_bd_net -net csi_d_n_1 [get_bd_ports csi_d_n] [get_bd_pins video_in/csi_data_n] + connect_bd_net -net csi_d_p_1 [get_bd_ports csi_d_p] [get_bd_pins video_in/csi_data_p] + connect_bd_net -net processing_system7_0_FCLK_CLK0 [get_bd_pins audio/axi_aclk] [get_bd_pins axi_reg32_0/s_axi_aclk] [get_bd_pins processing_system7_0/DMA0_ACLK] [get_bd_pins processing_system7_0/DMA1_ACLK] [get_bd_pins processing_system7_0/FCLK_CLK0] [get_bd_pins processing_system7_0/M_AXI_GP0_ACLK] [get_bd_pins processing_system7_0/S_AXI_HP0_ACLK] [get_bd_pins processing_system7_0/S_AXI_HP1_ACLK] [get_bd_pins processing_system7_0_axi_periph/ACLK] [get_bd_pins processing_system7_0_axi_periph/M00_ACLK] [get_bd_pins processing_system7_0_axi_periph/M01_ACLK] [get_bd_pins processing_system7_0_axi_periph/M02_ACLK] [get_bd_pins processing_system7_0_axi_periph/M03_ACLK] [get_bd_pins processing_system7_0_axi_periph/M04_ACLK] [get_bd_pins processing_system7_0_axi_periph/M05_ACLK] [get_bd_pins processing_system7_0_axi_periph/S00_ACLK] [get_bd_pins resets/axi_clk] [get_bd_pins video_in/axi_aclk] [get_bd_pins video_in/processing_clk] [get_bd_pins video_out/axi_aclk] + connect_bd_net -net processing_system7_0_FCLK_CLK2 [get_bd_pins processing_system7_0/FCLK_CLK2] [get_bd_pins video_in/ref_clk] [get_bd_pins video_out/ref_clk] + connect_bd_net -net processing_system7_0_FCLK_CLK3 [get_bd_pins audio/audio_clk] [get_bd_pins processing_system7_0/FCLK_CLK3] + connect_bd_net -net processing_system7_0_FCLK_RESET0_N [get_bd_pins processing_system7_0/FCLK_RESET0_N] [get_bd_pins resets/ext_reset_in] [get_bd_pins video_in/ext_reset_in] + connect_bd_net -net rst_processing_system7_0_50M_interconnect_aresetn [get_bd_pins processing_system7_0_axi_periph/ARESETN] [get_bd_pins resets/axi_int_aresetn] [get_bd_pins video_in/axi_int_aresetn] [get_bd_pins video_out/axi_int_aresetn] + connect_bd_net -net rst_processing_system7_0_50M_peripheral_aresetn [get_bd_pins audio/axi_resetn] [get_bd_pins axi_reg32_0/s_axi_aresetn] [get_bd_pins processing_system7_0_axi_periph/M00_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M01_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M02_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M03_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M04_ARESETN] [get_bd_pins processing_system7_0_axi_periph/M05_ARESETN] [get_bd_pins processing_system7_0_axi_periph/S00_ARESETN] [get_bd_pins resets/axi_per_aresetn] [get_bd_pins video_in/axi_aresetn] [get_bd_pins video_out/axi_per_aresetn] + connect_bd_net -net video_in_rx_dma_int [get_bd_pins video_in/rx_dma_int] [get_bd_pins xlconcat_0/In1] + connect_bd_net -net video_out_hdmi_clk_n [get_bd_ports hdmi_clk_n] [get_bd_pins video_out/hdmi_clk_n] + connect_bd_net -net video_out_hdmi_clk_p [get_bd_ports hdmi_clk_p] [get_bd_pins video_out/hdmi_clk_p] + connect_bd_net -net video_out_hdmi_data_n [get_bd_ports hdmi_data_n] [get_bd_pins video_out/hdmi_data_n] + connect_bd_net -net video_out_hdmi_data_p [get_bd_ports hdmi_data_p] [get_bd_pins video_out/hdmi_data_p] + connect_bd_net -net video_out_mm2s_introut [get_bd_pins video_out/tx_dma_int] [get_bd_pins xlconcat_0/In0] + connect_bd_net -net xlconcat_0_dout [get_bd_pins processing_system7_0/IRQ_F2P] [get_bd_pins xlconcat_0/dout] + connect_bd_net -net xlslice_0_Dout [get_bd_pins video_in/enable] [get_bd_pins xlslice_0/Dout] + connect_bd_net -net xlslice_1_Dout [get_bd_pins video_in/colors_mode] [get_bd_pins xlslice_1/Dout] + + # Create address segments + create_bd_addr_seg -range 0x00010000 -offset 0x43C00000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs audio/axi_i2s_adi_0/S00_AXI/S00_AXI_reg] SEG_axi_i2s_adi_0_S00_AXI_reg + create_bd_addr_seg -range 0x00010000 -offset 0x43C10000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs axi_reg32_0/S_AXI/S_AXI_reg] SEG_axi_reg32_0_S_AXI_reg + create_bd_addr_seg -range 0x00010000 -offset 0x43000000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs video_out/axi_vdma_0/S_AXI_LITE/Reg] SEG_axi_vdma_0_Reg + create_bd_addr_seg -range 0x00010000 -offset 0x43010000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs video_in/axi_vdma_0/S_AXI_LITE/Reg] SEG_axi_vdma_0_Reg1 + create_bd_addr_seg -range 0x00010000 -offset 0x43C30000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs video_out/clk_wiz_1/s_axi_lite/Reg] SEG_clk_wiz_1_Reg + create_bd_addr_seg -range 0x00010000 -offset 0x43C20000 [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs video_out/v_tc_0/ctrl/Reg] SEG_v_tc_0_Reg + create_bd_addr_seg -range 0x20000000 -offset 0x00000000 [get_bd_addr_spaces video_in/axi_vdma_0/Data_S2MM] [get_bd_addr_segs processing_system7_0/S_AXI_HP1/HP1_DDR_LOWOCM] SEG_processing_system7_0_HP1_DDR_LOWOCM + create_bd_addr_seg -range 0x20000000 -offset 0x00000000 [get_bd_addr_spaces video_out/axi_vdma_0/Data_MM2S] [get_bd_addr_segs processing_system7_0/S_AXI_HP0/HP0_DDR_LOWOCM] SEG_processing_system7_0_HP0_DDR_LOWOCM + + + # Restore current instance + current_bd_instance $oldCurInst + + save_bd_design +} +# End of create_root_design() + + +################################################################## +# MAIN FLOW +################################################################## + +create_root_design "" + + + diff --git a/zynqberrydemo3/board_files/TE0726/1.0/board.xml b/zynqberrydemo3/board_files/TE0726/1.0/board.xml new file mode 100644 index 0000000..01bb3f3 --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726/1.0/board.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + ZYNQ-7 TE0726_01 Board File Image + + + + + + + 0.1 + + + + + 1.0 + + + ZYNQ-7 TE0726-01 ZynqBerry Board (form factor Raspberry Pi) with 128MB Memory and 100MBit Ethernet, speed grade -1 and commercial temperature range. Supported PCB Revisions: REV01. Note: primary boot device is QSPI, SD can be used as secondary boot device only. + + + + + + + FPGA part on the board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726/1.0/part0_pins.xml b/zynqberrydemo3/board_files/TE0726/1.0/part0_pins.xml new file mode 100644 index 0000000..f7ce2ba --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726/1.0/part0_pins.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726/1.0/preset.xml b/zynqberrydemo3/board_files/TE0726/1.0/preset.xml new file mode 100644 index 0000000..aa55c3d --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726/1.0/preset.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726/2.1/board.xml b/zynqberrydemo3/board_files/TE0726/2.1/board.xml new file mode 100644 index 0000000..5fe89cf --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726/2.1/board.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + ZYNQ-7 TE0726_R Board File Image + + + + + + + 0.3 + 0.2 + + + + + 2.1 + + + ZYNQ-7 TE0726-R ZynqBerry Board (form factor Raspberry Pi) with 128MB Memory and 100MBit Ethernet, speed grade -1 and commercial temperature range. Supported PCB Revisions: REV03 and REV02. Note: primary boot device is QSPI, SD can be used as secondary boot device only. + + + + + + + FPGA part on the board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726/2.1/part0_pins.xml b/zynqberrydemo3/board_files/TE0726/2.1/part0_pins.xml new file mode 100644 index 0000000..1d0deec --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726/2.1/part0_pins.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726/2.1/preset.xml b/zynqberrydemo3/board_files/TE0726/2.1/preset.xml new file mode 100644 index 0000000..e6f98eb --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726/2.1/preset.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726/3.1/board.xml b/zynqberrydemo3/board_files/TE0726/3.1/board.xml new file mode 100644 index 0000000..7facc84 --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726/3.1/board.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + ZYNQ-7 TE0726_M Board File Image + + + + + + + 0.3 + 0.2 + + + + + 3.1 + + + ZYNQ-7 TE0726-M ZynqBerry Board (form factor Raspberry Pi) with 512MB Memory and 100MBit Ethernet, speed grade -1 and commercial temperature range. Supported PCB Revisions: REV03 and REV02. Note: primary boot device is QSPI, SD can be used as secondary boot device only. + + + + + + + FPGA part on the board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726/3.1/part0_pins.xml b/zynqberrydemo3/board_files/TE0726/3.1/part0_pins.xml new file mode 100644 index 0000000..2c43aef --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726/3.1/part0_pins.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726/3.1/preset.xml b/zynqberrydemo3/board_files/TE0726/3.1/preset.xml new file mode 100644 index 0000000..c9afaf8 --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726/3.1/preset.xml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726_7S/3.1/board.xml b/zynqberrydemo3/board_files/TE0726_7S/3.1/board.xml new file mode 100644 index 0000000..14d4db1 --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726_7S/3.1/board.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + ZYNQ-7 TE0726_M Board File Image + + + + + + + 0.3 + 0.2 + + + + + 3.1 + + + ZYNQ-7S TE0726-07S ZynqBerry Board (form factor Raspberry Pi) with single ARM Cortex-A9, 512MB Memory, 100MBit Ethernet, speed grade -1 and commercial temperature range. Supported PCB Revisions: REV03 and REV02. Note: primary boot device is QSPI, SD can be used as secondary boot device only. + + + + + + + FPGA part on the board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726_7S/3.1/part0_pins.xml b/zynqberrydemo3/board_files/TE0726_7S/3.1/part0_pins.xml new file mode 100644 index 0000000..0449cdd --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726_7S/3.1/part0_pins.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/zynqberrydemo3/board_files/TE0726_7S/3.1/preset.xml b/zynqberrydemo3/board_files/TE0726_7S/3.1/preset.xml new file mode 100644 index 0000000..764f8c6 --- /dev/null +++ b/zynqberrydemo3/board_files/TE0726_7S/3.1/preset.xml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zynqberrydemo3/console/readme.txt b/zynqberrydemo3/console/readme.txt new file mode 100644 index 0000000..922ccd0 --- /dev/null +++ b/zynqberrydemo3/console/readme.txt @@ -0,0 +1,4 @@ +Console command files for reference design root directory. +Use console command file for generation: +_create_linux_setup.sh +_create_win_setup.cmd \ No newline at end of file diff --git a/zynqberrydemo3/constraints/_i_bitgen_common.xdc b/zynqberrydemo3/constraints/_i_bitgen_common.xdc new file mode 100644 index 0000000..5c862d0 --- /dev/null +++ b/zynqberrydemo3/constraints/_i_bitgen_common.xdc @@ -0,0 +1,7 @@ +# +# Common BITGEN related settings for TE0726 +# +set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] +set_property CONFIG_VOLTAGE 3.3 [current_design] +set_property CFGBVS VCCO [current_design] + diff --git a/zynqberrydemo3/constraints/_i_common.xdc b/zynqberrydemo3/constraints/_i_common.xdc new file mode 100644 index 0000000..3077d50 --- /dev/null +++ b/zynqberrydemo3/constraints/_i_common.xdc @@ -0,0 +1,5 @@ +# +# +# +set_property BITSTREAM.CONFIG.UNUSEDPIN PULLUP [current_design] + diff --git a/zynqberrydemo3/constraints/_i_csi.xdc b/zynqberrydemo3/constraints/_i_csi.xdc new file mode 100644 index 0000000..77d913e --- /dev/null +++ b/zynqberrydemo3/constraints/_i_csi.xdc @@ -0,0 +1,18 @@ +set_property PACKAGE_PIN N11 [get_ports csi_c_clk_p] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_p] +set_property PACKAGE_PIN M9 [get_ports {csi_d_lp_n[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_n[0]}] +set_property PACKAGE_PIN N9 [get_ports {csi_d_lp_p[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_p[0]}] +set_property PACKAGE_PIN M10 [get_ports {csi_d_p[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[0]}] +set_property PACKAGE_PIN P13 [get_ports {csi_d_p[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[1]}] +set_property INTERNAL_VREF 0.6 [get_iobanks 34] +set_property PULLDOWN true [get_ports {csi_d_lp_p[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_n[0]}] +# RPI Camera 1 +create_clock -period 6.250 -name csi_clk -add [get_ports csi_c_clk_p] +# RPI Camera 2.1 +#create_clock -period 1.875 -name csi_clk -add [get_ports csi_c_clk_p] + diff --git a/zynqberrydemo3/constraints/_i_hdmi.xdc b/zynqberrydemo3/constraints/_i_hdmi.xdc new file mode 100644 index 0000000..c45e7fe --- /dev/null +++ b/zynqberrydemo3/constraints/_i_hdmi.xdc @@ -0,0 +1,8 @@ +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_p] +set_property PACKAGE_PIN R7 [get_ports hdmi_clk_p] + +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[*]}] +set_property PACKAGE_PIN P8 [get_ports {hdmi_data_p[0]}] +set_property PACKAGE_PIN P10 [get_ports {hdmi_data_p[1]}] +set_property PACKAGE_PIN P11 [get_ports {hdmi_data_p[2]}] + diff --git a/zynqberrydemo3/constraints/_i_te0726.xdc b/zynqberrydemo3/constraints/_i_te0726.xdc new file mode 100644 index 0000000..c259487 --- /dev/null +++ b/zynqberrydemo3/constraints/_i_te0726.xdc @@ -0,0 +1,90 @@ +#set_property IOSTANDARD LVCMOS33 [get_ports spdif_tx_o] +#set_property PACKAGE_PIN K15 [get_ports spdif_tx_o] + +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[*]}] +# GPIO Pins +# GPIO2 +set_property PACKAGE_PIN K15 [get_ports {gpio_1_tri_io[0]}] +# GPIO3 +set_property PACKAGE_PIN J14 [get_ports {gpio_1_tri_io[1]}] +# GPIO4 +set_property PACKAGE_PIN H12 [get_ports {gpio_1_tri_io[2]}] +# GPIO5 +set_property PACKAGE_PIN N14 [get_ports {gpio_1_tri_io[3]}] +# GPIO6 +set_property PACKAGE_PIN R15 [get_ports {gpio_1_tri_io[4]}] +# GPIO7 +set_property PACKAGE_PIN L14 [get_ports {gpio_1_tri_io[5]}] +# GPIO8 +set_property PACKAGE_PIN L15 [get_ports {gpio_1_tri_io[6]}] +# GPIO9 +set_property PACKAGE_PIN J13 [get_ports {gpio_1_tri_io[7]}] +# GPIO10 +set_property PACKAGE_PIN H14 [get_ports {gpio_1_tri_io[8]}] +# GPIO11 +set_property PACKAGE_PIN J15 [get_ports {gpio_1_tri_io[9]}] +# GPIO12 +set_property PACKAGE_PIN M15 [get_ports {gpio_1_tri_io[10]}] +# GPIO13 +set_property PACKAGE_PIN R13 [get_ports {gpio_1_tri_io[11]}] +# GPIO16 +set_property PACKAGE_PIN L13 [get_ports {gpio_1_tri_io[12]}] +# GPIO17 +set_property PACKAGE_PIN G11 [get_ports {gpio_1_tri_io[13]}] +# GPIO18 +set_property PACKAGE_PIN H11 [get_ports {gpio_1_tri_io[14]}] +# GPIO19 +set_property PACKAGE_PIN R12 [get_ports {gpio_1_tri_io[15]}] +# GPIO20 +set_property PACKAGE_PIN M14 [get_ports {gpio_1_tri_io[16]}] +# GPIO21 +set_property PACKAGE_PIN P15 [get_ports {gpio_1_tri_io[17]}] +# GPIO22 +set_property PACKAGE_PIN H13 [get_ports {gpio_1_tri_io[18]}] +# GPIO23 +set_property PACKAGE_PIN J11 [get_ports {gpio_1_tri_io[19]}] +# GPIO24 +set_property PACKAGE_PIN K11 [get_ports {gpio_1_tri_io[20]}] +# GPIO25 +set_property PACKAGE_PIN K13 [get_ports {gpio_1_tri_io[21]}] +# GPIO26 +set_property PACKAGE_PIN L12 [get_ports {gpio_1_tri_io[22]}] +# GPIO27 +set_property PACKAGE_PIN G12 [get_ports {gpio_1_tri_io[23]}] + +## DSI_D0_N +#set_property PACKAGE_PIN F13 [get_ports {gpio_1_tri_io[24]}] +## DSI_D0_P +#set_property PACKAGE_PIN F14 [get_ports {gpio_1_tri_io[25]}] +## DSI_D1_N +#set_property PACKAGE_PIN F12 [get_ports {gpio_1_tri_io[26]}] +## DSI_D1_P +#set_property PACKAGE_PIN E13 [get_ports {gpio_1_tri_io[27]}] +## DSI_C_N +#set_property PACKAGE_PIN E11 [get_ports {gpio_1_tri_io[28]}] +## DSI_C_P +#set_property PACKAGE_PIN E12 [get_ports {gpio_1_tri_io[29]}] + +## CSI_D0_N +#set_property PACKAGE_PIN M11 [get_ports {gpio_1_tri_io[30]}] +## CSI_D0_P +#set_property PACKAGE_PIN M10 [get_ports {gpio_1_tri_io[31]}] +## CSI_D1_N +#set_property PACKAGE_PIN P14 [get_ports {gpio_1_tri_io[32]}] +## CSI_D2_P +#set_property PACKAGE_PIN P13 [get_ports {gpio_1_tri_io[33]}] +## CSI_C_N +#set_property PACKAGE_PIN N12 [get_ports {gpio_1_tri_io[34]}] +## CSI_C_P +#set_property PACKAGE_PIN N11 [get_ports {gpio_1_tri_io[35]}] +## PWM_R +##set_property PACKAGE_PIN N8 [get_ports {gpio_1_tri_io[36]}] +## PWM_L +##set_property PACKAGE_PIN N7 [get_ports {gpio_1_tri_io[37]}] + +# PWM_R +set_property PACKAGE_PIN N8 [get_ports PWM_R] +# PWM_L +set_property PACKAGE_PIN N7 [get_ports PWM_L] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_*] + diff --git a/zynqberrydemo3/constraints/_i_timing.xdc b/zynqberrydemo3/constraints/_i_timing.xdc new file mode 100644 index 0000000..2f420d1 --- /dev/null +++ b/zynqberrydemo3/constraints/_i_timing.xdc @@ -0,0 +1,13 @@ +set_clock_groups -asynchronous -group [get_clocks clk_fpga_3] -group [get_clocks clk_fpga_0] +set_property ASYNC_REG true [get_cells {zsys_i/audio/axi_i2s_adi_0/U0/ctrl/tx_sync/out_data_reg[4]}] +set_property ASYNC_REG true [get_cells {zsys_i/audio/axi_i2s_adi_0/U0/ctrl/SDATA_O_reg[0]}] +set_clock_groups -asynchronous -group [get_clocks clk_fpga_0] -group [get_clocks clk_fpga_3] + +set_false_path -from [get_pins {zsys_i/axi_reg32_0/U0/axi_reg32_v1_0_S_AXI_inst/slv_reg16_reg[1]/C}] -to [get_pins zsys_i/video_in/axis_raw_demosaic_0/U0/colors_mode_i_reg/D] +set_false_path -from [get_pins zsys_i/video_in/csi_to_axis_0/U0/lane_align_inst/err_req_reg/C] -to [get_pins zsys_i/video_in/csi2_d_phy_rx_0/U0/clock_upd_req_reg/D] + +set_false_path -from [get_pins {zsys_i/video_in/axi_vdma_0/U0/I_PRMRY_DATAMOVER/GEN_S2MM_FULL.I_S2MM_FULL_WRAPPER/GEN_INCLUDE_REALIGNER.I_S2MM_REALIGNER/GEN_INCLUDE_SCATTER.I_S2MM_SCATTER/sig_max_first_increment_reg[2]/C}] -to [get_pins zsys_i/video_in/axi_vdma_0/U0/I_PRMRY_DATAMOVER/GEN_S2MM_FULL.I_S2MM_FULL_WRAPPER/GEN_INCLUDE_REALIGNER.I_S2MM_REALIGNER/GEN_INCLUDE_SCATTER.I_S2MM_SCATTER/sig_btt_eq_0_reg/D] +set_false_path -from [get_pins {zsys_i/video_in/axi_vdma_0/U0/I_PRMRY_DATAMOVER/GEN_S2MM_FULL.I_S2MM_FULL_WRAPPER/GEN_INCLUDE_REALIGNER.I_S2MM_REALIGNER/GEN_INCLUDE_SCATTER.I_S2MM_SCATTER/sig_btt_cntr_dup_reg[1]/C}] -to [get_pins zsys_i/video_in/axi_vdma_0/U0/I_PRMRY_DATAMOVER/GEN_S2MM_FULL.I_S2MM_FULL_WRAPPER/GEN_INCLUDE_REALIGNER.I_S2MM_REALIGNER/GEN_INCLUDE_SCATTER.I_S2MM_SCATTER/sig_btt_eq_0_reg/D] + + + diff --git a/zynqberrydemo3/constraints/vivado_target.xdc b/zynqberrydemo3/constraints/vivado_target.xdc new file mode 100644 index 0000000..e69de29 diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/component.xml b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/component.xml new file mode 100644 index 0000000..5d57029 --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/component.xml @@ -0,0 +1,545 @@ + + + trenz.biz + user + Video_IO_2_HDMI_TMDS + 1.0 + + + vid_io_in + + + + + + + VBLANK + + + vid_vblank + + + + + ACTIVE_VIDEO + + + vid_active_video + + + + + VSYNC + + + vid_vsync + + + + + DATA + + + vid_data + + + + + HBLANK + + + vid_hblank + + + + + HSYNC + + + vid_hsync + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + Video_IO_2_HDMI_TMDS_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 1224790b + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + Video_IO_2_HDMI_TMDS_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + 1224790b + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 35d6fe5d + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + xilinx_utilityxitfiles + Utility XIT/TTCL + :vivado.xilinx.com:xit.util + + xilinx_utilityxitfiles_view_fileset + + + + viewChecksum + 799cb8bb + + + + + + + video_clk_in + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_clk5x_in + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + lock_in + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + vid_data + + in + + 23 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_active_video + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_hblank + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_vblank + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_hsync + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + vid_vsync + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + hdmi_data_p + + out + + 2 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + hdmi_data_n + + out + + 2 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + hdmi_clk_p + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + hdmi_clk_n + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_CLK_SWAP + HDMI CLK P/N Swap + FALSE + + + C_D0_SWAP + HDMI D0 P/N Swap + FALSE + + + C_D1_SWAP + HDMI D1 P/N Swap + FALSE + + + C_D2_SWAP + HDMI D2 P/N Swap + FALSE + + + C_INT_CLOCKING + C Int Clocking + true + + + C_VIDEO_MODE + Video Mode + 0 + + + + + + choice_pairs_c4f3a1c9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/tmds_encoder.vhd + vhdlSource + + + src/serdes_ddr.vhd + vhdlSource + + + hdl/dvi_encoder.vhd + vhdlSource + + + hdl/clock_system.vhd + vhdlSource + + + hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd + vhdlSource + CHECKSUM_e3ad9cc9 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/tmds_encoder.vhd + vhdlSource + USED_IN_ipstatic + + + src/serdes_ddr.vhd + vhdlSource + + + hdl/dvi_encoder.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/clock_system.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl + tclSource + CHECKSUM_60af6022 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + xilinx_utilityxitfiles_view_fileset + + gui/Video_IO_2_HDMI_TMDS_v1_0.gtcl + GTCL + + + + Video_IO_2_HDMI_TMDS + + + Component_Name + Video_IO_2_HDMI_TMDS_v1_0 + + + C_CLK_SWAP + HDMI CLK P/N Swap + FALSE + + + C_D0_SWAP + HDMI D0 P/N Swap + FALSE + + + C_D1_SWAP + HDMI D1 P/N Swap + FALSE + + + C_D2_SWAP + HDMI D2 P/N Swap + FALSE + + + C_VIDEO_MODE + Video Mode + 0 + + + + true + + + + + + C_INT_CLOCKING + Internal Clocks System + true + + + + + + virtex7 + artix7 + kintex7 + zynq + + + /Video_&_Image_Processing + + Video IO to HDMI TMDS Interface v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 26 + + xilinx.com:user:Video_IO_2_HDMI_TMDS:1.0 + + 2017-05-12T14:48:23Z + + b:/cores/2015.4/design/te0726/iotest/ip_lib/video_io_2_hdmi_tmds_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/Video_IO_2_HDMI_TMDS_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd new file mode 100644 index 0000000..71e5f47 --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/Video_IO_2_HDMI_TMDS_v1_0.vhd @@ -0,0 +1,229 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity Video_IO_2_HDMI_TMDS_v1_0 is +generic ( + -- Pin swap options + C_CLK_SWAP : boolean := FALSE; + C_D0_SWAP : boolean := FALSE; + C_D1_SWAP : boolean := FALSE; + C_D2_SWAP : boolean := FALSE; + + -- Clocking options + C_INT_CLOCKING : BOOLEAN := TRUE; + C_VIDEO_MODE : integer range 0 to 8 := 2 +-- 0 = VGA (640x480 @ 60 Hz) 25 250 24b +-- 1 = 480p (720x480 @ 60 Hz) 27 270 24b +-- 2 = SVGA (800x600 @ 60 Hz) 40 400 24b +-- 3 = XGA (1024x768 @ 60 Hz) 65 650 24b +-- 4 = HD (1366x768 @ 60 Hz) 85.5 855 24b +-- 5 = WXGA (1280x800 @ 60 Hz) 71 710 24b +-- 6 = HDTV 720p (1280x720 @ 60 Hz) 74.25 742.5 24b +-- 7 = HDTV 1080i (1920x1080 @ 60 Hz interlaced) 74.25 742.5 24b +-- 8 = SXGA (1280x1024 @ 60 Hz) 108 1080 24b +); +port ( + -- Clocks + video_clk_in : in STD_LOGIC; -- Main clock Input + video_clk5x_in : in STD_LOGIC; -- SERDES clock Input + lock_in : in STD_LOGIC; -- External PLL locking + -- Video IO Interface + vid_data : in STD_LOGIC_VECTOR(23 downto 0); + vid_active_video : in STD_LOGIC; + vid_hblank : in STD_LOGIC; + vid_vblank : in STD_LOGIC; + vid_hsync : in STD_LOGIC; + vid_vsync : in STD_LOGIC; + -- HDMI Interface + hdmi_data_p : out STD_LOGIC_VECTOR(2 downto 0); + hdmi_data_n : out STD_LOGIC_VECTOR(2 downto 0); + hdmi_clk_p : out STD_LOGIC; + hdmi_clk_n : out STD_LOGIC +); +end Video_IO_2_HDMI_TMDS_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of Video_IO_2_HDMI_TMDS_v1_0 is +---------------------------------------------------------------------------------- +component clock_system is +generic( + C_VIDEO_MODE : integer range 0 to 9 := 2 +); +port ( + clk_in : in STD_LOGIC; + pclk1x : out STD_LOGIC; + pclk5x : out STD_LOGIC; + lock : out STD_LOGIC +); +end component; + +component serdes_ddr is +port ( + clk_in : in STD_LOGIC; + clk_dv_in : in STD_LOGIC; + reset_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(9 downto 0); + data_out : out STD_LOGIC +); +end component; + +component dvi_encoder is +port ( + clkin : in STD_LOGIC; + rstin : in STD_LOGIC; + blue_din : in STD_LOGIC_VECTOR(7 downto 0); + green_din : in STD_LOGIC_VECTOR(7 downto 0); + red_din : in STD_LOGIC_VECTOR(7 downto 0); + hsync : in STD_LOGIC; + vsync : in STD_LOGIC; + de : in STD_LOGIC; + blue_dout : out STD_LOGIC_VECTOR(9 downto 0); + green_dout : out STD_LOGIC_VECTOR(9 downto 0); + red_dout : out STD_LOGIC_VECTOR(9 downto 0) +); +end component; +---------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +-- Clock system +signal pclk5x : STD_LOGIC; +signal pclk1x : STD_LOGIC; +signal lock : STD_LOGIC; +signal reset : STD_LOGIC; +signal serdes_rst : STD_LOGIC; +-- Video system +signal red_data : STD_LOGIC_VECTOR(7 downto 0); +signal green_data : STD_LOGIC_VECTOR(7 downto 0); +signal blue_data : STD_LOGIC_VECTOR(7 downto 0); +type s_data_type is array (5 downto 0) of STD_LOGIC_VECTOR(9 downto 0); +signal s_data_r : s_data_type; +signal s_data_o : s_data_type; +signal tmds_out : STD_LOGIC_VECTOR(3 downto 0); +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +int_clock_sys: if C_INT_CLOCKING = TRUE generate +begin + -- Clock system + clock_system_inst: clock_system + generic map( + C_VIDEO_MODE => C_VIDEO_MODE + ) + port map( + clk_in => video_clk_in, + pclk1x => pclk1x, + pclk5x => pclk5x, + lock => lock + ); +end generate; +ext_clock_sys: if C_INT_CLOCKING = FALSE generate +begin + lock <= lock_in; + pclk1x <= video_clk_in; + pclk5x <= video_clk5x_in; +end generate; +---------------------------------------------------------------------------------- +serdes_rst <= not lock; +reset <= net_gnd; +---------------------------------------------------------------------------------- +-- Video system +red_data <= vid_data(23 downto 16); +green_data <= vid_data( 7 downto 0); +blue_data <= vid_data(15 downto 8); +-- Encoder +enc_inst: dvi_encoder +port map( + clkin => pclk1x, + rstin => reset, + blue_din => blue_data, + green_din => green_data, + red_din => red_data, + hsync => vid_hsync, + vsync => vid_vsync, + de => vid_active_video, + blue_dout => s_data_r(0), + green_dout => s_data_r(1), + red_dout => s_data_r(2) +); +-- HDMI Clock generation +s_data_r(3) <= b"11111_00000"; +---------------------------------------------------------------------------------- +-- Bitswap +---------------------------------------------------------------------------------- +d0_direct: if C_D0_SWAP = FALSE generate + s_data_o(0) <= s_data_r(0); +end generate; +d0_inv: if C_D0_SWAP = TRUE generate + s_data_o(0) <= not s_data_r(0); +end generate; + +d1_direct: if C_D1_SWAP = FALSE generate + s_data_o(1) <= s_data_r(1); +end generate; +d1_inv: if C_D1_SWAP = TRUE generate + s_data_o(1) <= not s_data_r(1); +end generate; + +d2_direct: if C_D2_SWAP = FALSE generate + s_data_o(2) <= s_data_r(2); +end generate; +d2_inv: if C_D2_SWAP = TRUE generate + s_data_o(2) <= not s_data_r(2); +end generate; + +clk_direct: if C_CLK_SWAP = FALSE generate + s_data_o(3) <= s_data_r(3); +end generate; +clk_inv: if C_CLK_SWAP = TRUE generate + s_data_o(3) <= not s_data_r(3); +end generate; +---------------------------------------------------------------------------------- +-- Serdes +---------------------------------------------------------------------------------- +HDMI_ddr_lines_gen: for i in 0 to 3 generate +begin + serdes_ddr_inst: serdes_ddr + port map( + clk_in => pclk5x, + clk_dv_in => pclk1x, + reset_in => serdes_rst, + data_in => s_data_o(i), + data_out => tmds_out(i) + ); +end generate; +---------------------------------------------------------------------------------- +-- Output buffers +---------------------------------------------------------------------------------- +obufds_d0_inst: OBUFDS +port map( + I => tmds_out(0), + O => hdmi_data_p(0), + OB => hdmi_data_n(0) +); +obufds_d1_inst: OBUFDS +port map( + I => tmds_out(1), + O => hdmi_data_p(1), + OB => hdmi_data_n(1) +); +obufds_d2_inst: OBUFDS +port map( + I => tmds_out(2), + O => hdmi_data_p(2), + OB => hdmi_data_n(2) +); +obufds_clk_inst: OBUFDS +port map( + I => tmds_out(3), + O => hdmi_clk_p, + OB => hdmi_clk_n +); +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/clock_system.vhd b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/clock_system.vhd new file mode 100644 index 0000000..b0e23a8 --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/clock_system.vhd @@ -0,0 +1,282 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity clock_system is +generic( + C_VIDEO_MODE : integer range 0 to 8 := 2 +-- 0 = VGA (640x480 @ 60 Hz) 25 250 24b +-- 1 = 480p (720x480 @ 60 Hz) 27 270 24b +-- 2 = SVGA (800x600 @ 60 Hz) 40 400 24b +-- 3 = XGA (1024x768 @ 60 Hz) 65 650 24b +-- 4 = HD (1366x768 @ 60 Hz) 85.5 855 24b +-- 5 = WXGA (1280x800 @ 60 Hz) 71 710 24b +-- 6 = HDTV 720p (1280x720 @ 60 Hz) 74.25 742.5 24b +-- 7 = HDTV 1080i (1920x1080 @ 60 Hz interlaced) 74.25 742.5 24b +-- 8 = SXGA (1280x1024 @ 60 Hz) 108 1080 24b +); +port ( + clk_in : in STD_LOGIC; + pclk1x : out STD_LOGIC; + pclk5x : out STD_LOGIC; + lock : out STD_LOGIC +); +end clock_system; +------------------------------------------------------------------------------- +architecture Behavioral of clock_system is +------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +-- Clock system +signal clkfbout : STD_LOGIC; +signal pllclk5x_pll : STD_LOGIC; +signal pllclk5x_pll_g : STD_LOGIC; +signal pllclk1x_pll : STD_LOGIC; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +VGA_gen: if C_VIDEO_MODE = 0 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 40.0, + CLKFBOUT_MULT => 20, -- x10 clock + CLKOUT0_DIVIDE => 4, -- x5 clock + CLKOUT1_DIVIDE => 20, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +m480p_gen: if C_VIDEO_MODE = 1 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 37.037, + CLKFBOUT_MULT => 20, -- x10 clock + CLKOUT0_DIVIDE => 4, -- x5 clock + CLKOUT1_DIVIDE => 20, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +SVGA_gen: if C_VIDEO_MODE = 2 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 25.0, + CLKFBOUT_MULT => 20, -- x10 clock + CLKOUT0_DIVIDE => 4, -- x5 clock + CLKOUT1_DIVIDE => 20, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +XGA_gen: if C_VIDEO_MODE = 3 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 15.3846, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +HD_gen: if C_VIDEO_MODE = 4 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 11.6959, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +WXGA_gen: if C_VIDEO_MODE = 5 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 14.0845, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +HDTV_720p_gen: if C_VIDEO_MODE = 6 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 13.468, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +HDTV_1080p_gen: if C_VIDEO_MODE = 7 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 13.468, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +SXGA_gen: if C_VIDEO_MODE = 8 generate +begin +pll_inst: PLL_BASE +generic map( + CLKIN_PERIOD => 9.2592, + CLKFBOUT_MULT => 10, -- x10 clock + CLKOUT0_DIVIDE => 2, -- x5 clock + CLKOUT1_DIVIDE => 10, -- x1 clock + COMPENSATION => "INTERNAL" +) +port map ( + CLKFBOUT => clkfbout, + CLKOUT0 => pllclk5x_pll, + CLKOUT1 => pllclk1x_pll, + CLKOUT2 => open, + CLKOUT3 => open, + CLKOUT4 => open, + CLKOUT5 => open, + LOCKED => lock, + CLKFBIN => clkfbout, + CLKIN => clk_in, + RST => net_gnd +); +end generate; +------------------------------------------------------------------------------- +dclk_BUFIO_inst : BUFIO +port map ( + I => pllclk5x_pll, + O => pclk5x +); + +out_clk_BUFG_inst : BUFG +port map ( + I => pllclk1x_pll, + O => pclk1x +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/convert_30to15_fifo.vhd b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/convert_30to15_fifo.vhd new file mode 100644 index 0000000..cdcde89 --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/convert_30to15_fifo.vhd @@ -0,0 +1,194 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity convert_30to15_fifo is +port ( + rst : in STD_LOGIC; -- reset + clk : in STD_LOGIC; -- clock input + clkx2 : in STD_LOGIC; -- 2x clock input + datain : in STD_LOGIC_VECTOR(29 downto 0); -- input data for 2:1 serialisation + dataout : out STD_LOGIC_VECTOR(14 downto 0) +); +end convert_30to15_fifo; +------------------------------------------------------------------------------- +architecture Behavioral of convert_30to15_fifo is +------------------------------------------------------------------------------- +constant net_vcc : STD_LOGIC := '1'; + +component dram16xn is +generic( + DATA_WIDTH : integer := 20 +); +port ( + clk : in STD_LOGIC; + write_en : in STD_LOGIC; + address : in STD_LOGIC_VECTOR(3 downto 0); + address_dp : in STD_LOGIC_VECTOR(3 downto 0); + data_in : in STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0); + o_data_out : out STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0); + o_data_out_dp : out STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0) +); +end component; + +---------------------------------------------------- +-- Here we instantiate a 16x10 Dual Port RAM +-- and fill first it with data aligned to +-- clk domain +---------------------------------------------------- +signal wa : STD_LOGIC_VECTOR( 3 downto 0); -- RAM read address +signal wa_d : STD_LOGIC_VECTOR( 3 downto 0); -- RAM read address +signal ra : STD_LOGIC_VECTOR( 3 downto 0); -- RAM read address +signal ra_d : STD_LOGIC_VECTOR( 3 downto 0); -- RAM read address +signal dataint : STD_LOGIC_VECTOR(29 downto 0); -- RAM output + +constant ADDR0 : STD_LOGIC_VECTOR(3 downto 0) := "0000"; +constant ADDR1 : STD_LOGIC_VECTOR(3 downto 0) := "0001"; +constant ADDR2 : STD_LOGIC_VECTOR(3 downto 0) := "0010"; +constant ADDR3 : STD_LOGIC_VECTOR(3 downto 0) := "0011"; +constant ADDR4 : STD_LOGIC_VECTOR(3 downto 0) := "0100"; +constant ADDR5 : STD_LOGIC_VECTOR(3 downto 0) := "0101"; +constant ADDR6 : STD_LOGIC_VECTOR(3 downto 0) := "0110"; +constant ADDR7 : STD_LOGIC_VECTOR(3 downto 0) := "0111"; +constant ADDR8 : STD_LOGIC_VECTOR(3 downto 0) := "1000"; +constant ADDR9 : STD_LOGIC_VECTOR(3 downto 0) := "1001"; +constant ADDR10 : STD_LOGIC_VECTOR(3 downto 0) := "1010"; +constant ADDR11 : STD_LOGIC_VECTOR(3 downto 0) := "1011"; +constant ADDR12 : STD_LOGIC_VECTOR(3 downto 0) := "1100"; +constant ADDR13 : STD_LOGIC_VECTOR(3 downto 0) := "1101"; +constant ADDR14 : STD_LOGIC_VECTOR(3 downto 0) := "1110"; +constant ADDR15 : STD_LOGIC_VECTOR(3 downto 0) := "1111"; + +signal rstsync : STD_LOGIC; +signal rstsync_q : STD_LOGIC; +signal rstp : STD_LOGIC; +signal sync : STD_LOGIC; +signal db : STD_LOGIC_VECTOR(29 downto 0); +signal mux : STD_LOGIC_VECTOR(14 downto 0); +------------------------------------------------------------------------------- +attribute ASYNC_REG : string; +attribute ASYNC_REG of rstsync : signal is "true"; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +process(wa) +begin + case wa is + when ADDR0 => wa_d <= ADDR1 ; + when ADDR1 => wa_d <= ADDR2 ; + when ADDR2 => wa_d <= ADDR3 ; + when ADDR3 => wa_d <= ADDR4 ; + when ADDR4 => wa_d <= ADDR5 ; + when ADDR5 => wa_d <= ADDR6 ; + when ADDR6 => wa_d <= ADDR7 ; + when ADDR7 => wa_d <= ADDR8 ; + when ADDR8 => wa_d <= ADDR9 ; + when ADDR9 => wa_d <= ADDR10; + when ADDR10 => wa_d <= ADDR11; + when ADDR11 => wa_d <= ADDR12; + when ADDR12 => wa_d <= ADDR13; + when ADDR13 => wa_d <= ADDR14; + when ADDR14 => wa_d <= ADDR15; + when others => wa_d <= ADDR0; + end case; +end process; + +process(clk, rst) +begin + if(rst = '1')then + wa <= (others => '0'); + elsif(clk = '1' and clk'event)then + wa <= wa_d; + end if; +end process; + +-- Dual Port fifo to bridge data from clk to clkx2 +fifo_inst: dram16xn +generic map( + DATA_WIDTH => 30 +) +port map( + clk => clk, + write_en => net_vcc, + address => wa, + address_dp => ra, + data_in => datain, + o_data_out => open, + o_data_out_dp => dataint +); + +----------------------------------------------------------------/ +-- Here starts clk2x domain for fifo read out +-- FIFO read is set to be once every 2 cycles of clk2x in order +-- to keep up pace with the fifo write speed +-- Also FIFO read reset is delayed a bit in order to avoid +-- underflow. +----------------------------------------------------------------/ +process(ra) +begin + case ra is + when ADDR0 => ra_d <= ADDR1 ; + when ADDR1 => ra_d <= ADDR2 ; + when ADDR2 => ra_d <= ADDR3 ; + when ADDR3 => ra_d <= ADDR4 ; + when ADDR4 => ra_d <= ADDR5 ; + when ADDR5 => ra_d <= ADDR6 ; + when ADDR6 => ra_d <= ADDR7 ; + when ADDR7 => ra_d <= ADDR8 ; + when ADDR8 => ra_d <= ADDR9 ; + when ADDR9 => ra_d <= ADDR10; + when ADDR10 => ra_d <= ADDR11; + when ADDR11 => ra_d <= ADDR12; + when ADDR12 => ra_d <= ADDR13; + when ADDR13 => ra_d <= ADDR14; + when ADDR14 => ra_d <= ADDR15; + when others => ra_d <= ADDR0; + end case; +end process; + +fdp_rst: FDP +port map( + C => clkx2, + D => rst, + PRE => rst, + Q => rstsync +); + +fd_rstsync: FD +port map( + C => clkx2, + D => rstsync, + Q => rstsync_q +); + +fd_rstp: FD +port map( + C => clkx2, + D => rstsync_q, + Q => rstp +); + +mux <= db(14 downto 0) when (sync = '0') else db(29 downto 15); + +process(clkx2, rstp) +begin + if(rstp = '1')then + sync <= '0'; + ra <= (others => '0'); + elsif(clkx2 = '1' and clkx2'event)then + sync <= not sync; + if(sync = '1')then + ra <= ra_d; + db <= dataint; + end if; + dataout <= mux; + end if; +end process; +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd new file mode 100644 index 0000000..e7d15c0 --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dram16xn.vhd @@ -0,0 +1,51 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity dram16xn is +generic( + DATA_WIDTH : integer := 20 +); +port ( + clk : in STD_LOGIC; + write_en : in STD_LOGIC; + address : in STD_LOGIC_VECTOR(3 downto 0); + address_dp : in STD_LOGIC_VECTOR(3 downto 0); + data_in : in STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0); + o_data_out : out STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0); + o_data_out_dp : out STD_LOGIC_VECTOR(DATA_WIDTH - 1 downto 0) +); +end dram16xn; +------------------------------------------------------------------------------- +architecture Behavioral of dram16xn is +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +bit_gen: for i in 0 to DATA_WIDTH-1 generate +begin + ram_inst: RAM16X1D + port map( + D => data_in(i), --insert input signal + WE => write_en, --insert Write Enable signal + WCLK => clk, --insert Write Clock signal + A0 => address(0), --insert Address 0 signal port SPO + A1 => address(1), --insert Address 1 signal port SPO + A2 => address(2), --insert Address 2 signal port SPO + A3 => address(3), --insert Address 3 signal port SPO + DPRA0 => address_dp(0), --insert Address 0 signal dual port DPO + DPRA1 => address_dp(1), --insert Address 1 signal dual port DPO + DPRA2 => address_dp(2), --insert Address 2 signal dual port DPO + DPRA3 => address_dp(3), --insert Address 3 signal dual port DPO + SPO => o_data_out(i), --insert output signal SPO + DPO => o_data_out_dp(i) --insert output signal DPO + ); +end generate; +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dvi_encoder.vhd b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dvi_encoder.vhd new file mode 100644 index 0000000..6f2154a --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/dvi_encoder.vhd @@ -0,0 +1,75 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +---------------------------------------------------------------------------------- +entity dvi_encoder is +port ( + clkin : in STD_LOGIC; -- pixel clock + rstin : in STD_LOGIC; -- reset + blue_din : in STD_LOGIC_VECTOR(7 downto 0); -- Blue data in + green_din : in STD_LOGIC_VECTOR(7 downto 0); -- Green data in + red_din : in STD_LOGIC_VECTOR(7 downto 0); -- Red data in + hsync : in STD_LOGIC; -- hsync data + vsync : in STD_LOGIC; -- vsync data + de : in STD_LOGIC; -- data enable + blue_dout : out STD_LOGIC_VECTOR(9 downto 0); + green_dout : out STD_LOGIC_VECTOR(9 downto 0); + red_dout : out STD_LOGIC_VECTOR(9 downto 0) +); +end dvi_encoder; +------------------------------------------------------------------------------- +architecture Behavioral of dvi_encoder is +------------------------------------------------------------------------------- +constant net_gnd : STD_LOGIC := '0'; +component tmds_encoder is +port ( + clk_in : in STD_LOGIC; + rst_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(7 downto 0); + c0_in : in STD_LOGIC; + c1_in : in STD_LOGIC; + de_in : in STD_LOGIC; + data_out : out STD_LOGIC_VECTOR(9 downto 0) +); +end component; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +encb_inst: tmds_encoder +port map( + clk_in => clkin, + rst_in => rstin, + data_in => blue_din, + c0_in => hsync, + c1_in => vsync, + de_in => de, + data_out => blue_dout +); + +encg_inst: tmds_encoder +port map( + clk_in => clkin, + rst_in => rstin, + data_in => green_din, + c0_in => net_gnd, + c1_in => net_gnd, + de_in => de, + data_out => green_dout +); + +encr_inst: tmds_encoder +port map( + clk_in => clkin, + rst_in => rstin, + data_in => red_din, + c0_in => net_gnd, + c1_in => net_gnd, + de_in => de, + data_out => red_dout +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd new file mode 100644 index 0000000..44d7c3c --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes.vhd @@ -0,0 +1,79 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity serdes is +port ( + clk_in : in STD_LOGIC; + clk_dv_in : in STD_LOGIC; + reset_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(4 downto 0); + data_out : out STD_LOGIC +); +end serdes; +------------------------------------------------------------------------------- +architecture Behavioral of serdes is +------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +OSERDESE2_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "SDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "SDR", -- "BUF", "SDR" or "DDR" + -- DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + -- DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 5, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "MASTER", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => data_out, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => open, + SHIFTOUT2 => open, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => data_in(0), + D2 => data_in(1), + D3 => data_in(2), + D4 => data_in(3), + D5 => data_in(4), + D6 => net_gnd, + D7 => net_gnd, + D8 => net_gnd, + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => net_gnd, + SHIFTIN2 => net_gnd, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes_ddr.vhd b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes_ddr.vhd new file mode 100644 index 0000000..df0dd2c --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/serdes_ddr.vhd @@ -0,0 +1,128 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity serdes_ddr is +port ( + clk_in : in STD_LOGIC; + clk_dv_in : in STD_LOGIC; + reset_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(9 downto 0); + data_out : out STD_LOGIC +); +end serdes_ddr; +------------------------------------------------------------------------------- +architecture Behavioral of serdes_ddr is +------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +-- Signals +signal shift_a : STD_LOGIC; +signal shift_b : STD_LOGIC; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +OSERDESE2_m_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 10, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "MASTER", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => data_out, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => open, + SHIFTOUT2 => open, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => data_in(0), + D2 => data_in(1), + D3 => data_in(2), + D4 => data_in(3), + D5 => data_in(4), + D6 => data_in(5), + D7 => data_in(6), + D8 => data_in(7), + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => shift_a, + SHIFTIN2 => shift_b, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); + +OSERDESE2_s_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 10, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "SLAVE", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => open, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => shift_a, + SHIFTOUT2 => shift_b, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => net_gnd, + D2 => net_gnd, + D3 => data_in(8), + D4 => data_in(9), + D5 => net_gnd, + D6 => net_gnd, + D7 => net_gnd, + D8 => net_gnd, + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => net_gnd, + SHIFTIN2 => net_gnd, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/tmds_encoder.vhd b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/tmds_encoder.vhd new file mode 100644 index 0000000..468dddb --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/hdl/tmds_encoder.vhd @@ -0,0 +1,180 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +---------------------------------------------------------------------------------- +entity tmds_encoder is +port ( + clk_in : in STD_LOGIC; + rst_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(7 downto 0); + c0_in : in STD_LOGIC; + c1_in : in STD_LOGIC; + de_in : in STD_LOGIC; + data_out : out STD_LOGIC_VECTOR(9 downto 0) +); +end tmds_encoder; +------------------------------------------------------------------------------- +architecture Behavioral of tmds_encoder is +------------------------------------------------------------------------------- +signal n1d : UNSIGNED(3 downto 0); -- number of 1s in din +signal din_q : STD_LOGIC_VECTOR(7 downto 0); +signal decision_a : STD_LOGIC; +signal decision_b : STD_LOGIC; +signal decision_c : STD_LOGIC; +signal q_m : STD_LOGIC_VECTOR(8 downto 0); +signal n1q_m : UNSIGNED(3 downto 0); -- number of 1s and 0s for q_m +signal n0q_m : UNSIGNED(3 downto 0); +signal cnt : UNSIGNED(4 downto 0); -- disparity counter, MSB is the sign bit + +constant CTRLTOKEN0 : STD_LOGIC_VECTOR(9 downto 0) := b"1101010100"; +constant CTRLTOKEN1 : STD_LOGIC_VECTOR(9 downto 0) := b"0010101011"; +constant CTRLTOKEN2 : STD_LOGIC_VECTOR(9 downto 0) := b"0101010100"; +constant CTRLTOKEN3 : STD_LOGIC_VECTOR(9 downto 0) := b"1010101011"; + +signal de_q : STD_LOGIC; +signal de_reg : STD_LOGIC; +signal c0_q : STD_LOGIC; +signal c1_q : STD_LOGIC; +signal c_reg : STD_LOGIC_VECTOR(1 downto 0); +signal q_m_reg : STD_LOGIC_VECTOR(8 downto 0); +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + n1d <= + resize(UNSIGNED(data_in(0 downto 0)),4) + + resize(UNSIGNED(data_in(1 downto 1)),4) + + resize(UNSIGNED(data_in(2 downto 2)),4) + + resize(UNSIGNED(data_in(3 downto 3)),4) + + resize(UNSIGNED(data_in(4 downto 4)),4) + + resize(UNSIGNED(data_in(5 downto 5)),4) + + resize(UNSIGNED(data_in(6 downto 6)),4) + + resize(UNSIGNED(data_in(7 downto 7)),4); + din_q <= data_in; + end if; +end process; + +--assign decision1 = (n1d > 4'h4) | ((n1d == 4'h4) & (din_q(0] == 1'b0)); +decision_a <= '1' when ((n1d > to_unsigned(4,4)) or ((n1d = to_unsigned(4,4)) and (din_q(0) = '0'))) else '0'; + +q_m(0) <= din_q(0); +q_m(1) <= (q_m(0) xnor din_q(1)) when (decision_a = '1') else (q_m(0) xor din_q(1)); +q_m(2) <= (q_m(1) xnor din_q(2)) when (decision_a = '1') else (q_m(1) xor din_q(2)); +q_m(3) <= (q_m(2) xnor din_q(3)) when (decision_a = '1') else (q_m(2) xor din_q(3)); +q_m(4) <= (q_m(3) xnor din_q(4)) when (decision_a = '1') else (q_m(3) xor din_q(4)); +q_m(5) <= (q_m(4) xnor din_q(5)) when (decision_a = '1') else (q_m(4) xor din_q(5)); +q_m(6) <= (q_m(5) xnor din_q(6)) when (decision_a = '1') else (q_m(5) xor din_q(6)); +q_m(7) <= (q_m(6) xnor din_q(7)) when (decision_a = '1') else (q_m(6) xor din_q(7)); +q_m(8) <= '0' when (decision_a = '1') else '1'; +------------------------------------------------------------------------------- +-- Stage 2: 9 bit -> 10 bit +-- Refer to DVI 1.0 Specification, page 29, Figure 3-5 +------------------------------------------------------------------------------- +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + n1q_m <= + resize(UNSIGNED(q_m(0 downto 0)),4) + + resize(UNSIGNED(q_m(1 downto 1)),4) + + resize(UNSIGNED(q_m(2 downto 2)),4) + + resize(UNSIGNED(q_m(3 downto 3)),4) + + resize(UNSIGNED(q_m(4 downto 4)),4) + + resize(UNSIGNED(q_m(5 downto 5)),4) + + resize(UNSIGNED(q_m(6 downto 6)),4) + + resize(UNSIGNED(q_m(7 downto 7)),4); + n0q_m <= + to_unsigned(8,4) - ( + resize(UNSIGNED(q_m(0 downto 0)),4) + + resize(UNSIGNED(q_m(1 downto 1)),4) + + resize(UNSIGNED(q_m(2 downto 2)),4) + + resize(UNSIGNED(q_m(3 downto 3)),4) + + resize(UNSIGNED(q_m(4 downto 4)),4) + + resize(UNSIGNED(q_m(5 downto 5)),4) + + resize(UNSIGNED(q_m(6 downto 6)),4) + + resize(UNSIGNED(q_m(7 downto 7)),4)); + end if; +end process; + +decision_b <= '1' when ((cnt = to_unsigned(0,5)) or (n1q_m = n0q_m)) else '0'; +------------------------------------------------------------------------------- +-- [(cnt > 0) and (N1q_m > N0q_m)] or [(cnt < 0) and (N0q_m > N1q_m)] +------------------------------------------------------------------------------- +decision_c <= '1' when ((cnt(4) = '0') and (n1q_m > n0q_m)) or ((cnt(4) = '1') and (n0q_m > n1q_m)) else '0'; +------------------------------------------------------------------------------- +-- pipe line alignment +------------------------------------------------------------------------------- +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + de_q <= de_in; + de_reg <= de_q; + c0_q <= c0_in; + c1_q <= c1_in; + q_m_reg <= q_m; + c_reg <= c1_q & c0_q; + end if; +end process; +------------------------------------------------------------------------------- +-- 10-bit out +-- disparity counter +------------------------------------------------------------------------------- +process(clk_in, rst_in) +begin + if(rst_in = '1')then + data_out <= (others => '0'); + cnt <= (others => '0'); + elsif(clk_in = '1' and clk_in'event)then + if(de_reg = '1')then + if(decision_b = '1')then + data_out(9) <= not q_m_reg(8); + data_out(8) <= q_m_reg(8); + if(q_m_reg(8) = '1')then + data_out(7 downto 0) <= q_m_reg(7 downto 0); + else + data_out(7 downto 0) <= not q_m_reg(7 downto 0); + end if; + if(q_m_reg(8) = '0')then + cnt <= cnt + resize(n0q_m,5) - resize(n1q_m,5); + else + cnt <= cnt + resize(n1q_m,5) - resize(n0q_m,5); + end if; + else + if(decision_c = '1')then + data_out(9) <= '1'; + data_out(8) <= q_m_reg(8); + data_out(7 downto 0) <= not q_m_reg(7 downto 0); + if(q_m_reg(8) = '1')then + cnt <= cnt + to_unsigned(2,5) + (resize(n0q_m,5) - resize(n1q_m,5)); + else + cnt <= cnt + (resize(n0q_m,5) - resize(n1q_m,5)); + end if; + else + data_out(9) <= '0'; + data_out(8) <= q_m_reg(8); + data_out(7 downto 0) <= q_m_reg(7 downto 0); + if(q_m_reg(8) = '0')then + cnt <= cnt - to_unsigned(2,5) + (resize(n1q_m,5) - resize(n0q_m,5)); + else + cnt <= cnt + (resize(n1q_m,5) - resize(n0q_m,5)); + end if; + end if; + end if; + else + case(c_reg)is + when "00" => data_out <= CTRLTOKEN0; + when "01" => data_out <= CTRLTOKEN1; + when "10" => data_out <= CTRLTOKEN2; + when others => data_out <= CTRLTOKEN3; + end case; + cnt <= (others => '0'); + end if; + end if; +end process; +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/src/serdes_ddr.vhd b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/src/serdes_ddr.vhd new file mode 100644 index 0000000..df0dd2c --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/src/serdes_ddr.vhd @@ -0,0 +1,128 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VCOMPONENTS.ALL; +---------------------------------------------------------------------------------- +entity serdes_ddr is +port ( + clk_in : in STD_LOGIC; + clk_dv_in : in STD_LOGIC; + reset_in : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(9 downto 0); + data_out : out STD_LOGIC +); +end serdes_ddr; +------------------------------------------------------------------------------- +architecture Behavioral of serdes_ddr is +------------------------------------------------------------------------------- +-- Constants +constant net_gnd : STD_LOGIC := '0'; +constant net_vcc : STD_LOGIC := '1'; +-- Signals +signal shift_a : STD_LOGIC; +signal shift_b : STD_LOGIC; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +OSERDESE2_m_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 10, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "MASTER", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => data_out, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => open, + SHIFTOUT2 => open, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => data_in(0), + D2 => data_in(1), + D3 => data_in(2), + D4 => data_in(3), + D5 => data_in(4), + D6 => data_in(5), + D7 => data_in(6), + D8 => data_in(7), + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => shift_a, + SHIFTIN2 => shift_b, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); + +OSERDESE2_s_inst : OSERDESE2 +generic map ( + DATA_RATE_OQ => "DDR", -- "SDR" or "DDR" + DATA_RATE_TQ => "DDR", -- "BUF", "SDR" or "DDR" + DATA_WIDTH => 10, -- Parallel data width (2-8,10) + INIT_OQ => '0', -- Initial value of OQ output (0/1) + INIT_TQ => '0', -- Initial value of TQ output (0/1) + SERDES_MODE => "SLAVE", -- "MASTER" or "SLAVE" + SRVAL_OQ => '0', -- OQ output value when SR is used (0/1) + SRVAL_TQ => '0', -- TQ output value when SR is used (0/1) + TBYTE_CTL => "FALSE", -- Enable tristate byte operation ("TRUE" or "FALSE") + TBYTE_SRC => "FALSE", -- Tristate byte source ("TRUE" or "FALSE") + TRISTATE_WIDTH => 1 -- 3-state converter width (1 or 4) +) +port map ( + OFB => open, -- 1-bit output: Feedback path for data output + OQ => open, -- 1-bit output: Data path output + -- SHIFTOUT1/SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each) + SHIFTOUT1 => shift_a, + SHIFTOUT2 => shift_b, + TBYTEOUT => open, -- 1-bit output: Byte group tristate output + TFB => open, -- 1-bit output: 3-state control output + TQ => open, -- 1-bit output: 3-state control output + CLK => clk_in, -- 1-bit input: High speed clock input + CLKDIV => clk_dv_in, -- 1-bit input: Divided clock input + -- D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each) + D1 => net_gnd, + D2 => net_gnd, + D3 => data_in(8), + D4 => data_in(9), + D5 => net_gnd, + D6 => net_gnd, + D7 => net_gnd, + D8 => net_gnd, + OCE => net_vcc, -- 1-bit input: Output data clock enable input + RST => reset_in, -- 1-bit input: Reset input + -- SHIFTIN1/SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each) + SHIFTIN1 => net_gnd, + SHIFTIN2 => net_gnd, + -- T1 - T4: 1-bit (each) input: Parallel 3-state inputs + T1 => net_gnd, + T2 => net_gnd, + T3 => net_gnd, + T4 => net_gnd, + TBYTEIN => net_gnd, -- 1-bit input: Byte group tristate input + TCE => net_gnd -- 1-bit input: 3-state clock enable input +); +-------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl new file mode 100644 index 0000000..02321a4 --- /dev/null +++ b/zynqberrydemo3/ip_lib/Video_IO_2_HDMI_TMDS_1.0/xgui/Video_IO_2_HDMI_TMDS_v1_0.tcl @@ -0,0 +1,119 @@ + +# Loading additional proc with user specified bodies to compute parameter values. +source [file join [file dirname [file dirname [info script]]] gui/Video_IO_2_HDMI_TMDS_v1_0.gtcl] + +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + #Adding Group + set Clocking [ipgui::add_group $IPINST -name "Clocking" -parent ${Page_0} -display_name {Clocking Options}] + ipgui::add_param $IPINST -name "C_INT_CLOCKING" -parent ${Clocking} + ipgui::add_param $IPINST -name "C_VIDEO_MODE" -parent ${Clocking} -widget comboBox + + #Adding Group + set Pins_swap [ipgui::add_group $IPINST -name "Pins swap" -parent ${Page_0}] + ipgui::add_param $IPINST -name "C_CLK_SWAP" -parent ${Pins_swap} + ipgui::add_param $IPINST -name "C_D0_SWAP" -parent ${Pins_swap} + ipgui::add_param $IPINST -name "C_D1_SWAP" -parent ${Pins_swap} + ipgui::add_param $IPINST -name "C_D2_SWAP" -parent ${Pins_swap} + + + +} + +proc update_PARAM_VALUE.C_VIDEO_MODE { PARAM_VALUE.C_VIDEO_MODE PARAM_VALUE.C_INT_CLOCKING } { + # Procedure called to update C_VIDEO_MODE when any of the dependent parameters in the arguments change + + set C_VIDEO_MODE ${PARAM_VALUE.C_VIDEO_MODE} + set C_INT_CLOCKING ${PARAM_VALUE.C_INT_CLOCKING} + set values(C_INT_CLOCKING) [get_property value $C_INT_CLOCKING] + if { [gen_USERPARAMETER_C_VIDEO_MODE_ENABLEMENT $values(C_INT_CLOCKING)] } { + set_property enabled true $C_VIDEO_MODE + } else { + set_property enabled false $C_VIDEO_MODE + } +} + +proc validate_PARAM_VALUE.C_VIDEO_MODE { PARAM_VALUE.C_VIDEO_MODE } { + # Procedure called to validate C_VIDEO_MODE + return true +} + +proc update_PARAM_VALUE.C_CLK_SWAP { PARAM_VALUE.C_CLK_SWAP } { + # Procedure called to update C_CLK_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_CLK_SWAP { PARAM_VALUE.C_CLK_SWAP } { + # Procedure called to validate C_CLK_SWAP + return true +} + +proc update_PARAM_VALUE.C_D0_SWAP { PARAM_VALUE.C_D0_SWAP } { + # Procedure called to update C_D0_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D0_SWAP { PARAM_VALUE.C_D0_SWAP } { + # Procedure called to validate C_D0_SWAP + return true +} + +proc update_PARAM_VALUE.C_D1_SWAP { PARAM_VALUE.C_D1_SWAP } { + # Procedure called to update C_D1_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D1_SWAP { PARAM_VALUE.C_D1_SWAP } { + # Procedure called to validate C_D1_SWAP + return true +} + +proc update_PARAM_VALUE.C_D2_SWAP { PARAM_VALUE.C_D2_SWAP } { + # Procedure called to update C_D2_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D2_SWAP { PARAM_VALUE.C_D2_SWAP } { + # Procedure called to validate C_D2_SWAP + return true +} + +proc update_PARAM_VALUE.C_INT_CLOCKING { PARAM_VALUE.C_INT_CLOCKING } { + # Procedure called to update C_INT_CLOCKING when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_INT_CLOCKING { PARAM_VALUE.C_INT_CLOCKING } { + # Procedure called to validate C_INT_CLOCKING + return true +} + + +proc update_MODELPARAM_VALUE.C_CLK_SWAP { MODELPARAM_VALUE.C_CLK_SWAP PARAM_VALUE.C_CLK_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_CLK_SWAP}] ${MODELPARAM_VALUE.C_CLK_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D0_SWAP { MODELPARAM_VALUE.C_D0_SWAP PARAM_VALUE.C_D0_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D0_SWAP}] ${MODELPARAM_VALUE.C_D0_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D1_SWAP { MODELPARAM_VALUE.C_D1_SWAP PARAM_VALUE.C_D1_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D1_SWAP}] ${MODELPARAM_VALUE.C_D1_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D2_SWAP { MODELPARAM_VALUE.C_D2_SWAP PARAM_VALUE.C_D2_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D2_SWAP}] ${MODELPARAM_VALUE.C_D2_SWAP} +} + +proc update_MODELPARAM_VALUE.C_INT_CLOCKING { MODELPARAM_VALUE.C_INT_CLOCKING PARAM_VALUE.C_INT_CLOCKING } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_INT_CLOCKING}] ${MODELPARAM_VALUE.C_INT_CLOCKING} +} + +proc update_MODELPARAM_VALUE.C_VIDEO_MODE { MODELPARAM_VALUE.C_VIDEO_MODE PARAM_VALUE.C_VIDEO_MODE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_VIDEO_MODE}] ${MODELPARAM_VALUE.C_VIDEO_MODE} +} + diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/bd/bd.tcl b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/bd/bd.tcl new file mode 100644 index 0000000..4804aeb --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/component.xml b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/component.xml new file mode 100644 index 0000000..dc899b3 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/component.xml @@ -0,0 +1,1973 @@ + + + digilentinc.com + user + axi_i2s_adi + 1.2 + + + S00_AXI + + + + + + + + + AWADDR + + + s00_axi_awaddr + + + + + AWPROT + + + s00_axi_awprot + + + + + AWVALID + + + s00_axi_awvalid + + + + + AWREADY + + + s00_axi_awready + + + + + WDATA + + + s00_axi_wdata + + + + + WSTRB + + + s00_axi_wstrb + + + + + WVALID + + + s00_axi_wvalid + + + + + WREADY + + + s00_axi_wready + + + + + BRESP + + + s00_axi_bresp + + + + + BVALID + + + s00_axi_bvalid + + + + + BREADY + + + s00_axi_bready + + + + + ARADDR + + + s00_axi_araddr + + + + + ARPROT + + + s00_axi_arprot + + + + + ARVALID + + + s00_axi_arvalid + + + + + ARREADY + + + s00_axi_arready + + + + + RDATA + + + s00_axi_rdata + + + + + RRESP + + + s00_axi_rresp + + + + + RVALID + + + s00_axi_rvalid + + + + + RREADY + + + s00_axi_rready + + + + + + WIZ.DATA_WIDTH + 32 + + + WIZ.NUM_REG + 12 + + + SUPPORTS_NARROW_BURST + 0 + + + + + S00_AXI_RST + + + + + + + RST + + + s00_axi_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + S00_AXI_CLK + + + + + + + CLK + + + s00_axi_aclk + + + + + + ASSOCIATED_BUSIF + S00_AXI + + + ASSOCIATED_RESET + s00_axi_aresetn + + + + + S_AXIS + + + + + + + TVALID + + + S_AXIS_TVALID + + + + + TLAST + + + S_AXIS_TLAST + + + + + TDATA + + + S_AXIS_TDATA + + + + + TREADY + + + S_AXIS_TREADY + + + + + + + optional + true + + + + + + S_AXIS_CLK + + + + + + + CLK + + + S_AXIS_ACLK + + + + + + ASSOCIATED_BUSIF + S_AXIS + + + + + + optional + true + + + + + + M_AXIS + + + + + + + TVALID + + + M_AXIS_TVALID + + + + + TLAST + + + M_AXIS_TLAST + + + + + TDATA + + + M_AXIS_TDATA + + + + + TKEEP + + + M_AXIS_TKEEP + + + + + TREADY + + + M_AXIS_TREADY + + + + + + + optional + true + + + + + + M_AXIS_CLK + + + + + + + CLK + + + M_AXIS_ACLK + + + + + + ASSOCIATED_BUSIF + M_AXIS + + + + + + optional + true + + + + + + DMA_TX_REQ + + + + + + + TUSER + + + DMA_REQ_TX_DRTYPE + + + + + TVALID + + + DMA_REQ_TX_DRVALID + + + + + TLAST + + + DMA_REQ_TX_DRLAST + + + + + TREADY + + + DMA_REQ_TX_DRREADY + + + + + + + optional + false + + + + + + DMA_TX_ACK + + + + + + + TUSER + + + DMA_REQ_TX_DATYPE + + + + + TVALID + + + DMA_REQ_TX_DAVALID + + + + + TREADY + + + DMA_REQ_TX_DAREADY + + + + + + + optional + false + + + + + + DMA_RX_REQ + + + + + + + TUSER + + + DMA_REQ_RX_DRTYPE + + + + + TVALID + + + DMA_REQ_RX_DRVALID + + + + + TLAST + + + DMA_REQ_RX_DRLAST + + + + + TREADY + + + DMA_REQ_RX_DRREADY + + + + + + + optional + false + + + + + + DMA_RX_ACK + + + + + + + TUSER + + + DMA_REQ_RX_DATYPE + + + + + TVALID + + + DMA_REQ_RX_DAVALID + + + + + TREADY + + + DMA_REQ_RX_DAREADY + + + + + + + optional + false + + + + + + DMA_TX_CLK + + + + + + + CLK + + + DMA_REQ_TX_ACLK + + + + + + ASSOCIATED_BUSIF + DMA_TX_REQ:DMA_TX_ACK + + + ASSOCIATED_RESET + DMA_REQ_TX_RSTN + + + + + + optional + false + + + + + + DMA_TX_RST + + + + + + + RST + + + DMA_REQ_TX_RSTN + + + + + + POLARITY + ACTIVE_LOW + + + + + + optional + false + + + + + + DMA_RX_CLK + + + + + + + CLK + + + DMA_REQ_RX_ACLK + + + + + + ASSOCIATED_BUSIF + DMA_RX_REQ:DMA_RX_ACK + + + ASSOCIATED_RESET + DMA_REQ_RX_RSTN + + + + + + optional + false + + + + + + DMA_RX_RST + + + + + + + RST + + + DMA_REQ_RX_RSTN + + + + + + POLARITY + ACTIVE_LOW + + + + + + optional + false + + + + + + + + S00_AXI + + S00_AXI_reg + 0 + 4096 + 32 + register + + + OFFSET_BASE_PARAM + C_S00_AXI_BASEADDR + + + OFFSET_HIGH_PARAM + C_S00_AXI_HIGHADDR + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axi_i2s_adi_v1_2 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + c5577600 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axi_i2s_adi_v1_2 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + c5577600 + + + + + xilinx_softwaredriver + Software Driver + :vivado.xilinx.com:sw.driver + + xilinx_softwaredriver_view_fileset + + + + viewChecksum + d0fc4f4c + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + e9171d0c + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + DATA_CLK_I + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + BCLK_O + + out + + 0 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + LRCLK_O + + out + + 0 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + SDATA_O + + out + + 0 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + SDATA_I + + in + + 0 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + MUTEN_O + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_ACLK + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_TREADY + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_TDATA + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_TLAST + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + S_AXIS_TVALID + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_ACLK + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TREADY + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TDATA + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TLAST + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TVALID + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + M_AXIS_TKEEP + + out + + 3 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_ACLK + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_RSTN + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DAVALID + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DATYPE + + in + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DAREADY + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DRVALID + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DRTYPE + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DRLAST + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_TX_DRREADY + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_ACLK + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_RSTN + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DAVALID + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DATYPE + + in + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DAREADY + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DRVALID + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DRTYPE + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DRLAST + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + DMA_REQ_RX_DRREADY + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_awaddr + + in + + 5 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_awprot + + in + + 2 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_awvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_awready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_wdata + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_wstrb + + in + + 3 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_wvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_wready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_bresp + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_bvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_bready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_araddr + + in + + 5 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_arprot + + in + + 2 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_arvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_arready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_rdata + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_rresp + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_rvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_rready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_aclk + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axi_aresetn + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_S00_AXI_DATA_WIDTH + C S00 AXI DATA WIDTH + Width of S_AXI data bus + 32 + + + C_S00_AXI_ADDR_WIDTH + C S00 AXI ADDR WIDTH + Width of S_AXI address bus + 6 + + + C_SLOT_WIDTH + C Slot Width + 24 + + + C_LRCLK_POL + C Lrclk Pol + 0 + + + C_BCLK_POL + C Bclk Pol + 0 + + + C_DMA_TYPE + C Dma Type + 0 + + + C_NUM_CH + C Num Ch + 1 + + + C_HAS_TX + C Has Tx + 1 + + + C_HAS_RX + C Has Rx + 1 + + + + + + choices_0 + 32 + + + choices_1 + 1 + 0 + + + choices_2 + 0 + 1 + + + choices_3 + 0 + 1 + + + choices_4 + 0 + 1 + + + choices_5 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + choices_6 + 0 + 1 + + + choices_7 + 0 + 1 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axi_i2s_adi_v1_2.vhd + vhdlSource + CHECKSUM_c1ef5310 + + + hdl/i2s_rx.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/i2s_tx.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/i2s_clkgen.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/fifo_synchronizer.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/i2s_controller.vhd + vhdlSource + axi_i2s_adi_v1_00_a + + + hdl/adi_common/axi_ctrlif.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/adi_common/axi_streaming_dma_rx_fifo.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/adi_common/pl330_dma_fifo.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/adi_common/axi_streaming_dma_tx_fifo.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/adi_common/dma_fifo.vhd + vhdlSource + adi_common_v1_00_a + + + hdl/axi_i2s_adi_S_AXI.vhd + vhdlSource + CHECKSUM_8dec4efa + xil_defaultlib + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axi_i2s_adi_v1_2.vhd + vhdlSource + + + hdl/i2s_rx.vhd + vhdlSource + + + hdl/i2s_tx.vhd + vhdlSource + + + hdl/i2s_clkgen.vhd + vhdlSource + + + hdl/fifo_synchronizer.vhd + vhdlSource + + + hdl/i2s_controller.vhd + vhdlSource + + + hdl/adi_common/axi_ctrlif.vhd + vhdlSource + + + hdl/adi_common/axi_streaming_dma_rx_fifo.vhd + vhdlSource + + + hdl/adi_common/pl330_dma_fifo.vhd + vhdlSource + + + hdl/adi_common/axi_streaming_dma_tx_fifo.vhd + vhdlSource + + + hdl/adi_common/dma_fifo.vhd + vhdlSource + + + hdl/axi_i2s_adi_S_AXI.vhd + vhdlSource + + + + xilinx_softwaredriver_view_fileset + + drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.mdd + mdd + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl + tclSource + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/src/Makefile + unknown + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h + cSource + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c + cSource + USED_IN_hw_handoff + + + drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c + cSource + USED_IN_hw_handoff + + + + xilinx_xpgui_view_fileset + + xgui/axi_i2s_adi_v1_2.tcl + tclSource + XGUI_VERSION_2 + CHECKSUM_70145134 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + Sends and receives audio data to/from an ADI I2S audio codec + + + C_S00_AXI_BASEADDR + AXI BASEADDR + 0xFFFFFFFF + + + + false + + + + + + C_S00_AXI_HIGHADDR + AXI HIGHADDR + 0x00000000 + + + + false + + + + + + Component_Name + axi_i2s_adi_v1_2 + + + C_LRCLK_POL + LRCLK Polarity + 0 + + + C_BCLK_POL + BCLK Polarity + 0 + + + C_DMA_TYPE + DMA Type + 0 + + + C_HAS_TX + Enable Audio Output + 1 + + + C_HAS_RX + Enable Audio Input + 1 + + + + + + virtex7 + qvirtex7 + kintex7 + kintex7l + qkintex7 + qkintex7l + artix7 + artix7l + aartix7 + qartix7 + zynq + qzynq + azynq + virtexu + kintexu + + + AXI_Peripheral + + AXI I2S Audio + Digilent + http://www.digilentinc.com + 1 + + natinst.com:user:axi_i2s_adi:1.2 + + 2015-03-05T05:38:11Z + + C:/sam_work/Vivado_projects/14_4/ip_repo/axi_i2s_adi_1.2 + C:/sam_work/Vivado_projects/14_4/ip_repo/axi_i2s_adi_1.2 + + + + 2014.4 + + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl new file mode 100644 index 0000000..25ef87e --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/data/axi_i2s_adi.tcl @@ -0,0 +1,5 @@ + + +proc generate {drv_handle} { + xdefine_include_file $drv_handle "xparameters.h" "axi_i2s_adi" "NUM_INSTANCES" "DEVICE_ID" "C_S00_AXI_BASEADDR" "C_S00_AXI_HIGHADDR" +} diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c new file mode 100644 index 0000000..f950fdd --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.c @@ -0,0 +1,6 @@ + + +/***************************** Include Files *******************************/ +#include "axi_i2s_adi.h" + +/************************** Function Definitions ***************************/ diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h new file mode 100644 index 0000000..d13f29d --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi.h @@ -0,0 +1,87 @@ + +#ifndef AXI_I2S_ADI_H +#define AXI_I2S_ADI_H + + +/****************** Include Files ********************/ +#include "xil_types.h" +#include "xstatus.h" + +#define AXI_I2S_ADI_S00_AXI_SLV_REG0_OFFSET 0 +#define AXI_I2S_ADI_S00_AXI_SLV_REG1_OFFSET 4 +#define AXI_I2S_ADI_S00_AXI_SLV_REG2_OFFSET 8 +#define AXI_I2S_ADI_S00_AXI_SLV_REG3_OFFSET 12 +#define AXI_I2S_ADI_S00_AXI_SLV_REG4_OFFSET 16 +#define AXI_I2S_ADI_S00_AXI_SLV_REG5_OFFSET 20 +#define AXI_I2S_ADI_S00_AXI_SLV_REG6_OFFSET 24 +#define AXI_I2S_ADI_S00_AXI_SLV_REG7_OFFSET 28 +#define AXI_I2S_ADI_S00_AXI_SLV_REG8_OFFSET 32 +#define AXI_I2S_ADI_S00_AXI_SLV_REG9_OFFSET 36 +#define AXI_I2S_ADI_S00_AXI_SLV_REG10_OFFSET 40 +#define AXI_I2S_ADI_S00_AXI_SLV_REG11_OFFSET 44 + + +/**************************** Type Definitions *****************************/ +/** + * + * Write a value to a AXI_I2S_ADI register. A 32 bit write is performed. + * If the component is implemented in a smaller width, only the least + * significant data is written. + * + * @param BaseAddress is the base address of the AXI_I2S_ADIdevice. + * @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 AXI_I2S_ADI_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data) + * + */ +#define AXI_I2S_ADI_mWriteReg(BaseAddress, RegOffset, Data) \ + Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data)) + +/** + * + * Read a value from a AXI_I2S_ADI register. A 32 bit read is performed. + * If the component 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 AXI_I2S_ADI device. + * @param RegOffset is the register offset from the base to write to. + * + * @return Data is the data from the register. + * + * @note + * C-style signature: + * u32 AXI_I2S_ADI_mReadReg(u32 BaseAddress, unsigned RegOffset) + * + */ +#define AXI_I2S_ADI_mReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/************************** Function Prototypes ****************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_I2S_ADI instance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_I2S_ADI_Reg_SelfTest(void * baseaddr_p); + +#endif // AXI_I2S_ADI_H diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c new file mode 100644 index 0000000..3fe1e5a --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/drivers/axi_i2s_adi_v1_0/src/axi_i2s_adi_selftest.c @@ -0,0 +1,60 @@ + +/***************************** Include Files *******************************/ +#include "axi_i2s_adi.h" +#include "xparameters.h" +#include "stdio.h" +#include "xil_io.h" + +/************************** Constant Definitions ***************************/ +#define READ_WRITE_MUL_FACTOR 0x10 + +/************************** Function Definitions ***************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_I2S_ADIinstance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_I2S_ADI_Reg_SelfTest(void * baseaddr_p) +{ + u32 baseaddr; + int write_loop_index; + int read_loop_index; + int Index; + + baseaddr = (u32) baseaddr_p; + + xil_printf("******************************\n\r"); + xil_printf("* User Peripheral Self Test\n\r"); + xil_printf("******************************\n\n\r"); + + /* + * Write to user logic slave module register(s) and read back + */ + xil_printf("User logic slave module test...\n\r"); + + for (write_loop_index = 0 ; write_loop_index < 4; write_loop_index++) + AXI_I2S_ADI_mWriteReg (baseaddr, write_loop_index*4, (write_loop_index+1)*READ_WRITE_MUL_FACTOR); + for (read_loop_index = 0 ; read_loop_index < 4; read_loop_index++) + if ( AXI_I2S_ADI_mReadReg (baseaddr, read_loop_index*4) != (read_loop_index+1)*READ_WRITE_MUL_FACTOR){ + xil_printf ("Error reading register value at address %x\n", (int)baseaddr + read_loop_index*4); + return XST_FAILURE; + } + + xil_printf(" - slave register write/read passed\n\n\r"); + + return XST_SUCCESS; +} diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v new file mode 100644 index 0000000..34f4457 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v @@ -0,0 +1,184 @@ + +`timescale 1 ns / 1 ps + +`include "axi_i2s_adi_v1_2_tb_include.vh" + +// lite_response Type Defines +`define RESPONSE_OKAY 2'b00 +`define RESPONSE_EXOKAY 2'b01 +`define RESP_BUS_WIDTH 2 +`define BURST_TYPE_INCR 2'b01 +`define BURST_TYPE_WRAP 2'b10 + +// AMBA AXI4 Lite Range Constants +`define S00_AXI_MAX_BURST_LENGTH 1 +`define S00_AXI_DATA_BUS_WIDTH 32 +`define S00_AXI_ADDRESS_BUS_WIDTH 32 +`define S00_AXI_MAX_DATA_SIZE (`S00_AXI_DATA_BUS_WIDTH*`S00_AXI_MAX_BURST_LENGTH)/8 + +module axi_i2s_adi_v1_2_tb; + reg tb_ACLK; + reg tb_ARESETn; + + // Create an instance of the example tb + `BD_WRAPPER dut (.ACLK(tb_ACLK), + .ARESETN(tb_ARESETn)); + + // Local Variables + + // AMBA S00_AXI AXI4 Lite Local Reg + reg [`S00_AXI_DATA_BUS_WIDTH-1:0] S00_AXI_rd_data_lite; + reg [`S00_AXI_DATA_BUS_WIDTH-1:0] S00_AXI_test_data_lite [3:0]; + reg [`RESP_BUS_WIDTH-1:0] S00_AXI_lite_response; + reg [`S00_AXI_ADDRESS_BUS_WIDTH-1:0] S00_AXI_mtestAddress; + reg [3-1:0] S00_AXI_mtestProtection_lite; + integer S00_AXI_mtestvectorlite; // Master side testvector + integer S00_AXI_mtestdatasizelite; + integer result_slave_lite; + + + // Simple Reset Generator and test + initial begin + tb_ARESETn = 1'b0; + #500; + // Release the reset on the posedge of the clk. + @(posedge tb_ACLK); + tb_ARESETn = 1'b1; + @(posedge tb_ACLK); + end + + // Simple Clock Generator + initial tb_ACLK = 1'b0; + always #10 tb_ACLK = !tb_ACLK; + + //------------------------------------------------------------------------ + // TEST LEVEL API: CHECK_RESPONSE_OKAY + //------------------------------------------------------------------------ + // Description: + // CHECK_RESPONSE_OKAY(lite_response) + // This task checks if the return lite_response is equal to OKAY + //------------------------------------------------------------------------ + task automatic CHECK_RESPONSE_OKAY; + input [`RESP_BUS_WIDTH-1:0] response; + begin + if (response !== `RESPONSE_OKAY) begin + $display("TESTBENCH ERROR! lite_response is not OKAY", + "\n expected = 0x%h",`RESPONSE_OKAY, + "\n actual = 0x%h",response); + $stop; + end + end + endtask + + //------------------------------------------------------------------------ + // TEST LEVEL API: COMPARE_LITE_DATA + //------------------------------------------------------------------------ + // Description: + // COMPARE_LITE_DATA(expected,actual) + // This task checks if the actual data is equal to the expected data. + // X is used as don't care but it is not permitted for the full vector + // to be don't care. + //------------------------------------------------------------------------ + task automatic COMPARE_LITE_DATA; + input expected; + input actual; + begin + if (expected === 'hx || actual === 'hx) begin + $display("TESTBENCH ERROR! COMPARE_LITE_DATA cannot be performed with an expected or actual vector that is all 'x'!"); + result_slave_lite = 0; + $stop; + end + + if (actual != expected) begin + $display("TESTBENCH ERROR! Data expected is not equal to actual.", + "\nexpected = 0x%h",expected, + "\nactual = 0x%h",actual); + result_slave_lite = 0; + $stop; + end + else + begin + $display("TESTBENCH Passed! Data expected is equal to actual.", + "\n expected = 0x%h",expected, + "\n actual = 0x%h",actual); + end + end + endtask + + task automatic S00_AXI_TEST; + begin + $display("---------------------------------------------------------"); + $display("EXAMPLE TEST : S00_AXI"); + $display("Simple register write and read example"); + $display("---------------------------------------------------------"); + + S00_AXI_mtestvectorlite = 0; + S00_AXI_mtestAddress = `S00_AXI_SLAVE_ADDRESS; + S00_AXI_mtestProtection_lite = 0; + S00_AXI_mtestdatasizelite = `S00_AXI_MAX_DATA_SIZE; + + result_slave_lite = 1; + + for (S00_AXI_mtestvectorlite = 0; S00_AXI_mtestvectorlite <= 3; S00_AXI_mtestvectorlite = S00_AXI_mtestvectorlite + 1) + begin + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.WRITE_BURST_CONCURRENT( S00_AXI_mtestAddress, + S00_AXI_mtestProtection_lite, + S00_AXI_test_data_lite[S00_AXI_mtestvectorlite], + S00_AXI_mtestdatasizelite, + S00_AXI_lite_response); + $display("EXAMPLE TEST %d write : DATA = 0x%h, lite_response = 0x%h",S00_AXI_mtestvectorlite,S00_AXI_test_data_lite[S00_AXI_mtestvectorlite],S00_AXI_lite_response); + CHECK_RESPONSE_OKAY(S00_AXI_lite_response); + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.READ_BURST(S00_AXI_mtestAddress, + S00_AXI_mtestProtection_lite, + S00_AXI_rd_data_lite, + S00_AXI_lite_response); + $display("EXAMPLE TEST %d read : DATA = 0x%h, lite_response = 0x%h",S00_AXI_mtestvectorlite,S00_AXI_rd_data_lite,S00_AXI_lite_response); + CHECK_RESPONSE_OKAY(S00_AXI_lite_response); + COMPARE_LITE_DATA(S00_AXI_test_data_lite[S00_AXI_mtestvectorlite],S00_AXI_rd_data_lite); + $display("EXAMPLE TEST %d : Sequential write and read burst transfers complete from the master side. %d",S00_AXI_mtestvectorlite,S00_AXI_mtestvectorlite); + S00_AXI_mtestAddress = S00_AXI_mtestAddress + 32'h00000004; + end + + $display("---------------------------------------------------------"); + $display("EXAMPLE TEST S00_AXI: PTGEN_TEST_FINISHED!"); + if ( result_slave_lite ) begin + $display("PTGEN_TEST: PASSED!"); + end else begin + $display("PTGEN_TEST: FAILED!"); + end + $display("---------------------------------------------------------"); + end + endtask + + // Create the test vectors + initial begin + // When performing debug enable all levels of INFO messages. + wait(tb_ARESETn === 0) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.set_channel_level_info(1); + + // Create test data vectors + S00_AXI_test_data_lite[0] = 32'h0101FFFF; + S00_AXI_test_data_lite[1] = 32'habcd0001; + S00_AXI_test_data_lite[2] = 32'hdead0011; + S00_AXI_test_data_lite[3] = 32'hbeef0011; + end + + // Drive the BFM + initial begin + // Wait for end of reset + wait(tb_ARESETn === 0) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + + S00_AXI_TEST(); + + end + +endmodule diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/design.tcl b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/design.tcl new file mode 100644 index 0000000..28acdfc --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/bfm_design/design.tcl @@ -0,0 +1,91 @@ +proc create_ipi_design { offsetfile design_name } { + create_bd_design $design_name + open_bd_design $design_name + + # Create Clock and Reset Ports + set ACLK [ create_bd_port -dir I -type clk ACLK ] + set_property -dict [ list CONFIG.FREQ_HZ {100000000} CONFIG.PHASE {0.000} CONFIG.CLK_DOMAIN "${design_name}_ACLK" ] $ACLK + set ARESETN [ create_bd_port -dir I -type rst ARESETN ] + set_property -dict [ list CONFIG.POLARITY {ACTIVE_LOW} ] $ARESETN + set_property CONFIG.ASSOCIATED_RESET ARESETN $ACLK + + # Create instance: axi_i2s_adi_0, and set properties + set axi_i2s_adi_0 [ create_bd_cell -type ip -vlnv natinst.com:user:axi_i2s_adi:1.2 axi_i2s_adi_0] + + # Create instance: master_0, and set properties + set master_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:cdn_axi_bfm master_0] + set_property -dict [ list CONFIG.C_PROTOCOL_SELECTION {2} ] $master_0 + + # Create interface connections + connect_bd_intf_net [get_bd_intf_pins master_0/M_AXI_LITE] [get_bd_intf_pins axi_i2s_adi_0/S00_AXI] + + # Create port connections + connect_bd_net -net aclk_net [get_bd_ports ACLK] [get_bd_pins master_0/M_AXI_LITE_ACLK] [get_bd_pins axi_i2s_adi_0/S00_AXI_ACLK] + connect_bd_net -net aresetn_net [get_bd_ports ARESETN] [get_bd_pins master_0/M_AXI_LITE_ARESETN] [get_bd_pins axi_i2s_adi_0/S00_AXI_ARESETN] + + # Auto assign address + assign_bd_address + + # Copy all address to interface_address.vh file + set bd_path [file dirname [get_property NAME [get_files ${design_name}.bd]]] + upvar 1 $offsetfile offset_file + set offset_file "${bd_path}/axi_i2s_adi_v1_2_tb_include.vh" + set fp [open $offset_file "w"] + puts $fp "`ifndef axi_i2s_adi_v1_2_tb_include_vh_" + puts $fp "`define axi_i2s_adi_v1_2_tb_include_vh_\n" + puts $fp "//Configuration current bd names" + puts $fp "`define BD_INST_NAME ${design_name}_i" + puts $fp "`define BD_WRAPPER ${design_name}_wrapper\n" + puts $fp "//Configuration address parameters" + + set offset [get_property OFFSET [get_bd_addr_segs -of_objects [get_bd_addr_spaces master_0/Data_lite]]] + set offset_hex [string replace $offset 0 1 "32'h"] + puts $fp "`define S00_AXI_SLAVE_ADDRESS ${offset_hex}" + + puts $fp "`endif" + close $fp +} + +set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores natinst.com:user:axi_i2s_adi:1.2]]]] +set test_bench_file ${ip_path}/example_designs/bfm_design/axi_i2s_adi_v1_2_tb.v +set interface_address_vh_file "" + +# Set IP Repository and Update IP Catalogue +set repo_paths [get_property ip_repo_paths [current_fileset]] +if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } { + set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset] + update_ip_catalog +} + +set design_name "" +set all_bd {} +set all_bd_files [get_files *.bd -quiet] +foreach file $all_bd_files { +set file_name [string range $file [expr {[string last "/" $file] + 1}] end] +set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]] +lappend all_bd $bd_name +} + +for { set i 1 } { 1 } { incr i } { + set design_name "axi_i2s_adi_v1_2_bfm_${i}" + if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } { + break + } +} + +create_ipi_design interface_address_vh_file ${design_name} +validate_bd_design + +set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force] +import_files -force -norecurse $wrapper_file + +set_property SOURCE_SET sources_1 [get_filesets sim_1] +import_files -fileset sim_1 -norecurse -force $test_bench_file +remove_files -quiet -fileset sim_1 axi_i2s_adi_v1_2_tb_include.vh +import_files -fileset sim_1 -norecurse -force $interface_address_vh_file +set_property top axi_i2s_adi_v1_2_tb [get_filesets sim_1] +set_property top_lib {} [get_filesets sim_1] +set_property top_file {} [get_filesets sim_1] +launch_xsim -simset sim_1 -mode behavioral +restart +run 1000 us diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl new file mode 100644 index 0000000..21eba43 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl @@ -0,0 +1,45 @@ +# Runtime Tcl commands to interact with - axi_i2s_adi_v1_2 + +# Sourcing design address info tcl +set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd +source ${bd_path}/axi_i2s_adi_v1_2_include.tcl + +# jtag axi master interface hardware name, change as per your design. +set jtag_axi_master hw_axi_1 +set ec 0 + +# hw test script +# Delete all previous axis transactions +if { [llength [get_hw_axi_txns -quiet]] } { + delete_hw_axi_txn [get_hw_axi_txns -quiet] +} + + +# Test all lite slaves. +set wdata_1 abcd1234 + +# Test: S00_AXI +# Create a write transaction at s00_axi_addr address +create_hw_axi_txn w_s00_axi_addr [get_hw_axis $jtag_axi_master] -type write -address $s00_axi_addr -data $wdata_1 +# Create a read transaction at s00_axi_addr address +create_hw_axi_txn r_s00_axi_addr [get_hw_axis $jtag_axi_master] -type read -address $s00_axi_addr +# Initiate transactions +run_hw_axi r_s00_axi_addr +run_hw_axi w_s00_axi_addr +run_hw_axi r_s00_axi_addr +set rdata_tmp [get_property DATA [get_hw_axi_txn r_s00_axi_addr]] +# Compare read data +if { $rdata_tmp == $wdata_1 } { + puts "Data comparison test pass for - S00_AXI" +} else { + puts "Data comparison test fail for - S00_AXI, expected-$wdata_1 actual-$rdata_tmp" + inc ec +} + +# Check error flag +if { $ec == 0 } { + puts "PTGEN_TEST: PASSED!" +} else { + puts "PTGEN_TEST: FAILED!" +} + diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/design.tcl b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/design.tcl new file mode 100644 index 0000000..254844c --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/example_designs/debug_hw_design/design.tcl @@ -0,0 +1,175 @@ + +proc create_ipi_design { offsetfile design_name } { + + create_bd_design $design_name + open_bd_design $design_name + + # Create and configure Clock/Reset + create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz sys_clk_0 + create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset sys_reset_0 + + #check if current_board is set, if true - figure out required clocks. + set is_board_clock_found 0 + set is_board_reset_found 0 + set external_reset_port "" + set external_clock_port "" + + if { [current_board_part -quiet] != "" } { + + #check if any reset interface exists in board. + set board_reset [lindex [get_board_part_interfaces -filter { BUSDEF_NAME == reset_rtl && MODE == slave }] 0 ] + if { $board_reset ne "" } { + set is_board_reset_found 1 + apply_board_connection -board_interface $board_reset -ip_intf sys_clk_0/reset -diagram [current_bd_design] + apply_board_connection -board_interface $board_reset -ip_intf sys_reset_0/ext_reset -diagram [current_bd_design] + set external_rst [get_bd_ports -quiet -of_objects [get_bd_nets -quiet -of_objects [get_bd_pins -quiet sys_clk_0/reset]]] + if { $external_rst ne "" } { + set external_reset_port [get_property NAME $external_rst] + } + } else { + send_msg "ptgen 51-200" WARNING "No reset interface found in current_board, Users may need to specify the location constraints manually." + } + + # check for differential clock, exclude any special clocks which has TYPE property. + set board_clock_busifs "" + foreach busif [get_board_part_interfaces -filter "BUSDEF_NAME == diff_clock_rtl"] { + set type [get_property PARAM.TYPE $busif] + if { $type == "" } { + set board_clock_busifs $busif + break + } + } + if { $board_clock_busifs ne "" } { + apply_board_connection -board_interface $board_clock_busifs -ip_intf sys_clk_0/CLK_IN1_D -diagram [current_bd_design] + set is_board_clock_found 1 + } else { + # check for single ended clock + set board_sclock_busifs [lindex [get_board_part_interfaces -filter "BUSDEF_NAME == clock_rtl"] 0 ] + if { $board_sclock_busifs ne "" } { + apply_board_connection -board_interface $board_sclock_busifs -ip_intf sys_clk_0/clock_CLK_IN1 -diagram [current_bd_design] + set external_clk [get_bd_ports -quiet -of_objects [get_bd_nets -quiet -of_objects [get_bd_pins -quiet sys_clk_0/clk_in1]]] + if { $external_clk ne "" } { + set external_clock_port [get_property NAME $external_clk] + } + set is_board_clock_found 1 + } else { + send_msg "ptgen 51-200" WARNING "No clock interface found in current_board, Users may need to specify the location constraints manually." + } + } + + } else { + send_msg "ptgen 51-201" WARNING "No board selected in current_project. Users may need to specify the location constraints manually." + } + + #if there is no corresponding board interface found, assume constraints will be provided manually while pin planning. + if { $is_board_reset_found == 0 } { + create_bd_port -dir I -type rst reset_rtl + set_property CONFIG.POLARITY [get_property CONFIG.POLARITY [get_bd_pins sys_clk_0/reset]] [get_bd_ports reset_rtl] + connect_bd_net [get_bd_pins sys_reset_0/ext_reset_in] [get_bd_ports reset_rtl] + connect_bd_net [get_bd_ports reset_rtl] [get_bd_pins sys_clk_0/reset] + set external_reset_port reset_rtl + } + if { $is_board_clock_found == 0 } { + create_bd_port -dir I -type clk clock_rtl + connect_bd_net [get_bd_pins sys_clk_0/clk_in1] [get_bd_ports clock_rtl] + set external_clock_port clock_rtl + } + + #Avoid IPI DRC, make clock port synchronous to reset + if { $external_clock_port ne "" && $external_reset_port ne "" } { + set_property CONFIG.ASSOCIATED_RESET $external_reset_port [get_bd_ports $external_clock_port] + } + + # Connect other sys_reset pins + connect_bd_net [get_bd_pins sys_reset_0/slowest_sync_clk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins sys_clk_0/locked] [get_bd_pins sys_reset_0/dcm_locked] + + # Create instance: axi_i2s_adi_0, and set properties + set axi_i2s_adi_0 [ create_bd_cell -type ip -vlnv natinst.com:user:axi_i2s_adi:1.2 axi_i2s_adi_0 ] + + # Create instance: jtag_axi_0, and set properties + set jtag_axi_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:jtag_axi jtag_axi_0 ] + set_property -dict [list CONFIG.PROTOCOL {0}] [get_bd_cells jtag_axi_0] + connect_bd_net [get_bd_pins jtag_axi_0/aclk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins jtag_axi_0/aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn] + + # Create instance: axi_peri_interconnect, and set properties + set axi_peri_interconnect [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect axi_peri_interconnect ] + connect_bd_net [get_bd_pins axi_peri_interconnect/ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/ARESETN] [get_bd_pins sys_reset_0/interconnect_aresetn] + set_property -dict [ list CONFIG.NUM_SI {1} ] $axi_peri_interconnect + connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn] + connect_bd_intf_net [get_bd_intf_pins jtag_axi_0/M_AXI] [get_bd_intf_pins axi_peri_interconnect/S00_AXI] + + set_property -dict [ list CONFIG.NUM_MI {1} ] $axi_peri_interconnect + connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn] + + # Connect all clock & reset of axi_i2s_adi_0 slave interfaces.. + connect_bd_intf_net [get_bd_intf_pins axi_peri_interconnect/M00_AXI] [get_bd_intf_pins axi_i2s_adi_0/S00_AXI] + connect_bd_net [get_bd_pins axi_i2s_adi_0/s00_axi_aclk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_i2s_adi_0/s00_axi_aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn] + + + # Auto assign address + assign_bd_address + + # Copy all address to axi_i2s_adi_v1_2_include.tcl file + set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd + upvar 1 $offsetfile offset_file + set offset_file "${bd_path}/axi_i2s_adi_v1_2_include.tcl" + set fp [open $offset_file "w"] + puts $fp "# Configuration address parameters" + + set offset [get_property OFFSET [get_bd_addr_segs /jtag_axi_0/Data/SEG_axi_i2s_adi_0_S00_AXI_* ]] + puts $fp "set s00_axi_addr ${offset}" + + close $fp +} + +# Set IP Repository and Update IP Catalogue +set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores natinst.com:user:axi_i2s_adi:1.2]]]] +set hw_test_file ${ip_path}/example_designs/debug_hw_design/axi_i2s_adi_v1_2_hw_test.tcl + +set repo_paths [get_property ip_repo_paths [current_fileset]] +if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } { + set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset] + update_ip_catalog +} + +set design_name "" +set all_bd {} +set all_bd_files [get_files *.bd -quiet] +foreach file $all_bd_files { +set file_name [string range $file [expr {[string last "/" $file] + 1}] end] +set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]] +lappend all_bd $bd_name +} + +for { set i 1 } { 1 } { incr i } { + set design_name "axi_i2s_adi_v1_2_hw_${i}" + if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } { + break + } +} + +set intf_address_include_file "" +create_ipi_design intf_address_include_file ${design_name} +save_bd_design +validate_bd_design + +set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force] +import_files -force -norecurse $wrapper_file + +puts "-------------------------------------------------------------------------------------------------" +puts "INFO NEXT STEPS : Until this stage, debug hardware design has been created, " +puts " please perform following steps to test design in targeted board." +puts "1. Generate bitstream" +puts "2. Setup your targeted board, open hardware manager and open new(or existing) hardware target" +puts "3. Download generated bitstream" +puts "4. Run generated hardware test using below command, this invokes basic read/write operation" +puts " to every interface present in the peripheral : xilinx.com:user:myip:1.0" +puts " : source -notrace ${hw_test_file}" +puts "-------------------------------------------------------------------------------------------------" + diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_ctrlif.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_ctrlif.vhd new file mode 100644 index 0000000..972b2c2 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_ctrlif.vhd @@ -0,0 +1,151 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity axi_ctrlif is + generic + ( + C_NUM_REG : integer := 32; + C_S_AXI_DATA_WIDTH : integer := 32; + C_S_AXI_ADDR_WIDTH : integer := 32; + C_FAMILY : string := "virtex6" + ); + port + ( + -- AXI bus interface + S_AXI_ACLK : in std_logic; + S_AXI_ARESETN : in std_logic; + S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + S_AXI_AWVALID : in std_logic; + S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + S_AXI_WVALID : in std_logic; + S_AXI_BREADY : in std_logic; + S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + S_AXI_ARVALID : in std_logic; + S_AXI_RREADY : in std_logic; + S_AXI_ARREADY : out std_logic; + S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + S_AXI_RRESP : out std_logic_vector(1 downto 0); + S_AXI_RVALID : out std_logic; + S_AXI_WREADY : out std_logic; + S_AXI_BRESP : out std_logic_vector(1 downto 0); + S_AXI_BVALID : out std_logic; + S_AXI_AWREADY : out std_logic; + + rd_addr : out integer range 0 to C_NUM_REG - 1; + rd_data : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + rd_ack : out std_logic; + rd_stb : in std_logic; + + wr_addr : out integer range 0 to C_NUM_REG - 1; + wr_data : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + wr_ack : in std_logic; + wr_stb : out std_logic + ); +end entity axi_ctrlif; + + +architecture Behavioral of axi_ctrlif is + type state_type is (IDLE, RESP, ACK); + signal rd_state : state_type; + signal wr_state : state_type; +begin + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + rd_state <= IDLE; + else + case rd_state is + when IDLE => + if S_AXI_ARVALID = '1' then + rd_state <= RESP; + rd_addr <= to_integer(unsigned(S_AXI_ARADDR(31 downto 2))); + end if; + when RESP => + if rd_stb = '1' and S_AXI_RREADY = '1' then + rd_state <= IDLE; + end if; + when others => null; + end case; + end if; + end if; + end process; + + S_AXI_ARREADY <= '1' when rd_state = IDLE else '0'; + S_AXI_RVALID <= '1' when rd_state = RESP and rd_stb = '1' else '0'; + S_AXI_RRESP <= "00"; + rd_ack <= '1' when rd_state = RESP and S_AXI_RREADY = '1' else '0'; + S_AXI_RDATA <= rd_data; + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + wr_state <= IDLE; + else + case wr_state is + when IDLE => + if S_AXI_AWVALID = '1' and S_AXI_WVALID = '1' and wr_ack = '1' then + wr_state <= ACK; + end if; + when ACK => + wr_state <= RESP; + when RESP => + if S_AXI_BREADY = '1' then + wr_state <= IDLE; + end if; + end case; + end if; + end if; + end process; + + wr_stb <= '1' when S_AXI_AWVALID = '1' and S_AXI_WVALID = '1' and wr_state = IDLE else '0'; + wr_data <= S_AXI_WDATA; + wr_addr <= to_integer(unsigned(S_AXI_AWADDR(31 downto 2))); + + S_AXI_AWREADY <= '1' when wr_state = ACK else '0'; + S_AXI_WREADY <= '1' when wr_state = ACK else '0'; + + S_AXI_BRESP <= "00"; + S_AXI_BVALID <= '1' when wr_state = RESP else '0'; +end; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_rx_fifo.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_rx_fifo.vhd new file mode 100644 index 0000000..99154a2 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_rx_fifo.vhd @@ -0,0 +1,80 @@ +library ieee; +use ieee.std_logic_1164.all; + +library adi_common_v1_00_a; +use adi_common_v1_00_a.dma_fifo; + +entity axi_streaming_dma_rx_fifo is + generic ( + RAM_ADDR_WIDTH : integer := 3; + FIFO_DWIDTH : integer := 32 + ); + port ( + clk : in std_logic; + resetn : in std_logic; + fifo_reset : in std_logic; + + -- Enable DMA interface + enable : in Boolean; + + period_len : in integer range 0 to 65535; + + -- Read port + M_AXIS_ACLK : in std_logic; + M_AXIS_TREADY : in std_logic; + M_AXIS_TDATA : out std_logic_vector(FIFO_DWIDTH-1 downto 0); + M_AXIS_TLAST : out std_logic; + M_AXIS_TVALID : out std_logic; + M_AXIS_TKEEP : out std_logic_vector(3 downto 0); + + -- Write port + in_stb : in std_logic; + in_ack : out std_logic; + in_data : in std_logic_vector(FIFO_DWIDTH-1 downto 0) + ); +end; + +architecture imp of axi_streaming_dma_rx_fifo is + signal out_stb : std_logic; + + signal period_count : integer range 0 to 65535; + signal last : std_logic; +begin + + M_AXIS_TVALID <= out_stb; + + fifo: entity dma_fifo + generic map ( + RAM_ADDR_WIDTH => RAM_ADDR_WIDTH, + FIFO_DWIDTH => FIFO_DWIDTH + ) + port map ( + clk => clk, + resetn => resetn, + fifo_reset => fifo_reset, + in_stb => in_stb, + in_ack => in_ack, + in_data => in_data, + out_stb => out_stb, + out_ack => M_AXIS_TREADY, + out_data => M_AXIS_TDATA + ); + + M_AXIS_TKEEP <= "1111"; + M_AXIS_TLAST <= '1' when period_count = 0 else '0'; + + period_counter: process(M_AXIS_ACLK) is + begin + if resetn = '0' then + period_count <= period_len; + else + if out_stb = '1' and M_AXIS_TREADY = '1' then + if period_count = 0 then + period_count <= period_len; + else + period_count <= period_count - 1; + end if; + end if; + end if; + end process; +end; \ No newline at end of file diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_tx_fifo.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_tx_fifo.vhd new file mode 100644 index 0000000..5d50208 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/axi_streaming_dma_tx_fifo.vhd @@ -0,0 +1,74 @@ +library ieee; +use ieee.std_logic_1164.all; + +library adi_common_v1_00_a; +use adi_common_v1_00_a.dma_fifo; + +entity axi_streaming_dma_tx_fifo is + generic ( + RAM_ADDR_WIDTH : integer := 3; + FIFO_DWIDTH : integer := 32 + ); + port ( + clk : in std_logic; + resetn : in std_logic; + fifo_reset : in std_logic; + + -- Enable DMA interface + enable : in Boolean; + + -- Write port + S_AXIS_ACLK : in std_logic; + S_AXIS_TREADY : out std_logic; + S_AXIS_TDATA : in std_logic_vector(FIFO_DWIDTH-1 downto 0); + S_AXIS_TLAST : in std_logic; + S_AXIS_TVALID : in std_logic; + + -- Read port + out_stb : out std_logic; + out_ack : in std_logic; + out_data : out std_logic_vector(FIFO_DWIDTH-1 downto 0) + ); +end; + +architecture imp of axi_streaming_dma_tx_fifo is + signal in_ack : std_logic; + signal drain_dma : Boolean; +begin + + fifo: entity dma_fifo + generic map ( + RAM_ADDR_WIDTH => RAM_ADDR_WIDTH, + FIFO_DWIDTH => FIFO_DWIDTH + ) + port map ( + clk => clk, + resetn => resetn, + fifo_reset => fifo_reset, + in_stb => S_AXIS_TVALID, + in_ack => in_ack, + in_data => S_AXIS_TDATA, + out_stb => out_stb, + out_ack => out_ack, + out_data => out_data + ); + + drain_process: process (S_AXIS_ACLK) is + variable enable_d1 : Boolean; + begin + if rising_edge(S_AXIS_ACLK) then + if resetn = '0' then + drain_dma <= False; + else + if S_AXIS_TLAST = '1' then + drain_dma <= False; + elsif enable_d1 and enable then + drain_dma <= True; + end if; + enable_d1 := enable; + end if; + end if; + end process; + + S_AXIS_TREADY <= '1' when in_ack = '1' or drain_dma else '0'; +end; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/dma_fifo.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/dma_fifo.vhd new file mode 100644 index 0000000..5339d73 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/dma_fifo.vhd @@ -0,0 +1,69 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity dma_fifo is + generic ( + RAM_ADDR_WIDTH : integer := 3; + FIFO_DWIDTH : integer := 32 + ); + port ( + clk : in std_logic; + resetn : in std_logic; + fifo_reset : in std_logic; + + -- Write port + in_stb : in std_logic; + in_ack : out std_logic; + in_data : in std_logic_vector(FIFO_DWIDTH-1 downto 0); + + -- Read port + out_stb : out std_logic; + out_ack : in std_logic; + out_data : out std_logic_vector(FIFO_DWIDTH-1 downto 0) + ); +end; + +architecture imp of dma_fifo is + + constant FIFO_MAX : natural := 2**RAM_ADDR_WIDTH -1; + type MEM is array (0 to FIFO_MAX) of std_logic_vector(FIFO_DWIDTH - 1 downto 0); + signal data_fifo : MEM; + signal wr_addr : natural range 0 to FIFO_MAX; + signal rd_addr : natural range 0 to FIFO_MAX; + signal full, empty : Boolean; + +begin + in_ack <= '0' when full else '1'; + + out_stb <= '0' when empty else '1'; + out_data <= data_fifo(rd_addr); + + fifo: process (clk) is + variable free_cnt : integer range 0 to FIFO_MAX + 1; + begin + if rising_edge(clk) then + if (resetn = '0') or (fifo_reset = '1') then + wr_addr <= 0; + rd_addr <= 0; + free_cnt := FIFO_MAX + 1; + empty <= True; + full <= False; + else + if in_stb = '1' and not full then + data_fifo(wr_addr) <= in_data; + wr_addr <= (wr_addr + 1) mod (FIFO_MAX + 1); + free_cnt := free_cnt - 1; + end if; + + if out_ack = '1' and not empty then + rd_addr <= (rd_addr + 1) mod (FIFO_MAX + 1); + free_cnt := free_cnt + 1; + end if; + + full <= free_cnt = 0; + empty <= free_cnt = FIFO_MAX + 1; + end if; + end if; + end process; +end; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/pl330_dma_fifo.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/pl330_dma_fifo.vhd new file mode 100644 index 0000000..2e53bbc --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/adi_common/pl330_dma_fifo.vhd @@ -0,0 +1,140 @@ +library ieee; +use ieee.std_logic_1164.all; + +library adi_common_v1_00_a; +use adi_common_v1_00_a.dma_fifo; + +entity pl330_dma_fifo is + generic ( + RAM_ADDR_WIDTH : integer := 3; + FIFO_DWIDTH : integer := 32; + FIFO_DIRECTION : integer := 0 -- 0 = write FIFO, 1 = read FIFO + ); + port ( + clk : in std_logic; + resetn : in std_logic; + fifo_reset : in std_logic; + + -- Enable DMA interface + enable : in Boolean; + + -- Write port + in_stb : in std_logic; + in_ack : out std_logic; + in_data : in std_logic_vector(FIFO_DWIDTH-1 downto 0); + + -- Read port + out_stb : out std_logic; + out_ack : in std_logic; + out_data : out std_logic_vector(FIFO_DWIDTH-1 downto 0); + + -- PL330 DMA interface + dclk : in std_logic; + dresetn : in std_logic; + davalid : in std_logic; + daready : out std_logic; + datype : in std_logic_vector(1 downto 0); + drvalid : out std_logic; + drready : in std_logic; + drtype : out std_logic_vector(1 downto 0); + drlast : out std_logic; + + DBG : out std_logic_vector(7 downto 0) + ); +end; + +architecture imp of pl330_dma_fifo is + signal request_data : Boolean; + + type state_type is (IDLE, REQUEST, WAITING, FLUSH); + signal state : state_type; + signal i_in_ack : std_logic; + signal i_out_stb : std_logic; +begin + + in_ack <= i_in_ack; + out_stb <= i_out_stb; + + fifo: entity dma_fifo + generic map ( + RAM_ADDR_WIDTH => RAM_ADDR_WIDTH, + FIFO_DWIDTH => FIFO_DWIDTH + ) + port map ( + clk => clk, + resetn => resetn, + fifo_reset => fifo_reset, + in_stb => in_stb, + in_ack => i_in_ack, + in_data => in_data, + out_stb => i_out_stb, + out_ack => out_ack, + out_data => out_data + ); + + request_data <= i_in_ack = '1' when FIFO_DIRECTION = 0 else i_out_stb = '1'; + + drlast <= '0'; + daready <= '1'; + + drvalid <= '1' when (state = REQUEST) or (state = FLUSH) else '0'; + drtype <= "00" when state = REQUEST else "10"; + + DBG(0) <= davalid; + DBG(2 downto 1) <= datype; + DBG(3) <= '1' when request_data else '0'; + + process (state) + begin + case state is + when IDLE => DBG(5 downto 4) <= "00"; + when REQUEST => DBG(5 downto 4) <= "01"; + when WAITING => DBG(5 downto 4) <= "10"; + when FLUSH => DBG(5 downto 4) <= "11"; + end case; + end process; + + pl330_req_fsm: process (dclk) is + begin + if rising_edge(dclk) then + if dresetn = '0' then + state <= IDLE; + else + -- The controller may send a FLUSH request at any time and it won't + -- respond to any of our requests until we've ack the FLUSH request. + -- The FLUSH request is also supposed to reset our state machine, so + -- go back to idle after having acked the FLUSH. + if davalid = '1' and datype = "10" then + state <= FLUSH; + else + case state is + -- Nothing to do, wait for the fifo to run empty + when IDLE => + if request_data and enable then + state <= REQUEST; + end if; + -- Send out a request to the PL330 + when REQUEST => + if drready = '1' then + state <= WAITING; + end if; + -- Wait for a ACK from the PL330 that it did transfer the data + when WAITING => + if fifo_reset = '1' then + state <= IDLE; + elsif davalid = '1' then + if datype = "00" then + state <= IDLE; + end if; + end if; + -- Send out an ACK for the flush + when FLUSH => + if drready = '1' then + state <= IDLE; + end if; + end case; + end if; + end if; + end if; + end process; +end; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd new file mode 100644 index 0000000..26c72ae --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_S_AXI.vhd @@ -0,0 +1,361 @@ +-------------------------------------------------------------------------------- +-- +-- File: +-- axi_i2s_adi_S_AXI.vhd +-- +-- Module: +-- AXIS I2S Controller AXI Slave Interface +-- +-- Author: +-- Tinghui Wang (Steve) +-- Sam Bobrowicz +-- +-- Description: +-- AXI-Lite Register Interface for AXI I2S Controller +-- +-- Copyright notice: +-- Copyright (C) 2014 Digilent Inc. +-- +-- License: +-- This program is free software; distributed under the terms of +-- BSD 3-clause license ("Revised BSD License", "New BSD License", or "Modified BSD License") +-- +-- 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 above 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. Neither the name(s) of the above-listed copyright holder(s) nor the names +-- of its contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER 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. +-- +-------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.math_real.all; + +entity axi_i2s_adi_S_AXI is + generic ( + -- Users to add parameters here + + -- User parameters ends + -- Do not modify the parameters beyond this line + + -- Width of S_AXI data bus + C_S_AXI_DATA_WIDTH : integer := 32; + -- Width of S_AXI address bus + C_S_AXI_ADDR_WIDTH : integer := 6 + ); + port ( + rd_addr : out integer range 0 to 12 - 1; + rd_data : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + rd_ack : out std_logic; + + wr_addr : out integer range 0 to 12 - 1; + wr_data : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + wr_stb : out std_logic; + -- User ports ends + -- Do not modify the ports beyond this line + + -- Global Clock Signal + S_AXI_ACLK : in std_logic; + -- Global Reset Signal. This Signal is Active LOW + S_AXI_ARESETN : in std_logic; + -- Write address (issued by master, acceped by Slave) + S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + -- Write channel Protection type. This signal indicates the + -- privilege and security level of the transaction, and whether + -- the transaction is a data access or an instruction access. + S_AXI_AWPROT : in std_logic_vector(2 downto 0); + -- Write address valid. This signal indicates that the master signaling + -- valid write address and control information. + S_AXI_AWVALID : in std_logic; + -- Write address ready. This signal indicates that the slave is ready + -- to accept an address and associated control signals. + S_AXI_AWREADY : out std_logic; + -- Write data (issued by master, acceped by Slave) + S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + -- Write strobes. This signal indicates which byte lanes hold + -- valid data. There is one write strobe bit for each eight + -- bits of the write data bus. + S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + -- Write valid. This signal indicates that valid write + -- data and strobes are available. + S_AXI_WVALID : in std_logic; + -- Write ready. This signal indicates that the slave + -- can accept the write data. + S_AXI_WREADY : out std_logic; + -- Write response. This signal indicates the status + -- of the write transaction. + S_AXI_BRESP : out std_logic_vector(1 downto 0); + -- Write response valid. This signal indicates that the channel + -- is signaling a valid write response. + S_AXI_BVALID : out std_logic; + -- Response ready. This signal indicates that the master + -- can accept a write response. + S_AXI_BREADY : in std_logic; + -- Read address (issued by master, acceped by Slave) + S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + -- Protection type. This signal indicates the privilege + -- and security level of the transaction, and whether the + -- transaction is a data access or an instruction access. + S_AXI_ARPROT : in std_logic_vector(2 downto 0); + -- Read address valid. This signal indicates that the channel + -- is signaling valid read address and control information. + S_AXI_ARVALID : in std_logic; + -- Read address ready. This signal indicates that the slave is + -- ready to accept an address and associated control signals. + S_AXI_ARREADY : out std_logic; + -- Read data (issued by slave) + S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + -- Read response. This signal indicates the status of the + -- read transfer. + S_AXI_RRESP : out std_logic_vector(1 downto 0); + -- Read valid. This signal indicates that the channel is + -- signaling the required read data. + S_AXI_RVALID : out std_logic; + -- Read ready. This signal indicates that the master can + -- accept the read data and response information. + S_AXI_RREADY : in std_logic + ); +end axi_i2s_adi_S_AXI; + +architecture arch_imp of axi_i2s_adi_S_AXI is + + -- AXI4LITE signals + signal axi_awaddr : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + signal axi_awready : std_logic; + signal axi_wready : std_logic; + signal axi_bresp : std_logic_vector(1 downto 0); + signal axi_bvalid : std_logic; + signal axi_araddr : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + signal axi_arready : std_logic; + signal axi_rdata : std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal axi_rresp : std_logic_vector(1 downto 0); + signal axi_rvalid : std_logic; + + -- Example-specific design signals + -- local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH + -- ADDR_LSB is used for addressing 32/64 bit registers/memories + -- ADDR_LSB = 2 for 32 bits (n downto 2) + -- ADDR_LSB = 3 for 64 bits (n downto 3) + constant ADDR_LSB : integer := (C_S_AXI_DATA_WIDTH/32)+ 1; + constant OPT_MEM_ADDR_BITS : integer := 3; + ------------------------------------------------ + ---- Signals for user logic register space example + -------------------------------------------------- + signal slv_reg_rden : std_logic; + signal slv_reg_wren : std_logic; + signal reg_data_out :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + +begin + -- I/O Connections assignments + + S_AXI_AWREADY <= axi_awready; + S_AXI_WREADY <= axi_wready; + S_AXI_BRESP <= axi_bresp; + S_AXI_BVALID <= axi_bvalid; + S_AXI_ARREADY <= axi_arready; + S_AXI_RDATA <= axi_rdata; + S_AXI_RRESP <= axi_rresp; + S_AXI_RVALID <= axi_rvalid; + -- Implement axi_awready generation + -- axi_awready is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is + -- de-asserted when reset is low. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_awready <= '0'; + else + if (axi_awready = '0' and S_AXI_AWVALID = '1' and S_AXI_WVALID = '1') then + -- slave is ready to accept write address when + -- there is a valid write address and write data + -- on the write address and data bus. This design + -- expects no outstanding transactions. + axi_awready <= '1'; + else + axi_awready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement axi_awaddr latching + -- This process is used to latch the address when both + -- S_AXI_AWVALID and S_AXI_WVALID are valid. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_awaddr <= (others => '0'); + else + if (axi_awready = '0' and S_AXI_AWVALID = '1' and S_AXI_WVALID = '1') then + -- Write Address latching + axi_awaddr <= S_AXI_AWADDR; + end if; + end if; + end if; + end process; + + -- Implement axi_wready generation + -- axi_wready is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is + -- de-asserted when reset is low. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_wready <= '0'; + else + if (axi_wready = '0' and S_AXI_WVALID = '1' and S_AXI_AWVALID = '1') then + -- slave is ready to accept write data when + -- there is a valid write address and write data + -- on the write address and data bus. This design + -- expects no outstanding transactions. + axi_wready <= '1'; + else + axi_wready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement memory mapped register select and write logic generation + -- The write data is accepted and written to memory mapped registers when + -- axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to + -- select byte enables of slave registers while writing. + -- These registers are cleared when reset (active low) is applied. + -- Slave register write enable is asserted when valid address and data are available + -- and the slave is ready to accept the write address and write data. + slv_reg_wren <= axi_wready and S_AXI_WVALID and axi_awready and S_AXI_AWVALID ; + + wr_data <= S_AXI_WDATA; + wr_addr <= to_integer(unsigned(axi_awaddr((C_S_AXI_ADDR_WIDTH - 1) downto 2))); + wr_stb <= slv_reg_wren; + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_bvalid <= '0'; + axi_bresp <= "00"; --need to work more on the responses + else + if (axi_awready = '1' and S_AXI_AWVALID = '1' and axi_wready = '1' and S_AXI_WVALID = '1' and axi_bvalid = '0' ) then + axi_bvalid <= '1'; + axi_bresp <= "00"; + elsif (S_AXI_BREADY = '1' and axi_bvalid = '1') then --check if bready is asserted while bvalid is high) + axi_bvalid <= '0'; -- (there is a possibility that bready is always asserted high) + end if; + end if; + end if; + end process; + + -- Implement axi_arready generation + -- axi_arready is asserted for one S_AXI_ACLK clock cycle when + -- S_AXI_ARVALID is asserted. axi_awready is + -- de-asserted when reset (active low) is asserted. + -- The read address is also latched when S_AXI_ARVALID is + -- asserted. axi_araddr is reset to zero on reset assertion. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_arready <= '0'; + axi_araddr <= (others => '1'); + else + if (axi_arready = '0' and S_AXI_ARVALID = '1') then + -- indicates that the slave has acceped the valid read address + axi_arready <= '1'; + -- Read Address latching + axi_araddr <= S_AXI_ARADDR; + else + axi_arready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement axi_arvalid generation + -- axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_ARVALID and axi_arready are asserted. The slave registers + -- data are available on the axi_rdata bus at this instance. The + -- assertion of axi_rvalid marks the validity of read data on the + -- bus and axi_rresp indicates the status of read transaction.axi_rvalid + -- is deasserted on reset (active low). axi_rresp and axi_rdata are + -- cleared to zero on reset (active low). + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_rvalid <= '0'; + axi_rresp <= "00"; + else + if (axi_arready = '1' and S_AXI_ARVALID = '1' and axi_rvalid = '0') then + -- Valid read data is available at the read data bus + axi_rvalid <= '1'; + axi_rresp <= "00"; -- 'OKAY' response + elsif (axi_rvalid = '1' and S_AXI_RREADY = '1') then + -- Read data is accepted by the master + axi_rvalid <= '0'; + end if; + end if; + end if; + end process; + + -- Implement memory mapped register select and read logic generation + -- Slave register read enable is asserted when valid address is available + -- and the slave is ready to accept the read address. + slv_reg_rden <= axi_arready and S_AXI_ARVALID and (not axi_rvalid) ; + + rd_ack <= slv_reg_rden; + reg_data_out <= rd_data; + rd_addr <= to_integer(unsigned(axi_araddr((C_S_AXI_ADDR_WIDTH - 1) downto 2))); + + -- Output register or memory read data + process( S_AXI_ACLK ) is + begin + if (rising_edge (S_AXI_ACLK)) then + if ( S_AXI_ARESETN = '0' ) then + axi_rdata <= (others => '0'); + else + if (slv_reg_rden = '1') then + -- When there is a valid read address (S_AXI_ARVALID) with + -- acceptance of read address by the slave (axi_arready), + -- output the read dada + -- Read address mux + axi_rdata <= reg_data_out; -- register read data + end if; + end if; + end if; + end process; + + + -- Add user logic here + + + -- User logic ends + +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd new file mode 100644 index 0000000..83c3f39 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/axi_i2s_adi_v1_2.vhd @@ -0,0 +1,469 @@ + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +use ieee.math_real.all; + +library axi_i2s_adi_v1_00_a; +use axi_i2s_adi_v1_00_a.i2s_controller; + +library adi_common_v1_00_a; +use adi_common_v1_00_a.axi_streaming_dma_rx_fifo; +use adi_common_v1_00_a.axi_streaming_dma_tx_fifo; +use adi_common_v1_00_a.pl330_dma_fifo; +use adi_common_v1_00_a.axi_ctrlif; + + +entity axi_i2s_adi_v1_2 is + generic ( + -- Users to add parameters here + C_SLOT_WIDTH : integer := 24; + C_LRCLK_POL : integer := 0; -- LRCLK Polarity (0 - Falling edge, 1 - Rising edge) + C_BCLK_POL : integer := 0; -- BCLK Polarity (0 - Falling edge, 1 - Rising edge) + C_DMA_TYPE : integer := 0; + C_NUM_CH : integer := 1; + C_HAS_TX : integer := 1; + C_HAS_RX : integer := 1; + -- User parameters ends + -- Do not modify the parameters beyond this line + + + -- Parameters of Axi Slave Bus Interface S00_AXI + C_S00_AXI_DATA_WIDTH : integer := 32; + C_S00_AXI_ADDR_WIDTH : integer := 6 + ); + port ( + -- Users to add ports here + -- Serial Data interface + DATA_CLK_I : in std_logic; + BCLK_O : out std_logic_vector(C_NUM_CH - 1 downto 0); + LRCLK_O : out std_logic_vector(C_NUM_CH - 1 downto 0); + SDATA_O : out std_logic_vector(C_NUM_CH - 1 downto 0); + SDATA_I : in std_logic_vector(C_NUM_CH - 1 downto 0); + MUTEN_O : out std_logic; + + -- AXI Streaming DMA TX interface + S_AXIS_ACLK : in std_logic; + S_AXIS_TREADY : out std_logic; + S_AXIS_TDATA : in std_logic_vector(31 downto 0); + S_AXIS_TLAST : in std_logic; + S_AXIS_TVALID : in std_logic; + + -- AXI Streaming DMA RX interface + M_AXIS_ACLK : in std_logic; + M_AXIS_TREADY : in std_logic; + M_AXIS_TDATA : out std_logic_vector(31 downto 0); + M_AXIS_TLAST : out std_logic; + M_AXIS_TVALID : out std_logic; + M_AXIS_TKEEP : out std_logic_vector(3 downto 0); + + --PL330 DMA TX interface + DMA_REQ_TX_ACLK : in std_logic; + DMA_REQ_TX_RSTN : in std_logic; + DMA_REQ_TX_DAVALID : in std_logic; + DMA_REQ_TX_DATYPE : in std_logic_vector(1 downto 0); + DMA_REQ_TX_DAREADY : out std_logic; + DMA_REQ_TX_DRVALID : out std_logic; + DMA_REQ_TX_DRTYPE : out std_logic_vector(1 downto 0); + DMA_REQ_TX_DRLAST : out std_logic; + DMA_REQ_TX_DRREADY : in std_logic; + + -- PL330 DMA RX interface + DMA_REQ_RX_ACLK : in std_logic; + DMA_REQ_RX_RSTN : in std_logic; + DMA_REQ_RX_DAVALID : in std_logic; + DMA_REQ_RX_DATYPE : in std_logic_vector(1 downto 0); + DMA_REQ_RX_DAREADY : out std_logic; + DMA_REQ_RX_DRVALID : out std_logic; + DMA_REQ_RX_DRTYPE : out std_logic_vector(1 downto 0); + DMA_REQ_RX_DRLAST : out std_logic; + DMA_REQ_RX_DRREADY : in std_logic; + -- User ports ends + -- Do not modify the ports beyond this line + + + -- Ports of Axi Slave Bus Interface S00_AXI + s00_axi_aclk : in std_logic; + s00_axi_aresetn : in std_logic; + s00_axi_awaddr : in std_logic_vector(C_S00_AXI_ADDR_WIDTH-1 downto 0); + s00_axi_awprot : in std_logic_vector(2 downto 0); + s00_axi_awvalid : in std_logic; + s00_axi_awready : out std_logic; + s00_axi_wdata : in std_logic_vector(C_S00_AXI_DATA_WIDTH-1 downto 0); + s00_axi_wstrb : in std_logic_vector((C_S00_AXI_DATA_WIDTH/8)-1 downto 0); + s00_axi_wvalid : in std_logic; + s00_axi_wready : out std_logic; + s00_axi_bresp : out std_logic_vector(1 downto 0); + s00_axi_bvalid : out std_logic; + s00_axi_bready : in std_logic; + s00_axi_araddr : in std_logic_vector(C_S00_AXI_ADDR_WIDTH-1 downto 0); + s00_axi_arprot : in std_logic_vector(2 downto 0); + s00_axi_arvalid : in std_logic; + s00_axi_arready : out std_logic; + s00_axi_rdata : out std_logic_vector(C_S00_AXI_DATA_WIDTH-1 downto 0); + s00_axi_rresp : out std_logic_vector(1 downto 0); + s00_axi_rvalid : out std_logic; + s00_axi_rready : in std_logic + ); +end axi_i2s_adi_v1_2; + +architecture arch_imp of axi_i2s_adi_v1_2 is + + -- component declaration + component axi_i2s_adi_S_AXI is + generic ( + C_S_AXI_DATA_WIDTH : integer := 32; + C_S_AXI_ADDR_WIDTH : integer := 6 + ); + port ( + rd_addr : out integer range 0 to 12 - 1; + rd_data : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + rd_ack : out std_logic; + + wr_addr : out integer range 0 to 12 - 1; + wr_data : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + wr_stb : out std_logic; + S_AXI_ACLK : in std_logic; + S_AXI_ARESETN : in std_logic; + S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + S_AXI_AWPROT : in std_logic_vector(2 downto 0); + S_AXI_AWVALID : in std_logic; + S_AXI_AWREADY : out std_logic; + S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + S_AXI_WVALID : in std_logic; + S_AXI_WREADY : out std_logic; + S_AXI_BRESP : out std_logic_vector(1 downto 0); + S_AXI_BVALID : out std_logic; + S_AXI_BREADY : in std_logic; + S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + S_AXI_ARPROT : in std_logic_vector(2 downto 0); + S_AXI_ARVALID : in std_logic; + S_AXI_ARREADY : out std_logic; + S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + S_AXI_RRESP : out std_logic_vector(1 downto 0); + S_AXI_RVALID : out std_logic; + S_AXI_RREADY : in std_logic + ); + end component axi_i2s_adi_S_AXI; + + signal i2s_reset : std_logic; +signal tx_fifo_reset : std_logic; +signal tx_enable : Boolean; +signal tx_data : std_logic_vector(C_SLOT_WIDTH - 1 downto 0); +signal tx_ack : std_logic; +signal tx_stb : std_logic; +signal tx_fifo_full : std_logic; +signal tx_fifo_empty : std_logic; +signal tx_in_ack : std_logic; + + +signal rx_enable : Boolean; +signal rx_fifo_reset : std_logic; +signal rx_data : std_logic_vector(C_SLOT_WIDTH - 1 downto 0); +signal rx_ack : std_logic; +signal rx_stb : std_logic; +signal rx_fifo_full : std_logic; +signal rx_fifo_empty : std_logic; +signal rx_out_stb : std_logic; + +signal bclk_div_rate : natural range 0 to 255; +signal lrclk_div_rate : natural range 0 to 255; + +signal period_len : integer range 0 to 65535; + +signal I2S_RESET_REG : std_logic_vector(31 downto 0); +signal I2S_CONTROL_REG : std_logic_vector(31 downto 0); +signal I2S_CLK_CONTROL_REG : std_logic_vector(31 downto 0); +signal PERIOD_LEN_REG : std_logic_vector(31 downto 0); + +constant FIFO_AWIDTH : integer := integer(ceil(log2(real(C_NUM_CH * 8)))); + +-- Audio samples FIFO +constant RAM_ADDR_WIDTH : integer := 7; +type RAM_TYPE is array (0 to (2**RAM_ADDR_WIDTH - 1)) of std_logic_vector(31 downto 0); + +-- RX FIFO signals +signal audio_fifo_rx : RAM_TYPE; +signal audio_fifo_rx_wr_addr : integer range 0 to 2**RAM_ADDR_WIDTH-1; +signal audio_fifo_rx_rd_addr : integer range 0 to 2**RAM_ADDR_WIDTH-1; +signal tvalid : std_logic := '0'; +signal rx_tlast : std_logic; +signal drain_tx_dma : std_logic; + +signal rx_sample : std_logic_vector(23 downto 0); + +signal wr_data : std_logic_vector(31 downto 0); +signal rd_data : std_logic_vector(31 downto 0); +signal wr_addr : integer range 0 to 11; +signal rd_addr : integer range 0 to 11; +signal wr_stb : std_logic; +signal rd_ack : std_logic; +signal tx_fifo_stb : std_logic; +signal rx_fifo_ack : std_logic; +signal cnt : integer range 0 to 2**16-1; + +begin + +-- Instantiation of Axi Bus Interface S00_AXI +axi_i2s_adi_S_AXI_inst : axi_i2s_adi_S_AXI + generic map ( + C_S_AXI_DATA_WIDTH => C_S00_AXI_DATA_WIDTH, + C_S_AXI_ADDR_WIDTH => C_S00_AXI_ADDR_WIDTH + ) + port map ( + rd_addr => rd_addr, + rd_data => rd_data, + rd_ack => rd_ack, + + wr_addr => wr_addr, + wr_data => wr_data, + wr_stb => wr_stb, + S_AXI_ACLK => s00_axi_aclk, + S_AXI_ARESETN => s00_axi_aresetn, + S_AXI_AWADDR => s00_axi_awaddr, + S_AXI_AWPROT => s00_axi_awprot, + S_AXI_AWVALID => s00_axi_awvalid, + S_AXI_AWREADY => s00_axi_awready, + S_AXI_WDATA => s00_axi_wdata, + S_AXI_WSTRB => s00_axi_wstrb, + S_AXI_WVALID => s00_axi_wvalid, + S_AXI_WREADY => s00_axi_wready, + S_AXI_BRESP => s00_axi_bresp, + S_AXI_BVALID => s00_axi_bvalid, + S_AXI_BREADY => s00_axi_bready, + S_AXI_ARADDR => s00_axi_araddr, + S_AXI_ARPROT => s00_axi_arprot, + S_AXI_ARVALID => s00_axi_arvalid, + S_AXI_ARREADY => s00_axi_arready, + S_AXI_RDATA => s00_axi_rdata, + S_AXI_RRESP => s00_axi_rresp, + S_AXI_RVALID => s00_axi_rvalid, + S_AXI_RREADY => s00_axi_rready + ); + + -- Add user logic here +process (s00_axi_aclk) + begin + if rising_edge(s00_axi_aclk) then + if s00_axi_aresetn = '0' then + cnt <= 0; + else + cnt <= (cnt + 1) mod 2**16; + end if; + end if; + end process; + + streaming_dma_tx_gen: if C_DMA_TYPE = 0 and C_HAS_TX = 1 generate + tx_fifo : entity axi_streaming_dma_tx_fifo + generic map( + RAM_ADDR_WIDTH => FIFO_AWIDTH, + FIFO_DWIDTH => 24 + ) + port map( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + fifo_reset => tx_fifo_reset, + enable => tx_enable, + + S_AXIS_ACLK => S_AXIS_ACLK, + S_AXIS_TREADY => S_AXIS_TREADY, + S_AXIS_TDATA => S_AXIS_TDATA(31 downto 8), + S_AXIS_TLAST => S_AXIS_TLAST, + S_AXIS_TVALID => S_AXIS_TVALID, + + out_stb => tx_stb, + out_ack => tx_ack, + out_data => tx_data + ); + end generate; + + streaming_dma_rx_gen: if C_DMA_TYPE = 0 and C_HAS_RX = 1 generate + rx_fifo : entity axi_streaming_dma_rx_fifo + generic map( + RAM_ADDR_WIDTH => FIFO_AWIDTH, + FIFO_DWIDTH => 24 + ) + port map( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + fifo_reset => tx_fifo_reset, + enable => tx_enable, + + period_len => period_len, + + in_stb => rx_stb, + in_ack => rx_ack, + in_data => rx_data, + + M_AXIS_ACLK => M_AXIS_ACLK, + M_AXIS_TREADY => M_AXIS_TREADY, + M_AXIS_TDATA => M_AXIS_TDATA(31 downto 8), + M_AXIS_TLAST => M_AXIS_TLAST, + M_AXIS_TVALID => M_AXIS_TVALID, + M_AXIS_TKEEP => M_AXIS_TKEEP + ); + + M_AXIS_TDATA(7 downto 0) <= (others => '0'); + end generate; + + pl330_dma_tx_gen: if C_DMA_TYPE = 1 and C_HAS_TX = 1 generate + tx_fifo_stb <= '1' when wr_addr = 11 and wr_stb = '1' else '0'; + + tx_fifo: entity pl330_dma_fifo + generic map( + RAM_ADDR_WIDTH => FIFO_AWIDTH, + FIFO_DWIDTH => 24, + FIFO_DIRECTION => 0 + ) + port map ( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + fifo_reset => tx_fifo_reset, + enable => tx_enable, + + in_data => wr_data(31 downto 8), + in_stb => tx_fifo_stb, + in_ack => tx_in_ack, + + out_ack => tx_ack, + out_stb => tx_stb, + out_data => tx_data, + + dclk => DMA_REQ_TX_ACLK, + dresetn => DMA_REQ_TX_RSTN, + davalid => DMA_REQ_TX_DAVALID, + daready => DMA_REQ_TX_DAREADY, + datype => DMA_REQ_TX_DATYPE, + drvalid => DMA_REQ_TX_DRVALID, + drready => DMA_REQ_TX_DRREADY, + drtype => DMA_REQ_TX_DRTYPE, + drlast => DMA_REQ_TX_DRLAST + ); + end generate; + + + pl330_dma_rx_gen: if C_DMA_TYPE = 1 and C_HAS_RX = 1 generate + rx_fifo_ack <= '1' when rd_addr = 10 and rd_ack = '1' else '0'; + + rx_fifo: entity pl330_dma_fifo + generic map( + RAM_ADDR_WIDTH => FIFO_AWIDTH, + FIFO_DWIDTH => 24, + FIFO_DIRECTION => 1 + ) + port map ( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + fifo_reset => rx_fifo_reset, + enable => rx_enable, + + in_ack => rx_ack, + in_stb => rx_stb, + in_data => rx_data, + + out_data => rx_sample, + out_ack => rx_fifo_ack, + out_stb => rx_out_stb, + + dclk => DMA_REQ_RX_ACLK, + dresetn => DMA_REQ_RX_RSTN, + davalid => DMA_REQ_RX_DAVALID, + daready => DMA_REQ_RX_DAREADY, + datype => DMA_REQ_RX_DATYPE, + drvalid => DMA_REQ_RX_DRVALID, + drready => DMA_REQ_RX_DRREADY, + drtype => DMA_REQ_RX_DRTYPE, + drlast => DMA_REQ_RX_DRLAST + ); + end generate; + + ctrl : entity i2s_controller + generic map ( + C_SLOT_WIDTH => C_SLOT_WIDTH, + C_BCLK_POL => C_BCLK_POL, + C_LRCLK_POL => C_LRCLK_POL, + C_NUM_CH => C_NUM_CH, + C_HAS_TX => C_HAS_TX, + C_HAS_RX => C_HAS_RX + ) + port map ( + clk => s00_axi_aclk, + resetn => s00_axi_aresetn, + + data_clk => DATA_CLK_I, + BCLK_O => BCLK_O, + LRCLK_O => LRCLK_O, + SDATA_O => SDATA_O, + SDATA_I => SDATA_I, + + tx_enable => tx_enable, + tx_ack => tx_ack, + tx_stb => tx_stb, + tx_data => tx_data, + + rx_enable => rx_enable, + rx_ack => rx_ack, + rx_stb => rx_stb, + rx_data => rx_data, + + bclk_div_rate => bclk_div_rate, + lrclk_div_rate => lrclk_div_rate + ); + + + + tx_fifo_full <= not(tx_in_ack); + tx_fifo_empty <= not(tx_stb); + rx_fifo_full <= not(rx_ack); + rx_fifo_empty <= not(rx_out_stb); + i2s_reset <= I2S_RESET_REG(0); + tx_fifo_reset <= I2S_RESET_REG(1); + rx_fifo_reset <= I2S_RESET_REG(2); + tx_enable <= I2S_CONTROL_REG(0) = '1'; + rx_enable <= I2S_CONTROL_REG(1) = '1'; + MUTEN_O <= not(I2S_CONTROL_REG(2)); + bclk_div_rate <= to_integer(unsigned(I2S_CLK_CONTROL_REG(7 downto 0))); + lrclk_div_rate <= to_integer(unsigned(I2S_CLK_CONTROL_REG(23 downto 16))); + period_len <= to_integer(unsigned(PERIOD_LEN_REG(15 downto 0))); + + process(rd_addr) + begin + case rd_addr is + when 1 => rd_data <= I2S_CONTROL_REG and x"00000007"; + when 2 => rd_data <= I2S_CLK_CONTROL_REG and x"00ff00ff"; + when 6 => rd_data <= PERIOD_LEN_REG and x"0000ffff"; + when 8 => rd_data <= x"0000000" & rx_fifo_full & rx_fifo_empty & tx_fifo_full & tx_fifo_empty; + when 10 => rd_data <= rx_sample & std_logic_vector(to_unsigned(cnt, 8)); + when others => rd_data <= (others => '0'); + end case; + end process; + + process(s00_axi_aclk) is + begin + if rising_edge(s00_axi_aclk) then + if s00_axi_aresetn = '0' then + I2S_RESET_REG <= (others => '0'); + I2S_CONTROL_REG <= (others => '0'); + I2S_CLK_CONTROL_REG <= (others => '0'); + PERIOD_LEN_REG <= (others => '0'); + else + -- Auto-clear the Reset Register bits + I2S_RESET_REG(0) <= '0'; + I2S_RESET_REG(1) <= '0'; + I2S_RESET_REG(2) <= '0'; + if wr_stb = '1' then + case wr_addr is + when 0 => I2S_RESET_REG <= wr_data; + when 1 => I2S_CONTROL_REG <= wr_data; + when 2 => I2S_CLK_CONTROL_REG <= wr_data; + when 6 => PERIOD_LEN_REG <= wr_data; + when others => null; + end case; + end if; + end if; + end if; + end process; + -- User logic ends + +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd new file mode 100644 index 0000000..0218f34 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/fifo_synchronizer.vhd @@ -0,0 +1,108 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; + +entity fifo_synchronizer is + generic ( + DEPTH : integer := 4; + WIDTH : integer := 2 + ); + port ( + resetn : in std_logic; + + in_clk : in std_logic; + in_data : in std_logic_vector(WIDTH - 1 downto 0); + in_tick : in std_logic; + + out_clk : in std_logic; + out_data : out std_logic_vector(WIDTH - 1 downto 0); + out_tick : out std_logic + ); + +end fifo_synchronizer; + +architecture impl of fifo_synchronizer is + type DATA_SYNC_FIFO_TYPE is array (0 to DEPTH - 1) of std_logic_vector(WIDTH - 1 downto 0); + signal fifo: DATA_SYNC_FIFO_TYPE; + + signal rd_addr : natural range 0 to DEPTH - 1; + signal wr_addr : natural range 0 to DEPTH - 1; + + signal tick : std_logic; + signal tick_d1 : std_logic; + signal tick_d2 : std_logic; +begin + + process (in_clk) + begin + if rising_edge(in_clk) then + if resetn = '0' then + wr_addr <= 0; + tick <= '0'; + else + if in_tick = '1' then + fifo(wr_addr) <= in_data; + wr_addr <= (wr_addr + 1) mod DEPTH; + tick <= not tick; + end if; + end if; + end if; + end process; + + process (out_clk) + begin + if rising_edge(out_clk) then + if resetn = '0' then + rd_addr <= 0; + tick_d1 <= '0'; + tick_d2 <= '0'; + else + tick_d1 <= tick; + tick_d2 <= tick_d1; + out_tick <= tick_d1 xor tick_d2; + if (tick_d1 xor tick_d2) = '1' then + rd_addr <= (rd_addr + 1) mod DEPTH; + out_data <= fifo(rd_addr); + end if; + end if; + end if; + end process; + +end; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd new file mode 100644 index 0000000..874099a --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_clkgen.vhd @@ -0,0 +1,133 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; + +entity i2s_clkgen is + port( + clk : in std_logic; -- System clock + resetn : in std_logic; -- System reset + + enable : in Boolean ; -- Enable clockgen + + tick : in std_logic; + + bclk_div_rate : in natural range 0 to 255; + lrclk_div_rate : in natural range 0 to 255; + + bclk : out std_logic; -- Bit Clock + lrclk : out std_logic; -- Frame Clock + channel_sync : out std_logic; + frame_sync : out std_logic + ); +end i2s_clkgen; + +architecture Behavioral of i2s_clkgen is + signal reset_int : Boolean; + + signal prev_bclk_div_rate : natural range 0 to 255; + signal prev_lrclk_div_rate : natural range 0 to 255; + + signal bclk_count : natural range 0 to 255; + signal lrclk_count : natural range 0 to 255; + + signal bclk_int : std_logic; + signal lrclk_int : std_logic; + + signal lrclk_tick : Boolean; +begin + + reset_int <= resetn = '0' or not enable; + + bclk <= bclk_int; + lrclk <= lrclk_int; + +----------------------------------------------------------------------------------- +-- Serial clock generation BCLK_O +----------------------------------------------------------------------------------- + bclk_gen: process(clk) + begin + if rising_edge(clk) then + prev_bclk_div_rate <= bclk_div_rate; + if reset_int then -- or (bclk_div_rate /= prev_bclk_div_rate) then + bclk_int <= '1'; + bclk_count <= bclk_div_rate; + else + if tick = '1' then + if bclk_count = bclk_div_rate then + bclk_count <= 0; + bclk_int <= not bclk_int; + else + bclk_count <= bclk_count + 1; + end if; + end if; + end if; + end if; + end process bclk_gen; + + lrclk_tick <= tick = '1' and bclk_count = bclk_div_rate and bclk_int = '1'; + + channel_sync <= '1' when lrclk_count = 1 else '0'; + frame_sync <= '1' when lrclk_count = 1 and lrclk_int = '0' else '0'; + +----------------------------------------------------------------------------------- +-- Frame clock generator LRCLK_O +----------------------------------------------------------------------------------- + lrclk_gen: process(clk) + begin + if rising_edge(clk) then + prev_lrclk_div_rate <= lrclk_div_rate; + -- Reset + if reset_int then -- or lrclk_div_rate /= prev_lrclk_div_rate then + lrclk_int <= '1'; + lrclk_count <= lrclk_div_rate; + else + if lrclk_tick then + if lrclk_count = lrclk_div_rate then + lrclk_count <= 0; + lrclk_int <= not lrclk_int; + else + lrclk_count <= lrclk_count + 1; + end if; + end if; + end if; + end if; + end process lrclk_gen; + +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_controller.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_controller.vhd new file mode 100644 index 0000000..59bde04 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_controller.vhd @@ -0,0 +1,282 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; + +library axi_i2s_adi_v1_00_a; +use axi_i2s_adi_v1_00_a.fifo_synchronizer; +use axi_i2s_adi_v1_00_a.i2s_clkgen; +use axi_i2s_adi_v1_00_a.i2s_tx; +use axi_i2s_adi_v1_00_a.i2s_rx; + +entity i2s_controller is + generic( + C_SLOT_WIDTH : integer := 24; -- Width of one Slot + C_BCLK_POL : integer := 0; -- BCLK Polarity (0 - Falling edge, 1 - Rising edge) + C_LRCLK_POL : integer := 0; -- LRCLK Polarity (0 - Falling edge, 1 - Rising edge) + C_NUM_CH : integer := 1; + C_HAS_TX : integer := 1; + C_HAS_RX : integer := 1 + ); + port( + clk : in std_logic; -- System clock + resetn : in std_logic; -- System reset + + data_clk : in std_logic; -- Data clock should be less than clk / 4 + BCLK_O : out std_logic_vector(C_NUM_CH - 1 downto 0); -- Bit Clock + LRCLK_O : out std_logic_vector(C_NUM_CH - 1 downto 0); -- Frame Clock + SDATA_O : out std_logic_vector(C_NUM_CH - 1 downto 0); -- Serial Data Output + SDATA_I : in std_logic_vector(C_NUM_CH - 1 downto 0); -- Serial Data Input + + tx_enable : in Boolean; -- Enable TX + tx_ack : out std_logic; -- Request new Slot Data + tx_stb : in std_logic; -- Request new Slot Data + tx_data : in std_logic_vector(C_SLOT_WIDTH-1 downto 0); -- Slot Data in + + rx_enable : in Boolean; -- Enable RX + rx_ack : in std_logic; + rx_stb : out std_logic; -- Valid Slot Data + rx_data : out std_logic_vector(C_SLOT_WIDTH-1 downto 0); -- Slot Data out + + -- Runtime parameter + bclk_div_rate : in natural range 0 to 255; + lrclk_div_rate : in natural range 0 to 255 + ); +end i2s_controller; + +architecture Behavioral of i2s_controller is +constant NUM_TX : integer := C_HAS_TX * C_NUM_CH; +constant NUM_RX : integer := C_HAS_RX * C_NUM_CH; + +signal enable : Boolean; + +signal tick : std_logic; +signal tick_d1 : std_logic; +signal tick_d2 : std_logic; + +signal BCLK_O_int : std_logic; +signal LRCLK_O_int : std_logic; + +signal tx_bclk : std_logic; +signal tx_lrclk : std_logic; +signal tx_sdata : std_logic_vector(C_NUM_CH - 1 downto 0); +signal tx_tick : std_logic; +signal tx_channel_sync : std_logic; +signal tx_frame_sync : std_logic; + +signal bclk_tick : std_logic; + +signal rx_bclk : std_logic; +signal rx_lrclk : std_logic; +signal rx_sdata : std_logic_vector(NUM_RX - 1 downto 0); +signal rx_channel_sync : std_logic; +signal rx_frame_sync : std_logic; + +signal tx_sync_fifo_out : std_logic_vector(3 + NUM_TX downto 0); +signal tx_sync_fifo_in : std_logic_vector(3 + NUM_TX downto 0); +signal rx_sync_fifo_out : std_logic_vector(3 + NUM_RX downto 0); +signal rx_sync_fifo_in : std_logic_vector(3 + NUM_RX downto 0); + +begin + enable <= rx_enable or tx_enable; + + -- Generate tick signal in the DATA_CLK_I domain + process (data_clk) + begin + if rising_edge(data_clk) then + if resetn = '0' then + tick <= '0'; + else + tick <= not tick; + end if; + end if; + end process; + + process (clk) + begin + if rising_edge(clk) then + if resetn = '0' then + tick_d1 <= '0'; + tick_d2 <= '0'; + else + tick_d1 <= tick; + tick_d2 <= tick_d1; + end if; + end if; + end process; + + tx_tick <= tick_d2 xor tick_d1; + + tx_sync_fifo_in(0) <= tx_channel_sync; + tx_sync_fifo_in(1) <= tx_frame_sync; + tx_sync_fifo_in(2) <= tx_bclk; + tx_sync_fifo_in(3) <= tx_lrclk; + tx_sync_fifo_in(3 + NUM_TX downto 4) <= tx_sdata; + + process (data_clk) + begin + if rising_edge(data_clk) then + if resetn = '0' then + BCLK_O <= (others => '1'); + LRCLK_O <= (others => '1'); + SDATA_O <= (others => '0'); + else + if C_BCLK_POL = 0 then + BCLK_O <= (others => tx_sync_fifo_out(2)); + else + BCLK_O <= (others => not tx_sync_fifo_out(2)); + end if; + + if C_LRCLK_POL = 0 then + LRCLK_O <= (others => tx_sync_fifo_out(3)); + else + LRCLK_O <= (others => not tx_sync_fifo_out(3)); + end if; + + if C_HAS_TX = 1 then + SDATA_O <= tx_sync_fifo_out(3 + NUM_TX downto 4); + end if; + + if C_HAS_RX = 1 then + rx_sync_fifo_in(3 downto 0) <= tx_sync_fifo_out(3 downto 0); + rx_sync_fifo_in(3 + NUM_RX downto 4) <= SDATA_I; + end if; + end if; + end if; + end process; + + tx_sync: entity fifo_synchronizer + generic map ( + DEPTH => 4, + WIDTH => NUM_TX + 4 + ) + port map ( + resetn => resetn, + in_clk => clk, + in_data => tx_sync_fifo_in, + in_tick => tx_tick, + + out_clk => data_clk, + out_data => tx_sync_fifo_out + ); + + clkgen: entity i2s_clkgen + port map( + clk => clk, + resetn => resetn, + enable => enable, + tick => tx_tick, + + bclk_div_rate => bclk_div_rate, + lrclk_div_rate => lrclk_div_rate, + + channel_sync => tx_channel_sync, + frame_sync => tx_frame_sync, + + bclk => tx_bclk, + lrclk => tx_lrclk + ); + + tx_gen: if C_HAS_TX = 1 generate + tx: entity i2s_tx + generic map ( + C_SLOT_WIDTH => C_SLOT_WIDTH, + C_NUM => NUM_TX + ) + port map ( + clk => clk, + resetn => resetn, + enable => tx_enable, + + channel_sync => tx_channel_sync, + frame_sync => tx_frame_sync, + bclk => tx_bclk, + sdata => tx_sdata, + + ack => tx_ack, + stb => tx_stb, + data => tx_data + ); + end generate; + + rx_gen: if C_HAS_RX = 1 generate + rx: entity i2s_rx + generic map ( + C_SLOT_WIDTH => C_SLOT_WIDTH, + C_NUM => NUM_RX + ) + port map ( + clk => clk, + resetn => resetn, + enable => rx_enable, + + channel_sync => rx_channel_sync, + frame_sync => rx_frame_sync, + bclk => rx_bclk, + sdata => rx_sdata, + + ack => rx_ack, + stb => rx_stb, + data => rx_data + ); + + rx_channel_sync <= rx_sync_fifo_out(0); + rx_frame_sync <= rx_sync_fifo_out(1); + rx_bclk <= rx_sync_fifo_out(2); + rx_lrclk <= rx_sync_fifo_out(3); + rx_sdata <= rx_sync_fifo_out(3 + NUM_RX downto 4); + + rx_sync: entity fifo_synchronizer + generic map ( + DEPTH => 4, + WIDTH => NUM_RX + 4 + ) + port map ( + resetn => resetn, + in_clk => data_clk, + in_data => rx_sync_fifo_in, + in_tick => '1', + + out_clk => clk, + out_data => rx_sync_fifo_out + ); + + end generate; + +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd new file mode 100644 index 0000000..aa4e584 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_rx.vhd @@ -0,0 +1,180 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity i2s_rx is + generic( + C_SLOT_WIDTH : integer := 24; -- Width of one Slot + C_NUM : integer := 1 + ); + port( + clk : in std_logic; -- System clock + resetn : in std_logic; -- System reset + enable : in Boolean; -- Enable RX + + bclk : in std_logic; -- Bit Clock + channel_sync : in std_logic; -- Channel Sync + frame_sync : in std_logic; -- Frame Sync + sdata : in std_logic_vector(C_NUM - 1 downto 0); -- Serial Data Output + + stb : out std_logic; -- Data available + ack : in std_logic; -- Data has been consumed + data : out std_logic_vector(C_SLOT_WIDTH-1 downto 0) -- Slot Data in + ); +end i2s_rx; + +architecture Behavioral of i2s_rx is + type mem is array (0 to C_NUM - 1) of std_logic_vector(31 downto 0); + type mem_latched is array (0 to C_NUM - 1) of std_logic_vector(C_SLOT_WIDTH - 1 downto 0); + signal data_int : mem; + signal data_latched : mem_latched; + signal reset_int : Boolean; + signal enable_int : Boolean; + + signal bit_sync : std_logic; + signal channel_sync_int : std_logic; + signal frame_sync_int : std_logic; + + signal bclk_d1 : std_logic; + + type sequencer_state_type is (IDLE, ACTIVE); + signal sequencer_state : sequencer_state_type; + signal seq : natural range 0 to C_NUM - 1; + + signal ovf_frame_cnt : natural range 0 to 1; +begin + + reset_int <= (resetn = '0') or not enable; + + process (clk) + begin + if rising_edge(clk) then + if resetn = '0' then + bclk_d1 <= '0'; + else + bclk_d1 <= bclk; + end if; + end if; + end process; + + bit_sync <= (bclk xor bclk_d1) and bclk; + channel_sync_int <= channel_sync and bit_sync; + frame_sync_int <= frame_sync and bit_sync; + + stb <= '1' when sequencer_state = ACTIVE else '0'; + + sequencer: process (clk) + begin + if rising_edge(clk) then + if reset_int or not enable_int then + sequencer_state <= IDLE; + ovf_frame_cnt <= 0; + seq <= 0; + else + case sequencer_state is + when IDLE => + if channel_sync_int = '1' then + if ovf_frame_cnt = 0 then + sequencer_state <= ACTIVE; + else + ovf_frame_cnt <= (ovf_frame_cnt + 1) mod 2; + end if; + end if; + when ACTIVE => + -- The unlikely event the last ack came in in the same clock + -- cyclce as the channel sync signal will still be treated + -- as an overflow. This keeps the logic simple + if ack = '1' then + if seq = C_NUM - 1 then + sequencer_state <= IDLE; + seq <= 0; + else + seq <= seq + 1; + end if; + end if; + if channel_sync_int = '1' then + ovf_frame_cnt <= (ovf_frame_cnt + 1) mod 2; + end if; + end case; + end if; + end if; + end process; + + data <= data_latched(seq); + + gen: for i in 0 to C_NUM - 1 generate + + unserialize_data: process(clk) + begin + if rising_edge(clk) then + if reset_int then + data_int(i) <= (others => '0'); + elsif bit_sync = '1' then + if channel_sync = '1' then + if sequencer_state = IDLE then + data_latched(i) <= data_int(i)(31 downto 32 - C_SLOT_WIDTH); +-- data_latched(i) <= data_int(i)(31 downto 32 - +-- C_SLOT_WIDTH + 8) & +-- std_logic_vector(to_unsigned(i+1,8)); + end if; + end if; + data_int(i) <= data_int(i)(30 downto 0) & sdata(i); + end if; + end if; + end process unserialize_data; + end generate; + + enable_sync: process (clk) + begin + if rising_edge(clk) then + if reset_int then + enable_int <= False; + else + if enable and frame_sync_int = '1' then + enable_int <= True; + elsif not enable then + enable_int <= False; + end if; + end if; + end if; + end process enable_sync; + +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd new file mode 100644 index 0000000..a055d15 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/hdl/i2s_tx.vhd @@ -0,0 +1,134 @@ +-- *************************************************************************** +-- *************************************************************************** +-- Copyright 2013(c) Analog Devices, Inc. +-- Author: Lars-Peter Clausen +-- +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without modification, +-- are permitted provided that the following conditions are met: +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- - 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. +-- - Neither the name of Analog Devices, Inc. nor the names of its +-- contributors may be used to endorse or promote products derived +-- from this software without specific prior written permission. +-- - The use of this software may or may not infringe the patent rights +-- of one or more patent holders. This license does not release you +-- from the requirement that you obtain separate licenses from these +-- patent holders to use this software. +-- - Use of the software either in source or binary form, must be run +-- on or directly connected to an Analog Devices Inc. component. +-- +-- THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +-- INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. +-- +-- IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, INTELLECTUAL PROPERTY +-- RIGHTS, 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. +-- *************************************************************************** +-- *************************************************************************** + +library ieee; +use ieee.std_logic_1164.all; + +entity i2s_tx is + generic( + C_SLOT_WIDTH : integer := 24; -- Width of one Slot + C_NUM : integer := 1 + ); + port( + clk : in std_logic; -- System clock + resetn : in std_logic; -- System reset + enable : in Boolean; -- Enable TX + + bclk : in std_logic; -- Bit Clock + channel_sync : in std_logic; -- Channel Sync + frame_sync : in std_logic; -- Frame Sync + sdata : out std_logic_vector(C_NUM - 1 downto 0); -- Serial Data Output + + ack : out std_logic; -- Request new Slot Data + stb : in std_logic; -- Request new Slot Data + data : in std_logic_vector(C_SLOT_WIDTH-1 downto 0) -- Slot Data in + ); +end i2s_tx; + +architecture Behavioral of i2s_tx is + type mem is array (0 to C_NUM - 1) of std_logic_vector(31 downto 0); + signal data_int : mem; + signal reset_int : Boolean; + signal enable_int : Boolean; + + signal bit_sync : std_logic; + signal channel_sync_int : std_logic; + signal frame_sync_int : std_logic; + signal channel_sync_int_d1 : std_logic; + + signal bclk_d1 : std_logic; +begin + + reset_int <= resetn = '0' or not enable; + + process (clk) + begin + if rising_edge(clk) then + if resetn = '0' then + bclk_d1 <= '0'; + channel_sync_int_d1 <= '0'; + else + bclk_d1 <= bclk; + channel_sync_int_d1 <= channel_sync_int; + end if; + end if; + end process; + + bit_sync <= (bclk xor bclk_d1) and not bclk; + channel_sync_int <= channel_sync and bit_sync; + frame_sync_int <= frame_sync and bit_sync; + + ack <= '1' when channel_sync_int_d1 = '1' and enable_int else '0'; + + gen: for i in 0 to C_NUM - 1 generate + + serialize_data: process(clk) + begin + if rising_edge(clk) then + if reset_int then + data_int(i)(31 downto 0) <= (others => '0'); + elsif bit_sync = '1' then + if channel_sync_int = '1' then + data_int(i)(31 downto 32-C_SLOT_WIDTH) <= data; + data_int(i)(31-C_SLOT_WIDTH downto 0) <= (others => '0'); + else + data_int(i) <= data_int(i)(30 downto 0) & '0'; + end if; + end if; + end if; + end process serialize_data; + sdata(i) <= data_int(i)(31) when enable_int else '0'; + + end generate; + + enable_sync: process (clk) + begin + if rising_edge(clk) then + if reset_int then + enable_int <= False; + else + if enable and frame_sync_int = '1' and stb = '1' then + enable_int <= True; + elsif not enable then + enable_int <= False; + end if; + end if; + end if; + end process; + +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl new file mode 100644 index 0000000..df0c86f --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_i2s_adi_1.2/xgui/axi_i2s_adi_v1_2.tcl @@ -0,0 +1,105 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_S00_AXI_BASEADDR" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_S00_AXI_HIGHADDR" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_LRCLK_POL" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_BCLK_POL" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_DMA_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_HAS_TX" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_HAS_RX" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_BCLK_POL { PARAM_VALUE.C_BCLK_POL } { + # Procedure called to update C_BCLK_POL when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_BCLK_POL { PARAM_VALUE.C_BCLK_POL } { + # Procedure called to validate C_BCLK_POL + return true +} + +proc update_PARAM_VALUE.C_DMA_TYPE { PARAM_VALUE.C_DMA_TYPE } { + # Procedure called to update C_DMA_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_DMA_TYPE { PARAM_VALUE.C_DMA_TYPE } { + # Procedure called to validate C_DMA_TYPE + return true +} + +proc update_PARAM_VALUE.C_HAS_RX { PARAM_VALUE.C_HAS_RX } { + # Procedure called to update C_HAS_RX when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_HAS_RX { PARAM_VALUE.C_HAS_RX } { + # Procedure called to validate C_HAS_RX + return true +} + +proc update_PARAM_VALUE.C_HAS_TX { PARAM_VALUE.C_HAS_TX } { + # Procedure called to update C_HAS_TX when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_HAS_TX { PARAM_VALUE.C_HAS_TX } { + # Procedure called to validate C_HAS_TX + return true +} + +proc update_PARAM_VALUE.C_LRCLK_POL { PARAM_VALUE.C_LRCLK_POL } { + # Procedure called to update C_LRCLK_POL when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_LRCLK_POL { PARAM_VALUE.C_LRCLK_POL } { + # Procedure called to validate C_LRCLK_POL + return true +} + +proc update_PARAM_VALUE.C_S00_AXI_BASEADDR { PARAM_VALUE.C_S00_AXI_BASEADDR } { + # Procedure called to update C_S00_AXI_BASEADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S00_AXI_BASEADDR { PARAM_VALUE.C_S00_AXI_BASEADDR } { + # Procedure called to validate C_S00_AXI_BASEADDR + return true +} + +proc update_PARAM_VALUE.C_S00_AXI_HIGHADDR { PARAM_VALUE.C_S00_AXI_HIGHADDR } { + # Procedure called to update C_S00_AXI_HIGHADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S00_AXI_HIGHADDR { PARAM_VALUE.C_S00_AXI_HIGHADDR } { + # Procedure called to validate C_S00_AXI_HIGHADDR + return true +} + + +proc update_MODELPARAM_VALUE.C_LRCLK_POL { MODELPARAM_VALUE.C_LRCLK_POL PARAM_VALUE.C_LRCLK_POL } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_LRCLK_POL}] ${MODELPARAM_VALUE.C_LRCLK_POL} +} + +proc update_MODELPARAM_VALUE.C_BCLK_POL { MODELPARAM_VALUE.C_BCLK_POL PARAM_VALUE.C_BCLK_POL } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_BCLK_POL}] ${MODELPARAM_VALUE.C_BCLK_POL} +} + +proc update_MODELPARAM_VALUE.C_DMA_TYPE { MODELPARAM_VALUE.C_DMA_TYPE PARAM_VALUE.C_DMA_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_DMA_TYPE}] ${MODELPARAM_VALUE.C_DMA_TYPE} +} + +proc update_MODELPARAM_VALUE.C_HAS_TX { MODELPARAM_VALUE.C_HAS_TX PARAM_VALUE.C_HAS_TX } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_HAS_TX}] ${MODELPARAM_VALUE.C_HAS_TX} +} + +proc update_MODELPARAM_VALUE.C_HAS_RX { MODELPARAM_VALUE.C_HAS_RX PARAM_VALUE.C_HAS_RX } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_HAS_RX}] ${MODELPARAM_VALUE.C_HAS_RX} +} + diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/bd/bd.tcl b/zynqberrydemo3/ip_lib/axi_reg32_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/component.xml b/zynqberrydemo3/ip_lib/axi_reg32_1.0/component.xml new file mode 100644 index 0000000..f1f9721 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/component.xml @@ -0,0 +1,2288 @@ + + + trenz.biz + user + axi_reg32 + 1.0 + + + S_AXI + + + + + + + + + AWADDR + + + s_axi_awaddr + + + + + AWPROT + + + s_axi_awprot + + + + + AWVALID + + + s_axi_awvalid + + + + + AWREADY + + + s_axi_awready + + + + + WDATA + + + s_axi_wdata + + + + + WSTRB + + + s_axi_wstrb + + + + + WVALID + + + s_axi_wvalid + + + + + WREADY + + + s_axi_wready + + + + + BRESP + + + s_axi_bresp + + + + + BVALID + + + s_axi_bvalid + + + + + BREADY + + + s_axi_bready + + + + + ARADDR + + + s_axi_araddr + + + + + ARPROT + + + s_axi_arprot + + + + + ARVALID + + + s_axi_arvalid + + + + + ARREADY + + + s_axi_arready + + + + + RDATA + + + s_axi_rdata + + + + + RRESP + + + s_axi_rresp + + + + + RVALID + + + s_axi_rvalid + + + + + RREADY + + + s_axi_rready + + + + + + WIZ.DATA_WIDTH + 32 + + + WIZ.NUM_REG + 32 + + + SUPPORTS_NARROW_BURST + 0 + + + + + S_AXI_RST + + + + + + + RST + + + s_axi_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + S_AXI_CLK + + + + + + + CLK + + + s_axi_aclk + + + + + + ASSOCIATED_BUSIF + S_AXI + + + ASSOCIATED_RESET + s_axi_aresetn + + + + + + + S_AXI + + S_AXI_reg + 0 + 4096 + 32 + register + + + OFFSET_BASE_PARAM + C_S_AXI_BASEADDR + + + OFFSET_HIGH_PARAM + C_S_AXI_HIGHADDR + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axi_reg32_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + e1c055d0 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axi_reg32_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + e1c055d0 + + + + + xilinx_softwaredriver + Software Driver + :vivado.xilinx.com:sw.driver + + xilinx_softwaredriver_view_fileset + + + + viewChecksum + 61d40803 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + c9c5ebb6 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + xilinx_utilityxitfiles + Utility XIT/TTCL + :vivado.xilinx.com:xit.util + + xilinx_utilityxitfiles_view_fileset + + + + viewChecksum + a8354ffc + + + + + + + RR0 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + true + + + + + + RR1 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + true + + + + + + RR2 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR3 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR4 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR5 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR6 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR7 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR8 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR9 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR10 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR11 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR12 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR13 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR14 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + RR15 + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + optional + false + + + + + + WR0 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + true + + + + + + WR1 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + true + + + + + + WR2 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR3 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR4 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR5 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR6 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR7 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR8 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR9 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR10 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR11 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR12 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR13 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR14 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + WR15 + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + optional + false + + + + + + s_axi_awaddr + + in + + 6 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_awprot + + in + + 2 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_awvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_awready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_wdata + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_wstrb + + in + + 3 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_wvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_wready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_bresp + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_bvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_bready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_araddr + + in + + 6 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_arprot + + in + + 2 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_arvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_arready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_rdata + + out + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_rresp + + out + + 1 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_rvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_rready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_aclk + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axi_aresetn + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + + C_S_AXI_DATA_WIDTH + C S AXI DATA WIDTH + Width of S_AXI data bus + 32 + + + C_S_AXI_ADDR_WIDTH + C S AXI ADDR WIDTH + Width of S_AXI address bus + 7 + + + C_REG_WIDTH + C Reg Width + 32 + + + + false + + + + + + C_NUM_RO_REG + C Num Ro Reg + 2 + + + C_NUM_WR_REG + C Num Wr Reg + 2 + + + C_WR_READABLE + C Wr Readable + true + + + C_RR0_ALIAS + C Rr0 Alias + RR0 + + + C_RR1_ALIAS + C Rr1 Alias + RR1 + + + C_WR0_ALIAS + C Wr0 Alias + WR0 + + + C_WR1_ALIAS + C Wr1 Alias + WR1 + + + C_RR2_ALIAS + C Rr2 Alias + RR2 + + + C_RR3_ALIAS + C Rr3 Alias + RR3 + + + C_RR4_ALIAS + C Rr4 Alias + RR4 + + + C_RR5_ALIAS + C Rr5 Alias + RR5 + + + C_RR6_ALIAS + C Rr6 Alias + RR6 + + + C_RR7_ALIAS + C Rr7 Alias + RR7 + + + C_RR8_ALIAS + C Rr8 Alias + RR8 + + + C_RR9_ALIAS + C Rr9 Alias + RR9 + + + C_RR10_ALIAS + C Rr10 Alias + RR10 + + + C_RR11_ALIAS + C Rr11 Alias + RR11 + + + C_RR12_ALIAS + C Rr12 Alias + RR12 + + + C_RR13_ALIAS + C Rr13 Alias + RR13 + + + C_RR14_ALIAS + C Rr14 Alias + RR14 + + + C_RR15_ALIAS + C Rr15 Alias + RR15 + + + C_WR2_ALIAS + C Wr2 Alias + WR2 + + + C_WR3_ALIAS + C Wr3 Alias + WR3 + + + C_WR4_ALIAS + C Wr4 Alias + WR4 + + + C_WR5_ALIAS + C Wr5 Alias + WR5 + + + C_WR6_ALIAS + C Wr6 Alias + WR6 + + + C_WR7_ALIAS + C Wr7 Alias + WR7 + + + C_WR8_ALIAS + C Wr8 Alias + WR8 + + + C_WR9_ALIAS + C Wr9 Alias + WR9 + + + C_WR10_ALIAS + C Wr10 Alias + WR10 + + + C_WR11_ALIAS + C Wr11 Alias + WR11 + + + C_WR12_ALIAS + C Wr12 Alias + WR12 + + + C_WR13_ALIAS + C Wr13 Alias + WR13 + + + C_WR14_ALIAS + C Wr14 Alias + WR14 + + + C_WR15_ALIAS + C Wr15 Alias + WR15 + + + C_WR0_DEFAULT + C Wr0 Default + 0 + + + C_WR1_DEFAULT + C Wr1 Default + 0 + + + C_WR2_DEFAULT + C Wr2 Default + 0 + + + C_WR3_DEFAULT + C Wr3 Default + 0 + + + C_WR4_DEFAULT + C Wr4 Default + 0 + + + C_WR5_DEFAULT + C Wr5 Default + 0 + + + C_WR6_DEFAULT + C Wr6 Default + 0 + + + C_WR7_DEFAULT + C Wr7 Default + 0 + + + C_WR8_DEFAULT + C Wr8 Default + 0 + + + C_WR9_DEFAULT + C Wr9 Default + 0 + + + C_WR10_DEFAULT + C Wr10 Default + 0 + + + C_WR11_DEFAULT + C Wr11 Default + 0 + + + C_WR12_DEFAULT + C Wr12 Default + 0 + + + C_WR13_DEFAULT + C Wr13 Default + 0 + + + C_WR14_DEFAULT + C Wr14 Default + 0 + + + C_WR15_DEFAULT + C Wr15 Default + 0 + + + + + + choices_0 + 32 + + + choices_1 + 1 + 0 + + + choices_2 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + + + choices_3 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axi_reg32_v1_0_S_AXI.vhd + vhdlSource + axi_lib + + + hdl/axi_reg32_v1_0.vhd + vhdlSource + CHECKSUM_99fe5a45 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axi_reg32_v1_0_S_AXI.vhd + vhdlSource + axi_lib + + + hdl/axi_reg32_v1_0.vhd + vhdlSource + + + + xilinx_softwaredriver_view_fileset + + drivers/axi_reg32_v1_0/data/axi_reg32.mdd + mdd + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/data/axi_reg32.tcl + tclSource + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/src/Makefile + unknown + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/src/axi_reg32.h + cSource + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/src/axi_reg32.c + cSource + USED_IN_hw_handoff + + + drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c + cSource + USED_IN_hw_handoff + + + + xilinx_xpgui_view_fileset + + xgui/axi_reg32_v1_0.tcl + tclSource + XGUI_VERSION_2 + CHECKSUM_11b62932 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + xilinx_utilityxitfiles_view_fileset + + gui/axi_reg32_v1_0.gtcl + GTCL + + + + AXI Register Bank 16/16 v1.0 + + + C_S_AXI_DATA_WIDTH + C S AXI DATA WIDTH + Width of S_AXI data bus + 32 + + + + false + + + + + + C_S_AXI_ADDR_WIDTH + C S AXI ADDR WIDTH + Width of S_AXI address bus + 7 + + + + false + + + + + + C_S_AXI_BASEADDR + C S AXI BASEADDR + 0xFFFFFFFF + + + + false + + + + + + C_S_AXI_HIGHADDR + C S AXI HIGHADDR + 0x00000000 + + + + false + + + + + + Component_Name + axi_reg32_v1_0 + + + C_NUM_RO_REG + Number of input registers + 2 + + + C_NUM_WR_REG + Number of output registers + 2 + + + C_WR_READABLE + Output registers are readable + true + + + C_RR0_ALIAS + RR0 + RR0 + + + + true + + + + + + C_RR1_ALIAS + RR1 + RR1 + + + + true + + + + + + C_WR0_ALIAS + WR0 + WR0 + + + C_WR1_ALIAS + WR1 + WR1 + + + C_RR2_ALIAS + RR2 + RR2 + + + C_RR3_ALIAS + RR3 + RR3 + + + C_RR4_ALIAS + RR4 + RR4 + + + C_RR5_ALIAS + RR5 + RR5 + + + C_RR6_ALIAS + RR6 + RR6 + + + C_RR7_ALIAS + RR7 + RR7 + + + C_RR8_ALIAS + RR8 + RR8 + + + C_RR9_ALIAS + RR9 + RR9 + + + C_RR10_ALIAS + RR10 + RR10 + + + C_RR11_ALIAS + RR11 + RR11 + + + C_RR12_ALIAS + RR12 + RR12 + + + C_RR13_ALIAS + RR13 + RR13 + + + C_RR14_ALIAS + RR14 + RR14 + + + C_RR15_ALIAS + RR15 + RR15 + + + C_WR2_ALIAS + WR2 + WR2 + + + C_WR3_ALIAS + WR3 + WR3 + + + C_WR4_ALIAS + WR4 + WR4 + + + C_WR5_ALIAS + WR5 + WR5 + + + C_WR6_ALIAS + WR6 + WR6 + + + C_WR7_ALIAS + WR7 + WR7 + + + C_WR8_ALIAS + WR8 + WR8 + + + C_WR9_ALIAS + WR9 + WR9 + + + C_WR10_ALIAS + WR10 + WR10 + + + C_WR11_ALIAS + WR11 + WR11 + + + C_WR12_ALIAS + WR12 + WR12 + + + C_WR13_ALIAS + WR13 + WR13 + + + C_WR14_ALIAS + WR14 + WR14 + + + C_WR15_ALIAS + WR15 + WR15 + + + C_WR0_DEFAULT + WR0 Value + 0 + + + C_WR1_DEFAULT + WR1 Value + 0 + + + C_WR2_DEFAULT + WR2 Value + 0 + + + C_WR3_DEFAULT + WR3 Value + 0 + + + C_WR4_DEFAULT + WR4 Value + 0 + + + C_WR5_DEFAULT + WR5 Value + 0 + + + C_WR6_DEFAULT + WR6 Value + 0 + + + C_WR7_DEFAULT + WR7 Value + 0 + + + C_WR8_DEFAULT + WR8 Value + 0 + + + C_WR9_DEFAULT + WR9 Value + 0 + + + C_WR10_DEFAULT + WR10 Value + 0 + + + C_WR11_DEFAULT + WR11 Value + 0 + + + C_WR12_DEFAULT + WR12 Value + 0 + + + C_WR13_DEFAULT + WR13 Value + 0 + + + C_WR14_DEFAULT + WR14 Value + 0 + + + C_WR15_DEFAULT + WR15 Value + 0 + + + + + + virtex7 + qvirtex7 + kintex7 + kintex7l + qkintex7 + qkintex7l + artix7 + artix7l + aartix7 + qartix7 + zynq + qzynq + azynq + virtexu + kintexu + + + AXI_Peripheral + + AXI Register Bank 16/16 v1.0 + Trenz Electronic GmbH + 13 + 2015-12-03T08:47:21Z + + b:/cores/2014.4/ip/axi_reg32_1.0 + + + + 2014.4 + + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/data/axi_reg32.tcl b/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/data/axi_reg32.tcl new file mode 100644 index 0000000..9044b7c --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/data/axi_reg32.tcl @@ -0,0 +1,5 @@ + + +proc generate {drv_handle} { + xdefine_include_file $drv_handle "xparameters.h" "axi_reg32" "NUM_INSTANCES" "DEVICE_ID" "C_S_AXI_BASEADDR" "C_S_AXI_HIGHADDR" +} diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.c b/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.c new file mode 100644 index 0000000..1db5c5c --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.c @@ -0,0 +1,6 @@ + + +/***************************** Include Files *******************************/ +#include "axi_reg32.h" + +/************************** Function Definitions ***************************/ diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.h b/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.h new file mode 100644 index 0000000..58bb7b4 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32.h @@ -0,0 +1,107 @@ + +#ifndef AXI_REG32_H +#define AXI_REG32_H + + +/****************** Include Files ********************/ +#include "xil_types.h" +#include "xstatus.h" + +#define RR0_OFFSET 0 +#define RR1_OFFSET 4 +#define RR2_OFFSET 8 +#define RR3_OFFSET 12 +#define RR4_OFFSET 16 +#define RR5_OFFSET 20 +#define RR6_OFFSET 24 +#define RR7_OFFSET 28 +#define RR8_OFFSET 32 +#define RR9_OFFSET 36 +#define RR10_OFFSET 40 +#define RR11_OFFSET 44 +#define RR12_OFFSET 48 +#define RR13_OFFSET 52 +#define RR14_OFFSET 56 +#define RR15_OFFSET 60 +#define WR0_OFFSET 64 +#define WR1_OFFSET 68 +#define WR2_OFFSET 72 +#define WR3_OFFSET 76 +#define WR4_OFFSET 80 +#define WR5_OFFSET 84 +#define WR6_OFFSET 88 +#define WR7_OFFSET 92 +#define WR8_OFFSET 96 +#define WR9_OFFSET 100 +#define WR10_OFFSET 104 +#define WR11_OFFSET 108 +#define WR12_OFFSET 112 +#define WR13_OFFSET 116 +#define WR14_OFFSET 120 +#define WR15_OFFSET 124 + + +/**************************** Type Definitions *****************************/ +/** + * + * Write a value to a AXI_REG32 register. A 32 bit write is performed. + * If the component is implemented in a smaller width, only the least + * significant data is written. + * + * @param BaseAddress is the base address of the AXI_REG32device. + * @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 AXI_REG32_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data) + * + */ +#define AXI_REG32_mWriteReg(BaseAddress, RegOffset, Data) \ + Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data)) + +/** + * + * Read a value from a AXI_REG32 register. A 32 bit read is performed. + * If the component 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 AXI_REG32 device. + * @param RegOffset is the register offset from the base to write to. + * + * @return Data is the data from the register. + * + * @note + * C-style signature: + * u32 AXI_REG32_mReadReg(u32 BaseAddress, unsigned RegOffset) + * + */ +#define AXI_REG32_mReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/************************** Function Prototypes ****************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_REG32 instance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_REG32_Reg_SelfTest(void * baseaddr_p); + +#endif // AXI_REG32_H diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c b/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c new file mode 100644 index 0000000..dc45655 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/drivers/axi_reg32_v1_0/src/axi_reg32_selftest.c @@ -0,0 +1,60 @@ + +/***************************** Include Files *******************************/ +#include "axi_reg32.h" +#include "xparameters.h" +#include "stdio.h" +#include "xil_io.h" + +/************************** Constant Definitions ***************************/ +#define READ_WRITE_MUL_FACTOR 0x10 + +/************************** Function Definitions ***************************/ +/** + * + * Run a self-test on the driver/device. Note this may be a destructive test if + * resets of the device are performed. + * + * If the hardware system is not built correctly, this function may never + * return to the caller. + * + * @param baseaddr_p is the base address of the AXI_REG32instance to be worked on. + * + * @return + * + * - XST_SUCCESS if all self-test code passed + * - XST_FAILURE if any self-test code failed + * + * @note Caching must be turned off for this function to work. + * @note Self test may fail if data memory and device are not on the same bus. + * + */ +XStatus AXI_REG32_Reg_SelfTest(void * baseaddr_p) +{ + u32 baseaddr; + int write_loop_index; + int read_loop_index; + int Index; + + baseaddr = (u32) baseaddr_p; + + xil_printf("******************************\n\r"); + xil_printf("* User Peripheral Self Test\n\r"); + xil_printf("******************************\n\n\r"); + + /* + * Write to user logic slave module register(s) and read back + */ + xil_printf("User logic slave module test...\n\r"); + + for (write_loop_index = 0 ; write_loop_index < 4; write_loop_index++) + AXI_REG32_mWriteReg (baseaddr, write_loop_index*4, (write_loop_index+1)*READ_WRITE_MUL_FACTOR); + for (read_loop_index = 0 ; read_loop_index < 4; read_loop_index++) + if ( AXI_REG32_mReadReg (baseaddr, read_loop_index*4) != (read_loop_index+1)*READ_WRITE_MUL_FACTOR){ + xil_printf ("Error reading register value at address %x\n", (int)baseaddr + read_loop_index*4); + return XST_FAILURE; + } + + xil_printf(" - slave register write/read passed\n\n\r"); + + return XST_SUCCESS; +} diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/bfm_design/axi_reg32_v1_0_tb.v b/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/bfm_design/axi_reg32_v1_0_tb.v new file mode 100644 index 0000000..a2b9560 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/bfm_design/axi_reg32_v1_0_tb.v @@ -0,0 +1,184 @@ + +`timescale 1 ns / 1 ps + +`include "axi_reg32_v1_0_tb_include.vh" + +// lite_response Type Defines +`define RESPONSE_OKAY 2'b00 +`define RESPONSE_EXOKAY 2'b01 +`define RESP_BUS_WIDTH 2 +`define BURST_TYPE_INCR 2'b01 +`define BURST_TYPE_WRAP 2'b10 + +// AMBA AXI4 Lite Range Constants +`define S_AXI_MAX_BURST_LENGTH 1 +`define S_AXI_DATA_BUS_WIDTH 32 +`define S_AXI_ADDRESS_BUS_WIDTH 32 +`define S_AXI_MAX_DATA_SIZE (`S_AXI_DATA_BUS_WIDTH*`S_AXI_MAX_BURST_LENGTH)/8 + +module axi_reg32_v1_0_tb; + reg tb_ACLK; + reg tb_ARESETn; + + // Create an instance of the example tb + `BD_WRAPPER dut (.ACLK(tb_ACLK), + .ARESETN(tb_ARESETn)); + + // Local Variables + + // AMBA S_AXI AXI4 Lite Local Reg + reg [`S_AXI_DATA_BUS_WIDTH-1:0] S_AXI_rd_data_lite; + reg [`S_AXI_DATA_BUS_WIDTH-1:0] S_AXI_test_data_lite [3:0]; + reg [`RESP_BUS_WIDTH-1:0] S_AXI_lite_response; + reg [`S_AXI_ADDRESS_BUS_WIDTH-1:0] S_AXI_mtestAddress; + reg [3-1:0] S_AXI_mtestProtection_lite; + integer S_AXI_mtestvectorlite; // Master side testvector + integer S_AXI_mtestdatasizelite; + integer result_slave_lite; + + + // Simple Reset Generator and test + initial begin + tb_ARESETn = 1'b0; + #500; + // Release the reset on the posedge of the clk. + @(posedge tb_ACLK); + tb_ARESETn = 1'b1; + @(posedge tb_ACLK); + end + + // Simple Clock Generator + initial tb_ACLK = 1'b0; + always #10 tb_ACLK = !tb_ACLK; + + //------------------------------------------------------------------------ + // TEST LEVEL API: CHECK_RESPONSE_OKAY + //------------------------------------------------------------------------ + // Description: + // CHECK_RESPONSE_OKAY(lite_response) + // This task checks if the return lite_response is equal to OKAY + //------------------------------------------------------------------------ + task automatic CHECK_RESPONSE_OKAY; + input [`RESP_BUS_WIDTH-1:0] response; + begin + if (response !== `RESPONSE_OKAY) begin + $display("TESTBENCH ERROR! lite_response is not OKAY", + "\n expected = 0x%h",`RESPONSE_OKAY, + "\n actual = 0x%h",response); + $stop; + end + end + endtask + + //------------------------------------------------------------------------ + // TEST LEVEL API: COMPARE_LITE_DATA + //------------------------------------------------------------------------ + // Description: + // COMPARE_LITE_DATA(expected,actual) + // This task checks if the actual data is equal to the expected data. + // X is used as don't care but it is not permitted for the full vector + // to be don't care. + //------------------------------------------------------------------------ + task automatic COMPARE_LITE_DATA; + input expected; + input actual; + begin + if (expected === 'hx || actual === 'hx) begin + $display("TESTBENCH ERROR! COMPARE_LITE_DATA cannot be performed with an expected or actual vector that is all 'x'!"); + result_slave_lite = 0; + $stop; + end + + if (actual != expected) begin + $display("TESTBENCH ERROR! Data expected is not equal to actual.", + "\nexpected = 0x%h",expected, + "\nactual = 0x%h",actual); + result_slave_lite = 0; + $stop; + end + else + begin + $display("TESTBENCH Passed! Data expected is equal to actual.", + "\n expected = 0x%h",expected, + "\n actual = 0x%h",actual); + end + end + endtask + + task automatic S_AXI_TEST; + begin + $display("---------------------------------------------------------"); + $display("EXAMPLE TEST : S_AXI"); + $display("Simple register write and read example"); + $display("---------------------------------------------------------"); + + S_AXI_mtestvectorlite = 0; + S_AXI_mtestAddress = `S_AXI_SLAVE_ADDRESS; + S_AXI_mtestProtection_lite = 0; + S_AXI_mtestdatasizelite = `S_AXI_MAX_DATA_SIZE; + + result_slave_lite = 1; + + for (S_AXI_mtestvectorlite = 0; S_AXI_mtestvectorlite <= 3; S_AXI_mtestvectorlite = S_AXI_mtestvectorlite + 1) + begin + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.WRITE_BURST_CONCURRENT( S_AXI_mtestAddress, + S_AXI_mtestProtection_lite, + S_AXI_test_data_lite[S_AXI_mtestvectorlite], + S_AXI_mtestdatasizelite, + S_AXI_lite_response); + $display("EXAMPLE TEST %d write : DATA = 0x%h, lite_response = 0x%h",S_AXI_mtestvectorlite,S_AXI_test_data_lite[S_AXI_mtestvectorlite],S_AXI_lite_response); + CHECK_RESPONSE_OKAY(S_AXI_lite_response); + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.READ_BURST(S_AXI_mtestAddress, + S_AXI_mtestProtection_lite, + S_AXI_rd_data_lite, + S_AXI_lite_response); + $display("EXAMPLE TEST %d read : DATA = 0x%h, lite_response = 0x%h",S_AXI_mtestvectorlite,S_AXI_rd_data_lite,S_AXI_lite_response); + CHECK_RESPONSE_OKAY(S_AXI_lite_response); + COMPARE_LITE_DATA(S_AXI_test_data_lite[S_AXI_mtestvectorlite],S_AXI_rd_data_lite); + $display("EXAMPLE TEST %d : Sequential write and read burst transfers complete from the master side. %d",S_AXI_mtestvectorlite,S_AXI_mtestvectorlite); + S_AXI_mtestAddress = S_AXI_mtestAddress + 32'h00000004; + end + + $display("---------------------------------------------------------"); + $display("EXAMPLE TEST S_AXI: PTGEN_TEST_FINISHED!"); + if ( result_slave_lite ) begin + $display("PTGEN_TEST: PASSED!"); + end else begin + $display("PTGEN_TEST: FAILED!"); + end + $display("---------------------------------------------------------"); + end + endtask + + // Create the test vectors + initial begin + // When performing debug enable all levels of INFO messages. + wait(tb_ARESETn === 0) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + + dut.`BD_INST_NAME.master_0.cdn_axi4_lite_master_bfm_inst.set_channel_level_info(1); + + // Create test data vectors + S_AXI_test_data_lite[0] = 32'h0101FFFF; + S_AXI_test_data_lite[1] = 32'habcd0001; + S_AXI_test_data_lite[2] = 32'hdead0011; + S_AXI_test_data_lite[3] = 32'hbeef0011; + end + + // Drive the BFM + initial begin + // Wait for end of reset + wait(tb_ARESETn === 0) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + wait(tb_ARESETn === 1) @(posedge tb_ACLK); + + S_AXI_TEST(); + + end + +endmodule diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/bfm_design/design.tcl b/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/bfm_design/design.tcl new file mode 100644 index 0000000..019686e --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/bfm_design/design.tcl @@ -0,0 +1,91 @@ +proc create_ipi_design { offsetfile design_name } { + create_bd_design $design_name + open_bd_design $design_name + + # Create Clock and Reset Ports + set ACLK [ create_bd_port -dir I -type clk ACLK ] + set_property -dict [ list CONFIG.FREQ_HZ {100000000} CONFIG.PHASE {0.000} CONFIG.CLK_DOMAIN "${design_name}_ACLK" ] $ACLK + set ARESETN [ create_bd_port -dir I -type rst ARESETN ] + set_property -dict [ list CONFIG.POLARITY {ACTIVE_LOW} ] $ARESETN + set_property CONFIG.ASSOCIATED_RESET ARESETN $ACLK + + # Create instance: axi_reg32_0, and set properties + set axi_reg32_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axi_reg32:1.0 axi_reg32_0] + + # Create instance: master_0, and set properties + set master_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:cdn_axi_bfm master_0] + set_property -dict [ list CONFIG.C_PROTOCOL_SELECTION {2} ] $master_0 + + # Create interface connections + connect_bd_intf_net [get_bd_intf_pins master_0/M_AXI_LITE] [get_bd_intf_pins axi_reg32_0/S_AXI] + + # Create port connections + connect_bd_net -net aclk_net [get_bd_ports ACLK] [get_bd_pins master_0/M_AXI_LITE_ACLK] [get_bd_pins axi_reg32_0/S_AXI_ACLK] + connect_bd_net -net aresetn_net [get_bd_ports ARESETN] [get_bd_pins master_0/M_AXI_LITE_ARESETN] [get_bd_pins axi_reg32_0/S_AXI_ARESETN] + + # Auto assign address + assign_bd_address + + # Copy all address to interface_address.vh file + set bd_path [file dirname [get_property NAME [get_files ${design_name}.bd]]] + upvar 1 $offsetfile offset_file + set offset_file "${bd_path}/axi_reg32_v1_0_tb_include.vh" + set fp [open $offset_file "w"] + puts $fp "`ifndef axi_reg32_v1_0_tb_include_vh_" + puts $fp "`define axi_reg32_v1_0_tb_include_vh_\n" + puts $fp "//Configuration current bd names" + puts $fp "`define BD_INST_NAME ${design_name}_i" + puts $fp "`define BD_WRAPPER ${design_name}_wrapper\n" + puts $fp "//Configuration address parameters" + + set offset [get_property OFFSET [get_bd_addr_segs -of_objects [get_bd_addr_spaces master_0/Data_lite]]] + set offset_hex [string replace $offset 0 1 "32'h"] + puts $fp "`define S_AXI_SLAVE_ADDRESS ${offset_hex}" + + puts $fp "`endif" + close $fp +} + +set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores trenz.biz:user:axi_reg32:1.0]]]] +set test_bench_file ${ip_path}/example_designs/bfm_design/axi_reg32_v1_0_tb.v +set interface_address_vh_file "" + +# Set IP Repository and Update IP Catalogue +set repo_paths [get_property ip_repo_paths [current_fileset]] +if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } { + set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset] + update_ip_catalog +} + +set design_name "" +set all_bd {} +set all_bd_files [get_files *.bd -quiet] +foreach file $all_bd_files { +set file_name [string range $file [expr {[string last "/" $file] + 1}] end] +set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]] +lappend all_bd $bd_name +} + +for { set i 1 } { 1 } { incr i } { + set design_name "axi_reg32_v1_0_bfm_${i}" + if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } { + break + } +} + +create_ipi_design interface_address_vh_file ${design_name} +validate_bd_design + +set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force] +import_files -force -norecurse $wrapper_file + +set_property SOURCE_SET sources_1 [get_filesets sim_1] +import_files -fileset sim_1 -norecurse -force $test_bench_file +remove_files -quiet -fileset sim_1 axi_reg32_v1_0_tb_include.vh +import_files -fileset sim_1 -norecurse -force $interface_address_vh_file +set_property top axi_reg32_v1_0_tb [get_filesets sim_1] +set_property top_lib {} [get_filesets sim_1] +set_property top_file {} [get_filesets sim_1] +launch_xsim -simset sim_1 -mode behavioral +restart +run 1000 us diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl b/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl new file mode 100644 index 0000000..2f63ccb --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl @@ -0,0 +1,45 @@ +# Runtime Tcl commands to interact with - axi_reg32_v1_0 + +# Sourcing design address info tcl +set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd +source ${bd_path}/axi_reg32_v1_0_include.tcl + +# jtag axi master interface hardware name, change as per your design. +set jtag_axi_master hw_axi_1 +set ec 0 + +# hw test script +# Delete all previous axis transactions +if { [llength [get_hw_axi_txns -quiet]] } { + delete_hw_axi_txn [get_hw_axi_txns -quiet] +} + + +# Test all lite slaves. +set wdata_1 abcd1234 + +# Test: S_AXI +# Create a write transaction at s_axi_addr address +create_hw_axi_txn w_s_axi_addr [get_hw_axis $jtag_axi_master] -type write -address $s_axi_addr -data $wdata_1 +# Create a read transaction at s_axi_addr address +create_hw_axi_txn r_s_axi_addr [get_hw_axis $jtag_axi_master] -type read -address $s_axi_addr +# Initiate transactions +run_hw_axi r_s_axi_addr +run_hw_axi w_s_axi_addr +run_hw_axi r_s_axi_addr +set rdata_tmp [get_property DATA [get_hw_axi_txn r_s_axi_addr]] +# Compare read data +if { $rdata_tmp == $wdata_1 } { + puts "Data comparison test pass for - S_AXI" +} else { + puts "Data comparison test fail for - S_AXI, expected-$wdata_1 actual-$rdata_tmp" + inc ec +} + +# Check error flag +if { $ec == 0 } { + puts "PTGEN_TEST: PASSED!" +} else { + puts "PTGEN_TEST: FAILED!" +} + diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/design.tcl b/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/design.tcl new file mode 100644 index 0000000..77acc83 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/example_designs/debug_hw_design/design.tcl @@ -0,0 +1,175 @@ + +proc create_ipi_design { offsetfile design_name } { + + create_bd_design $design_name + open_bd_design $design_name + + # Create and configure Clock/Reset + create_bd_cell -type ip -vlnv xilinx.com:ip:clk_wiz sys_clk_0 + create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset sys_reset_0 + + #check if current_board is set, if true - figure out required clocks. + set is_board_clock_found 0 + set is_board_reset_found 0 + set external_reset_port "" + set external_clock_port "" + + if { [current_board_part -quiet] != "" } { + + #check if any reset interface exists in board. + set board_reset [lindex [get_board_part_interfaces -filter { BUSDEF_NAME == reset_rtl && MODE == slave }] 0 ] + if { $board_reset ne "" } { + set is_board_reset_found 1 + apply_board_connection -board_interface $board_reset -ip_intf sys_clk_0/reset -diagram [current_bd_design] + apply_board_connection -board_interface $board_reset -ip_intf sys_reset_0/ext_reset -diagram [current_bd_design] + set external_rst [get_bd_ports -quiet -of_objects [get_bd_nets -quiet -of_objects [get_bd_pins -quiet sys_clk_0/reset]]] + if { $external_rst ne "" } { + set external_reset_port [get_property NAME $external_rst] + } + } else { + send_msg "ptgen 51-200" WARNING "No reset interface found in current_board, Users may need to specify the location constraints manually." + } + + # check for differential clock, exclude any special clocks which has TYPE property. + set board_clock_busifs "" + foreach busif [get_board_part_interfaces -filter "BUSDEF_NAME == diff_clock_rtl"] { + set type [get_property PARAM.TYPE $busif] + if { $type == "" } { + set board_clock_busifs $busif + break + } + } + if { $board_clock_busifs ne "" } { + apply_board_connection -board_interface $board_clock_busifs -ip_intf sys_clk_0/CLK_IN1_D -diagram [current_bd_design] + set is_board_clock_found 1 + } else { + # check for single ended clock + set board_sclock_busifs [lindex [get_board_part_interfaces -filter "BUSDEF_NAME == clock_rtl"] 0 ] + if { $board_sclock_busifs ne "" } { + apply_board_connection -board_interface $board_sclock_busifs -ip_intf sys_clk_0/clock_CLK_IN1 -diagram [current_bd_design] + set external_clk [get_bd_ports -quiet -of_objects [get_bd_nets -quiet -of_objects [get_bd_pins -quiet sys_clk_0/clk_in1]]] + if { $external_clk ne "" } { + set external_clock_port [get_property NAME $external_clk] + } + set is_board_clock_found 1 + } else { + send_msg "ptgen 51-200" WARNING "No clock interface found in current_board, Users may need to specify the location constraints manually." + } + } + + } else { + send_msg "ptgen 51-201" WARNING "No board selected in current_project. Users may need to specify the location constraints manually." + } + + #if there is no corresponding board interface found, assume constraints will be provided manually while pin planning. + if { $is_board_reset_found == 0 } { + create_bd_port -dir I -type rst reset_rtl + set_property CONFIG.POLARITY [get_property CONFIG.POLARITY [get_bd_pins sys_clk_0/reset]] [get_bd_ports reset_rtl] + connect_bd_net [get_bd_pins sys_reset_0/ext_reset_in] [get_bd_ports reset_rtl] + connect_bd_net [get_bd_ports reset_rtl] [get_bd_pins sys_clk_0/reset] + set external_reset_port reset_rtl + } + if { $is_board_clock_found == 0 } { + create_bd_port -dir I -type clk clock_rtl + connect_bd_net [get_bd_pins sys_clk_0/clk_in1] [get_bd_ports clock_rtl] + set external_clock_port clock_rtl + } + + #Avoid IPI DRC, make clock port synchronous to reset + if { $external_clock_port ne "" && $external_reset_port ne "" } { + set_property CONFIG.ASSOCIATED_RESET $external_reset_port [get_bd_ports $external_clock_port] + } + + # Connect other sys_reset pins + connect_bd_net [get_bd_pins sys_reset_0/slowest_sync_clk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins sys_clk_0/locked] [get_bd_pins sys_reset_0/dcm_locked] + + # Create instance: axi_reg32_0, and set properties + set axi_reg32_0 [ create_bd_cell -type ip -vlnv trenz.biz:user:axi_reg32:1.0 axi_reg32_0 ] + + # Create instance: jtag_axi_0, and set properties + set jtag_axi_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:jtag_axi jtag_axi_0 ] + set_property -dict [list CONFIG.PROTOCOL {0}] [get_bd_cells jtag_axi_0] + connect_bd_net [get_bd_pins jtag_axi_0/aclk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins jtag_axi_0/aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn] + + # Create instance: axi_peri_interconnect, and set properties + set axi_peri_interconnect [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_interconnect axi_peri_interconnect ] + connect_bd_net [get_bd_pins axi_peri_interconnect/ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/ARESETN] [get_bd_pins sys_reset_0/interconnect_aresetn] + set_property -dict [ list CONFIG.NUM_SI {1} ] $axi_peri_interconnect + connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/S00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn] + connect_bd_intf_net [get_bd_intf_pins jtag_axi_0/M_AXI] [get_bd_intf_pins axi_peri_interconnect/S00_AXI] + + set_property -dict [ list CONFIG.NUM_MI {1} ] $axi_peri_interconnect + connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ACLK] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_peri_interconnect/M00_ARESETN] [get_bd_pins sys_reset_0/peripheral_aresetn] + + # Connect all clock & reset of axi_reg32_0 slave interfaces.. + connect_bd_intf_net [get_bd_intf_pins axi_peri_interconnect/M00_AXI] [get_bd_intf_pins axi_reg32_0/S_AXI] + connect_bd_net [get_bd_pins axi_reg32_0/s_axi_aclk] [get_bd_pins sys_clk_0/clk_out1] + connect_bd_net [get_bd_pins axi_reg32_0/s_axi_aresetn] [get_bd_pins sys_reset_0/peripheral_aresetn] + + + # Auto assign address + assign_bd_address + + # Copy all address to axi_reg32_v1_0_include.tcl file + set bd_path [get_property DIRECTORY [current_project]]/[current_project].srcs/[current_fileset]/bd + upvar 1 $offsetfile offset_file + set offset_file "${bd_path}/axi_reg32_v1_0_include.tcl" + set fp [open $offset_file "w"] + puts $fp "# Configuration address parameters" + + set offset [get_property OFFSET [get_bd_addr_segs /jtag_axi_0/Data/SEG_axi_reg32_0_S_AXI_* ]] + puts $fp "set s_axi_addr ${offset}" + + close $fp +} + +# Set IP Repository and Update IP Catalogue +set ip_path [file dirname [file normalize [get_property XML_FILE_NAME [ipx::get_cores trenz.biz:user:axi_reg32:1.0]]]] +set hw_test_file ${ip_path}/example_designs/debug_hw_design/axi_reg32_v1_0_hw_test.tcl + +set repo_paths [get_property ip_repo_paths [current_fileset]] +if { [lsearch -exact -nocase $repo_paths $ip_path ] == -1 } { + set_property ip_repo_paths "$ip_path [get_property ip_repo_paths [current_fileset]]" [current_fileset] + update_ip_catalog +} + +set design_name "" +set all_bd {} +set all_bd_files [get_files *.bd -quiet] +foreach file $all_bd_files { +set file_name [string range $file [expr {[string last "/" $file] + 1}] end] +set bd_name [string range $file_name 0 [expr {[string last "." $file_name] -1}]] +lappend all_bd $bd_name +} + +for { set i 1 } { 1 } { incr i } { + set design_name "axi_reg32_v1_0_hw_${i}" + if { [lsearch -exact -nocase $all_bd $design_name ] == -1 } { + break + } +} + +set intf_address_include_file "" +create_ipi_design intf_address_include_file ${design_name} +save_bd_design +validate_bd_design + +set wrapper_file [make_wrapper -files [get_files ${design_name}.bd] -top -force] +import_files -force -norecurse $wrapper_file + +puts "-------------------------------------------------------------------------------------------------" +puts "INFO NEXT STEPS : Until this stage, debug hardware design has been created, " +puts " please perform following steps to test design in targeted board." +puts "1. Generate bitstream" +puts "2. Setup your targeted board, open hardware manager and open new(or existing) hardware target" +puts "3. Download generated bitstream" +puts "4. Run generated hardware test using below command, this invokes basic read/write operation" +puts " to every interface present in the peripheral : xilinx.com:user:myip:1.0" +puts " : source -notrace ${hw_test_file}" +puts "-------------------------------------------------------------------------------------------------" + diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd b/zynqberrydemo3/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd new file mode 100644 index 0000000..7cc74c8 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0.vhd @@ -0,0 +1,263 @@ +---------------------------------------------------------------------------------------------------- +--! @file axi_reg32_v1_0.vhd +--! @brief xxx +--! @author Antti Lukats +--! @version 1.0 +--! @date 2015 +--! @copyright Copyright 2015 Trenz Electronic GmbH +--! @license MIT License +--! @pre Vivado 2014.4+ +---------------------------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +library axi_lib; + use axi_lib.all; + + +entity axi_reg32_v1_0 is + generic ( + -- Users to add parameters here + C_NUM_RO_REG : integer range 0 to 16 := 16; + C_NUM_WR_REG : integer range 0 to 16 := 16; + + C_WR_READABLE: boolean := true; + + C_RR0_ALIAS : string := "RR0"; + C_RR1_ALIAS : string := "RR1"; + C_RR2_ALIAS : string := "RR2"; + C_RR3_ALIAS : string := "RR3"; + + C_RR4_ALIAS : string := "RR4"; + C_RR5_ALIAS : string := "RR5"; + C_RR6_ALIAS : string := "RR6"; + C_RR7_ALIAS : string := "RR7"; + + C_RR8_ALIAS : string := "RR8"; + C_RR9_ALIAS : string := "RR9"; + C_RR10_ALIAS : string := "RR10"; + C_RR11_ALIAS : string := "RR11"; + + C_RR12_ALIAS : string := "RR12"; + C_RR13_ALIAS : string := "RR13"; + C_RR14_ALIAS : string := "RR14"; + C_RR15_ALIAS : string := "RR15"; + + -- + C_WR0_ALIAS : string := "WR0"; + C_WR1_ALIAS : string := "WR1"; + C_WR2_ALIAS : string := "WR2"; + C_WR3_ALIAS : string := "WR3"; + + C_WR4_ALIAS : string := "WR4"; + C_WR5_ALIAS : string := "WR5"; + C_WR6_ALIAS : string := "WR6"; + C_WR7_ALIAS : string := "WR7"; + + C_WR8_ALIAS : string := "WR8"; + C_WR9_ALIAS : string := "WR9"; + C_WR10_ALIAS : string := "WR10"; + C_WR11_ALIAS : string := "WR11"; + + C_WR12_ALIAS : string := "WR12"; + C_WR13_ALIAS : string := "WR13"; + C_WR14_ALIAS : string := "WR14"; + C_WR15_ALIAS : string := "WR15"; + + C_WR0_DEFAULT : integer := 0; + C_WR1_DEFAULT : integer := 0; + C_WR2_DEFAULT : integer := 0; + C_WR3_DEFAULT : integer := 0; + C_WR4_DEFAULT : integer := 0; + C_WR5_DEFAULT : integer := 0; + C_WR6_DEFAULT : integer := 0; + C_WR7_DEFAULT : integer := 0; + C_WR8_DEFAULT : integer := 0; + C_WR9_DEFAULT : integer := 0; + C_WR10_DEFAULT : integer := 0; + C_WR11_DEFAULT : integer := 0; + C_WR12_DEFAULT : integer := 0; + C_WR13_DEFAULT : integer := 0; + C_WR14_DEFAULT : integer := 0; + C_WR15_DEFAULT : integer := 0; + + + C_REG_WIDTH : integer range 8 to 32 := 32; + -- User parameters ends + -- Do not modify the parameters beyond this line + + + -- Parameters of Axi Slave Bus Interface S_AXI + C_S_AXI_DATA_WIDTH : integer := 32; + C_S_AXI_ADDR_WIDTH : integer := 7 + ); + port ( + -- Users to add ports here + + RR0 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR1 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR2 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR3 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR4 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR5 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR6 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR7 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR8 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR9 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR10 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR11 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR12 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR13 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR14 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR15 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR0 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR1 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR2 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR3 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR4 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR5 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR6 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR7 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR8 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR9 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR10 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR11 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR12 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR13 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR14 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR15 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + + -- User ports ends + -- Do not modify the ports beyond this line + + + -- Ports of Axi Slave Bus Interface S_AXI + s_axi_aclk : in std_logic; + s_axi_aresetn : in std_logic; + s_axi_awaddr : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + s_axi_awprot : in std_logic_vector(2 downto 0); + s_axi_awvalid : in std_logic; + s_axi_awready : out std_logic; + s_axi_wdata : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + s_axi_wstrb : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + s_axi_wvalid : in std_logic; + s_axi_wready : out std_logic; + s_axi_bresp : out std_logic_vector(1 downto 0); + s_axi_bvalid : out std_logic; + s_axi_bready : in std_logic; + s_axi_araddr : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + s_axi_arprot : in std_logic_vector(2 downto 0); + s_axi_arvalid : in std_logic; + s_axi_arready : out std_logic; + s_axi_rdata : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + s_axi_rresp : out std_logic_vector(1 downto 0); + s_axi_rvalid : out std_logic; + s_axi_rready : in std_logic + ); +end axi_reg32_v1_0; + +architecture arch_imp of axi_reg32_v1_0 is + +begin + +-- Instantiation of Axi Bus Interface S_AXI +axi_reg32_v1_0_S_AXI_inst : entity axi_lib.axi_reg32_v1_0_S_AXI + generic map ( + C_NUM_RO_REG => C_NUM_RO_REG, + C_NUM_WR_REG => C_NUM_WR_REG, + C_WR_READABLE => C_WR_READABLE, + + C_WR0_DEFAULT => C_WR0_DEFAULT, + C_WR1_DEFAULT => C_WR1_DEFAULT, + C_WR2_DEFAULT => C_WR2_DEFAULT, + C_WR3_DEFAULT => C_WR3_DEFAULT, + C_WR4_DEFAULT => C_WR4_DEFAULT, + C_WR5_DEFAULT => C_WR5_DEFAULT, + C_WR6_DEFAULT => C_WR6_DEFAULT, + C_WR7_DEFAULT => C_WR7_DEFAULT, + C_WR8_DEFAULT => C_WR8_DEFAULT, + C_WR9_DEFAULT => C_WR9_DEFAULT, + C_WR10_DEFAULT => C_WR10_DEFAULT, + C_WR11_DEFAULT => C_WR11_DEFAULT, + C_WR12_DEFAULT => C_WR12_DEFAULT, + C_WR13_DEFAULT => C_WR13_DEFAULT, + C_WR14_DEFAULT => C_WR14_DEFAULT, + C_WR15_DEFAULT => C_WR15_DEFAULT, + + C_REG_WIDTH => C_REG_WIDTH, + C_S_AXI_DATA_WIDTH => C_S_AXI_DATA_WIDTH, + C_S_AXI_ADDR_WIDTH => C_S_AXI_ADDR_WIDTH + ) + port map ( + RR0 => RR0, + RR1 => RR1, + RR2 => RR2, + RR3 => RR3, + RR4 => RR4, + RR5 => RR5, + RR6 => RR6, + RR7 => RR7, + RR8 => RR8, + RR9 => RR9, + RR10 => RR10, + RR11 => RR11, + RR12 => RR12, + RR13 => RR13, + RR14 => RR14, + RR15 => RR15, + + WR0 => WR0, + WR1 => WR1, + WR2 => WR2, + WR3 => WR3, + WR4 => WR4, + WR5 => WR5, + WR6 => WR6, + WR7 => WR7, + WR8 => WR8, + WR9 => WR9, + WR10 => WR10, + WR11 => WR11, + WR12 => WR12, + WR13 => WR13, + WR14 => WR14, + WR15 => WR15, + + S_AXI_ACLK => s_axi_aclk, + S_AXI_ARESETN => s_axi_aresetn, + S_AXI_AWADDR => s_axi_awaddr, + S_AXI_AWPROT => s_axi_awprot, + S_AXI_AWVALID => s_axi_awvalid, + S_AXI_AWREADY => s_axi_awready, + S_AXI_WDATA => s_axi_wdata, + S_AXI_WSTRB => s_axi_wstrb, + S_AXI_WVALID => s_axi_wvalid, + S_AXI_WREADY => s_axi_wready, + S_AXI_BRESP => s_axi_bresp, + S_AXI_BVALID => s_axi_bvalid, + S_AXI_BREADY => s_axi_bready, + S_AXI_ARADDR => s_axi_araddr, + S_AXI_ARPROT => s_axi_arprot, + S_AXI_ARVALID => s_axi_arvalid, + S_AXI_ARREADY => s_axi_arready, + S_AXI_RDATA => s_axi_rdata, + S_AXI_RRESP => s_axi_rresp, + S_AXI_RVALID => s_axi_rvalid, + S_AXI_RREADY => s_axi_rready + ); + + -- Add user logic here + + -- User logic ends + +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0_S_AXI.vhd b/zynqberrydemo3/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0_S_AXI.vhd new file mode 100644 index 0000000..670d6f0 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/hdl/axi_reg32_v1_0_S_AXI.vhd @@ -0,0 +1,766 @@ +---------------------------------------------------------------------------------------------------- +--! @file axi_reg32_v1_0_S_AXI.vhd +--! @brief xxx +--! @author Antti Lukats +--! @version 1.0 +--! @date 2015 +--! @copyright Copyright 2015 Trenz Electronic GmbH +--! @license MIT License +--! @pre Vivado 2014.4+ +---------------------------------------------------------------------------------------------------- + +library ieee; + use ieee.std_logic_1164.all; + use ieee.numeric_std.all; + +library axi_lib; + use axi_lib.all; + +entity axi_reg32_v1_0_S_AXI is + generic ( + -- Users to add parameters here + C_NUM_RO_REG : integer range 0 to 16 := 2; + C_NUM_WR_REG : integer range 0 to 16 := 2; + C_WR_READABLE: boolean := true; + + + C_WR0_DEFAULT : integer := 0; + C_WR1_DEFAULT : integer := 0; + C_WR2_DEFAULT : integer := 0; + C_WR3_DEFAULT : integer := 0; + C_WR4_DEFAULT : integer := 0; + C_WR5_DEFAULT : integer := 0; + C_WR6_DEFAULT : integer := 0; + C_WR7_DEFAULT : integer := 0; + C_WR8_DEFAULT : integer := 0; + C_WR9_DEFAULT : integer := 0; + C_WR10_DEFAULT : integer := 0; + C_WR11_DEFAULT : integer := 0; + C_WR12_DEFAULT : integer := 0; + C_WR13_DEFAULT : integer := 0; + C_WR14_DEFAULT : integer := 0; + C_WR15_DEFAULT : integer := 0; + + C_REG_WIDTH : integer range 8 to 32 := 32; + -- User parameters ends + -- Do not modify the parameters beyond this line + + -- Width of S_AXI data bus + C_S_AXI_DATA_WIDTH : integer := 32; + -- Width of S_AXI address bus + C_S_AXI_ADDR_WIDTH : integer := 7 + ); + port ( + -- Users to add ports here + + RR0 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR1 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR2 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR3 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR4 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR5 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR6 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR7 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR8 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR9 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR10 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR11 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + RR12 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR13 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR14 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + RR15 : in std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR0 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR1 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR2 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR3 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR4 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR5 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR6 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR7 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR8 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR9 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR10 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR11 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + WR12 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR13 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR14 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + WR15 : out std_logic_vector(C_REG_WIDTH-1 downto 0); + + + -- User ports ends + -- Do not modify the ports beyond this line + + -- Global Clock Signal + S_AXI_ACLK : in std_logic; + -- Global Reset Signal. This Signal is Active LOW + S_AXI_ARESETN : in std_logic; + -- Write address (issued by master, acceped by Slave) + S_AXI_AWADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + -- Write channel Protection type. This signal indicates the + -- privilege and security level of the transaction, and whether + -- the transaction is a data access or an instruction access. + S_AXI_AWPROT : in std_logic_vector(2 downto 0); + -- Write address valid. This signal indicates that the master signaling + -- valid write address and control information. + S_AXI_AWVALID : in std_logic; + -- Write address ready. This signal indicates that the slave is ready + -- to accept an address and associated control signals. + S_AXI_AWREADY : out std_logic; + -- Write data (issued by master, acceped by Slave) + S_AXI_WDATA : in std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + -- Write strobes. This signal indicates which byte lanes hold + -- valid data. There is one write strobe bit for each eight + -- bits of the write data bus. + S_AXI_WSTRB : in std_logic_vector((C_S_AXI_DATA_WIDTH/8)-1 downto 0); + -- Write valid. This signal indicates that valid write + -- data and strobes are available. + S_AXI_WVALID : in std_logic; + -- Write ready. This signal indicates that the slave + -- can accept the write data. + S_AXI_WREADY : out std_logic; + -- Write response. This signal indicates the status + -- of the write transaction. + S_AXI_BRESP : out std_logic_vector(1 downto 0); + -- Write response valid. This signal indicates that the channel + -- is signaling a valid write response. + S_AXI_BVALID : out std_logic; + -- Response ready. This signal indicates that the master + -- can accept a write response. + S_AXI_BREADY : in std_logic; + -- Read address (issued by master, acceped by Slave) + S_AXI_ARADDR : in std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + -- Protection type. This signal indicates the privilege + -- and security level of the transaction, and whether the + -- transaction is a data access or an instruction access. + S_AXI_ARPROT : in std_logic_vector(2 downto 0); + -- Read address valid. This signal indicates that the channel + -- is signaling valid read address and control information. + S_AXI_ARVALID : in std_logic; + -- Read address ready. This signal indicates that the slave is + -- ready to accept an address and associated control signals. + S_AXI_ARREADY : out std_logic; + -- Read data (issued by slave) + S_AXI_RDATA : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + -- Read response. This signal indicates the status of the + -- read transfer. + S_AXI_RRESP : out std_logic_vector(1 downto 0); + -- Read valid. This signal indicates that the channel is + -- signaling the required read data. + S_AXI_RVALID : out std_logic; + -- Read ready. This signal indicates that the master can + -- accept the read data and response information. + S_AXI_RREADY : in std_logic + ); +end axi_reg32_v1_0_S_AXI; + +architecture arch_imp of axi_reg32_v1_0_S_AXI is + + -- AXI4LITE signals + signal axi_awaddr : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + signal axi_awready : std_logic; + signal axi_wready : std_logic; + signal axi_bresp : std_logic_vector(1 downto 0); + signal axi_bvalid : std_logic; + signal axi_araddr : std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0); + signal axi_arready : std_logic; + signal axi_rdata : std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal axi_rresp : std_logic_vector(1 downto 0); + signal axi_rvalid : std_logic; + + -- Example-specific design signals + -- local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH + -- ADDR_LSB is used for addressing 32/64 bit registers/memories + -- ADDR_LSB = 2 for 32 bits (n downto 2) + -- ADDR_LSB = 3 for 64 bits (n downto 3) + constant ADDR_LSB : integer := (C_S_AXI_DATA_WIDTH/32)+ 1; + constant OPT_MEM_ADDR_BITS : integer := 4; + ------------------------------------------------ + ---- Signals for user logic register space example + -------------------------------------------------- + ---- Number of Slave Registers 32 + signal slv_reg0 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg1 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg2 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg3 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg4 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg5 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg6 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg7 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg8 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg9 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg10 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg11 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg12 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg13 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg14 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg15 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg16 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg17 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg18 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg19 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg20 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg21 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg22 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg23 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg24 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg25 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg26 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg27 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg28 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg29 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg30 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal slv_reg31 :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + + signal slv_reg16r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg17r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg18r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg19r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg20r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg21r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg22r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg23r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg24r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg25r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg26r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg27r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg28r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg29r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg30r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + signal slv_reg31r :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0) := (others=>'0'); + + signal slv_reg_rden : std_logic; + signal slv_reg_wren : std_logic; + signal reg_data_out :std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0); + signal byte_index : integer; + +begin + -- I/O Connections assignments + + S_AXI_AWREADY <= axi_awready; + S_AXI_WREADY <= axi_wready; + S_AXI_BRESP <= axi_bresp; + S_AXI_BVALID <= axi_bvalid; + S_AXI_ARREADY <= axi_arready; + S_AXI_RDATA <= axi_rdata; + S_AXI_RRESP <= axi_rresp; + S_AXI_RVALID <= axi_rvalid; + -- Implement axi_awready generation + -- axi_awready is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is + -- de-asserted when reset is low. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_awready <= '0'; + else + if (axi_awready = '0' and S_AXI_AWVALID = '1' and S_AXI_WVALID = '1') then + -- slave is ready to accept write address when + -- there is a valid write address and write data + -- on the write address and data bus. This design + -- expects no outstanding transactions. + axi_awready <= '1'; + else + axi_awready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement axi_awaddr latching + -- This process is used to latch the address when both + -- S_AXI_AWVALID and S_AXI_WVALID are valid. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_awaddr <= (others => '0'); + else + if (axi_awready = '0' and S_AXI_AWVALID = '1' and S_AXI_WVALID = '1') then + -- Write Address latching + axi_awaddr <= S_AXI_AWADDR; + end if; + end if; + end if; + end process; + + -- Implement axi_wready generation + -- axi_wready is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is + -- de-asserted when reset is low. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_wready <= '0'; + else + if (axi_wready = '0' and S_AXI_WVALID = '1' and S_AXI_AWVALID = '1') then + -- slave is ready to accept write data when + -- there is a valid write address and write data + -- on the write address and data bus. This design + -- expects no outstanding transactions. + axi_wready <= '1'; + else + axi_wready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement memory mapped register select and write logic generation + -- The write data is accepted and written to memory mapped registers when + -- axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to + -- select byte enables of slave registers while writing. + -- These registers are cleared when reset (active low) is applied. + -- Slave register write enable is asserted when valid address and data are available + -- and the slave is ready to accept the write address and write data. + slv_reg_wren <= axi_wready and S_AXI_WVALID and axi_awready and S_AXI_AWVALID ; + + process (S_AXI_ACLK) + variable loc_addr :std_logic_vector(OPT_MEM_ADDR_BITS downto 0); + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + slv_reg16 <= STD_LOGIC_VECTOR(to_unsigned(C_WR0_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg17 <= STD_LOGIC_VECTOR(to_unsigned(C_WR1_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg18 <= STD_LOGIC_VECTOR(to_unsigned(C_WR2_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg19 <= STD_LOGIC_VECTOR(to_unsigned(C_WR3_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg20 <= STD_LOGIC_VECTOR(to_unsigned(C_WR4_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg21 <= STD_LOGIC_VECTOR(to_unsigned(C_WR5_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg22 <= STD_LOGIC_VECTOR(to_unsigned(C_WR6_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg23 <= STD_LOGIC_VECTOR(to_unsigned(C_WR7_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg24 <= STD_LOGIC_VECTOR(to_unsigned(C_WR8_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg25 <= STD_LOGIC_VECTOR(to_unsigned(C_WR9_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg26 <= STD_LOGIC_VECTOR(to_unsigned(C_WR10_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg27 <= STD_LOGIC_VECTOR(to_unsigned(C_WR11_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg28 <= STD_LOGIC_VECTOR(to_unsigned(C_WR12_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg29 <= STD_LOGIC_VECTOR(to_unsigned(C_WR13_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg30 <= STD_LOGIC_VECTOR(to_unsigned(C_WR14_DEFAULT,C_S_AXI_DATA_WIDTH)); + slv_reg31 <= STD_LOGIC_VECTOR(to_unsigned(C_WR15_DEFAULT,C_S_AXI_DATA_WIDTH)); + else + loc_addr := axi_awaddr(ADDR_LSB + OPT_MEM_ADDR_BITS downto ADDR_LSB); + if (slv_reg_wren = '1') then + case loc_addr is + when b"10000" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 16 + slv_reg16(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10001" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 17 + slv_reg17(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10010" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 18 + slv_reg18(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10011" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 19 + slv_reg19(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10100" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 20 + slv_reg20(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10101" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 21 + slv_reg21(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10110" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 22 + slv_reg22(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"10111" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 23 + slv_reg23(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11000" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 24 + slv_reg24(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11001" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 25 + slv_reg25(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11010" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 26 + slv_reg26(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11011" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 27 + slv_reg27(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11100" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 28 + slv_reg28(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11101" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 29 + slv_reg29(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11110" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 30 + slv_reg30(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when b"11111" => + for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop + if ( S_AXI_WSTRB(byte_index) = '1' ) then + -- Respective byte enables are asserted as per write strobes + -- slave registor 31 + slv_reg31(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8); + end if; + end loop; + when others => + slv_reg16 <= slv_reg16; + slv_reg17 <= slv_reg17; + slv_reg18 <= slv_reg18; + slv_reg19 <= slv_reg19; + slv_reg20 <= slv_reg20; + slv_reg21 <= slv_reg21; + slv_reg22 <= slv_reg22; + slv_reg23 <= slv_reg23; + slv_reg24 <= slv_reg24; + slv_reg25 <= slv_reg25; + slv_reg26 <= slv_reg26; + slv_reg27 <= slv_reg27; + slv_reg28 <= slv_reg28; + slv_reg29 <= slv_reg29; + slv_reg30 <= slv_reg30; + slv_reg31 <= slv_reg31; + end case; + end if; + end if; + end if; + end process; + + -- Implement write response logic generation + -- The write response and response valid signals are asserted by the slave + -- when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. + -- This marks the acceptance of address and indicates the status of + -- write transaction. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_bvalid <= '0'; + axi_bresp <= "00"; --need to work more on the responses + else + if (axi_awready = '1' and S_AXI_AWVALID = '1' and axi_wready = '1' and S_AXI_WVALID = '1' and axi_bvalid = '0' ) then + axi_bvalid <= '1'; + axi_bresp <= "00"; + elsif (S_AXI_BREADY = '1' and axi_bvalid = '1') then --check if bready is asserted while bvalid is high) + axi_bvalid <= '0'; -- (there is a possibility that bready is always asserted high) + end if; + end if; + end if; + end process; + + -- Implement axi_arready generation + -- axi_arready is asserted for one S_AXI_ACLK clock cycle when + -- S_AXI_ARVALID is asserted. axi_awready is + -- de-asserted when reset (active low) is asserted. + -- The read address is also latched when S_AXI_ARVALID is + -- asserted. axi_araddr is reset to zero on reset assertion. + + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_arready <= '0'; + axi_araddr <= (others => '1'); + else + if (axi_arready = '0' and S_AXI_ARVALID = '1') then + -- indicates that the slave has acceped the valid read address + axi_arready <= '1'; + -- Read Address latching + axi_araddr <= S_AXI_ARADDR; + else + axi_arready <= '0'; + end if; + end if; + end if; + end process; + + -- Implement axi_arvalid generation + -- axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both + -- S_AXI_ARVALID and axi_arready are asserted. The slave registers + -- data are available on the axi_rdata bus at this instance. The + -- assertion of axi_rvalid marks the validity of read data on the + -- bus and axi_rresp indicates the status of read transaction.axi_rvalid + -- is deasserted on reset (active low). axi_rresp and axi_rdata are + -- cleared to zero on reset (active low). + process (S_AXI_ACLK) + begin + if rising_edge(S_AXI_ACLK) then + if S_AXI_ARESETN = '0' then + axi_rvalid <= '0'; + axi_rresp <= "00"; + else + if (axi_arready = '1' and S_AXI_ARVALID = '1' and axi_rvalid = '0') then + -- Valid read data is available at the read data bus + axi_rvalid <= '1'; + axi_rresp <= "00"; -- 'OKAY' response + elsif (axi_rvalid = '1' and S_AXI_RREADY = '1') then + -- Read data is accepted by the master + axi_rvalid <= '0'; + end if; + end if; + end if; + end process; + + -- Implement memory mapped register select and read logic generation + -- Slave register read enable is asserted when valid address is available + -- and the slave is ready to accept the read address. + slv_reg_rden <= axi_arready and S_AXI_ARVALID and (not axi_rvalid) ; + + process (slv_reg0, slv_reg1, slv_reg2, slv_reg3, slv_reg4, slv_reg5, slv_reg6, slv_reg7, slv_reg8, slv_reg9, slv_reg10, slv_reg11, slv_reg12, slv_reg13, slv_reg14, slv_reg15, slv_reg16r, slv_reg17r, slv_reg18r, slv_reg19r, slv_reg20r, slv_reg21r, slv_reg22r, slv_reg23r, slv_reg24r, slv_reg25r, slv_reg26r, slv_reg27r, slv_reg28r, slv_reg29r, slv_reg30r, slv_reg31r, axi_araddr, S_AXI_ARESETN, slv_reg_rden) + variable loc_addr :std_logic_vector(OPT_MEM_ADDR_BITS downto 0); + begin + -- Address decoding for reading registers + loc_addr := axi_araddr(ADDR_LSB + OPT_MEM_ADDR_BITS downto ADDR_LSB); + case loc_addr is + when b"00000" => + reg_data_out <= slv_reg0; + when b"00001" => + reg_data_out <= slv_reg1; + when b"00010" => + reg_data_out <= slv_reg2; + when b"00011" => + reg_data_out <= slv_reg3; + when b"00100" => + reg_data_out <= slv_reg4; + when b"00101" => + reg_data_out <= slv_reg5; + when b"00110" => + reg_data_out <= slv_reg6; + when b"00111" => + reg_data_out <= slv_reg7; + when b"01000" => + reg_data_out <= slv_reg8; + when b"01001" => + reg_data_out <= slv_reg9; + when b"01010" => + reg_data_out <= slv_reg10; + when b"01011" => + reg_data_out <= slv_reg11; + when b"01100" => + reg_data_out <= slv_reg12; + when b"01101" => + reg_data_out <= slv_reg13; + when b"01110" => + reg_data_out <= slv_reg14; + when b"01111" => + reg_data_out <= slv_reg15; + + when b"10000" => + reg_data_out <= slv_reg16r; + when b"10001" => + reg_data_out <= slv_reg17r; + when b"10010" => + reg_data_out <= slv_reg18r; + when b"10011" => + reg_data_out <= slv_reg19r; + when b"10100" => + reg_data_out <= slv_reg20r; + when b"10101" => + reg_data_out <= slv_reg21r; + when b"10110" => + reg_data_out <= slv_reg22r; + when b"10111" => + reg_data_out <= slv_reg23r; + when b"11000" => + reg_data_out <= slv_reg24r; + when b"11001" => + reg_data_out <= slv_reg25r; + when b"11010" => + reg_data_out <= slv_reg26r; + when b"11011" => + reg_data_out <= slv_reg27r; + when b"11100" => + reg_data_out <= slv_reg28r; + when b"11101" => + reg_data_out <= slv_reg29r; + when b"11110" => + reg_data_out <= slv_reg30r; + when b"11111" => + reg_data_out <= slv_reg31r; + when others => + reg_data_out <= (others => '0'); + end case; + end process; + + -- Output register or memory read data + process( S_AXI_ACLK ) is + begin + if (rising_edge (S_AXI_ACLK)) then + if ( S_AXI_ARESETN = '0' ) then + axi_rdata <= (others => '0'); + else + if (slv_reg_rden = '1') then + -- When there is a valid read address (S_AXI_ARVALID) with + -- acceptance of read address by the slave (axi_arready), + -- output the read dada + -- Read address mux + axi_rdata <= reg_data_out; -- register read data + end if; + end if; + end if; + end process; + + + slv_reg0 <= RR0; + slv_reg1 <= RR1; + slv_reg2 <= RR2; + slv_reg3 <= RR3; + slv_reg4 <= RR4; + slv_reg5 <= RR5; + slv_reg6 <= RR6; + slv_reg7 <= RR7; + slv_reg8 <= RR8; + slv_reg9 <= RR9; + slv_reg10 <= RR10; + slv_reg11 <= RR11; + slv_reg12 <= RR12; + slv_reg13 <= RR13; + slv_reg14 <= RR14; + slv_reg15 <= RR15; + + WR0 <= slv_reg16; + WR1 <= slv_reg17; + WR2 <= slv_reg18; + WR3 <= slv_reg19; + WR4 <= slv_reg20; + WR5 <= slv_reg21; + WR6 <= slv_reg22; + WR7 <= slv_reg23; + WR8 <= slv_reg24; + WR9 <= slv_reg25; + WR10 <= slv_reg26; + WR11 <= slv_reg27; + WR12 <= slv_reg28; + WR13 <= slv_reg29; + WR14 <= slv_reg30; + WR15 <= slv_reg31; + + +WR_readable_Gen: if C_WR_READABLE = true generate + slv_reg16r <= slv_reg16; +WR17_Gen: if C_NUM_WR_REG > 1 generate + slv_reg17r <= slv_reg17; +end generate; +WR18_Gen: if C_NUM_WR_REG > 2 generate + slv_reg18r <= slv_reg18; +end generate; +WR19_Gen: if C_NUM_WR_REG > 3 generate + slv_reg19r <= slv_reg19; +end generate; +WR20_Gen: if C_NUM_WR_REG > 4 generate + slv_reg20r <= slv_reg20; +end generate; +WR21_Gen: if C_NUM_WR_REG > 5 generate + slv_reg21r <= slv_reg21; +end generate; +WR22_Gen: if C_NUM_WR_REG > 6 generate + slv_reg22r <= slv_reg22; +end generate; +WR23_Gen: if C_NUM_WR_REG > 7 generate + slv_reg23r <= slv_reg23; +end generate; +WR24_Gen: if C_NUM_WR_REG > 8 generate + slv_reg24r <= slv_reg24; +end generate; +WR25_Gen: if C_NUM_WR_REG > 9 generate + slv_reg25r <= slv_reg25; +end generate; +WR26_Gen: if C_NUM_WR_REG > 10 generate + slv_reg26r <= slv_reg26; +end generate; +WR27_Gen: if C_NUM_WR_REG > 11 generate + slv_reg27r <= slv_reg27; +end generate; +WR28_Gen: if C_NUM_WR_REG > 12 generate + slv_reg28r <= slv_reg28; +end generate; +WR29_Gen: if C_NUM_WR_REG > 13 generate + slv_reg29r <= slv_reg29; +end generate; +WR30_Gen: if C_NUM_WR_REG > 14 generate + slv_reg30r <= slv_reg30; +end generate; +WR31_Gen: if C_NUM_WR_REG > 15 generate + slv_reg31r <= slv_reg31; +end generate; + +end generate WR_readable_Gen; + +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl b/zynqberrydemo3/ip_lib/axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl new file mode 100644 index 0000000..631cdd0 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axi_reg32_1.0/xgui/axi_reg32_v1_0.tcl @@ -0,0 +1,853 @@ + +# Loading additional proc with user specified bodies to compute parameter values. +source [file join [file dirname [file dirname [info script]]] gui/axi_reg32_v1_0.gtcl] + +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0" -display_name {AXI}] + ipgui::add_param $IPINST -name "C_S_AXI_DATA_WIDTH" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_S_AXI_ADDR_WIDTH" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_S_AXI_BASEADDR" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_S_AXI_HIGHADDR" -parent ${Page_0} + + #Adding Page + set Read_Registers [ipgui::add_page $IPINST -name "Read Registers" -display_name {Input Registers}] + ipgui::add_param $IPINST -name "C_NUM_RO_REG" -parent ${Read_Registers} -widget comboBox + #Adding Group + set Input_Registe_Alias [ipgui::add_group $IPINST -name "Input Registe Alias" -parent ${Read_Registers} -display_name {Input Register Alias}] + ipgui::add_param $IPINST -name "C_RR0_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR1_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR2_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR3_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR4_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR5_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR6_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR7_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR8_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR9_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR10_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR11_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR12_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR13_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR14_ALIAS" -parent ${Input_Registe_Alias} + ipgui::add_param $IPINST -name "C_RR15_ALIAS" -parent ${Input_Registe_Alias} + + + #Adding Page + set Output_Registers [ipgui::add_page $IPINST -name "Output Registers"] + ipgui::add_param $IPINST -name "C_WR_READABLE" -parent ${Output_Registers} + ipgui::add_param $IPINST -name "C_NUM_WR_REG" -parent ${Output_Registers} -widget comboBox + #Adding Group + set Registers [ipgui::add_group $IPINST -name "Registers" -parent ${Output_Registers} -layout horizontal] + #Adding Group + set Register_Aliases [ipgui::add_group $IPINST -name "Register Aliases" -parent ${Registers} -display_name {Aliases}] + ipgui::add_param $IPINST -name "C_WR0_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR1_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR2_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR3_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR4_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR5_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR6_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR7_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR8_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR9_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR10_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR11_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR12_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR13_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR14_ALIAS" -parent ${Register_Aliases} + ipgui::add_param $IPINST -name "C_WR15_ALIAS" -parent ${Register_Aliases} + + #Adding Group + set Default [ipgui::add_group $IPINST -name "Default" -parent ${Registers}] + ipgui::add_param $IPINST -name "C_WR0_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR1_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR2_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR3_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR4_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR5_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR6_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR7_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR8_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR9_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR10_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR11_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR12_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR13_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR14_DEFAULT" -parent ${Default} + ipgui::add_param $IPINST -name "C_WR15_DEFAULT" -parent ${Default} + + + + +} + +proc update_PARAM_VALUE.C_NUM_RO_REG { PARAM_VALUE.C_NUM_RO_REG } { + # Procedure called to update C_NUM_RO_REG when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_NUM_RO_REG { PARAM_VALUE.C_NUM_RO_REG } { + # Procedure called to validate C_NUM_RO_REG + return true +} + +proc update_PARAM_VALUE.C_NUM_WR_REG { PARAM_VALUE.C_NUM_WR_REG } { + # Procedure called to update C_NUM_WR_REG when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_NUM_WR_REG { PARAM_VALUE.C_NUM_WR_REG } { + # Procedure called to validate C_NUM_WR_REG + return true +} + +proc update_PARAM_VALUE.C_RR0_ALIAS { PARAM_VALUE.C_RR0_ALIAS } { + # Procedure called to update C_RR0_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR0_ALIAS { PARAM_VALUE.C_RR0_ALIAS } { + # Procedure called to validate C_RR0_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR10_ALIAS { PARAM_VALUE.C_RR10_ALIAS } { + # Procedure called to update C_RR10_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR10_ALIAS { PARAM_VALUE.C_RR10_ALIAS } { + # Procedure called to validate C_RR10_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR11_ALIAS { PARAM_VALUE.C_RR11_ALIAS } { + # Procedure called to update C_RR11_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR11_ALIAS { PARAM_VALUE.C_RR11_ALIAS } { + # Procedure called to validate C_RR11_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR12_ALIAS { PARAM_VALUE.C_RR12_ALIAS } { + # Procedure called to update C_RR12_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR12_ALIAS { PARAM_VALUE.C_RR12_ALIAS } { + # Procedure called to validate C_RR12_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR13_ALIAS { PARAM_VALUE.C_RR13_ALIAS } { + # Procedure called to update C_RR13_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR13_ALIAS { PARAM_VALUE.C_RR13_ALIAS } { + # Procedure called to validate C_RR13_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR14_ALIAS { PARAM_VALUE.C_RR14_ALIAS } { + # Procedure called to update C_RR14_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR14_ALIAS { PARAM_VALUE.C_RR14_ALIAS } { + # Procedure called to validate C_RR14_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR15_ALIAS { PARAM_VALUE.C_RR15_ALIAS } { + # Procedure called to update C_RR15_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR15_ALIAS { PARAM_VALUE.C_RR15_ALIAS } { + # Procedure called to validate C_RR15_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR1_ALIAS { PARAM_VALUE.C_RR1_ALIAS } { + # Procedure called to update C_RR1_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR1_ALIAS { PARAM_VALUE.C_RR1_ALIAS } { + # Procedure called to validate C_RR1_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR2_ALIAS { PARAM_VALUE.C_RR2_ALIAS } { + # Procedure called to update C_RR2_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR2_ALIAS { PARAM_VALUE.C_RR2_ALIAS } { + # Procedure called to validate C_RR2_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR3_ALIAS { PARAM_VALUE.C_RR3_ALIAS } { + # Procedure called to update C_RR3_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR3_ALIAS { PARAM_VALUE.C_RR3_ALIAS } { + # Procedure called to validate C_RR3_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR4_ALIAS { PARAM_VALUE.C_RR4_ALIAS } { + # Procedure called to update C_RR4_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR4_ALIAS { PARAM_VALUE.C_RR4_ALIAS } { + # Procedure called to validate C_RR4_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR5_ALIAS { PARAM_VALUE.C_RR5_ALIAS } { + # Procedure called to update C_RR5_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR5_ALIAS { PARAM_VALUE.C_RR5_ALIAS } { + # Procedure called to validate C_RR5_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR6_ALIAS { PARAM_VALUE.C_RR6_ALIAS } { + # Procedure called to update C_RR6_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR6_ALIAS { PARAM_VALUE.C_RR6_ALIAS } { + # Procedure called to validate C_RR6_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR7_ALIAS { PARAM_VALUE.C_RR7_ALIAS } { + # Procedure called to update C_RR7_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR7_ALIAS { PARAM_VALUE.C_RR7_ALIAS } { + # Procedure called to validate C_RR7_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR8_ALIAS { PARAM_VALUE.C_RR8_ALIAS } { + # Procedure called to update C_RR8_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR8_ALIAS { PARAM_VALUE.C_RR8_ALIAS } { + # Procedure called to validate C_RR8_ALIAS + return true +} + +proc update_PARAM_VALUE.C_RR9_ALIAS { PARAM_VALUE.C_RR9_ALIAS } { + # Procedure called to update C_RR9_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RR9_ALIAS { PARAM_VALUE.C_RR9_ALIAS } { + # Procedure called to validate C_RR9_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR0_ALIAS { PARAM_VALUE.C_WR0_ALIAS } { + # Procedure called to update C_WR0_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR0_ALIAS { PARAM_VALUE.C_WR0_ALIAS } { + # Procedure called to validate C_WR0_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR0_DEFAULT { PARAM_VALUE.C_WR0_DEFAULT } { + # Procedure called to update C_WR0_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR0_DEFAULT { PARAM_VALUE.C_WR0_DEFAULT } { + # Procedure called to validate C_WR0_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR10_ALIAS { PARAM_VALUE.C_WR10_ALIAS } { + # Procedure called to update C_WR10_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR10_ALIAS { PARAM_VALUE.C_WR10_ALIAS } { + # Procedure called to validate C_WR10_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR10_DEFAULT { PARAM_VALUE.C_WR10_DEFAULT } { + # Procedure called to update C_WR10_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR10_DEFAULT { PARAM_VALUE.C_WR10_DEFAULT } { + # Procedure called to validate C_WR10_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR11_ALIAS { PARAM_VALUE.C_WR11_ALIAS } { + # Procedure called to update C_WR11_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR11_ALIAS { PARAM_VALUE.C_WR11_ALIAS } { + # Procedure called to validate C_WR11_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR11_DEFAULT { PARAM_VALUE.C_WR11_DEFAULT } { + # Procedure called to update C_WR11_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR11_DEFAULT { PARAM_VALUE.C_WR11_DEFAULT } { + # Procedure called to validate C_WR11_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR12_ALIAS { PARAM_VALUE.C_WR12_ALIAS } { + # Procedure called to update C_WR12_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR12_ALIAS { PARAM_VALUE.C_WR12_ALIAS } { + # Procedure called to validate C_WR12_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR12_DEFAULT { PARAM_VALUE.C_WR12_DEFAULT } { + # Procedure called to update C_WR12_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR12_DEFAULT { PARAM_VALUE.C_WR12_DEFAULT } { + # Procedure called to validate C_WR12_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR13_ALIAS { PARAM_VALUE.C_WR13_ALIAS } { + # Procedure called to update C_WR13_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR13_ALIAS { PARAM_VALUE.C_WR13_ALIAS } { + # Procedure called to validate C_WR13_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR13_DEFAULT { PARAM_VALUE.C_WR13_DEFAULT } { + # Procedure called to update C_WR13_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR13_DEFAULT { PARAM_VALUE.C_WR13_DEFAULT } { + # Procedure called to validate C_WR13_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR14_ALIAS { PARAM_VALUE.C_WR14_ALIAS } { + # Procedure called to update C_WR14_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR14_ALIAS { PARAM_VALUE.C_WR14_ALIAS } { + # Procedure called to validate C_WR14_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR14_DEFAULT { PARAM_VALUE.C_WR14_DEFAULT } { + # Procedure called to update C_WR14_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR14_DEFAULT { PARAM_VALUE.C_WR14_DEFAULT } { + # Procedure called to validate C_WR14_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR15_ALIAS { PARAM_VALUE.C_WR15_ALIAS } { + # Procedure called to update C_WR15_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR15_ALIAS { PARAM_VALUE.C_WR15_ALIAS } { + # Procedure called to validate C_WR15_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR15_DEFAULT { PARAM_VALUE.C_WR15_DEFAULT } { + # Procedure called to update C_WR15_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR15_DEFAULT { PARAM_VALUE.C_WR15_DEFAULT } { + # Procedure called to validate C_WR15_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR1_ALIAS { PARAM_VALUE.C_WR1_ALIAS } { + # Procedure called to update C_WR1_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR1_ALIAS { PARAM_VALUE.C_WR1_ALIAS } { + # Procedure called to validate C_WR1_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR1_DEFAULT { PARAM_VALUE.C_WR1_DEFAULT } { + # Procedure called to update C_WR1_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR1_DEFAULT { PARAM_VALUE.C_WR1_DEFAULT } { + # Procedure called to validate C_WR1_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR2_ALIAS { PARAM_VALUE.C_WR2_ALIAS } { + # Procedure called to update C_WR2_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR2_ALIAS { PARAM_VALUE.C_WR2_ALIAS } { + # Procedure called to validate C_WR2_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR2_DEFAULT { PARAM_VALUE.C_WR2_DEFAULT } { + # Procedure called to update C_WR2_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR2_DEFAULT { PARAM_VALUE.C_WR2_DEFAULT } { + # Procedure called to validate C_WR2_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR3_ALIAS { PARAM_VALUE.C_WR3_ALIAS } { + # Procedure called to update C_WR3_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR3_ALIAS { PARAM_VALUE.C_WR3_ALIAS } { + # Procedure called to validate C_WR3_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR3_DEFAULT { PARAM_VALUE.C_WR3_DEFAULT } { + # Procedure called to update C_WR3_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR3_DEFAULT { PARAM_VALUE.C_WR3_DEFAULT } { + # Procedure called to validate C_WR3_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR4_ALIAS { PARAM_VALUE.C_WR4_ALIAS } { + # Procedure called to update C_WR4_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR4_ALIAS { PARAM_VALUE.C_WR4_ALIAS } { + # Procedure called to validate C_WR4_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR4_DEFAULT { PARAM_VALUE.C_WR4_DEFAULT } { + # Procedure called to update C_WR4_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR4_DEFAULT { PARAM_VALUE.C_WR4_DEFAULT } { + # Procedure called to validate C_WR4_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR5_ALIAS { PARAM_VALUE.C_WR5_ALIAS } { + # Procedure called to update C_WR5_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR5_ALIAS { PARAM_VALUE.C_WR5_ALIAS } { + # Procedure called to validate C_WR5_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR5_DEFAULT { PARAM_VALUE.C_WR5_DEFAULT } { + # Procedure called to update C_WR5_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR5_DEFAULT { PARAM_VALUE.C_WR5_DEFAULT } { + # Procedure called to validate C_WR5_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR6_ALIAS { PARAM_VALUE.C_WR6_ALIAS } { + # Procedure called to update C_WR6_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR6_ALIAS { PARAM_VALUE.C_WR6_ALIAS } { + # Procedure called to validate C_WR6_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR6_DEFAULT { PARAM_VALUE.C_WR6_DEFAULT } { + # Procedure called to update C_WR6_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR6_DEFAULT { PARAM_VALUE.C_WR6_DEFAULT } { + # Procedure called to validate C_WR6_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR7_ALIAS { PARAM_VALUE.C_WR7_ALIAS } { + # Procedure called to update C_WR7_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR7_ALIAS { PARAM_VALUE.C_WR7_ALIAS } { + # Procedure called to validate C_WR7_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR7_DEFAULT { PARAM_VALUE.C_WR7_DEFAULT } { + # Procedure called to update C_WR7_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR7_DEFAULT { PARAM_VALUE.C_WR7_DEFAULT } { + # Procedure called to validate C_WR7_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR8_ALIAS { PARAM_VALUE.C_WR8_ALIAS } { + # Procedure called to update C_WR8_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR8_ALIAS { PARAM_VALUE.C_WR8_ALIAS } { + # Procedure called to validate C_WR8_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR8_DEFAULT { PARAM_VALUE.C_WR8_DEFAULT } { + # Procedure called to update C_WR8_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR8_DEFAULT { PARAM_VALUE.C_WR8_DEFAULT } { + # Procedure called to validate C_WR8_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR9_ALIAS { PARAM_VALUE.C_WR9_ALIAS } { + # Procedure called to update C_WR9_ALIAS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR9_ALIAS { PARAM_VALUE.C_WR9_ALIAS } { + # Procedure called to validate C_WR9_ALIAS + return true +} + +proc update_PARAM_VALUE.C_WR9_DEFAULT { PARAM_VALUE.C_WR9_DEFAULT } { + # Procedure called to update C_WR9_DEFAULT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR9_DEFAULT { PARAM_VALUE.C_WR9_DEFAULT } { + # Procedure called to validate C_WR9_DEFAULT + return true +} + +proc update_PARAM_VALUE.C_WR_READABLE { PARAM_VALUE.C_WR_READABLE } { + # Procedure called to update C_WR_READABLE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_WR_READABLE { PARAM_VALUE.C_WR_READABLE } { + # Procedure called to validate C_WR_READABLE + return true +} + +proc update_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to update C_S_AXI_DATA_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to validate C_S_AXI_DATA_WIDTH + return true +} + +proc update_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to update C_S_AXI_ADDR_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to validate C_S_AXI_ADDR_WIDTH + return true +} + +proc update_PARAM_VALUE.C_S_AXI_BASEADDR { PARAM_VALUE.C_S_AXI_BASEADDR } { + # Procedure called to update C_S_AXI_BASEADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_BASEADDR { PARAM_VALUE.C_S_AXI_BASEADDR } { + # Procedure called to validate C_S_AXI_BASEADDR + return true +} + +proc update_PARAM_VALUE.C_S_AXI_HIGHADDR { PARAM_VALUE.C_S_AXI_HIGHADDR } { + # Procedure called to update C_S_AXI_HIGHADDR when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_S_AXI_HIGHADDR { PARAM_VALUE.C_S_AXI_HIGHADDR } { + # Procedure called to validate C_S_AXI_HIGHADDR + return true +} + + +proc update_MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH { MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH PARAM_VALUE.C_S_AXI_DATA_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_S_AXI_DATA_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH { MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH PARAM_VALUE.C_S_AXI_ADDR_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_S_AXI_ADDR_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_REG_WIDTH { MODELPARAM_VALUE.C_REG_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + # WARNING: There is no corresponding user parameter named "C_REG_WIDTH". Setting updated value from the model parameter. +set_property value 32 ${MODELPARAM_VALUE.C_REG_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_NUM_RO_REG { MODELPARAM_VALUE.C_NUM_RO_REG PARAM_VALUE.C_NUM_RO_REG } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_NUM_RO_REG}] ${MODELPARAM_VALUE.C_NUM_RO_REG} +} + +proc update_MODELPARAM_VALUE.C_NUM_WR_REG { MODELPARAM_VALUE.C_NUM_WR_REG PARAM_VALUE.C_NUM_WR_REG } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_NUM_WR_REG}] ${MODELPARAM_VALUE.C_NUM_WR_REG} +} + +proc update_MODELPARAM_VALUE.C_WR_READABLE { MODELPARAM_VALUE.C_WR_READABLE PARAM_VALUE.C_WR_READABLE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR_READABLE}] ${MODELPARAM_VALUE.C_WR_READABLE} +} + +proc update_MODELPARAM_VALUE.C_RR0_ALIAS { MODELPARAM_VALUE.C_RR0_ALIAS PARAM_VALUE.C_RR0_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR0_ALIAS}] ${MODELPARAM_VALUE.C_RR0_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR1_ALIAS { MODELPARAM_VALUE.C_RR1_ALIAS PARAM_VALUE.C_RR1_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR1_ALIAS}] ${MODELPARAM_VALUE.C_RR1_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR0_ALIAS { MODELPARAM_VALUE.C_WR0_ALIAS PARAM_VALUE.C_WR0_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR0_ALIAS}] ${MODELPARAM_VALUE.C_WR0_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR1_ALIAS { MODELPARAM_VALUE.C_WR1_ALIAS PARAM_VALUE.C_WR1_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR1_ALIAS}] ${MODELPARAM_VALUE.C_WR1_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR2_ALIAS { MODELPARAM_VALUE.C_RR2_ALIAS PARAM_VALUE.C_RR2_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR2_ALIAS}] ${MODELPARAM_VALUE.C_RR2_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR3_ALIAS { MODELPARAM_VALUE.C_RR3_ALIAS PARAM_VALUE.C_RR3_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR3_ALIAS}] ${MODELPARAM_VALUE.C_RR3_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR4_ALIAS { MODELPARAM_VALUE.C_RR4_ALIAS PARAM_VALUE.C_RR4_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR4_ALIAS}] ${MODELPARAM_VALUE.C_RR4_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR5_ALIAS { MODELPARAM_VALUE.C_RR5_ALIAS PARAM_VALUE.C_RR5_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR5_ALIAS}] ${MODELPARAM_VALUE.C_RR5_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR6_ALIAS { MODELPARAM_VALUE.C_RR6_ALIAS PARAM_VALUE.C_RR6_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR6_ALIAS}] ${MODELPARAM_VALUE.C_RR6_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR7_ALIAS { MODELPARAM_VALUE.C_RR7_ALIAS PARAM_VALUE.C_RR7_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR7_ALIAS}] ${MODELPARAM_VALUE.C_RR7_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR8_ALIAS { MODELPARAM_VALUE.C_RR8_ALIAS PARAM_VALUE.C_RR8_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR8_ALIAS}] ${MODELPARAM_VALUE.C_RR8_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR9_ALIAS { MODELPARAM_VALUE.C_RR9_ALIAS PARAM_VALUE.C_RR9_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR9_ALIAS}] ${MODELPARAM_VALUE.C_RR9_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR10_ALIAS { MODELPARAM_VALUE.C_RR10_ALIAS PARAM_VALUE.C_RR10_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR10_ALIAS}] ${MODELPARAM_VALUE.C_RR10_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR11_ALIAS { MODELPARAM_VALUE.C_RR11_ALIAS PARAM_VALUE.C_RR11_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR11_ALIAS}] ${MODELPARAM_VALUE.C_RR11_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR12_ALIAS { MODELPARAM_VALUE.C_RR12_ALIAS PARAM_VALUE.C_RR12_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR12_ALIAS}] ${MODELPARAM_VALUE.C_RR12_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR13_ALIAS { MODELPARAM_VALUE.C_RR13_ALIAS PARAM_VALUE.C_RR13_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR13_ALIAS}] ${MODELPARAM_VALUE.C_RR13_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR14_ALIAS { MODELPARAM_VALUE.C_RR14_ALIAS PARAM_VALUE.C_RR14_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR14_ALIAS}] ${MODELPARAM_VALUE.C_RR14_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_RR15_ALIAS { MODELPARAM_VALUE.C_RR15_ALIAS PARAM_VALUE.C_RR15_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RR15_ALIAS}] ${MODELPARAM_VALUE.C_RR15_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR2_ALIAS { MODELPARAM_VALUE.C_WR2_ALIAS PARAM_VALUE.C_WR2_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR2_ALIAS}] ${MODELPARAM_VALUE.C_WR2_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR3_ALIAS { MODELPARAM_VALUE.C_WR3_ALIAS PARAM_VALUE.C_WR3_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR3_ALIAS}] ${MODELPARAM_VALUE.C_WR3_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR4_ALIAS { MODELPARAM_VALUE.C_WR4_ALIAS PARAM_VALUE.C_WR4_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR4_ALIAS}] ${MODELPARAM_VALUE.C_WR4_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR5_ALIAS { MODELPARAM_VALUE.C_WR5_ALIAS PARAM_VALUE.C_WR5_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR5_ALIAS}] ${MODELPARAM_VALUE.C_WR5_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR6_ALIAS { MODELPARAM_VALUE.C_WR6_ALIAS PARAM_VALUE.C_WR6_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR6_ALIAS}] ${MODELPARAM_VALUE.C_WR6_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR7_ALIAS { MODELPARAM_VALUE.C_WR7_ALIAS PARAM_VALUE.C_WR7_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR7_ALIAS}] ${MODELPARAM_VALUE.C_WR7_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR8_ALIAS { MODELPARAM_VALUE.C_WR8_ALIAS PARAM_VALUE.C_WR8_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR8_ALIAS}] ${MODELPARAM_VALUE.C_WR8_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR9_ALIAS { MODELPARAM_VALUE.C_WR9_ALIAS PARAM_VALUE.C_WR9_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR9_ALIAS}] ${MODELPARAM_VALUE.C_WR9_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR10_ALIAS { MODELPARAM_VALUE.C_WR10_ALIAS PARAM_VALUE.C_WR10_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR10_ALIAS}] ${MODELPARAM_VALUE.C_WR10_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR11_ALIAS { MODELPARAM_VALUE.C_WR11_ALIAS PARAM_VALUE.C_WR11_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR11_ALIAS}] ${MODELPARAM_VALUE.C_WR11_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR12_ALIAS { MODELPARAM_VALUE.C_WR12_ALIAS PARAM_VALUE.C_WR12_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR12_ALIAS}] ${MODELPARAM_VALUE.C_WR12_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR13_ALIAS { MODELPARAM_VALUE.C_WR13_ALIAS PARAM_VALUE.C_WR13_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR13_ALIAS}] ${MODELPARAM_VALUE.C_WR13_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR14_ALIAS { MODELPARAM_VALUE.C_WR14_ALIAS PARAM_VALUE.C_WR14_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR14_ALIAS}] ${MODELPARAM_VALUE.C_WR14_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR15_ALIAS { MODELPARAM_VALUE.C_WR15_ALIAS PARAM_VALUE.C_WR15_ALIAS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR15_ALIAS}] ${MODELPARAM_VALUE.C_WR15_ALIAS} +} + +proc update_MODELPARAM_VALUE.C_WR0_DEFAULT { MODELPARAM_VALUE.C_WR0_DEFAULT PARAM_VALUE.C_WR0_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR0_DEFAULT}] ${MODELPARAM_VALUE.C_WR0_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR1_DEFAULT { MODELPARAM_VALUE.C_WR1_DEFAULT PARAM_VALUE.C_WR1_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR1_DEFAULT}] ${MODELPARAM_VALUE.C_WR1_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR2_DEFAULT { MODELPARAM_VALUE.C_WR2_DEFAULT PARAM_VALUE.C_WR2_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR2_DEFAULT}] ${MODELPARAM_VALUE.C_WR2_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR3_DEFAULT { MODELPARAM_VALUE.C_WR3_DEFAULT PARAM_VALUE.C_WR3_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR3_DEFAULT}] ${MODELPARAM_VALUE.C_WR3_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR4_DEFAULT { MODELPARAM_VALUE.C_WR4_DEFAULT PARAM_VALUE.C_WR4_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR4_DEFAULT}] ${MODELPARAM_VALUE.C_WR4_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR5_DEFAULT { MODELPARAM_VALUE.C_WR5_DEFAULT PARAM_VALUE.C_WR5_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR5_DEFAULT}] ${MODELPARAM_VALUE.C_WR5_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR6_DEFAULT { MODELPARAM_VALUE.C_WR6_DEFAULT PARAM_VALUE.C_WR6_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR6_DEFAULT}] ${MODELPARAM_VALUE.C_WR6_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR7_DEFAULT { MODELPARAM_VALUE.C_WR7_DEFAULT PARAM_VALUE.C_WR7_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR7_DEFAULT}] ${MODELPARAM_VALUE.C_WR7_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR8_DEFAULT { MODELPARAM_VALUE.C_WR8_DEFAULT PARAM_VALUE.C_WR8_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR8_DEFAULT}] ${MODELPARAM_VALUE.C_WR8_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR9_DEFAULT { MODELPARAM_VALUE.C_WR9_DEFAULT PARAM_VALUE.C_WR9_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR9_DEFAULT}] ${MODELPARAM_VALUE.C_WR9_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR10_DEFAULT { MODELPARAM_VALUE.C_WR10_DEFAULT PARAM_VALUE.C_WR10_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR10_DEFAULT}] ${MODELPARAM_VALUE.C_WR10_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR11_DEFAULT { MODELPARAM_VALUE.C_WR11_DEFAULT PARAM_VALUE.C_WR11_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR11_DEFAULT}] ${MODELPARAM_VALUE.C_WR11_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR12_DEFAULT { MODELPARAM_VALUE.C_WR12_DEFAULT PARAM_VALUE.C_WR12_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR12_DEFAULT}] ${MODELPARAM_VALUE.C_WR12_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR13_DEFAULT { MODELPARAM_VALUE.C_WR13_DEFAULT PARAM_VALUE.C_WR13_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR13_DEFAULT}] ${MODELPARAM_VALUE.C_WR13_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR14_DEFAULT { MODELPARAM_VALUE.C_WR14_DEFAULT PARAM_VALUE.C_WR14_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR14_DEFAULT}] ${MODELPARAM_VALUE.C_WR14_DEFAULT} +} + +proc update_MODELPARAM_VALUE.C_WR15_DEFAULT { MODELPARAM_VALUE.C_WR15_DEFAULT PARAM_VALUE.C_WR15_DEFAULT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_WR15_DEFAULT}] ${MODELPARAM_VALUE.C_WR15_DEFAULT} +} + diff --git a/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/bd/bd.tcl b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/component.xml b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/component.xml new file mode 100644 index 0000000..3affb02 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/component.xml @@ -0,0 +1,369 @@ + + + trenz.biz + user + axis_audio_pwm + 1.0 + + + S00_AXIS + + + + + + + TDATA + + + s00_axis_tdata + + + + + TVALID + + + s00_axis_tvalid + + + + + TREADY + + + s00_axis_tready + + + + + + WIZ_DATA_WIDTH + 32 + + + + + S00_AXIS_RST + + + + + + + RST + + + s00_axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + S00_AXIS_CLK + + + + + + + CLK + + + s00_axis_aclk + + + + + + ASSOCIATED_BUSIF + S00_AXIS + + + ASSOCIATED_RESET + s00_axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_audio_pwm_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + e37e5f7b + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_audio_pwm_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + e37e5f7b + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 85d97987 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + pwm_l_out + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + pwm_r_out + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_tdata + + in + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s00_axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_SYS_FREQ + C Sys Freq + 150000000 + + + C_PWM_FREQ + C Pwm Freq + 100000 + + + + + + choice_list_6fc15197 + 32 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd + vhdlSource + + + hdl/axis_audio_pwm_v1_0.vhd + vhdlSource + CHECKSUM_b42f8d78 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/axis_audio_pwm_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_audio_pwm_v1_0.tcl + tclSource + CHECKSUM_8d217f22 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + AXI4-Stream Audio PWM v1.0 + + + Component_Name + axis_audio_pwm_v1_0 + + + C_SYS_FREQ + Clock Frequency + 150000000 + + + C_PWM_FREQ + PWM Frequency + 100000 + + + + + + virtex7 + artix7 + kintex7 + zynq + + + /AXI_Peripheral + /Digital_Signal_Processing/Modulation + /Embedded_Processing/AXI_Peripheral/Low_Speed_Peripheral + + AXI4-Stream Audio PWM v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 4 + + xilinx.com:user:axis_audio_pwm:1.0 + + 2016-04-01T12:30:24Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_audio_pwm_1.0 + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_audio_pwm_1.0 + + + + 2015.4.2 + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0.vhd b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0.vhd new file mode 100644 index 0000000..0d849c6 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0.vhd @@ -0,0 +1,86 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity axis_audio_pwm_v1_0 is +generic ( + C_SYS_FREQ : INTEGER := 150000000; + C_PWM_FREQ : INTEGER := 100000 -- Usually from 50 to 100 kHz +); +port ( + -- PWM Outs + pwm_l_out : out STD_LOGIC; + pwm_r_out : out STD_LOGIC; + -- Ports of Axi Slave Bus Interface S00_AXIS + s00_axis_aclk : in STD_LOGIC; + s00_axis_aresetn : in STD_LOGIC; + s00_axis_tready : out STD_LOGIC; + s00_axis_tdata : in STD_LOGIC_VECTOR(31 downto 0); + s00_axis_tvalid : in STD_LOGIC +); +end axis_audio_pwm_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_audio_pwm_v1_0 is +---------------------------------------------------------------------------------- +constant C_CNT_MAX : INTEGER := 32767; +constant C_CNT_MIN : INTEGER := -32767; +constant C_STEP : INTEGER := 131072 / (C_SYS_FREQ/C_PWM_FREQ); +---------------------------------------------------------------------------------- +signal left_ch_val : SIGNED(15 downto 0); -- Data latches +signal right_ch_val : SIGNED(15 downto 0); +signal pwm_cnt : SIGNED(15 downto 0); -- Reference signal +signal pwm_cnt_dir : STD_LOGIC; -- Saw direction +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +s00_axis_tready <= '1'; -- Always ready +-- Data latch +process(s00_axis_aclk) +begin + if(s00_axis_aclk = '1' and s00_axis_aclk'event)then + if(s00_axis_tvalid = '1')then + left_ch_val <= SIGNED(s00_axis_tdata(15 downto 0)); + right_ch_val <= SIGNED(s00_axis_tdata(31 downto 16)); + end if; + end if; +end process; + +-- PWM Coding +process(s00_axis_aclk) +begin + if(s00_axis_aclk = '1' and s00_axis_aclk'event)then + -- Triangle reference signal + if(pwm_cnt_dir = '0')then -- Up count + if(pwm_cnt >= TO_SIGNED((C_CNT_MAX - C_STEP),16))then + pwm_cnt_dir <= '1'; + pwm_cnt <= pwm_cnt - C_STEP; + else + pwm_cnt <= pwm_cnt + C_STEP; + end if; + else -- Down count + if(pwm_cnt <= TO_SIGNED((C_CNT_MIN + C_STEP),16))then + pwm_cnt_dir <= '0'; + pwm_cnt <= pwm_cnt + C_STEP; + else + pwm_cnt <= pwm_cnt - C_STEP; + end if; + end if; + -- Comparators + if(left_ch_val > pwm_cnt)then + pwm_l_out <= '1'; + else + pwm_l_out <= '0'; + end if; + if(right_ch_val > pwm_cnt)then + pwm_r_out <= '1'; + else + pwm_r_out <= '0'; + end if; + end if; +end process; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd new file mode 100644 index 0000000..227c142 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/hdl/axis_audio_pwm_v1_0_S00_AXIS.vhd @@ -0,0 +1,177 @@ +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity axis_audio_pwm_v1_0_S00_AXIS is + generic ( + -- Users to add parameters here + + -- User parameters ends + -- Do not modify the parameters beyond this line + + -- AXI4Stream sink: Data Width + C_S_AXIS_TDATA_WIDTH : integer := 32 + ); + port ( + -- Users to add ports here + + -- User ports ends + -- Do not modify the ports beyond this line + + -- AXI4Stream sink: Clock + S_AXIS_ACLK : in std_logic; + -- AXI4Stream sink: Reset + S_AXIS_ARESETN : in std_logic; + -- Ready to accept data in + S_AXIS_TREADY : out std_logic; + -- Data in + S_AXIS_TDATA : in std_logic_vector(C_S_AXIS_TDATA_WIDTH-1 downto 0); + -- Byte qualifier + S_AXIS_TSTRB : in std_logic_vector((C_S_AXIS_TDATA_WIDTH/8)-1 downto 0); + -- Indicates boundary of last packet + S_AXIS_TLAST : in std_logic; + -- Data is in valid + S_AXIS_TVALID : in std_logic + ); +end axis_audio_pwm_v1_0_S00_AXIS; + +architecture arch_imp of axis_audio_pwm_v1_0_S00_AXIS is + -- function called clogb2 that returns an integer which has the + -- value of the ceiling of the log base 2. + function clogb2 (bit_depth : integer) return integer is + variable depth : integer := bit_depth; + begin + if (depth = 0) then + return(0); + else + for clogb2 in 1 to bit_depth loop -- Works for up to 32 bit integers + if(depth <= 1) then + return(clogb2); + else + depth := depth / 2; + end if; + end loop; + end if; + end; + + -- Total number of input data. + constant NUMBER_OF_INPUT_WORDS : integer := 8; + -- bit_num gives the minimum number of bits needed to address 'NUMBER_OF_INPUT_WORDS' size of FIFO. + constant bit_num : integer := clogb2(NUMBER_OF_INPUT_WORDS-1); + -- Define the states of state machine + -- The control state machine oversees the writing of input streaming data to the FIFO, + -- and outputs the streaming data from the FIFO + type state is ( IDLE, -- This is the initial/idle state + WRITE_FIFO); -- In this state FIFO is written with the + -- input stream data S_AXIS_TDATA + signal axis_tready : std_logic; + -- State variable + signal mst_exec_state : state; + -- FIFO implementation signals + signal byte_index : integer; + -- FIFO write enable + signal fifo_wren : std_logic; + -- FIFO full flag + signal fifo_full_flag : std_logic; + -- FIFO write pointer + signal write_pointer : integer range 0 to bit_num-1 ; + -- sink has accepted all the streaming data and stored in FIFO + signal writes_done : std_logic; + + type BYTE_FIFO_TYPE is array (0 to (NUMBER_OF_INPUT_WORDS-1)) of std_logic_vector(((C_S_AXIS_TDATA_WIDTH/4)-1)downto 0); +begin + -- I/O Connections assignments + + S_AXIS_TREADY <= axis_tready; + -- Control state machine implementation + process(S_AXIS_ACLK) + begin + if (rising_edge (S_AXIS_ACLK)) then + if(S_AXIS_ARESETN = '0') then + -- Synchronous reset (active low) + mst_exec_state <= IDLE; + else + case (mst_exec_state) is + when IDLE => + -- The sink starts accepting tdata when + -- there tvalid is asserted to mark the + -- presence of valid streaming data + if (S_AXIS_TVALID = '1')then + mst_exec_state <= WRITE_FIFO; + else + mst_exec_state <= IDLE; + end if; + + when WRITE_FIFO => + -- When the sink has accepted all the streaming input data, + -- the interface swiches functionality to a streaming master + if (writes_done = '1') then + mst_exec_state <= IDLE; + else + -- The sink accepts and stores tdata + -- into FIFO + mst_exec_state <= WRITE_FIFO; + end if; + + when others => + mst_exec_state <= IDLE; + + end case; + end if; + end if; + end process; + -- AXI Streaming Sink + -- + -- The example design sink is always ready to accept the S_AXIS_TDATA until + -- the FIFO is not filled with NUMBER_OF_INPUT_WORDS number of input words. + axis_tready <= '1' when ((mst_exec_state = WRITE_FIFO) and (write_pointer <= NUMBER_OF_INPUT_WORDS-1)) else '0'; + + process(S_AXIS_ACLK) + begin + if (rising_edge (S_AXIS_ACLK)) then + if(S_AXIS_ARESETN = '0') then + write_pointer <= 0; + writes_done <= '0'; + else + if (write_pointer <= NUMBER_OF_INPUT_WORDS-1) then + if (fifo_wren = '1') then + -- write pointer is incremented after every write to the FIFO + -- when FIFO write signal is enabled. + write_pointer <= write_pointer + 1; + writes_done <= '0'; + end if; + if ((write_pointer = NUMBER_OF_INPUT_WORDS-1) or S_AXIS_TLAST = '1') then + -- reads_done is asserted when NUMBER_OF_INPUT_WORDS numbers of streaming data + -- has been written to the FIFO which is also marked by S_AXIS_TLAST(kept for optional usage). + writes_done <= '1'; + end if; + end if; + end if; + end if; + end process; + + -- FIFO write enable generation + fifo_wren <= S_AXIS_TVALID and axis_tready; + + -- FIFO Implementation + FIFO_GEN: for byte_index in 0 to (C_S_AXIS_TDATA_WIDTH/8-1) generate + + signal stream_data_fifo : BYTE_FIFO_TYPE; + begin + -- Streaming input data is stored in FIFO + process(S_AXIS_ACLK) + begin + if (rising_edge (S_AXIS_ACLK)) then + if (fifo_wren = '1') then + stream_data_fifo(write_pointer) <= S_AXIS_TDATA((byte_index*8+7) downto (byte_index*8)); + end if; + end if; + end process; + + end generate FIFO_GEN; + + -- Add user logic here + + -- User logic ends + +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/xgui/axis_audio_pwm_v1_0.tcl b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/xgui/axis_audio_pwm_v1_0.tcl new file mode 100644 index 0000000..3fa319f --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_audio_pwm_1.0/xgui/axis_audio_pwm_v1_0.tcl @@ -0,0 +1,40 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_PWM_FREQ" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_SYS_FREQ" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_PWM_FREQ { PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to update C_PWM_FREQ when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_PWM_FREQ { PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to validate C_PWM_FREQ + return true +} + +proc update_PARAM_VALUE.C_SYS_FREQ { PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to update C_SYS_FREQ when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_SYS_FREQ { PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to validate C_SYS_FREQ + return true +} + + +proc update_MODELPARAM_VALUE.C_SYS_FREQ { MODELPARAM_VALUE.C_SYS_FREQ PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_SYS_FREQ}] ${MODELPARAM_VALUE.C_SYS_FREQ} +} + +proc update_MODELPARAM_VALUE.C_PWM_FREQ { MODELPARAM_VALUE.C_PWM_FREQ PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_PWM_FREQ}] ${MODELPARAM_VALUE.C_PWM_FREQ} +} + diff --git a/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/bd/bd.tcl b/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/component.xml b/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/component.xml new file mode 100644 index 0000000..e02e2b6 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/component.xml @@ -0,0 +1,515 @@ + + + trenz.biz + user + axis_fb_conv + 1.0 + + + S_AXIS + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + TUSER + + + s_axis_tuser + + + + + + WIZ.DATA_WIDTH + 32 + + + + + video_out + + + + + + + TDATA + + + video_out_tdata + + + + + TLAST + + + video_out_tlast + + + + + TVALID + + + video_out_tvalid + + + + + TREADY + + + video_out_tready + + + + + TUSER + + + video_out_tuser + + + + + + WIZ.DATA_WIDTH + 32 + + + + + S_AXIS_RST + + + + + + + RST + + + s_axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + S_AXIS_CLK + + + + + + + CLK + + + s_axis_aclk + + + + + + ASSOCIATED_BUSIF + S_AXIS:video_out + + + ASSOCIATED_RESET + s_axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_fb_conv_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + c2b53453 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_fb_conv_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + c2b53453 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + e24204be + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + s_axis_tdata + + in + + 31 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_aclk + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_aresetn + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tdata + + out + + 23 + 0 + + + + std_logic_vector + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tlast + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tuser + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tvalid + + out + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + video_out_tready + + in + + + std_logic + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_FB_MODE + C Fb Mode + 1 + + + + false + + + + + + + + + choices_0 + 32 + + + choices_1 + 32 + + + choices_2 + 0 + 1 + + + + + xilinx_vhdlsynthesis_view_fileset + + src/axis_fb_conv_v1_0.vhd + vhdlSource + CHECKSUM_6e7698d9 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + src/axis_fb_conv_v1_0.vhd + vhdlSource + + + + xilinx_xpgui_view_fileset + + xgui/axis_fb_conv_v1_0.tcl + tclSource + XGUI_VERSION_2 + CHECKSUM_bc827756 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + axis_fb_conv_v1.0 + + + Component_Name + axis_fb_conv_v1_0 + + + C_FB_MODE + Framebuffer Mode + 1 + + + + false + + + + + + + + + virtex7 + qvirtex7 + kintex7 + kintex7l + qkintex7 + qkintex7l + artix7 + artix7l + aartix7 + qartix7 + zynq + qzynq + azynq + virtexu + kintexu + + + AXI_Peripheral + + axis_fb_conv_v1.0 + Trenz Electronic GmbH + 5 + 2015-06-04T13:44:40Z + + b:/cores/2014.4/ip/axis_fb_conv_1.0 + + + + 2014.4 + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/src/axis_fb_conv_v1_0.vhd b/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/src/axis_fb_conv_v1_0.vhd new file mode 100644 index 0000000..6177079 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/src/axis_fb_conv_v1_0.vhd @@ -0,0 +1,78 @@ +---------------------------------------------------------------------------------------------------- +--! @file axis_fb_conv_v1_0.vhd +--! @brief Simple remapper to convert 16 or 32 bit AXI4-Stream into Xilinx 24 bit Video Stream +--! @author Antti Lukats +--! @version 1.0 +--! @date 2015 +--! @copyright Copyright 2015 Trenz Electronic GmbH +--! @license BSD +--! @pre Vivado 2014.4+ +--! @pre Xilinx VDMA configured with 16 or 32 bit output +---------------------------------------------------------------------------------------------------- + +--! Use standard library +library ieee; +--! Use logic elements + use ieee.std_logic_1164.all; + +--! AXI4-Stream Remapper to be used with: +--! Linux Simple Frame Buffer driver, +--! Xilinx VDMA and Xilinx AXI4-stream to Video Out IP Cores. +entity axis_fb_conv_v1_0 is + generic ( + --! Format: The format of the framebuffer surface. Valid values are: + --! r5g6b5 (16-bit pixels, d[15:11]=r, d[10:5]=g, d[4:0]=b). + --! a8b8g8r8 (32-bit pixels, d[31:24]=a, d[23:16]=b, d[15:8]=g, d[7:0]=r). + C_FB_MODE : integer range 0 to 1 := 1 --! Mode is set as: 0 = r5g6b5, 1 = a8b8g8r8 + ); + port ( + s_axis_aclk : in std_logic; --! not used + s_axis_aresetn : in std_logic; --! not used + --------------------------------------------------------------------- + s_axis_tready : out std_logic; --! direct bypass + s_axis_tdata : in std_logic_vector(C_FB_MODE*16+16-1 downto 0); --! Pixel data from VDMA IP Core + s_axis_tlast : in std_logic; --! end of line: direct bypass + s_axis_tuser : in std_logic; --! SOF: direct bypass + s_axis_tvalid : in std_logic; --! direct bypass + --------------------------------------------------------------------- + video_out_tvalid : out std_logic; --! direct from input Stream TVALID + video_out_tdata : out std_logic_vector(23 downto 0); --! Remapped TDATA + video_out_tlast : out std_logic; --! direct from input Stream TLAST + video_out_tuser : out std_logic; --! direct from input Stream TUSER + video_out_tready : in std_logic --! direct to input Stream TREADY + ); +end axis_fb_conv_v1_0; + +--! Simple remapper, only function is remap, there is no other logic used +architecture arch_imp of axis_fb_conv_v1_0 is + +signal r : std_logic_vector(7 downto 0) := (others => '0'); --! Red Component +signal g : std_logic_vector(7 downto 0) := (others => '0'); --! Green Component +signal b : std_logic_vector(7 downto 0) := (others => '0'); --! Blue Component +signal a : std_logic_vector(7 downto 0) := (others => '0'); --! Transparency, not used currently + +begin + video_out_tvalid <= s_axis_tvalid; -- Direct bypass + video_out_tlast <= s_axis_tlast; -- Direct bypass + video_out_tuser <= s_axis_tuser; -- Direct bypass + s_axis_tready <= video_out_tready; -- Direct bypass + +-- r5g6b5 (16-bit pixels, d[15:11]=r, d[10:5]=g, d[4:0]=b). +Video_16_bit_Gen: if C_FB_MODE = 0 generate + r(7 downto 3) <= s_axis_tdata(15 downto 11); + g(7 downto 2) <= s_axis_tdata(10 downto 5); + b(7 downto 3) <= s_axis_tdata(4 downto 0); +end generate Video_16_bit_Gen; + +-- a8b8g8r8 (32-bit pixels, d[31:24]=a, d[23:16]=b, d[15:8]=g, d[7:0]=r). +Video_32_bit_Gen: if C_FB_MODE = 1 generate + b(7 downto 0) <= s_axis_tdata(23 downto 16); + g(7 downto 0) <= s_axis_tdata(15 downto 8); + r(7 downto 0) <= s_axis_tdata(7 downto 0); +end generate Video_32_bit_Gen; + +-- construct Xilinx Video RGB format +-- R B G, see PG044 +video_out_tdata(23 downto 0) <= r & b & g; + +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/xgui/axis_fb_conv_v1_0.tcl b/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/xgui/axis_fb_conv_v1_0.tcl new file mode 100644 index 0000000..a29491b --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_fb_conv_1.0/xgui/axis_fb_conv_v1_0.tcl @@ -0,0 +1,25 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_FB_MODE" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_FB_MODE { PARAM_VALUE.C_FB_MODE } { + # Procedure called to update C_FB_MODE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_FB_MODE { PARAM_VALUE.C_FB_MODE } { + # Procedure called to validate C_FB_MODE + return true +} + + +proc update_MODELPARAM_VALUE.C_FB_MODE { MODELPARAM_VALUE.C_FB_MODE PARAM_VALUE.C_FB_MODE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_FB_MODE}] ${MODELPARAM_VALUE.C_FB_MODE} +} + diff --git a/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/component.xml b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/component.xml new file mode 100644 index 0000000..3956dca --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/component.xml @@ -0,0 +1,586 @@ + + + trenz.biz + user + axis_raw_demosaic + 1.0 + + + S_AXIS + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + TUSER + + + s_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + M_AXIS + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + TUSER + + + m_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + axis_aresetn + + + + + + + RST + + + axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + axis_aclk + + + + + + + CLK + + + axis_aclk + + + + + + ASSOCIATED_BUSIF + S_AXIS:M_AXIS + + + ASSOCIATED_RESET + axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_raw_demosaic_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 340c8292 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_raw_demosaic_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + 340c8292 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 766ecffa + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + colors_mode + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + m_axis_tdata + + out + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tdata + + in + + 15 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_RAW_WIDTH + C Raw Width + 10 + + + C_MODE + C Mode + 1 + + + C_IN_TYPE + C In Type + 1 + + + C_COLOR_POS + C Color Pos + 0 + + + + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_list_f5adc799 + 10 + 8 + + + choice_pairs_719c03b1 + 1 + 4 + + + choice_pairs_8aadb9bc + 0 + 1 + 2 + + + choice_pairs_e37d2356 + 0 + 1 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/dualport_ram.vhd + vhdlSource + + + hdl/gamma_rom.vhd + vhdlSource + + + hdl/axis_raw_demosaic_v1_0.vhd + vhdlSource + CHECKSUM_d52eb58c + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/dualport_ram.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/gamma_rom.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/axis_raw_demosaic_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_raw_demosaic_v1_0.tcl + tclSource + CHECKSUM_6e4393c6 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + RAW format demosaic + + + Component_Name + axis_raw_demosaic_v1_0 + + + C_RAW_WIDTH + Raw Width + 10 + + + C_MODE + Mode + 1 + + + C_IN_TYPE + Input Type + 1 + + + C_COLOR_POS + Colors Position + 0 + + + + + + virtex7 + artix7 + kintex7 + qzynq + zynq + + + /AXI_Peripheral + /Video_&_Image_Processing + + RAW Demosaic v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 20 + + xilinx.com:user:axis_raw_demosaic:1.0 + + 2017-05-18T06:15:26Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_raw_demosaic_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_raw_demosaic_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/axis_raw_demosaic_v1_0.vhd b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/axis_raw_demosaic_v1_0.vhd new file mode 100644 index 0000000..f7b861b --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/axis_raw_demosaic_v1_0.vhd @@ -0,0 +1,252 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity axis_raw_demosaic_v1_0 is +generic ( + C_MODE : integer range 0 to 1 := 1; + C_COLOR_POS : integer range 0 to 2 := 0; + C_IN_TYPE : integer range 1 to 4 := 1; + C_RAW_WIDTH : integer := 10 +); +port ( + axis_aclk : in STD_LOGIC; + axis_aresetn : in STD_LOGIC; + + colors_mode : in STD_LOGIC; + + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_IN_TYPE*16-1 downto 0); + s_axis_tuser : in STD_LOGIC; + s_axis_tlast : in STD_LOGIC; + s_axis_tvalid : in STD_LOGIC; + + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_IN_TYPE*32-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC +); +end axis_raw_demosaic_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_raw_demosaic_v1_0 is +---------------------------------------------------------------------------------- +component dualport_ram is +port ( + clk : in STD_LOGIC; + wea : in STD_LOGIC; + addra : in STD_LOGIC_VECTOR(10 downto 0); + addrb : in STD_LOGIC_VECTOR(10 downto 0); + dia : in STD_LOGIC_VECTOR(9 downto 0); + dob : out STD_LOGIC_VECTOR(9 downto 0) +); +end component; + +component gamma_rom is +port( + addra : in STD_LOGIC_VECTOR(9 downto 0); + clka : in STD_LOGIC; + douta : out STD_LOGIC_VECTOR(7 downto 0) +); +end component; +---------------------------------------------------------------------------------- +signal tx_alpha : STD_LOGIC_VECTOR(7 downto 0); +signal tx_blue : STD_LOGIC_VECTOR(7 downto 0); +signal tx_green : STD_LOGIC_VECTOR(7 downto 0); +signal tx_red : STD_LOGIC_VECTOR(7 downto 0); +signal x_cnt : UNSIGNED(15 downto 0); +signal y_cnt : UNSIGNED(15 downto 0); +type sm_state_type is (ST_IDLE, ST_PROCESS, ST_SEND); +signal sm_state : sm_state_type := ST_IDLE; +signal up_pixel_data : STD_LOGIC_VECTOR(C_RAW_WIDTH-1 downto 0); +signal pixel_data : STD_LOGIC_VECTOR(C_RAW_WIDTH-1 downto 0); +signal position : STD_LOGIC_VECTOR(1 downto 0); +signal tx_valid : STD_LOGIC; +signal tx_user : STD_LOGIC; +signal tx_last : STD_LOGIC; +signal x_wr_addr : UNSIGNED(15 downto 0); +signal x_rd_addr : UNSIGNED(15 downto 0); +signal ram_write : STD_LOGIC; +signal ram_wr_addr : STD_LOGIC_VECTOR(10 downto 0); +signal ram_rd_addr : STD_LOGIC_VECTOR(10 downto 0); +signal ram_wr_data : STD_LOGIC_VECTOR( 9 downto 0); +signal ram_rd_data : STD_LOGIC_VECTOR( 9 downto 0); +type raw_pixel is array (3 downto 0) of STD_LOGIC_VECTOR(C_RAW_WIDTH-1 downto 0); +signal pixel : raw_pixel; +type std_pixel is array (3 downto 0) of STD_LOGIC_VECTOR(7 downto 0); +signal pixel_gamma : std_pixel; +signal colors_mode_i : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +ram_wr_addr <= STD_LOGIC_VECTOR(x_wr_addr(10 downto 0)); +ram_rd_addr <= STD_LOGIC_VECTOR(x_rd_addr(10 downto 0)); +ram_wr_data <= pixel(0); +up_pixel_data <= ram_rd_data; +pixel_data <= s_axis_tdata(C_RAW_WIDTH-1 downto 0); +---------------------------------------------------------------------------------- +ram_inst: dualport_ram +port map( + clk => axis_aclk, + wea => ram_write, + addra => ram_wr_addr, + addrb => ram_rd_addr, + dia => ram_wr_data, + dob => ram_rd_data +); +---------------------------------------------------------------------------------- +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_state is + when ST_IDLE => + if(s_axis_tvalid = '1')then + sm_state <= ST_PROCESS; + pixel(0) <= pixel_data; + pixel(1) <= pixel(0); + pixel(2) <= up_pixel_data; + pixel(3) <= pixel(2); + tx_user <= s_axis_tuser; + tx_last <= s_axis_tlast; + x_wr_addr <= x_cnt; + ram_write <= '1'; + position <= y_cnt(0) & x_cnt(0); + if(s_axis_tlast = '1')then + x_cnt <= (others => '0'); + x_rd_addr <= (others => '0'); + else + x_cnt <= x_cnt + 1; + x_rd_addr <= x_cnt + 1; + end if; + if(s_axis_tuser = '1')then + y_cnt <= (others => '0'); + elsif(s_axis_tlast = '1')then + y_cnt <= y_cnt + 1; + end if; + else + ram_write <= '0'; + end if; + when ST_PROCESS => + ram_write <= '0'; + sm_state <= ST_SEND; + when ST_SEND => + if(m_axis_tready = '1')then + if(s_axis_tvalid = '0')then + sm_state <= ST_IDLE; + ram_write <= '0'; + else + sm_state <= ST_PROCESS; + pixel(0) <= pixel_data; + pixel(1) <= pixel(0); + pixel(2) <= up_pixel_data; + pixel(3) <= pixel(2); + tx_user <= s_axis_tuser; + tx_last <= s_axis_tlast; + x_wr_addr <= x_cnt; + ram_write <= '1'; + position <= y_cnt(0) & x_cnt(0); + if(s_axis_tlast = '1')then + x_cnt <= (others => '0'); + x_rd_addr <= (others => '0'); + else + x_cnt <= x_cnt + 1; + x_rd_addr <= x_cnt + 1; + end if; + if(s_axis_tuser = '1')then + y_cnt <= (others => '0'); + elsif(s_axis_tlast = '1')then + y_cnt <= y_cnt + 1; + end if; + end if; + end if; + end case; + end if; +end process; +---------------------------------------------------------------------------------- +gamma_rom_gen: for i in 0 to 3 generate +begin + pa_gamma_inst: gamma_rom + port map( + addra => pixel(i), + clka => axis_aclk, + douta => pixel_gamma(i) + ); +end generate; +---------------------------------------------------------------------------------- +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + if(C_COLOR_POS = 0)then + colors_mode_i <= '0'; + elsif(C_COLOR_POS = 1)then + colors_mode_i <= '1'; + else -- C_COLOR_POS = 2 + colors_mode_i <= colors_mode; + end if; + end if; +end process; +---------------------------------------------------------------------------------- +tx_alpha <= (others => '0'); +-- Demosaic (Color) +demosaic_gen: if C_MODE = 1 generate +begin + + process(sm_state, m_axis_tready) + begin + case sm_state is + when ST_IDLE => s_axis_tready <= '1'; + when ST_PROCESS => s_axis_tready <= '0'; + when ST_SEND => s_axis_tready <= m_axis_tready; + end case; + end process; + + m_axis_tvalid <= '1' when (sm_state = ST_SEND) else '0'; + m_axis_tuser <= tx_user; + m_axis_tlast <= tx_last; + + process(position, tx_alpha, pixel_gamma, colors_mode_i) + begin + if(colors_mode_i = '0')then + case position is + when "01" => m_axis_tdata <= tx_alpha & pixel_gamma(1) & pixel_gamma(0) & pixel_gamma(2); + when "00" => m_axis_tdata <= tx_alpha & pixel_gamma(0) & pixel_gamma(1) & pixel_gamma(3); + when "11" => m_axis_tdata <= tx_alpha & pixel_gamma(3) & pixel_gamma(1) & pixel_gamma(0); + when "10" => m_axis_tdata <= tx_alpha & pixel_gamma(2) & pixel_gamma(0) & pixel_gamma(1); + when others => null; + end case; + else + case position is + when "01" => m_axis_tdata <= tx_alpha & pixel_gamma(2) & pixel_gamma(0) & pixel_gamma(1); + when "00" => m_axis_tdata <= tx_alpha & pixel_gamma(3) & pixel_gamma(1) & pixel_gamma(0); + when "11" => m_axis_tdata <= tx_alpha & pixel_gamma(0) & pixel_gamma(1) & pixel_gamma(3); + when "10" => m_axis_tdata <= tx_alpha & pixel_gamma(1) & pixel_gamma(0) & pixel_gamma(2); + when others => null; + end case; + end if; + end process; + +end generate; +---------------------------------------------------------------------------------- +-- Bypass (Raw grayscale) +bypass_gen: if C_MODE = 0 generate +begin + s_axis_tready <= m_axis_tready; + m_axis_tvalid <= s_axis_tvalid; + m_axis_tuser <= s_axis_tuser; + m_axis_tlast <= s_axis_tlast; + data_gen: for i in 0 to C_IN_TYPE-1 generate + begin + m_axis_tdata(i*32+31 downto i*32) <= x"00" & + s_axis_tdata(i*16+9 downto i*16+2) & + s_axis_tdata(i*16+9 downto i*16+2) & + s_axis_tdata(i*16+9 downto i*16+2); + end generate; +end generate; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/dualport_ram.vhd b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/dualport_ram.vhd new file mode 100644 index 0000000..85042bc --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/dualport_ram.vhd @@ -0,0 +1,39 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.STD_LOGIC_unsigned.all; +---------------------------------------------------------------------------------- +entity dualport_ram is +port ( + clk : in STD_LOGIC; + wea : in STD_LOGIC; + addra : in STD_LOGIC_VECTOR(10 downto 0); + addrb : in STD_LOGIC_VECTOR(10 downto 0); + dia : in STD_LOGIC_VECTOR(9 downto 0); + dob : out STD_LOGIC_VECTOR(9 downto 0) +); +end dualport_ram; +---------------------------------------------------------------------------------- +architecture dualport_ram_arch of dualport_ram is +type ram_type is array (2047 downto 0) of STD_LOGIC_VECTOR (9 downto 0); +signal ram : ram_type; +---------------------------------------------------------------------------------- +attribute block_ram : boolean; +attribute block_ram of ram : signal is TRUE; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process (clk) +begin + if (clk'event and clk = '1') then + if (wea = '1') then + ram(conv_integer(addra)) <= dia; + end if; + dob <= ram(conv_integer(addrb)); + end if; +end process; +---------------------------------------------------------------------------------- +end dualport_ram_arch; diff --git a/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/gamma_rom.vhd b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/gamma_rom.vhd new file mode 100644 index 0000000..fc84945 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/hdl/gamma_rom.vhd @@ -0,0 +1,98 @@ +---------------------------------------------------------------------------------- +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use ieee.STD_LOGIC_arith.all; +use ieee.STD_LOGIC_unsigned.all; +---------------------------------------------------------------------------------- +entity gamma_rom is +port( + addra : in STD_LOGIC_VECTOR(9 downto 0); + clka : in STD_LOGIC; + douta : out STD_LOGIC_VECTOR(7 downto 0) +); +end gamma_rom; +---------------------------------------------------------------------------------- +architecture Behavioral of gamma_rom is +---------------------------------------------------------------------------------- +type rom_type is array (1023 downto 0) of std_logic_vector (7 downto 0); +signal rom : rom_type := ( +x"ff", x"ff", x"ff", x"ff", x"fe", x"fe", x"fe", x"fe", x"fe", x"fe", x"fe", x"fd", x"fd", x"fd", x"fd", x"fd", +x"fd", x"fd", x"fc", x"fc", x"fc", x"fc", x"fc", x"fc", x"fc", x"fc", x"fb", x"fb", x"fb", x"fb", x"fb", x"fb", +x"fb", x"fa", x"fa", x"fa", x"fa", x"fa", x"fa", x"fa", x"f9", x"f9", x"f9", x"f9", x"f9", x"f9", x"f9", x"f8", +x"f8", x"f8", x"f8", x"f8", x"f8", x"f8", x"f7", x"f7", x"f7", x"f7", x"f7", x"f7", x"f7", x"f6", x"f6", x"f6", +x"f6", x"f6", x"f6", x"f6", x"f5", x"f5", x"f5", x"f5", x"f5", x"f5", x"f5", x"f4", x"f4", x"f4", x"f4", x"f4", +x"f4", x"f4", x"f3", x"f3", x"f3", x"f3", x"f3", x"f3", x"f3", x"f2", x"f2", x"f2", x"f2", x"f2", x"f2", x"f2", +x"f1", x"f1", x"f1", x"f1", x"f1", x"f1", x"f1", x"f0", x"f0", x"f0", x"f0", x"f0", x"f0", x"f0", x"ef", x"ef", +x"ef", x"ef", x"ef", x"ef", x"ef", x"ee", x"ee", x"ee", x"ee", x"ee", x"ee", x"ed", x"ed", x"ed", x"ed", x"ed", +x"ed", x"ed", x"ec", x"ec", x"ec", x"ec", x"ec", x"ec", x"ec", x"eb", x"eb", x"eb", x"eb", x"eb", x"eb", x"eb", +x"ea", x"ea", x"ea", x"ea", x"ea", x"ea", x"e9", x"e9", x"e9", x"e9", x"e9", x"e9", x"e9", x"e8", x"e8", x"e8", +x"e8", x"e8", x"e8", x"e8", x"e7", x"e7", x"e7", x"e7", x"e7", x"e7", x"e7", x"e6", x"e6", x"e6", x"e6", x"e6", +x"e6", x"e5", x"e5", x"e5", x"e5", x"e5", x"e5", x"e5", x"e4", x"e4", x"e4", x"e4", x"e4", x"e4", x"e3", x"e3", +x"e3", x"e3", x"e3", x"e3", x"e3", x"e2", x"e2", x"e2", x"e2", x"e2", x"e2", x"e2", x"e1", x"e1", x"e1", x"e1", +x"e1", x"e1", x"e0", x"e0", x"e0", x"e0", x"e0", x"e0", x"e0", x"df", x"df", x"df", x"df", x"df", x"df", x"de", +x"de", x"de", x"de", x"de", x"de", x"de", x"dd", x"dd", x"dd", x"dd", x"dd", x"dd", x"dc", x"dc", x"dc", x"dc", +x"dc", x"dc", x"db", x"db", x"db", x"db", x"db", x"db", x"db", x"da", x"da", x"da", x"da", x"da", x"da", x"d9", +x"d9", x"d9", x"d9", x"d9", x"d9", x"d9", x"d8", x"d8", x"d8", x"d8", x"d8", x"d8", x"d7", x"d7", x"d7", x"d7", +x"d7", x"d7", x"d6", x"d6", x"d6", x"d6", x"d6", x"d6", x"d5", x"d5", x"d5", x"d5", x"d5", x"d5", x"d5", x"d4", +x"d4", x"d4", x"d4", x"d4", x"d4", x"d3", x"d3", x"d3", x"d3", x"d3", x"d3", x"d2", x"d2", x"d2", x"d2", x"d2", +x"d2", x"d1", x"d1", x"d1", x"d1", x"d1", x"d1", x"d0", x"d0", x"d0", x"d0", x"d0", x"d0", x"d0", x"cf", x"cf", +x"cf", x"cf", x"cf", x"cf", x"ce", x"ce", x"ce", x"ce", x"ce", x"ce", x"cd", x"cd", x"cd", x"cd", x"cd", x"cd", +x"cc", x"cc", x"cc", x"cc", x"cc", x"cc", x"cb", x"cb", x"cb", x"cb", x"cb", x"cb", x"ca", x"ca", x"ca", x"ca", +x"ca", x"ca", x"c9", x"c9", x"c9", x"c9", x"c9", x"c9", x"c8", x"c8", x"c8", x"c8", x"c8", x"c8", x"c7", x"c7", +x"c7", x"c7", x"c7", x"c7", x"c6", x"c6", x"c6", x"c6", x"c6", x"c6", x"c5", x"c5", x"c5", x"c5", x"c5", x"c5", +x"c4", x"c4", x"c4", x"c4", x"c4", x"c3", x"c3", x"c3", x"c3", x"c3", x"c3", x"c2", x"c2", x"c2", x"c2", x"c2", +x"c2", x"c1", x"c1", x"c1", x"c1", x"c1", x"c1", x"c0", x"c0", x"c0", x"c0", x"c0", x"c0", x"bf", x"bf", x"bf", +x"bf", x"bf", x"be", x"be", x"be", x"be", x"be", x"be", x"bd", x"bd", x"bd", x"bd", x"bd", x"bd", x"bc", x"bc", +x"bc", x"bc", x"bc", x"bb", x"bb", x"bb", x"bb", x"bb", x"bb", x"ba", x"ba", x"ba", x"ba", x"ba", x"ba", x"b9", +x"b9", x"b9", x"b9", x"b9", x"b8", x"b8", x"b8", x"b8", x"b8", x"b8", x"b7", x"b7", x"b7", x"b7", x"b7", x"b6", +x"b6", x"b6", x"b6", x"b6", x"b6", x"b5", x"b5", x"b5", x"b5", x"b5", x"b4", x"b4", x"b4", x"b4", x"b4", x"b4", +x"b3", x"b3", x"b3", x"b3", x"b3", x"b2", x"b2", x"b2", x"b2", x"b2", x"b2", x"b1", x"b1", x"b1", x"b1", x"b1", +x"b0", x"b0", x"b0", x"b0", x"b0", x"af", x"af", x"af", x"af", x"af", x"af", x"ae", x"ae", x"ae", x"ae", x"ae", +x"ad", x"ad", x"ad", x"ad", x"ad", x"ac", x"ac", x"ac", x"ac", x"ac", x"ac", x"ab", x"ab", x"ab", x"ab", x"ab", +x"aa", x"aa", x"aa", x"aa", x"aa", x"a9", x"a9", x"a9", x"a9", x"a9", x"a8", x"a8", x"a8", x"a8", x"a8", x"a7", +x"a7", x"a7", x"a7", x"a7", x"a7", x"a6", x"a6", x"a6", x"a6", x"a6", x"a5", x"a5", x"a5", x"a5", x"a5", x"a4", +x"a4", x"a4", x"a4", x"a4", x"a3", x"a3", x"a3", x"a3", x"a3", x"a2", x"a2", x"a2", x"a2", x"a2", x"a1", x"a1", +x"a1", x"a1", x"a1", x"a0", x"a0", x"a0", x"a0", x"a0", x"9f", x"9f", x"9f", x"9f", x"9f", x"9e", x"9e", x"9e", +x"9e", x"9e", x"9d", x"9d", x"9d", x"9d", x"9d", x"9c", x"9c", x"9c", x"9c", x"9c", x"9b", x"9b", x"9b", x"9b", +x"9a", x"9a", x"9a", x"9a", x"9a", x"99", x"99", x"99", x"99", x"99", x"98", x"98", x"98", x"98", x"98", x"97", +x"97", x"97", x"97", x"97", x"96", x"96", x"96", x"96", x"95", x"95", x"95", x"95", x"95", x"94", x"94", x"94", +x"94", x"94", x"93", x"93", x"93", x"93", x"92", x"92", x"92", x"92", x"92", x"91", x"91", x"91", x"91", x"90", +x"90", x"90", x"90", x"90", x"8f", x"8f", x"8f", x"8f", x"8f", x"8e", x"8e", x"8e", x"8e", x"8d", x"8d", x"8d", +x"8d", x"8d", x"8c", x"8c", x"8c", x"8c", x"8b", x"8b", x"8b", x"8b", x"8b", x"8a", x"8a", x"8a", x"8a", x"89", +x"89", x"89", x"89", x"88", x"88", x"88", x"88", x"88", x"87", x"87", x"87", x"87", x"86", x"86", x"86", x"86", +x"85", x"85", x"85", x"85", x"85", x"84", x"84", x"84", x"84", x"83", x"83", x"83", x"83", x"82", x"82", x"82", +x"82", x"81", x"81", x"81", x"81", x"81", x"80", x"80", x"80", x"80", x"7f", x"7f", x"7f", x"7f", x"7e", x"7e", +x"7e", x"7e", x"7d", x"7d", x"7d", x"7d", x"7c", x"7c", x"7c", x"7c", x"7b", x"7b", x"7b", x"7b", x"7a", x"7a", +x"7a", x"7a", x"79", x"79", x"79", x"79", x"78", x"78", x"78", x"78", x"77", x"77", x"77", x"77", x"76", x"76", +x"76", x"76", x"75", x"75", x"75", x"75", x"74", x"74", x"74", x"74", x"73", x"73", x"73", x"72", x"72", x"72", +x"72", x"71", x"71", x"71", x"71", x"70", x"70", x"70", x"70", x"6f", x"6f", x"6f", x"6e", x"6e", x"6e", x"6e", +x"6d", x"6d", x"6d", x"6d", x"6c", x"6c", x"6c", x"6b", x"6b", x"6b", x"6b", x"6a", x"6a", x"6a", x"6a", x"69", +x"69", x"69", x"68", x"68", x"68", x"68", x"67", x"67", x"67", x"66", x"66", x"66", x"66", x"65", x"65", x"65", +x"64", x"64", x"64", x"63", x"63", x"63", x"63", x"62", x"62", x"62", x"61", x"61", x"61", x"61", x"60", x"60", +x"60", x"5f", x"5f", x"5f", x"5e", x"5e", x"5e", x"5d", x"5d", x"5d", x"5d", x"5c", x"5c", x"5c", x"5b", x"5b", +x"5b", x"5a", x"5a", x"5a", x"59", x"59", x"59", x"58", x"58", x"58", x"57", x"57", x"57", x"56", x"56", x"56", +x"55", x"55", x"55", x"54", x"54", x"54", x"53", x"53", x"53", x"52", x"52", x"52", x"51", x"51", x"51", x"50", +x"50", x"50", x"4f", x"4f", x"4f", x"4e", x"4e", x"4e", x"4d", x"4d", x"4c", x"4c", x"4c", x"4b", x"4b", x"4b", +x"4a", x"4a", x"4a", x"49", x"49", x"48", x"48", x"48", x"47", x"47", x"46", x"46", x"46", x"45", x"45", x"44", +x"44", x"44", x"43", x"43", x"42", x"42", x"42", x"41", x"41", x"40", x"40", x"40", x"3f", x"3f", x"3e", x"3e", +x"3d", x"3d", x"3d", x"3c", x"3c", x"3b", x"3b", x"3a", x"3a", x"39", x"39", x"39", x"38", x"38", x"37", x"37", +x"36", x"36", x"35", x"35", x"34", x"34", x"33", x"33", x"32", x"32", x"31", x"31", x"30", x"30", x"2f", x"2f", +x"2e", x"2e", x"2d", x"2c", x"2c", x"2b", x"2b", x"2a", x"2a", x"29", x"28", x"28", x"27", x"26", x"26", x"25", +x"25", x"24", x"23", x"23", x"22", x"21", x"20", x"20", x"1f", x"1e", x"1d", x"1d", x"1c", x"1b", x"1a", x"19", +x"18", x"18", x"17", x"16", x"15", x"13", x"12", x"11", x"10", x"0f", x"0d", x"0c", x"0a", x"08", x"05", x"00" +); +attribute rom_style : string; +attribute rom_style of rom : signal is "block"; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process (clka) +begin + if rising_edge(clka) then + douta <= rom(conv_integer(addra)); + end if; +end process; +---------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/xgui/axis_raw_demosaic_v1_0.tcl b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/xgui/axis_raw_demosaic_v1_0.tcl new file mode 100644 index 0000000..b4dad42 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_demosaic_1.0/xgui/axis_raw_demosaic_v1_0.tcl @@ -0,0 +1,70 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_MODE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_IN_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_RAW_WIDTH" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_COLOR_POS" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_COLOR_POS { PARAM_VALUE.C_COLOR_POS } { + # Procedure called to update C_COLOR_POS when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_COLOR_POS { PARAM_VALUE.C_COLOR_POS } { + # Procedure called to validate C_COLOR_POS + return true +} + +proc update_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to update C_IN_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to validate C_IN_TYPE + return true +} + +proc update_PARAM_VALUE.C_MODE { PARAM_VALUE.C_MODE } { + # Procedure called to update C_MODE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_MODE { PARAM_VALUE.C_MODE } { + # Procedure called to validate C_MODE + return true +} + +proc update_PARAM_VALUE.C_RAW_WIDTH { PARAM_VALUE.C_RAW_WIDTH } { + # Procedure called to update C_RAW_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RAW_WIDTH { PARAM_VALUE.C_RAW_WIDTH } { + # Procedure called to validate C_RAW_WIDTH + return true +} + + +proc update_MODELPARAM_VALUE.C_RAW_WIDTH { MODELPARAM_VALUE.C_RAW_WIDTH PARAM_VALUE.C_RAW_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RAW_WIDTH}] ${MODELPARAM_VALUE.C_RAW_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_MODE { MODELPARAM_VALUE.C_MODE PARAM_VALUE.C_MODE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_MODE}] ${MODELPARAM_VALUE.C_MODE} +} + +proc update_MODELPARAM_VALUE.C_IN_TYPE { MODELPARAM_VALUE.C_IN_TYPE PARAM_VALUE.C_IN_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IN_TYPE}] ${MODELPARAM_VALUE.C_IN_TYPE} +} + +proc update_MODELPARAM_VALUE.C_COLOR_POS { MODELPARAM_VALUE.C_COLOR_POS PARAM_VALUE.C_COLOR_POS } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_COLOR_POS}] ${MODELPARAM_VALUE.C_COLOR_POS} +} + diff --git a/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/bd/bd.tcl b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/component.xml b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/component.xml new file mode 100644 index 0000000..7574af6 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/component.xml @@ -0,0 +1,524 @@ + + + trenz.biz + user + axis_raw_unpack + 1.0 + + + S_AXIS + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + TUSER + + + s_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + M_AXIS + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + TUSER + + + m_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + axis_aresetn + + + + + + + RST + + + axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + axis_aclk + + + + + + + CLK + + + axis_aclk + + + + + + ASSOCIATED_BUSIF + S_AXIS:M_AXIS + + + ASSOCIATED_RESET + axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_raw_unpack_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 71a3a0ad + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_raw_unpack_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + 71a3a0ad + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 18ee627c + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tdata + + in + + 15 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tdata + + out + + 63 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + + C_IMP_TYPE + C Imp Type + 0 + + + C_OUT_TYPE + C Out Type + 4 + + + + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_pairs_719c03b1 + 1 + 4 + + + choice_pairs_a91bb82a + 0 + 1 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/srl_fifo.vhd + vhdlSource + + + hdl/axis_raw_unpack_v1_0.vhd + vhdlSource + CHECKSUM_4d998fbe + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/srl_fifo.vhd + vhdlSource + + + hdl/axis_raw_unpack_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_raw_unpack_v1_0.tcl + tclSource + CHECKSUM_13a7b1e1 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + RAW10 2 Lanes format unpack + + + Component_Name + axis_raw_unpack_v1_0 + + + C_IMP_TYPE + Implementation Type + 0 + + + C_OUT_TYPE + Output Type + 4 + + + + + + virtex7 + artix7 + zynq + kintex7 + + + /AXI_Peripheral + /Video_&_Image_Processing + + RAW10 Unpack v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 17 + + xilinx.com:user:axis_raw_unpack:1.0 + + 2017-05-17T15:02:49Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_raw_unpack_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_raw_unpack_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/hdl/axis_raw_unpack_v1_0.vhd b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/hdl/axis_raw_unpack_v1_0.vhd new file mode 100644 index 0000000..82940b6 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/hdl/axis_raw_unpack_v1_0.vhd @@ -0,0 +1,288 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +Library UNISIM; +use UNISIM.vcomponents.all; +Library UNIMACRO; +use UNIMACRO.vcomponents.all; +---------------------------------------------------------------------------------- +entity axis_raw_unpack_v1_0 is +generic ( + C_IMP_TYPE : integer range 0 to 1 := 0; + C_OUT_TYPE : integer range 1 to 4 := 4 +); +port ( + axis_aclk : in STD_LOGIC; + axis_aresetn : in STD_LOGIC; + -- Ports of Axi Slave Bus Interface S_AXIS + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(15 downto 0); + s_axis_tuser : in STD_LOGIC; + s_axis_tlast : in STD_LOGIC; + s_axis_tvalid : in STD_LOGIC; + -- Ports of Axi Master Bus Interface M_AXIS + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_OUT_TYPE*16-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC +); +end axis_raw_unpack_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_raw_unpack_v1_0 is +---------------------------------------------------------------------------------- +constant C_DEVICE : STRING := "7SERIES"; +constant C_FIFO_SIZE : STRING := "18Kb"; +type sm_rx_state_type is (ST_IDLE, ST_PA, ST_PB, ST_PC, ST_PD); +signal sm_rx_state : sm_rx_state_type := ST_IDLE; +type sm_tx_state_type is (ST_WAIT, ST_TXA, ST_TXB, ST_TXC, ST_TXD); +signal sm_tx_state : sm_tx_state_type := ST_WAIT; +type sm_rxp_state_type is (ST_PIDLE, ST_PPA, ST_PPB, ST_PPC, ST_PPD, ST_PPW); +signal sm_rxp_state : sm_rxp_state_type := ST_PIDLE; + +signal pixels_data : STD_LOGIC_VECTOR(39 downto 0); +signal last : STD_LOGIC; +signal user : STD_LOGIC; +signal pixel_a : STD_LOGIC_VECTOR(9 downto 0); +signal pixel_b : STD_LOGIC_VECTOR(9 downto 0); +signal pixel_c : STD_LOGIC_VECTOR(9 downto 0); +signal pixel_d : STD_LOGIC_VECTOR(9 downto 0); +signal pixels_valid : STD_LOGIC; +signal buffer_we : STD_LOGIC; +signal buffer_re : STD_LOGIC; +signal buffer_full : STD_LOGIC; +signal buffer_empty : STD_LOGIC; +signal buffer_in_data : STD_LOGIC_VECTOR(41 downto 0); +signal buffer_out_data : STD_LOGIC_VECTOR(41 downto 0); + +component srl_fifo is +generic( + C_DEPTH : integer := 32; + C_WIDTH : integer := 8 +); +port ( + clk_in : in STD_LOGIC; + we_in : in STD_LOGIC; + re_in : in STD_LOGIC; + full_out : out STD_LOGIC; + empty_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0) +); +end component; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +-- 16 bit input implementation +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_rx_state is + when ST_IDLE => + buffer_we <= '0'; + if(s_axis_tvalid = '1')then + pixels_data( 9 downto 2) <= s_axis_tdata( 7 downto 0); -- P0 + pixels_data(19 downto 12) <= s_axis_tdata(15 downto 8); -- P1 + user <= s_axis_tuser; + if(s_axis_tlast /= '1')then + sm_rx_state <= ST_PA; + end if; + end if; + + when ST_PA => + buffer_we <= '0'; + if(s_axis_tvalid = '1')then + pixels_data(29 downto 22) <= s_axis_tdata( 7 downto 0); -- P2 + pixels_data(39 downto 32) <= s_axis_tdata(15 downto 8); -- P3 + if(s_axis_tuser = '1')then -- Problem + sm_rx_state <= ST_PA; + elsif(s_axis_tlast /= '1')then + sm_rx_state <= ST_PB; + else + sm_rx_state <= ST_IDLE; + end if; + end if; + + when ST_PB => + if((s_axis_tvalid = '1') and (buffer_full = '0'))then + pixel_a( 9 downto 2) <= pixels_data( 9 downto 2); + pixel_a( 1 downto 0) <= s_axis_tdata( 1 downto 0); + pixel_b( 9 downto 2) <= pixels_data(19 downto 12); + pixel_b( 1 downto 0) <= s_axis_tdata( 3 downto 2); + pixel_c( 9 downto 2) <= pixels_data(29 downto 22); + pixel_c( 1 downto 0) <= s_axis_tdata( 5 downto 4); + pixel_d( 9 downto 2) <= pixels_data(39 downto 32); + pixel_d( 1 downto 0) <= s_axis_tdata( 7 downto 6); + last <= s_axis_tlast; + buffer_we <= '1'; + pixels_data( 9 downto 2) <= s_axis_tdata(15 downto 8); + if(s_axis_tuser = '1')then -- Problem + sm_rx_state <= ST_PA; + elsif(s_axis_tlast /= '1')then + sm_rx_state <= ST_PC; + else + sm_rx_state <= ST_IDLE; + end if; + end if; + + when ST_PC => + buffer_we <= '0'; + if(s_axis_tvalid = '1')then + pixels_data(19 downto 12) <= s_axis_tdata( 7 downto 0); -- P1 + pixels_data(29 downto 22) <= s_axis_tdata(15 downto 8); -- P2 + if(s_axis_tuser = '1')then -- Problem + sm_rx_state <= ST_PA; + elsif(s_axis_tlast /= '1')then + sm_rx_state <= ST_PD; + else + sm_rx_state <= ST_IDLE; + end if; + end if; + + when ST_PD => + if((s_axis_tvalid = '1') and (buffer_full = '0'))then + pixel_a( 9 downto 2) <= pixels_data( 9 downto 2); + pixel_a( 1 downto 0) <= s_axis_tdata( 9 downto 8); + pixel_b( 9 downto 2) <= pixels_data(19 downto 12); + pixel_b( 1 downto 0) <= s_axis_tdata(11 downto 10); + pixel_c( 9 downto 2) <= pixels_data(29 downto 22); + pixel_c( 1 downto 0) <= s_axis_tdata(13 downto 12); + pixel_d( 9 downto 2) <= s_axis_tdata( 7 downto 0); + pixel_d( 1 downto 0) <= s_axis_tdata(15 downto 14); + buffer_we <= '1'; + user <= '0'; + last <= s_axis_tlast; + if(s_axis_tuser = '1')then -- Problem + sm_rx_state <= ST_PA; + else + sm_rx_state <= ST_IDLE; + end if; + end if; + end case; + end if; +end process; + +process(sm_rx_state, pixels_valid) +begin + case sm_rx_state is + when ST_IDLE => s_axis_tready <= '1'; + when ST_PA => s_axis_tready <= '1'; + when ST_PB => s_axis_tready <= not buffer_full; + when ST_PC => s_axis_tready <= '1'; + when ST_PD => s_axis_tready <= not buffer_full; + end case; +end process; +---------------------------------------------------------------------------------- +reg_buf_gen: if C_IMP_TYPE = 0 generate +begin + process(axis_aclk) + begin + if(axis_aclk = '1' and axis_aclk'event)then + if(pixels_valid = '0')then + if(((sm_rx_state = ST_PB) or (sm_rx_state = ST_PD)) and (s_axis_tvalid = '1'))then + pixels_valid <= '1'; + end if; + else + if(buffer_re = '1')then + pixels_valid <= '0'; + end if; + end if; + end if; + end process; + + buffer_full <= pixels_valid; + buffer_empty <= not pixels_valid; + buffer_out_data <= last & user & pixel_d & pixel_c & pixel_b & pixel_a; + +end generate; +---------------------------------------------------------------------------------- +fifo_buf_gen: if C_IMP_TYPE = 1 generate +begin + buffer_in_data <= last & user & pixel_d & pixel_c & pixel_b & pixel_a; + + FIFO_inst: srl_fifo + generic map( + C_DEPTH => 32, + C_WIDTH => 42 + ) + port map( + clk_in => axis_aclk, + we_in => buffer_we, + re_in => buffer_re, + full_out => buffer_full, + empty_out => buffer_empty, + data_in => buffer_in_data, + data_out => buffer_out_data + ); +end generate; +---------------------------------------------------------------------------------- +serial_out_gen: if C_OUT_TYPE = 1 generate +begin + process(axis_aclk) + begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_tx_state is + when ST_WAIT => + if(buffer_empty = '0')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data( 9 downto 0); + m_axis_tuser <= buffer_out_data(40); + m_axis_tlast <= '0'; + sm_tx_state <= ST_TXA; + end if; + when ST_TXA => + if(m_axis_tready = '1')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data(19 downto 10); + m_axis_tuser <= '0'; + m_axis_tlast <= '0'; + sm_tx_state <= ST_TXB; + end if; + when ST_TXB => + if(m_axis_tready = '1')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data(29 downto 20); + m_axis_tuser <= '0'; + m_axis_tlast <= '0'; + sm_tx_state <= ST_TXC; + end if; + when ST_TXC => + if(m_axis_tready = '1')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data(39 downto 30); + m_axis_tuser <= '0'; + m_axis_tlast <= buffer_out_data(41); + sm_tx_state <= ST_TXD; + end if; + when ST_TXD => + if(m_axis_tready = '1')then + if(buffer_empty = '0')then + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data( 9 downto 0); + m_axis_tuser <= buffer_out_data(40); + m_axis_tlast <= '0'; + sm_tx_state <= ST_TXA; + else + sm_tx_state <= ST_WAIT; + m_axis_tlast <= '0'; + end if; + end if; + end case; + end if; + end process; + buffer_re <= '1' when ((sm_tx_state = ST_TXC) and (m_axis_tready = '1')) else '0'; + m_axis_tvalid <= '1' when (sm_tx_state /= ST_WAIT) else '0'; +end generate; -- serial_out_gen + +parallel4_out_gen: if C_OUT_TYPE = 4 generate +begin + m_axis_tdata(15 downto 0) <= "000000" & buffer_out_data( 9 downto 0); + m_axis_tdata(31 downto 16) <= "000000" & buffer_out_data(19 downto 10); + m_axis_tdata(47 downto 32) <= "000000" & buffer_out_data(29 downto 20); + m_axis_tdata(63 downto 48) <= "000000" & buffer_out_data(39 downto 30); + m_axis_tuser <= buffer_out_data(40); + m_axis_tlast <= buffer_out_data(41); + m_axis_tvalid <= not buffer_empty; + buffer_re <= m_axis_tready; +end generate; -- parallel4_out_gen +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/hdl/srl_fifo.vhd b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/hdl/srl_fifo.vhd new file mode 100644 index 0000000..4330b33 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/hdl/srl_fifo.vhd @@ -0,0 +1,113 @@ +------------------------------------------------------------------------------- +-- Company: Trenz Electronic +-- Engineer: Oleksandr Kiyenko +-- +-- SRL based FWPT FIFO +------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VComponents.all; +------------------------------------------------------------------------------- +entity srl_fifo is +generic( + C_DEPTH : integer := 64; + C_WIDTH : integer := 8 +); +port ( + clk_in : in STD_LOGIC; + we_in : in STD_LOGIC; + re_in : in STD_LOGIC; + full_out : out STD_LOGIC; + empty_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0) +); +end srl_fifo; +------------------------------------------------------------------------------- +architecture Behavioral of srl_fifo is +------------------------------------------------------------------------------- +type arr_type is array(C_DEPTH/32 downto 0) of STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); +signal ddata : arr_type; +type arrp_type is array(C_DEPTH/32+1 downto 0) of STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); +signal cdata : arrp_type; +signal word_cnt : UNSIGNED(5 downto 0); +signal addr_cnt : UNSIGNED(4 downto 0); +signal srl_addr : STD_LOGIC_VECTOR(4 downto 0); +signal srl_ce : STD_LOGIC; +type fifo_state_type is (ST_EMPTY, ST_NOT_EMPTY, ST_FULL); +signal fifo_state : fifo_state_type := ST_EMPTY; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +cdata(0) <= data_in; +width_gen: for i in C_WIDTH - 1 downto 0 generate +begin + depth_gen: for j in (C_DEPTH/32)-1 downto 0 generate + begin + SRLC32E_1 : SRLC32E + port map ( + D => cdata(j)(i), + Q => ddata(j)(i), + Q31 => cdata(j+1)(i), + A => srl_addr(4 downto 0), + CE => srl_ce, + CLK => clk_in + ); + end generate; +end generate; +srl_addr <= STD_LOGIC_VECTOR(addr_cnt); + +full_out <= '1' when (fifo_state = ST_FULL ) else '0'; +empty_out <= '1' when (fifo_state = ST_EMPTY) else '0'; +srl_ce <= '1' when ((we_in = '1') and (fifo_state /= ST_FULL)) else '0'; + +single_stage_gen: if C_DEPTH = 32 generate +begin + data_out <= ddata(0); +end generate; +multi_stage_gen: if C_DEPTH > 32 generate +begin + data_out <= ddata(TO_INTEGER(addr_cnt(addr_cnt'high downto 5))); +end generate; + +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + case fifo_state is + when ST_EMPTY => + addr_cnt <= (others => '0'); + if(we_in = '1')then + word_cnt <= TO_UNSIGNED(1, word_cnt'length); + fifo_state <= ST_NOT_EMPTY; + end if; + when ST_NOT_EMPTY => + if(we_in = '1')then + if(re_in = '0')then -- Write + if(word_cnt = TO_UNSIGNED((C_DEPTH-1), word_cnt'length))then + fifo_state <= ST_FULL; + end if; + word_cnt <= word_cnt + 1; + addr_cnt <= addr_cnt + 1; + end if; + elsif(re_in = '1')then + if(word_cnt = TO_UNSIGNED(1, word_cnt'length))then + fifo_state <= ST_EMPTY; + word_cnt <= word_cnt - 1; + else + word_cnt <= word_cnt - 1; + addr_cnt <= addr_cnt - 1; + end if; + end if; + when ST_FULL => + if(re_in = '1')then + word_cnt <= word_cnt - 1; + addr_cnt <= addr_cnt - 1; + fifo_state <= ST_NOT_EMPTY; + end if; + end case; + end if; +end process; +------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/src/srl_fifo.vhd b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/src/srl_fifo.vhd new file mode 100644 index 0000000..a853ac4 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/src/srl_fifo.vhd @@ -0,0 +1,111 @@ +------------------------------------------------------------------------------- +-- Company: Trenz Electronic +-- Engineer: Oleksandr Kiyenko +-- +-- SRL based FWPT FIFO +------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.all; +library UNISIM; +use UNISIM.VComponents.all; +------------------------------------------------------------------------------- +entity srl_fifo is +generic( + C_DEPTH : integer := 32; + C_WIDTH : integer := 8 +); +port ( + clk_in : in STD_LOGIC; + we_in : in STD_LOGIC; + re_in : in STD_LOGIC; + full_out : out STD_LOGIC; + empty_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0) +); +end srl_fifo; +------------------------------------------------------------------------------- +architecture Behavioral of srl_fifo is +------------------------------------------------------------------------------- +type arr_type is array(C_DEPTH/32 downto 0) of STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); +signal ddata : arr_type; +type arrp_type is array(C_DEPTH/32+1 downto 0) of STD_LOGIC_VECTOR(C_WIDTH - 1 downto 0); +signal cdata : arrp_type; +signal word_cnt : UNSIGNED(5 downto 0); +signal addr_cnt : UNSIGNED(4 downto 0); +signal srl_addr : STD_LOGIC_VECTOR(4 downto 0); +signal srl_ce : STD_LOGIC; +type fifo_state_type is (ST_EMPTY, ST_NOT_EMPTY, ST_FULL); +signal fifo_state : fifo_state_type := ST_EMPTY; +------------------------------------------------------------------------------- +begin +------------------------------------------------------------------------------- +cdata(0) <= data_in; +width_gen: for i in C_WIDTH - 1 downto 0 generate +begin + depth_gen: for j in C_DEPTH/32 downto 0 generate + begin + SRLC32E_1 : SRLC32E + port map ( + D => cdata(j)(i), + Q => ddata(j)(i), + Q31 => cdata(j+1)(i), + A => srl_addr(4 downto 0), + CE => srl_ce, + CLK => clk_in + ); + end generate; +end generate; +srl_addr <= STD_LOGIC_VECTOR(addr_cnt); + +full_out <= '1' when (fifo_state = ST_FULL ) else '0'; +empty_out <= '1' when (fifo_state = ST_EMPTY) else '0'; +srl_ce <= '1' when ((we_in = '1') and ((fifo_state /= ST_FULL) or (re_in = '1'))) else '0'; + +single_stage_gen: if C_DEPTH = 32 generate +begin + data_out <= ddata(0); +end generate; +-- multi_stage_gen: if C_DEPTH > 32 generate +-- begin + -- data_out <= ddata(TO_INTEGER(addr_cnt(addr_cnt'high downto 5))); +-- end generate; + +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + case fifo_state is + when ST_EMPTY => + if(we_in = '1')then + word_cnt <= word_cnt + 1; + fifo_state <= ST_NOT_EMPTY; + end if; + when ST_NOT_EMPTY => + if(we_in = '1')then + if(re_in = '0')then -- Write + if(word_cnt = TO_UNSIGNED((C_DEPTH-1), word_cnt'width))then + fifo_state <= ST_FULL; + end if; + word_cnt <= word_cnt + 1; + addr_cnt <= addr_cnt + 1; + end if; + elsif(re_in = '1')then + if(word_cnt = TO_UNSIGNED(1, word_cnt'width))then + fifo_state <= ST_EMPTY; + word_cnt <= word_cnt - 1; + else + word_cnt <= word_cnt - 1; + addr_cnt <= addr_cnt - 1; + end if; + end if; + when ST_FULL => + if((re_in = '1') and (we_in = '0'))then + word_cnt <= word_cnt - 1; + addr_cnt <= addr_cnt - 1; + end if; + end case; + end if; +end process; +------------------------------------------------------------------------------- +end Behavioral; diff --git a/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/xgui/axis_raw_unpack_v1_0.tcl b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/xgui/axis_raw_unpack_v1_0.tcl new file mode 100644 index 0000000..cbb2c6c --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_raw_unpack_1.0/xgui/axis_raw_unpack_v1_0.tcl @@ -0,0 +1,40 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_IMP_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_OUT_TYPE" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_IMP_TYPE { PARAM_VALUE.C_IMP_TYPE } { + # Procedure called to update C_IMP_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IMP_TYPE { PARAM_VALUE.C_IMP_TYPE } { + # Procedure called to validate C_IMP_TYPE + return true +} + +proc update_PARAM_VALUE.C_OUT_TYPE { PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to update C_OUT_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_OUT_TYPE { PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to validate C_OUT_TYPE + return true +} + + +proc update_MODELPARAM_VALUE.C_IMP_TYPE { MODELPARAM_VALUE.C_IMP_TYPE PARAM_VALUE.C_IMP_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IMP_TYPE}] ${MODELPARAM_VALUE.C_IMP_TYPE} +} + +proc update_MODELPARAM_VALUE.C_OUT_TYPE { MODELPARAM_VALUE.C_OUT_TYPE PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_OUT_TYPE}] ${MODELPARAM_VALUE.C_OUT_TYPE} +} + diff --git a/zynqberrydemo3/ip_lib/axis_to_i2s_1.0/component.xml b/zynqberrydemo3/ip_lib/axis_to_i2s_1.0/component.xml new file mode 100644 index 0000000..b9448e0 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_to_i2s_1.0/component.xml @@ -0,0 +1,324 @@ + + + trenz.biz + user + axis_to_i2s + 1.0 + + + s_axis + + + + + + + TDATA + + + s_axis_tdata + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + + s_axis_aresetn + + + + + + + RST + + + s_axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + s_axis_aclk + + + + + + + CLK + + + s_axis_aclk + + + + + + ASSOCIATED_BUSIF + s_axis + + + ASSOCIATED_RESET + s_axis_aresetn + + + + + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + VHDL + axis_to_i2s + + xilinx_anylanguagesynthesis_view_fileset + + + + viewChecksum + 5b9a2668 + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + VHDL + axis_to_i2s + + xilinx_anylanguagebehavioralsimulation_view_fileset + + + + viewChecksum + 5b9a2668 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + f64a5dae + + + + + + + s_axis_aclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + s_axis_aresetn + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + s_axis_tdata + + in + + 15 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_bclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_lrclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_sdata + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + + + xilinx_anylanguagesynthesis_view_fileset + + hdl/axis_to_i2s.vhd + vhdlSource + CHECKSUM_5b9a2668 + + + + xilinx_anylanguagebehavioralsimulation_view_fileset + + hdl/axis_to_i2s.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_to_i2s_v1_0.tcl + tclSource + CHECKSUM_f92e9879 + XGUI_VERSION_2 + + + + AXI4-Stream to I2S v1.0 + + + Component_Name + axis_to_i2s_v1_0 + + + + + + virtex7 + kintex7 + artix7 + zynq + + + /Embedded_Processing/AXI_Peripheral + /Embedded_Processing/AXI_Peripheral/Low_Speed_Peripheral + /UserIP + + AXI4-Stream to I2S v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 4 + + xilinx.com:user:axis_to_i2s:1.0 + + 2016-04-29T07:00:54Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_to_i2s_1.0 + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_to_i2s_1.0 + + + + 2015.4.2 + + + + + + + diff --git a/zynqberrydemo3/ip_lib/axis_to_i2s_1.0/hdl/axis_to_i2s.vhd b/zynqberrydemo3/ip_lib/axis_to_i2s_1.0/hdl/axis_to_i2s.vhd new file mode 100644 index 0000000..fa14fc3 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_to_i2s_1.0/hdl/axis_to_i2s.vhd @@ -0,0 +1,66 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity axis_to_i2s is +port ( + -- Ports of Axi Slave Bus Interface S_AXIS + s_axis_aclk : in STD_LOGIC; + s_axis_aresetn : in STD_LOGIC; + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(15 downto 0); + s_axis_tvalid : in STD_LOGIC; + -- I2S Signals + i2s_bclk : in STD_LOGIC; + i2s_lrclk : in STD_LOGIC; + i2s_sdata : out STD_LOGIC +); +end axis_to_i2s; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_to_i2s is +---------------------------------------------------------------------------------- +signal input_data : STD_LOGIC_VECTOR(15 downto 0); +signal bclk_sr : STD_LOGIC_VECTOR( 1 downto 0); +signal lrclk_sr : STD_LOGIC_VECTOR( 1 downto 0); +signal data_sr : STD_LOGIC_VECTOR(31 downto 0); +signal load_flag : STD_LOGIC; +signal channel_flag : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +s_axis_tready <= '1'; +process(s_axis_aclk) +begin + if(s_axis_aclk = '1' and s_axis_aclk'event)then + bclk_sr <= bclk_sr(0) & i2s_bclk; + lrclk_sr <= lrclk_sr(0) & i2s_lrclk; + if(s_axis_tvalid = '1')then + input_data <= s_axis_tdata; + end if; + + if((lrclk_sr = "10") or (lrclk_sr = "01"))then -- LR Edge + channel_flag <= '1'; + elsif(bclk_sr = "01")then -- Rising edge + channel_flag <= '0'; + end if; + + if(bclk_sr = "01")then -- Rising edge + load_flag <= channel_flag; + end if; + + if(bclk_sr = "10")then -- Falling edge + if(load_flag = '1')then + data_sr <= input_data & x"0000"; + else + data_sr <= data_sr(30 downto 0) & '0'; + end if; + end if; + end if; +end process; +i2s_sdata <= data_sr(31); +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl b/zynqberrydemo3/ip_lib/axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl new file mode 100644 index 0000000..66195ab --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_to_i2s_1.0/xgui/axis_to_i2s_v1_0.tcl @@ -0,0 +1,10 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + ipgui::add_page $IPINST -name "Page 0" + + +} + + diff --git a/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/bd/bd.tcl b/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/component.xml b/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/component.xml new file mode 100644 index 0000000..8c3a78c --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/component.xml @@ -0,0 +1,535 @@ + + + trenz.biz + user + axis_video_dwidth_converter + 1.0 + + + s_axis + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TUSER + + + s_axis_tuser + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + + WIZ_DATA_WIDTH + 32 + + + + + axis_aresetn + + + + + + + RST + + + axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + axis_aclk + + + + + + + CLK + + + axis_aclk + + + + + + ASSOCIATED_BUSIF + s_axis:m_axis + + + ASSOCIATED_RESET + axis_aresetn + + + + + m_axis + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TUSER + + + m_axis_tuser + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_video_dwidth_converter_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + c5686eda + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_video_dwidth_converter_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + c5686eda + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 6001f6d0 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tdata + + in + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tdata + + out + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_IN_TYPE + C In Type + 1 + + + C_OUT_TYPE + C Out Type + 1 + + + C_DATA_WIDTH + C Data Width + 32 + + + + + + choice_list_07c83d4f + 16 + 32 + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_pairs_719c03b1 + 1 + 4 + + + choice_pairs_95e1d6c3 + 1 + 2 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axis_video_dwidth_converter_v1_0.vhd + vhdlSource + CHECKSUM_c5686eda + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axis_video_dwidth_converter_v1_0.vhd + vhdlSource + + + + xilinx_xpgui_view_fileset + + xgui/axis_video_dwidth_converter_v1_0.tcl + tclSource + CHECKSUM_7e8a0bf1 + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + AXI4-Stream Video Data Width Converter + + + Component_Name + axis_video_dwidth_converter_v1_0 + + + C_IN_TYPE + Input Type + 1 + + + C_OUT_TYPE + Output Type + 1 + + + C_DATA_WIDTH + Data Width + 32 + + + + + + zynq + virtex7 + qvirtex7 + kintex7 + kintex7l + qkintex7 + qkintex7l + artix7 + artix7l + aartix7 + qartix7 + qzynq + azynq + virtexu + virtexuplus + kintexuplus + zynquplus + kintexu + + + /AXI_Peripheral + /Video_&_Image_Processing + + AXI4-Stream Video Data Width Converter v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 9 + + xilinx.com:user:axis_video_dwidth_converter:1.0 + + 2017-05-17T13:30:41Z + + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_video_dwidth_converter_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_video_dwidth_converter_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/hdl/axis_video_dwidth_converter_v1_0.vhd b/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/hdl/axis_video_dwidth_converter_v1_0.vhd new file mode 100644 index 0000000..723cbee --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/hdl/axis_video_dwidth_converter_v1_0.vhd @@ -0,0 +1,146 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity axis_video_dwidth_converter_v1_0 is +generic ( + C_DATA_WIDTH : integer := 32; + C_IN_TYPE : integer range 1 to 4 := 4; + C_OUT_TYPE : integer range 1 to 4 := 1 +); +port ( + axis_aclk : in STD_LOGIC; + axis_aresetn : in STD_LOGIC; + -- Ports of Axi Slave Bus Interface S_AXIS + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_IN_TYPE*C_DATA_WIDTH-1 downto 0); + s_axis_tuser : in STD_LOGIC; + s_axis_tlast : in STD_LOGIC; + s_axis_tvalid : in STD_LOGIC; + -- Ports of Axi Master Bus Interface M_AXIS + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC +); +end axis_video_dwidth_converter_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_video_dwidth_converter_v1_0 is +---------------------------------------------------------------------------------- +type sm_state_type is (ST_IDLE, ST_1W, ST_2W, ST_3W); +signal sm_state : sm_state_type := ST_IDLE; +signal tdata_buffer : STD_LOGIC_VECTOR((C_IN_TYPE-C_OUT_TYPE)*C_DATA_WIDTH-1 downto 0); +signal tlast_buffer : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +bypass_gen: if ((C_IN_TYPE = 1) and (C_OUT_TYPE = 1))generate +begin + m_axis_tvalid <= s_axis_tvalid; + m_axis_tdata <= s_axis_tdata; + m_axis_tuser <= s_axis_tuser; + m_axis_tlast <= s_axis_tlast; + s_axis_tready <= m_axis_tready; +end generate; +---------------------------------------------------------------------------------- +repack_gen: if ((C_IN_TYPE /= 1) or (C_OUT_TYPE /= 1)) generate +begin + process(sm_state, s_axis_tvalid) + begin + case sm_state is + when ST_IDLE => m_axis_tvalid <= s_axis_tvalid; + when ST_1W => m_axis_tvalid <= '1'; + when ST_2W => m_axis_tvalid <= '1'; + when ST_3W => m_axis_tvalid <= '1'; + end case; + end process; + + process(sm_state, s_axis_tuser) + begin + case sm_state is + when ST_IDLE => m_axis_tuser <= s_axis_tuser; + when ST_1W => m_axis_tuser <= '0'; + when ST_2W => m_axis_tuser <= '0'; + when ST_3W => m_axis_tuser <= '0'; + end case; + end process; + + process(sm_state, s_axis_tuser) + begin + case sm_state is + when ST_IDLE => m_axis_tlast <= '0'; + when ST_1W => + if(C_OUT_TYPE = 2)then + m_axis_tlast <= tlast_buffer; + else + m_axis_tlast <= '0'; + end if; + when ST_2W => m_axis_tlast <= '0'; + when ST_3W => m_axis_tlast <= tlast_buffer; + end case; + end process; + + out_1p_gen: if C_OUT_TYPE = 1 generate + begin + process(sm_state, s_axis_tdata, tdata_buffer) + begin + case sm_state is + when ST_IDLE => m_axis_tdata <= s_axis_tdata(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + when ST_1W => m_axis_tdata <= tdata_buffer(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + when ST_2W => m_axis_tdata <= tdata_buffer(C_OUT_TYPE*C_DATA_WIDTH*2-1 downto C_OUT_TYPE*C_DATA_WIDTH*1); + when ST_3W => m_axis_tdata <= tdata_buffer(C_OUT_TYPE*C_DATA_WIDTH*3-1 downto C_OUT_TYPE*C_DATA_WIDTH*2); + end case; + end process; + end generate; + + out_2p_gen: if C_OUT_TYPE = 2 generate + begin + process(sm_state, s_axis_tdata, tdata_buffer) + begin + case sm_state is + when ST_IDLE => m_axis_tdata <= s_axis_tdata(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + when ST_1W => m_axis_tdata <= tdata_buffer(C_OUT_TYPE*C_DATA_WIDTH-1 downto 0); + when others => null; + end case; + end process; + end generate; + + process(axis_aclk) + begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_state is + when ST_IDLE => + if((s_axis_tvalid = '1') and (m_axis_tready = '1'))then + tdata_buffer <= s_axis_tdata(s_axis_tdata'left downto C_OUT_TYPE*C_DATA_WIDTH); + tlast_buffer <= s_axis_tlast; + sm_state <= ST_1W; + end if; + when ST_1W => + if(m_axis_tready = '1')then + if(C_OUT_TYPE = 2)then + sm_state <= ST_IDLE; + else + sm_state <= ST_2W; + end if; + end if; + when ST_2W => + if(m_axis_tready = '1')then + sm_state <= ST_3W; + end if; + when ST_3W => + if(m_axis_tready = '1')then + sm_state <= ST_IDLE; + end if; + end case; + end if; + end process; + + s_axis_tready <= m_axis_tready when sm_state = ST_IDLE else '0'; +end generate; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/xgui/axis_video_dwidth_converter_v1_0.tcl b/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/xgui/axis_video_dwidth_converter_v1_0.tcl new file mode 100644 index 0000000..6b5cb6a --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_video_dwidth_converter_1.0/xgui/axis_video_dwidth_converter_v1_0.tcl @@ -0,0 +1,55 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_IN_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_OUT_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_DATA_WIDTH" -parent ${Page_0} -widget comboBox + + +} + +proc update_PARAM_VALUE.C_DATA_WIDTH { PARAM_VALUE.C_DATA_WIDTH } { + # Procedure called to update C_DATA_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_DATA_WIDTH { PARAM_VALUE.C_DATA_WIDTH } { + # Procedure called to validate C_DATA_WIDTH + return true +} + +proc update_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to update C_IN_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to validate C_IN_TYPE + return true +} + +proc update_PARAM_VALUE.C_OUT_TYPE { PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to update C_OUT_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_OUT_TYPE { PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to validate C_OUT_TYPE + return true +} + + +proc update_MODELPARAM_VALUE.C_IN_TYPE { MODELPARAM_VALUE.C_IN_TYPE PARAM_VALUE.C_IN_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IN_TYPE}] ${MODELPARAM_VALUE.C_IN_TYPE} +} + +proc update_MODELPARAM_VALUE.C_OUT_TYPE { MODELPARAM_VALUE.C_OUT_TYPE PARAM_VALUE.C_OUT_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_OUT_TYPE}] ${MODELPARAM_VALUE.C_OUT_TYPE} +} + +proc update_MODELPARAM_VALUE.C_DATA_WIDTH { MODELPARAM_VALUE.C_DATA_WIDTH PARAM_VALUE.C_DATA_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_DATA_WIDTH}] ${MODELPARAM_VALUE.C_DATA_WIDTH} +} + diff --git a/zynqberrydemo3/ip_lib/axis_video_resize_1.0/bd/bd.tcl b/zynqberrydemo3/ip_lib/axis_video_resize_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_video_resize_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/axis_video_resize_1.0/component.xml b/zynqberrydemo3/ip_lib/axis_video_resize_1.0/component.xml new file mode 100644 index 0000000..8183acb --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_video_resize_1.0/component.xml @@ -0,0 +1,521 @@ + + + trenz.biz + user + axis_video_resize + 1.0 + + + S_AXIS + + + + + + + TDATA + + + s_axis_tdata + + + + + TLAST + + + s_axis_tlast + + + + + TVALID + + + s_axis_tvalid + + + + + TREADY + + + s_axis_tready + + + + + TUSER + + + s_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + M_AXIS + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + TUSER + + + m_axis_tuser + + + + + + WIZ_DATA_WIDTH + 32 + + + + + axis_aresetn + + + + + + + RST + + + axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + axis_aclk + + + + + + + CLK + + + axis_aclk + + + + + + ASSOCIATED_BUSIF + S_AXIS:M_AXIS + + + ASSOCIATED_RESET + axis_aresetn + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + axis_video_resize_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 3d0341d7 + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + axis_video_resize_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + 3d0341d7 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + b9a712e9 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tdata + + out + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + s_axis_tdata + + in + + 31 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tuser + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tlast + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tvalid + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + s_axis_tready + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_HORISONTAL_RES + C Horisontal Res + 1280 + + + C_VERTICAL_RES + C Vertical Res + 720 + + + C_IN_TYPE + C In Type + 1 + + + + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_pairs_719c03b1 + 1 + 4 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/axis_video_resize_v1_0.vhd + vhdlSource + CHECKSUM_3d0341d7 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/axis_video_resize_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/axis_video_resize_v1_0.tcl + tclSource + CHECKSUM_ea8138be + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + Resize video stream + + + Component_Name + axis_video_resize_v1_0 + + + C_HORISONTAL_RES + Horisontal Resolution + 1280 + + + C_VERTICAL_RES + Vertical Resolution + 720 + + + C_IN_TYPE + Input Type + 1 + + + + + + virtex7 + artix7 + kintex7 + zynq + + + /AXI_Peripheral + /Video_&_Image_Processing + + Video Resize v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 5 + + xilinx.com:user:axis_video_resize:1.0 + + 2017-05-16T12:54:08Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/axis_video_resize_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/axis_video_resize_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/axis_video_resize_1.0/hdl/axis_video_resize_v1_0.vhd b/zynqberrydemo3/ip_lib/axis_video_resize_1.0/hdl/axis_video_resize_v1_0.vhd new file mode 100644 index 0000000..a70a46e --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_video_resize_1.0/hdl/axis_video_resize_v1_0.vhd @@ -0,0 +1,115 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity axis_video_resize_v1_0 is +generic ( + C_IN_TYPE : integer range 1 to 4 := 1; + C_HORISONTAL_RES : integer := 1280; + C_VERTICAL_RES : integer := 720 +); +port ( + axis_aclk : in STD_LOGIC; + axis_aresetn : in STD_LOGIC; + -- Ports of Axi Slave Bus Interface S_AXIS + s_axis_tready : out STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_IN_TYPE*32-1 downto 0); + s_axis_tuser : in STD_LOGIC; + s_axis_tlast : in STD_LOGIC; + s_axis_tvalid : in STD_LOGIC; + + -- Ports of Axi Master Bus Interface M_AXIS + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_IN_TYPE*32-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC + ); +end axis_video_resize_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of axis_video_resize_v1_0 is +---------------------------------------------------------------------------------- +signal hor_cnt : UNSIGNED(15 downto 0); +signal ver_cnt : UNSIGNED(15 downto 0); +type sm_state_type is (ST_IDLE, ST_HOR_LINE, ST_HOR_CROP); +signal sm_state : sm_state_type := ST_IDLE; +signal vert_pass : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +s_axis_tready <= m_axis_tready; +m_axis_tdata <= s_axis_tdata; +m_axis_tuser <= s_axis_tuser; +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + case sm_state is + when ST_IDLE => -- Wait for start of frame + vert_pass <= '1'; + ver_cnt <= TO_UNSIGNED(0,16); + hor_cnt <= TO_UNSIGNED(C_IN_TYPE,16); + if((s_axis_tvalid = '1') and (m_axis_tready = '1') and (s_axis_tuser = '1'))then + sm_state <= ST_HOR_LINE; + end if; + when ST_HOR_LINE => + if((s_axis_tvalid = '1') and (m_axis_tready = '1'))then + if(s_axis_tuser = '1')then + ver_cnt <= TO_UNSIGNED(0,16); + vert_pass <= '1'; + elsif(s_axis_tlast = '1')then + if(ver_cnt >= TO_UNSIGNED((C_VERTICAL_RES-1),16))then + vert_pass <= '0'; + end if; + ver_cnt <= ver_cnt + 1; + end if; + + if(s_axis_tlast = '1')then + hor_cnt <= TO_UNSIGNED(0,16); + else + if(hor_cnt >= TO_UNSIGNED((C_HORISONTAL_RES - C_IN_TYPE),16))then + sm_state <= ST_HOR_CROP; + end if; + hor_cnt <= hor_cnt + TO_UNSIGNED(C_IN_TYPE, 16); + end if; + end if; + when ST_HOR_CROP => + if((s_axis_tvalid = '1') and (m_axis_tready = '1') and (s_axis_tlast = '1'))then + hor_cnt <= TO_UNSIGNED(0,16); + sm_state <= ST_HOR_LINE; + if(ver_cnt >= TO_UNSIGNED((C_VERTICAL_RES-1),16))then + vert_pass <= '0'; + end if; + ver_cnt <= ver_cnt + 1; + end if; + end case; + end if; +end process; + +process(sm_state, s_axis_tvalid, s_axis_tuser, vert_pass) +begin + case sm_state is + when ST_IDLE => m_axis_tvalid <= s_axis_tvalid and s_axis_tuser; + when ST_HOR_LINE => m_axis_tvalid <= s_axis_tvalid and (vert_pass or s_axis_tuser); + when ST_HOR_CROP => m_axis_tvalid <= '0'; + end case; +end process; + +process(sm_state, hor_cnt) +begin + case sm_state is + when ST_IDLE => m_axis_tlast <= '0'; + when ST_HOR_LINE => + if(hor_cnt >= TO_UNSIGNED((C_HORISONTAL_RES - C_IN_TYPE),16))then + m_axis_tlast <= '1'; + else + m_axis_tlast <= '0'; + end if; + when ST_HOR_CROP => m_axis_tlast <= '0'; + end case; +end process; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/axis_video_resize_1.0/xgui/axis_video_resize_v1_0.tcl b/zynqberrydemo3/ip_lib/axis_video_resize_1.0/xgui/axis_video_resize_v1_0.tcl new file mode 100644 index 0000000..75490a1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/axis_video_resize_1.0/xgui/axis_video_resize_v1_0.tcl @@ -0,0 +1,55 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_IN_TYPE" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_HORISONTAL_RES" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_VERTICAL_RES" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_HORISONTAL_RES { PARAM_VALUE.C_HORISONTAL_RES } { + # Procedure called to update C_HORISONTAL_RES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_HORISONTAL_RES { PARAM_VALUE.C_HORISONTAL_RES } { + # Procedure called to validate C_HORISONTAL_RES + return true +} + +proc update_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to update C_IN_TYPE when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IN_TYPE { PARAM_VALUE.C_IN_TYPE } { + # Procedure called to validate C_IN_TYPE + return true +} + +proc update_PARAM_VALUE.C_VERTICAL_RES { PARAM_VALUE.C_VERTICAL_RES } { + # Procedure called to update C_VERTICAL_RES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_VERTICAL_RES { PARAM_VALUE.C_VERTICAL_RES } { + # Procedure called to validate C_VERTICAL_RES + return true +} + + +proc update_MODELPARAM_VALUE.C_HORISONTAL_RES { MODELPARAM_VALUE.C_HORISONTAL_RES PARAM_VALUE.C_HORISONTAL_RES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_HORISONTAL_RES}] ${MODELPARAM_VALUE.C_HORISONTAL_RES} +} + +proc update_MODELPARAM_VALUE.C_VERTICAL_RES { MODELPARAM_VALUE.C_VERTICAL_RES PARAM_VALUE.C_VERTICAL_RES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_VERTICAL_RES}] ${MODELPARAM_VALUE.C_VERTICAL_RES} +} + +proc update_MODELPARAM_VALUE.C_IN_TYPE { MODELPARAM_VALUE.C_IN_TYPE PARAM_VALUE.C_IN_TYPE } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IN_TYPE}] ${MODELPARAM_VALUE.C_IN_TYPE} +} + diff --git a/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/component.xml b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/component.xml new file mode 100644 index 0000000..c91798f --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/component.xml @@ -0,0 +1,1035 @@ + + + trenz.biz + user + csi2_d_phy_rx + 1.0 + + + RX_MIPI_PPI + RX_MIPI_PPI + RX_MIPI_PPI + + + + + + + DL1_RXACTIVEHS + + + dl1_rxactivehs + + + + + CL_ENABLE + + + cl_enable + + + + + DL1_RXDATAHS + + + dl1_datahs + + + + + CL_STOPSTATE + + + cl_stopstate + + + + + DL0_RXSYNCHS + + + dl0_rxsynchs + + + + + DL1_RXVALIDHS + + + dl1_rxvalidhs + + + + + DL0_RXACTIVEHS + + + dl0_rxactivehs + + + + + DL1_RXSYNCHS + + + dl1_rxsynchs + + + + + CL_RXCLKACTIVEHS + + + cl_rxclkactivehs + + + + + DL0_ENABLE + + + dl0_enable + + + + + DL0_RXDATAHS + + + dl0_datahs + + + + + DL1_ENABLE + + + dl1_enable + + + + + DL0_RXVALIDHS + + + dl0_rxvalidhs + + + + + DL2_RXSYNCHS + + + dl2_rxsynchs + + + + + DL3_RXACTIVEHS + + + dl3_rxactivehs + + + + + DL3_RXDATAHS + + + dl3_datahs + + + + + DL2_RXDATAHS + + + dl2_datahs + + + + + DL3_RXSYNCHS + + + dl3_rxsynchs + + + + + DL3_RXVALIDHS + + + dl3_rxvalidhs + + + + + DL3_ENABLE + + + dl3_enable + + + + + DL2_RXVALIDHS + + + dl2_rxvalidhs + + + + + DL2_RXACTIVEHS + + + dl2_rxactivehs + + + + + DL2_ENABLE + + + dl2_enable + + + + + + in_delay_clk + + + + + + + CLK + + + in_delay_clk + + + + + + data_err + + + + + + + ACK + + + trig_ack + + + + + TRIG + + + trig_req + + + + + + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + VHDL + csi2_d_phy_rx + + xilinx_anylanguagesynthesis_view_fileset + + + + viewChecksum + 705bfa8d + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + VHDL + csi2_d_phy_rx + + xilinx_anylanguagebehavioralsimulation_view_fileset + + + + viewChecksum + f9df0448 + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + b6781f17 + + + + + + + in_delay_clk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + + true + + + + + + clk_rxp + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + clk_rxn + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + data_rxp + + in + + 1 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + data_rxn + + in + + 1 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + data_lp_p + + in + + 0 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + + true + + + + + + data_lp_n + + in + + 0 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + + true + + + + + + trig_req + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0 + + + + + trig_ack + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + rxbyteclkhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + cl_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0x1 + + + + + cl_stopstate + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + cl_rxclkactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl0_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0x1 + + + + + dl0_rxactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl0_rxvalidhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl0_rxsynchs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl0_datahs + + out + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl1_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 0x1 + + + + + dl1_rxactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl1_rxvalidhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl1_rxsynchs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl1_datahs + + out + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl2_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + dl2_rxactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl2_rxvalidhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl2_rxsynchs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl2_datahs + + out + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl3_enable + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + 1 + + + + + dl3_rxactivehs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl3_rxvalidhs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl3_rxsynchs + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + dl3_datahs + + out + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + + C_NUM_LANES + C Num Lanes + 2 + + + C_NUM_LP_LANES + C Num Lp Lanes + 1 + + + C_D0_SWAP + C D0 Swap + FALSE + + + C_D1_SWAP + C D1 Swap + FALSE + + + C_D2_SWAP + C D2 Swap + FALSE + + + C_D3_SWAP + C D3 Swap + FALSE + + + C_DIFF_TERM + C Diff Term + FALSE + + + C_ADD_IDELAYCTRL + C Add Idelayctrl + FALSE + + + C_IODELAY_GROUP + C Iodelay Group + csi_dly_grp + + + C_USE_DELAY + C Use Delay + TRUE + + + C_CALIB_WAIT + C Calib Wait + 2047 + + + C_RATE_LIMIT + C Rate Limit + 10 + + + + + + choice_list_e6469819 + 1 + 2 + 4 + + + choice_list_f5166eba + 0 + 1 + 2 + 4 + + + + + xilinx_anylanguagesynthesis_view_fileset + + hdl/csi2_d_phy_rx.xdc + xdc + USED_IN_implementation + USED_IN_synthesis + + + hdl/phy_clock_system.vhd + vhdlSource + + + hdl/line_if.vhd + vhdlSource + + + hdl/csi2_d_phy_rx.vhd + vhdlSource + CHECKSUM_8021b24b + + + + xilinx_anylanguagebehavioralsimulation_view_fileset + + hdl/phy_clock_system.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/line_if.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/csi2_d_phy_rx.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/csi2_d_phy_rx_v1_0.tcl + tclSource + CHECKSUM_30433af4 + XGUI_VERSION_2 + + + + CSI-2 D-PHY RX Interface + + + C_NUM_LANES + Data Lanes + 2 + + + C_NUM_LP_LANES + LP Lanes + 1 + + + C_D0_SWAP + D0 P/N Swap + FALSE + + + C_D1_SWAP + D1 P/N Swap + FALSE + + + C_D2_SWAP + D2 P/N Swap + FALSE + + + C_D3_SWAP + D3 P/N Swap + FALSE + + + C_DIFF_TERM + Add Differential Termination + FALSE + + + C_ADD_IDELAYCTRL + Add Idelayctrl + FALSE + + + C_IODELAY_GROUP + Iodelay Group Name + csi_dly_grp + + + Component_Name + csi2_d_phy_rx_v1_0 + + + C_USE_DELAY + Use Delay + TRUE + + + C_CALIB_WAIT + Calibration Cycle + 2047 + + + C_RATE_LIMIT + Error Rate Limit + 10 + + + + + + virtex7 + artix7 + kintex7 + zynq + qzynq + + + /UserIP + /Video_&_Image_Processing + + CSI-2 D-PHY RX v1_0 + Trenz Electronic GmbH + http://www.trenz.biz + 35 + + xilinx.com:user:csi2_d_phy_rx:1.0 + + 2017-05-24T13:20:36Z + + + b:/cores/2015.4/design/te0726/demo/ip_lib/csi2_d_phy_rx_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/csi2_d_phy_rx_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd new file mode 100644 index 0000000..0d0bf83 --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.vhd @@ -0,0 +1,293 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use ieee.numeric_std.all; +Library UNISIM; +use UNISIM.vcomponents.all; +---------------------------------------------------------------------------------- +entity csi2_d_phy_rx is +generic ( + C_NUM_LANES : integer range 1 to 4 := 2; -- Number of data lanes + C_NUM_LP_LANES : integer range 0 to 4 := 1; -- Number of lanes that support LP input + C_D0_SWAP : BOOLEAN := FALSE; + C_D1_SWAP : BOOLEAN := FALSE; + C_D2_SWAP : BOOLEAN := FALSE; + C_D3_SWAP : BOOLEAN := FALSE; + ------------------------------------------------------------------------------- + C_USE_DELAY : BOOLEAN := TRUE; + C_DIFF_TERM : BOOLEAN := FALSE; + C_ADD_IDELAYCTRL : BOOLEAN := FALSE; + C_IODELAY_GROUP : STRING := "csi_dly_grp"; + C_CALIB_WAIT : INTEGER := 2047; + C_RATE_LIMIT : INTEGER := 10 +); +port ( + in_delay_clk : in STD_LOGIC; + -- Camera physical interface + clk_rxp : in STD_LOGIC; + clk_rxn : in STD_LOGIC; + data_rxp : in STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); + data_rxn : in STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); + data_lp_p : in STD_LOGIC_VECTOR(C_NUM_LP_LANES-1 downto 0); + data_lp_n : in STD_LOGIC_VECTOR(C_NUM_LP_LANES-1 downto 0); + -- Calibration + trig_req : in STD_LOGIC; + trig_ack : out STD_LOGIC; + -- MIPI PPI + rxbyteclkhs : out STD_LOGIC; -- Main byte clock bitrate/8 + cl_enable : in STD_LOGIC := '1'; -- PPI ShutDown ? + cl_stopstate : out STD_LOGIC; -- PPI StopState + cl_rxclkactivehs : out STD_LOGIC; -- optional, PPI RxClkActiveHS + dl0_enable : in STD_LOGIC; + dl0_rxactivehs : out STD_LOGIC; + dl0_rxvalidhs : out STD_LOGIC; + dl0_rxsynchs : out STD_LOGIC; + dl0_datahs : out STD_LOGIC_VECTOR(7 downto 0); + dl1_enable : in STD_LOGIC; + dl1_rxactivehs : out STD_LOGIC; + dl1_rxvalidhs : out STD_LOGIC; + dl1_rxsynchs : out STD_LOGIC; + dl1_datahs : out STD_LOGIC_VECTOR(7 downto 0); + dl2_enable : in STD_LOGIC; + dl2_rxactivehs : out STD_LOGIC; + dl2_rxvalidhs : out STD_LOGIC; + dl2_rxsynchs : out STD_LOGIC; + dl2_datahs : out STD_LOGIC_VECTOR(7 downto 0); + dl3_enable : in STD_LOGIC; + dl3_rxactivehs : out STD_LOGIC; + dl3_rxvalidhs : out STD_LOGIC; + dl3_rxsynchs : out STD_LOGIC; + dl3_datahs : out STD_LOGIC_VECTOR(7 downto 0) +); +end csi2_d_phy_rx; +---------------------------------------------------------------------------------- +architecture Behavioral of csi2_d_phy_rx is +---------------------------------------------------------------------------------- +component phy_clock_system is +generic ( + C_USE_DELAY : BOOLEAN := FALSE; + C_DIFF_TERM : BOOLEAN := FALSE; + C_IODELAY_GROUP : STRING := "csi_dly_grp"; + C_CALIB_WAIT : INTEGER := 2047; + C_ACC_LIMIT : INTEGER := 100000; + C_RATE_LIMIT : INTEGER := 5 +); +port ( + clock_upd_req : in STD_LOGIC; + clock_upd_ack : out STD_LOGIC; + in_clk_p : in STD_LOGIC; + in_clk_n : in STD_LOGIC; + in_ref_clk : in STD_LOGIC; + out_dclk : out STD_LOGIC; + out_pclk : out STD_LOGIC; + out_uclk : out STD_LOGIC +); +end component; + +component line_if is +generic ( + C_DIFF_TERM : BOOLEAN := FALSE +); +port ( + in_d_p : in STD_LOGIC; + in_d_n : in STD_LOGIC; + in_pclk : in STD_LOGIC; + in_dclk : in STD_LOGIC; + in_rst : in STD_LOGIC; + out_data : out STD_LOGIC_VECTOR(7 downto 0) +); +end component; +---------------------------------------------------------------------------------- +constant C_ACC_LIMIT : INTEGER := 1000000; +attribute IODELAY_GROUP : STRING; +signal rst_iserdes : STD_LOGIC; +signal dclk : STD_LOGIC; +signal pclk : STD_LOGIC; +signal uclk : STD_LOGIC; +signal prev_raw_valid : STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); +signal line_raw_sync : STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); +signal line_raw_out : STD_LOGIC_VECTOR(C_NUM_LANES*8-1 downto 0); +signal raw_valid : STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); +signal raw_fe_data : STD_LOGIC_VECTOR(C_NUM_LANES*8-1 downto 0); +signal raw_fe_valid : STD_LOGIC_VECTOR(C_NUM_LANES-1 downto 0); +signal swap_vec : STD_LOGIC_VECTOR(3 downto 0); +signal clock_upd_req : STD_LOGIC; +signal clock_upd_ack : STD_LOGIC; +signal data_err_i : UNSIGNED(C_NUM_LANES-1 downto 0); +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +swap_vec(0) <= '1' when C_D0_SWAP = TRUE else '0'; +swap_vec(1) <= '1' when C_D1_SWAP = TRUE else '0'; +swap_vec(2) <= '1' when C_D2_SWAP = TRUE else '0'; +swap_vec(3) <= '1' when C_D3_SWAP = TRUE else '0'; +---------------------------------------------------------------------------------- +IDELAYCTRL_gen: if (C_ADD_IDELAYCTRL = TRUE) and (C_USE_DELAY = TRUE) generate +attribute IODELAY_GROUP of IdlyCtrl_inst_0 : label is C_IODELAY_GROUP; +begin + IdlyCtrl_inst_0 : IDELAYCTRL + port map ( + REFCLK => in_delay_clk, + RST => '0', + RDY => open + ); +end generate; +---------------------------------------------------------------------------------- +process(in_delay_clk) +begin + if(in_delay_clk = '1' and in_delay_clk'event)then + clock_upd_req <= trig_req; + end if; +end process; +---------------------------------------------------------------------------------- +clock_system_inst: phy_clock_system +generic map( + C_USE_DELAY => C_USE_DELAY, + C_DIFF_TERM => C_DIFF_TERM, + C_IODELAY_GROUP => C_IODELAY_GROUP, + C_CALIB_WAIT => C_CALIB_WAIT, + C_ACC_LIMIT => C_ACC_LIMIT, + C_RATE_LIMIT => C_RATE_LIMIT +) +port map( + clock_upd_req => clock_upd_req, + clock_upd_ack => clock_upd_ack, + in_clk_p => clk_rxp, + in_clk_n => clk_rxn, + in_ref_clk => in_delay_clk, + out_dclk => dclk, + out_pclk => pclk, + out_uclk => uclk +); +rst_iserdes <= '0'; + +bits_gen: for i in 0 to C_NUM_LANES-1 generate +begin + line_if_inst: line_if + generic map( + C_DIFF_TERM => C_DIFF_TERM + ) + port map( + in_d_p => data_rxp(i), + in_d_n => data_rxn(i), + in_pclk => pclk, + in_dclk => dclk, + in_rst => rst_iserdes, + out_data => line_raw_out(i*8+7 downto i*8) + ); +end generate; + +without_lp_gen: if C_NUM_LP_LANES = 0 generate +begin + raw_valid <= (others => '1'); + line_raw_sync <= (others => '0'); +end generate; + +with_lp_gen: if C_NUM_LP_LANES > 0 generate +begin +process(pclk) +begin + if(pclk = '1' and pclk'event)then + for i in 0 to C_NUM_LP_LANES-1 loop + raw_valid(i) <= not (data_lp_p(i) or data_lp_n(i)); + prev_raw_valid(i) <= raw_valid(i); + if((prev_raw_valid(i) = '0') and ((data_lp_p(i) or data_lp_n(i)) = '0'))then + line_raw_sync(i) <= '1'; + else + line_raw_sync(i) <= '0'; + end if; + end loop; + end if; +end process; + +ext_lp_gen: if C_NUM_LP_LANES < C_NUM_LANES generate +begin + process(pclk) + begin + if(pclk = '1' and pclk'event)then + for i in C_NUM_LP_LANES to C_NUM_LANES-1 loop + raw_valid(i) <= not (data_lp_p(0) or data_lp_n(0)); + prev_raw_valid(i) <= raw_valid(i); + if((prev_raw_valid(i) = '0') and ((data_lp_p(0) or data_lp_n(0)) = '0'))then + line_raw_sync(i) <= '1'; + else + line_raw_sync(i) <= '0'; + end if; + end loop; + end if; + end process; +end generate; +end generate; + +process(uclk) +begin + if(uclk = '0' and uclk'event)then + for i in 0 to C_NUM_LANES-1 loop + if(swap_vec(i) = '0')then + raw_fe_data(i*8+7 downto i*8) <= line_raw_out(i*8+7 downto i*8); + else + raw_fe_data(i*8+7 downto i*8) <= not line_raw_out(i*8+7 downto i*8); + end if; + end loop; + raw_fe_valid <= raw_valid; + end if; +end process; + +process(uclk) +begin + if(uclk = '1' and uclk'event)then + dl0_rxvalidhs <= raw_fe_valid(0); + dl0_rxactivehs <= raw_fe_valid(0); + dl0_datahs <= raw_fe_data(7 downto 0); + dl0_rxsynchs <= line_raw_sync(0); + end if; +end process; + +lane_1_gen: if C_NUM_LANES > 1 generate +begin + process(uclk) + begin + if(uclk = '1' and uclk'event)then + dl1_rxvalidhs <= raw_fe_valid(1); + dl1_rxactivehs <= raw_fe_valid(1); + dl1_datahs <= raw_fe_data(15 downto 8); + dl1_rxsynchs <= line_raw_sync(1); + end if; + end process; +end generate; + +lane_2_gen: if C_NUM_LANES > 2 generate +begin + process(uclk) + begin + if(uclk = '1' and uclk'event)then + dl2_rxvalidhs <= raw_fe_valid(2); + dl2_rxactivehs <= raw_fe_valid(2); + dl2_datahs <= raw_fe_data(23 downto 16); + dl2_rxsynchs <= line_raw_sync(2); + end if; + end process; +end generate; + +lane_3_gen: if C_NUM_LANES > 3 generate +begin + process(uclk) + begin + if(uclk = '1' and uclk'event)then + dl3_rxvalidhs <= raw_fe_valid(3); + dl3_rxactivehs <= raw_fe_valid(3); + dl3_datahs <= raw_fe_data(31 downto 24); + dl3_rxsynchs <= line_raw_sync(3); + end if; + end process; +end generate; + +rxbyteclkhs <= uclk; -- Main byte clock bitrate/8 +cl_stopstate <= '0'; -- PPI StopState +cl_rxclkactivehs <= '1'; -- optional, PPI RxClkActiveHS +---------------------------------------------------------------------------------- +end Behavioral; + diff --git a/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc new file mode 100644 index 0000000..c7c796f --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/csi2_d_phy_rx.xdc @@ -0,0 +1,4 @@ +set_false_path -from [get_pins clock_system_inst/invers_clk_s_reg/C] -to [get_pins clock_system_inst/dly_gen.BUFGCTRL_inst/S1] +set_false_path -from [get_pins clock_system_inst/invers_clk_c_reg/C] -to [get_pins clock_system_inst/dly_gen.BUFGCTRL_inst/CE1] +set_false_path -from [get_pins clock_system_inst/direct_clk_s_reg/C] -to [get_pins clock_system_inst/dly_gen.BUFGCTRL_inst/S0] +set_false_path -from [get_pins clock_system_inst/direct_clk_c_reg/C] -to [get_pins clock_system_inst/dly_gen.BUFGCTRL_inst/CE0] diff --git a/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd new file mode 100644 index 0000000..0e879fb --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/line_if.vhd @@ -0,0 +1,97 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity line_if is +generic ( + C_DIFF_TERM : BOOLEAN := FALSE +); +port ( + in_d_p : in STD_LOGIC; + in_d_n : in STD_LOGIC; + in_pclk : in STD_LOGIC; + in_dclk : in STD_LOGIC; + in_rst : in STD_LOGIC; + out_data : out STD_LOGIC_VECTOR(7 downto 0) +); +end line_if; +---------------------------------------------------------------------------------- +architecture arch_imp of line_if is +---------------------------------------------------------------------------------- +signal data_s : STD_LOGIC; +signal data_iserdes : STD_LOGIC_VECTOR(7 downto 0); +signal dclk_n : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +d_ibufds_inst : IBUFDS +generic map ( + DIFF_TERM => C_DIFF_TERM +) +port map ( + I => in_d_p, + IB => in_d_n, + O => data_s +); + +dclk_n <= not in_dclk; +ISERDESE2_inst : ISERDESE2 +generic map ( + DATA_RATE => "DDR", -- DDR, SDR + DATA_WIDTH => 8, -- Parallel data width (2-8,10,14) + DYN_CLKDIV_INV_EN => "FALSE", -- Enable DYNCLKDIVINVSEL inversion (FALSE, TRUE) + DYN_CLK_INV_EN => "FALSE", -- Enable DYNCLKINVSEL inversion (FALSE, TRUE) + INIT_Q1 => '0', + INIT_Q2 => '0', + INIT_Q3 => '0', + INIT_Q4 => '0', + INTERFACE_TYPE => "NETWORKING", -- MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE + IOBDELAY => "NONE", -- NONE, BOTH, IBUF, IFD + NUM_CE => 2, -- Number of clock enables (1,2) + OFB_USED => "FALSE", -- Select OFB path (FALSE, TRUE) + SERDES_MODE => "MASTER", -- MASTER, SLAVE + SRVAL_Q1 => '0', + SRVAL_Q2 => '0', + SRVAL_Q3 => '0', + SRVAL_Q4 => '0' +) +port map ( + O => open, -- 1-bit output: Combinatorial output + Q1 => data_iserdes(7), + Q2 => data_iserdes(6), + Q3 => data_iserdes(5), + Q4 => data_iserdes(4), + Q5 => data_iserdes(3), + Q6 => data_iserdes(2), + Q7 => data_iserdes(1), + Q8 => data_iserdes(0), + SHIFTOUT1 => open, + SHIFTOUT2 => open, + BITSLIP => '0', -- 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to + CE1 => '1', + CE2 => '1', + CLKDIVP => '0', -- 1-bit input: TBD + CLK => in_dclk, -- 1-bit input: High-speed clock + CLKB => dclk_n, -- 1-bit input: High-speed secondary clock + CLKDIV => in_pclk, -- 1-bit input: Divided clock + OCLK => '0', -- 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY" + DYNCLKDIVSEL => '0', -- 1-bit input: Dynamic CLKDIV inversion + DYNCLKSEL => '0', -- 1-bit input: Dynamic CLK/CLKB inversion + D => data_s, -- 1-bit input: Data input + DDLY => '0', -- 1-bit input: Serial data from IDELAYE2 + OFB => '0', -- 1-bit input: Data feedback from OSERDESE2 + OCLKB => '0', -- 1-bit input: High speed negative edge output clock + RST => in_rst, -- 1-bit input: Active high asynchronous reset + SHIFTIN1 => '0', + SHIFTIN2 => '0' +); + +out_data <= data_iserdes; +--------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/phy_clock_system.vhd b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/phy_clock_system.vhd new file mode 100644 index 0000000..942a2c1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/hdl/phy_clock_system.vhd @@ -0,0 +1,316 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity phy_clock_system is +generic ( + C_USE_DELAY : BOOLEAN := FALSE; + C_DIFF_TERM : BOOLEAN := FALSE; + C_IDELAY_TYPE : STRING := "FIXED"; + C_IODELAY_GROUP : STRING := "csi_dly_grp"; + C_ACC_LIMIT : INTEGER := 100000; + C_RATE_LIMIT : INTEGER := 5; + C_CALIB_WAIT : INTEGER := 2047 +); +port ( + -- Debug + --cntvalue_out : out STD_LOGIC_VECTOR(4 downto 0); + --state_out : out STD_LOGIC_VECTOR(3 downto 0); + + clock_upd_req : in STD_LOGIC; + clock_upd_ack : out STD_LOGIC; + in_clk_p : in STD_LOGIC; + in_clk_n : in STD_LOGIC; + in_ref_clk : in STD_LOGIC; + out_dclk : out STD_LOGIC; + out_pclk : out STD_LOGIC; + out_uclk : out STD_LOGIC +); +end phy_clock_system; +---------------------------------------------------------------------------------- +architecture arch_imp of phy_clock_system is +---------------------------------------------------------------------------------- +attribute IODELAY_GROUP : STRING; +---------------------------------------------------------------------------------- +signal clk_g : STD_LOGIC; -- Clock after IBUFGDS +signal clk_d : STD_LOGIC; -- Clock after IDELAYE2 +signal clk_dn : STD_LOGIC; -- Clock after IDELAYE2 +signal clk_dg : STD_LOGIC; -- Clock after IBUFGDS +signal clk_bufmr : STD_LOGIC; +signal clk_bufio : STD_LOGIC; +signal clk_bufr : STD_LOGIC; +signal rst_bufmr : STD_LOGIC; +type sm_state_type is (ST_CHECK, ST_FIND_GOOD, ST_GOOD_WAIT, + ST_FIND_BAD, ST_BAD_WAIT, ST_CALK_DLY, ST_SET_DLY, ST_SET_WAIT); +signal sm_state : sm_state_type; +signal wait_cnt : integer range 0 to C_CALIB_WAIT; +signal delay_ce : STD_LOGIC; +signal delay_rst : STD_LOGIC; +signal delay_set : STD_LOGIC; +signal delay_set_val : STD_LOGIC_VECTOR(4 downto 0); +signal curr_delay : UNSIGNED(4 downto 0); +signal start_dly : UNSIGNED(5 downto 0); +signal end_dly : UNSIGNED(5 downto 0); +signal sum_dly : UNSIGNED(5 downto 0); +signal invers_clk : STD_LOGIC := '0'; +signal direct_clk : STD_LOGIC := '1'; +signal direct_clk_s : STD_LOGIC; +signal invers_clk_s : STD_LOGIC := '0'; +signal direct_clk_c : STD_LOGIC; +signal invers_clk_c : STD_LOGIC := '0'; +signal req_i : STD_LOGIC; +signal err_sr : STD_LOGIC_VECTOR(1 downto 0); +signal acc_cnt : INTEGER range 0 to C_ACC_LIMIT-1; +signal acc_val : INTEGER range 0 to C_ACC_LIMIT-1; +signal err_rate : INTEGER range 0 to C_ACC_LIMIT-1; +---------------------------------------------------------------------------------- +attribute ASYNC_REG : string; +attribute ASYNC_REG of req_i : signal is "true"; +attribute keep : string; +attribute keep of direct_clk_s : signal is "true"; +attribute keep of direct_clk_c : signal is "true"; +attribute keep of invers_clk_s : signal is "true"; +attribute keep of invers_clk_c : signal is "true"; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +-- Test +clk_ibufgds_inst : IBUFGDS +generic map ( + DIFF_TERM => C_DIFF_TERM +) +port map ( + I => in_clk_p, + IB => in_clk_n, + O => clk_g +); + +process(in_ref_clk) +begin + if(in_ref_clk = '1' and in_ref_clk'event)then + direct_clk_s <= not invers_clk; + invers_clk_s <= invers_clk; + direct_clk_c <= not invers_clk; + invers_clk_c <= invers_clk; + end if; +end process; +--direct_clk <= not invers_clk; + +dly_gen: if C_USE_DELAY = TRUE generate +attribute IODELAY_GROUP of IDELAYE2_inst : label is C_IODELAY_GROUP; +begin + IDELAYE2_inst : IDELAYE2 + generic map ( + CINVCTRL_SEL => "FALSE", -- Enable dynamic clock inversion (FALSE, TRUE) + DELAY_SRC => "IDATAIN", -- Delay input (IDATAIN, DATAIN) + HIGH_PERFORMANCE_MODE => "TRUE", -- Reduced jitter ("TRUE"), Reduced power ("FALSE") + IDELAY_TYPE => "VAR_LOAD", -- FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE + IDELAY_VALUE => 0, -- Input delay tap setting (0-31) + PIPE_SEL => "FALSE", -- Select pipelined mode, FALSE, TRUE + REFCLK_FREQUENCY => 200.0, -- IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0). + SIGNAL_PATTERN => "CLOCK" -- DATA, CLOCK input signal + ) + port map ( + --CNTVALUEOUT => cntvalue_out,-- 5-bit output: Counter value output + CNTVALUEOUT => open, -- 5-bit output: Counter value output + DATAOUT => clk_d, -- 1-bit output: Delayed data output + C => in_ref_clk, -- 1-bit input: Clock input + CE => '0', -- 1-bit input: Active high enable increment/decrement input + CINVCTRL => '0', -- 1-bit input: Dynamic clock inversion input + CNTVALUEIN => delay_set_val, -- 5-bit input: Counter value input + DATAIN => '0', -- 1-bit input: Internal delay data input + IDATAIN => clk_g, -- 1-bit input: Data input from the I/O + INC => '1', -- 1-bit input: Increment / Decrement tap delay input + LD => delay_set, -- 1-bit input: Load IDELAY_VALUE input + LDPIPEEN => '0', -- 1-bit input: Enable PIPELINE register to load data input + REGRST => '0' -- 1-bit input: Active-high reset tap-delay input + ); + clk_dn <= not clk_d; + + BUFGCTRL_inst : BUFGCTRL + generic map ( + INIT_OUT => 0, -- Initial value of BUFGCTRL output (0/1) + PRESELECT_I0 => FALSE, -- BUFGCTRL output uses I0 input (TRUE/FALSE) + PRESELECT_I1 => FALSE -- BUFGCTRL output uses I1 input (TRUE/FALSE) + ) + port map ( + O => clk_dg, -- 1-bit output: Clock Output pin + CE0 => direct_clk_c, -- 1-bit input: Clock enable input for I0 input + CE1 => invers_clk_c, -- 1-bit input: Clock enable input for I1 input + I0 => clk_d, -- 1-bit input: Primary clock input + I1 => clk_dn, -- 1-bit input: Secondary clock input + IGNORE0 => '0', -- 1-bit input: Clock ignore input for I0 + IGNORE1 => '0', -- 1-bit input: Clock ignore input for I1 + S0 => direct_clk_s, -- 1-bit input: Clock select input for I0 + S1 => invers_clk_s -- 1-bit input: Clock select input for I1 + ); + + process(in_ref_clk) + begin + if(in_ref_clk = '1' and in_ref_clk'event)then + req_i <= clock_upd_req; + clock_upd_ack <= req_i; + err_sr <= err_sr(0) & req_i; + if(acc_cnt = C_ACC_LIMIT-1)then + acc_cnt <= 0; + err_rate <= acc_val; + acc_val <= 0; + else + if(err_sr = "01")then + acc_val <= acc_val + 1; + end if; + acc_cnt <= acc_cnt + 1; + end if; + end if; + end process; + + process(in_ref_clk) + begin + if(in_ref_clk = '1' and in_ref_clk'event)then + case sm_state is + when ST_CHECK => + if(err_rate > C_RATE_LIMIT)then + sm_state <= ST_GOOD_WAIT; + curr_delay <= (others => '0'); + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + else + delay_set <= '0'; + end if; + + when ST_FIND_GOOD => + if(req_i = '0')then -- We found start of the eye + sm_state <= ST_FIND_BAD; + start_dly <= resize(curr_delay,6); + else + if(curr_delay < TO_UNSIGNED(31,5))then + curr_delay <= curr_delay + 1; + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + sm_state <= ST_GOOD_WAIT; + else -- Data not found + invers_clk <= not invers_clk; + curr_delay <= (others => '0'); + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + sm_state <= ST_GOOD_WAIT; + end if; + end if; + + when ST_GOOD_WAIT => + delay_set <= '0'; + if(wait_cnt = 0)then + sm_state <= ST_FIND_GOOD; + else + wait_cnt <= wait_cnt - 1; + end if; + + when ST_FIND_BAD => + if((req_i = '1') or (curr_delay = TO_UNSIGNED(31,5)))then -- We found end of the eye + sm_state <= ST_CALK_DLY; + end_dly <= resize(curr_delay,6); + else + curr_delay <= curr_delay + 1; + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + sm_state <= ST_BAD_WAIT; + end if; + + when ST_BAD_WAIT => + delay_set <= '0'; + if(wait_cnt = 0)then + sm_state <= ST_FIND_BAD; + else + wait_cnt <= wait_cnt - 1; + end if; + + when ST_CALK_DLY => + sum_dly <= start_dly + end_dly; + sm_state <= ST_SET_DLY; + + when ST_SET_DLY => + curr_delay <= sum_dly(5 downto 1); + delay_set <= '1'; + wait_cnt <= C_CALIB_WAIT; + sm_state <= ST_SET_WAIT; + + when ST_SET_WAIT => + delay_set <= '0'; + if(wait_cnt = 0)then + sm_state <= ST_CHECK; + else + wait_cnt <= wait_cnt - 1; + end if; + end case; + end if; + end process; + delay_set_val <= STD_LOGIC_VECTOR(curr_delay); + + -- process(in_ref_clk) + -- begin + -- if(in_ref_clk = '1' and in_ref_clk'event)then + -- case sm_state is + -- when ST_CHECK => state_out <= x"0"; + -- when ST_FIND_GOOD => state_out <= x"2"; + -- when ST_GOOD_WAIT => state_out <= x"3"; + -- when ST_FIND_BAD => state_out <= x"4"; + -- when ST_BAD_WAIT => state_out <= x"5"; + -- when ST_CALK_DLY => state_out <= x"6"; + -- when ST_SET_DLY => state_out <= x"7"; + -- when ST_SET_WAIT => state_out <= x"8"; + -- end case; + -- end if; + -- end process; + +end generate; + +no_dly_gen: if C_USE_DELAY = FALSE generate +begin + clk_dg <= clk_g; +end generate; + +BUFMRCE_inst : BUFMRCE +generic map ( + CE_TYPE => "ASYNC", -- SYNC, ASYNC + INIT_OUT => 0 -- Initial output and stopped polarity, (0-1) +) +port map ( + O => clk_bufmr, -- 1-bit output: Clock output (connect to BUFIOs/BUFRs) + CE => '1', -- 1-bit input: Active high buffer enable + I => clk_dg -- 1-bit input: Clock input (Connect to IBUF) +); + +BUFIO_inst : BUFIO +port map ( + O => clk_bufio, -- 1-bit output: Clock output (connect to I/O clock loads). + I => clk_bufmr -- 1-bit input: Clock input (connect to an IBUF or BUFMR). +); +out_dclk <= clk_bufio; + +rst_bufmr <= '0'; +BUFR_inst : BUFR +generic map ( + BUFR_DIVIDE => "4", -- Values: "BYPASS, 1, 2, 3, 4, 5, 6, 7, 8" + SIM_DEVICE => "7SERIES" -- Must be set to "7SERIES" +) +port map ( + O => clk_bufr, -- 1-bit output: Clock output port + CE => '1', -- 1-bit input: Active high, clock enable (Divided modes only) + CLR => rst_bufmr, -- 1-bit input: Active high, asynchronous clear (Divided modes only) + I => clk_bufmr -- 1-bit input: Clock buffer input driven by an IBUF, MMCM or local interconnect +); +out_pclk <= clk_bufr; + +usr_BUFG_inst : BUFG +port map ( + O => out_uclk, -- 1-bit output: Clock output + I => clk_bufr -- 1-bit input: Clock input +); +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/xgui/csi2_d_phy_rx_v1_0.tcl b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/xgui/csi2_d_phy_rx_v1_0.tcl new file mode 100644 index 0000000..ad3c5bd --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi2_d_phy_rx_1.0/xgui/csi2_d_phy_rx_v1_0.tcl @@ -0,0 +1,198 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_NUM_LANES" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_NUM_LP_LANES" -parent ${Page_0} -widget comboBox + #Adding Group + set Camera_Interface [ipgui::add_group $IPINST -name "Camera Interface" -parent ${Page_0}] + ipgui::add_param $IPINST -name "C_DIFF_TERM" -parent ${Camera_Interface} + ipgui::add_param $IPINST -name "C_D0_SWAP" -parent ${Camera_Interface} + ipgui::add_param $IPINST -name "C_D1_SWAP" -parent ${Camera_Interface} + ipgui::add_param $IPINST -name "C_D2_SWAP" -parent ${Camera_Interface} + set C_D3_SWAP [ipgui::add_param $IPINST -name "C_D3_SWAP" -parent ${Camera_Interface}] + set_property tooltip {D3 P/N Swap} ${C_D3_SWAP} + + #Adding Group + set Clocking_System [ipgui::add_group $IPINST -name "Clocking System" -parent ${Page_0}] + ipgui::add_param $IPINST -name "C_USE_DELAY" -parent ${Clocking_System} + set C_IODELAY_GROUP [ipgui::add_param $IPINST -name "C_IODELAY_GROUP" -parent ${Clocking_System}] + set_property tooltip {Iodelay Group} ${C_IODELAY_GROUP} + ipgui::add_param $IPINST -name "C_ADD_IDELAYCTRL" -parent ${Clocking_System} + ipgui::add_param $IPINST -name "C_CALIB_WAIT" -parent ${Clocking_System} + ipgui::add_param $IPINST -name "C_RATE_LIMIT" -parent ${Clocking_System} + + + +} + +proc update_PARAM_VALUE.C_ADD_IDELAYCTRL { PARAM_VALUE.C_ADD_IDELAYCTRL } { + # Procedure called to update C_ADD_IDELAYCTRL when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_ADD_IDELAYCTRL { PARAM_VALUE.C_ADD_IDELAYCTRL } { + # Procedure called to validate C_ADD_IDELAYCTRL + return true +} + +proc update_PARAM_VALUE.C_CALIB_WAIT { PARAM_VALUE.C_CALIB_WAIT } { + # Procedure called to update C_CALIB_WAIT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_CALIB_WAIT { PARAM_VALUE.C_CALIB_WAIT } { + # Procedure called to validate C_CALIB_WAIT + return true +} + +proc update_PARAM_VALUE.C_D0_SWAP { PARAM_VALUE.C_D0_SWAP } { + # Procedure called to update C_D0_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D0_SWAP { PARAM_VALUE.C_D0_SWAP } { + # Procedure called to validate C_D0_SWAP + return true +} + +proc update_PARAM_VALUE.C_D1_SWAP { PARAM_VALUE.C_D1_SWAP } { + # Procedure called to update C_D1_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D1_SWAP { PARAM_VALUE.C_D1_SWAP } { + # Procedure called to validate C_D1_SWAP + return true +} + +proc update_PARAM_VALUE.C_D2_SWAP { PARAM_VALUE.C_D2_SWAP } { + # Procedure called to update C_D2_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D2_SWAP { PARAM_VALUE.C_D2_SWAP } { + # Procedure called to validate C_D2_SWAP + return true +} + +proc update_PARAM_VALUE.C_D3_SWAP { PARAM_VALUE.C_D3_SWAP } { + # Procedure called to update C_D3_SWAP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_D3_SWAP { PARAM_VALUE.C_D3_SWAP } { + # Procedure called to validate C_D3_SWAP + return true +} + +proc update_PARAM_VALUE.C_DIFF_TERM { PARAM_VALUE.C_DIFF_TERM } { + # Procedure called to update C_DIFF_TERM when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_DIFF_TERM { PARAM_VALUE.C_DIFF_TERM } { + # Procedure called to validate C_DIFF_TERM + return true +} + +proc update_PARAM_VALUE.C_IODELAY_GROUP { PARAM_VALUE.C_IODELAY_GROUP } { + # Procedure called to update C_IODELAY_GROUP when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_IODELAY_GROUP { PARAM_VALUE.C_IODELAY_GROUP } { + # Procedure called to validate C_IODELAY_GROUP + return true +} + +proc update_PARAM_VALUE.C_NUM_LANES { PARAM_VALUE.C_NUM_LANES } { + # Procedure called to update C_NUM_LANES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_NUM_LANES { PARAM_VALUE.C_NUM_LANES } { + # Procedure called to validate C_NUM_LANES + return true +} + +proc update_PARAM_VALUE.C_NUM_LP_LANES { PARAM_VALUE.C_NUM_LP_LANES } { + # Procedure called to update C_NUM_LP_LANES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_NUM_LP_LANES { PARAM_VALUE.C_NUM_LP_LANES } { + # Procedure called to validate C_NUM_LP_LANES + return true +} + +proc update_PARAM_VALUE.C_RATE_LIMIT { PARAM_VALUE.C_RATE_LIMIT } { + # Procedure called to update C_RATE_LIMIT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_RATE_LIMIT { PARAM_VALUE.C_RATE_LIMIT } { + # Procedure called to validate C_RATE_LIMIT + return true +} + +proc update_PARAM_VALUE.C_USE_DELAY { PARAM_VALUE.C_USE_DELAY } { + # Procedure called to update C_USE_DELAY when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_USE_DELAY { PARAM_VALUE.C_USE_DELAY } { + # Procedure called to validate C_USE_DELAY + return true +} + + +proc update_MODELPARAM_VALUE.C_NUM_LANES { MODELPARAM_VALUE.C_NUM_LANES PARAM_VALUE.C_NUM_LANES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_NUM_LANES}] ${MODELPARAM_VALUE.C_NUM_LANES} +} + +proc update_MODELPARAM_VALUE.C_NUM_LP_LANES { MODELPARAM_VALUE.C_NUM_LP_LANES PARAM_VALUE.C_NUM_LP_LANES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_NUM_LP_LANES}] ${MODELPARAM_VALUE.C_NUM_LP_LANES} +} + +proc update_MODELPARAM_VALUE.C_D0_SWAP { MODELPARAM_VALUE.C_D0_SWAP PARAM_VALUE.C_D0_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D0_SWAP}] ${MODELPARAM_VALUE.C_D0_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D1_SWAP { MODELPARAM_VALUE.C_D1_SWAP PARAM_VALUE.C_D1_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D1_SWAP}] ${MODELPARAM_VALUE.C_D1_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D2_SWAP { MODELPARAM_VALUE.C_D2_SWAP PARAM_VALUE.C_D2_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D2_SWAP}] ${MODELPARAM_VALUE.C_D2_SWAP} +} + +proc update_MODELPARAM_VALUE.C_D3_SWAP { MODELPARAM_VALUE.C_D3_SWAP PARAM_VALUE.C_D3_SWAP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_D3_SWAP}] ${MODELPARAM_VALUE.C_D3_SWAP} +} + +proc update_MODELPARAM_VALUE.C_DIFF_TERM { MODELPARAM_VALUE.C_DIFF_TERM PARAM_VALUE.C_DIFF_TERM } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_DIFF_TERM}] ${MODELPARAM_VALUE.C_DIFF_TERM} +} + +proc update_MODELPARAM_VALUE.C_ADD_IDELAYCTRL { MODELPARAM_VALUE.C_ADD_IDELAYCTRL PARAM_VALUE.C_ADD_IDELAYCTRL } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_ADD_IDELAYCTRL}] ${MODELPARAM_VALUE.C_ADD_IDELAYCTRL} +} + +proc update_MODELPARAM_VALUE.C_IODELAY_GROUP { MODELPARAM_VALUE.C_IODELAY_GROUP PARAM_VALUE.C_IODELAY_GROUP } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_IODELAY_GROUP}] ${MODELPARAM_VALUE.C_IODELAY_GROUP} +} + +proc update_MODELPARAM_VALUE.C_USE_DELAY { MODELPARAM_VALUE.C_USE_DELAY PARAM_VALUE.C_USE_DELAY } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_USE_DELAY}] ${MODELPARAM_VALUE.C_USE_DELAY} +} + +proc update_MODELPARAM_VALUE.C_CALIB_WAIT { MODELPARAM_VALUE.C_CALIB_WAIT PARAM_VALUE.C_CALIB_WAIT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_CALIB_WAIT}] ${MODELPARAM_VALUE.C_CALIB_WAIT} +} + +proc update_MODELPARAM_VALUE.C_RATE_LIMIT { MODELPARAM_VALUE.C_RATE_LIMIT PARAM_VALUE.C_RATE_LIMIT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_RATE_LIMIT}] ${MODELPARAM_VALUE.C_RATE_LIMIT} +} + diff --git a/zynqberrydemo3/ip_lib/csi_to_axis_1.0/bd/bd.tcl b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/bd/bd.tcl new file mode 100644 index 0000000..690e4e1 --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/bd/bd.tcl @@ -0,0 +1,86 @@ + +proc init { cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + set full_sbusif_list [list ] + + foreach busif $all_busif { + if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } { + set busif_param_list [list] + set busif_name [get_property NAME $busif] + if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } { + continue + } + foreach tparam $axi_standard_param_list { + lappend busif_param_list "C_${busif_name}_${tparam}" + } + bd::mark_propagate_only $cell_handle $busif_param_list + } + } +} + + +proc pre_propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + if { $val_on_cell != "" } { + set_property CONFIG.${tparam} $val_on_cell $busif + } + } + } + } +} + + +proc propagate {cellpath otherInfo } { + + set cell_handle [get_bd_cells $cellpath] + set all_busif [get_bd_intf_pins $cellpath/*] + set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH] + + foreach busif $all_busif { + if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } { + continue + } + if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } { + continue + } + + set busif_name [get_property NAME $busif] + foreach tparam $axi_standard_param_list { + set busif_param_name "C_${busif_name}_${tparam}" + + set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif] + set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle] + + if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } { + #override property of bd_interface_net to bd_cell -- only for slaves. May check for supported values.. + if { $val_on_cell_intf_pin != "" } { + set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle + } + } + } + } +} + diff --git a/zynqberrydemo3/ip_lib/csi_to_axis_1.0/component.xml b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/component.xml new file mode 100644 index 0000000..f123cdd --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/component.xml @@ -0,0 +1,1180 @@ + + + trenz.biz + user + csi_to_axis + 1.0 + + + M_AXIS + + + + + + + TDATA + + + m_axis_tdata + + + + + TLAST + + + m_axis_tlast + + + + + TUSER + + + m_axis_tuser + + + + + TVALID + + + m_axis_tvalid + + + + + TREADY + + + m_axis_tready + + + + + + WIZ_DATA_WIDTH + 32 + + + + + RX_MIPI_PPI + RX_MIPI_PPI + RX_MIPI_PPI + + + + + + + DL1_RXACTIVEHS + + + dl1_rxactivehs + + + + + DL0_RXSYNCHS + + + dl0_rxsynchs + + + + + DL1_RXVALIDHS + + + dl1_rxvalidhs + + + + + CL_ENABLE + + + cl_enable + + + + + DL1_RXDATAHS + + + dl1_datahs + + + + + DL0_RXACTIVEHS + + + dl0_rxactivehs + + + + + CL_STOPSTATE + + + cl_stopstate + + + + + DL1_RXSYNCHS + + + dl1_rxsynchs + + + + + DL0_ENABLE + + + dl0_enable + + + + + DL0_RXDATAHS + + + dl0_datahs + + + + + DL1_ENABLE + + + dl1_enable + + + + + DL0_RXVALIDHS + + + dl0_rxvalidhs + + + + + CL_RXCLKACTIVEHS + + + cl_rxclkactivehs + + + + + DL2_RXSYNCHS + + + dl2_rxsynchs + + + + + DL3_RXACTIVEHS + + + dl3_rxactivehs + + + + + DL3_RXDATAHS + + + dl3_datahs + + + + + DL2_RXDATAHS + + + dl2_datahs + + + + + DL3_RXSYNCHS + + + dl3_rxsynchs + + + + + DL3_RXVALIDHS + + + dl3_rxvalidhs + + + + + DL3_ENABLE + + + dl3_enable + + + + + DL2_RXVALIDHS + + + dl2_rxvalidhs + + + + + DL2_RXACTIVEHS + + + dl2_rxactivehs + + + + + DL2_ENABLE + + + dl2_enable + + + + + + m_axis_aresetn + + + + + + + RST + + + m_axis_aresetn + + + + + + POLARITY + ACTIVE_LOW + + + + + m_axis_aclk + + + + + + + CLK + + + m_axis_aclk + + + + + + ASSOCIATED_BUSIF + M_AXIS + + + ASSOCIATED_RESET + m_axis_aresetn + + + + + data_err + + + + + + + ACK + + + trig_ack + + + + + TRIG + + + trig_req + + + + + + + + + xilinx_vhdlsynthesis + VHDL Synthesis + vhdlSource:vivado.xilinx.com:synthesis + vhdl + csi_to_axis_v1_0 + + xilinx_vhdlsynthesis_view_fileset + + + + viewChecksum + 86b17c2f + + + + + xilinx_vhdlbehavioralsimulation + VHDL Simulation + vhdlSource:vivado.xilinx.com:simulation + vhdl + csi_to_axis_v1_0 + + xilinx_vhdlbehavioralsimulation_view_fileset + + + + viewChecksum + c5d94c0e + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 3bb3a441 + + + + + bd_tcl + Block Diagram + :vivado.xilinx.com:block.diagram + + bd_tcl_view_fileset + + + + viewChecksum + 16328387 + + + + + + + enable_in + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + rxbyteclkhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + cl_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0x1 + + + + + cl_stopstate + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + cl_rxclkactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl0_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0x1 + + + + + dl0_rxactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl0_rxvalidhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl0_rxsynchs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl0_datahs + + in + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + dl1_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0x1 + + + + + + true + + + + + + dl1_rxactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + true + + + + + + dl1_rxvalidhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + true + + + + + + dl1_rxsynchs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + true + + + + + + dl1_datahs + + in + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + true + + + + + + dl2_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + false + + + + + + dl2_rxactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + dl2_rxvalidhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + dl2_rxsynchs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + dl2_datahs + + in + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + dl3_enable + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + false + + + + + + dl3_rxactivehs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + dl3_rxvalidhs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + + false + + + + + + dl3_rxsynchs + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + dl3_datahs + + in + + 7 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 0 + + + + + + false + + + + + + trig_req + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + trig_ack + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + m_axis_tdata + + out + + 15 + 0 + + + + STD_LOGIC_VECTOR + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tuser + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tlast + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tvalid + + out + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_tready + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + 1 + + + + + m_axis_aclk + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + m_axis_aresetn + + in + + + STD_LOGIC + xilinx_vhdlsynthesis + xilinx_vhdlbehavioralsimulation + + + + + + + + C_M_AXIS_TDATA_WIDTH + C M AXIS TDATA WIDTH + Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH. + 32 + + + C_LANES + C Lanes + 2 + + + C_TIMEOUT + C Timeout + 127 + + + + + + choice_list_6fc15197 + 32 + + + choice_list_9d8b0d81 + ACTIVE_HIGH + ACTIVE_LOW + + + choice_list_e6469819 + 1 + 2 + 4 + + + + + xilinx_vhdlsynthesis_view_fileset + + hdl/csi_to_axis.xdc + xdc + USED_IN_implementation + USED_IN_synthesis + + + hdl/csi2_parser.vhd + vhdlSource + + + hdl/lane_align.vhd + vhdlSource + + + hdl/lane_merge.vhd + vhdlSource + + + hdl/csi_to_axis_v1_0.vhd + vhdlSource + CHECKSUM_9c64e067 + + + + xilinx_vhdlbehavioralsimulation_view_fileset + + hdl/csi2_parser.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/lane_align.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/lane_merge.vhd + vhdlSource + USED_IN_ipstatic + + + hdl/csi_to_axis_v1_0.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/csi_to_axis_v1_0.tcl + tclSource + CHECKSUM_67ac9fac + XGUI_VERSION_2 + + + + bd_tcl_view_fileset + + bd/bd.tcl + tclSource + + + + CSI-2 to AXI4-Stream + + + C_M_AXIS_TDATA_WIDTH + C M AXIS TDATA WIDTH + Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH. + 32 + + + + false + + + + + + Component_Name + csi_to_axis_v1_0 + + + C_LANES + Data Lanes + 2 + + + C_TIMEOUT + Line Align Timeout + 127 + + + + + + virtex7 + artix7 + kintex7 + zynq + qzynq + + + /AXI_Peripheral + /Video_&_Image_Processing + + CSI-2 to AXI4-Stream v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 46 + + xilinx.com:user:csi_to_axis:1.0 + + 2017-05-17T10:14:06Z + + b:/cores/2015.4/design/te0726/demo/ip_lib/csi_to_axis_1.0 + b:/cores/2016.4/design/TE0726/te0726_m_demo1/ip_lib/csi_to_axis_1.0 + + + + 2016.4 + + + + + + + + diff --git a/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi2_parser.vhd b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi2_parser.vhd new file mode 100644 index 0000000..6b76fdb --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi2_parser.vhd @@ -0,0 +1,147 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity csi2_parser is +generic( + C_LANES : INTEGER range 1 to 4 := 2 +); +port ( + enable_in : in STD_LOGIC; + resync_out : out STD_LOGIC; + axis_aclk : in STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + s_axis_tvalid : in STD_LOGIC; + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + + frame_start_dbg : out STD_LOGIC; + line_start_dbg : out STD_LOGIC; + packet_id_dbg : out STD_LOGIC_VECTOR(7 downto 0); + packet_id_upd : out STD_LOGIC; + packet_size_dbg : out STD_LOGIC_VECTOR(15 downto 0); + transfer_cnt_dbg : out STD_LOGIC_VECTOR(15 downto 0) +); +end csi2_parser; +---------------------------------------------------------------------------------- +architecture arch_imp of csi2_parser is +---------------------------------------------------------------------------------- +constant C_SOT : STD_LOGIC_VECTOR(7 downto 0) := x"B8"; +constant C_RAW10 : STD_LOGIC_VECTOR(7 downto 0) := x"2B"; +constant C_EOF : STD_LOGIC_VECTOR(7 downto 0) := x"01"; +constant C_WAIT : INTEGER := 15; +---------------------------------------------------------------------------------- +type sm_state_type is (ST_IDLE, ST_HDRA, ST_HDRB, ST_TRANSFER, ST_RESYNC); +signal sm_state : sm_state_type := ST_IDLE; +---------------------------------------------------------------------------------- +signal packet_size : STD_LOGIC_VECTOR(15 downto 0); +signal packet_cs : STD_LOGIC_VECTOR( 7 downto 0); +signal packet_id : STD_LOGIC_VECTOR( 7 downto 0); +signal transfer_cnt : UNSIGNED(15 downto 0); +signal start_of_frame : STD_LOGIC; +signal start_of_line : STD_LOGIC; +signal enable_req : STD_LOGIC; +signal enable : STD_LOGIC; +signal wait_cnt : INTEGER range 0 to C_WAIT-1 := 0; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process(axis_aclk) +begin + if(axis_aclk = '1' and axis_aclk'event)then + m_axis_tdata <= s_axis_tdata; + enable_req <= enable_in; + case sm_state is + when ST_IDLE => + m_axis_tvalid <= '0'; + m_axis_tlast <= '0'; + packet_id_upd <= '0'; + if(s_axis_tvalid = '1')then + if((s_axis_tdata(7 downto 0) = C_SOT) and (s_axis_tdata(15 downto 8) = C_SOT))then + sm_state <= ST_HDRA; + else + sm_state <= ST_RESYNC; + end if; + end if; + when ST_RESYNC => + m_axis_tvalid <= '0'; + m_axis_tlast <= '0'; + if(s_axis_tvalid = '0')then + sm_state <= ST_IDLE; + end if; + when ST_HDRA => + if(s_axis_tvalid = '1')then + packet_size( 7 downto 0) <= s_axis_tdata(15 downto 8); + packet_id <= s_axis_tdata( 7 downto 0); + if((s_axis_tdata( 7 downto 0) = C_RAW10) or (s_axis_tdata( 7 downto 0) = C_EOF))then -- Correct ID + sm_state <= ST_HDRB; + else + sm_state <= ST_RESYNC; + end if; + else + sm_state <= ST_RESYNC; + end if; + when ST_HDRB => + if(s_axis_tvalid = '1')then + packet_cs <= s_axis_tdata(15 downto 8); + packet_size(15 downto 8) <= s_axis_tdata( 7 downto 0); + if(packet_id = C_RAW10)then + sm_state <= ST_TRANSFER; + transfer_cnt <= (others => '0'); + start_of_line <= '1'; + else + sm_state <= ST_RESYNC; + packet_id_dbg <= packet_id; + packet_id_upd <= '1'; + end if; + if(packet_id = C_EOF)then + start_of_frame <= '1'; + enable <= enable_req; + end if; + else + sm_state <= ST_RESYNC; + end if; + when ST_TRANSFER => + if(s_axis_tvalid = '1')then + start_of_frame <= '0'; + start_of_line <= '0'; + m_axis_tuser <= start_of_frame; + m_axis_tvalid <= enable; + if(transfer_cnt >= (UNSIGNED(packet_size)-2))then + m_axis_tlast <= '1'; + sm_state <= ST_RESYNC; + else + transfer_cnt <= transfer_cnt + 2; + end if; + else + m_axis_tlast <= '1'; + sm_state <= ST_IDLE; + end if; + end case; + end if; +end process; + +frame_start_dbg <= start_of_frame; +line_start_dbg <= start_of_line; +packet_size_dbg <= packet_size; +transfer_cnt_dbg <= STD_LOGIC_VECTOR(transfer_cnt); + +process(sm_state) +begin + if( + ((sm_state = ST_IDLE) and (s_axis_tvalid = '1') and ((s_axis_tdata(7 downto 0) /= C_SOT) or (s_axis_tdata(15 downto 8) /= C_SOT))) or + ((sm_state = ST_HDRA) and not ((s_axis_tdata( 7 downto 0) = C_RAW10) or (s_axis_tdata( 7 downto 0) = C_EOF))) + )then + resync_out <= '1'; + else + resync_out <= '0'; + end if; +end process; +--------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis.xdc b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis.xdc new file mode 100644 index 0000000..d270ab4 --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis.xdc @@ -0,0 +1 @@ +set_false_path -to [get_pins parser_inst/enable_req_reg/D] \ No newline at end of file diff --git a/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd new file mode 100644 index 0000000..a475d76 --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/csi_to_axis_v1_0.vhd @@ -0,0 +1,272 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +library UNISIM; +use UNISIM.VComponents.all; +---------------------------------------------------------------------------------- +entity csi_to_axis_v1_0 is +generic ( + C_M_AXIS_TDATA_WIDTH : INTEGER := 32; + C_LANES : INTEGER range 1 to 4 := 2; + C_TIMEOUT : INTEGER := 127 +); +port ( + -- Transfer enable + enable_in : in STD_LOGIC; + -- MIPI PPI + rxbyteclkhs : in STD_LOGIC; + cl_enable : out STD_LOGIC := '1'; + cl_stopstate : in STD_LOGIC; + cl_rxclkactivehs : in STD_LOGIC; + dl0_enable : out STD_LOGIC := '1'; + dl0_rxactivehs : in STD_LOGIC; + dl0_rxvalidhs : in STD_LOGIC; + dl0_rxsynchs : in STD_LOGIC; + dl0_datahs : in STD_LOGIC_VECTOR(7 downto 0); + dl1_enable : out STD_LOGIC; + dl1_rxactivehs : in STD_LOGIC; + dl1_rxvalidhs : in STD_LOGIC; + dl1_rxsynchs : in STD_LOGIC; + dl1_datahs : in STD_LOGIC_VECTOR(7 downto 0); + dl2_enable : out STD_LOGIC; + dl2_rxactivehs : in STD_LOGIC; + dl2_rxvalidhs : in STD_LOGIC; + dl2_rxsynchs : in STD_LOGIC; + dl2_datahs : in STD_LOGIC_VECTOR(7 downto 0); + dl3_enable : out STD_LOGIC; + dl3_rxactivehs : in STD_LOGIC; + dl3_rxvalidhs : in STD_LOGIC; + dl3_rxsynchs : in STD_LOGIC; + dl3_datahs : in STD_LOGIC_VECTOR(7 downto 0); + -- Status + trig_req : out STD_LOGIC; + trig_ack : in STD_LOGIC; + -- AXIS + m_axis_aclk : in STD_LOGIC; + m_axis_aresetn : in STD_LOGIC; + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + m_axis_tready : in STD_LOGIC + -- -- Debug +-- raw_data_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- raw_valid_dbg : out STD_LOGIC_VECTOR( 1 downto 0); +-- align_data_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- align_valid_dbg : out STD_LOGIC_VECTOR( 1 downto 0); +-- merge_data_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- merge_valid_dbg : out STD_LOGIC; +-- frame_start_dbg : out STD_LOGIC; +-- line_start_dbg : out STD_LOGIC; +-- parse_data_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- parse_valid_dbg : out STD_LOGIC; +-- parse_user_dbg : out STD_LOGIC; +-- parse_last_dbg : out STD_LOGIC; +-- packet_id_dbg : out STD_LOGIC_VECTOR( 7 downto 0); +-- packet_id_upd_dbd : out STD_LOGIC; +-- packet_size_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- transfer_cnt_dbg : out STD_LOGIC_VECTOR(15 downto 0); +-- align_resync_dbg : out STD_LOGIC; +-- merge_resync_dbg : out STD_LOGIC +); +end csi_to_axis_v1_0; +---------------------------------------------------------------------------------- +architecture arch_imp of csi_to_axis_v1_0 is +---------------------------------------------------------------------------------- +component lane_align is +generic( + C_LANES : INTEGER range 1 to 4 := 2; + C_TIMEOUT : INTEGER := 127 +); +port ( + clk_in : in STD_LOGIC; + resync : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_in : in STD_LOGIC_VECTOR(C_LANES-1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_out : out STD_LOGIC_VECTOR(C_LANES-1 downto 0); + err_req : out STD_LOGIC; + err_ack : in STD_LOGIC +); +end component; + +component lane_merge is +generic( + C_LANES : INTEGER range 1 to 4 := 2 +); +port( + clk_in : in STD_LOGIC; + resync_in : in STD_LOGIC; + resync_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_in : in STD_LOGIC_VECTOR(C_LANES-1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_out : out STD_LOGIC +); +end component; + +component csi2_parser is +generic( + C_LANES : INTEGER range 1 to 4 := 2 +); +port ( + enable_in : in STD_LOGIC; + resync_out : out STD_LOGIC; + axis_aclk : in STD_LOGIC; + s_axis_tdata : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + s_axis_tvalid : in STD_LOGIC; + m_axis_tvalid : out STD_LOGIC; + m_axis_tdata : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + m_axis_tuser : out STD_LOGIC; + m_axis_tlast : out STD_LOGIC; + -- Debug + frame_start_dbg : out STD_LOGIC; + line_start_dbg : out STD_LOGIC; + packet_id_dbg : out STD_LOGIC_VECTOR(7 downto 0); + packet_id_upd : out STD_LOGIC; + packet_size_dbg : out STD_LOGIC_VECTOR(15 downto 0); + transfer_cnt_dbg : out STD_LOGIC_VECTOR(15 downto 0) +); +end component; +---------------------------------------------------------------------------------- +signal pclk : STD_LOGIC; +signal raw_data : STD_LOGIC_VECTOR(8*C_LANES-1 downto 0); +signal align_data : STD_LOGIC_VECTOR(8*C_LANES-1 downto 0); +signal merge_data : STD_LOGIC_VECTOR(8*C_LANES-1 downto 0); +signal raw_valid : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +signal align_valid : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +signal merge_valid : STD_LOGIC; +signal tuser_drv : STD_LOGIC; +signal tlast_drv : STD_LOGIC; +signal tvalid_drv : STD_LOGIC; +signal tdata_drv : STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); +signal frame_start : STD_LOGIC; +signal line_start : STD_LOGIC; +signal packet_id : STD_LOGIC_VECTOR(7 downto 0); +signal packet_id_upd : STD_LOGIC; +signal packet_size : STD_LOGIC_VECTOR(15 downto 0); +signal transfer_cnt : STD_LOGIC_VECTOR(15 downto 0); +signal align_resync : STD_LOGIC; +signal merge_resync : STD_LOGIC; +signal parse_resync : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +pclk <= rxbyteclkhs; -- Main byte clock bitrate/8 +cl_enable <= '1'; -- PPI ShutDown ? +---------------------------------------------------------------------------------- +-- Lane 0 +dl0_enable <= '1'; +raw_valid(0) <= dl0_rxvalidhs; +raw_data( 7 downto 0) <= dl0_datahs; +---------------------------------------------------------------------------------- +-- Lane 1 +lane_1_gen: if C_LANES > 1 generate +begin + dl1_enable <= '1'; + raw_valid(1) <= dl1_rxvalidhs; + raw_data(15 downto 8) <= dl1_datahs; +end generate; +---------------------------------------------------------------------------------- +-- Lane 2 +lane_2_gen: if C_LANES > 2 generate +begin + dl2_enable <= '1'; + raw_valid(2) <= dl2_rxvalidhs; + raw_data(23 downto 16) <= dl2_datahs; +end generate; +---------------------------------------------------------------------------------- +-- Lane 3 +lane_3_gen: if C_LANES > 3 generate +begin + dl3_enable <= '1'; + raw_valid(3) <= dl3_rxvalidhs; + raw_data(31 downto 24) <= dl3_datahs; +end generate; +---------------------------------------------------------------------------------- +lane_align_inst: lane_align +generic map( + C_LANES => C_LANES, + C_TIMEOUT => C_TIMEOUT +) +port map( + clk_in => pclk, + resync => align_resync, + data_in => raw_data, + valid_in => raw_valid, + data_out => align_data, + valid_out => align_valid, + err_req => trig_req, + err_ack => trig_ack +); +---------------------------------------------------------------------------------- +lane_merge_inst: lane_merge +generic map( + C_LANES => C_LANES +) +port map( + clk_in => pclk, + resync_in => parse_resync, + resync_out => merge_resync, + data_in => align_data, + valid_in => align_valid, + data_out => merge_data, + valid_out => merge_valid +); +---------------------------------------------------------------------------------- +align_resync <= merge_resync or parse_resync; +---------------------------------------------------------------------------------- +parser_inst: csi2_parser +generic map( + C_LANES => C_LANES +) +port map( + enable_in => enable_in, + resync_out => parse_resync, + axis_aclk => pclk, + s_axis_tdata => merge_data, + s_axis_tvalid => merge_valid, + m_axis_tvalid => tvalid_drv, + m_axis_tdata => tdata_drv, + m_axis_tuser => tuser_drv, + m_axis_tlast => tlast_drv, + + frame_start_dbg => frame_start, + line_start_dbg => line_start, + packet_id_dbg => packet_id, + packet_id_upd => packet_id_upd, + packet_size_dbg => packet_size, + transfer_cnt_dbg => transfer_cnt +); +---------------------------------------------------------------------------------- +m_axis_tvalid <= tvalid_drv; +m_axis_tdata <= tdata_drv; +m_axis_tuser <= tuser_drv; +m_axis_tlast <= tlast_drv; +---------------------------------------------------------------------------------- +-- Debug +---------------------------------------------------------------------------------- +--raw_data_dbg <= raw_data; +--raw_valid_dbg <= raw_valid; +--align_data_dbg <= align_data; +--align_valid_dbg <= align_valid; +--merge_data_dbg <= merge_data; +--merge_valid_dbg <= merge_valid; +--frame_start_dbg <= frame_start; +--line_start_dbg <= line_start; +--parse_data_dbg <= tdata_drv; +--parse_valid_dbg <= tvalid_drv; +--parse_user_dbg <= tuser_drv; +--parse_last_dbg <= tlast_drv; +--packet_id_dbg <= packet_id; +--packet_id_upd_dbd <= packet_id_upd; +--packet_size_dbg <= packet_size; +--transfer_cnt_dbg <= transfer_cnt; +--align_resync_dbg <= align_resync; +--merge_resync_dbg <= merge_resync; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd new file mode 100644 index 0000000..40ddf67 --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/lane_align.vhd @@ -0,0 +1,123 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity lane_align is +generic( + C_LANES : INTEGER range 1 to 4 := 2; + C_TIMEOUT : INTEGER := 127 +); +port ( + clk_in : in STD_LOGIC; + resync : in STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_in : in STD_LOGIC_VECTOR(C_LANES-1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_out : out STD_LOGIC_VECTOR(C_LANES-1 downto 0); + err_req : out STD_LOGIC; + err_ack : in STD_LOGIC +); +end lane_align; +---------------------------------------------------------------------------------- +architecture arch_imp of lane_align is +---------------------------------------------------------------------------------- +constant C_SOT : STD_LOGIC_VECTOR(15 downto 0) := x"B800"; +constant ones_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0) := (others => '1'); +constant zero_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0) := (others => '0'); +constant C_CNT_LIMIT : integer := 1; +---------------------------------------------------------------------------------- +type sr_data_type is array (0 to C_LANES-1) of STD_LOGIC_VECTOR(23 downto 0); +signal data_sr : sr_data_type; +type buf_data_type is array (0 to C_LANES-1) of STD_LOGIC_VECTOR(15 downto 0); +signal data_dly : buf_data_type; +signal sot_found : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +type shift_type is array (0 to C_LANES-1) of integer range 0 to 8; +signal data_shift_det : shift_type; +signal data_shift : shift_type; +signal transfer : STD_LOGIC_VECTOR(C_LANES-1 downto 0); + +type to_cnt_type is array (0 to C_LANES-1) of integer range 0 to C_TIMEOUT; +signal to_cnt : to_cnt_type; +signal to_flag : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +---------------------------------------------------------------------------------- +signal err_ack_i : STD_LOGIC; +attribute ASYNC_REG : string; +attribute ASYNC_REG of err_ack_i : signal is "true"; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process(data_sr) +begin + sot_found <= (others => '0'); + data_shift_det <= (others => 0); + for j in 0 to C_LANES-1 loop + for i in 0 to 8 loop + if(data_sr(j)(i+15 downto i) = C_SOT)then + sot_found(j) <= '1'; + data_shift_det(j) <= i; + end if; + end loop; + end loop; +end process; + +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + --err_ack_i <= err_ack; + err_req <= '0'; + for i in 0 to C_LANES-1 loop + + if(valid_in(i) = '1')then + data_sr(i) <= data_in(i*8+7 downto i*8) & data_sr(i)(23 downto 8); + end if; + data_dly(i) <= data_sr(i)(23 downto 8); + + if(transfer(i) = '0')then + if((valid_in(i) = '1') and (sot_found(i) = '1'))then + data_shift <= data_shift_det; + transfer(i) <= '1'; + end if; + if(valid_in(i) = '1')then + if(sot_found(i) = '1')then + to_flag(i) <= '0'; + to_cnt(i) <= 0; + else + if(to_cnt(i) /= C_TIMEOUT)then + to_cnt(i) <= to_cnt(i) + 1; + else + to_flag(i) <= '1'; + end if; + end if; + end if; + else + if((valid_in(i) = '0') or (resync = '1'))then + transfer(i) <= '0'; + to_cnt(i) <= 0; + end if; + end if; + + -- if(to_cnt(i) = C_TIMEOUT-1)then + -- err_req <= '1'; + -- elsif(err_ack_i)then + -- err_req <= '0'; + -- end if; + end loop; + if(UNSIGNED(to_flag) /= TO_UNSIGNED(0,C_LANES))then + err_req <= '1'; + else + err_req <= '0'; + end if; + end if; +end process; + +out_gen: for i in 0 to C_LANES-1 generate +begin + data_out(i*8+7 downto i*8) <= data_dly(i)(data_shift(i)+7 downto data_shift(i)); + valid_out(i) <= transfer(i); +end generate; +--------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd new file mode 100644 index 0000000..6906471 --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/hdl/lane_merge.vhd @@ -0,0 +1,118 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity lane_merge is +generic( + C_LANES : INTEGER range 1 to 4 := 2 +); +port ( + clk_in : in STD_LOGIC; + resync_in : in STD_LOGIC; + resync_out : out STD_LOGIC; + data_in : in STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_in : in STD_LOGIC_VECTOR(C_LANES-1 downto 0); + data_out : out STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); + valid_out : out STD_LOGIC +); +end lane_merge; +---------------------------------------------------------------------------------- +architecture arch_imp of lane_merge is +---------------------------------------------------------------------------------- +constant C_SOT : STD_LOGIC_VECTOR(7 downto 0) := x"B8"; +constant ones_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0) := (others => '1'); +constant zero_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0) := (others => '0'); +---------------------------------------------------------------------------------- +type sm_state_type is (ST_IDLE, ST_FIRST, ST_TRANSFER, ST_RESYNC); +signal sm_state : sm_state_type := ST_IDLE; +---------------------------------------------------------------------------------- +signal data_dl : STD_LOGIC_VECTOR(C_LANES*8-1 downto 0); +signal valid_dl : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +signal align_vec : STD_LOGIC_VECTOR(C_LANES-1 downto 0); +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + data_dl <= data_in; + valid_dl <= valid_in; + case sm_state is + when ST_IDLE => + if(valid_in /= zero_vec)then + align_vec <= valid_in; + sm_state <= ST_FIRST; + -- valid_out <= '1'; + -- else + -- valid_out <= '0'; + end if; + when ST_FIRST => + if((valid_in /= ones_vec) or (resync_in = '1'))then + align_vec <= (others => '0'); + sm_state <= ST_RESYNC; + resync_out <= '1'; + else + sm_state <= ST_TRANSFER; + valid_out <= '1'; + for i in 0 to C_LANES-1 loop + if(data_in(i*8+7 downto i*8) = C_SOT)then + align_vec(i) <= '0'; -- Not delayed + else + align_vec(i) <= '1'; -- Delayed + end if; + end loop; + end if; + + when ST_TRANSFER => + -- if((valid_in /= ones_vec) or (resync_in = '1'))then + -- align_vec <= (others => '0'); + -- sm_state <= ST_RESYNC; + -- resync_out <= '1'; + -- valid_out <= '0'; + -- end if; + if(valid_in /= ones_vec)then + align_vec <= (others => '0'); + sm_state <= ST_IDLE; + valid_out <= '0'; + elsif(resync_in = '1')then + align_vec <= (others => '0'); + sm_state <= ST_RESYNC; + resync_out <= '1'; + valid_out <= '0'; + end if; + when ST_RESYNC => + resync_out <= '0'; + if(valid_in = zero_vec)then + sm_state <= ST_IDLE; + end if; + end case; + + --valid_out <= '0'; + --valid_out <= '1'; + for i in 0 to C_LANES-1 loop + --if(valid_dl(i) = '1')then + -- valid_out <= '1'; + --end if; + -- if(align_vec(i) = '1')then + -- if(valid_dl(i) = '0')then + -- valid_out <= '0'; + -- end if; + -- else + -- if(valid_in(i) = '0')then + -- valid_out <= '0'; + -- end if; + -- end if; + if(align_vec(i) = '1')then + data_out(i*8+7 downto i*8) <= data_dl(i*8+7 downto i*8); + else + data_out(i*8+7 downto i*8) <= data_in(i*8+7 downto i*8); + end if; + end loop; + end if; +end process; +--------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl new file mode 100644 index 0000000..bea5392 --- /dev/null +++ b/zynqberrydemo3/ip_lib/csi_to_axis_1.0/xgui/csi_to_axis_v1_0.tcl @@ -0,0 +1,56 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + set C_M_AXIS_TDATA_WIDTH [ipgui::add_param $IPINST -name "C_M_AXIS_TDATA_WIDTH" -parent ${Page_0} -widget comboBox] + set_property tooltip {Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH.} ${C_M_AXIS_TDATA_WIDTH} + ipgui::add_param $IPINST -name "C_LANES" -parent ${Page_0} -widget comboBox + ipgui::add_param $IPINST -name "C_TIMEOUT" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_LANES { PARAM_VALUE.C_LANES } { + # Procedure called to update C_LANES when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_LANES { PARAM_VALUE.C_LANES } { + # Procedure called to validate C_LANES + return true +} + +proc update_PARAM_VALUE.C_TIMEOUT { PARAM_VALUE.C_TIMEOUT } { + # Procedure called to update C_TIMEOUT when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_TIMEOUT { PARAM_VALUE.C_TIMEOUT } { + # Procedure called to validate C_TIMEOUT + return true +} + +proc update_PARAM_VALUE.C_M_AXIS_TDATA_WIDTH { PARAM_VALUE.C_M_AXIS_TDATA_WIDTH } { + # Procedure called to update C_M_AXIS_TDATA_WIDTH when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_M_AXIS_TDATA_WIDTH { PARAM_VALUE.C_M_AXIS_TDATA_WIDTH } { + # Procedure called to validate C_M_AXIS_TDATA_WIDTH + return true +} + + +proc update_MODELPARAM_VALUE.C_M_AXIS_TDATA_WIDTH { MODELPARAM_VALUE.C_M_AXIS_TDATA_WIDTH PARAM_VALUE.C_M_AXIS_TDATA_WIDTH } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_M_AXIS_TDATA_WIDTH}] ${MODELPARAM_VALUE.C_M_AXIS_TDATA_WIDTH} +} + +proc update_MODELPARAM_VALUE.C_LANES { MODELPARAM_VALUE.C_LANES PARAM_VALUE.C_LANES } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_LANES}] ${MODELPARAM_VALUE.C_LANES} +} + +proc update_MODELPARAM_VALUE.C_TIMEOUT { MODELPARAM_VALUE.C_TIMEOUT PARAM_VALUE.C_TIMEOUT } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_TIMEOUT}] ${MODELPARAM_VALUE.C_TIMEOUT} +} + diff --git a/zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/component.xml b/zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/component.xml new file mode 100644 index 0000000..8e19f3e --- /dev/null +++ b/zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/component.xml @@ -0,0 +1,228 @@ + + + trenz.biz + user + i2s_to_pwm + 1.0 + + + + xilinx_anylanguagesynthesis + Synthesis + :vivado.xilinx.com:synthesis + VHDL + i2s_to_pwm + + xilinx_anylanguagesynthesis_view_fileset + + + + viewChecksum + 560fdf3f + + + + + xilinx_anylanguagebehavioralsimulation + Simulation + :vivado.xilinx.com:simulation + VHDL + i2s_to_pwm + + xilinx_anylanguagebehavioralsimulation_view_fileset + + + + viewChecksum + 560fdf3f + + + + + xilinx_xpgui + UI Layout + :vivado.xilinx.com:xgui.ui + + xilinx_xpgui_view_fileset + + + + viewChecksum + 85d97987 + + + + + + + clk_in + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_bclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_lrclk + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + i2s_sdata + + in + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + pwm_l_out + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + pwm_r_out + + out + + + STD_LOGIC + xilinx_anylanguagesynthesis + xilinx_anylanguagebehavioralsimulation + + + + + + + + C_SYS_FREQ + C Sys Freq + 150000000 + + + C_PWM_FREQ + C Pwm Freq + 100000 + + + + + + xilinx_anylanguagesynthesis_view_fileset + + hdl/i2s_to_pwm.vhd + vhdlSource + CHECKSUM_560fdf3f + + + + xilinx_anylanguagebehavioralsimulation_view_fileset + + hdl/i2s_to_pwm.vhd + vhdlSource + USED_IN_ipstatic + + + + xilinx_xpgui_view_fileset + + xgui/i2s_to_pwm_v1_0.tcl + tclSource + CHECKSUM_8d217f22 + XGUI_VERSION_2 + + + + I2S to PWM v1.0 + + + C_SYS_FREQ + Clock Frequency + 150000000 + + + C_PWM_FREQ + PWM Frequency + 100000 + + + Component_Name + i2s_to_pwm_v1_0 + + + + + + virtex7 + artix7 + kintex7 + zynq + + + /Communication_&_Networking/Serial_Interfaces + /Digital_Signal_Processing/Modulation + /UserIP + + I2S to PWM v1.0 + Trenz Electronic GmbH + http://www.trenz.biz + 7 + + xilinx.com:user:i2s_to_pwm:1.0 + + 2016-04-04T15:47:26Z + + + b:/cores/2015.4/design/te0726/demo/ip_lib/i2s_to_pwm_1.0 + b:/cores/2015.4/design/te0726/demo/ip_lib/i2s_to_pwm_1.0 + + + + 2015.4.2 + + + + + + + diff --git a/zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd b/zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd new file mode 100644 index 0000000..1e989ba --- /dev/null +++ b/zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/hdl/i2s_to_pwm.vhd @@ -0,0 +1,133 @@ +---------------------------------------------------------------------------------- +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko +---------------------------------------------------------------------------------- +library ieee; +use ieee.STD_LOGIC_1164.all; +use ieee.numeric_std.all; +---------------------------------------------------------------------------------- +entity i2s_to_pwm is +generic ( + C_SYS_FREQ : INTEGER := 150000000; + C_PWM_FREQ : INTEGER := 100000 -- Usually from 50 to 100 kHz +); +port ( + -- General + clk_in : in STD_LOGIC; + -- I2S Signals + i2s_bclk : in STD_LOGIC; + i2s_lrclk : in STD_LOGIC; + i2s_sdata : in STD_LOGIC; + -- PWM Outs + pwm_l_out : out STD_LOGIC; + pwm_r_out : out STD_LOGIC +); +end i2s_to_pwm; +---------------------------------------------------------------------------------- +architecture arch_imp of i2s_to_pwm is +---------------------------------------------------------------------------------- +-- For 16 bit sound +constant C_S_CNT_MAX : INTEGER := 32767; +constant C_S_CNT_MIN : INTEGER := -32767; +constant C_STEP : INTEGER := 131072 / (C_SYS_FREQ/C_PWM_FREQ); +---------------------------------------------------------------------------------- +signal left_s_ch_val : SIGNED(15 downto 0); -- Data latches +signal right_s_ch_val : SIGNED(15 downto 0); +signal pwm_s_cnt : SIGNED(15 downto 0); -- Reference signal +signal pwm_s_cnt_dir : STD_LOGIC; -- Saw direction +---------------------------------------------------------------------------------- +signal bclk_sr : STD_LOGIC_VECTOR(1 downto 0); +signal lrclk_sr : STD_LOGIC_VECTOR(1 downto 0); +signal sdata : STD_LOGIC; +---------------------------------------------------------------------------------- +signal bit_addr : INTEGER range 0 to 31; +signal data_reg : STD_LOGIC_VECTOR(31 downto 0); +signal lsb_left : STD_LOGIC; +signal lsb_right : STD_LOGIC; +signal update_left : STD_LOGIC; +signal update_right : STD_LOGIC; +---------------------------------------------------------------------------------- +begin +---------------------------------------------------------------------------------- +-- I2S Decode +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + bclk_sr <= bclk_sr(0) & i2s_bclk; + lrclk_sr <= lrclk_sr(0) & i2s_lrclk; + sdata <= i2s_sdata; + if(lrclk_sr = "01")then -- End of left + lsb_left <= '1'; + elsif(bclk_sr = "01")then -- Rising edge + lsb_left <= '0'; + end if; + if(lrclk_sr = "10")then -- End of rigth + lsb_right <= '1'; + elsif(bclk_sr = "01")then -- Rising edge + lsb_right <= '0'; + end if; + + if(bclk_sr = "01")then -- Rising edge + if((lsb_left = '1') or (lsb_right = '1'))then + bit_addr <= 31; + elsif(bit_addr /= 0)then + bit_addr <= bit_addr - 1; + end if; + data_reg(bit_addr) <= sdata; + update_left <= lsb_left; + update_right <= lsb_right; + else + update_left <= '0'; + update_right <= '0'; + end if; + + if(update_left = '1')then + left_s_ch_val <= SIGNED(data_reg(31 downto 16)); + end if; + if(update_right = '1')then + right_s_ch_val <= SIGNED(data_reg(31 downto 16)); + end if; + end if; +end process; + +-- PWM Coding +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + -- Triangle reference signal + if(pwm_s_cnt_dir = '0')then -- Up count + if(pwm_s_cnt >= TO_SIGNED((C_S_CNT_MAX - C_STEP),16))then + pwm_s_cnt_dir <= '1'; + pwm_s_cnt <= pwm_s_cnt - C_STEP; + else + pwm_s_cnt <= pwm_s_cnt + C_STEP; + end if; + else -- Down count + if(pwm_s_cnt <= TO_SIGNED((C_S_CNT_MIN + C_STEP),16))then + pwm_s_cnt_dir <= '0'; + pwm_s_cnt <= pwm_s_cnt + C_STEP; + else + pwm_s_cnt <= pwm_s_cnt - C_STEP; + end if; + end if; + end if; +end process; + +process(clk_in) +begin + if(clk_in = '1' and clk_in'event)then + -- Comparators + if(left_s_ch_val > pwm_s_cnt)then + pwm_l_out <= '1'; + else + pwm_l_out <= '0'; + end if; + if(right_s_ch_val > pwm_s_cnt)then + pwm_r_out <= '1'; + else + pwm_r_out <= '0'; + end if; + end if; +end process; +---------------------------------------------------------------------------------- +end arch_imp; diff --git a/zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl b/zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl new file mode 100644 index 0000000..3fa319f --- /dev/null +++ b/zynqberrydemo3/ip_lib/i2s_to_pwm_1.0/xgui/i2s_to_pwm_v1_0.tcl @@ -0,0 +1,40 @@ +# Definitional proc to organize widgets for parameters. +proc init_gui { IPINST } { + ipgui::add_param $IPINST -name "Component_Name" + #Adding Page + set Page_0 [ipgui::add_page $IPINST -name "Page 0"] + ipgui::add_param $IPINST -name "C_PWM_FREQ" -parent ${Page_0} + ipgui::add_param $IPINST -name "C_SYS_FREQ" -parent ${Page_0} + + +} + +proc update_PARAM_VALUE.C_PWM_FREQ { PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to update C_PWM_FREQ when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_PWM_FREQ { PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to validate C_PWM_FREQ + return true +} + +proc update_PARAM_VALUE.C_SYS_FREQ { PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to update C_SYS_FREQ when any of the dependent parameters in the arguments change +} + +proc validate_PARAM_VALUE.C_SYS_FREQ { PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to validate C_SYS_FREQ + return true +} + + +proc update_MODELPARAM_VALUE.C_SYS_FREQ { MODELPARAM_VALUE.C_SYS_FREQ PARAM_VALUE.C_SYS_FREQ } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_SYS_FREQ}] ${MODELPARAM_VALUE.C_SYS_FREQ} +} + +proc update_MODELPARAM_VALUE.C_PWM_FREQ { MODELPARAM_VALUE.C_PWM_FREQ PARAM_VALUE.C_PWM_FREQ } { + # Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value + set_property value [get_property value ${PARAM_VALUE.C_PWM_FREQ}] ${MODELPARAM_VALUE.C_PWM_FREQ} +} + diff --git a/zynqberrydemo3/os/petalinux/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h b/zynqberrydemo3/os/petalinux/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h new file mode 100644 index 0000000..18e88e0 --- /dev/null +++ b/zynqberrydemo3/os/petalinux/project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h @@ -0,0 +1,175 @@ +/* + * This file is auto-generated by PetaLinux SDK + * DO NOT MODIFY this file, the modification will not persist + */ + +#ifndef __PLNX_CONFIG_H +#define __PLNX_CONFIG_H + +/* Board oscillator frequency */ +#define CONFIG_ZYNQ_PS_CLK_FREQ 33333333UL + +/* The following table includes the supported baudrates */ +#define CONFIG_SYS_BAUDRATE_TABLE {9600, 19200, 38400, 57600, 115200, 230400} + +/* use serial multi for all serial devices */ +#define CONFIG_SERIAL_MULTI +#define CONFIG_SYS_CONSOLE_IS_IN_ENV 1 + +/* Board name */ + +/* processor - ps7_cortexa9_0 */ +#define CONFIG_CPU_FREQ_HZ 666666687 +#define CONFIG_CLOCKS +#define CONFIG_CMD_CLK +#define CONFIG_SYS_CACHELINE_SIZE 32 +#define CONFIG_SYS_LDSCRIPT "arch/arm/mach-zynq/u-boot.lds" + +/* main_memory - ps7_ddr_0 */ + +/* Memory testing handling */ +#define CONFIG_SYS_MEMTEST_START 0x0 +#define CONFIG_SYS_MEMTEST_END (0x0 + 0x1000) +#define CONFIG_SYS_TEXT_BASE 0x00400000 +#define CONFIG_SYS_LOAD_ADDR 0x0 /* default load address */ +#define CONFIG_NR_DRAM_BANKS 1 + +/* Size of malloc() pool */ +#define SIZE 0xC00000 +#define CONFIG_SYS_MALLOC_LEN SIZE + +/* Physical Memory Map */ +#define CONFIG_SYS_INIT_RAM_ADDR 0xFFFF0000 +#define CONFIG_SYS_INIT_RAM_SIZE 0x1000 +#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_INIT_RAM_ADDR + \ + CONFIG_SYS_INIT_RAM_SIZE - \ + GENERATED_GBL_DATA_SIZE) + +/* uart - ps7_uart_1 */ +#define CONFIG_ZYNQ_SERIAL +#define PSSERIAL0 "psserial0=setenv stdout ttyPS0;setenv stdin ttyPS0\0" +#define SERIAL_MULTI "serial=setenv stdout serial;setenv stdin serial\0" +#define CONSOLE_ARG "console=console=ttyPS0,115200\0" +#define SERIAL_MULTI "serial=setenv stdout serial;setenv stdin serial\0" +#define CONFIG_BAUDRATE 115200 + +/* spi_flash - ps7_qspi_0 */ +#define XILINX_PS7_QSPI_CLK_FREQ_HZ 190476196 +#define CONFIG_SF_DEFAULT_SPEED (XILINX_PS7_QSPI_CLK_FREQ_HZ / 4) +#define CONFIG_SF_DUAL_FLASH +#define CONFIG_SYS_NO_FLASH +#define CONFIG_ENV_IS_IN_SPI_FLASH +#define CONFIG_ENV_OFFSET 0x500000 +#define CONFIG_ENV_SIZE 0x20000 +#define CONFIG_ENV_SECT_SIZE 0x20000 + +/* sdio - ps7_sd_1 */ +#define CONFIG_ZYNQ_SDHCI1 0xE0101000 +#define CONFIG_MMC +#define CONFIG_GENERIC_MMC +#define CONFIG_SUPPORT_VFAT +#define CONFIG_DOS_PARTITION +#define CONFIG_FAT_WRITE +#define CONFIG_ZYNQ_SDHCI_MAX_FREQ 52000000 + +/* devcfg - ps7_dev_cfg_0 */ +#define CONFIG_FPGA +#define CONFIG_FPGA_XILINX +#define CONFIG_FPGA_ZYNQPL +#define CONFIG_CMD_FPGA_LOADFS + +/* ps7_scutimer_0 */ +#define ZYNQ_SCUTIMER_BASEADDR 0xF8F00600 +#define CONFIG_SYS_TIMER_COUNTS_DOWN +#define CONFIG_SYS_TIMERBASE ZYNQ_SCUTIMER_BASEADDR +#define CONFIG_SYS_TIMER_COUNTER (CONFIG_SYS_TIMERBASE + 0x4) + +/* FPGA */ + +/* Make the BOOTM LEN big enough for the compressed image */ +#define CONFIG_SYS_BOOTM_LEN 0xF000000 + + +/* BOOTP options */ +#define CONFIG_BOOTP_SERVERIP +#define CONFIG_BOOTP_BOOTFILESIZE +#define CONFIG_BOOTP_BOOTPATH +#define CONFIG_BOOTP_GATEWAY +#define CONFIG_BOOTP_HOSTNAME + +/*Command line configuration.*/ +#define CONFIG_CMDLINE_EDITING +#define CONFIG_CMD_SAVES + +/* Miscellaneous configurable options */ +#define CONFIG_SYS_CBSIZE 2048/* Console I/O Buffer Size */ +#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16) + +/* Boot Argument Buffer Size */ +#define CONFIG_SYS_MAXARGS 32 /* max number of command args */ +#define CONFIG_SYS_LONGHELP + +/* architecture dependent code */ +#define CONFIG_SYS_USR_EXCEP /* user exception */ +#define CONFIG_SYS_HZ 1000 + +/* Use the HUSH parser */ +#define CONFIG_SYS_PROMPT_HUSH_PS2 "> " + +/* Don't define BOOTARGS, we get it from the DTB chosen fragment */ +#undef CONFIG_BOOTARGS + +#define CONFIG_ENV_OVERWRITE /* Allow to overwrite the u-boot environment variables */ + +#define CONFIG_LMB + +/* Initial memory map for Linux */ +#define CONFIG_SYS_BOOTMAPSZ 0x08000000 + +/* PREBOOT */ +#define CONFIG_PREBOOT "echo U-BOOT for petalinux;setenv preboot; echo; " + +/* Extra U-Boot Env settings */ +#define CONFIG_EXTRA_ENV_SETTINGS \ + SERIAL_MULTI \ + CONSOLE_ARG \ + PSSERIAL0 \ + "importbootenv=echo \"Importing environment from SD ...\"; " \ + "env import -t ${loadbootenv_addr} $filesize\0" \ + "loadbootenv=load mmc $sdbootdev:$partid ${loadbootenv_addr} ${bootenv}\0" \ + "sd_uEnvtxt_existence_test=test -e mmc $sdbootdev:$partid /uEnv.txt\0" \ + "uenvboot=" \ + "if run sd_uEnvtxt_existence_test; then" \ + "run loadbootenv" \ + "echo Loaded environment from ${bootenv};" \ + "run importbootenv; \0" \ + "sdboot=echo boot Petalinux; run uenvboot ; mmcinfo && fatload mmc 0 ${netstart} ${kernel_img} && bootm \0" \ + "autoload=no\0" \ + "clobstart=0x10000000\0" \ + "netstart=0x10000000\0" \ + "dtbnetstart=0x11800000\0" \ + "loadaddr=0x10000000\0" \ + "boot_img=BOOT.BIN\0" \ + "install_boot=mmcinfo && fatwrite mmc 0 ${clobstart} ${boot_img} ${filesize}\0" \ + "bootenvsize=0x20000\0" \ + "bootenvstart=0x500000\0" \ + "eraseenv=sf probe 0 && sf erase ${bootenvstart} ${bootenvsize}\0" \ + "jffs2_img=rootfs.jffs2\0" \ + "sd_update_jffs2=echo Updating jffs2 from SD; mmcinfo && fatload mmc 0:1 ${clobstart} ${jffs2_img} && run install_jffs2\0" \ + "install_jffs2=sf probe 0 && sf erase ${jffs2start} ${jffs2size} && " \ + "sf write ${clobstart} ${jffs2start} ${filesize}\0" \ + "kernel_img=image.ub\0" \ + "install_kernel=mmcinfo && fatwrite mmc 0 ${clobstart} ${kernel_img} ${filesize}\0" \ + "cp_kernel2ram=mmcinfo && fatload mmc 0 ${netstart} ${kernel_img}\0" \ + "dtb_img=system.dtb\0" \ + "sd_update_dtb=echo Updating dtb from SD; mmcinfo && fatload mmc 0:1 ${clobstart} ${dtb_img} && run install_dtb\0" \ + "fault=echo ${img} image size is greater than allocated place - partition ${img} is NOT UPDATED\0" \ + "test_crc=if imi ${clobstart}; then run test_img; else echo ${img} Bad CRC - ${img} is NOT UPDATED; fi\0" \ + "test_img=setenv var \"if test ${filesize} -gt ${psize}\\; then run fault\\; else run ${installcmd}\\; fi\"; run var; setenv var\0" \ + "default_bootcmd=run cp_kernel2ram && bootm ${netstart}\0" \ +"" + +/* BOOTCOMMAND */ +#define CONFIG_BOOTCOMMAND "run default_bootcmd" + +#endif /* __PLNX_CONFIG_H */ diff --git a/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/fbgrab/files/fbgrab.c b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/fbgrab/files/fbgrab.c new file mode 100644 index 0000000..fc89f5a --- /dev/null +++ b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/fbgrab/files/fbgrab.c @@ -0,0 +1,428 @@ +/* + * fbgrab - takes screenshots using the framebuffer. + * + * (C) Gunnar Monell 2002 + * + * This program is free Software, see the COPYING file + * and is based on Stephan Beyer's FBShot + * (C) 2000. + * + * For features and differences, read the manual page. + * + * This program has been checked with "splint +posixlib" without + * warnings. Splint is available from http://www.splint.org/ . + * Patches and enhancements of fbgrab have to fulfill this too. + */ + +#include +#include +#include +#include +#include + +#include +#include /* to handle vt changing */ +#include /* PNG lib */ +#include /* to handle framebuffer ioctls */ + +#define VERSION "1.0 beta 1" +#define DEFAULT_FB "/dev/fb0" +#define MAX_LEN 512 +#define UNDEFINED -1 + +/*@noreturn@*/ static void fatal_error(char *message) +{ + fprintf(stderr, "%s\n", message); + exit(EXIT_FAILURE); +} + +static void usage(char *binary) +{ + printf("Usage: %s\t[-hi] [-{C|c} vt] [-d dev] [-s n]\n" + "\t\t[-f fromfile -w n -h n -b n] filename.png\n", binary); +} + +static void help(char *binary) +{ + printf("fbgrab - takes screenshots using the framebuffer, v%s\n", VERSION); + + usage(binary); + + printf("\nPossible options:\n"); +/* please keep this list alphabetical */ + printf("\t-b n \tforce use of n bits/pixel, required when reading from file\n"); + printf("\t-C n \tgrab from console n, for slower framebuffers\n"); + printf("\t-c n \tgrab from console n\n"); + printf("\t-d dev\tuse framebuffer device dev instead of default\n"); + printf("\t-f file\t read from file instead of framebuffer\n"); + printf("\t-h n \tset height to n pixels, required when reading from file\n" + "\t\tcan be used to force height when reading from framebuffer\n"); + printf("\t-i \tturns on interlacing in PNG\n"); + printf("\t-s n \tsleep n seconds before making screenshot\n"); + printf("\t-w n \tset width to n pixels, required when reading from file\n" + "\t\tcan be used to force width when reading from framebuffer\n"); + printf("\t-? \tprint this usage information\n"); +} + + +static void chvt(int num) +{ + int fd; + + if(-1 == (fd = open("/dev/console", O_RDWR))) + fatal_error("Cannot open /dev/console"); + + if (ioctl(fd, VT_ACTIVATE, num) != 0) + fatal_error("ioctl VT_ACTIVATE"); + + if (ioctl(fd, VT_WAITACTIVE, num) != 0) + fatal_error("ioctl VT_WAITACTIVE"); + + (void) close(fd); +} + +static unsigned short int change_to_vt(unsigned short int vt_num) +{ + int fd; + unsigned short int old_vt; + struct vt_stat vt_info; + + memset(&vt_info, 0, sizeof(struct vt_stat)); + + if(-1 == (fd=open("/dev/console", O_RDONLY))) + fatal_error("Couldn't open /dev/console"); + + if (ioctl(fd, VT_GETSTATE, &vt_info) != 0) + fatal_error("ioctl VT_GETSTATE"); + + (void) close (fd); + + old_vt = vt_info.v_active; + + chvt((int) vt_num); /* go there for information */ + + return old_vt; +} + +static void get_framebufferdata(char *device, struct fb_var_screeninfo *fb_varinfo_p) +{ + int fd; + + /* now open framebuffer device */ + if(-1 == (fd=open(device, O_RDONLY))) + { + fprintf (stderr, "Error: Couldn't open %s.\n", device); + exit(EXIT_FAILURE); + } + + if (ioctl(fd, FBIOGET_VSCREENINFO, fb_varinfo_p) != 0) + fatal_error("ioctl FBIOGET_VSCREENINFO"); + + (void) close(fd); +} + +static void read_framebuffer(char *device, size_t bytes, unsigned char *buf_p) +{ + int fd; + + if(-1 == (fd=open(device, O_RDONLY))) + { + fprintf (stderr, "Error: Couldn't open %s.\n", device); + exit(EXIT_FAILURE); + } + + if (buf_p == NULL || read(fd, buf_p, bytes) != (ssize_t) bytes) + fatal_error("Error: Not enough memory or data\n"); +} + +static void convert1555to32(int width, int height, + unsigned char *inbuffer, + unsigned char *outbuffer) +{ + unsigned int i; + + for (i=0; i < (unsigned int) height*width*2; i+=2) + { + /* BLUE = 0 */ + outbuffer[(i<<1)+0] = (inbuffer[i+1] & 0x7C) << 1; + /* GREEN = 1 */ + outbuffer[(i<<1)+1] = (((inbuffer[i+1] & 0x3) << 3) | + ((inbuffer[i] & 0xE0) >> 5)) << 3; + /* RED = 2 */ + outbuffer[(i<<1)+2] = (inbuffer[i] & 0x1f) << 3; + /* ALPHA = 3 */ + outbuffer[(i<<1)+3] = '\0'; + } +} + +static void convert565to32(int width, int height, + unsigned char *inbuffer, + unsigned char *outbuffer) +{ + unsigned int i; + + for (i=0; i < (unsigned int) height*width*2; i+=2) + { + /* BLUE = 0 */ + outbuffer[(i<<1)+0] = (inbuffer[i] & 0x1f) << 3; + /* GREEN = 1 */ + outbuffer[(i<<1)+1] = (((inbuffer[i+1] & 0x7) << 3) | + (inbuffer[i] & 0xE0) >> 5) << 2; + /* RED = 2 */ + outbuffer[(i<<1)+2] = (inbuffer[i+1] & 0xF8); + /* ALPHA = 3 */ + outbuffer[(i<<1)+3] = '\0'; + } +} + +static void convert888to32(int width, int height, + unsigned char *inbuffer, + unsigned char *outbuffer) +{ + unsigned int i; + + for (i=0; i < (unsigned int) height*width; i++) + { + /* BLUE = 0 */ + outbuffer[(i<<2)+0] = inbuffer[i*3+0]; + /* GREEN = 1 */ + outbuffer[(i<<2)+1] = inbuffer[i*3+1]; + /* RED = 2 */ + outbuffer[(i<<2)+2] = inbuffer[i*3+2]; + /* ALPHA */ + outbuffer[(i<<2)+3] = '\0'; + } +} + +static void write_PNG(unsigned char *outbuffer, char *filename, + int width, int height, int interlace) +{ + int i; + int bit_depth=0, color_type; + png_bytep row_pointers[height]; + png_structp png_ptr; + png_infop info_ptr; + FILE *outfile = fopen(filename, "wb"); + + for (i=0; i 0) + { + if (UNDEFINED == bitdepth || UNDEFINED == width || UNDEFINED == height) + { + printf("Width, height and bitdepth are mandatory when reading from file\n"); + exit(EXIT_FAILURE); + } + } + else + { + if (NULL == device) + { + device = getenv("FRAMEBUFFER"); + if (NULL == device) + { + device = DEFAULT_FB; + } + } + + get_framebufferdata(device, &fb_varinfo); + + if (UNDEFINED == bitdepth) + bitdepth = (int) fb_varinfo.bits_per_pixel; + + if (UNDEFINED == width) + width = (int) fb_varinfo.xres; + + if (UNDEFINED == height) + height = (int) fb_varinfo.yres; + + strncpy(infile, device, MAX_LEN - 1); + } + + buf_size = width * height * (((unsigned int) bitdepth + 7) >> 3); + + buf_p = malloc(buf_size); + + if(buf_p == NULL) + fatal_error("Not enough memory"); + + memset(buf_p, 0, buf_size); + + read_framebuffer(infile, buf_size, buf_p); + + if (UNDEFINED != old_vt) + (void) change_to_vt((unsigned short int) old_vt); + + convert_and_write(buf_p, outfile, width, height, bitdepth, interlace); + + (void) free(buf_p); + + return 0; +} + diff --git a/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/gpio-demo/files/gpio-demo.c b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/gpio-demo/files/gpio-demo.c new file mode 100644 index 0000000..4456768 --- /dev/null +++ b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/gpio-demo/files/gpio-demo.c @@ -0,0 +1,359 @@ +/* +* +* gpio-demo app +* +* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, +* subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or (b) that interact +* with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in this +* Software without prior written authorization from Xilinx. +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +#define GPIO_ROOT "/sys/class/gpio" +#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) + +static enum {NONE, IN, OUT, CYLON, KIT} gpio_opt = NONE; + +static const unsigned long cylon[] = { + 0x00000080, 0x00000040, 0x00000020, 0x00000010, + 0x00000008, 0x00000004, 0x00000002, 0x00000001, + 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, +}; + +static const unsigned long kit[] = { + 0x000000e0, 0x00000070, 0x00000038, 0x0000001c, + 0x0000000e, 0x00000007, 0x00000003, 0x00000001, + 0x00000003, 0x00000007, 0x0000000e, + 0x0000001c, 0x00000038, 0x00000070, 0x000000e0, +}; + +static int gl_gpio_base = 0; + +static void usage (char *argv0) +{ + char *basename = strrchr(argv0, '/'); + if (!basename) + basename = argv0; + + fprintf(stderr, + "Usage: %s [-g GPIO_BASE] COMMAND\n" + "\twhere COMMAND is one of:\n" + "\t\t-i\t\tInput value from GPIO and print it\n" + "\t\t-o\tVALUE\tOutput value to GPIO\n" + "\t\t-c\t\tCylon test pattern\n" + "\t\t-k\t\t KIT test pattern\n" + "\tGPIO_BASE indicates which GPIO chip to talk to (The number can be \n" + "\tfound at /sys/class/gpio/gpiochipN).\n" + "\tThe highest gpiochipN is the first gpio listed in the dts file, \n" + "\tand the lowest gpiochipN is the last gpio listed in the dts file.\n" + "\tE.g.If the gpiochip240 is the LED_8bit gpio, and I want to output '1' \n" + "\tto the LED_8bit gpio, the command should be:\n" + "\t\tgpio-demo -g 240 -o 1\n" + "\n" + "\tgpio-demo written by Xilinx Inc.\n" + "\n" + , basename); + exit(-2); +} + +static int open_gpio_channel(int gpio_base) +{ + char gpio_nchan_file[128]; + int gpio_nchan_fd; + int gpio_max; + int nchannel; + char nchannel_str[5]; + char *cptr; + int c; + char channel_str[5]; + + char *gpio_export_file = "/sys/class/gpio/export"; + int export_fd=0; + + /* Check how many channels the GPIO chip has */ + sprintf(gpio_nchan_file, "%s/gpiochip%d/ngpio", GPIO_ROOT, gpio_base); + gpio_nchan_fd = open(gpio_nchan_file, O_RDONLY); + if (gpio_nchan_fd < 0) { + fprintf(stderr, "Failed to open %s: %s\n", gpio_nchan_file, strerror(errno)); + return -1; + } + read(gpio_nchan_fd, nchannel_str, sizeof(nchannel_str)); + close(gpio_nchan_fd); + nchannel=(int)strtoul(nchannel_str, &cptr, 0); + if (cptr == nchannel_str) { + fprintf(stderr, "Failed to change %s into GPIO channel number\n", nchannel_str); + exit(1); + } + + /* Open files for each GPIO channel */ + export_fd=open(gpio_export_file, O_WRONLY); + if (export_fd < 0) { + fprintf(stderr, "Cannot open GPIO to export %d\n", gpio_base); + return -1; + } + + gpio_max = gpio_base + nchannel; + for(c = gpio_base; c < gpio_max; c++) { + sprintf(channel_str, "%d", c); + write(export_fd, channel_str, (strlen(channel_str)+1)); + } + close(export_fd); + return nchannel; +} + +static int close_gpio_channel(int gpio_base) +{ + char gpio_nchan_file[128]; + int gpio_nchan_fd; + int gpio_max; + int nchannel; + char nchannel_str[5]; + char *cptr; + int c; + char channel_str[5]; + + char *gpio_unexport_file = "/sys/class/gpio/unexport"; + int unexport_fd=0; + + /* Check how many channels the GPIO chip has */ + sprintf(gpio_nchan_file, "%s/gpiochip%d/ngpio", GPIO_ROOT, gpio_base); + gpio_nchan_fd = open(gpio_nchan_file, O_RDONLY); + if (gpio_nchan_fd < 0) { + fprintf(stderr, "Failed to open %s: %s\n", gpio_nchan_file, strerror(errno)); + return -1; + } + read(gpio_nchan_fd, nchannel_str, sizeof(nchannel_str)); + close(gpio_nchan_fd); + nchannel=(int)strtoul(nchannel_str, &cptr, 0); + if (cptr == nchannel_str) { + fprintf(stderr, "Failed to change %s into GPIO channel number\n", nchannel_str); + exit(1); + } + + /* Close opened files for each GPIO channel */ + unexport_fd=open(gpio_unexport_file, O_WRONLY); + if (unexport_fd < 0) { + fprintf(stderr, "Cannot close GPIO by writing unexport %d\n", gpio_base); + return -1; + } + + gpio_max = gpio_base + nchannel; + for(c = gpio_base; c < gpio_max; c++) { + sprintf(channel_str, "%d", c); + write(unexport_fd, channel_str, (strlen(channel_str)+1)); + } + close(unexport_fd); + return 0; +} + +static int set_gpio_direction(int gpio_base, int nchannel, char *direction) +{ + char gpio_dir_file[128]; + int direction_fd=0; + int gpio_max; + int c; + + gpio_max = gpio_base + nchannel; + for(c = gpio_base; c < gpio_max; c++) { + sprintf(gpio_dir_file, "/sys/class/gpio/gpio%d/direction",c); + direction_fd=open(gpio_dir_file, O_RDWR); + if (direction_fd < 0) { + fprintf(stderr, "Cannot open the direction file for GPIO %d\n", c); + return 1; + } + write(direction_fd, direction, (strlen(direction)+1)); + close(direction_fd); + } + return 0; +} + +static int set_gpio_value(int gpio_base, int nchannel, int value) +{ + char gpio_val_file[128]; + int val_fd=0; + int gpio_max; + char val_str[2]; + int c; + + gpio_max = gpio_base + nchannel; + + for(c = gpio_base; c < gpio_max; c++) { + sprintf(gpio_val_file, "/sys/class/gpio/gpio%d/value",c); + val_fd=open(gpio_val_file, O_RDWR); + if (val_fd < 0) { + fprintf(stderr, "Cannot open the value file of GPIO %d\n", c); + return -1; + } + sprintf(val_str,"%d", (value & 1)); + write(val_fd, val_str, sizeof(val_str)); + close(val_fd); + value >>= 1; + } + return 0; +} + +static int get_gpio_value(int gpio_base, int nchannel) +{ + char gpio_val_file[128]; + int val_fd=0; + int gpio_max; + char val_str[2]; + char *cptr; + int value = 0; + int c; + + gpio_max = gpio_base + nchannel; + + for(c = gpio_max-1; c >= gpio_base; c--) { + sprintf(gpio_val_file, "/sys/class/gpio/gpio%d/value",c); + val_fd=open(gpio_val_file, O_RDWR); + if (val_fd < 0) { + fprintf(stderr, "Cannot open GPIO to export %d\n", c); + return -1; + } + read(val_fd, val_str, sizeof(val_str)); + value <<= 1; + value += (int)strtoul(val_str, &cptr, 0); + if (cptr == optarg) { + fprintf(stderr, "Failed to change %s into integer", val_str); + } + close(val_fd); + } + return value; +} + +void signal_handler(int sig) +{ + switch (sig) { + case SIGTERM: + case SIGHUP: + case SIGQUIT: + case SIGINT: + close_gpio_channel(gl_gpio_base); + exit(0) ; + default: + break; + } +} + +int main(int argc, char *argv[]) +{ + extern char *optarg; + char *cptr; + int gpio_value = 0; + int nchannel = 0; + + int c; + int i; + + opterr = 0; + + while ((c = getopt(argc, argv, "g:io:ck")) != -1) { + switch (c) { + case 'g': + gl_gpio_base = (int)strtoul(optarg, &cptr, 0); + if (cptr == optarg) + usage(argv[0]); + break; + case 'i': + gpio_opt = IN; + break; + case 'o': + gpio_opt = OUT; + gpio_value = (int)strtoul(optarg, &cptr, 0); + if (cptr == optarg) + usage(argv[0]); + break; + case 'c': + gpio_opt = CYLON; + break; + case 'k': + gpio_opt = KIT; + break; + case '?': + usage(argv[0]); + default: + usage(argv[0]); + + } + } + + if (gl_gpio_base == 0) { + usage(argv[0]); + } + + nchannel = open_gpio_channel(gl_gpio_base); + signal(SIGTERM, signal_handler); /* catch kill signal */ + signal(SIGHUP, signal_handler); /* catch hang up signal */ + signal(SIGQUIT, signal_handler); /* catch quit signal */ + signal(SIGINT, signal_handler); /* catch a CTRL-c signal */ + switch (gpio_opt) { + case IN: + set_gpio_direction(gl_gpio_base, nchannel, "in"); + gpio_value=get_gpio_value(gl_gpio_base, nchannel); + fprintf(stdout,"0x%08X\n", gpio_value); + break; + case OUT: + set_gpio_direction(gl_gpio_base, nchannel, "out"); + set_gpio_value(gl_gpio_base, nchannel, gpio_value); + break; + case CYLON: +#define CYLON_DELAY_USECS (10000) + set_gpio_direction(gl_gpio_base, nchannel, "out"); + for (;;) { + for(i=0; i < ARRAY_SIZE(cylon); i++) { + gpio_value=(int)cylon[i]; + set_gpio_value(gl_gpio_base, nchannel, gpio_value); + } + usleep(CYLON_DELAY_USECS); + } + case KIT: +#define KIT_DELAY_USECS (10000) + set_gpio_direction(gl_gpio_base, nchannel, "out"); + for (;;) { + for (i=0; i +#include +#include +#include +#include + +void usage(char *prog) +{ + printf("usage: %s ADDR\n",prog); + printf("\n"); + printf("ADDR may be specified as hex values\n"); +} + + +int main(int argc, char *argv[]) +{ + int fd; + void *ptr; + unsigned addr, page_addr, page_offset; + unsigned page_size=sysconf(_SC_PAGESIZE); + + if(argc!=2) { + usage(argv[0]); + exit(-1); + } + + fd=open("/dev/mem",O_RDONLY); + if(fd<1) { + perror(argv[0]); + exit(-1); + } + + addr=strtoul(argv[1],NULL,0); + page_addr=(addr & ~(page_size-1)); + page_offset=addr-page_addr; + + ptr=mmap(NULL,page_size,PROT_READ,MAP_SHARED,fd,(addr & ~(page_size-1))); + if((int)ptr==-1) { + perror(argv[0]); + exit(-1); + } + + printf("0x%08x\n",*((unsigned *)(ptr+page_offset))); + return 0; +} + + diff --git a/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/poke.c b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/poke.c new file mode 100644 index 0000000..e1b2f16 --- /dev/null +++ b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/peekpoke/files/poke.c @@ -0,0 +1,81 @@ +/* +* poke utility - for those who remember the good old days! +* + +* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, +* subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or (b) that interact +* with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in this +* Software without prior written authorization from Xilinx. +* +*/ + +#include +#include +#include +#include +#include + +void usage(char *prog) +{ + printf("usage: %s ADDR VAL\n",prog); + printf("\n"); + printf("ADDR and VAL may be specified as hex values\n"); +} + +int main(int argc, char *argv[]) +{ + int fd; + void *ptr; + unsigned val; + unsigned addr, page_addr, page_offset; + unsigned page_size=sysconf(_SC_PAGESIZE); + + fd=open("/dev/mem",O_RDWR); + if(fd<1) { + perror(argv[0]); + exit(-1); + } + + if(argc!=3) { + usage(argv[0]); + exit(-1); + } + + addr=strtoul(argv[1],NULL,0); + val=strtoul(argv[2],NULL,0); + + page_addr=(addr & ~(page_size-1)); + page_offset=addr-page_addr; + + ptr=mmap(NULL,page_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,(addr & ~(page_size-1))); + if((int)ptr==-1) { + perror(argv[0]); + exit(-1); + } + + *((unsigned *)(ptr+page_offset))=val; + return 0; +} diff --git a/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/rpicam.c b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/rpicam.c new file mode 100644 index 0000000..24cd13c --- /dev/null +++ b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/rpicam.c @@ -0,0 +1,191 @@ +/* +-- Company: Trenz Electronic GmbH +-- Engineer: Oleksandr Kiyenko + */ +#include +#include +#include +#include +#include +#include +#include +#include "sensor_config.h" + +#define CAMERA_V1_3_IIC_ADDRESS 0x36 +#define CAMERA_V2_1_IIC_ADDRESS 0x10 + +#define CS_CMMN_CHIP_ID_H 0x300A +#define CS_CMMN_CHIP_ID_L 0x300B + +unsigned char i2c_reg_read(int dev_file, unsigned char dev_addr, const unsigned short reg_addr){ + __u8 inbuf[2]; + __u8 outbuf[2]; + struct i2c_rdwr_ioctl_data packets; + struct i2c_msg messages[2]; + + /* + * In order to read a register, we first do a "dummy write" by writing + * 0 bytes to the register we want to read from. This is similar to + * the packet in set_i2c_register, except it's 1 byte rather than 2. + */ + outbuf[0] = reg_addr >> 8; + outbuf[1] = reg_addr & 0xFF; + messages[0].addr = dev_addr; + messages[0].flags = 0; + messages[0].len = 2, //sizeof(outbuf); + messages[0].buf = &outbuf; + /* The data will get returned in this structure */ + messages[1].addr = dev_addr; + messages[1].flags = I2C_M_RD; /* | I2C_M_NOSTART*/ + messages[1].len = 1, //sizeof(inbuf); + messages[1].buf = inbuf; + + /* Send the request to the kernel and get the result back */ + packets.msgs = messages; + packets.nmsgs = 2; + if(ioctl(dev_file, I2C_RDWR, &packets) < 0) { + perror("Unable to send data"); + return 1; + } + + return inbuf[0]; +} + +int i2c_reg_write(int dev_file, unsigned char dev_addr, unsigned short reg_addr, unsigned char reg_data) +{ + unsigned char outbuf[3]; + struct i2c_rdwr_ioctl_data packets; + struct i2c_msg messages[1]; + + messages[0].addr = dev_addr; + messages[0].flags = 0; + messages[0].len = sizeof(outbuf); + messages[0].buf = &outbuf; + /* The first byte indicates which register we'll write */ + outbuf[0] = reg_addr >> 8; + outbuf[1] = reg_addr & 0xFF; + outbuf[2] = reg_data; + /* Transfer the i2c packets to the kernel and verify it worked */ + packets.msgs = messages; + packets.nmsgs = 1; + if(ioctl(dev_file, I2C_RDWR, &packets) < 0) { + perror("Unable to send data"); + return 1; + } + + return 0; +} + +static void i2c_set_write(int dev_file, unsigned char dev_addr, struct sensor_cmd *set){ + int i; + for(i=0; set[i].reg != TABLE_END; i++){ + i2c_reg_write(dev_file, dev_addr, set[i].reg, set[i].val); + } +} + +static void imx219_crop(int dev_file, unsigned char dev_addr, struct sensor_rect crop_rect){ + i2c_reg_write(dev_file, dev_addr, 0x0164, crop_rect.left >> 8); + i2c_reg_write(dev_file, dev_addr, 0x0165, crop_rect.left & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x0166, (crop_rect.width - 1) >> 8); + i2c_reg_write(dev_file, dev_addr, 0x0167, (crop_rect.width - 1) & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x0168, crop_rect.top >> 8); + i2c_reg_write(dev_file, dev_addr, 0x0169, crop_rect.top & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x016A, (crop_rect.height - 1) >> 8); + i2c_reg_write(dev_file, dev_addr, 0x016B, (crop_rect.height - 1) & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x016C, crop_rect.width >> 8); + i2c_reg_write(dev_file, dev_addr, 0x016D, crop_rect.width & 0xff); + i2c_reg_write(dev_file, dev_addr, 0x016E, crop_rect.height >> 8); + i2c_reg_write(dev_file, dev_addr, 0x016F, crop_rect.height & 0xff); +} + + +int main(int argc, char *argv[]) +{ + int i2c_file; + unsigned short model_id; + unsigned int lot_id; + unsigned short chip_id; + unsigned char ret; + + printf("Raspberry Pi Camera Init v1.3\n"); + if(argc < 2){ + printf("%s /dev/i2c-X [mode]\n",argv[0]); + return 0; + } + + if ((i2c_file = open(argv[1], O_RDWR)) < 0) { + perror("Unable to open i2c control file"); + return 0; + } + + if(!((i2c_reg_read(i2c_file, CAMERA_V1_3_IIC_ADDRESS, CS_CMMN_CHIP_ID_H) != 0x56) || (i2c_reg_read(i2c_file, CAMERA_V1_3_IIC_ADDRESS, CS_CMMN_CHIP_ID_L) != 0x47))){ + printf("Camera V1.X configuration\n"); + i2c_reg_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, 0x0100, 0x00); // Disable + i2c_reg_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, 0x0103, 0x01); // Reset + usleep(1); // Wait + i2c_reg_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, 0x0103, 0x00); // Reset + usleep(10 * 1000); // Wait + i2c_set_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, ov5647_sensor_common_10bit); // Load common configuration + i2c_set_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, ov5647_sensor_1296_968_30); // Load specific configuration + i2c_reg_write(i2c_file, CAMERA_V1_3_IIC_ADDRESS, 0x0100, 0x01); // Enable + printf("Camera init complete.\n"); + close(i2c_file); + return 1; + } + + printf("Camera V2.X configuration\n"); + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0000); + if (ret < 0) { + perror("Failure to read Model ID (high byte)\n"); + return 0; + } + model_id = ret << 8; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0001); + if (ret < 0) { + perror("Failure to read Model ID (low byte)\n"); + return 0; + } + model_id |= ret; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0004); + if (ret < 0) { + perror("Failure to read Lot ID (high byte)\n"); + return 0; + } + lot_id = ret << 16; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0005); + if (ret < 0) { + perror("Failure to read Lot ID (mid byte)\n"); + return 0; + } + lot_id |= ret << 8; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x0006); + if (ret < 0) { + perror("Failure to read Lot ID (low byte)\n"); + return 0; + } + lot_id |= ret; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x000D); + if (ret < 0) { + perror("Failure to read Chip ID (high byte)\n"); + return 0; + } + chip_id = ret << 8; + ret = i2c_reg_read(i2c_file, CAMERA_V2_1_IIC_ADDRESS, 0x000E); + if (ret < 0) { + perror("Failure to read Chip ID (low byte)\n"); + return 0; + } + chip_id |= ret; + if (model_id != 0x0219) { + perror("Model not supported!\n"); + return 0; + } + + printf("Found 2.X Camera Model ID 0x%04x, Lot ID 0x%06x, Chip ID 0x%04x\n", model_id, lot_id, chip_id); + i2c_set_write(i2c_file, CAMERA_V2_1_IIC_ADDRESS, imx219_720p_regs); + printf("Camera init complete.\n"); + + close(i2c_file); + return 3; +} + diff --git a/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/sensor_config.h b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/sensor_config.h new file mode 100644 index 0000000..8f062a5 --- /dev/null +++ b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/rpicam/files/sensor_config.h @@ -0,0 +1,705 @@ + +#ifndef SENSOR_CONFIG_H_ +#define SENSOR_CONFIG_H_ + + +#define TABLE_END 0xffff + +//----------------------------------------------------------------------------------------- + +// atomar register element +struct sensor_cmd { + unsigned short reg; + unsigned char val; +}; + +//----------------------------------------------------------------------------------------- + +static struct sensor_cmd ov5647_sensor_common_10bit[] = { + { 0x3034, 0x1A }, // 10 bit mode +// { 0x3034, 0x10 }, // 8 bit mode + { 0x503D, 0x00 }, // Test Pattern + { 0x3035, 0x21 }, // CLK DIV + { 0x3036, 0x46 }, // PLL MULT + { 0x303c, 0x11 }, // PLLS CP + { 0x3106, 0xf5 }, // PLL DIV + { 0x3821, 0x07 }, // TIMING TC + { 0x3820, 0x41 }, // TIMING TC + { 0x3827, 0xec }, + { 0x370c, 0x0f }, + { 0x3612, 0x59 }, + { 0x3503, 0x00 }, // AEC/AGC + { 0x5000, 0x89 }, // Lens Correction + { 0x5001, 0x01 }, // AWB + { 0x5002, 0x41 }, // AWB GAIN, OPT, WIN + { 0x5003, 0x0A }, // BIN + { 0x5a00, 0x08 }, + { 0x3000, 0x00 }, + { 0x3001, 0x00 }, + { 0x3002, 0x00 }, + { 0x3016, 0x08 }, + { 0x3017, 0xe0 }, + { 0x3018, 0x44 }, + { 0x301c, 0xf8 }, + { 0x301d, 0xf0 }, + { 0x3a18, 0x00 }, + { 0x3a19, 0xf8 }, + { 0x3c01, 0x80 }, // 50/60HZ Detection + { 0x3b07, 0x0c }, + { 0x380c, 0x07 }, + { 0x380d, 0x68 }, + { 0x380e, 0x03 }, + { 0x380f, 0xd8 }, + { 0x3814, 0x31 }, + { 0x3815, 0x31 }, + { 0x3708, 0x64 }, + { 0x3709, 0x52 }, + { 0x3630, 0x2e }, + { 0x3632, 0xe2 }, + { 0x3633, 0x23 }, + { 0x3634, 0x44 }, + { 0x3636, 0x06 }, + { 0x3620, 0x65 }, // V BINNING + { 0x3621, 0xe1 }, // H BINNING + { 0x3600, 0x37 }, + { 0x3704, 0xa0 }, + { 0x3703, 0x5a }, + { 0x3715, 0x78 }, + { 0x3717, 0x01 }, + { 0x3731, 0x02 }, + { 0x370b, 0x60 }, + { 0x3705, 0x1a }, + { 0x3f05, 0x02 }, + { 0x3f06, 0x10 }, + { 0x3f01, 0x0a }, + { 0x3a08, 0x01 }, + { 0x3a09, 0x27 }, + { 0x3a0a, 0x00 }, + { 0x3a0b, 0xf6 }, + { 0x3a0d, 0x04 }, + { 0x3a0e, 0x03 }, + { 0x3a0f, 0x58 }, + { 0x3a10, 0x50 }, + { 0x3a1b, 0x58 }, + { 0x3a1e, 0x50 }, + { 0x3a11, 0x60 }, + { 0x3a1f, 0x28 }, + { 0x4001, 0x02 }, + { 0x4004, 0x02 }, + { 0x4000, 0x09 }, + { 0x4837, 0x24 }, + { 0x4050, 0x6e }, + { 0x4051, 0x8f }, + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +static struct sensor_cmd ov5647_sensor_common_test[] = { + { 0x3034, 0x1A }, // 10 bit mode + { 0x503D, 0x80 }, +// { 0x3035, 0x21 }, +// { 0x3036, 0x46 }, +// { 0x303c, 0x11 }, + { 0x3106, 0xf5 }, +// { 0x3821, 0x07 }, +// { 0x3820, 0x41 }, + { 0x3827, 0xec }, + { 0x370c, 0x0f }, +// { 0x3612, 0x59 }, +// { 0x3618, 0x00 }, + { 0x5000, 0x06 }, + { 0x5001, 0x00 }, + { 0x5002, 0x40 }, + { 0x5003, 0x08 }, + { 0x5a00, 0x08 }, + { 0x3000, 0x00 }, + { 0x3001, 0x00 }, + { 0x3002, 0x00 }, + { 0x3016, 0x08 }, + { 0x3017, 0xe0 }, + { 0x3018, 0x44 }, + { 0x301c, 0xf8 }, + { 0x301d, 0xf0 }, + { 0x3a18, 0x00 }, + { 0x3a19, 0xf8 }, + { 0x3c01, 0x80 }, + { 0x3b07, 0x0c }, +// { 0x380c, 0x07 }, +// { 0x380d, 0x68 }, +// { 0x380e, 0x03 }, +// { 0x380f, 0xd8 }, +// { 0x3814, 0x31 }, +// { 0x3815, 0x31 }, +// { 0x3708, 0x64 }, +// { 0x3709, 0x52 }, + { 0x3630, 0x2e }, + { 0x3632, 0xe2 }, + { 0x3633, 0x23 }, + { 0x3634, 0x44 }, + { 0x3636, 0x06 }, + { 0x3620, 0x64 }, + { 0x3621, 0xe0 }, + { 0x3600, 0x37 }, + { 0x3704, 0xa0 }, + { 0x3703, 0x5a }, + { 0x3715, 0x78 }, + { 0x3717, 0x01 }, + { 0x3731, 0x02 }, + { 0x370b, 0x60 }, + { 0x3705, 0x1a }, + { 0x3f05, 0x02 }, + { 0x3f06, 0x10 }, + { 0x3f01, 0x0a }, +// { 0x3a08, 0x01 }, +// { 0x3a09, 0x27 }, +// { 0x3a0a, 0x00 }, +// { 0x3a0b, 0xf6 }, +// { 0x3a0d, 0x04 }, +// { 0x3a0e, 0x03 }, + { 0x3a0f, 0x58 }, + { 0x3a10, 0x50 }, + { 0x3a1b, 0x58 }, + { 0x3a1e, 0x50 }, + { 0x3a11, 0x60 }, + { 0x3a1f, 0x28 }, + { 0x4001, 0x02 }, +// { 0x4004, 0x02 }, + { 0x4000, 0x09 }, +// { 0x4837, 0x24 }, + { 0x4050, 0x6e }, + { 0x4051, 0x8f }, + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +/* 2592 x 1944 @ 15 fps */ + /* + * MIPI Link : 425.000 Mbps + * Pixel clock : 85.000 MHz + * Timing zone : 2752 x 1974 + * FPS : 15.6 + */ +static struct sensor_cmd ov5647_sensor_2592_1944_15[] = { + { 0x3035, 0x21 }, + { 0x3036, 0x66 }, + { 0x303c, 0x11 }, + { 0x3821, 0x06 }, + { 0x3820, 0x00 }, + { 0x3612, 0x5b }, + { 0x3618, 0x04 }, + { 0x380c, 0x0a }, + { 0x380d, 0xc0 }, + { 0x380e, 0x07 }, + { 0x380f, 0xb6 }, + { 0x3814, 0x11 }, + { 0x3815, 0x11 }, + { 0x3708, 0x64 }, + { 0x3709, 0x12 }, + { 0x3808, 0x0a }, + { 0x3809, 0x20 }, + { 0x380a, 0x07 }, + { 0x380b, 0x98 }, + { 0x3800, 0x00 }, + { 0x3801, 0x0c }, + { 0x3802, 0x00 }, + { 0x3803, 0x02 }, + { 0x3804, 0x0a }, + { 0x3805, 0x33 }, + { 0x3806, 0x07 }, + { 0x3807, 0xa1 }, + { 0x3a08, 0x01 }, + { 0x3a09, 0x28 }, + { 0x3a0a, 0x00 }, + { 0x3a0b, 0xf6 }, + { 0x3a0d, 0x07 }, + { 0x3a0e, 0x06 }, + { 0x4004, 0x04 }, + { 0x4837, 0x19 }, + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +/* 1936 x 1088 @ 30 fps */ + /* + * MIPI Link : 416.667 Mbps + * Pixel clock : 83.333 MHz + * Timing zone : 2416 x 1104 + * FPS : 31.2 + */ +static struct sensor_cmd ov5647_sensor_1936_1088_30[] = { + { 0x3035, 0x21 }, + { 0x3036, 0x64 }, + { 0x303c, 0x11 }, + { 0x3821, 0x06 }, + { 0x3820, 0x00 }, + { 0x3612, 0x5b }, + { 0x3618, 0x04 }, + { 0x380c, 0x09 }, + { 0x380d, 0x70 }, + { 0x380e, 0x04 }, + { 0x380f, 0x50 }, + { 0x3814, 0x11 }, + { 0x3815, 0x11 }, + { 0x3708, 0x64 }, + { 0x3709, 0x12 }, + { 0x3808, 0x07 }, + { 0x3809, 0x90 }, /* 80 */ + { 0x380a, 0x04 }, + { 0x380b, 0x40 }, /* 38 */ + { 0x3800, 0x01 }, + { 0x3801, 0x54 }, /* 5c */ + { 0x3802, 0x01 }, + { 0x3803, 0xb0 }, /* b2 */ + { 0x3804, 0x08 }, + { 0x3805, 0xeb }, /* e3 */ + { 0x3806, 0x05 }, + { 0x3807, 0xf3 }, /* f1 */ + { 0x3a08, 0x01 }, + { 0x3a09, 0x4b }, + { 0x3a0a, 0x01 }, + { 0x3a0b, 0x13 }, + { 0x3a0d, 0x04 }, + { 0x3a0e, 0x03 }, + { 0x4004, 0x04 }, + { 0x4837, 0x19 }, + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +/* 1296 x 968 @ 30 fps */ + /* + * MIPI Link : 291.667 Mbps + * Pixel clock : 58.333 MHz + * Timing zone : 1896 x 984 + * FPS : 31.3 + */ +static struct sensor_cmd ov5647_sensor_1296_968_30[] = { + { 0x3035, 0x21 }, + { 0x3036, 0x46 }, + { 0x303c, 0x11 }, + { 0x3821, 0x07 }, + { 0x3820, 0x41 }, + { 0x3612, 0x59 }, + { 0x3618, 0x00 }, + { 0x380c, 0x07 }, + { 0x380d, 0x68 }, + { 0x380e, 0x03 }, + { 0x380f, 0xd8 }, + { 0x3814, 0x31 }, + { 0x3815, 0x31 }, + { 0x3708, 0x64 }, + { 0x3709, 0x52 }, + { 0x3808, 0x05 }, + { 0x3809, 0x10 }, /* 00 */ + { 0x380a, 0x03 }, + { 0x380b, 0xc8 }, /* c0 */ + { 0x3800, 0x00 }, + { 0x3801, 0x00 }, /* 18 */ + { 0x3802, 0x00 }, + { 0x3803, 0x08 }, /* 0e */ + { 0x3804, 0x0a }, + { 0x3805, 0x3b }, /* 27 */ + { 0x3806, 0x07 }, + { 0x3807, 0x9b }, /* 95 */ + { 0x3a08, 0x01 }, + { 0x3a09, 0x27 }, + { 0x3a0a, 0x00 }, + { 0x3a0b, 0xf6 }, + { 0x3a0d, 0x04 }, + { 0x3a0e, 0x03 }, + { 0x4004, 0x02 }, + { 0x4837, 0x24 }, + + { 0x5001, 0x01 }, // AWB on + { 0x5002, 0x41 }, // AWB on + { TABLE_END, 0x00 }, +}; + +//----------------------------------------------------------------------------------------- + +/* 1280 x 720 @ 30 fps */ + /* + * MIPI Link : 291.667 Mbps + * Pixel clock : 58.333 MHz + * Timing zone : 1896 x 984 + * FPS : 31.3 + */ +static struct sensor_cmd ov5647_sensor_1280_720_30[] = { + { 0x3035, 0x21 }, // * + { 0x3036, 0x46 }, // * PLL multiplier + { 0x303c, 0x11 }, // * PLL div + { 0x3821, 0x07 }, // * Timing + { 0x3820, 0x41 }, // * Timing + { 0x3612, 0x59 }, // ? + { 0x3618, 0x00 }, // ? + { 0x380c, 0x07 }, // * Horisontal size [12:8] 1896 + { 0x380d, 0x68 }, // * Horisontal size [7:0] + { 0x380e, 0x03 }, // * total vertical size [9:8] 984 + { 0x380f, 0xd8 }, // * total vertical size [7:0] + { 0x3814, 0x31 }, // * timing x inc + { 0x3815, 0x31 }, // * timing y inc + { 0x3708, 0x64 }, // + { 0x3709, 0x52 }, // + { 0x3808, 0x05 }, // out horisontal [11:8] 1280 + { 0x3809, 0x00 }, // out horisontal [7:0] + { 0x380a, 0x02 }, // out vertical [11:8] 720 + { 0x380b, 0xd0 }, // out vertical [7:0] + { 0x3800, 0x00 }, // + X start [11:8] + { 0x3801, 0x00 }, // + X start [7:0] /* 18 */ + { 0x3802, 0x00 }, // + Y start [11:8] + { 0x3803, 0x08 }, // + Y start [7:0] /* 0e */ + { 0x3804, 0x0a }, // + X end [11:8] + { 0x3805, 0x3b }, // + X end [7:0] /* 27 */ + { 0x3806, 0x07 }, // + Y end [11:8] + { 0x3807, 0x9b }, // + Y end [7:0] /* 95 */ + { 0x3a08, 0x01 }, // + { 0x3a09, 0x27 }, // + { 0x3a0a, 0x00 }, // + { 0x3a0b, 0xf6 }, // + { 0x3a0d, 0x04 }, // + { 0x3a0e, 0x03 }, // + { 0x4004, 0x02 }, // + { 0x4837, 0x24 }, // * PCLK period + + { 0x5001, 0x01 }, // AWB on + { 0x5002, 0x41 }, // AWB on + + { TABLE_END, 0x00 }, // +}; + +//----------------------------------------------------------------------------------------- + +static struct sensor_cmd ov5647_sensor_640_480_90[] = { + { 0x3035, 0x11 }, + { 0x3036, 0x2a }, + { 0x3821, 0x07 }, + { 0x3820, 0x41 }, + { 0x3612, 0x49 }, + { 0x3618, 0x00 }, + { 0x380c, 0x07 }, + { 0x380d, 0x30 }, + { 0x380e, 0x01 }, + { 0x380f, 0x78 }, + { 0x3814, 0x71 }, + { 0x3815, 0x31 }, + { 0x3709, 0x52 }, + { 0x3808, 0x02 }, + { 0x3809, 0x80 }, + { 0x380a, 0x01 }, + { 0x380b, 0xe8 }, + { 0x3800, 0x00 }, + { 0x3801, 0x10 }, + { 0x3802, 0x00 }, + { 0x3803, 0x00 }, + { 0x3804, 0x0a }, + { 0x3805, 0x2f }, + { 0x3806, 0x07 }, + { 0x3807, 0x9f }, + { 0x4004, 0x02 }, + { TABLE_END, 0x00 }, // +}; + +//----------------------------------------------------------------------------------------- +static const struct sensor_cmd imx219_miscellaneous[] = { + { 0x30EB, 0x05 }, /* Access Code for address over 0x3000 */ + { 0x30EB, 0x0C }, /* Access Code for address over 0x3000 */ + { 0x300A, 0xFF }, /* Access Code for address over 0x3000 */ + { 0x300B, 0xFF }, /* Access Code for address over 0x3000 */ + { 0x30EB, 0x05 }, /* Access Code for address over 0x3000 */ + { 0x30EB, 0x09 }, /* Access Code for address over 0x3000 */ + { 0x0114, 0x03 }, /* CSI_LANE_MODE[1:0} */ + { 0x0128, 0x00 }, /* DPHY_CNTRL */ + { 0x012A, 0x18 }, /* EXCK_FREQ[15:8] */ + { 0x012B, 0x00 }, /* EXCK_FREQ[7:0] */ + { 0x0160, 0x0A }, /* FRM_LENGTH_A[15:8] */ + { 0x0161, 0x83 }, /* FRM_LENGTH_A[7:0] */ + { 0x0162, 0x0D }, /* LINE_LENGTH_A[15:8] */ + { 0x0163, 0x78 }, /* LINE_LENGTH_A[7:0] */ + { 0x0170, 0x01 }, /* X_ODD_INC_A[2:0] */ + { 0x0171, 0x01 }, /* Y_ODD_INC_A[2:0] */ + { 0x0174, 0x00 }, /* BINNING_MODE_H_A */ + { 0x0175, 0x00 }, /* BINNING_MODE_V_A */ + { 0x018C, 0x0A }, /* CSI_DATA_FORMAT_A[15:8] */ + { 0x018D, 0x0A }, /* CSI_DATA_FORMAT_A[7:0] */ + { 0x0301, 0x05 }, /* VTPXCK_DIV */ + { 0x0303, 0x01 }, /* VTSYCK_DIV */ + { 0x0304, 0x03 }, /* PREPLLCK_VT_DIV[3:0] */ + { 0x0305, 0x03 }, /* PREPLLCK_OP_DIV[3:0] */ + { 0x0306, 0x00 }, /* PLL_VT_MPY[10:8] */ + { 0x0307, 0x57 }, /* PLL_VT_MPY[7:0] */ + { 0x0309, 0x0A }, /* OPPXCK_DIV[4:0] */ + { 0x030B, 0x01 }, /* OPSYCK_DIV */ + { 0x030C, 0x00 }, /* PLL_OP_MPY[10:8] */ + { 0x030D, 0x5A }, /* PLL_OP_MPY[7:0] */ + { 0x455E, 0x00 }, /* CIS Tuning */ + { 0x471E, 0x4B }, /* CIS Tuning */ + { 0x4767, 0x0F }, /* CIS Tuning */ + { 0x4750, 0x14 }, /* CIS Tuning */ + { 0x4540, 0x00 }, /* CIS Tuning */ + { 0x47B4, 0x14 }, /* CIS Tuning */ + { 0x4713, 0x30 }, /* CIS Tuning */ + { 0x478B, 0x10 }, /* CIS Tuning */ + { 0x478F, 0x10 }, /* CIS Tuning */ + { 0x4793, 0x10 }, /* CIS Tuning */ + { 0x4797, 0x0E }, /* CIS Tuning */ + { 0x479B, 0x0E }, /* CIS Tuning */ + { TABLE_END, 0x00 } +}; +/* 3280x2464@15 FPS */ +static const struct sensor_cmd imx219_1test[] = { + {0x0100, 0x00}, // 0=OFF, 1=Stream, 2=MAX + {0x30EB, 0x05}, + {0x30EB, 0x0C}, + {0x300A, 0xFF}, + {0x300B, 0xFF}, + {0x30EB, 0x05}, + {0x30EB, 0x09}, + {0x0114, 0x01}, // CSI MIPI Lanes [1:0] (0x01=2, 0x03=4) + {0x0128, 0x00}, // DPHY_CNTRL + {0x012A, 0x18}, // EXCK_FREQ [15:8] + {0x012B, 0x00}, // EXCK_FREQ [7:0] + {0x0157, 0x00}, // Analog Gain + {0x0158, 0x00}, // Digital Gain [15:8] + {0x0159, 0x00}, // Digital Gain [7:0] + // {0x015A, 0x01}, // Shutter/Integration Time [15:8] + // {0x015B, 0x00}, // Shutter/Integration Time [7:0] + {0x0160, 0x09}, // Frame Length [15:8] + {0x0161, 0xC8}, // Frame Length [7:0] + {0x0162, 0x0D}, // Line Length [15:8] + {0x0163, 0x78}, // Line Length [7:0] + {0x0164, 0x00}, + {0x0165, 0x00}, + {0x0166, 0x0C}, + {0x0167, 0xCF}, + {0x0168, 0x00}, + {0x0169, 0x00}, + {0x016A, 0x09}, + {0x016B, 0x9F}, + {0x016C, 0x0C}, + {0x016D, 0xD0}, + {0x016E, 0x09}, + {0x016F, 0xA0}, + {0x0170, 0x01}, // X_ODD_INC [2:0] + {0x0171, 0x01}, // Y_ODD_INC [2:0] + {0x0172, 0x03}, + {0x0174, 0x00}, // Binning Mode H_A + {0x0175, 0x00}, // Binning Mode V_A + {0x018C, 0x0A}, // CSI Data Format [15:8] + {0x018D, 0x0A}, // CSI Data Format [7:0] + {0x0301, 0x05}, // VTPXCK_DIV + {0x0303, 0x01}, // VTSYCK_DIV + {0x0304, 0x03}, // PREPLLCK_VT_DIV [3:0] + {0x0305, 0x03}, // PREPLLCK_OP_DIV [3:0] + {0x0306, 0x00}, // PLL_VT_MPY [10:8] + {0x0307, 0x2B}, // PLL_VT_MPY [7:0] + {0x0309, 0x0A}, // OPPXCK_DIV [4:0] + {0x030B, 0x01}, // OPSYCK_DIV + {0x030C, 0x00}, // PLL_OP_MPY [10:8] + {0x030D, 0x55}, // PLL_OP_MPY [7:0] + {0x455E, 0x00}, // CIS Tuning ? + {0x471E, 0x4B}, // CIS Tuning ? + {0x4767, 0x0F}, // CIS Tuning ? + {0x4750, 0x14}, // CIS Tuning ? + {0x4540, 0x00}, // CIS Tuning ? + {0x47B4, 0x14}, // CIS Tuning ? + {0x4713, 0x30}, // CIS Tuning ? + {0x478B, 0x10}, // CIS Tuning ? + {0x478F, 0x10}, // CIS Tuning ? + {0x4797, 0x0E}, // CIS Tuning ? + {0x479B, 0x0E}, // CIS Tuning ? + {TABLE_END, 0x00} +}; + +static struct sensor_cmd imx219_720p_regs[] = { //720: 1280*720@30fps + {0x30EB, 0x05}, + {0x30EB, 0x0C}, + {0x300A, 0xFF}, + {0x300B, 0xFF}, + {0x30EB, 0x05}, + {0x30EB, 0x09}, + + {0x0114, 0x01}, // CSI_LANE_MODE = 2-lane + {0x0128, 0x00}, // DPHY_CTRL = auto mode + + {0x012A, 0x13}, // EXCLK_FREQ[15:8] + {0x012B, 0x34}, // EXCLK_FREQ[7:0] = 4916 MHz + + {0x0160, 0x04}, // FRM_LENGTH_A[15:8] + {0x0161, 0x60}, // FRM_LENGTH_A[7:0] = 1120 + {0x0162, 0x0D}, // LINE_LENGTH_A[15:8] + {0x0163, 0x78}, // LINE_LENGTH_A[7:0] = 3448 + {0x0164, 0x01}, // XADD_STA_A[11:8] + {0x0165, 0x58}, // XADD_STA_A[7:0] = X top left = 344 + {0x0166, 0x0B}, // XADD_END_A[11:8] + {0x0167, 0x77}, // XADD_END_A[7:0] = X bottom right = 2935 + {0x0168, 0x01}, // YADD_STA_A[11:8] + {0x0169, 0xF0}, // YADD_STA_A[7:0] = Y top left = 496 + {0x016A, 0x07}, // YADD_END_A[11:8] + {0x016B, 0xAF}, // YADD_END_A[7:0] = Y bottom right = 1967 + {0x016C, 0x05}, // x_output_size[11:8] + {0x016D, 0x10}, // x_output_size[7:0] = 1296 + {0x016E, 0x02}, // y_output_size[11:8] + {0x016F, 0xE0}, // y_output_size[7:0] = 736 + {0x0170, 0x01}, // X_ODD_INC_A + {0x0171, 0x01}, // Y_ODD_INC_A + {0x0174, 0x01}, // BINNING_MODE_H_A = x2-binning + {0x0175, 0x01}, // BINNING_MODE_V_A = x2-binning +// {0x0174, 0x00}, // BINNING_MODE_H_A = no-binning +// {0x0175, 0x00}, // BINNING_MODE_V_A = no-binning + {0x0176, 0x01}, // BINNING_CAL_MODE_H_A + {0x0177, 0x01}, // BINNING_CAL_MODE_V_A + {0x018C, 0x0A}, // CSI_DATA_FORMAT_A[15:8] + {0x018D, 0x0A}, // CSI_DATA_FORMAT_A[7:0] + {0x0301, 0x05}, + {0x0303, 0x01}, + {0x0304, 0x02}, + {0x0305, 0x02}, + {0x0309, 0x0A}, // OPPXCK_DIV + {0x030B, 0x01}, // OPSYCK_DIV + + {0x0306, 0x00}, // PLL_VT_MPY[10:8] + //{0x0307, 0x2E}, // PLL_VT_MPY[7:0] = 46 + {0x0307, 0x17}, // PLL_VT_MPY[7:0] = 23 + //{0x0307, 0x0F}, // PLL_VT_MPY[7:0] = 15 + + {0x030C, 0x00}, // PLL_OP_MPY[10:8] + //{0x030D, 0x5C}, // PLL_OP_MPY[7:0] = 92 + {0x030D, 0x2E}, // PLL_OP_MPY[7:0] = 46 + //{0x030D, 0x1E}, // PLL_OP_MPY[7:0] = 30 + + {0x455E, 0x00}, + {0x471E, 0x4B}, + {0x4767, 0x0F}, + {0x4750, 0x14}, + {0x4540, 0x00}, + {0x47B4, 0x14}, + {0x4713, 0x30}, + {0x478B, 0x10}, + {0x478F, 0x10}, + {0x4793, 0x10}, + {0x4797, 0x0E}, + {0x479B, 0x0E}, + //{0x0601, 0x02}, // Test pattern = Color bar + {0x0601, 0x00}, // Test pattern = Normal work + {0x0620, 0x00}, // TP_WINDOW_X_OFFSET[11:8] + {0x0621, 0x00}, // TP_WINDOW_X_OFFSET[7:0] + {0x0621, 0x00}, // TP_WINDOW_Y_OFFSET[11:8] + {0x0623, 0x00}, // TP_WINDOW_Y_OFFSET[7:0] + {0x0624, 0x05}, // TP_WINDOW_WIDTH[11:8] + {0x0625, 0x00}, // TP_WINDOW_WIDTH[7:0] = 1280 + {0x0626, 0x02}, // TP_WINDOW_HEIGHT[11:8] + {0x0627, 0xD0}, // TP_WINDOW_HEIGHT[7:0] = 720 + {0x0100, 0x01}, /* mode select streaming on */ + {TABLE_END, 0x00} +}; + +static struct sensor_cmd imx219_720p_45fps_regs[] = { //720: 1280*720@45fps + {0x30EB, 0x05}, + {0x30EB, 0x0C}, + {0x300A, 0xFF}, + {0x300B, 0xFF}, + {0x30EB, 0x05}, + {0x30EB, 0x09}, + + {0x0114, 0x01}, + {0x0128, 0x00}, + + {0x012A, 0x13}, // EXCLK_FREQ[15:8] + {0x012B, 0x34}, // EXCLK_FREQ[7:0] = 4916 MHz + +// {0x012A, 0x09}, // EXCLK_FREQ[15:8] +// {0x012B, 0x9A}, // EXCLK_FREQ[7:0] = 2458 MHz + +// {0x012A, 0x26}, // * EXCLK_FREQ[15:8] +// {0x012B, 0x68}, // * EXCLK_FREQ[7:0] = 4916 MHz +// {0x012A, 0x18}, // * EXCLK_FREQ[15:8] +// {0x012B, 0x00}, // * EXCLK_FREQ[7:0] = 4916 MHz + + {0x0160, 0x04}, + {0x0161, 0x60}, + {0x0162, 0x0D}, + {0x0163, 0x78}, + {0x0164, 0x01}, + {0x0165, 0x58}, + {0x0166, 0x0B}, + {0x0167, 0x77}, + {0x0168, 0x01}, + {0x0169, 0xF0}, + {0x016A, 0x07}, + {0x016B, 0xAF}, + {0x016C, 0x05}, + {0x016D, 0x10}, + {0x016E, 0x02}, + {0x016F, 0xE0}, + {0x0170, 0x01}, + {0x0171, 0x01}, + {0x0174, 0x01}, + {0x0175, 0x01}, + {0x0176, 0x01}, + {0x0177, 0x01}, + {0x018C, 0x0A}, + {0x018D, 0x0A}, + {0x0301, 0x05}, + {0x0303, 0x01}, + {0x0304, 0x02}, + {0x0305, 0x02}, + {0x0306, 0x00}, + {0x0307, 0x2E}, + {0x0309, 0x0A}, + {0x030B, 0x01}, + + //{0x030C, 0x00}, // PLL_OP_MPY[10:8] + //{0x030D, 0x5C}, // PLL_OP_MPY[7:0] = 92 + + {0x030C, 0x00}, // PLL_OP_MPY[10:8] + {0x030D, 0xB8}, // PLL_OP_MPY[7:0] = 184 + + {0x455E, 0x00}, + {0x471E, 0x4B}, + {0x4767, 0x0F}, + {0x4750, 0x14}, + {0x4540, 0x00}, + {0x47B4, 0x14}, + {0x4713, 0x30}, + {0x478B, 0x10}, + {0x478F, 0x10}, + {0x4793, 0x10}, + {0x4797, 0x0E}, + {0x479B, 0x0E}, + {0x0100, 0x01}, /* mode select streaming on */ + {TABLE_END, 0x00} +}; + + + +static const struct sensor_cmd imx219_start[] = { + {0x0100, 0x01}, /* mode select streaming on */ + {TABLE_END, 0x00} +}; +static const struct sensor_cmd imx219_stop[] = { + {0x0100, 0x00}, /* mode select streaming off */ + {TABLE_END, 0x00} +}; +static const struct sensor_cmd imx219_test_color_bar[] = { + {0x0600, 0x00}, + {0x0601, 0x02}, + {TABLE_END, 0x00} +}; + +struct sensor_rect { + unsigned short left; + unsigned short top; + unsigned short width; + unsigned short height; +}; + +static const struct sensor_rect imx219_center_1280x720_rect = { + 1000, 872, 1280, 720 +}; + + +#endif diff --git a/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/startup/files/startup.c b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/startup/files/startup.c new file mode 100644 index 0000000..62523b0 --- /dev/null +++ b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-apps/startup/files/startup.c @@ -0,0 +1,39 @@ +/* +* Copyright (C) 2013 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person +* obtaining a copy of this software and associated documentation +* files (the "Software"), to deal in the Software without restriction, +* including without limitation the rights to use, copy, modify, merge, +* publish, distribute, sublicense, and/or sell copies of the Software, +* and to permit persons to whom the Software is furnished to do so, +* subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or (b) that interact +* with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in this +* Software without prior written authorization from Xilinx. +* +*/ + +#include + +int main(int argc, char **argv) +{ + printf("Hello World!\n"); + + return 0; +} diff --git a/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h new file mode 100644 index 0000000..b6bda5d --- /dev/null +++ b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h @@ -0,0 +1,4 @@ + +#include +#define CONFIG_PREBOOT "echo U-BOOT for ${hostname};setenv preboot; echo; fatload mmc 0 0x1FC00000 u-boot.rgba" + diff --git a/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-modules/te-audio-codec/files/te-audio-codec.c b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-modules/te-audio-codec/files/te-audio-codec.c new file mode 100644 index 0000000..5b9575d --- /dev/null +++ b/zynqberrydemo3/os/petalinux/project-spec/meta-user/recipes-modules/te-audio-codec/files/te-audio-codec.c @@ -0,0 +1,99 @@ +/* + * ALSA SoC SPDIF DIT driver + * + * This driver is used by controllers which can operate in DIT (SPDI/F) where + * no codec is needed. This file provides stub codec that can be used + * in these configurations. TI DaVinci Audio controller uses this driver. + * + * Author: Steve Chen, + * Copyright: (C) 2009 MontaVista Software, Inc., + * Copyright: (C) 2009 Texas Instruments, India + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "te-audio-codec" + +#define STUB_RATES (SNDRV_PCM_RATE_8000_192000 | \ + SNDRV_PCM_RATE_32000 | \ + SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | \ + SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \ + SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000) +#define STUB_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ + SNDRV_PCM_FMTBIT_S20_3LE | \ + SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) + +static const struct snd_soc_dapm_widget dit_widgets[] = { + SND_SOC_DAPM_OUTPUT("te-out"), +}; + +static const struct snd_soc_dapm_route dit_routes[] = { + { "te-out", NULL, "Playback" }, +}; + +static struct snd_soc_codec_driver soc_codec_spdif_dit = { + .component_driver = { + .dapm_widgets = dit_widgets, + .num_dapm_widgets = ARRAY_SIZE(dit_widgets), + .dapm_routes = dit_routes, + .num_dapm_routes = ARRAY_SIZE(dit_routes), + }, +}; + +static struct snd_soc_dai_driver dit_stub_dai = { + .name = "dit-hifi", + .playback = { + .stream_name = "Playback", + .channels_min = 1, + .channels_max = 384, + .rates = STUB_RATES, + .formats = STUB_FORMATS, + }, +}; + +static int spdif_dit_probe(struct platform_device *pdev) +{ + return snd_soc_register_codec(&pdev->dev, &soc_codec_spdif_dit, + &dit_stub_dai, 1); +} + +static int spdif_dit_remove(struct platform_device *pdev) +{ + snd_soc_unregister_codec(&pdev->dev); + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id spdif_dit_dt_ids[] = { + { .compatible = "te,te-audio", }, + { } +}; +MODULE_DEVICE_TABLE(of, spdif_dit_dt_ids); +#endif + +static struct platform_driver spdif_dit_driver = { + .probe = spdif_dit_probe, + .remove = spdif_dit_remove, + .driver = { + .name = DRV_NAME, + .of_match_table = of_match_ptr(spdif_dit_dt_ids), + }, +}; + +module_platform_driver(spdif_dit_driver); + +MODULE_AUTHOR("Steve Chen "); +MODULE_DESCRIPTION("SPDIF dummy codec driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRV_NAME); + diff --git a/zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_io_report.txt b/zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_io_report.txt new file mode 100644 index 0000000..57bed7b --- /dev/null +++ b/zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_io_report.txt @@ -0,0 +1,267 @@ +Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2017.1 (win64) Build 1846317 Fri Apr 14 18:55:03 MDT 2017 +| Date : Tue Jun 13 10:05:17 2017 +| Host : W8-64-02 running 64-bit major release (build 9200) +| Command : report_io -force -file B:/Design/cores/2017.1/design/TE0726/zynqberrydemo3/vivado/zynqberrydemo3.runs/impl_1/zynqberrydemo3_io_report.txt -format text +| Design : zsys_wrapper +| Device : xc7z007s +| Speed File : -1 +| Package : clg225 +| Package Version : FINAL 2012-11-02 +| Package Pin Delay Version : VERS. 2.0 2012-11-02 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +IO Information + +Table of Contents +----------------- +1. Summary +2. IO Assignments by Package Pin + +1. Summary +---------- + ++---------------+ +| Total User IO | ++---------------+ +| 130 | ++---------------+ + + +2. IO Assignments by Package Pin +-------------------------------- + ++------------+-------------------+------------+-------------------------+-------------+-------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +| Pin Number | Signal Name | Bank Type | Pin Name | Use | IO Standard | IO Bank | Drive (mA) | Slew | On-Chip Termination | Off-Chip Termination | Voltage | Constraint | Pull Type | DQS Bias | Vref | Signal Integrity | ++------------+-------------------+------------+-------------------------+-------------+-------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +| A1 | | | GND | GND | | | | | | | 0.0 | | | | | | +| A2 | DDR_dq[1] | | PS_DDR_DQ1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A3 | DDR_dq[7] | | PS_DDR_DQ7_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A4 | DDR_dq[5] | | PS_DDR_DQ5_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A5 | FIXED_IO_mio[1] | | PS_MIO1_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A6 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | +| A7 | FIXED_IO_mio[3] | | PS_MIO3_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A8 | FIXED_IO_mio[2] | | PS_MIO2_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A9 | FIXED_IO_mio[5] | | PS_MIO5_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A10 | FIXED_IO_mio[6] | | PS_MIO6_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A11 | | | GND | GND | | | | | | | 0.0 | | | | | | +| A12 | FIXED_IO_mio[30] | | PS_MIO52_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A13 | FIXED_IO_mio[26] | | PS_MIO38_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A14 | FIXED_IO_mio[23] | | PS_MIO35_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| A15 | FIXED_IO_mio[16] | | PS_MIO28_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B1 | DDR_dm[0] | | PS_DDR_DM0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B2 | DDR_dqs_n[0] | | PS_DDR_DQS_N0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| B4 | DDR_dq[4] | | PS_DDR_DQ4_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B5 | FIXED_IO_mio[9] | | PS_MIO9_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B6 | FIXED_IO_mio[8] | | PS_MIO8_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B7 | FIXED_IO_mio[12] | | PS_MIO12_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B8 | | | GND | GND | | | | | | | 0.0 | | | | | | +| B9 | FIXED_IO_mio[14] | | PS_MIO14_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B10 | FIXED_IO_mio[11] | | PS_MIO11_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B11 | FIXED_IO_ps_srstb | | PS_SRST_B_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B12 | FIXED_IO_mio[28] | | PS_MIO48_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B13 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| B14 | FIXED_IO_mio[24] | | PS_MIO36_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| B15 | FIXED_IO_mio[18] | | PS_MIO30_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C1 | DDR_dq[3] | | PS_DDR_DQ3_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C2 | DDR_dqs_p[0] | | PS_DDR_DQS_P0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C3 | DDR_dq[6] | | PS_DDR_DQ6_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C4 | DDR_dq[2] | | PS_DDR_DQ2_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| C6 | FIXED_IO_mio[13] | | PS_MIO13_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C7 | FIXED_IO_ps_clk | | PS_CLK_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C8 | FIXED_IO_mio[4] | | PS_MIO4_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C9 | FIXED_IO_ps_porb | | PS_POR_B_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C10 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| C11 | FIXED_IO_mio[21] | | PS_MIO33_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C12 | FIXED_IO_mio[19] | | PS_MIO31_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C13 | FIXED_IO_mio[31] | | PS_MIO53_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C14 | FIXED_IO_mio[25] | | PS_MIO37_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| C15 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D1 | DDR_dq[9] | | PS_DDR_DQ9_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D2 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D3 | DDR_dm[1] | | PS_DDR_DM1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D4 | DDR_dq[0] | | PS_DDR_DQ0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D5 | | Dedicated | INIT_B_0 | Config | | 0 | | | | | | | | | | | +| D6 | FIXED_IO_mio[10] | | PS_MIO10_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D7 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | +| D8 | FIXED_IO_mio[0] | | PS_MIO0_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D9 | FIXED_IO_mio[7] | | PS_MIO7_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D10 | FIXED_IO_mio[15] | | PS_MIO15_500 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D11 | FIXED_IO_mio[17] | | PS_MIO29_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D12 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D13 | FIXED_IO_mio[29] | | PS_MIO49_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D14 | FIXED_IO_mio[27] | | PS_MIO39_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| D15 | FIXED_IO_mio[22] | | PS_MIO34_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| E1 | DDR_dq[8] | | PS_DDR_DQ8_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| E2 | DDR_dq[10] | | PS_DDR_DQ10_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| E3 | DDR_dq[11] | | PS_DDR_DQ11_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| E4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| E5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E6 | | Dedicated | VCCBATT_0 | Config | | 0 | | | | | | | | | | | +| E7 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E8 | | | RSVDGND | GND | | | | | | | | | | | | | +| E9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| E11 | | High Range | IO_L2P_T0_AD8P_35 | User IO | | 35 | | | | | | | | | | | +| E12 | | High Range | IO_L2N_T0_AD8N_35 | User IO | | 35 | | | | | | | | | | | +| E13 | | High Range | IO_L1N_T0_AD0N_35 | User IO | | 35 | | | | | | | | | | | +| E14 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| E15 | FIXED_IO_mio[20] | | PS_MIO32_501 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| F1 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| F2 | DDR_dqs_n[1] | | PS_DDR_DQS_N1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| F3 | DDR_dq[12] | | PS_DDR_DQ12_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| F4 | | | PS_DDR_VREF0_502 | PSS IO | | | | | | | | | | | | | +| F5 | | | VCCPLL | PSS VCCPLL | | | | | | | | | | | | | +| F6 | | Dedicated | CFGBVS_0 | Config | | 0 | | | | | 3.30 | | | | | | +| F7 | | Dedicated | VCCADC_0 | XADC | | 0 | | | | | | | | | | | +| F8 | | Dedicated | GNDADC_0 | XADC | | 0 | | | | | | | | | | | +| F9 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| F10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| F11 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | +| F12 | | High Range | IO_L1P_T0_AD0P_35 | User IO | | 35 | | | | | | | | | | | +| F13 | | High Range | IO_L3P_T0_DQS_AD1P_35 | User IO | | 35 | | | | | | | | | | | +| F14 | | High Range | IO_L3N_T0_DQS_AD1N_35 | User IO | | 35 | | | | | | | | | | | +| F15 | | High Range | IO_L5N_T0_AD9N_35 | User IO | | 35 | | | | | | | | | | | +| G1 | DDR_dq[13] | | PS_DDR_DQ13_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| G2 | DDR_dqs_p[1] | | PS_DDR_DQS_P1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| G3 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G4 | | | RSVDVCC1 | Reserved | | | | | | | | | | | | | +| G5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G6 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| G7 | Vp_Vn_v_p | Dedicated | VP_0 | INPUT | LVCMOS18* | 0 | | | | NONE | | UNFIXED | | | | NONE | +| G8 | | Dedicated | VREFN_0 | XADC | | 0 | | | | | | | | | | | +| G9 | | Dedicated | TCK_0 | Config | | 0 | | | | | | | | | | | +| G10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| G11 | gpio_1_tri_io[13] | High Range | IO_L1P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| G12 | gpio_1_tri_io[23] | High Range | IO_L2P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| G13 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G14 | | High Range | IO_L3P_T0_DQS_PUDC_B_34 | User IO | | 34 | | | | | | | | | | | +| G15 | | High Range | IO_L5P_T0_AD9P_35 | User IO | | 35 | | | | | | | | | | | +| H1 | DDR_dq[14] | | PS_DDR_DQ14_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| H2 | DDR_dq[15] | | PS_DDR_DQ15_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| H3 | FIXED_IO_ddr_vrp | | PS_DDR_VRP_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| H4 | | | RSVDVCC3 | Reserved | | | | | | | | | | | | | +| H5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| H6 | | | GND | GND | | | | | | | 0.0 | | | | | | +| H7 | | Dedicated | VREFP_0 | XADC | | 0 | | | | | | | | | | | +| H8 | Vp_Vn_v_n | Dedicated | VN_0 | INPUT | LVCMOS18* | 0 | | | | NONE | | UNFIXED | | | | NONE | +| H9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| H10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| H11 | gpio_1_tri_io[14] | High Range | IO_L6P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H12 | gpio_1_tri_io[2] | High Range | IO_L1N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H13 | gpio_1_tri_io[18] | High Range | IO_L2N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H14 | gpio_1_tri_io[8] | High Range | IO_L3N_T0_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H15 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | +| J1 | DDR_addr[10] | | PS_DDR_A10_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| J2 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| J3 | FIXED_IO_ddr_vrn | | PS_DDR_VRN_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| J4 | | | RSVDVCC2 | Reserved | | | | | | | | | | | | | +| J5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| J6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | +| J7 | | Dedicated | DXP_0 | Temp Sensor | | 0 | | | | | | | | | | | +| J8 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| J9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| J10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| J11 | gpio_1_tri_io[19] | High Range | IO_L6N_T0_VREF_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J12 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| J13 | gpio_1_tri_io[7] | High Range | IO_L5P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J14 | gpio_1_tri_io[1] | High Range | IO_L5N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J15 | gpio_1_tri_io[9] | High Range | IO_L4P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K1 | DDR_addr[14] | | PS_DDR_A14_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| K2 | DDR_addr[13] | | PS_DDR_A13_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| K3 | DDR_odt | | PS_DDR_ODT_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| K4 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| K6 | | Dedicated | PROGRAM_B_0 | Config | | 0 | | | | | | | | | | | +| K7 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K8 | | Dedicated | VCCO_0 | VCCO | | 0 | | | | | 3.30 | | | | | | +| K9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| K10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K11 | gpio_1_tri_io[20] | High Range | IO_L11P_T1_SRCC_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K12 | | High Range | IO_L11N_T1_SRCC_34 | User IO | | 34 | | | | | | | | | | | +| K13 | gpio_1_tri_io[21] | High Range | IO_L10P_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K14 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K15 | gpio_1_tri_io[0] | High Range | IO_L4N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L1 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L2 | DDR_addr[11] | | PS_DDR_A11_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| L3 | DDR_cke | | PS_DDR_CKE_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| L4 | DDR_reset_n | | PS_DDR_DRST_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| L5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | +| L7 | | Dedicated | TDI_0 | Config | | 0 | | | | | | | | | | | +| L8 | | Dedicated | TDO_0 | Config | | 0 | | | | | | | | | | | +| L9 | | Dedicated | TMS_0 | Config | | 0 | | | | | | | | | | | +| L10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| L11 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L12 | gpio_1_tri_io[22] | High Range | IO_L12P_T1_MRCC_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L13 | gpio_1_tri_io[12] | High Range | IO_L10N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L14 | gpio_1_tri_io[5] | High Range | IO_L9P_T1_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L15 | gpio_1_tri_io[6] | High Range | IO_L8P_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M1 | DDR_addr[2] | | PS_DDR_A2_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M2 | DDR_addr[12] | | PS_DDR_A12_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| M4 | DDR_addr[3] | | PS_DDR_A3_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M5 | DDR_addr[7] | | PS_DDR_A7_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M6 | DDR_ba[0] | | PS_DDR_BA0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| M7 | | Dedicated | DONE_0 | Config | | 0 | | | | | | | | | | | +| M8 | | | GND | GND | | | | | | | 0.0 | | | | | | +| M9 | csi_d_lp_n[0] | High Range | IO_L19P_T3_34 | INPUT | HSUL_12 | 34 | | | | NONE | | FIXED | PULLDOWN | | Internal | NONE | +| M10 | csi_d_p[0] | High Range | IO_L21P_T3_DQS_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| M11 | csi_d_n[0] | High Range | IO_L21N_T3_DQS_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| M12 | | High Range | IO_L12N_T1_MRCC_34 | User IO | | 34 | | | | | | | | | | | +| M13 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| M14 | gpio_1_tri_io[16] | High Range | IO_L9N_T1_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M15 | gpio_1_tri_io[10] | High Range | IO_L8N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N1 | DDR_addr[1] | | PS_DDR_A1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N2 | DDR_ck_n | | PS_DDR_CKN_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N3 | DDR_ck_p | | PS_DDR_CKP_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N4 | DDR_addr[9] | | PS_DDR_A9_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| N6 | DDR_ba[2] | | PS_DDR_BA2_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| N7 | PWM_L | High Range | IO_L22P_T3_34 | OUTPUT | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N8 | PWM_R | High Range | IO_L22N_T3_34 | OUTPUT | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N9 | csi_d_lp_p[0] | High Range | IO_L19N_T3_VREF_34 | INPUT | HSUL_12 | 34 | | | | NONE | | FIXED | PULLDOWN | | Internal | NONE | +| N10 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| N11 | csi_c_clk_p | High Range | IO_L13P_T2_MRCC_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| N12 | csi_c_clk_n | High Range | IO_L13N_T2_MRCC_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| N13 | | High Range | IO_L7P_T1_34 | User IO | | 34 | | | | | | | | | | | +| N14 | gpio_1_tri_io[3] | High Range | IO_L7N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N15 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P1 | DDR_addr[0] | | PS_DDR_A0_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P2 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P3 | DDR_addr[4] | | PS_DDR_A4_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P4 | DDR_addr[5] | | PS_DDR_A5_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P5 | DDR_addr[6] | | PS_DDR_A6_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P6 | DDR_addr[8] | | PS_DDR_A8_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| P7 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| P8 | hdmi_data_p[0] | High Range | IO_L23P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P9 | hdmi_data_n[0] | High Range | IO_L23N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P10 | hdmi_data_p[1] | High Range | IO_L24P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P11 | hdmi_data_p[2] | High Range | IO_L16P_T2_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P12 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P13 | csi_d_p[1] | High Range | IO_L18P_T2_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| P14 | csi_d_n[1] | High Range | IO_L18N_T2_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| P15 | gpio_1_tri_io[17] | High Range | IO_L15P_T2_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R1 | DDR_ba[1] | | PS_DDR_BA1_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R2 | DDR_cs_n | | PS_DDR_CS_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R3 | DDR_we_n | | PS_DDR_WE_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| R5 | DDR_cas_n | | PS_DDR_CAS_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R6 | DDR_ras_n | | PS_DDR_RAS_B_502 | BIDIR | LVCMOS18* | | 12 | SLOW | | FP_VTT_50 | | UNFIXED | | | | NONE | +| R7 | hdmi_clk_p | High Range | IO_L20P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R8 | hdmi_clk_n | High Range | IO_L20N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| R10 | hdmi_data_n[1] | High Range | IO_L24N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R11 | hdmi_data_n[2] | High Range | IO_L16N_T2_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R12 | gpio_1_tri_io[15] | High Range | IO_L17P_T2_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R13 | gpio_1_tri_io[11] | High Range | IO_L17N_T2_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R14 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| R15 | gpio_1_tri_io[4] | High Range | IO_L15N_T2_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | ++------------+-------------------+------------+-------------------------+-------------+-------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +* Default value +** Special VCCO requirements may apply. Please consult the device family datasheet for specific guideline on VCCO requirements. + + diff --git a/zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_io_report.xdc b/zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_io_report.xdc new file mode 100644 index 0000000..1bc805c --- /dev/null +++ b/zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_io_report.xdc @@ -0,0 +1,535 @@ +set_property DIRECTION IN [get_ports {csi_d_lp_p[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_p[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_p[0]}] +set_property DIRECTION IN [get_ports {csi_d_n[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_n[1]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_n[1]}] +set_property DIRECTION IN [get_ports {csi_d_n[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_n[0]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_n[0]}] +set_property DIRECTION IN [get_ports {csi_d_p[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[1]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_p[1]}] +set_property DIRECTION IN [get_ports {csi_d_p[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[0]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_p[0]}] +set_property DIRECTION IN [get_ports {csi_d_lp_n[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_n[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_n[0]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[2]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[2]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[1]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[1]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[0]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[0]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[2]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[2]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[1]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[1]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[0]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[0]}] +set_property DIRECTION OUT [get_ports hdmi_clk_p] +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_p] +set_property DIRECTION OUT [get_ports hdmi_clk_n] +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_n] +set_property DIRECTION IN [get_ports csi_c_clk_p] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_p] +set_property DIFF_TERM FALSE [get_ports csi_c_clk_p] +set_property DIRECTION IN [get_ports csi_c_clk_n] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_n] +set_property DIFF_TERM FALSE [get_ports csi_c_clk_n] +set_property DIRECTION IN [get_ports Vp_Vn_v_p] +set_property DIRECTION IN [get_ports Vp_Vn_v_n] +set_property DIRECTION OUT [get_ports PWM_R] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_R] +set_property DRIVE 12 [get_ports PWM_R] +set_property SLEW SLOW [get_ports PWM_R] +set_property DIRECTION OUT [get_ports PWM_L] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_L] +set_property DRIVE 12 [get_ports PWM_L] +set_property SLEW SLOW [get_ports PWM_L] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[23]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[23]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[23]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[23]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[22]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[22]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[22]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[22]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[21]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[21]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[21]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[21]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[20]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[20]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[20]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[20]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[19]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[19]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[19]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[19]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[18]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[18]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[18]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[18]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[17]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[17]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[17]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[17]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[16]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[16]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[16]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[16]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[15]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[15]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[15]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[15]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[14]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[14]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[14]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[13]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[13]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[13]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[12]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[12]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[12]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[11]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[11]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[11]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[10]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[10]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[10]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[9]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[9]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[9]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[8]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[8]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[8]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[7]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[7]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[7]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[6]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[6]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[6]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[5]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[5]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[5]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[4]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[4]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[4]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[3]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[3]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[3]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[2]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[2]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[2]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[1]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[1]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[1]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[0]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[0]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[0]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[31]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[31]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[31]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[31]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[30]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[30]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[30]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[30]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[29]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[29]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[29]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[29]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[28]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[28]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[28]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[28]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[27]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[27]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[27]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[27]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[26]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[26]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[26]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[26]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[25]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[25]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[25]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[25]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[24]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[24]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[24]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[24]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[23]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[23]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[23]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[23]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[22]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[22]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[22]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[22]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[21]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[21]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[21]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[21]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[20]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[20]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[20]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[20]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[19]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[19]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[19]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[19]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[18]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[18]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[18]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[18]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[17]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[17]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[17]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[17]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[16]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[16]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[16]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[16]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[15]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[15]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[15]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[15]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[14]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[14]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[14]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[14]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[13]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[13]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[13]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[13]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[12]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[12]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[12]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[12]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[11]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[11]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[11]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[11]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[10]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[10]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[10]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[10]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[9]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[9]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[9]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[9]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[8]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[8]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[8]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[8]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[7]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[7]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[7]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[7]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[6]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[6]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[6]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[6]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[5]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[5]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[5]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[5]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[4]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[4]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[4]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[4]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[3]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[3]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[3]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[2]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[2]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[2]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[1]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[1]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[1]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {FIXED_IO_mio[0]}] +set_property DRIVE 12 [get_ports {FIXED_IO_mio[0]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[0]}] +set_property DIRECTION INOUT [get_ports FIXED_IO_ddr_vrn] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ddr_vrn] +set_property DRIVE 12 [get_ports FIXED_IO_ddr_vrn] +set_property SLEW SLOW [get_ports FIXED_IO_ddr_vrn] +set_property DIRECTION INOUT [get_ports FIXED_IO_ddr_vrp] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ddr_vrp] +set_property DRIVE 12 [get_ports FIXED_IO_ddr_vrp] +set_property SLEW SLOW [get_ports FIXED_IO_ddr_vrp] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_clk] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ps_clk] +set_property DRIVE 12 [get_ports FIXED_IO_ps_clk] +set_property SLEW SLOW [get_ports FIXED_IO_ps_clk] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_porb] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ps_porb] +set_property DRIVE 12 [get_ports FIXED_IO_ps_porb] +set_property SLEW SLOW [get_ports FIXED_IO_ps_porb] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_srstb] +set_property IOSTANDARD LVCMOS18 [get_ports FIXED_IO_ps_srstb] +set_property DRIVE 12 [get_ports FIXED_IO_ps_srstb] +set_property SLEW SLOW [get_ports FIXED_IO_ps_srstb] +set_property DIRECTION INOUT [get_ports {DDR_dqs_p[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dqs_p[1]}] +set_property DRIVE 12 [get_ports {DDR_dqs_p[1]}] +set_property SLEW SLOW [get_ports {DDR_dqs_p[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_p[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dqs_p[0]}] +set_property DRIVE 12 [get_ports {DDR_dqs_p[0]}] +set_property SLEW SLOW [get_ports {DDR_dqs_p[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_n[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dqs_n[1]}] +set_property DRIVE 12 [get_ports {DDR_dqs_n[1]}] +set_property SLEW SLOW [get_ports {DDR_dqs_n[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_n[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dqs_n[0]}] +set_property DRIVE 12 [get_ports {DDR_dqs_n[0]}] +set_property SLEW SLOW [get_ports {DDR_dqs_n[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[15]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[15]}] +set_property DRIVE 12 [get_ports {DDR_dq[15]}] +set_property SLEW SLOW [get_ports {DDR_dq[15]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[14]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[14]}] +set_property DRIVE 12 [get_ports {DDR_dq[14]}] +set_property SLEW SLOW [get_ports {DDR_dq[14]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[13]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[13]}] +set_property DRIVE 12 [get_ports {DDR_dq[13]}] +set_property SLEW SLOW [get_ports {DDR_dq[13]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[12]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[12]}] +set_property DRIVE 12 [get_ports {DDR_dq[12]}] +set_property SLEW SLOW [get_ports {DDR_dq[12]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[11]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[11]}] +set_property DRIVE 12 [get_ports {DDR_dq[11]}] +set_property SLEW SLOW [get_ports {DDR_dq[11]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[10]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[10]}] +set_property DRIVE 12 [get_ports {DDR_dq[10]}] +set_property SLEW SLOW [get_ports {DDR_dq[10]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[9]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[9]}] +set_property DRIVE 12 [get_ports {DDR_dq[9]}] +set_property SLEW SLOW [get_ports {DDR_dq[9]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[8]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[8]}] +set_property DRIVE 12 [get_ports {DDR_dq[8]}] +set_property SLEW SLOW [get_ports {DDR_dq[8]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[7]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[7]}] +set_property DRIVE 12 [get_ports {DDR_dq[7]}] +set_property SLEW SLOW [get_ports {DDR_dq[7]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[6]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[6]}] +set_property DRIVE 12 [get_ports {DDR_dq[6]}] +set_property SLEW SLOW [get_ports {DDR_dq[6]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[5]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[5]}] +set_property DRIVE 12 [get_ports {DDR_dq[5]}] +set_property SLEW SLOW [get_ports {DDR_dq[5]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[4]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[4]}] +set_property DRIVE 12 [get_ports {DDR_dq[4]}] +set_property SLEW SLOW [get_ports {DDR_dq[4]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[3]}] +set_property DRIVE 12 [get_ports {DDR_dq[3]}] +set_property SLEW SLOW [get_ports {DDR_dq[3]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[2]}] +set_property DRIVE 12 [get_ports {DDR_dq[2]}] +set_property SLEW SLOW [get_ports {DDR_dq[2]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[1]}] +set_property DRIVE 12 [get_ports {DDR_dq[1]}] +set_property SLEW SLOW [get_ports {DDR_dq[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dq[0]}] +set_property DRIVE 12 [get_ports {DDR_dq[0]}] +set_property SLEW SLOW [get_ports {DDR_dq[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dm[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dm[1]}] +set_property DRIVE 12 [get_ports {DDR_dm[1]}] +set_property SLEW SLOW [get_ports {DDR_dm[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dm[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_dm[0]}] +set_property DRIVE 12 [get_ports {DDR_dm[0]}] +set_property SLEW SLOW [get_ports {DDR_dm[0]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_ba[2]}] +set_property DRIVE 12 [get_ports {DDR_ba[2]}] +set_property SLEW SLOW [get_ports {DDR_ba[2]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_ba[1]}] +set_property DRIVE 12 [get_ports {DDR_ba[1]}] +set_property SLEW SLOW [get_ports {DDR_ba[1]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_ba[0]}] +set_property DRIVE 12 [get_ports {DDR_ba[0]}] +set_property SLEW SLOW [get_ports {DDR_ba[0]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[14]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[14]}] +set_property DRIVE 12 [get_ports {DDR_addr[14]}] +set_property SLEW SLOW [get_ports {DDR_addr[14]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[13]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[13]}] +set_property DRIVE 12 [get_ports {DDR_addr[13]}] +set_property SLEW SLOW [get_ports {DDR_addr[13]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[12]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[12]}] +set_property DRIVE 12 [get_ports {DDR_addr[12]}] +set_property SLEW SLOW [get_ports {DDR_addr[12]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[11]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[11]}] +set_property DRIVE 12 [get_ports {DDR_addr[11]}] +set_property SLEW SLOW [get_ports {DDR_addr[11]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[10]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[10]}] +set_property DRIVE 12 [get_ports {DDR_addr[10]}] +set_property SLEW SLOW [get_ports {DDR_addr[10]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[9]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[9]}] +set_property DRIVE 12 [get_ports {DDR_addr[9]}] +set_property SLEW SLOW [get_ports {DDR_addr[9]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[8]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[8]}] +set_property DRIVE 12 [get_ports {DDR_addr[8]}] +set_property SLEW SLOW [get_ports {DDR_addr[8]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[7]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[7]}] +set_property DRIVE 12 [get_ports {DDR_addr[7]}] +set_property SLEW SLOW [get_ports {DDR_addr[7]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[6]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[6]}] +set_property DRIVE 12 [get_ports {DDR_addr[6]}] +set_property SLEW SLOW [get_ports {DDR_addr[6]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[5]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[5]}] +set_property DRIVE 12 [get_ports {DDR_addr[5]}] +set_property SLEW SLOW [get_ports {DDR_addr[5]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[4]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[4]}] +set_property DRIVE 12 [get_ports {DDR_addr[4]}] +set_property SLEW SLOW [get_ports {DDR_addr[4]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[3]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[3]}] +set_property DRIVE 12 [get_ports {DDR_addr[3]}] +set_property SLEW SLOW [get_ports {DDR_addr[3]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[2]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[2]}] +set_property DRIVE 12 [get_ports {DDR_addr[2]}] +set_property SLEW SLOW [get_ports {DDR_addr[2]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[1]}] +set_property DRIVE 12 [get_ports {DDR_addr[1]}] +set_property SLEW SLOW [get_ports {DDR_addr[1]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[0]}] +set_property IOSTANDARD LVCMOS18 [get_ports {DDR_addr[0]}] +set_property DRIVE 12 [get_ports {DDR_addr[0]}] +set_property SLEW SLOW [get_ports {DDR_addr[0]}] +set_property DIRECTION INOUT [get_ports DDR_cas_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_cas_n] +set_property DRIVE 12 [get_ports DDR_cas_n] +set_property SLEW SLOW [get_ports DDR_cas_n] +set_property DIRECTION INOUT [get_ports DDR_ck_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_ck_n] +set_property DRIVE 12 [get_ports DDR_ck_n] +set_property SLEW SLOW [get_ports DDR_ck_n] +set_property DIRECTION INOUT [get_ports DDR_ck_p] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_ck_p] +set_property DRIVE 12 [get_ports DDR_ck_p] +set_property SLEW SLOW [get_ports DDR_ck_p] +set_property DIRECTION INOUT [get_ports DDR_cke] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_cke] +set_property DRIVE 12 [get_ports DDR_cke] +set_property SLEW SLOW [get_ports DDR_cke] +set_property DIRECTION INOUT [get_ports DDR_cs_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_cs_n] +set_property DRIVE 12 [get_ports DDR_cs_n] +set_property SLEW SLOW [get_ports DDR_cs_n] +set_property DIRECTION INOUT [get_ports DDR_odt] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_odt] +set_property DRIVE 12 [get_ports DDR_odt] +set_property SLEW SLOW [get_ports DDR_odt] +set_property DIRECTION INOUT [get_ports DDR_ras_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_ras_n] +set_property DRIVE 12 [get_ports DDR_ras_n] +set_property SLEW SLOW [get_ports DDR_ras_n] +set_property DIRECTION INOUT [get_ports DDR_reset_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_reset_n] +set_property DRIVE 12 [get_ports DDR_reset_n] +set_property SLEW SLOW [get_ports DDR_reset_n] +set_property DIRECTION INOUT [get_ports DDR_we_n] +set_property IOSTANDARD LVCMOS18 [get_ports DDR_we_n] +set_property DRIVE 12 [get_ports DDR_we_n] +set_property SLEW SLOW [get_ports DDR_we_n] +set_property PACKAGE_PIN N12 [get_ports csi_c_clk_n] +set_property PACKAGE_PIN N11 [get_ports csi_c_clk_p] +set_property PACKAGE_PIN M9 [get_ports {csi_d_lp_n[0]}] +set_property PACKAGE_PIN N9 [get_ports {csi_d_lp_p[0]}] +set_property PACKAGE_PIN M10 [get_ports {csi_d_p[0]}] +set_property PACKAGE_PIN M11 [get_ports {csi_d_n[0]}] +set_property PACKAGE_PIN P14 [get_ports {csi_d_n[1]}] +set_property PACKAGE_PIN P13 [get_ports {csi_d_p[1]}] +set_property INTERNAL_VREF 0.6 [get_iobanks 34] +set_property PACKAGE_PIN R8 [get_ports hdmi_clk_n] +set_property PACKAGE_PIN R7 [get_ports hdmi_clk_p] +set_property PACKAGE_PIN P8 [get_ports {hdmi_data_p[0]}] +set_property PACKAGE_PIN P9 [get_ports {hdmi_data_n[0]}] +set_property PACKAGE_PIN P10 [get_ports {hdmi_data_p[1]}] +set_property PACKAGE_PIN R10 [get_ports {hdmi_data_n[1]}] +set_property PACKAGE_PIN R11 [get_ports {hdmi_data_n[2]}] +set_property PACKAGE_PIN P11 [get_ports {hdmi_data_p[2]}] +set_property PACKAGE_PIN K15 [get_ports {gpio_1_tri_io[0]}] +set_property PACKAGE_PIN J14 [get_ports {gpio_1_tri_io[1]}] +set_property PACKAGE_PIN H12 [get_ports {gpio_1_tri_io[2]}] +set_property PACKAGE_PIN N14 [get_ports {gpio_1_tri_io[3]}] +set_property PACKAGE_PIN R15 [get_ports {gpio_1_tri_io[4]}] +set_property PACKAGE_PIN L14 [get_ports {gpio_1_tri_io[5]}] +set_property PACKAGE_PIN L15 [get_ports {gpio_1_tri_io[6]}] +set_property PACKAGE_PIN J13 [get_ports {gpio_1_tri_io[7]}] +set_property PACKAGE_PIN H14 [get_ports {gpio_1_tri_io[8]}] +set_property PACKAGE_PIN J15 [get_ports {gpio_1_tri_io[9]}] +set_property PACKAGE_PIN M15 [get_ports {gpio_1_tri_io[10]}] +set_property PACKAGE_PIN R13 [get_ports {gpio_1_tri_io[11]}] +set_property PACKAGE_PIN L13 [get_ports {gpio_1_tri_io[12]}] +set_property PACKAGE_PIN G11 [get_ports {gpio_1_tri_io[13]}] +set_property PACKAGE_PIN H11 [get_ports {gpio_1_tri_io[14]}] +set_property PACKAGE_PIN R12 [get_ports {gpio_1_tri_io[15]}] +set_property PACKAGE_PIN M14 [get_ports {gpio_1_tri_io[16]}] +set_property PACKAGE_PIN P15 [get_ports {gpio_1_tri_io[17]}] +set_property PACKAGE_PIN H13 [get_ports {gpio_1_tri_io[18]}] +set_property PACKAGE_PIN J11 [get_ports {gpio_1_tri_io[19]}] +set_property PACKAGE_PIN K11 [get_ports {gpio_1_tri_io[20]}] +set_property PACKAGE_PIN K13 [get_ports {gpio_1_tri_io[21]}] +set_property PACKAGE_PIN L12 [get_ports {gpio_1_tri_io[22]}] +set_property PACKAGE_PIN G12 [get_ports {gpio_1_tri_io[23]}] +set_property PACKAGE_PIN N8 [get_ports PWM_R] +set_property PACKAGE_PIN N7 [get_ports PWM_L] +#revert back to original instance +current_instance -quiet diff --git a/zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_ip_status_report.txt b/zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_ip_status_report.txt new file mode 100644 index 0000000..9e80c08 --- /dev/null +++ b/zynqberrydemo3/prebuilt/hardware/te0726_7s/reports/zynqberrydemo3_ip_status_report.txt @@ -0,0 +1,152 @@ +Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. +------------------------------------------------------------------------------------ +| Tool Version : Vivado v.2017.1 (win64) Build 1846317 Fri Apr 14 18:55:03 MDT 2017 +| Date : Tue Jun 13 10:05:17 2017 +| Host : W8-64-02 running 64-bit major release (build 9200) +| Command : report_ip_status +------------------------------------------------------------------------------------ + +IP Status Summary + +1. Project IP Status +-------------------- +Your project uses 29 IP. Some of these IP may have undergone changes in this release of the software. Please review the recommended actions. + +More information on the Xilinx versioning policy is available at www.xilinx.com. + +Project IP Instances ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| Instance Name | Status | Recommendation | Change | IP Name | IP | New Version | New | Original Part | +| | | | Log | | Version | | License | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_Video_IO_2_HDMI_TMDS_0_0 | Up-to-date | No changes required | Change | Video IO to HDMI | 1.0 | 1.0 (Rev. 26) | Included | xc7z007sclg225-1 | +| | | | Log not | TMDS Interface | (Rev. | | | | +| | | | available | v1.0 | 26) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_i2s_adi_0_0 | Up-to-date | No changes required | Change | AXI I2S Audio | 1.2 | 1.2 (Rev. 1) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_interconnect_0_0 | Up-to-date | No changes required | *(1) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_mem_intercon_0 | Up-to-date | No changes required | *(2) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_reg32_0_0 | Up-to-date | No changes required | Change | AXI Register Bank | 1.0 | 1.0 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | Log not | 16/16 v1.0 | (Rev. | | | | +| | | | available | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_vdma_0_0 | Up-to-date | No changes required | *(3) | AXI Video Direct | 6.3 | 6.3 | Included | xc7z007sclg225-1 | +| | | | | Memory Access | | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_vdma_0_1 | Up-to-date | No changes required | *(4) | AXI Video Direct | 6.3 | 6.3 | Included | xc7z007sclg225-1 | +| | | | | Memory Access | | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_0_0 | Up-to-date | No changes required | *(5) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_3_0 | Up-to-date | No changes required | *(6) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_4_0 | Up-to-date | No changes required | *(7) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_fb_conv_0_0 | Up-to-date | No changes required | Change | axis_fb_conv_v1.0 | 1.0 | 1.0 (Rev. 5) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 5) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_raw_demosaic_0_0 | Up-to-date | No changes required | Change | RAW Demosaic v1.0 | 1.0 | 1.0 (Rev. 20) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 20) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_raw_unpack_0_0 | Up-to-date | No changes required | Change | RAW10 Unpack v1.0 | 1.0 | 1.0 (Rev. 17) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 17) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_to_i2s_0_0 | Up-to-date | No changes required | Change | AXI4-Stream to I2S | 1.0 | 1.0 (Rev. 4) | Included | xc7z007sclg225-1 | +| | | | Log not | v1.0 | (Rev. | | | | +| | | | available | | 4) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_clk_wiz_1_0 | Up-to-date | No changes required | *(8) | Clocking Wizard | 5.4 | 5.4 | Included | xc7z007sclg225-1 | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_csi2_d_phy_rx_0_0 | Up-to-date | No changes required | Change | CSI-2 D-PHY RX | 1.0 | 1.0 (Rev. 35) | Included | xc7z007sclg225-1 | +| | | | Log not | v1_0 | (Rev. | | | | +| | | | available | | 35) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_csi_to_axis_0_0 | Up-to-date | No changes required | Change | CSI-2 to | 1.0 | 1.0 (Rev. 46) | Included | xc7z007sclg225-1 | +| | | | Log not | AXI4-Stream v1.0 | (Rev. | | | | +| | | | available | | 46) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_i2s_to_pwm_0_0 | Up-to-date | No changes required | Change | I2S to PWM v1.0 | 1.0 | 1.0 (Rev. 7) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 7) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_proc_sys_reset_0_0 | Up-to-date | No changes required | *(9) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z007sclg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_proc_sys_reset_1_0 | Up-to-date | No changes required | *(10) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z007sclg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_processing_system7_0_0 | Up-to-date | No changes required | *(11) | ZYNQ7 Processing | 5.5 | 5.5 (Rev. 5) | Included | xc7z007sclg225-1 | +| | | | | System | (Rev. | | | | +| | | | | | 5) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_processing_system7_0_axi_periph_0 | Up-to-date | No changes required | *(12) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_rst_processing_system7_0_50M_0 | Up-to-date | No changes required | *(13) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z007sclg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_v_axi4s_vid_out_0_0 | Up-to-date | No changes required | *(14) | AXI4-Stream to | 4.0 | 4.0 (Rev. 6) | Included | xc7z007sclg225-1 | +| | | | | Video Out | (Rev. | | | | +| | | | | | 6) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_v_tc_0_0 | Up-to-date | No changes required | *(15) | Video Timing | 6.1 | 6.1 (Rev. 10) | Included | xc7z007sclg225-1 | +| | | | | Controller | (Rev. | | | | +| | | | | | 10) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xadc_wiz_0_0 | Up-to-date | No changes required | *(16) | XADC Wizard | 3.3 | 3.3 (Rev. 3) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 3) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlconcat_0_0 | Up-to-date | No changes required | *(17) | Concat | 2.1 | 2.1 (Rev. 1) | Included | xc7z007sclg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlslice_0_0 | Up-to-date | No changes required | Change | Slice | 1.0 | 1.0 (Rev. 1) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlslice_1_0 | Up-to-date | No changes required | Change | Slice | 1.0 | 1.0 (Rev. 1) | Included | xc7z007sclg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +*(1) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(2) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(3) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_vdma_v6_3/doc/axi_vdma_v6_3_changelog.txt +*(4) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_vdma_v6_3/doc/axi_vdma_v6_3_changelog.txt +*(5) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(6) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(7) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(8) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/clk_wiz_v5_4/doc/clk_wiz_v5_4_changelog.txt +*(9) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(10) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(11) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/processing_system7_v5_5/doc/processing_system7_v5_5_changelog.txt +*(12) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(13) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(14) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/v_axi4s_vid_out_v4_0/doc/v_axi4s_vid_out_v4_0_changelog.txt +*(15) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/v_tc_v6_1/doc/v_tc_v6_1_changelog.txt +*(16) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/xadc_wiz_v3_3/doc/xadc_wiz_v3_3_changelog.txt +*(17) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/xlconcat_v2_1/doc/xlconcat_v2_1_changelog.txt + + diff --git a/zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_io_report.txt b/zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_io_report.txt new file mode 100644 index 0000000..6030434 --- /dev/null +++ b/zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_io_report.txt @@ -0,0 +1,267 @@ +Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Tool Version : Vivado v.2017.1 (win64) Build 1846317 Fri Apr 14 18:55:03 MDT 2017 +| Date : Wed Jun 14 17:17:24 2017 +| Host : W8-64-02 running 64-bit major release (build 9200) +| Command : report_io -force -file B:/Design/cores/2017.1/design/TE0726/zynqberrydemo3/vivado/zynqberrydemo3.runs/impl_1/zynqberrydemo3_io_report.txt -format text +| Design : zsys_wrapper +| Device : xc7z010 +| Speed File : -1 +| Package : clg225 +| Package Version : FINAL 2012-11-02 +| Package Pin Delay Version : VERS. 2.0 2012-11-02 +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +IO Information + +Table of Contents +----------------- +1. Summary +2. IO Assignments by Package Pin + +1. Summary +---------- + ++---------------+ +| Total User IO | ++---------------+ +| 130 | ++---------------+ + + +2. IO Assignments by Package Pin +-------------------------------- + ++------------+-------------------+------------+-------------------------+-------------+--------------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +| Pin Number | Signal Name | Bank Type | Pin Name | Use | IO Standard | IO Bank | Drive (mA) | Slew | On-Chip Termination | Off-Chip Termination | Voltage | Constraint | Pull Type | DQS Bias | Vref | Signal Integrity | ++------------+-------------------+------------+-------------------------+-------------+--------------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +| A1 | | | GND | GND | | | | | | | 0.0 | | | | | | +| A2 | DDR_dq[1] | | PS_DDR_DQ1_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| A3 | DDR_dq[7] | | PS_DDR_DQ7_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| A4 | DDR_dq[5] | | PS_DDR_DQ5_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| A5 | FIXED_IO_mio[1] | | PS_MIO1_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| A6 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | +| A7 | FIXED_IO_mio[3] | | PS_MIO3_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| A8 | FIXED_IO_mio[2] | | PS_MIO2_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| A9 | FIXED_IO_mio[5] | | PS_MIO5_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| A10 | FIXED_IO_mio[6] | | PS_MIO6_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| A11 | | | GND | GND | | | | | | | 0.0 | | | | | | +| A12 | FIXED_IO_mio[30] | | PS_MIO52_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| A13 | FIXED_IO_mio[26] | | PS_MIO38_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| A14 | FIXED_IO_mio[23] | | PS_MIO35_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| A15 | FIXED_IO_mio[16] | | PS_MIO28_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| B1 | DDR_dm[0] | | PS_DDR_DM0_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| B2 | DDR_dqs_n[0] | | PS_DDR_DQS_N0_502 | BIDIR | DIFF_SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| B3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| B4 | DDR_dq[4] | | PS_DDR_DQ4_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| B5 | FIXED_IO_mio[9] | | PS_MIO9_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| B6 | FIXED_IO_mio[8] | | PS_MIO8_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| B7 | FIXED_IO_mio[12] | | PS_MIO12_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| B8 | | | GND | GND | | | | | | | 0.0 | | | | | | +| B9 | FIXED_IO_mio[14] | | PS_MIO14_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| B10 | FIXED_IO_mio[11] | | PS_MIO11_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| B11 | FIXED_IO_ps_srstb | | PS_SRST_B_501 | BIDIR | LVCMOS33 | | 12 | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| B12 | FIXED_IO_mio[28] | | PS_MIO48_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| B13 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| B14 | FIXED_IO_mio[24] | | PS_MIO36_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| B15 | FIXED_IO_mio[18] | | PS_MIO30_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C1 | DDR_dq[3] | | PS_DDR_DQ3_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| C2 | DDR_dqs_p[0] | | PS_DDR_DQS_P0_502 | BIDIR | DIFF_SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| C3 | DDR_dq[6] | | PS_DDR_DQ6_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| C4 | DDR_dq[2] | | PS_DDR_DQ2_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| C5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| C6 | FIXED_IO_mio[13] | | PS_MIO13_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| C7 | FIXED_IO_ps_clk | | PS_CLK_500 | BIDIR | LVCMOS33 | | 12 | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| C8 | FIXED_IO_mio[4] | | PS_MIO4_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| C9 | FIXED_IO_ps_porb | | PS_POR_B_500 | BIDIR | LVCMOS33 | | 12 | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| C10 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| C11 | FIXED_IO_mio[21] | | PS_MIO33_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C12 | FIXED_IO_mio[19] | | PS_MIO31_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C13 | FIXED_IO_mio[31] | | PS_MIO53_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C14 | FIXED_IO_mio[25] | | PS_MIO37_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| C15 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D1 | DDR_dq[9] | | PS_DDR_DQ9_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| D2 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D3 | DDR_dm[1] | | PS_DDR_DM1_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| D4 | DDR_dq[0] | | PS_DDR_DQ0_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| D5 | | Dedicated | INIT_B_0 | Config | | 0 | | | | | | | | | | | +| D6 | FIXED_IO_mio[10] | | PS_MIO10_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| D7 | | | VCCO_MIO0_500 | VCCO | | | | | | | any** | | | | | | +| D8 | FIXED_IO_mio[0] | | PS_MIO0_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| D9 | FIXED_IO_mio[7] | | PS_MIO7_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| D10 | FIXED_IO_mio[15] | | PS_MIO15_500 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | | | | NONE | +| D11 | FIXED_IO_mio[17] | | PS_MIO29_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| D12 | | | GND | GND | | | | | | | 0.0 | | | | | | +| D13 | FIXED_IO_mio[29] | | PS_MIO49_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| D14 | FIXED_IO_mio[27] | | PS_MIO39_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| D15 | FIXED_IO_mio[22] | | PS_MIO34_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| E1 | DDR_dq[8] | | PS_DDR_DQ8_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| E2 | DDR_dq[10] | | PS_DDR_DQ10_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| E3 | DDR_dq[11] | | PS_DDR_DQ11_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| E4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| E5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E6 | | Dedicated | VCCBATT_0 | Config | | 0 | | | | | | | | | | | +| E7 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E8 | | | RSVDGND | GND | | | | | | | | | | | | | +| E9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| E10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| E11 | | High Range | IO_L2P_T0_AD8P_35 | User IO | | 35 | | | | | | | | | | | +| E12 | | High Range | IO_L2N_T0_AD8N_35 | User IO | | 35 | | | | | | | | | | | +| E13 | | High Range | IO_L1N_T0_AD0N_35 | User IO | | 35 | | | | | | | | | | | +| E14 | | | VCCO_MIO1_501 | VCCO | | | | | | | any** | | | | | | +| E15 | FIXED_IO_mio[20] | | PS_MIO32_501 | BIDIR | LVCMOS33 | | 8 | SLOW | | NONE | | FIXED | PULLUP | | | NONE | +| F1 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| F2 | DDR_dqs_n[1] | | PS_DDR_DQS_N1_502 | BIDIR | DIFF_SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| F3 | DDR_dq[12] | | PS_DDR_DQ12_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| F4 | | | PS_DDR_VREF0_502 | PSS IO | | | | | | | | | | | | | +| F5 | | | VCCPLL | PSS VCCPLL | | | | | | | | | | | | | +| F6 | | Dedicated | CFGBVS_0 | Config | | 0 | | | | | 3.30 | | | | | | +| F7 | | Dedicated | VCCADC_0 | XADC | | 0 | | | | | | | | | | | +| F8 | | Dedicated | GNDADC_0 | XADC | | 0 | | | | | | | | | | | +| F9 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| F10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| F11 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | +| F12 | | High Range | IO_L1P_T0_AD0P_35 | User IO | | 35 | | | | | | | | | | | +| F13 | | High Range | IO_L3P_T0_DQS_AD1P_35 | User IO | | 35 | | | | | | | | | | | +| F14 | | High Range | IO_L3N_T0_DQS_AD1N_35 | User IO | | 35 | | | | | | | | | | | +| F15 | | High Range | IO_L5N_T0_AD9N_35 | User IO | | 35 | | | | | | | | | | | +| G1 | DDR_dq[13] | | PS_DDR_DQ13_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| G2 | DDR_dqs_p[1] | | PS_DDR_DQS_P1_502 | BIDIR | DIFF_SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| G3 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G4 | | | RSVDVCC1 | Reserved | | | | | | | | | | | | | +| G5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G6 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| G7 | Vp_Vn_v_p | Dedicated | VP_0 | INPUT | LVCMOS18* | 0 | | | | NONE | | UNFIXED | | | | NONE | +| G8 | | Dedicated | VREFN_0 | XADC | | 0 | | | | | | | | | | | +| G9 | | Dedicated | TCK_0 | Config | | 0 | | | | | | | | | | | +| G10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| G11 | gpio_1_tri_io[13] | High Range | IO_L1P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| G12 | gpio_1_tri_io[23] | High Range | IO_L2P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| G13 | | | GND | GND | | | | | | | 0.0 | | | | | | +| G14 | | High Range | IO_L3P_T0_DQS_PUDC_B_34 | User IO | | 34 | | | | | | | | | | | +| G15 | | High Range | IO_L5P_T0_AD9P_35 | User IO | | 35 | | | | | | | | | | | +| H1 | DDR_dq[14] | | PS_DDR_DQ14_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| H2 | DDR_dq[15] | | PS_DDR_DQ15_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| H3 | FIXED_IO_ddr_vrp | | PS_DDR_VRP_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| H4 | | | RSVDVCC3 | Reserved | | | | | | | | | | | | | +| H5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| H6 | | | GND | GND | | | | | | | 0.0 | | | | | | +| H7 | | Dedicated | VREFP_0 | XADC | | 0 | | | | | | | | | | | +| H8 | Vp_Vn_v_n | Dedicated | VN_0 | INPUT | LVCMOS18* | 0 | | | | NONE | | UNFIXED | | | | NONE | +| H9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| H10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| H11 | gpio_1_tri_io[14] | High Range | IO_L6P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H12 | gpio_1_tri_io[2] | High Range | IO_L1N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H13 | gpio_1_tri_io[18] | High Range | IO_L2N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H14 | gpio_1_tri_io[8] | High Range | IO_L3N_T0_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| H15 | | High Range | VCCO_35 | VCCO | | 35 | | | | | any** | | | | | | +| J1 | DDR_addr[10] | | PS_DDR_A10_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J2 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| J3 | FIXED_IO_ddr_vrn | | PS_DDR_VRN_502 | BIDIR | SSTL135_T_DCI | | | FAST | DCI SPLIT | FP_VTT_50 | | FIXED | | | | SPLIT | +| J4 | | | RSVDVCC2 | Reserved | | | | | | | | | | | | | +| J5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| J6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | +| J7 | | Dedicated | DXP_0 | Temp Sensor | | 0 | | | | | | | | | | | +| J8 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| J9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| J10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| J11 | gpio_1_tri_io[19] | High Range | IO_L6N_T0_VREF_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J12 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| J13 | gpio_1_tri_io[7] | High Range | IO_L5P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J14 | gpio_1_tri_io[1] | High Range | IO_L5N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| J15 | gpio_1_tri_io[9] | High Range | IO_L4P_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K1 | DDR_addr[14] | | PS_DDR_A14_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K2 | DDR_addr[13] | | PS_DDR_A13_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K3 | DDR_odt | | PS_DDR_ODT_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K4 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K5 | | | VCCPINT | PSS VCCINT | | | | | | | | | | | | | +| K6 | | Dedicated | PROGRAM_B_0 | Config | | 0 | | | | | | | | | | | +| K7 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K8 | | Dedicated | VCCO_0 | VCCO | | 0 | | | | | 3.30 | | | | | | +| K9 | | | VCCAUX | VCCAUX | | | | | | | 1.80 | | | | | | +| K10 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K11 | gpio_1_tri_io[20] | High Range | IO_L11P_T1_SRCC_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K12 | | High Range | IO_L11N_T1_SRCC_34 | User IO | | 34 | | | | | | | | | | | +| K13 | gpio_1_tri_io[21] | High Range | IO_L10P_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| K14 | | | GND | GND | | | | | | | 0.0 | | | | | | +| K15 | gpio_1_tri_io[0] | High Range | IO_L4N_T0_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L1 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L2 | DDR_addr[11] | | PS_DDR_A11_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L3 | DDR_cke | | PS_DDR_CKE_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L4 | DDR_reset_n | | PS_DDR_DRST_B_502 | BIDIR | SSTL135 | | | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| L5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L6 | | | VCCPAUX | PSS VCCAUX | | | | | | | | | | | | | +| L7 | | Dedicated | TDI_0 | Config | | 0 | | | | | | | | | | | +| L8 | | Dedicated | TDO_0 | Config | | 0 | | | | | | | | | | | +| L9 | | Dedicated | TMS_0 | Config | | 0 | | | | | | | | | | | +| L10 | | | VCCINT | VCCINT | | | | | | | | | | | | | +| L11 | | | GND | GND | | | | | | | 0.0 | | | | | | +| L12 | gpio_1_tri_io[22] | High Range | IO_L12P_T1_MRCC_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L13 | gpio_1_tri_io[12] | High Range | IO_L10N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L14 | gpio_1_tri_io[5] | High Range | IO_L9P_T1_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| L15 | gpio_1_tri_io[6] | High Range | IO_L8P_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M1 | DDR_addr[2] | | PS_DDR_A2_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M2 | DDR_addr[12] | | PS_DDR_A12_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M3 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| M4 | DDR_addr[3] | | PS_DDR_A3_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M5 | DDR_addr[7] | | PS_DDR_A7_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M6 | DDR_ba[0] | | PS_DDR_BA0_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M7 | | Dedicated | DONE_0 | Config | | 0 | | | | | | | | | | | +| M8 | | | GND | GND | | | | | | | 0.0 | | | | | | +| M9 | csi_d_lp_n[0] | High Range | IO_L19P_T3_34 | INPUT | HSUL_12 | 34 | | | | NONE | | FIXED | PULLDOWN | | Internal | NONE | +| M10 | csi_d_p[0] | High Range | IO_L21P_T3_DQS_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| M11 | csi_d_n[0] | High Range | IO_L21N_T3_DQS_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| M12 | | High Range | IO_L12N_T1_MRCC_34 | User IO | | 34 | | | | | | | | | | | +| M13 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| M14 | gpio_1_tri_io[16] | High Range | IO_L9N_T1_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| M15 | gpio_1_tri_io[10] | High Range | IO_L8N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N1 | DDR_addr[1] | | PS_DDR_A1_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N2 | DDR_ck_n | | PS_DDR_CKN_502 | BIDIR | DIFF_SSTL135 | | | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| N3 | DDR_ck_p | | PS_DDR_CKP_502 | BIDIR | DIFF_SSTL135 | | | FAST | | FP_VTT_50 | | FIXED | | | | NONE | +| N4 | DDR_addr[9] | | PS_DDR_A9_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N5 | | | GND | GND | | | | | | | 0.0 | | | | | | +| N6 | DDR_ba[2] | | PS_DDR_BA2_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N7 | PWM_L | High Range | IO_L22P_T3_34 | OUTPUT | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N8 | PWM_R | High Range | IO_L22N_T3_34 | OUTPUT | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N9 | csi_d_lp_p[0] | High Range | IO_L19N_T3_VREF_34 | INPUT | HSUL_12 | 34 | | | | NONE | | FIXED | PULLDOWN | | Internal | NONE | +| N10 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| N11 | csi_c_clk_p | High Range | IO_L13P_T2_MRCC_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| N12 | csi_c_clk_n | High Range | IO_L13N_T2_MRCC_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| N13 | | High Range | IO_L7P_T1_34 | User IO | | 34 | | | | | | | | | | | +| N14 | gpio_1_tri_io[3] | High Range | IO_L7N_T1_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| N15 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P1 | DDR_addr[0] | | PS_DDR_A0_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P2 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P3 | DDR_addr[4] | | PS_DDR_A4_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P4 | DDR_addr[5] | | PS_DDR_A5_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P5 | DDR_addr[6] | | PS_DDR_A6_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P6 | DDR_addr[8] | | PS_DDR_A8_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| P7 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| P8 | hdmi_data_p[0] | High Range | IO_L23P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P9 | hdmi_data_n[0] | High Range | IO_L23N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P10 | hdmi_data_p[1] | High Range | IO_L24P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P11 | hdmi_data_p[2] | High Range | IO_L16P_T2_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| P12 | | | GND | GND | | | | | | | 0.0 | | | | | | +| P13 | csi_d_p[1] | High Range | IO_L18P_T2_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| P14 | csi_d_n[1] | High Range | IO_L18N_T2_34 | INPUT | LVDS_25 | 34 | | | | NONE | | FIXED | | | | NONE | +| P15 | gpio_1_tri_io[17] | High Range | IO_L15P_T2_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R1 | DDR_ba[1] | | PS_DDR_BA1_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R2 | DDR_cs_n | | PS_DDR_CS_B_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R3 | DDR_we_n | | PS_DDR_WE_B_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R4 | | | VCCO_DDR_502 | VCCO | | | | | | | any** | | | | | | +| R5 | DDR_cas_n | | PS_DDR_CAS_B_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R6 | DDR_ras_n | | PS_DDR_RAS_B_502 | BIDIR | SSTL135 | | | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R7 | hdmi_clk_p | High Range | IO_L20P_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R8 | hdmi_clk_n | High Range | IO_L20N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R9 | | | GND | GND | | | | | | | 0.0 | | | | | | +| R10 | hdmi_data_n[1] | High Range | IO_L24N_T3_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R11 | hdmi_data_n[2] | High Range | IO_L16N_T2_34 | OUTPUT | TMDS_33 | 34 | | | | FP_3.3_50 | | FIXED | | | | NONE | +| R12 | gpio_1_tri_io[15] | High Range | IO_L17P_T2_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R13 | gpio_1_tri_io[11] | High Range | IO_L17N_T2_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | +| R14 | | High Range | VCCO_34 | VCCO | | 34 | | | | | 3.30 | | | | | | +| R15 | gpio_1_tri_io[4] | High Range | IO_L15N_T2_DQS_34 | BIDIR | LVCMOS33 | 34 | 12 | SLOW | | FP_VTT_50 | | FIXED | | | | NONE | ++------------+-------------------+------------+-------------------------+-------------+--------------------+---------+------------+------+---------------------+----------------------+---------+------------+-----------+----------+----------+------------------+ +* Default value +** Special VCCO requirements may apply. Please consult the device family datasheet for specific guideline on VCCO requirements. + + diff --git a/zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_io_report.xdc b/zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_io_report.xdc new file mode 100644 index 0000000..bf8968b --- /dev/null +++ b/zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_io_report.xdc @@ -0,0 +1,589 @@ +set_property PACKAGE_PIN C9 [get_ports FIXED_IO_ps_porb] +set_property PACKAGE_PIN K3 [get_ports DDR_odt] +set_property PACKAGE_PIN C7 [get_ports FIXED_IO_ps_clk] +set_property PACKAGE_PIN G2 [get_ports {DDR_dqs_p[1]}] +set_property PACKAGE_PIN A12 [get_ports {FIXED_IO_mio[30]}] +set_property PACKAGE_PIN A8 [get_ports {FIXED_IO_mio[2]}] +set_property PACKAGE_PIN B12 [get_ports {FIXED_IO_mio[28]}] +set_property PACKAGE_PIN D14 [get_ports {FIXED_IO_mio[27]}] +set_property PACKAGE_PIN A13 [get_ports {FIXED_IO_mio[26]}] +set_property PACKAGE_PIN C14 [get_ports {FIXED_IO_mio[25]}] +set_property PACKAGE_PIN B14 [get_ports {FIXED_IO_mio[24]}] +set_property PACKAGE_PIN A14 [get_ports {FIXED_IO_mio[23]}] +set_property PACKAGE_PIN D15 [get_ports {FIXED_IO_mio[22]}] +set_property PACKAGE_PIN C11 [get_ports {FIXED_IO_mio[21]}] +set_property PACKAGE_PIN E15 [get_ports {FIXED_IO_mio[20]}] +set_property PACKAGE_PIN A5 [get_ports {FIXED_IO_mio[1]}] +set_property PACKAGE_PIN B15 [get_ports {FIXED_IO_mio[18]}] +set_property PACKAGE_PIN D11 [get_ports {FIXED_IO_mio[17]}] +set_property PACKAGE_PIN A15 [get_ports {FIXED_IO_mio[16]}] +set_property PACKAGE_PIN D10 [get_ports {FIXED_IO_mio[15]}] +set_property PACKAGE_PIN B9 [get_ports {FIXED_IO_mio[14]}] +set_property PACKAGE_PIN C6 [get_ports {FIXED_IO_mio[13]}] +set_property PACKAGE_PIN B7 [get_ports {FIXED_IO_mio[12]}] +set_property PACKAGE_PIN B10 [get_ports {FIXED_IO_mio[11]}] +set_property PACKAGE_PIN D6 [get_ports {FIXED_IO_mio[10]}] +set_property PACKAGE_PIN D8 [get_ports {FIXED_IO_mio[0]}] +set_property PACKAGE_PIN B6 [get_ports {FIXED_IO_mio[8]}] +set_property PACKAGE_PIN D9 [get_ports {FIXED_IO_mio[7]}] +set_property PACKAGE_PIN A10 [get_ports {FIXED_IO_mio[6]}] +set_property PACKAGE_PIN A9 [get_ports {FIXED_IO_mio[5]}] +set_property PACKAGE_PIN C8 [get_ports {FIXED_IO_mio[4]}] +set_property PACKAGE_PIN A7 [get_ports {FIXED_IO_mio[3]}] +set_property PACKAGE_PIN C13 [get_ports {FIXED_IO_mio[31]}] +set_property PACKAGE_PIN D13 [get_ports {FIXED_IO_mio[29]}] +set_property PACKAGE_PIN C12 [get_ports {FIXED_IO_mio[19]}] +set_property PACKAGE_PIN H3 [get_ports FIXED_IO_ddr_vrp] +set_property PACKAGE_PIN R6 [get_ports DDR_ras_n] +set_property PACKAGE_PIN L4 [get_ports DDR_reset_n] +set_property PACKAGE_PIN R3 [get_ports DDR_we_n] +set_property PACKAGE_PIN J3 [get_ports FIXED_IO_ddr_vrn] +set_property PACKAGE_PIN B11 [get_ports FIXED_IO_ps_srstb] +set_property PACKAGE_PIN K1 [get_ports {DDR_addr[14]}] +set_property PACKAGE_PIN N1 [get_ports {DDR_addr[1]}] +set_property PACKAGE_PIN M1 [get_ports {DDR_addr[2]}] +set_property PACKAGE_PIN M4 [get_ports {DDR_addr[3]}] +set_property PACKAGE_PIN P3 [get_ports {DDR_addr[4]}] +set_property PACKAGE_PIN P4 [get_ports {DDR_addr[5]}] +set_property PACKAGE_PIN P5 [get_ports {DDR_addr[6]}] +set_property PACKAGE_PIN M5 [get_ports {DDR_addr[7]}] +set_property PACKAGE_PIN P6 [get_ports {DDR_addr[8]}] +set_property PACKAGE_PIN P1 [get_ports {DDR_addr[0]}] +set_property PACKAGE_PIN J1 [get_ports {DDR_addr[10]}] +set_property PACKAGE_PIN L2 [get_ports {DDR_addr[11]}] +set_property PACKAGE_PIN K2 [get_ports {DDR_addr[13]}] +set_property PACKAGE_PIN M2 [get_ports {DDR_addr[12]}] +set_property PACKAGE_PIN N4 [get_ports {DDR_addr[9]}] +set_property PACKAGE_PIN M6 [get_ports {DDR_ba[0]}] +set_property PACKAGE_PIN R1 [get_ports {DDR_ba[1]}] +set_property PACKAGE_PIN N6 [get_ports {DDR_ba[2]}] +set_property PACKAGE_PIN N3 [get_ports DDR_ck_p] +set_property PACKAGE_PIN R5 [get_ports DDR_cas_n] +set_property PACKAGE_PIN N2 [get_ports DDR_ck_n] +set_property PACKAGE_PIN B5 [get_ports {FIXED_IO_mio[9]}] +set_property PACKAGE_PIN L3 [get_ports DDR_cke] +set_property PACKAGE_PIN R2 [get_ports DDR_cs_n] +set_property PACKAGE_PIN B1 [get_ports {DDR_dm[0]}] +set_property PACKAGE_PIN D3 [get_ports {DDR_dm[1]}] +set_property PACKAGE_PIN H2 [get_ports {DDR_dq[15]}] +set_property PACKAGE_PIN A2 [get_ports {DDR_dq[1]}] +set_property PACKAGE_PIN C4 [get_ports {DDR_dq[2]}] +set_property PACKAGE_PIN C1 [get_ports {DDR_dq[3]}] +set_property PACKAGE_PIN B4 [get_ports {DDR_dq[4]}] +set_property PACKAGE_PIN A4 [get_ports {DDR_dq[5]}] +set_property PACKAGE_PIN C3 [get_ports {DDR_dq[6]}] +set_property PACKAGE_PIN A3 [get_ports {DDR_dq[7]}] +set_property PACKAGE_PIN E1 [get_ports {DDR_dq[8]}] +set_property PACKAGE_PIN D4 [get_ports {DDR_dq[0]}] +set_property PACKAGE_PIN E2 [get_ports {DDR_dq[10]}] +set_property PACKAGE_PIN E3 [get_ports {DDR_dq[11]}] +set_property PACKAGE_PIN F3 [get_ports {DDR_dq[12]}] +set_property PACKAGE_PIN G1 [get_ports {DDR_dq[13]}] +set_property PACKAGE_PIN H1 [get_ports {DDR_dq[14]}] +set_property PACKAGE_PIN D1 [get_ports {DDR_dq[9]}] +set_property PACKAGE_PIN B2 [get_ports {DDR_dqs_n[0]}] +set_property PACKAGE_PIN F2 [get_ports {DDR_dqs_n[1]}] +set_property PACKAGE_PIN C2 [get_ports {DDR_dqs_p[0]}] +set_property PACKAGE_PIN N12 [get_ports csi_c_clk_n] +set_property PACKAGE_PIN N11 [get_ports csi_c_clk_p] +set_property PACKAGE_PIN M9 [get_ports {csi_d_lp_n[0]}] +set_property PACKAGE_PIN N9 [get_ports {csi_d_lp_p[0]}] +set_property PACKAGE_PIN M10 [get_ports {csi_d_p[0]}] +set_property PACKAGE_PIN M11 [get_ports {csi_d_n[0]}] +set_property PACKAGE_PIN P14 [get_ports {csi_d_n[1]}] +set_property PACKAGE_PIN P13 [get_ports {csi_d_p[1]}] +set_property INTERNAL_VREF 0.6 [get_iobanks 34] +set_property PACKAGE_PIN R8 [get_ports hdmi_clk_n] +set_property PACKAGE_PIN R7 [get_ports hdmi_clk_p] +set_property PACKAGE_PIN P8 [get_ports {hdmi_data_p[0]}] +set_property PACKAGE_PIN P9 [get_ports {hdmi_data_n[0]}] +set_property PACKAGE_PIN P10 [get_ports {hdmi_data_p[1]}] +set_property PACKAGE_PIN R10 [get_ports {hdmi_data_n[1]}] +set_property PACKAGE_PIN R11 [get_ports {hdmi_data_n[2]}] +set_property PACKAGE_PIN P11 [get_ports {hdmi_data_p[2]}] +set_property PACKAGE_PIN K15 [get_ports {gpio_1_tri_io[0]}] +set_property PACKAGE_PIN J14 [get_ports {gpio_1_tri_io[1]}] +set_property PACKAGE_PIN H12 [get_ports {gpio_1_tri_io[2]}] +set_property PACKAGE_PIN N14 [get_ports {gpio_1_tri_io[3]}] +set_property PACKAGE_PIN R15 [get_ports {gpio_1_tri_io[4]}] +set_property PACKAGE_PIN L14 [get_ports {gpio_1_tri_io[5]}] +set_property PACKAGE_PIN L15 [get_ports {gpio_1_tri_io[6]}] +set_property PACKAGE_PIN J13 [get_ports {gpio_1_tri_io[7]}] +set_property PACKAGE_PIN H14 [get_ports {gpio_1_tri_io[8]}] +set_property PACKAGE_PIN J15 [get_ports {gpio_1_tri_io[9]}] +set_property PACKAGE_PIN M15 [get_ports {gpio_1_tri_io[10]}] +set_property PACKAGE_PIN R13 [get_ports {gpio_1_tri_io[11]}] +set_property PACKAGE_PIN L13 [get_ports {gpio_1_tri_io[12]}] +set_property PACKAGE_PIN G11 [get_ports {gpio_1_tri_io[13]}] +set_property PACKAGE_PIN H11 [get_ports {gpio_1_tri_io[14]}] +set_property PACKAGE_PIN R12 [get_ports {gpio_1_tri_io[15]}] +set_property PACKAGE_PIN M14 [get_ports {gpio_1_tri_io[16]}] +set_property PACKAGE_PIN P15 [get_ports {gpio_1_tri_io[17]}] +set_property PACKAGE_PIN H13 [get_ports {gpio_1_tri_io[18]}] +set_property PACKAGE_PIN J11 [get_ports {gpio_1_tri_io[19]}] +set_property PACKAGE_PIN K11 [get_ports {gpio_1_tri_io[20]}] +set_property PACKAGE_PIN K13 [get_ports {gpio_1_tri_io[21]}] +set_property PACKAGE_PIN L12 [get_ports {gpio_1_tri_io[22]}] +set_property PACKAGE_PIN G12 [get_ports {gpio_1_tri_io[23]}] +set_property PACKAGE_PIN N8 [get_ports PWM_R] +set_property PACKAGE_PIN N7 [get_ports PWM_L] +set_property DIRECTION IN [get_ports {csi_d_lp_p[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_p[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_p[0]}] +set_property DIRECTION IN [get_ports {csi_d_n[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_n[1]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_n[1]}] +set_property DIRECTION IN [get_ports {csi_d_n[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_n[0]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_n[0]}] +set_property DIRECTION IN [get_ports {csi_d_p[1]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[1]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_p[1]}] +set_property DIRECTION IN [get_ports {csi_d_p[0]}] +set_property IOSTANDARD LVDS_25 [get_ports {csi_d_p[0]}] +set_property DIFF_TERM FALSE [get_ports {csi_d_p[0]}] +set_property DIRECTION IN [get_ports {csi_d_lp_n[0]}] +set_property IOSTANDARD HSUL_12 [get_ports {csi_d_lp_n[0]}] +set_property PULLDOWN true [get_ports {csi_d_lp_n[0]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[2]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[2]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[1]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[1]}] +set_property DIRECTION OUT [get_ports {hdmi_data_n[0]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_n[0]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[2]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[2]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[1]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[1]}] +set_property DIRECTION OUT [get_ports {hdmi_data_p[0]}] +set_property IOSTANDARD TMDS_33 [get_ports {hdmi_data_p[0]}] +set_property DIRECTION OUT [get_ports hdmi_clk_p] +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_p] +set_property DIRECTION OUT [get_ports hdmi_clk_n] +set_property IOSTANDARD TMDS_33 [get_ports hdmi_clk_n] +set_property DIRECTION IN [get_ports csi_c_clk_p] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_p] +set_property DIFF_TERM FALSE [get_ports csi_c_clk_p] +set_property DIRECTION IN [get_ports csi_c_clk_n] +set_property IOSTANDARD LVDS_25 [get_ports csi_c_clk_n] +set_property DIFF_TERM FALSE [get_ports csi_c_clk_n] +set_property DIRECTION IN [get_ports Vp_Vn_v_p] +set_property DIRECTION IN [get_ports Vp_Vn_v_n] +set_property DIRECTION OUT [get_ports PWM_R] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_R] +set_property DRIVE 12 [get_ports PWM_R] +set_property SLEW SLOW [get_ports PWM_R] +set_property DIRECTION OUT [get_ports PWM_L] +set_property IOSTANDARD LVCMOS33 [get_ports PWM_L] +set_property DRIVE 12 [get_ports PWM_L] +set_property SLEW SLOW [get_ports PWM_L] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[23]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[23]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[23]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[23]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[22]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[22]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[22]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[22]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[21]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[21]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[21]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[21]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[20]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[20]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[20]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[20]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[19]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[19]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[19]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[19]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[18]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[18]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[18]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[18]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[17]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[17]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[17]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[17]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[16]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[16]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[16]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[16]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[15]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[15]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[15]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[15]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[14]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[14]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[14]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[13]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[13]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[13]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[12]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[12]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[12]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[11]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[11]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[11]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[10]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[10]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[10]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[9]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[9]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[9]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[8]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[8]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[8]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[7]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[7]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[7]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[6]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[6]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[6]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[5]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[5]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[5]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[4]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[4]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[4]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[3]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[3]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[3]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[2]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[2]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[2]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[1]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[1]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[1]}] +set_property DIRECTION INOUT [get_ports {gpio_1_tri_io[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {gpio_1_tri_io[0]}] +set_property DRIVE 12 [get_ports {gpio_1_tri_io[0]}] +set_property SLEW SLOW [get_ports {gpio_1_tri_io[0]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[31]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[31]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[31]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[31]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[31]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[30]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[30]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[30]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[30]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[30]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[29]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[29]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[29]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[29]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[29]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[28]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[28]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[28]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[28]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[28]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[27]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[27]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[27]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[27]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[27]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[26]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[26]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[26]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[26]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[26]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[25]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[25]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[25]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[25]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[25]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[24]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[24]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[24]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[24]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[24]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[23]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[23]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[23]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[23]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[23]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[22]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[22]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[22]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[22]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[22]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[21]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[21]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[21]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[21]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[21]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[20]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[20]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[20]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[20]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[20]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[19]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[19]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[19]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[19]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[19]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[18]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[18]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[18]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[18]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[18]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[17]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[17]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[17]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[17]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[17]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[16]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[16]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[16]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[16]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[16]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[15]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[15]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[15]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[15]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[14]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[14]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[14]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[14]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[13]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[13]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[13]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[13]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[12]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[12]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[12]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[12]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[11]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[11]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[11]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[11]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[10]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[10]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[10]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[10]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[9]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[9]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[9]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[9]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[9]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[8]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[8]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[8]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[8]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[7]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[7]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[7]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[6]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[6]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[6]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[5]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[5]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[5]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[4]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[4]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[4]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[3]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[3]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[3]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[2]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[2]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[2]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[1]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[1]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[1]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[1]}] +set_property DIRECTION INOUT [get_ports {FIXED_IO_mio[0]}] +set_property IOSTANDARD LVCMOS33 [get_ports {FIXED_IO_mio[0]}] +set_property DRIVE 8 [get_ports {FIXED_IO_mio[0]}] +set_property SLEW SLOW [get_ports {FIXED_IO_mio[0]}] +set_property PULLUP true [get_ports {FIXED_IO_mio[0]}] +set_property DIRECTION INOUT [get_ports FIXED_IO_ddr_vrn] +set_property IOSTANDARD SSTL135_T_DCI [get_ports FIXED_IO_ddr_vrn] +set_property SLEW FAST [get_ports FIXED_IO_ddr_vrn] +set_property DIRECTION INOUT [get_ports FIXED_IO_ddr_vrp] +set_property IOSTANDARD SSTL135_T_DCI [get_ports FIXED_IO_ddr_vrp] +set_property SLEW FAST [get_ports FIXED_IO_ddr_vrp] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_clk] +set_property IOSTANDARD LVCMOS33 [get_ports FIXED_IO_ps_clk] +set_property DRIVE 12 [get_ports FIXED_IO_ps_clk] +set_property SLEW FAST [get_ports FIXED_IO_ps_clk] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_porb] +set_property IOSTANDARD LVCMOS33 [get_ports FIXED_IO_ps_porb] +set_property DRIVE 12 [get_ports FIXED_IO_ps_porb] +set_property SLEW FAST [get_ports FIXED_IO_ps_porb] +set_property DIRECTION INOUT [get_ports FIXED_IO_ps_srstb] +set_property IOSTANDARD LVCMOS33 [get_ports FIXED_IO_ps_srstb] +set_property DRIVE 12 [get_ports FIXED_IO_ps_srstb] +set_property SLEW FAST [get_ports FIXED_IO_ps_srstb] +set_property DIRECTION INOUT [get_ports {DDR_dqs_p[1]}] +set_property IOSTANDARD DIFF_SSTL135_T_DCI [get_ports {DDR_dqs_p[1]}] +set_property SLEW FAST [get_ports {DDR_dqs_p[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_p[0]}] +set_property IOSTANDARD DIFF_SSTL135_T_DCI [get_ports {DDR_dqs_p[0]}] +set_property SLEW FAST [get_ports {DDR_dqs_p[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_n[1]}] +set_property IOSTANDARD DIFF_SSTL135_T_DCI [get_ports {DDR_dqs_n[1]}] +set_property SLEW FAST [get_ports {DDR_dqs_n[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dqs_n[0]}] +set_property IOSTANDARD DIFF_SSTL135_T_DCI [get_ports {DDR_dqs_n[0]}] +set_property SLEW FAST [get_ports {DDR_dqs_n[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[15]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[15]}] +set_property SLEW FAST [get_ports {DDR_dq[15]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[14]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[14]}] +set_property SLEW FAST [get_ports {DDR_dq[14]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[13]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[13]}] +set_property SLEW FAST [get_ports {DDR_dq[13]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[12]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[12]}] +set_property SLEW FAST [get_ports {DDR_dq[12]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[11]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[11]}] +set_property SLEW FAST [get_ports {DDR_dq[11]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[10]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[10]}] +set_property SLEW FAST [get_ports {DDR_dq[10]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[9]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[9]}] +set_property SLEW FAST [get_ports {DDR_dq[9]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[8]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[8]}] +set_property SLEW FAST [get_ports {DDR_dq[8]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[7]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[7]}] +set_property SLEW FAST [get_ports {DDR_dq[7]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[6]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[6]}] +set_property SLEW FAST [get_ports {DDR_dq[6]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[5]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[5]}] +set_property SLEW FAST [get_ports {DDR_dq[5]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[4]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[4]}] +set_property SLEW FAST [get_ports {DDR_dq[4]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[3]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[3]}] +set_property SLEW FAST [get_ports {DDR_dq[3]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[2]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[2]}] +set_property SLEW FAST [get_ports {DDR_dq[2]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[1]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[1]}] +set_property SLEW FAST [get_ports {DDR_dq[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dq[0]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dq[0]}] +set_property SLEW FAST [get_ports {DDR_dq[0]}] +set_property DIRECTION INOUT [get_ports {DDR_dm[1]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dm[1]}] +set_property SLEW FAST [get_ports {DDR_dm[1]}] +set_property DIRECTION INOUT [get_ports {DDR_dm[0]}] +set_property IOSTANDARD SSTL135_T_DCI [get_ports {DDR_dm[0]}] +set_property SLEW FAST [get_ports {DDR_dm[0]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[2]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_ba[2]}] +set_property SLEW SLOW [get_ports {DDR_ba[2]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[1]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_ba[1]}] +set_property SLEW SLOW [get_ports {DDR_ba[1]}] +set_property DIRECTION INOUT [get_ports {DDR_ba[0]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_ba[0]}] +set_property SLEW SLOW [get_ports {DDR_ba[0]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[14]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[14]}] +set_property SLEW SLOW [get_ports {DDR_addr[14]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[13]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[13]}] +set_property SLEW SLOW [get_ports {DDR_addr[13]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[12]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[12]}] +set_property SLEW SLOW [get_ports {DDR_addr[12]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[11]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[11]}] +set_property SLEW SLOW [get_ports {DDR_addr[11]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[10]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[10]}] +set_property SLEW SLOW [get_ports {DDR_addr[10]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[9]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[9]}] +set_property SLEW SLOW [get_ports {DDR_addr[9]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[8]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[8]}] +set_property SLEW SLOW [get_ports {DDR_addr[8]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[7]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[7]}] +set_property SLEW SLOW [get_ports {DDR_addr[7]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[6]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[6]}] +set_property SLEW SLOW [get_ports {DDR_addr[6]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[5]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[5]}] +set_property SLEW SLOW [get_ports {DDR_addr[5]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[4]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[4]}] +set_property SLEW SLOW [get_ports {DDR_addr[4]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[3]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[3]}] +set_property SLEW SLOW [get_ports {DDR_addr[3]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[2]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[2]}] +set_property SLEW SLOW [get_ports {DDR_addr[2]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[1]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[1]}] +set_property SLEW SLOW [get_ports {DDR_addr[1]}] +set_property DIRECTION INOUT [get_ports {DDR_addr[0]}] +set_property IOSTANDARD SSTL135 [get_ports {DDR_addr[0]}] +set_property SLEW SLOW [get_ports {DDR_addr[0]}] +set_property DIRECTION INOUT [get_ports DDR_cas_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_cas_n] +set_property SLEW SLOW [get_ports DDR_cas_n] +set_property DIRECTION INOUT [get_ports DDR_ck_n] +set_property IOSTANDARD DIFF_SSTL135 [get_ports DDR_ck_n] +set_property SLEW FAST [get_ports DDR_ck_n] +set_property DIRECTION INOUT [get_ports DDR_ck_p] +set_property IOSTANDARD DIFF_SSTL135 [get_ports DDR_ck_p] +set_property SLEW FAST [get_ports DDR_ck_p] +set_property DIRECTION INOUT [get_ports DDR_cke] +set_property IOSTANDARD SSTL135 [get_ports DDR_cke] +set_property SLEW SLOW [get_ports DDR_cke] +set_property DIRECTION INOUT [get_ports DDR_cs_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_cs_n] +set_property SLEW SLOW [get_ports DDR_cs_n] +set_property DIRECTION INOUT [get_ports DDR_odt] +set_property IOSTANDARD SSTL135 [get_ports DDR_odt] +set_property SLEW SLOW [get_ports DDR_odt] +set_property DIRECTION INOUT [get_ports DDR_ras_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_ras_n] +set_property SLEW SLOW [get_ports DDR_ras_n] +set_property DIRECTION INOUT [get_ports DDR_reset_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_reset_n] +set_property SLEW FAST [get_ports DDR_reset_n] +set_property DIRECTION INOUT [get_ports DDR_we_n] +set_property IOSTANDARD SSTL135 [get_ports DDR_we_n] +set_property SLEW SLOW [get_ports DDR_we_n] +#revert back to original instance +current_instance -quiet diff --git a/zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_ip_status_report.txt b/zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_ip_status_report.txt new file mode 100644 index 0000000..70a6a22 --- /dev/null +++ b/zynqberrydemo3/prebuilt/hardware/te0726_m/reports/zynqberrydemo3_ip_status_report.txt @@ -0,0 +1,152 @@ +Copyright 1986-2017 Xilinx, Inc. All Rights Reserved. +------------------------------------------------------------------------------------ +| Tool Version : Vivado v.2017.1 (win64) Build 1846317 Fri Apr 14 18:55:03 MDT 2017 +| Date : Wed Jun 14 17:17:24 2017 +| Host : W8-64-02 running 64-bit major release (build 9200) +| Command : report_ip_status +------------------------------------------------------------------------------------ + +IP Status Summary + +1. Project IP Status +-------------------- +Your project uses 29 IP. Some of these IP may have undergone changes in this release of the software. Please review the recommended actions. + +More information on the Xilinx versioning policy is available at www.xilinx.com. + +Project IP Instances ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| Instance Name | Status | Recommendation | Change | IP Name | IP | New Version | New | Original Part | +| | | | Log | | Version | | License | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_Video_IO_2_HDMI_TMDS_0_0 | Up-to-date | No changes required | Change | Video IO to HDMI | 1.0 | 1.0 (Rev. 26) | Included | xc7z010clg225-1 | +| | | | Log not | TMDS Interface | (Rev. | | | | +| | | | available | v1.0 | 26) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_i2s_adi_0_0 | Up-to-date | No changes required | Change | AXI I2S Audio | 1.2 | 1.2 (Rev. 1) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_interconnect_0_0 | Up-to-date | No changes required | *(1) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_mem_intercon_0 | Up-to-date | No changes required | *(2) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_reg32_0_0 | Up-to-date | No changes required | Change | AXI Register Bank | 1.0 | 1.0 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | Log not | 16/16 v1.0 | (Rev. | | | | +| | | | available | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_vdma_0_0 | Up-to-date | No changes required | *(3) | AXI Video Direct | 6.3 | 6.3 | Included | xc7z010clg225-1 | +| | | | | Memory Access | | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axi_vdma_0_1 | Up-to-date | No changes required | *(4) | AXI Video Direct | 6.3 | 6.3 | Included | xc7z010clg225-1 | +| | | | | Memory Access | | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_0_0 | Up-to-date | No changes required | *(5) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_3_0 | Up-to-date | No changes required | *(6) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_data_fifo_4_0 | Up-to-date | No changes required | *(7) | AXI4-Stream Data | 1.1 | 1.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | FIFO | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_fb_conv_0_0 | Up-to-date | No changes required | Change | axis_fb_conv_v1.0 | 1.0 | 1.0 (Rev. 5) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 5) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_raw_demosaic_0_0 | Up-to-date | No changes required | Change | RAW Demosaic v1.0 | 1.0 | 1.0 (Rev. 20) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 20) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_raw_unpack_0_0 | Up-to-date | No changes required | Change | RAW10 Unpack v1.0 | 1.0 | 1.0 (Rev. 17) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 17) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_axis_to_i2s_0_0 | Up-to-date | No changes required | Change | AXI4-Stream to I2S | 1.0 | 1.0 (Rev. 4) | Included | xc7z010clg225-1 | +| | | | Log not | v1.0 | (Rev. | | | | +| | | | available | | 4) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_clk_wiz_1_0 | Up-to-date | No changes required | *(8) | Clocking Wizard | 5.4 | 5.4 | Included | xc7z010clg225-1 | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_csi2_d_phy_rx_0_0 | Up-to-date | No changes required | Change | CSI-2 D-PHY RX | 1.0 | 1.0 (Rev. 35) | Included | xc7z010clg225-1 | +| | | | Log not | v1_0 | (Rev. | | | | +| | | | available | | 35) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_csi_to_axis_0_0 | Up-to-date | No changes required | Change | CSI-2 to | 1.0 | 1.0 (Rev. 46) | Included | xc7z010clg225-1 | +| | | | Log not | AXI4-Stream v1.0 | (Rev. | | | | +| | | | available | | 46) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_i2s_to_pwm_0_0 | Up-to-date | No changes required | Change | I2S to PWM v1.0 | 1.0 | 1.0 (Rev. 7) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 7) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_proc_sys_reset_0_0 | Up-to-date | No changes required | *(9) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z010clg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_proc_sys_reset_1_0 | Up-to-date | No changes required | *(10) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z010clg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_processing_system7_0_0 | Up-to-date | No changes required | *(11) | ZYNQ7 Processing | 5.5 | 5.5 (Rev. 5) | Included | xc7z010clg225-1 | +| | | | | System | (Rev. | | | | +| | | | | | 5) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_processing_system7_0_axi_periph_0 | Up-to-date | No changes required | *(12) | AXI Interconnect | 2.1 | 2.1 (Rev. 13) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 13) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_rst_processing_system7_0_50M_0 | Up-to-date | No changes required | *(13) | Processor System | 5.0 | 5.0 (Rev. 11) | Included | xc7z010clg225-1 | +| | | | | Reset | (Rev. | | | | +| | | | | | 11) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_v_axi4s_vid_out_0_0 | Up-to-date | No changes required | *(14) | AXI4-Stream to | 4.0 | 4.0 (Rev. 6) | Included | xc7z010clg225-1 | +| | | | | Video Out | (Rev. | | | | +| | | | | | 6) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_v_tc_0_0 | Up-to-date | No changes required | *(15) | Video Timing | 6.1 | 6.1 (Rev. 10) | Included | xc7z010clg225-1 | +| | | | | Controller | (Rev. | | | | +| | | | | | 10) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xadc_wiz_0_0 | Up-to-date | No changes required | *(16) | XADC Wizard | 3.3 | 3.3 (Rev. 3) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 3) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlconcat_0_0 | Up-to-date | No changes required | *(17) | Concat | 2.1 | 2.1 (Rev. 1) | Included | xc7z010clg225-1 | +| | | | | | (Rev. | | | | +| | | | | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlslice_0_0 | Up-to-date | No changes required | Change | Slice | 1.0 | 1.0 (Rev. 1) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +| zsys_xlslice_1_0 | Up-to-date | No changes required | Change | Slice | 1.0 | 1.0 (Rev. 1) | Included | xc7z010clg225-1 | +| | | | Log not | | (Rev. | | | | +| | | | available | | 1) | | | | ++----------------------------------------+------------+---------------------+-----------+--------------------+---------+---------------+------------+----------------------+ +*(1) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(2) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(3) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_vdma_v6_3/doc/axi_vdma_v6_3_changelog.txt +*(4) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_vdma_v6_3/doc/axi_vdma_v6_3_changelog.txt +*(5) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(6) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(7) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axis_data_fifo_v1_1/doc/axis_data_fifo_v1_1_changelog.txt +*(8) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/clk_wiz_v5_4/doc/clk_wiz_v5_4_changelog.txt +*(9) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(10) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(11) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/processing_system7_v5_5/doc/processing_system7_v5_5_changelog.txt +*(12) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/axi_interconnect_v2_1/doc/axi_interconnect_v2_1_changelog.txt +*(13) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/proc_sys_reset_v5_0/doc/proc_sys_reset_v5_0_changelog.txt +*(14) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/v_axi4s_vid_out_v4_0/doc/v_axi4s_vid_out_v4_0_changelog.txt +*(15) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/v_tc_v6_1/doc/v_tc_v6_1_changelog.txt +*(16) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/xadc_wiz_v3_3/doc/xadc_wiz_v3_3_changelog.txt +*(17) c:/Xilinx/Vivado/2017.1/data/ip/xilinx/xlconcat_v2_1/doc/xlconcat_v2_1_changelog.txt + + diff --git a/zynqberrydemo3/prebuilt/os/petalinux/default/u-boot.elf b/zynqberrydemo3/prebuilt/os/petalinux/default/u-boot.elf new file mode 100644 index 0000000000000000000000000000000000000000..99ceb45367153bd90743e5469eea1626cd79d504 GIT binary patch literal 2799404 zcmeFadw5+{wf{ZWz9bCT5b; zjKgEHImpz9`6`tTLgxiZqfp74A$Oj?WKj^^=Rf7!`=mv$5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc5dskc z5dskc5dskc5dskc5dskc5dskc|NlVXUSkI8_H_9l7P2O7dI*k{HaS9`kdCE|OL*jBM(*h@%;`O?I5e)KKjVz^ zYs_{1b4*8ZTBf5o(sm1@%!>Z~jazszZU#S${>p!ne)m71-}?{f_y3dh?eQPZ|3m+P z{+uWNIec3G0sTAw0sT$?B>mohK>wD1K)>qAe~$mugb&AO<3FH((LYIl^*^A0IrPUM z=f;dGjI&L#!A$kWnV#BOldJ79Ib`?Hf<0>VtFh`H&mLvHy3};}_NbayD~uUzApD## zc2wo7HxSkm{$=RM!r;&l^jz=2QB|)h@2O$=Wm=V{$BRKfHX`R))wzK7$c$UC$Jwur zKOXr`#fziTRxv)oEySGmLUNB==!=WbwE4oGE8a?tO1cy0|$E9AabgW{+Sza7!GTzOz>hg78xVSKMMWuK1HxA5K zu67G`Kfk*0kvqRv`22&FuUe}=Q~c}D&}J*$Qv5T|n0s}x+RQKbLqprtmgt@iUC~yb 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 z

    GYWh1cSG^Ki^LtTfTfqbiXY-*KhMG& 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

    y6)AAc4ove2tu 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%0D}Q$0}P_rU>=(| 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%0D~d`rDq1gi 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 %F& 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

    liDg_Omi~dDoJXqgk)2a+A1O0v}C?j zlGIiS$z~)^#V@Q9lFdryTO~ z!!m7^P`1Dt{2V}B&?wVZ$sS;`(gUl6Byw;GR*AscDj}?`5^H2e5)Kipo@)G7j6k@}MyQ_VW!fs4 zfMCDH$-bz0763g8m!**mR!IUuW!fqcSX(6mYpaBN1j@8kLRgf&)!{Y7DAQI6J#}T; zDxp18rmYfzwN)Z~wN)apwn|vA0DnT5zl)4+qfA>R2gplXB_t`!vq}Qjq8trQ8js=Y z0k}+CB@8cXWkDk@fwfh_`AV6#N(9ccO3JiV(ic@&rmYfMK4sb}AzUd|3ELg4lHVYc zHe!{uS&9&|jaVgZ1_DMAv{iB|h(v840>Er$>^4k>gS?Br?1@eo7$0%7mdkD={HTJr z5PnSH)CY4+Bhe3jRrJKUa{&)9nS1INrvV-)_Hyb`!b8nCru3;&!edM}h}2A`z1}<) z;eP8R{6>c3XDPlm0lSU!W2EMj^agVkLj2Zc_^r5^kwTWGHB!CFeWQ7=kUc=MXGkVL zBt9Gf8YEYsl_)vnvpP@&T-fC+-lkQ1X2u zcM4fyaw*9+30ZM^?wO|;iM!05U{)$aSYoruBfpvC8?YA=cbntEtupxzk$X%Qwkr7v zOLwoyf^GvU~|hciEpJsN3x^dhACwXF!n7OZPPz&qHaQcu=D!yyS0F$sM;qK^O=i z#vduhVgyl$BapVMT(KeOe4sV+rX!NQaxJi0R{6QQgxJ@Dvb|1*8K&NdxI$q{-IJ*V z-%qBQH;`F|Y+fVE=aoYD0qunyH09(_OSvvq>_gZugB;4+*#*0?Oj}oiX3lToc~{*> zS784NzOLEsy4h%({3bfM>R!e_zln=ob-%(So?q8#?z;F63`_WyT;r}AcNN_8_?E19 z8&_1IqZ;ktN76p|6ISSRu8SZkK10W8tK9lG9z$Qg$1vY2_k?XcPVt`_+dvY#BkN9G;F2qkj;@Il%5q4~K zB4Vq1b1p=0&V}ebMQrsV)QH&X-Ye%Lf!OMPalFA+e+ISWw`g|zEzWU+Ax@bl;~O@_ zdM_v(3nU`edmwxfV4K!^Ai~v1!>08fus0$Y*86n)$+{!)XfxvF2dq~kAjHJ?;Ttx5 zx8YB`iGc?hQWOdVV}4BQF%V3UJQSn#9xSCF z5Z1fMPPq8@NOTZR9L_#yGCKicy$5Tb1fLMY8}LOzX}t&QdIQncyX&S=pg5PkKC%}- z{&3;>h_z|RhojpOqC^cBy$BGlY%%1+@n3={PD4Ii!nB$wAw)I}`EV&oAnLLBdm7&o zit1NB!;Rte#|W}%$cHn`(6Bkghsy{z8>O58hbx&Z>5r@|#)u-yh+ME8q$;z>g<7JU zFc)r)q&={uY#Q)Fe6f?B%&c7QI18MhI~Xh7Ht~x5#?C4X~;*~ur$Rs4f%+2 zEZQ{WBg(O8(~yrS$D&O`KB63pHVyfRH0F*r4f%+2EZP|Aj7UF<*2AVDA5o4)n}&Qu zITmeN+!5tiv}wpkRB^9eWEG~^=}#ldHkAsv*UXw+kbz66762S*p6As@Mz zN{fgIZ})!yu{KS3d%&*&8a7RMdmv%UrU`G?6ZYFQ;q5_$LpDu#dobZbnzxX;T_%G@>V(@8EA#nkIboB(ooqj!ol%YeZ*AOmmthd{jFY(=_3urwG}U zG)?&EEFqhgrU@U_j>R-h_~>jQn~|moj~g+W&#W{}_^5U)rfI@QPZzTJX`1lS`9iiZ zO%pz<9gCua7SZ(5GMMnuv!np)(lp_tiv?MqrU|c+)-+A{=n`?DZA{aIkDeoBx1?#p zN6!`Hj&uXlEE8mNnkIboJVCakX~IXB3$nG0CVX^-$#=Xxl%@$E)sDq9P57vGES7Nu zi>@;{gwcej#$h8u{TZ6@(W}gA2vR{4KDyrA0cIh%*^G|>;HmL8{=|eYN-;!C_?VAi zxIG`lh4xF} zQ!Jxesr@uz8PziIrh>>HFImM5xMek-AZXaG5bU=LAxeoJczH8Ri5_@YAo~(2MzQ?{VJSwbJ%RMy$tPnE zyAp6O!j-m{;dO+o?3J7u>4CSE;dlPks*=GKTn55R zpE>%3)_|7#ki$j=mw~K=$<4?WbWU4Sg`|ScX=|E-xeR0-E3hmBC4#JL$?;*NQ_~T* z(I!-CnV%p)M#oa^oKACEU8U<;evbhYD>cXcP6<&?sw%ZUMWg}42!U`?}rIO~;2=-gI<5$%D zM*#X6UcvD<^{trv6K&hb6Rd5+7rJU0tE(6`?q`@-KjU?tWP%7+Vcm5Rt%Rs4^ zg1HQoQqJiLE(4`9t~*$0E(4{?U7JYHWuR20!0ocjK&fS}2AG>wvJ6xu%Rp7K3{*7` zX;1_%1Ep5FNEP zNI_LsSX_lwFJ6Rkzv?4|#HzZ0zOu@N@biqw??77NYIhX+vRx&N2paZ$!qx0tmVNwa z!0icp>?&mG>Ok0Qr&j{*NZ4mDBi!i*z<&F05W>}&;Q{+T^67Ficn0kR;Tpn)_DO`h zk|u6H1+iS+n6|{;Oa9%du~K_GX?id`V^1Uho}@2Vjgf40MN8x4d*B4eoPQb$m2wT@ zfMaji4y6rdLPHf~2w~HHeF_*hkh#nL*)+gI8E)C%Qus!~9=jZTT*FA?wa=lDO$_(j zpHrCOgbVCPDDVin-vai9ghw*G$lgeJ6ycctC(@55Tx_pGO}NGoj@zdaK8$dQ{a4bD zC7g)Q#JtHhj^dZ9p=lzAPTC{b7IZ3vDswgO&K7Pw6Y0WDAgl{FQ5CKd744eDaLc}v z86HX4BU5D8QG~s=kKvOE`|LlR2$f7Bd%yiX1wWeMrS^Ej#}H21JE@GRgi}h`X%sfC zYKChRBCL&FR1mh%HT_NmshT*6iL|gY2y0%PQfGC28M`)>#WP7j-ZQ3qy=3} zSPOb~o}fz@ZrQUa#5shupi2pBLC+lcE2?y+}Df9}$LHmys z`h3D6`&NekjC~?(k1Im$tYmo9_OLJ)5H7N>W8p6(9JB9av%QFLu`1*$7BX%`eujuz z*X8b*Q^+ewqzk!@urB14s*rW8=BpTP+11SKYQi4-_Y7Z8*lU-tFxL?F*)vFUE!q3+ zk)*kf;f3~t1%O)#N9`9_unpv2WIsuvuP0n=FClyb;S#&D0`NxCm)g&f=Z%DucAPXf zktStdM5WwJIAe#I*DZw0Ra3r|^p*C}48M(V8@nIV-cGo!{UG5x2)DB*QvN#$SJ@Ac zeiPwp`!eQx7kRd~>j-Zq+|lkxn!5>iwjW{mJ%nrQyIHP#33pRU-$JGLFhZ=i7*yi) z-?Jfj*!9a<*-F^T40RRbD2K=VkJQWTKdDCo>G6ouMAf_4J3?#5?j5Ka-dE*OC~jq#oYi1A4#p z4Sr>*DOil^mY-(GiTm_ZDThA9557lvcph%==9DKl_xzYie4H9i1R=06sw zD9&qicml20{H`7$9{0kVhZ!9`Scx<(oE61v^jl}8e0&KOV`Yg|#Z0n1M&~nef3X*L zZR1QU&@P{U3nlwZ*32D@mXj!clXCus@qCz>1%iJ|oX-j~Ab6<<_)TMg2gN{Z1YYAq zo6rmEc4sUbhlO+wqPosngpE^iG!}Uuds-r{X2dE)G$EqPy_1kQBN3a({J|XlE8s@A zohVzuSw?NuxrVo`x4WE~>n>;J(7v{ogUxr1#zwF+yP9``W6zfn_9~M0+yUTy0JV(m z^(L@yf%SS1KszshF8~Y$07HX(=7Ucu5VM=P$Ki7xqJ_^D0D3zVeaK7r+~)9kRrvJX z3}HuApb0?N6m=nfdAzSXj`tmbLygE{BBE>aqdo4cPizv3I-_5`rjW#iNQ^TsI<_~P z2B$y$d$K8f&iYz~_4i4Xxz&@vk+l=)_`RWb|RlRzo+yCidDevcf&BJ%<8nL?RA zydDH1^Is?-W!_7GGJE}6<}`p>lILV5gP)Lj5M}0&)&EP3RptxKam)TjgQu>{*6+|n zl%8Lp%-z6N$t-kZfewMpFOh695z+L^|S71=XKCqw~c7cI(QT*cCYBu$eM&HV>Rqccz1Y_Cn(Sf&CH=%->5b3B0 zT%jUP3;XY68(T>^r-6Xx7GA~x^HP;{CCfSvd8@Jt-E5#N>xCq{nuwJ3BJ$V&Dm;4ICNLhc6I4SEl1X$K!P?xm=KrP9othK;URHngBV`ftn812iuG5~IpH@bMHHbM>&$OfZ|An1vEOoRW z6|oQhX6pm!x~jpArJh?*P^D*~y8A`f;|2LR1{l?O50AwPUr?IQS1+h z6UA19wPJe_pkhY?s3o~5_84H$UhsdxwIx6BSXv|$dzu!zFE+lnAS`mO<+<;dYeFv)4}EEIpe&ih&&gRl`> z5cYFW_uHW(9l=I6VfyP1tU(^`{YcPw7BH@jHL}v(0m=NRC}={A9>$dtcbMd(PBq*S zMni?fhgQ?hc+K62Y({q-MVNd>Z`h6}+-oEpElVq}3n&W`0uH+iXFOfMXEJc&9Da;* zjdZ4RjC12&rueYK5_k^+zScr>%p;d!Lmj^U^cd%uy?@Xc=V-mZbc}OnpuYpQHF2K* zz2S1)@;f0Y5Aqf+Mwa*-f8>8R%PR+b6)Mbc^~P^7v9Oqzc6W@3${OFdXo7)r(a`Tozg7hkXqJAtt6r3|7$^{ORMo41oi_Ahs8PIN%G4 zDT8vr7sNjVs2uPGB@9;%_<{t@$@l(#X_0nd2CvPJHocEA_s1?cVbcQGx)>4et~ z_=36$Ald=1yzYU*6A>g{_dt|(l#*KuQb=Svv#p|w* z^NQD9ALkXXyFShiq=EC?)o^dc-{4JUh%r?9=vED z_-L;?LD49@?!SY2EKB1UfUW`_yqHQ;UiVP{b%+(OduYI|0F~E0G?1|Jx`*lsE3bQK z5MkwY4-F=)yzZePgq7Dl)IeBy-9y6&E3bQK1YzZM4~-_A-8g>(5Wi*PH*e#-^19-c|&Na%Il8fyhN1O9mjczD6cz?^Ab^BcW2|gc-@_i^Wt^KabA)suRD(O z9spPr z&U+RF&|Y^O=jDEE@w($UFJa|%$8lbkLwVhCoR^s@ue-BxUcBx&&f6BMQ(ku*=Y1Ar z%IoeN=M}Fzj`NaCdEIfGmt@N8?i}Y8uRD(Ol1zEsosIM2b$5>Qiq{>-c}b?c?l{g% zZp!QK9OtFiJ<=kY7Oy*w^RfWS>y8t=M3mQEBg*TJCx*R%TOuG>mJMV zy2tXo?y)?td#sY87uxi?$D|m_>mJMVy2tXo?y)?tdo0iE9?SE($MU@Hv3?JLzw)}r z^1SY`Jg<8!&+8t`^SZ|du~f?I9&6}?HmSVsv7v;O*FDxqEhw*hY!r{*DX)8MG~2N9 zy2r+_jN)~V9cF{2^18>y#sMp@do0iE9?SE($MU@Hu{^JPEYIs6n?Z4u*F84#uTcL+ zRL)$8rM>O}WD|NBB5)Id9=gQq9-Bw1N(PJ99Y@01zC&y9GZul`>y9JgLrF3f?N}ea z5U;yFd{HqQ?HWhInN+;)#mei>9M>bAnv~G%9=A;1=q;mTJm2dc&-c2+)7^}uenWZP z4b`Cj+9U#KwGV3rZAr%OS#*F7GTjK%9-5*0yLBa4#U;fs=(gwpF? zBGWMOx|hTylwS7|nS_bgy(Ga<<#kVVUXHxP>z?Ss#|*o8HGbP(h43gFftm}7*FBLm zZ$hx&x)8sj=7#`?q#itMkSy`7c?yEW>z?>d!SuQ(4k-9K)Iq{@vE_)@J>e2qs@I~Y zdpnqDuY1Dn+DBgWx+grYI|y@>Nq7}ZuY1DhlKkj($KFnX>2*&OxLB|df2KKnwbwln zaE+z&oL=`tQ0T<#p2+jMuW{1A>%N@C9neS;VHd;2>z;@xm|pipk?TWG}$ixCXB0TJk{9`?}!A zZ}Gic)ogxl)3q?J`wib^hrY0?J*J{nCSPh-aeO<#9TYqn^{ruXa|HQjC~Pi-xE-Fm z3g&W{3~#~G_X+sNS~kYIjyJ4=fgC3IXPCF0E+=XeJpi=x4iGnhxYH_z7jgWk#@j`^ z$csl~WY-^P&3=#tk)|v6-p?*-0>I^Xd~m)8LUha9>TMKa>BBM_U?=G9+FdSIc470` zOo4~oG5@s-*|Rx{|Mw6zE_M3vA?o7)zZ{}=j!&PD*{41}%~QvNYpZ<`g;99C<1^(|oK0N~hwb^#9T0 z(>#v;KXH7T8b9>-G#93v^JX;R_%G_!mNUnyAb_%t*Af93de zXG}GJ>iBd6!hhoUH1B%C><+);MwkvjB=uk+33|fu=_rDnL8&E`g;w?{RqLj!$1tUi$bn4{kfhrv=u>r-d(P@VL}TV9wxisS^tp;E$I$D=~L` z`fKvi$EQj1567nmIB770?+n;EKFx6F__V;B!Q)aV&fx#u@#&tZ!vE;_G|j|+dwlu^ z5Vb9ZgVvmEn!A9s<1q&ygi%F2e^YgE1L7x`vtUFYE9Plo{w!#_$XU*`$yExo5csB3BqiseU5SsLndP()cnz{IGyh2H$z4x# z;LgR15Ku1pZ3I>46XA(4D+D*95OX_RKi%pX*j55N$0%Ss$u z+U8(f3J%G)pd5I@8Q4E`EQotvj<8xDFAw}hVQHgcvd3X z{HFF-Krcdg?fn2+0rb2bKy532?ghqA4_3igB!P5>*~e@PwC61TOv8`SXBMJ?vG7->$hY?5Q(=P6#YEDsi5+?P3G%&FJ?E)mI{#GO3*Y(neH3f2qm_=K^CMOAG z7@rfx?12@Hy;ROFY4E4>Q-@Ku3H_As!*|v2mcyEVZCZfsUjP!hDpm*Aazw9^)#)3qVFaUxdC1neSlV z{LOF((sL(*dcJ|5P7JL38=!+A#r864=_d+@Qk_jrZegh&LaAh^XeFg8)fSejbBUwL zEfmGkyxu_g2x(F0 zkXyS_3`s{|u&IPB4OHcd+T}oJAiTB(z#;%WPXo~Nc>JKiUqaNeAg%&p{-O+6Z7E_d zVS)&N4FtH~`d0wPI+S&75%MZR#&rc?9yzWb|Bk8~hQId^d^ly80=A`OJ6vR7xXAD| z0m=|h0-zin0pQbn1G1lwR8uJVn%c*K4kXQ10EZK}6TnFTdb7E_3ChK!oKnlCvVsI` zF6#hvT7w8_GWP@H=ZGkq#?&>a&5l6LR%X^LgTz!e3p`H8-_7Pb$s}{txhJvu8W!|K z5m`G83u-lFjE}RDMw!%~q8+7Z5lB+@eOYohhIAn1AXcYIwJ7RASaiLs_v+^9eRe=oo^-7-|f8iW1ifZ$62JO5$3Q4VA>TBpWJ;dr7Dy?xhmH%fvO3 z`1x$&nq1B|0Y*Cn9K{1ZfOws@py&t8sj3aT`fL^N{ z3wrKhF_z$q&)n&dP2Dj6ZDE5IKY zKk#;YkHG5siM*Gud8oI%E9zYpr1RW`AGxC5Rb2zn%PZ<#y@wLy74@z@0&YS9-II@C zC@-IPA1$FZs2%qyT)Xw~$*5oE#(ey|d|tiX(h~d6yAvF&FthaYzI|_~8X#_!;1s;U zq}Au=VCXC4&KBneNZu^3Z-6`&bj}Ts7(!W#hv6?mHpFcL@`F7EEePN%Ka6Yf4H_Pt zF*f{iFU5llksBcQ0MIu;QU>P+NGyLq&g~GtpoHPh4Ui;vZh&+_<-7rs@q~*;0l*fP z01qI?@&df-M*2+%4lukEz9^`=0kRy3bM@oVfc4dn&w!V6_2a7mb5}oJ0wR6&S zSKh{Yn7;Z^NyPkuWlEyG9>C=c_v@=435WF6kAw^L)sKXoRZGI9`szo*8GZF5;Yxk= zBjGB2^&{bq`szo*HTvpDisoGX$adRDU;Rj$e){T1!u9&PN!P)sLTn&nP3X z0zm{tqqzF<1*qqMgQMxIy(?6jWvv3OWif@bg1H`Jo?gMclf$3B0Ftn?f=Sp}!6fXg zU=ns#FbO*=n1r1bOv26zCShj*cSJ%?t48*cx`1Pu5=}i+Hru)(Tu#bfol4?)Ie?pb1MpzUBNuSQs@;-R-)moU=qn*07)c!0VI*^1&~Ct7eG>o>;;fSoC_cc zXD@&xlDhzM2?WTkU|xsy5@!XIaCQZg<;bpJGSln@kO^ojdjVuGAlVBb8I!#LvKnb7 zITt{ZEPDYY$+8zflI#TM0!Wf&FMuRj_5w(f&2cV(Bw6+XNRnkQfF#*seE}pj?W|z3 z0ND#5iDWN;B$B-Vk|TKb0!YSWFMuSHy#SI(_5w&E*$W_vWG{fc5&F!oU{bQjoC_d{ zYEFCefk2(+rdn380Fgp@x0*M1^xG-h<1u0();R+>?Nt z00?7CEDW0o8?&0;&rk1zd#I6jM*t z7Su~D!BFQy$Y#to^ok~j43xs+f!EO2)O{kmUR?dd2V(v-6HT4X4Rx}0P#=;f3IDK(e zGzI3K1YA>3hR%hMlTn4vismB>=bi*yQ%_i32+4Mb3n4i%|FoUTYHB72YYV?^ zW^ETUVHDghqKS#Yp=Z)G#I8jSgH57 zWB4|lhqZZ~T#o2(vk@KwK5$9EkN+F-POj{$Y*xFh9J|3yT-s-B@*ISl&cP0r_B|+K zCw3Wjo&71ohtL*FD~PS3&mg7|BBU}D4Xp;)-GfR4_x|-Fn%c)|cnK7HLtMnzE>U<` zi=u`tTQm|o2y`6!89%${6`%QpFuxb_SLPGK{A%FJyvASSGn>CFv&?cknJu)hMxMg# zbHXfR$n1`P%Pc9r&TL~XIt`X7A^566*VsLss85r4f4`HUJ);?&Z{N8);MY;o@P(Fr zH#sGTcjUwL(CdF z2|;Y~Cnd=1nw3~A&NjqDR~VAN8Il#!dmtIQ9x;oMUkrt_Uyqj<_O4t4;)rB%h{90V z2P496L{uO=j}_#|YD}_4_iRK3AC?MolxdCjWQ~S^>t<=-J#$fsWkh8l@5u^&40Jed z08M9$bz)X%S%r)mfjoh5sH*+=O_s%9Xohtx+R(9ncG=Gb@oxX0 zaIoO*tiRI@`d@IZ@SScD1c>H_$p0AE3V+5r$lFrh`+P`PB#cUZqMPHx09ZM7V5K;{!TaOJKZ2SeEZ*^8?^0UERPe^ zi24vah@}{IcFzo~bgN+vKd}R757x#tqPme!sz-pR0>4mk^m z7zfA#t6$}S`Z#xZ(iM!JqC`CDGVacun;B6cS%q_NM7+9SCS}gmf{F`f5;*FDnVSqp zT`&un#M2o*m7zT9a^|u@9QCs-1eD!4hqH<~A2aF@?Ao1ke?)L65`2aB>0=^}(DMI}xz>V9tv(mHJ@LOVE!pd@#?& zzXY=TAIy;= zhN}c1uVC{%H8~M*Py` z&-20Tmh+~u_+WM`SfKh~cKZ=FKA7DqCMyX?H~y2fJVS_{(#uhFli^4XzM|#tV%;k~ zn4=ZS5r5uV^L1)dzF5KVkL39IYa(KA58e2&)g~Xoj%*V2;)iRv*mKL4?%@ zb969a^}!q+MOb|>M@JJ@AI#AfvZg+mqhmOV)dzEQENRpSbF`JP`e2T3V3(^8=IF_U z)dzF*ROrs);LGK>CMYcmAIvYKd3YIGaC8z6zM?;1qp1((*ce`z79Y&9vAkrgKA2;z zgw+Rgtc|exV2-sDRv*l6hwV6CpyI%oBCi*OcF$WFefGpqCS`tQv^{T%!%EEwJP;>z7kwY zD;pooiK+IzsEhhwPV8X^F$0RH+Qgo=ywBov)*$MGIWbLQ)CaRc)CY57y2Pjt=EPpY zg!*7Mi1=VOu=-$5>@8Hr2XkVEy#WjwAIyn4_7#x&iVx<*e1X*mbK*do^-v$oiG!q2 z^}(E2C?1g22Xn%hN*5o@iA55lKA01WZO(J*gE?VLrHc>d#1bJ>AIym(giL)fCyc3d z@xh!}DrD+|Ik8O0)CY6Im`WEP%!w63raqVx#|WADU{0)*mKGn(iQ}aL>VrA4N)YwI zY!LOqoLFsh^1e)bFelasnfhQ(tQACkFegqDM13$P)(N6Mm=o&-Q6J2S4feHYTlK-5 z*eIN-59UO-AnJoTagNO?>|u<1ws=TP7Kjh##CdiCV?}&0CoZsWLT2LR`&j_^RPcJX z9Cjtk7$S#T`MCt$1*io*nweoJKA1yk;my4oafSH286V7{Vmk~>d@zR&5EAjh9Gb5% z54S=G3M_|P1@0_lASE1(boxP|59UJ0J_`XdvI|2trz-WqT$m$>`e25^X$}j|2Xmoq zKf**j+$s!6l=@&U44Ond+$szU6}}TJ@&){)V#Wt^p(_Q;;Z`bNzJ!}mM5;hQ9&V)y z1?1sYNYxRokqsQO?|58e%5Me)I$9wHMCx`$uRssj<8qzNAV zj*AcGbg6v=fCYAB;a2)fg?YG@wgc~gPw~N= z4hZZnK-wq0yo?X#bTDu)^Wx!FIuuw=n1@^G9EEwfmCg-Fc|6=ohZW}GRyr@hin)AL z6R$-9IG`L)I1(ttKk>nwc7;xSFsGvdcAR@N9&^1k@WH$riLsW&0Z@S9;)6LISD1%e z>4Lycq!Ay?=|Y8hxRp*zhT?-cT@ly|^$;J->B_)ur03yQx=LX6!OU@&J}K~L6!Psp zn9~~r_kpPTRm!d>k!$`%@xw8bi?7WJDEdtr3*K6>)~;CrWk12@17k~Ab)?Pyp2>?A zVCDUeB>fCY2a1|(5qo|u(;mHesbv?xfcT4m4m_q3Wt0$ojwsz(*rhS#_8!o>bG9JE za>m97;jjt|enF-H84UG$K?WaXfFWY$vtj|L?HNPq+_@V0)Gt_#-M~Uf*f~)xWi~jX zX&`b1kcJn*EzM7@#*^yP_>*-fc}TLx^1v8nW!%FN&0NhG%_#)jm>q$-<5x7m+5{rU znxFLd3>TsXl+>REF8J5j^_`@i`?K#P_1{VAEn~~+|CU?4-?>8m&K0svnX;z|N7&bd zqjI0G3CAhW*M!>v#Mgw&;FIHP!ZF6zgrlg-*MuXPuL(yoUlWdGz9t;Wd`&o#`I>Mf z^EKf}=4--{%-4h?nWqW&4r=g!R9?^Px4tGEIrBB)i1?atyjl1#ZV<7>cfHH|DMCC= zxbIvcf9DDrqo!B$?J6v>J)`;-`%UvO7+RngYJc%YV zcjDG!ty?WxJ4srLcoD1VYSG$Bt^v(wM2}khJtSdl*BeFO5 zQl>JZS7aaPPs-4b@i13XNMNp{3?-;nQUtsnvsO^#^yW&6gi=l)JbXE`*~tWlU=9zS zdm6wn-BUaF1kt8enC_{adllYF_&$LhXFg){F6=-^C^`;lBP)(r1nItR{@jZY5lZfk zaL1{|GwR5_mYf**c6qNQH!8bZ%KgLc-UyAcytSZ>TP`+&R$lU0KIJk>Bz7ZU<0O^D zo|Du^5sV8ir{SLn28ib~V|k$PZ3vLWzX1@pLQmnJ%RD1@FhrcBHekXxPEyH(=OpzB zfR1sJDs5q$q>|iok~*GnSa~O$szoA*`(yhc^BH{t0?vJUsUu?9-RNOB%T4O5i7aOgy0UV*~88xQjezDOSQ*po8 zXpO13Uu?9-RNOB%T4O5i7aOfH759sc)>sQ!QyZ-@759sc)|iU>#YSsP#rH7@t@e57AQAT`+iXUtxIfu0h>H7@;{;K0e{#Ga zD(+8q2%_SC9Mv%c756763ZmlvWT(9oF)Hp)P7*}L{mIFKsJK5lMGzJDCwCLps;n53 zUIQ+r)s476In{m#6;g43au1u1RYfS8+|!o#S;YMYQE@-~FUuQUM$f1QQE`8Ay2Pls zKe?AMq2hjnh`8UtD(+A2EmTI_pPXTDL#9UDpPXa=3Jovf{^WdtRotIE&}KbU+@Cy1 z3RQ7`av>D5F~rJ>FoKeY+Is_;CgT3&B8gFPf3mN*KY6&2%@c8da*2?sxIfuf+@Cy3 z$QFsXKe<%MRNSBJEACG&7qS&1?oX}|G8OkH`-uCKE2X7H+@CyNDxl*2n71y8WQ9c&0gDOM!s6WkstHwv@looBAY9GBGqx`x4+LO_ZJ0ZeoV3&>#*cUx z;^J1AUNCct?IVDN`Ax_n{g?T)XbD+TPKqO7MQ}L7%wj-T>fOz)>_Bj8J z0C^K&kCRiX9uL4CClNg!fIUurF1_Oc*yGIN<0!`iu*WH1b9sGWk5d!zcmVb|NrmqU ziyQ?|Dwb=7=>-$^I9agEyDvrge9zp?coY=~$m4+`uGcJA?Qsgo~TJUV8@~19ckvB0L*+H z=J5dRah{2wFb~6Fk5gbC55OL$z&sv+J|(yg9w$k{ zpOQyC9*A89zV7nU;O+~(SB7~!0DGJa5BHGqxWacbVL{*t1cm7Z6ZSX-=J5dRamq-b z7fjgWyqT4@$Y^EYI?@|^oP_o6%T#83QeZc%$p7u#moU9x!X9To5M?rpumd>!wrHny z4*0NpejUXQ;F8w>9?q`&01Nc$75ft9+mt^9Oa4QbK|g=VyC56}wDw*sAMK-P+%wp{ zd0lqt;^Sc=f?Q8W?7$f20sCm8R};;4fp|Hy`W?`^rLj)yM8pk1>g=H_vHV}nxPe0< z(!T+5pW)&HjjTfBClq|5U=s9vo=5Nu1XBrU6`s5hFc{`jxIq~jLPP}!E+bE8Ux<|T zG&Oo4@~dwKu!g`u02dOd0B|RPd;l*1XkfZwlYo5ytZ@=@TBoI>D7YSpclIgvc)&BI zSZmNbXg`_~z1vW)7RHn!Jlh)LAmzVfTGq&HO?_9Snfbs=!p?{hX1!!!r>y4PxMyp! zncZ;ds3vyQ2AkoGr( z12NjTA(ZVZlFwcD|K(^VX9ihOy{&-iZ8b7Ptr7%OVQW1@oZLJ4Pq&SI%o7CrGeOR| zc*tHbSi2rzK-IUXf*yDmZ+CDML1Z$M-;YNChn-g#VzkJ9Be7!bA?y$daNFq2<<2>9 zXdS!?&Rb7VHN7NT&VbJ0haxnGN3?-W{ed5`lK24P+)+B`5_h=E%W>ZZ2tx++&M`ap z0B)n)xA6Ao&L5bM7?)nOau0l#^lokic8CY?>Rj+T2B?uX6wKGT_BWqO2PCW{~C{#_&4#{GA9tobXWh z`_ln0u`ydUx<_JYHkV3oc@D@-+oe!s6{7E1YZv5|N#4UhH_lQun+#8_05J;!a*(;!FfXk!>IR6YnF$ z#n`l3oDMr{5D;hL%kWEJ0N|f^AIZCeA=ueQ3O@nh(y~w_MIJ2o_jpFq?*VjNe!C+@ z3=g|hbm(iBTMDaEx3m~SrOUUy6N*l6y?s=E#g=+M8!hnR^zR6OGpC# zCg9&s@Jq{>wu)$Y<}$bZDFnHf9|py{3KnR&pB#cmKf=Bu857V-{tB1YJELN!zsfzDX$Omfq1f@koR{S?8 zJP!p4j`x~7+vpG2Xc5`j#>QNTShsp6#2#ZgYgq0HnD}F@GK08pbs@ZsaM)c-xSep+ zeHY@L*f_#T_s+?nA5S>t-ofw=!X@s(M`vI&osB210upvo zc#7TGctI0t<}0!tj3MJGvN6I}WFz7$vJvqW*@*axY(#uTHX^?^Xd9=;+Q3-uM*IJ^6bY@Bj+ zXA4C(#`ubCoJ4&^Hj?Si7K&^n^A*`h<}0$1On0_WWFwic$VM_>k&R@!vxOoX$$UjN zl6i`3Y-vxCjTP_}*@*axY(#uTwzrYoS7c+1ugFHkS7amNE3y&s71@aRifmV)J$*$s za^@?t5%Cq-IEC@7iY*>?_?CK#YNz0i;?osIf}V06(cjvt*%p4>$bWg_y($XD&*0%Kpq8 zMhX%xy8{(WjB=(&$WI;oZ6(G!Yk?$DdDg3Rl4LqwSkX*7Or|HX@Chc21@lVYACd(Ki=AH6$35Fe#$#?x2p!w{Fe1X{1`6nO@G%PPH>Th9Z7GR;jhV=62 zrN4n;+wcH6zv^L!IfR`rB;@;mCFye{lcelj#NY45u)6=6DYM9D4j_CHa72V21w~mG z6TJG3A!xblPR44Zn6LvazXgvYs1orSoBRY`dV{EtipChCyz zKSB~whlKwTfsf*hexSh4KqM`6*W)QAT#9tMETKAN%CVn8fXt66(8xq68D^Gz2jSrMx38%P{djk}hUwMC2VsgHJ_S?g@Cw zi-t5In0--;r*vlz;_|u7Mc@{|RofWAuGJ-?=tvfo+V>+k>|BATwEgn{gngqUS@fBG zG=fA&vgmV#DFi9{Qeg@~itNBpb`pgkMFD}O2dc1dlDv$LWKl4XM3Cr67KH*2GhYfp zigFaD5TqzKAmvdAQWRF0LXe`o0BalPW0jY$(UB~Q1Zc=rbR>&hp%Wd+B6UgXbxuB#SBnXRy)~f)rH- zt|C2!AVpOItB&M)gch9?XvL)W?K+Z08w2?uig3p>DfgcK33RONcoA<6rJ$gh#kxhCfcY zCAxgYaaQgVoZQ=VBlILULLE>`Mdhl0_c!oQ!s7UElW39g(*b8%5MpPp0368NgS>*7 zA$x%?^90~f=D1nd8)oh#PnjPgJe;YXi3Mk7f6zxVAMc5F%B({U(ag2`U^SSTjo5f* zPsAoNvydv8c@81@nYGxi6=Y7svoNy+d8RU_AU2)(ayEJ>698PCS&URAnP%iunwf>N z$}*oL=kiQ7LMk#lK-n+zE6`MCZbTpS&rC#kRc1BvACUPyVl$aTz;ksbg|s!9`w(86 z*@0&^^C`jyX3CITUFIId4$6d)!{E#ncn-gGl!L>DOaNcEVVRLg+n5=G zR85(DaM+xQA!K-Ff6$M}yoQjGnY{py${d8WqciuTHCi&05k4l90iRzW$j)!2QH+Fu^u`?EER>san96P5Il^(x{1MNYe zI+iYG+P?xF{62@)B^=0s?x}<6wAsFtw1Msp9SxTebDPX)XazSTI`C*rbXw1>M%sJk z7h@Ve6+uHlH1b3MyAwDDz_A1l18^3B0|4AaU0E}V=qt6Cb-wZF;7X#=3&~hz+ zK=-6Ex8i>hy6gx9j(8f#izxI{7P@9<5eoefL2D5=@+|;o5qJf_l>kPOYV=pYz63Tp zf=mVt$MCJf8@eZu9Y~H2bh@{$!>HURu-4_US$(3_G{aCJHgC1X_)K#JTA-l^WzRv< z&oyZvT*V~alQ6Onvk)=)Xb2<=1%D+Y_$dT0LvV`(?;}?rC}rnc&^?tS6C=lJ>gp{p zbiB3F%8;K`pqd%#0?M-G_4_&b-;80g3VCkPqGS+LeoyM)Stu5n+l?^CWaw`HCc2Az z>FxvFM&$R(H__dobQlR%!>5KY2TjV6&lk}z_-;SLrX(uO48KP6h)<(qp94w8ezBFq zAwD*RnbY2rgUx;bc&iLdF%#Y$B;b4rH80M0p0J^`d=<`e>o(zKF;%R;T~h4`iHk zk=@r1WZDpF4rBEwTyEBf<4mPD>%$53KiXT4+Y@Xm z;zud49v`>I>hrShQU4{>1LMx=Uq-%hf1BuxCEGd!{ zRXiR@MD##HZ~mJDiI^NnMAGLYo!qRC6tV5K5)nO+kel_95|ZG?ZIj?)l&3<97Igp6SfrMNB7Ni1lv)-*x zj;4at)dPw6`ys%U4A-0WZhyjhv)-*DtT*f30fhBty_+GdH|yOx!g{mb9Yk1f*1LlV z>&<$16k)wt?~W#{H|yONvZgod-7y@rdb8dgOB%gd@3s=woAvGncB$U1cTXm)H|yO~ zKSMsaScy|H4i)24~p0+@oSaO2vre2tL+>+#Njc{U^sBq9lSx*9XyN)$c$A^RYQZQJ9tz1KmIX+r?%;7CL$W2}4jz^TNVZhm!Nalu$c5w#}%L1Ij`y9xi`NbVP zEDP{JM%=-}vH%Zc%DiKRH`#06u>u;yDyP&M#|q3CUtCJ`-6$eH1%U7BU-2(=3r172 zj3FVchphZuf?5^!!|1J~kNN@ai~N3YJ(;sYEe33?D5cGlx5 z&CFvN^Wo~xmkuTg79vP|fWst#z}F%Zm?RLG;&zxM=#Scn4{(?yAS{hdSLu?M@c|B# z1b<^*FQM0AlHdx$6t}}9fxyNjf#hpU5(rFjJ4_O=VlE$ZAa|2|jSp~`B$$FA@c|B# z1SAn3;4n$R-f<~zKix|cvYgcsDp2PTCJEjJ zC)L&54HdGG7RWUoBXLg(JBJz(3>9*|d2u*Y%S3pUDnyo_5f$N8n#qbs0Oe_?oi0Ue zC(v5i78UcW9_XHzmAzL9X%`}LpcwO&E1ZGu`Mio$Mrp|nh^m_n7FhT%!2Te0%{Bi|;bv*irwTLEK5Ng81Pjh8=G?$bn&YlQr~926Z8`nUvjF^<7x2 z@E1MPT9xMP@%J)+e>AgO_ebm3fD(VpfA~%Nqg}T~j&6-+fE>Pnj(|eWf6`TB=E&nt z{0jt8Vla&*7M9#0&R~JEYQRMtKSqNsXJw0}8f>}OAT(#C7$9RN->Siu`)g2yop+g$ z?wWGnB&`05Fb^^VE=P9JU}Ltq!pGOt*bZXUK(eT6Y%7S5CcXwUp0n&6W_TjOZ3q%8W|92u z$kJ@13Z4Y$Suu;G{|F+p*W#Mm+iMAt*=vym{B6O%5AaLNa4^bWk@6C37R+9Y1$uie z!v0>1$+*{=L|WZzZTAavHyMu1UTY*?b+gw}j;4at?WY{+UW?)0UW>4|*COogwFrBA zEyCVji?FxXBJAz82zz@i!roqsu(#JDYu;WrajpzbxIt%P;25p5%^ zdyQy2Vcly)#}U@OMsz%3-D^ZU2r`{xXOvf5oRuj4FS{_Yx*l`O6@p{AFNO{)+D{ zR7UwLKEvJtZjAC*e2)Dl))}Jw6`wD#Du2Zfv{?^T{)!(Yg{tybe4+gsm{#Sl_@VYm zsDdhg!LTr6RQW5u7+&l=<*)eRLZ-@J@g+j0%3tv#giMvc;ztRYDu2b73YjW@#g_@0 zDu2b73z;f^#a9TKDu2a~5i(K!im#NG7Ui$_@lpX*{)(>>M3uh`qRLv z5i(W&imw$!mA~RA38Knh@pXcz@>hJlAgcTo-(dd@ZL7*(@r}ZnDu2bh1ySX%_&GMG zFzz+j;$eqxsVINN&$IW%SP|u~_yzWd$js$3wHQ-AJ{6ePRVyh`#t_j;O6C&u#1b5h z?whC)O+=X?>8bE=&X7~PDdg#`j~`%qXYAh!>NDFL~CC`=2;?L(n_OhtvKu$ZB`eMk+y z5M{~sAvHuMA2f3<@~*lW;kfB$KJ1og>!eC;+8D#ZE1uHK&jK)Wu~;;N1M>9<5^bH- z=L&QC0CznS&g}ynkdFh)qOAi5)~V}+Bz^Yd>Jdv?L(?Ea67}feSo_j z!n%FnxP!Z%7WZ4W50%_Lq&5cVR6J&5&^PnC=A%ydw{(R(C-HPS54M)phkbhys**zz4voisiBZiDU z$^FdAUc6)^HZD|In3!c~wV88t6mT({JjGrMd_Up~ z4~65JDfU^wmk}4kYE$ehfo}jl5V|4OjUMm^56B;l9TNGb3tTFxVTUAJ8y-NL4UQlG z`7ZG*C7x7r{_ayzJ?&p}A?++0YV)b4>_XKyuM-Rv&+!-h3zapPyq<-a-V%^2`htD! zvSZi)L-@X32yQiqZ6HBZ$J3xYyr7>lXz0=CSNn7J;es@Fi&$vcJ-b2Aqh1aPKW`3W z4~mv*kb}a{S z!3Wf}NgVtK3gCPck;6YhsA=xUJ!8HoPZ~fnK`~?{07%d%CYJ;gKP!r@PZ*D0bc{F?irK8N8gYE zR08V$WKt%&a}ly?%IGXuw>)Cv=y z0~)p~<28mOk(>@RF{>n{)F-%RYK}E{vmrn-XU%=RU9iVjM82GHE0-^$ zyxx2_mfmh`9b7bf|fI=bt-4x_gnC4bN;b=UPW}WG#Zf05-A_K=pV4tpE-tFd4vF0E4eZzTSJJ z?*ZOB{7w1`E4Yu%w@({pA88n=!A#a*Jh-39K{Fnl&m`v)*02d?OH-Ax3j}Oj)JS*i zAZ$df=E#y~^1-B}Dz7yg4K@$|?H;nB4c5Y<9tL}DN3Vqc@G&gT-e(w+w@Po#vRd<) zf31bYvnBB>NZcl^UCYE6`jWJkNsBwsqB8CV&IB8ii6XB$veFI28drG}sMel?oPrU& z-s4vptZ|7|ynY3O8<$$e8wgnA=&zx81>qn+Afy#c$0$D|@`mzDr9u3dNYE{Q5I-pr zbdMjzX+?s5&Y&s%@kaAklCtX2sg8AFr7wH^1sYGRN1>DXH{?g(BzygzrJEAw;mZs7 ztWwvAL*zf}s^p^&zpkM25z@L&n0mdF@bfiO#sKl8rMNxl zNlQuYNlUjN80TbrLjPRYE6Y-s$6Y-s$6Y-s$ z6Y-s$6Y-s$6Y-s$b4Ku;ofGk$ofGk$ofGk$os+dHE6lL(0hAW+b$0#$D&#vm&&7t` zb9OH8w&(1ei0|y2i0|y2i0|y2i0|y21^Uj;iFnS=3H#2@iS#-E#cx9o!iPx7v<(qirciA`b${63o>%KsI6R#xmO}vuKH}Og`-^44)d=sxE z^G&>x%s25$GT+22$$S&9B=bzXvZXx}udIOYl8uP(l8uP(lI%z5i$@&3v7WQ@Le#)B@wyF}g(=E= z0RTQ5bYm`x7l|^46wgoeFTf5veqJZ;j1G7N1z7Q)9fOZhhQZTikDbaRn1d@kaaBQ9$7GfEtb zfQi#|bCFVbN{a&Z(ELfB{3gseYXfv`Yl#7%hmBO;O zLn?(8P^GW}o`9%AxkxEW9EEa`(v!koiL#6omQxSAy%x{@cOyK>!L3Rhp40S45FBx? z!&931_W*>`UZ?4&Bgk`_F0hfp3T&jXQ&AhwX*ywPY~Bhso!)OH#vi1x#R&3D$3Dq? zjTBa3BZZZGjTBa3BZXzf!hEdr^6hn+zMT0QDJ)4mr|HshJcPg1O9Lg2D@kmmunhN{ zrVD&0S_o2Du7*6P=>i)mEHm_+reDuW8!7Bn3^!6(!fH5bJs?P7Ct{udZw*KFGg86({<9i)peWNn3ZbSAodW<@ufdYe&b1jH3dU+CSv5V}uG}MvMo54mhb($( zPh;qO82~kS+CA4`SFQrh`E~*3fyc1982D4AVy*s6T)d9Rpw;fd&9)1E}{%8{Wg7s^KF%hB0U` zfJVrJaJ8sWBsGnYkAyoAvugn-*fGc>rGQ(#0v_`U`2BxhKo?5;#sXH^%e(@<^a@B$ zG&QIO@L$$oEeo(Gp#n|#S!LL9Z9&GUBg9awVtAC{z>mMt#FIC~&+i+bi}rcY#IG=U zvgKdXFt6Q?XQ@=Rkxb+0lYi_=u+~H|Ki>BxKVE($uh%e>U$A>sPA~t{488DgH}++Z z)jP^W3;SP>{(*^R!@z|)QloXG@0qx_?@h}2cqbasaCab?yh?>u?T;VD5Nor)9M)-Z z&bE7wOh9lZqrXi?|4j6cj{Y_o{VRye=x>+N-$T5U-pSh~{vP1^0*p5=z&Y!hQjMJ! zo2L<(d(BgWFgEv04Wo58f0)uMyfv&56l_4Lh{kq-$J(>``ZUNJtvr)Rd2SG%fA90$ zAUu8M^E^y=uI==AZ0h9^ISY@^_u-LYT<=w2eP`B3yMn#Zy;_WSrRuX*JpGmkVA;5;%JK)pxWXC7%oYBP`EV21spFJTLE z97cM!4trE0bspwtlvAIKHO9+W%e97|h)=uyntd38Mo3G%#)cRvgY7lW#3N;v{o{IM zKI+)Nf%tXK$D<|`qgH=rS6idEvxbwqAXjclgP@0p3oVk_WM(!G^%z6NT6;1xJQ?U% zE_3YNnEXnht#g4eRly1%6HLr!=Kz^#kmmD&bQ$MAmW5^(m>c+86Zm93HZWDrsKp=gv-_@p9&LY71{tE!( z_Xe;KW=zNL51-UAS$lDfIY6;sW^zaT$HOv0L5TrogQ>{Zmx+~SILwmqhD3Z>84+JrM#Ptu5%FbZEYO#g z5%FYYgnd~VkzQHZdN9~4E4v&c*OQeI_GM+Phc7E*p}wr_DImVAtQmRxvNFbev#g9{ zzO0O7-z+O5nJ+6N**D9|NaoARNcN4gGPblQD`N$GSs4*uRz}2^mAwwcmz6Qbmz5Fm zWo1NsSs4*uRz}2^mHhl6Z17 zfsGuEa349El<*wV=?Bfo(Si`V{J)l?wJ_0s;2m0T{6v4V9F0`?PO-?T08M-JdkOsm zZAKPsYuS_N`60acDBpvut%R5_Y}Dn}ELm!S%a2}Z>rS!(b-$T)Tar|}`2me|0x zc=o4_^8^RJt|L4-+DizAO*%ZKncoK>oc7AmE=Q0jM-$k{(F8VfG&-U6HkKKwjYFE|51)M3`CiocrEOLP;fc~ zWYwo}JGqnZQYg6fB}mLV9zkr_-Z|IX{f~@NF$~K_gvKzgKE_JFR(54!dp&B9`U!B^ z{pZ<*i0>dSyZ=0iKM1()a$TG6Xt4XVbpt;|_6I=b@DDIlr^1ne;d#)|f*hq11u|?c zp429)gAxum|ASH>AUC~{-1`p>p8<~FXq?k&ZNpj!vc6t!$S%M#_ zoy50^O)1}U#+&zkcr}~ietRQ=bUS@NTR^wd_s>F#kz)Ghe%4L*(Ax!+owb10=-tmj zQ?<50(DGOfn{!Vvr_I^Q%+5hQhRSxjl^Na!wElb!qITx=0?~_o^pP9Ue%M`)V<|-u^%4%T~K87u6fj~FmY4nct+!0TkzPyY8 zd$;J9kRecjc_IOtDZB{4!1+i^jlfrtHF``p;T*%qvq!lHAGj1G?42)^L`FAl=2)#) znZ$#(8WQ$7_u#@-4F&>6KKNz%Si^6l!yYqMRwTQJ1s^rS3f3_LbBT~!mT$7U632LSzC@&_&XS7&{}LgQ z|E$h3id4O}@6CO|A0bn*mC{Gk#aT#Fy)MXjW10nq()*ajKN_E0V-~+64I*O}pGkD0eTklqiOEW#X^2m4bn(`qQyca z7V@JdBmt|N@sAttG+Ffw(nQOP@x>Mk`Oyj%s21|0{RsQM-Q%}$3*>Ri15DWPPrA1*OKZE9(?csREDawfbfQ_aW^5bLv zgjlhVA0PV>K-l!%8{?vtup<`o<86f1LVmoRuv*BEk0Y!W^5f$PtA+e{2Vu34AMYfr z7V_g$2&;ws`0j*__#%;b7f9GS7*7#jBnmhkIV6d^d=$!y&zXpMKiakMa4SBS!B&*Y z$MJcD9ru)_9La=XJaZx7{dXfd{6FGfJQsP*0Z__8X3V_MsuWh7V&(-NO&0+hb&Z;6=~c$8yZ)XWP!%3Z=*aQMTC9EXFNr!a_` zd4Ur-#)QSpi$T=P3p~m(M$NpyaU2U&GcN`aGcN{KGcWKcM=E3H1s>%pz<@FH0*`X- zm~X|*3p~mZw#3W}Jj$^ij+l9YM>!d{<%qT5QI4MvHS+?Ga-7rE%nLlqF-Fb2z@r=| zQZ@4ek8&haGcWKcM=~|@0*`VeQ!_8{C`U3i^8$}@BvUgl@F+(zHS>~OE@W!v1s>%{ zre+**wQD`%nLlqu>xx51y1CMsF@dosF|1KYMWmNHS+?GawJnTFYqWw zM9sY5o*fZ2^8$}@MAXa+JjxMKGcWKc*NOJLOU%5$qZ~O?GcWKcM?}rMz@r=|MhZpP z;$esHzLu!eBhJ%=>4grn{i*oYKnx#&r{Pa&T|nK4V; zpA(iDv%=VLPZbqnmKGcCsbYd^!(CyhCOIrW^7w_QZ@PRd_G!^W7U6~)o5m8O&*^@` ziu)dPDAJXuAUNzM!Ajap>bHTFw3*a5p!l>@Bjvt8SgKLt@}xICjQLc!o#z4`PPod= zVfYBbHSWgq0Gmm@hv8;YAMrHc7JgV7-M?M{cns-BxF0fqGpWB!*i7o@5^f_+hx;0N zYiF${xz{ky4laqNx~CJKKzN$VqxAGdw!#dT?hMjXyAVFlJ%ed?=YXH@4kP^@%yU8X z$Sy0r=e@{sk$XMKr#%RGiOZ#adJaiWb1x-4m+)ryJZ7^W;j`TP2=7n$9Jhs89zgg4 zm)pejBC^xtj(z~};w@n3GIUNUI;`p@M2DR_P>jsH&jK(LSl|cD@n}*FU~qr>8idLi zM|u2e!Wsmig&g9Q*7JUGZ95y#YWWCZ}HKKtm3|Qe~QCGg>?*zyazw2sImJ~ z>`K8R>MF?>MmM9pk^%uK>MAJ|kfN@Vlzz%K#ICbiV3Ri{nEihv6T|r z`=vwpv0;PP;#r;KOfV6V`RpEq4hLK_j{zJSx)2p>K&7SjA_Qa0j;A#KY5>B22p=LO zF8$0dM37hmD*aqx3cyOgRG0#=Qaix$B-VgR0|HAIJnH3TtO1n<1H4Np)__Vwfg=f1 z09Kl#Fa=YI3JZ9svm(lV-2V@5{M&6tO1p}LMPUMO4S-r z{AQ5O^wK~8Hj%^wL&!81V7OQVDvc{l0a$54pbG!Q8c=DW!W4j&rp3IFSOY4p2nD^r_YLg`t1Iok7UI@ zeOBz#XT?5!R_xPf#Xfyj?9*q(K7DpA$}PyAhG$_`?9*pYL7wTX*r(4102gP)K7Cf~ z(`Us#eU>*t%d^${V4BSCn2nW3R_xPf#Xfyj?9*q(K7Cf~(`OIa8zVF;_UW@?pFS)0 z>9b;=KFhnqby=}bpB4M`S+P%_75ntrN9RC4DJ%Brvw^wL>Bx$G`s@&-YRZaz`mETe z&x(Ee>}%k8WLE6cXT?5!R_xPfCnJ1JHiPyVn-%-?+2zQ&EqfC}+OwB~!*N-$PoEY0 z^w~7RCuGGwebxfpnHBr=braE6>+tqmjSdSt90H#AgiX*iFy0enbEw`E{)#U4yeFKQ zMjBVWC-7bMyeAO$yeAO$yeAO$yeAO$yeAO$yeAO$yeAO$yeEK7-+KaK&wB!4&wB!4 z&wBztCZ6{M?w30(=O&ECK>n-f>k@9ToFAfsfyKBPSzh`!@Q8Z>4)4oHKFNA>AzD6) z6jqeeW%+2rjx})8#chx$3$hY_2bJr-~{I|;euWq%DglD+AC+j6rPB8O~(-^vX3L5+U!xF$wF{% z+gRUT`3b7+-ntbna1|TeayNYi_-ewA`#5OIuOSIOCT#ayD7DB$m#}KT0O#6vgM(D3 z$^MZygR=9$CW`qf_|e#5!QC1A3|O|ZL%@!m-4~Got85@hE6PU&w;{g#Am}ZWj}EdF ztDKV8@)kjy@-GG;WQ-u;^3RZ_d~A@6M9XQrw7gYHPnK8j0MZsb71Ls>JP*v3w+C5` z600_XiYqgx2J=#2BS^b-4@#>qwfa9W2(RuvL4L;j zUrzX5h3U(p;y!`Zmqov*n?|G4mqovrj1?<%Q3ooUEJAqLc^?&m1uwi<>dT@sLkXGq zvZ$=)XWkND7L_&ME8^IqFN?}rt{ByqMP-&SeOY9X%=2Y&IzAP#aAgsPDD(4ecUlx@Io`F);mqq14gms#$Ja}JltiCKN7Z6ro7L^MLt1pYn zLkO!ci^@X@t1pYnMV#_fL|D0)F9r0topaORkwh#cpUsQFb$}yde~jGw=fsLl_4|hj z>de*$-^#axrY#+6x@Mtv;h~OC99G`Fcsfs1K!9S@+I`$ z={{J&WCarX?4CZjo}q;jns>er&SGXM32o^GgR}h5>zG4Y2&(7$;F&C~NJ0-HzY3=2 z04$c!<5`-5E>2QO)la~8$c}=|EUiUC+t?1R0yY!e zUBK=A0q!ASi1|(va4SQn3-~L7dl8I}#<-YUDqH<&_!pYgflXKeLxvo_2pYi0017)V zVKE;MU<{oKR7P4Yynq27+K6wCUCH1OC9+oiVVGX+XT=a~+d-Yy2!z=^FC)HTKG35l z!1D?a@yT!_JXXVHf!$#>EEKK$6lxP*V3b4@-z8Qm*J&~C^kIj5aX#5jkeBWJC8t)v;o31~)YI+Gz`c}e{Uc#SzD`B*k@R@HV zgl7=4K^{N<7Q$fH^QN|>tm)Uc9d@lvuQn_Yrc?0W8yIm)VMoh|MdQ2YYmZC7F?YzG|X73j9wUc&Mh=wv~i_KDaW*p9O& z&|vp%>vTd4Np5!_bvsqF?HuPKOxD5ftJbwoX6_z-?YefVN!z)y$qaViu&$lE6(8Ta zPG=!l6hxhVi~MA^KMIA(%f;D#k1Fj04jRn)w_rV|k=qfuMkARsVguo38CVyBh64+Z zb)etl5A7$B;PSq?VIl&(CKgve7XDb~?LL(jHK!K(7JitNVLmjhGYbiJ_pIw>t6+fe z{4Z=>{WZ2^kTG)(GO6G$ECsu-HJM+wjst;v@31trtjZ2RDe~cH(vKXQP4IHdVO;$U z?8*;hFNca*9r)Qj9r#p^K8#<64}$!Ve8MpyLslspeg*tvl70~U68{zx|1&m7_J@M^ z0B@6FtvJREy!7CU{ZWuv2fCdm`3!v`#>B`?sz|sZrtf|iRG7I2)F$-NKm(#|h zH1j2&L0uB`sQH}W-%M7WOM?23xpH|{azAl?r?nG_?4J9py;?mhwfZx;mRc!g!Si0N zo|RfO5*I$73sQ`+7jUh{bEX z>r+9n{wEXw>bBq%#0R<;$apNr^G>kM*5)*@4`+)$D@a&d=X-58>+t1g@ps=ue$HHP zK4OapQNq`9Jb;%Y(dcMeDLQu|gu+6I`RuD1NH6mM(|;}P_MoQiDq#;$9u$8V?Zi1l zUUl25zmMy-Zoe64OEbo@UNd$}Gv3W+l4exO-w~I&y<3{;3*z!6I6KHMLB((ImdmH$ z?4W)Mtfmk<^qe5G9*bxl;pa-hf$lDuxvLS^w=!RUjb-#LWo6F8%Pfm?CX&jeET<4~ z{j_IM(7Irm4Kj?eHmT7wh|z(uPHHp{ENBhZNewmvAG`HPq}(8Q)152OE+-3nTYYxF zZ`fTb?8?%;0!47rzZC_r{bhDCADWRZi1a#!5yl^4pnDPce3mVLjN}Lw`C-BUUOLd@ z^BCdtX`jzygs*piH_12pI7u0K(HpQ`LO%|;Fh>jUGG55s3?N@)j)fLrFnJM%IUD;i zX;|hU4O?V6WUGGIdEjud6#Llz#!_L=fI5%i#lpZoU_cvou`v82;&rDXV#VjJNh)i4yB)L7r|uDo1uet@$>a^)amRm5WCMT*(yv z9$cKkkBU+@5r5$;knRX@B{P%wSgubW6Z|;fZO3zs^tj~A)vqiGJk)6`;T!%$fF%XG z!%f*PWcF0xX`tOm+*AnZu)zynLKTla6b3mZuW>+iZLBz#0G%8giv9@EP12)J2PmWb z6>(|6UrO@1F9XlrhSHu9`~lz{GCaox(PUUC;CCq4;5wpG+Vo|RXrpqz`XS=jsQldj z%dnM?Kl2!j?!LM&9XICE_U0Yc)cRo*H=43n!_>_qpRltOjMqCoVm> zP2yh#u2r~Aat{2#dns@Csvu4KZ4*iei{a)P@0GObTRFTgmgL~k*g?#}i=(6dVqr9m zg7n=}%2C9nZ7&f<=MtC6-<$@x6s%J^l%_;%ph_Lm#Rmp0AhOQq;5 zh~}WXLLvw3G;@CuxRUyPd(YsjDSbk6>60?cVTI~Xdm9XGkvylNe-}ufu&uPJTcoPv zQJPj&DHjlzs&0|0ZXhmIJwvK`1#q1=&oEUnH9bpfis<2}O1DJXvvdwsEYPhh1X<8@ zfunEhH>V4WWbHOoaN;MNQce_(D{z@amoGiTyt-)2E96z)_!Fi0uZT-s)=FKfUIm`R zt@&Dsp8$NE%m8Zx%nOrMyDZ4oNkR4u?X&f!qRKrN03#d0!+-1*-GSGKxwkr0^5BTm z*`D%U?S@08tb@s#u&$Js6BpJG71kdDu9MedY3DxzANw@t-NPhjS>4EDfn|`j7L>r* zN|s*y1Yn`XB>_INSj@=2kdu}9kYTvo#@zOj+`{M_U3r~?TpFr?jsoo(%`y~xgt47% z2%d;wtA0DBtL=UjlL)hWwt-sMdI&%#*%G0)j8z87SWQ|E>FPhmk&ZoFa@e__XIyt& zlh;VYwL@M*qsTsGxHL*9aNU=T6nqizhIf#h35VjhOZ`!2FwAvSZ=L_ZVh2g$8<0-> z=I4H~gQVCC{9={zmn_!CIh8#`7|!`4ihUT#nfKLwiwy-YeFZfi{}Lj187|%$jmygV zFJD4)eI*Kt=U`lw;1gi?+&A2-`&TwU#5E{nln8#l67|c8#6|Fid2U$CYy>;~8&LH|th4>(um2<|`wdcud`4(fVV z2YAzVPe@)FM7B%6Bn8JluW24%*nB}d5Up=gfhlUf3c?j#far!WT4*nfrN1`!>9v4} zGvHrKHaOT`PXpEdpvnaU{`QjBa~c*QW-($i5@WWX!EPAiZdidRZVyM9M34Yl+0^S~F>DvUi=i*~#S=Xaw`y(s1 zu568h-Sgo!eI{NmiN6E!!~J*-<0zV=VZrVh^syf7p3OwT?s*t9%$7ZToSzI7q3&rp z)#fbYA*4TFBXf}+iNr6u$UE$@`q}R&T2{gh0`@v46EHp;-> zh~CtJy-|AmUf?pYPmzKBKBHw|pCSW$(3{@CK1Dho16x{?ZBvP?{dWuJl=e)AGB*9n zaVACNH?C_DI1BvV#W8iXWJ`X}!O!lQ-Qw|kwD7wC3@E=x3%{Fz3%|>S-@6!nBG$t8 za^d$+z=t2#h28J5HnW18dVQ0QlX8-8;oXq6hvH*^%iGZfT7Q_l?N?00et`}v1Oe;Q zeHZ2PdeY3%K8dqrmr2aQ+n|IhiX*x9?2E{QjinMg5x}@7ptXXmdIsGmg78I1EIm6= zdzx$so^LsftFK@mAMCf;B55;@HSObrrOl?HR=TWF$|HeGn=OzwyN=N}a^0~&+H41K zsr#S6-@$rJmxOG|sZt_eBW;lBQsPu(sSPq+csmSuGiUR?CE-S( z^7`#sL3!K5ToFTT%opsY*D=o8B!_wU-sp1pq_JLEZBo{iepyQSFmTr`6bP_cV=N5tvwJF9JwApBAO8<~ zZvtLbb@h#(bMCphH}~8j!@bGPNG`b{fdmM1m;(tI2x6E~5oJ)BL}n-TS_gj0PlTfX--~aiZ_xrx*&69KPT6?d( z_IUO=Yp=D}_Py=axx17&O-!+tD7F-tb@B4GRi+xd;k!!ozQv zAD$!ozK-s?-ffwQ$O4C}4t9%sJ&U`S1(KGzo<(?ysI<&Z7WXZpvb?jCu^E5%8>6K3 zJN5eZsJWCuZ@43$y=spZh0RSQO@maXyEO8XN1m#hSJ76Sn%oaA^(=G-i5u#!72}DZ z8d9{8HkZ{{IeY6`e08e%ihO0h>S)-k)5vWcsu#JHU4Sx}t%K2!s&6i0Wrw3sCrBAD zVj0gMDs{h@=z5}3_lsHgR-mJ#?h=bZtEzsns=BSJeu=7ju!)MTOUdQ{(n+5R_7`B% z4kw~0(hgKi9cx$Paq@kOgrb--RoCklTBWB$Js`Yx!|On%chLd1HB`{IbuAkzY;QHZ zhGNFjP-TYA_89qnz6{5*p*CZo{va|oTkpd7R}D3m4Hfx|+cINWrADICGAFTR))1AJ zIf=3N0c~dW1w%VEb3|*zR*lx88ZD?Atwl9jc(mx8##34N8JLXz-VT&Z&Qa#ix}$tcIue60o}WZ;ZY24!oAfp~!~s3(%dk2pCsOjj^SODPQ+P##GfKW|hWT<{0H0 zn4o2WQNEFYG4^uOE)y=p>lN)X0+=N?;69dTY?LpO_?h)8UNB=EZEX0r0hifIqqXrb zBj^Q`a{Ms>?-BR_Kt{zyzlQ8+-P|eEc>eU}8Cd6#&3MX&gF`73nW!LUL#& zK%RFJU@rd&V3M0)@>TWtYQKTEJ-GE@xVx;Xz69h&DgDMp4*f*&MKJ;wyYy>h7!QgO zm6zX4fzITViqFU?w{ODHXSl2t=9EMM9voch-R6{=v8>E1eW5w^wY@NGz?I%R#dVfg zyuh5Y<}ExKxQd=Nr=Ez;;FW%G>h3#CgIC25rrbXd?p$%D_gYhWzlOyVTnr$c1J zl`(iq>wI(`uJoheu@5|OrGI5k8I5xAO8?265`ylKSGt2Wr53z-rMsI`?;gUVbigq( z)xHx(Hn=JlOga2h*i7L{U*((n2{`jg-!x?y3dbw`uy5)D{PODbq_G4;#WvpU?76|X z0Osp-gE93y4idvy2~TjAIt-iR0zM*m7`CmBMDgP*n=p78wiOuUBj(RGQMEt~I=f<) zihlq<8RxS5JCRAi-hjKG&y1}OvGy~-R%d0~W(JS(%-DnZ(igs25lujdUtr5$5J2pm zjLi}L%2!5E4%8-z|0&#p>OgH0WLzEuZJ!2$@4`CW*H^$Sl+f-qm7%LpG`kKX2)X(J zP8m(`UWQ@;0$@!D;MrFL^mk(IX5waFxgU5YE$=f9_=*scNz40;hZMYz@Iiqyu$*cH zA}m|Lz65t`BT5u>*Z}mxe<{*BVRFF7n-MXr&19B!8SYW>Y8i?=0XW8$qEM8nj2OLI zhGM@*uxqN-2naLrySO5T{|)?DsB#%Ma_#90O- z_A>5HA`5prb_gYP@)#bBaRZK%PjclI!bwgc9K`ks#1oElKzxP$6lWq}PP>4N&ylCo z6H!K(;p=gsqVx*k^j-=C$A*XS6MY{Hg5j+D0LQp$7tVeIA*y`goOc1*MpV37h7*4P zQG#AAc}ki`lrKavdbJEENrLii!Ousy@>ss0k-y-ana0j=QIQXv>D4k^%nXg#$1{67Sq%Yk7stp~t{~WG0ecPDM#Z0HwEtf~ z6Qe)N=zy;P8ZqS%g0LN8nJs0~Vn7_HC{kLJ0C)H;l*dcU?EI`#jeTL_F6GL_F6GL_F6GL_F6G%+Pb)K*V+3 zK-hELK%~ue!*eK2o9l-6(D1J72Ev}}2G+xK-M~y6ix5lK4S3_Vxo+49#B<%i7|(SB zXFJbz1Iaws4J7kiH;~M8-9R$Wbpy#f*9|1|TsM%+bKO8P&vgUIT-Ob3Y1efFE8w|q zAmX`hAmX`h;1uq;ZeWb(x`Bx2x`Bx2x`Bx2x`Bx2y5VEAr{}tXCG%W25b<0$a3Xsg zz53n!eOl0^I__6LnlI%i;Sa`~C5H-Q@27t`~ z^f1iihWkLmWZA+`A&w7J#K`0sErEP<3b0IWxDT8vB$=C8j%f;>Pxv%}tx6=#b!Oo% zIoyGC>b1g?vg5Y-DgtC=$NeTJETf3;u6TwZYQudzARn>Vr$@JtbK<5M$6O~H?&Fq3 zsmCGi(}}n%Bpwthye*hz8VRIg0V9)4;*Ml&HK45$*{q|r8F?pi1muSMM6Q6`aG#JD zsl^TViG+l%M1q98MlEi*PvkQ+D!wK2x@<>Yv6YxA^Qt*Tpeby=Kg;$aJez}1z0EV< z0KdEfb3cLub}R1E%+CVQvv4M#oxD%YbqLBl0r}*8rr_ORlJ|vzxwSsev<9NcFm?xQ z2^`)4xR5#U9XZsH9O%GUahYY}30d<)#IjspRs3Ou7F??TG~QFt$c#sI*xG7LXfV?AcU9EOxXJREZy z87A}21K#lo;6}&sjpR3L7-)^OiZ0o~=vkW>?cff9;WT`QC(D>DN`um@WXGd`6FfFD zSNbriqcMueG~>3RNKkbX zK))SEhFK_KR%~)gv3q~~{C_$6rg3;3S2`-BiGz)Wx45+a=lr`$q^HzXQ`WUhKoCaeW ze$CdKk-GBUdWj+YD~RTm>@ZLs0{#K;D(Ll|uZ>Ep=)`D~OnG07KX2{2C%m!X5TP8xj z&%p7=j9&^LM2H7J<0IfT(>WYN!Wk=2HIFbON27Ml&G)xMgEbwl6m%BmOKWSmD?7)G z_&7rI@$p-=6s#56Omwz~ZUNd&^x!JG>*A=Fa`gxBuQ`7wS}W>fjcx+Y){3b@{0*mk zubS6@O{_4UieU+*Gd{M>dWlRSvUUq1n=vouBeI9tQW`R_meH%Cyk6bwo6{Y`coH{s zk)_@qVtZ}$+=*0&N+gA>KJ_}f9?P8MKZZq_;N!?23;sCK_B=FQ7FHe3G|V%6>=Y>8 zdoMvVpW$OqLG#^*M5Y}%qZY#m2-v$6T0;nTN|6RZi0qcK< z26}Er>OY_wr~+0iQB2>~U`7wBU7@PSk`8mQG34r*!Vsa?=s69PPpcO9`@W1evW`;I@pKky)EelKmk|FG&3(CP)TR;k2EvX= zm`jfFRy#(=e5$C~O44Rwwiy}LE+9oA=4~__s{>iH_Fjas1}Po33}G$vRahS###(Ja z7@ML+!f37UHo|~yh+;Jiu9X_>m4SSp`q^8>#-QPt*3D<-on$_QNM-%;ti|VXuslsF zaclEtZEF7TSC^TE1B=%JISS$B${>R}Id z6?4?_7IWSS>MGfWBl`@DL&Wj0EA02cx-REaG*Nihf2*ro{mzGvDGbU%y;Abi)ph@3M@u?av? zVFCg-vz8+lBeG{0Gki9pQ4g~R^Fg2yX0xz{^&D<2tubsi2U`zmpqEZ}o%}u($F6L) zWDjY{t|-4635u|pxb$>SNjR6dbahXQU404gsu@eLg{8N|?*`uWy4Nuj`dIu_eG+)x zp>?pN<~!T$Z{30k(YN*KHMLo1G#Di)_IW6Pbiw0m@B|}}4YFMY`h5#a@$peR5y33z zT`E{w68(b|Jy+={uxJ;IDi7t5%9TQyo$zoDmhr6uhKoHxuJqmTMKiG9Ou>Vt7J+W%D|cA$u1^#goTrp?XmdMqGgA zDEbT!-lCo^ItXahnTU-@;bqqVRP`wjNK?RHik52Y`zjlZUZG|(y1iGAmkt&&+#~cdbg2JGj@fsMq)X;xG=gnuF|ix<;Dp&fRwYa(bSjyu-7zMj^R?*y;9e~_tv9D_DVg6vl@G)8pEXyw=21> zQ$0UeVuI|N(O@jYm^EAf0ChuU(`^#NcIf>%=CkAp$R=j;+nb*@^34@9Ny_O>^2(CD zU~R9ygR+DzKW!GV?{iFk1xyF8u42lSEBH&mt3+=WZ^NaC3Blhc{c@(y6a4%yWVav2 zWWKQPmBi31M=81{<@pt&4?)!D9Rz00Y%p3lHv5^2llXubf>&7TOMF1|a)BxUlNeG0 z;0gjc03Ia}0Prb+FTknC-_hMwV8_vx3toJp*mcVghK}tiLHgxp_LK?I&M-zERMAts z6zqL@1GW(jcm+g!llFWIKrduK=Iq>2tVGSM24fW~G0~I?>_btc0?z{I%L+*0-yz1r z_hrHRve314NXh~~?qzR`+=MV}5BRTtQsDh6I>>l`8Q#;ppf;YEr!iHbrD|7!hy#3urs8)S_3(Jg&QzIP=B0=C3LSQx4nu1V z*om+qsO^A#07d~A`4Rv;SHBPa~iXtO*J zukm?kmS^ELJ_^n99K6oQpjn=Q*Ey{;%armu(>BZ4|1S>xF*2+LG)|0>`(aY>ZznFZ zl^$5Gsr@Z+@6RrCZd(xZdRX;R9M!yFE{Dr{d0K)isp3KQJ z<1^l`AJB?aQpjBzFedRk^hJ+ZpJFhhz|jRsMFeRgK!M~e08=P^m=i@ZxDa^HEPOoh znbXZ|Oya9K?R`F7ikK8^J?|OpG}B7B~Uq>RaGc z4yny&G#I;(liAAF?{_MKs!-H^X91WApzf`8n8k=qW}G>38i&b2q%zh6UGih5Iv+tB zNX)SQR{*;X7%KM(==4{gwai4(v60s>PD?zFr3qXaSNTpm_CtL9;tI_7op$1OXv%SA z?C?!@mDz>y>8|QIIQX=ep=IP1sP|2G_3edar}-AZRUWR4>wMGK-i)PfTm|E&yL$3q z<@DMM(3-e{4b%UON1IpCgz3w68wRi9*6FSSJlJLWYDDrXm_B_SRzr9N2Z+6nZTz{L zr*%Fb&qRj@wWirLyP#%%-z#@Dx%y^fCnRRu$nWl@sJubxsXu`*%fC06T4{oPNAYoP zMfj0snL%ofZGn}Z+ERLIztU-=JVu7nX{EJYNuhMjz7ZWUW5z~<)Th+W|3TJv z-~s+9rM0iH9I<&72nmQHn(1wPZ~*0@4HZn{Yg0t~+7!`XG#&*G+V6q{1%@H9VZTLK zsnUaj`1XKCDW-k1uvB4B6^?B>YM;_k&qG4HBj#G)hn)b;S<8IYDGe0-d}}HZdd^OQ zN{P)-eIUc<05hS8UCgQ4$;W*iuCSp`S%f0Zh=@Kq7`YvAlq)vDC{r0xb;{yT5e$!R zoA483(-O}jAUD+UZUi_?d;}MKs6UM#eaa$3vU$oPhJ_LR<1CaV&N3L$mvPTbn7G@~ zLqWiK3=c-Bjm^v_c{rzeBjDsv!a*ph5l=W56x2sMHTZ357vQ5lIZ3y?g!Rz`p)w{*;*`biq!o?)MQtT= zF4iRyeY8_lW`l_OXs1|}s0m!15>+BBx*1L>!-G+E$|B)#RGqR&I4i17StJ~fQXlPf zB%F+HXWA;l#Zh(2BH^;AI%Sb?I?56{N*^6nrz|qOCQ5y@Q^%s!M%5{ce6;#TsgHJ) zJ~~Q$w4?OVQR<_ejqK9;s5)hlaAQ=RvRDf~O*p|3EC@=A`VA+F%nvf^t1jVLwI;emwhs5)7Za4@P)RwNvbs*@E7XGI?vfsmnu<56|8BH?6I zovcW>II2!oBwQ9%Co2;6PF8#wNYHM^-A7GyBxeF@Rv?<_=s=T=TnGyZ=)|%23`HzV zqbs9>1+fcxh(L6RAi=^J7+%q#f`kiavO4vGWEIl(0nXUTAYNFB28a$9Bw3gu(qMA7 zC@#E@tQ!R>Dcr;~BLpce>`m4q1?f;YmSiVL(aJCykn|RmQd+$O{80jqHkt3BE(Ncl zIg`=RCX*L(pyDt^cAQa6-z6Hc3vaWajFm#f3$H!o zA&KI1m%0&oh4dI6JxQqYjiPIiTeQWz8%#@@0naw0lg$?}iVJ%(W}3i8;TtGz^fZ(8 zunW5*Iyzl4ZNz&X$PDv!{4^Eju}x-~bCGmRA=amj=xm8;DV#v$Oq286#KPWeptFT+ zYT-LfGe^j#70zLE&lR#W3bA9yh|U+X*@fg8T_9w03P-S8&k?c(g^eUTSI8C>o=Rkq zkS!~$XF(SW*(zy+<tlD{k>?`~)Jgw0Ug4|m?eviO~KSeTc-)^uSC*phwoX*VGGi!7Ya4eIkw4@>SSc+Xian>-Z6J1CP=$wF5 zJ!lk&COXG7KVqVjQ8Juz$PuF+ha9bmE~F+pCn!{SPcX|2G_+JKV3d*xPB~=8`jkV~ z(Z3mNa&rV!ryL4MO?0ljLjBZ4=O!d{B@*Py3)D|dbZ$OFBl?uXRqRx1qT|&v;h=l? z<}CX@!g2nE`yMZ)COTeVUX9?Oy&iXI=6wM4{99UtWbseU(-BlkO?3P-1@8uv_!kPM zCOU3fC8$m5SERQDmd5_Vc1!i<;=T-`Yu-n&^0jg7qnflAk{1P+)4J zP72w#iKcC-19BOigq=Vllk5 zl?9I~_yHzFzv8Eqn&^10f~kp)Cxl@sHPP{6>pWH((vcA_wGMzqDK*jYGJ%yQn&U3M z-pYqe{!ca0rPM^nFSPy)rqXQPK#lL1F%O`YPB{>VUzLp#YWK&F|EUpBZzdSx3_;ZC zDrzF58tbXLW=Q$sRgg%|VGE2o7c0l8klFeG77Eg00)7t1%+DZ~q(#Md&U~QxKA?*s zM49J=fzBW*t73wlNAyj6vzrSUyBlc5mp~iM#neuBS`Hn@a%RwJITqPhJSh+ySgbq( z2#3hcG|W{mfRL`usQvpMi}obARAKpY-C(esgB6#~MMX+?!8Cn<)Gj_1 zEJm7mZTWo{Bpac8h0Q$Eok&tNbkkcvt|Wri9mTQt43O$oCBwKWkyq+Si0VD+bfoayM4r@WPRyuLd+qhOWqGBg@Zhl} zy8W76E3f5!(mcITwDf;uGLTh$2SsM{6ta1mGEf;bk9_%_MFcHU!VY;Dh-#5i9yj9m zfm&Lm16$;IlA=Y**dmny)gmdj$Xp;je}*CUD9Y6(D}Zdfli%$K@6sdaqDO%C0=cmR z%uzw8gV7ueU`xJ=v{LI!*c@z0JZfI-M{X=zvMo4Qaq|1xwV`A|j>7F~-MGtv%E623 z$!Gnf1tB=Iv3mcREhy61TjwZsnb}Gvy*>fzaV!2cTcVGBoJxg z+^2+dO9|(aLJ8-VlE^oZpOVP+X^LMzLh(w_Xlb0}|Kf;5$hIt@NaMdGtfX-(P=i`l zkU`L9xJ5g1f3G(QQbzaVoL7Jp%>8oKjYYxSfA%bd+MGA#%tZg(<-{wA*K|YtHsW$- zqW?;QB9aH3zXHs(<$!6LggJ(PGk$_ur{EqISv)f$M&p#lGovIoB9z55W7r#k?y$M; zD*KR$$0i|OZYcfL2naFpBe-yMHD`H!Vjx4Z!l6(uKYAmae?oCis78dccu2|O5z6AB zJcb7&{J;<8lRTVFSv-`iB#e`q8BaLp38aTC9;(1^UAq8%V&E^xnc-t`p`z-DP8pNs2g4WU`w-6-2w&7z zqVUDKL?Vlai{P`+h)@;}t78HqP2d_XQ6-`*9#+Q$MktGi)rnFO%HrX&L7>cvP!O`psW$|zwi&h(< zEFSLP0G@p#FA*L<{&f+`;^BdW2Sq50hc~iI>m!uK!{-xjj8GO2Uy=l$CL_ehlc2Py z-w1sK230POQNEoFFJ+?zWo0gCGeubB@<{*3K^dW39vSc}fH-ygB-{oPwj-3wBZCMB zBb3V{g9(Qtl*=PS2xmnomq&&Yjz=h$N9qYDBb3V{4TOs$l*=O{3717Emq$hs)^d3? z_6s2JYmd7e85qqOj#?&Xq66w<1I^3OXa$tZV}nda7zLEeV}k{;3n-Vzh6oZYpj;js zDoD6sCTL^zf@Bp?E{_cpBwj$dJT_dAWC7*!ScAwQ#RZhhV~v886i_aYjZl(G0R`*W zNI^OjP%e+1AVn*~gNRaHjZ#VvbTA4jm&cmSqo`0)#bohUJ=#bZFmN+IF}*Bjh(6q}fO2{4Y$2OkK)F0NN64lXP%e+@!~F^a(PT2?pMUwEVd1v>Xcm077yBdVhbsk$F|GLLJ8&a z*bZ4V331`)BXGrQ<8AziT%J|P5RuEX0|bNezLP`iE75p*FqUZPoMSF@CF(f@agI@< zrSo3EO0;xNk`gVQ3#_Gc!XlmLI2*t~a<~lX)GG#(T{zb^A3}hP?_7N_TLIr=x%yzX z0!rt(?!jzHkpIRa8TkLLjEW|&J!65rgWYNSdt&5 z^F&a=l+F{G7AqFwjkB1P(PxxUI!}bGA^0hwbe?d8u7uKgLLI>tx*p{^-%SG{fp+F4 zl+F_oi{T}$EO=DG4=|yU&P&c@<&<<@Lg_rAj$kXHbe<@-zQ;;aI!}~ZyTGD^(s`mx z;Ib(A+Zzy?SZ`%RCQXT*cxo*|%+y=R#7YeWj4Dt%Ph4mn1JlAc7r>Q3omhAjo^uZ1 z0Va7AJ~R*TFtY@VY+9X%I0sG!Anov#VUGmd@tGU(**=-Ue&6F)HyGu927L9-;s$66 zk#B2#7_YA;eE6AP^};YTf|SO8NR+wM0Iir~0X5A2h@MKk;c~$lzXEutS@albnet7# zby+1j{tf)I5O3OM8fevG+CvYl&Hwd%<$jXEaZZByt)&c1P^R(J7qGE07 zB4XV*ScMfMHUqOXVxgTyG`vzE*6a;wXY8ZM=?~1`B!e0$kl-~lmqU0v#+ucLY0X=m z(G*>!1_B!0D!5|tJ0^Y+g@y(hjq*CUbQdlXkw)>lL!bXUhEE_OynaVs%UJZINcom3 zx(!utnJWD_Rr>LKnudY2TMpa)9%f}A!HbgB43O{!vMDJMEYG18W zb(ObDzSBBftpL_KV@t`GHswnzrxBcN-&Sn=PM|%ZCn!f~-VXq3rL#>Ps}HA#A(A>) z-#Hf&q|-y+x!(imr<82wLnUvd@eDkNU$eD0>XLy~n|uPR(YgW3HHzvgpur_Pj;7!S z5I;c_BczbXmnsfR9YsVd!id9)jv$MHWKPApgjvkYo&kzo#w0TiVgT62k+!Bw?b5rw zH!vD@sZVJM-4|gGX$c*IwX~$(;Z4nXMz{s>ex*5YFPz(9N!U&}w{zBz)i(*}8Bmqm z9he}n1-A^U%Iyl0i*RoD=|_;Na=R}c7y-GVz_Sq$V&Y42IYwYTer(F`nfEh9WbLB>w5-iCxU%*i0NPsC zX1FVBliZcH-y@7K62=qGIRwC!wJnTbH$cnUa7kc<7@ow1iYi$<0^}cL?UN9sW$is+ z>B`#o0c?}CH-JdX+H7e}lrKbD)+Pzc*9AY6d*X*c)+TG;hafF$GecL_ChW=DOh#Fo z(x{fT+e#F^SeHo4+P}m{l9shqiJHI_8@qA0BkyAfh3WYWO{rvU!eK3I6Lw{7!mg}M z*p;;j7i(FYaG93138%HJO}I+S+JtMgtj(givNngPD{GU+m9+`GvNpTam9+`Gvi9rX zqh)P^(xQ;H521P9cX5nzC2NZaujT9WZM2P&uYU;8m9GiA@-<;sz9#I-*Mwd9ny@Qh z6L#fm!mfNx*p;sdrwyAsu%odnfCTL?QBEyi^E20zuba?8u6)f1PrfGN$=5_Y`I?9) zUlZ}k*`Fb`A&?aAVWyqDU348K2>*2}Q z%+!;wp9JE`*B#Mxo_x(1Prl|nH_?@^N#@DdB=h8JlAYno*Cg}gYm#~LHOUsZ@-@jk z`I=;&d`+@dTE1pWyYe+F;K|oSJo%c4Ctn{0;>p*H@#JeFo_tNjldp+*@--1pzP>!r zPQGTz4!ZI+kwdP0%_)p}Z?-s2+QjI0M zno|V3rvmp5^$3q~5UTgMD_M_0FcvLwmu8*`K+nIfWSxy5SF#pZOV$Ew$@&-U4=q^} zmd3ur<<%xxUq@bAvK~)ZOV$Ew$y)f%Maw|47FbKxtXPP*47S7})TvFfrV#H+)+BKy zYxYj)YTO36Y5Yc@3t(5WX1FU^3#=t;eyO;UwZK}kCPP=U?tw0JC2LCWu4GMEN!A>9 zkgN|QlYc2$Uk{>=uNGk_$VcO#I(*=!ieN`;q%7RcRR1JiF{z_DsCVj}1n5$4XXCRk zwFluDsr?8Eq-yhd?*^J+Y6+x~%+%e*yjz86hg4_WozyLP7%ZuYpb4kufL5a5sXpLSn)*9aTl4?f2<5Kk~$@tXGNHrn#G42ynapZDJY8~ijr@la~7p7K%+qtPSq*|1E9QiIz zosG0hQg47}Y3c>!zASY&@>-P|f!Om?7a`T=R4ziUNL`EA?Wu*x#Occu=ag!@w6QU1G9FN5ap)N6>nC-n$weQ#h49@>eKIa?-NABj7|jUDh`VML?%Q3+nwYt^pa)i=*)6oJmh zDv~Gq{#DCwb2cCq{&qoe@pTRBzazi-z9zrZ~J49Q1xInP~yL7IgcT*Zw}=K z@%j<_<`DdpkhjvQegRO~H;3{VuI!sb`6O5N&7ougVc3N+o^b9VB!Zmh@NGrm$_>zR z-lL#%7+%kWuAB$?-<9)}eY2Cb5}2l&D^)%x=RSb0eY2C;4I;5`cJlhQ5h*!O z?3aI|PY+vs26rm3^~QLRi~3J7r9kgq)X&&m*yK4qwz( zB3I6fXgTjQ5-FXkDp3=-YB?|3PR;virtF&|{r4bN?3*J4 z9s;QBnXaR)3_3NU?3^ zn>8Z#%^Ftr&CsKgO4~O>k4goZwr_?W^>%zoihVQmsDzb$GxVsehq7;m9#uvd-g%hE zW|&XnN7*++kJ8G6)0j1{qOh931nFms?!G+qIKSH<)A(Q+O` zw46uKc?R4A_;A+4(6w)7*_T7ycsot!5*%tJc${-Av` zG^p1gKt?t+sGPP8v2TV3m543&&CsB->aKk=G^o!pQF}R0%>AK3Rf)8mM=HE0nB`Gi zQZa4c3=JwX)^eT{RLOY)DmhO;CFcpK%P@iN;9_fswt^+>yXXy=uA5!o>!UqM8 zTvd;elOG-cC0l$EzNqsftR=#(K}3Gm2!sdi6z-Ap3$TeUf5I$ME?sTpPf&#AvzFuJ z2|r1cU1*xT%%DOlUd0Eu*@+{Ce_>p3wgQ4q=g!1=Eu9Fy4TX#Hz|e^-!x1RYNc_?56f~%Ggwv9IhdJE&dY$-KxLTAME?P#tIK(nS5k0?mR8xJW>82$ z`IqAkZzP?SHxi@bIhHjf^8*-UNzN=^Wlaks$bBEUcUnsIa%cq5=UEW34VP_O?*o-u z<)|E}RYVr}8HY?{hpy3W&qN4%xbm*?b#r&C<}EP0x!T4&sMKeIw{0vL;E6~3(I{Is zuv+-=hk=*HcB#PywPOlDuG+B&U{O2TIgHh6NBrCkETEKJer=knH)YZc)T&sas2{*j zrhNesZ80ja+8XLtrmKFX67y?s#T0COz2+lH2DMLqXC1)MMYo`L$_ds%WSoXyv$Yzv za-ivx;9Pudgr!R>ZbR&7pbB5HnUr{0kT_s{>?oluiC1Pg$J>gB^GBfc9z)Fdjna6OYM9j=5xl$r# zCjUJpVrI{8QX*#d{+bdol;tTALrS<*N=_|YDudlnVgo*!M2Q$u!lfc=r$h`TN%GH> zh@m1+i5MzwQzC{++9?r3WlD+Yv?&oCC0t5o&T&dar^r(xI>j=(iNUVZPKoHWQzAM_ zxD+L#ql8N_*mY7&tCWb25-!DH*HOZyC=necT#6FWQNpDt5gjF5iW1RL!lft?ow_z9 zqN9XMG1zsKa4816juI}#VAt8mE>}uK=X}CSiRfJNZzvI+OWTx);r^ZyF+6~ZJ*7kp z4ZM-Y@YoVB_cM@wkZ*@dDc@RV!y0B z&qaFkED@zd#C};KN{Ofur9{N$S;i_1T=V)Lx0M8xLVf2u@`wJ8y^ zM2Q%l29YHzJB4LMWml2i@hI{$ayihl%L&_&MU(IikR}|A+y`^~>7=(kZ&?k zd&yLuC08u$&(7o|isidRHRl(UL1`fATKO9^ke4Dj zXrF_-G&8quNJ;&0Bag(8OvfU~)j$fYB~yX5WXe8wHIRg*vEO!iwP_$XRsz@h!H!udpOqGL>PhB~yX5WJY_z|5zI1IGxY@c3 z?8{+zk3fRI$Jcgx4*>o_!)2HknLh+t@c?dLAhJ_7KD_xC#$}#oR+Ipb#ZVEWlEFU# zTBSelgEke)or`Woo@-3=F|g>utky_YM)m!SQ1c&?DsgcF7)yZ`3spz3t`Si~5!M6m zN*ewh+JG{wG=~GN;MUm%h^&|o;0gj~0N4w_D>9lKJAch?EV3@{VO`wi2=4g2je2Cay zH+F%69}3YM#la*3MJkZmqVrI=al)fZHh6Yy!v_O5`jGlpXpS>MT?L67O(H$|nl#aP z{|aL@7Y9Nwf{yIvDatkitZ(&2EK#}F68k`dBOzhTD=kqjEzyE(%Ebj{xfFIG@S2Uo zy@YoXFXjMMjE({CE4I-U!nh~I&rXsum;=*fC2$JfiTJtm4Oopc&y#?vHmZ_na~#Yx ztz`+6^DCCK#4Bg5l#_m*rJN;F&U2AmYVM24SmsIq^wy(TvOkeO|2E(Z`@PCSzDXAR!(c>C zEQ{pyCUaWIeNp}1Bi)NG-9(|g&82&hbUy&yfcI@M_%$CzYwH;Uv9bCHlk7uO|4+$5 z&{s&gX9g%=I*M4Ft0iUqI2(=!R5M@+hQlKBE0%i+;0ZW%S~V1@)IjUvSI$3zjn#XMOsxtsZjga|ViGwqB8?>-`YvhJ$X9JdO`NiRd$k%Gr{VYCTX@ zho2lpEb7pI7+F3{maT|nxy;3-URVe1Nh3?{)~YTr!WU^4oxU?yYS z${Yl}*}64XXEKJFoB+0JoCw)cL0OqGEZX%z2TOIvusY_1{?1|ij3x3L#Pyf6z)xZZ z9|IjC?~xXwLzxZ#c5gs}@fA-4?U2Mv^HBgN5V#+}xdd(la1DVQ06Ynxo@s_10rn=a z;jaV0UqeSePI+W*{uM!uoEGy~hY>Q)C1!+lL>|jNLdu;_(h*BcB+dT_;7A$i1>|x9 z-(z9Si)4&$VWomLW8@XYnD`-JIamZk%BJmX%$Qk)aLGHyyp2)r_evHJv$X-Sqxt^F zls?M+j8HSuCPwj_!E71LZwPaod{g)e+I>MFm|qa`(UV35_#gMN)XLAF(fn32TfEN> zNu%Xr~6s+h79G+ z5#$yMTX{0TxKYM7cAL9`4ChTyVfFJP{BTE$c2^L{>I_6}p$JB11C}im!6?by)z5VZ zwhenIe#Bh?@#EYT%tb(miNB8vdloLhk9Hl%5Nx5y%zYDpUj1Yl)E0`&#M=OE*+P+- z$8dM`ljQE|=SPGg_%WXFaqbENSb1~<#Iz=}=XIb7F}wtqc2|(uI|s;dTPQ+V6A>g^ zC_?Sr6@-p+R}f0jt$<$rWJ{|`gxa|)2qj5^@^#10mAK+hup-)BL8#~ef@BLtsF)e5 zEfk>=!g>ousEo<-;X3dSq@}w8r=7b3=Qwu-PSFvJaM?oPv~ySBv~ySBv~ySBv~ySB zv~ySBq*xnw^^>sLLgBP?SKzdBSKzdBSKzdBSKzdBSK!pKXle_E)6QLi)6QLi)6QLi zvyoluu6`1BS3i$|Pm^+2Ku}r~TPU7D^L*^$809praV}+}DR%|RQ9-yrH!;XYitqrg z*|}?=gxxhz!tNRTLUHHt$`Bp z)l=V;>DX<30 zOuaSGr-68Dpq1e5t${MeTLb0$z*_?)nYRW?GH(r(WZoJm$-FgClBtapSOX=Qw+2cw zZw-`W-Wn*$+%-_Pw7Uk%3V3UvM7%XnBHkM4n?SrZP{w#`phUbiP$J$MC=qWBl!&(m zx*hGQ92H;~Ceu>+O z;L_%z01gD#BS4lh;XqKPec4C>2ZBV@MhZ9(WYyh`6mTGT4-;`26I2wJkgzoNgDx+PD)-xJ78FJr=ipa~LL#*8~cC(D>{AjsYk z7X>58gK6NRpbv?)13`w%GA0}d3e06pI1uFbifp8S13`glU;_t&WGEXc;6QK?>LJUR za3Hvg;dD^|2ZDs#Tok~8;ETxQ+m|unKyVL;#D?Q-0C-l8;>X`ukLfXoAsw%}1!Y2cKUg%9h`S&mvDtH52F>?<7cI|HY%<&C-)LAhLV%NtE{BbO3OUbEz2l-nB+ zWOm34cvR2;^SIgKUiL{I1DCDKjX z*5fQDmZ#y6b^g$>B4bEF0^4F97e1Rfo%j z>wCbuoO>3Q;}nkNiq3M-l0t3R7gh()YcN7c`5WX$?{h0~hrJHn!mR|zLzuJ!Km6GA zKG(HMC;1x9)`>0+XIr#C{E6V+O^$TfJYy_Og(iywtKa&hE25pa@--a9& zz6-c&1cg5fyeB2tL15Ht7;b-Cj^jo)BEd}SOK|JG1Yv#V;C4qbR&k~QcoabI@c{ag zuHSkpNDXBO2Ft&0G$E!z8OGY()D{D z&mR)Yikhn)f|D<2zwjdai|)j{YucF=01*`(9#ZkOhtQy&HO zCot|kDAaP|NOkcFmFr*IaX_xtx8*tpX&%7RQ3+NI+m#gX*YY;1=YaSaYB~D55MQWE zv;KJEZ!OI(T^g>l{>#!ltuuJ_c;au(;2m9qFlzCyGU&Q_RfFNff&d8pz5zHMf{n5a z{TsA7A%%W}8wa2}?biUVYvxpOOh&QE@zfvYcgIW%AG`f!3Q$q~@t7Qw$E3eJ6366` z7=TIOkCJr2EG&H~(5U+(Ssqa=+5BXAq#a8YMV3d}u{`3j{7oB61sVf)k>z2t=6ems z2GjzMUoi&wU>}wT`zj1$d9V*l(g%ow{b6DMD`HX?75f2j^#=v=)}`G%vQH72m(33z7fRW_nk`Cp$L+Cx??_>KN8w8z-`EN19s|_8#7W^2u$c?KG z>XxGnK`J_~fr@BcBT>t@7!u0vIswl3h~%ukYm8`;jo%(bf< zj3#;6EkYx)jfY7apNvXM8xJ!XaRt!M=i*6hke<1X=$T9LE>!qo;DeU&>qOz^ltHZ= zGa8%RqY~d88aoEs9vjy?GWEh+s!Ts^v3N7I~9?Ab^-Vv zfWD0F_W-aT0jq9VtGa+XG1Wvy^)wy!xfiCprg}35R}9l#4p@WQ?|ba$4d}n=JKq} zA;4#49e^P&seV?f<0w3z*DX3L^-SQit$HG2eu9`i#}#4)V%8#tMSfVvu*feVjII4k zkB?EkUw8OBUYOhAkL#EW@Ml$2u4vKf=Mcl^q)f-Csxt=zm1GVBj!T0lySg4Rti#0P zV)*IVf|#42251{W{2m%__Tr<*59E4>4?~@4a!mEd6IUls+%S1Y>g4${>XW4DZklWj z(sUP^{(Mn(S0n>3;uBV8?#0xq-U7^(PjH#gZb8#mop(OQNSP!!2)vSyutMJlDjivj z$4q9;YI7(UNJnOM)E!w)fE`%}V2DfVcH|q#n$2^vu5R1p_KA*J`n4DX*)h!}5+l=I z*CfJ@Z!&TEZ1%)F_2D(BLDHO!kMep0U@M0|YnfE@6v|cAVY1LnLi|eNLqLgm;#UH% zUW>%c)5O)*_2|Z~+YnQzK6--7jO9kh6-Gx47{9>K5nsc3>I0J_uK{^}z}HU$Up*gi zR&10h@I&TPQO^z&u#t@{kTK##_R(`BI0~cm3-N2Va&8+*9?y}-Jt*J_BJuo^WG@0W zhOc0<$4owt%=R%a+sBwh<@E%~ji#>5_rQM7b}5z%dk0=75YT z)VCrr`BseKXeYoY@^Pt0PY+^ITKPFYmM>0qGrpGX`0A=D^CT^2058gV0qu(hOa6G&{mtv#}mAF6V^LU?h7!;?HC!( zY=D^@fxpHTGBSS7sK$D*&0&Z`ldr%5-+hE>@)dYU!8G{_927Ww2$AM6zwhW>O-3aD zHVlr9)>I3D_^U<7o2|rTlQUvY0X!Go8pD9uXblF<^T48$v5p3O5AgSaXUWm%7g(%| zIWD^&xn8JtRi!hGoM{~27g=np>;ry~DEJuSa(AN>euHe|7@J$I8OSbiHg5dG``$3O zS$Q-rjaOtCc^3kxB(Ms=003AIKaTi%%a0gIFbB~|CJ^GCB=%_8?&c;7KH(MZ;p1qt zI)TXy!SxFY6fc(sH!m&T8u-VyfpMk(4zsTsCl{z^$ZY)xOk()(pCLUl1(~uZW=K!0B8C-+8PX3| z0V~C&I*8W3?60qQ1@OIQ{`1j z-Py|#&JbpiB$d5A4--eJ6?R0j8Of&GA<>}F+4RFR#zC{gWY<=7K{7D8TBybm zTkK-%fu)%c(~HjQ26G+_e zR|hm(a-1Q_RuVsAqXY`S40wmf!RumhfqjbPtHvS5Ug{0RxTWzzjYyDH7$poRf}&B% zK@Ku(MoG^1fwNRxq2{>KrL!3N91Iw0i+DkZY2W~`aFF*?xO3B~Y=nnWvcutu` zp(MPIY!;rm5}P@N?j7JA{sv+`&V6vPYnEZ)7%1Ztcyp$*0IUhAh((ANYfvL{>tYl$ zCYj%h&;1GB05H1SrXQH9vcG@M?Z zW}<5(5uOjh4g%{eo%S^AdkkooenC{^*>ymJ9EzQIs;Rl3JePrI6@JaucU_+Q$#V$k zD*4O_wgOnSFgZXbFlFkL!%x8LS(P+cvluN<^~O<++JGhXGYgE_0b&{v4PrXAV_pepRr_ zkjrE_$rgA_mXpb4Ks$@2nk3r|v`V%fuOycjfp#6EM@=3WsYA|JGwyxFrRE^+d5mH9 z@(SE}IyGNE7~e*!zTFVu`>4}_@1uCrS&HXS$25M;Rt|hsM~U$FaO*go#Y+NJ?KYix zHUL#sKEti@&#^Jn97SwDctT_X&qE$hiJ0&497Ue%JtoaAlTNoI*&vRIePDvY048x% ztCFwqK}_^x;eiQ9u&01^V}2w;-Dz=%%HwAoYo7_lWT(|IC@@ROvlfIKgy(H8&r*d3dn3@(Ma#>ek|tM z^+a)$Wfy&22K|X*+Xs-1eVb}Ui zjMLf0OmwiTGsxKh*k- zMJrR*Z>Is2g`YO-x0_HQ&-(3c)`GI_f0y;!Tojo>Oa zf2;KytqK1P>o>Oe@z!r2BShQ?!}^V;bYlG`ex?lj4&d7QjUn3lji8uI(J!|ihF`OO z`y6p?)^D^5`(LqsI{}|k$63FvLcqUm{dPMO{Y&dNQo;I-S^fl$ex#AKLnj zuyp4=F0VH0x0}dITffon&b59MSX;jd-?{jlgY}!h+WL(Z3-RXQYg)?KX8ra#dFkVG zN%A%8H#uha2~-f)Z{3mJwSHr`YyBqhzhV8>7hU+BtlyqRCjZjhq$Hq(W`7RcUsD&0+d17w)3Ix-taUs5^)AGF@f@Eu81BJ07Y75XKhIH%(~`FVYnJd{hMz)OU+_avK$cy#?%7drto ztsIwW&t1d>JXpm(=Td?*5p|s7owpH+ttU^w;AdjsRQf!1{`fl9;-{su5##X8j=*WZ z1ZX>fVi^5Rr(>$1GwJsTKb>&cSxNW|!dcE^glAA{jyo^E0(j;ZfRm0>hqSZEzSy~r z{AZKC%=z+nfX|$bywc8{8K60f;Z@F$jw1YQ!ZpqXCjy?s#erI99>z&vF5x=oo^gQZ z5w3UWpDQpwAM{O5Cd;sZWf&7)dgfvya1P-X444s!588cEib#~@8V(4GqsIWpG z&jwurSn96**gEQL(901FS3@V_M?BsU7pGuy18eaI%fzj?Vn$#qezYH3hUCzX?FRrH zE*FI2EQ8@FKeq1yw4FnEKtp*94?6sM3FVVKoU6_TwIT6hvyGIUaQx>Wgdf{z1%4Cl z0<<67y+|8ncr`9mRGn8+21IYR3B4~lWz9s86UPFBlYJjTRQa5oLjY|f1X~KD#Yy}S zL}7I{Xume1d?9k6W5L;=BtiKG8SHS2^Tx+JW#@AjyeyNu;<5iCy=0>g}e4++ZA>7{Mep~A>;b7WrXL) zmWb!amWb!amWb!amWb!amWb!amWb!amb0Pf$Cila$Cila$Cila$CgDaGolQe4^UdU z&5!L}s8E4>9_Xj61qUiz*UIxOjypBt`LUHJy08QZ;m4MU=f{?a=f{>AdVXw)xPEL2 zdwy(*wE3~+H%OZw+Z~udTtBviJwLXrhv&zZnKnY3jpEEOIlF(eA6v$J2S2tX`wo6= zN%kH5*ploU{n)alT|c(0fak}Si08+a$T$13WsK*?mWb!amWb!amWb!amWb!a_ByoZ zckpA&DU91}*y2H(PpRw2){m*g^<%pW%%b#2{3HOpDh}dD`>|z+Jr6l&2MC7lhVgM( zPMB{x=K;K^bHpK<5neWPxsg-OS;q#vz{p7x4m#UNQ$aZF+?WNp6F*9_oTtGjM;xdn zoyQ1^1GQp!?Ez6RH;?XIohN$Ytj>IbhC{<11>2|z^A8=q3JSG&ksn`Z;hD3IcrhEr zkoRxAM2h14HEkO4(lrRisnaM*T={r&?nN%~GSXx@8KDd~r^62~Q@;Cg*y>QwVQ%wv&yxOWfidBzy|P zw>foWc`D%@P6OfDEKaM#!-3;xzK-VKiOyMwVs*F!(LvimHc@^lb^@TMF6&ZqTu7=i z2D`qHIliOU;C3PcV@Bx;j8H4z98Qu`k&Sh#%vP>1WRjQaty+Y|<5WV4xt5$wOLRWHrm5(rcIocpU zpP?Z+O*YwOBl2=q;t@|)^EJZ;ufSct2e%_Go4td;O8|G=%K(lH^?@i3l9L7Iegp^Y zR@|lSp9P>_?BXCf`KdVvLE<1e`I&+#!6v^@FeTWeX>mA-gXE+ou=GG7Y^H^mc95L( zSu~>-2gyml^)UHz|5h?X!F+op1D51R2{sv2FeTVzrp4Mud0XQ0)ee%AA!{c2Qi4r7 zLMINAlgdGI^ky`|Ep8gPq1sMj?%zsAEQX7NQt>9q(k({CXYD?Jb}szBob z7~eP`s`%|+Fp!x?LG&X$KCeEqC|!<_;`EcCEJ?or zn$q;`lQ9XTha6a1PF+CGyE>FjiHl03*@QU=4xOYl_g7C_8A-Gkg4oxTTYYtlaj+%;W<5_U^lQ(zg9?t`?o>1w3vk6JbO^u5!s zBcxAyEa1NB=}6lz{V-aiEHo*xo51OLm370Z|y|%j>7C^8NqUa-ZwIpP4LenkF#w`_0Tb z_kHej&VBA{zpitg(!@U@|Jb0q>z`70-CUYT2$YoF(>~QnvLh+Gr~QtW86`LE(^Bqz z%Vxae^lB5YS7plX={5F@Yrl#c)0@-z+Fk$Id~eC@!{98i?94KUgnX%;E0v?UXSw63F(AF zE(5bo@6SIB7CO9#eakl*zF6Ax8x8N(Z}bG#cK8ymVNd0~k6`pmS*})QV4a6AW4T%B zU4ZiCEcaE;pM&xhEDy?e8NQO`Vfik@SFt=&>HTF~xthCGW> zS2{7Z;pbkvNK1&crKy1=Xc&vKSA1?&t8pt3Qp} zvcJclZ{yx_UR&`msCDeWY~??r@*$L0F%{0{tqr6v=>wrV6>suUJbz2S&f|W}=ECkO z8-O_M#GSiw2SpCjiQ=hmv_fgk7dhPrIF)i8eVrz+`T%FT_A9*g5O1wp+k_HSeuN)k z?F!(t7C~F)UyaJk*!+i&`a-WqKc{y2P{Sy^8dpl|Z@3$S+{1PII@%86fBC?@xU+zk z5WTSguX5_QaaU&f?YcnUw~eDB!U zU)znYugB2Ty$OQx?meWa*4eWdtONL(#B7(@(3t#CMU-$I@ZY*7tWw4)k8 zL(!;*BO|BJAr41IRKsL+=ur()eh<1uRD+Z)sv$cZ899B%JRBK0ecr~tEUJNrTX|H2 zlr5@3`n9MADO*$nUu@LFk&)BqKiHQ=HL#sWHSp_MotwRn(K7dxp=_BP&@a3j- z{39-TP9G`LCWM?m?9g-iWQQXor_bAY-E#V{oDN4uPM<>`j*Of>Z-?b;CemNmXh_oY zt7g6S{ScRDpbll2qW(k(y|dqZ6N)p~3cxq#ha1skkTw2Lgf1Ugjb?LMWdX<9YHzT= zJi-1N-gsCVUyU~N|CVxjgT)_H>h6&PnoF<6?!vCpXW@6Y&4GW7=P6@f_85DIRr$Zt z2Ene0pTLz4J$I?|Ht0AV^LOA%*D3elPeqPL>fVC#ReZ8Ep{sKiDjhejM+F-NFY18WG;n;b^j8tR&?j%>rt#yRrm<*)Jl_xoR#gHv5Hf8 zrSoZw+f(C9RbIBWT$)sUDT+N^Z^hp#SMXbCRKFF4zEbsil)sPPTB-6H{OfJ?k_Zixx*!oLdR9jYJa z6~rdgTEB@xgRu#aD3JcU)R4e)wTgAPyZ%|vsJO{fiin&lpyJIj51 z7sMu1{}2!SS-8;2$fw%MeQeL`U&Ak6l(7l5)n7rSL)C@OckIN9+|O^)C7MH{Ij0j- zqH^Atd@_2~sWzr8Q!W0@KFF<9mr}^k7*p`dYd@RkV`MAwU!W5d*-vh^e zgJBBIVVx0Ptkj&LGh&!R6FaE5sti+Tp3HK!!7zp92+Pd|!xWmQu-w<6=FptU@?e8u z3Qg=8g8i!T7_Tp2d8ENGh2}z*XEzw8&=iE2-(Z+R^E6&x++dhOb1kQ~yumPq<~riU zng+uZn(NtSZG&M7&C^-l(3piqZa&Pfzq!FMh2|qHZ*MS6q4~ro(a+A3pgD`OqTK*& z4E{N<0|^+W(0mmatxLibCa>cOI1Pp=OkU53*;0dH3X@M~xvRl2g~=OO?rAVgVe%O) zR~rmdn7onYW`ki0lQ*&4*I<~!Xw6;n`!xV6sAZd+;DYUjrMZ*+YJEWpv3avAxqG1ZHvt()`r79og zUN2d73sY$AEZ>87)G&qC+2v33EeNQs-Pm`Cx6t!NwW47Pt#jm#9=B^14O3{HD|a+Z zp>>{2Lc!vbEo*uW`x>=g(al5Tsq?v{(v~HDV zdfaa7Mbb=<+il$@%`{A*b-Ogv<91tjN;5rfw{@2^(=dhB&qy;lZnt%>th9tFv|b`F zpkWHF`=p{_3RclDh1SoOUynIIIc)=8z4dZwreO-L`=z2`3atmEqG1ZH2c@E63ay8v zqG1ZHhs)PvZ8c1x^{C8DkK1kSmx>;@+j?V}B#dDST=AYRVyT2FwBA(y9Ii;1LhH@t zo6%X7a_*~90N3CFKNSYR^iAWH3b3ryKaoY@Vjn}nz))PwJ^eDbD*5;qaIdB==ANnL z|Bjltn0v02CgNi5xk}5_9D1&nas@oMG*BUzmJtR)pOm-oxZSB;O^^UcQH>bmmlCmbTLoukXwolQ#c3 zaRTTdKF`o1AvpLvWTGS7Jvf<=uPj}>$wNcsnYi53H35HRnb)FV^jEyeL*Fa^6DBX- zV26vd8o7F9$XS{@=$lje3t1=9-5$K zY7RpaJ7hd+4nsX!rsgm-se>X#11n>;k!F_8;HZ}QMd z9sh+f#G5=cB4s^pmvA@qK*!rL$ia`>Me2on(P-BH{VhoFot^b69>mWE{FV=}HXD0; zJ3C3mM%Ezg`Hp*UXT2YHHljY~9aIUrJ4p&U_TM&_&u$$OtpPhh=V4dq{(bY1;Ab;# z>(MYhU4)rgZ+RF4{Gfv)tlsY%d>^p!e$c`3uFA&yK?m>rY&PDHB-aDSI|t96JNkHt zwMQrOKf@RMCV&OOD)=oQSYCr`JD0HIO>huZ&@FT&IIr;5sxi&$xWCl>e>?v_Z1{%P zfeD^XuX-OGy=?muwk@y10(IPTKfG0wUx``#tqkK;=?)*g*3s$bk>R)F4M}LX&ztpi9Py8qA-v*wQzbx$s*CMVR*O84nsEBwQZiL1A;NL~_ z%6sr{4_5*IFTh9t7BsfviaQ!RO1E%4a&R!3Z~@ zz6kIC#~qj8{qI9<&f-s?pU-yi$}56av+_TRN)j?C@DGPlnCU$~QV z`-sf#P1)Q&YIFPIol73Fxh+9g_~xDa-*ab}-2R;tuuL8M&neA)O`0MbVY#|KfJJzh zOldi8&X*~D1pUmGl(O%V5B~cYRHyhZo8mn-#b1{x0!tQRhVPMXa9YMr^u#_m7km}Y zW&g#P#6^H}jM>RCpOnTUXxWr8PsTqT^GO-=X^g3#>`583yv{$_lQQNK)K_xKS4@cm zbyt7<;~zh$-{eA!brnD36EYTtvG;p#Hr5j|)@JrC+ti=v*bD%;9(8@+C+vOiv-f>f zeBW35`?6=kMtENX(f!xy+V8_u-a}M)xjggT*ZETOF@5cq%Tyl8rt)%`%CBWpd3j+f z_xn^nd>`)%T;Cxxe++d_ z{VwVEGCrvBS3aO!`J!rZ6PHvj2`8QAIGrM17#)xJggF0ajkxjpg zx#(NJyG+m-INjg+-699CMqS_f*UO|dUq*eAFu30+_o4loGmyDaoa*nDk@lm$NI1i9 zO8Pt4E{$ z^9|_lv*nGev4+IHy)DEk+zR?WvxDzf+VldyFsI{>d13P(zz=@l=eL!feiTpsUHNsm zf9hZ0+7@2e`Zp;33p%!j^IwCkL2UTH%b&~|@`5z%*&+?UfPOFd1&mKn9qd?%>YBgB zpSifbW)A%Ar?W7G!g(yzP`Dn2Q_Cov$`ixa{4e}@2$#07i)|}#eeNsK;k!^E<5SV# zr6ux)@@D+4O3+7X^F}my=(RvVj@;^a2mAUtTzebGxetX;vv4~Kf6l@_6jpD=$d{wA z<~;m)1hp-Edh2UZ>w}!T^;b|>iNf3i==kNz1UmO$z&D-SgG-}KN~hD)^#Iyndkp?= z-wJ^qM-sgr-DM%vqGi3}dLNt-WSg|#-rTT&GsLE7-g=q3;sGcoo@~i9{ z*}QiP4omIS9TQ5sWj<2Jx_iM7drPJ zc<{Va{}j#t8;yys_N#<7sa{AFuaLUOIpW zHogxl`FrT>^Sn2B)`Ze|8#kl+C#ahb6D5?rm){>d4OfYm5X;)03l!B%o{OKInCQ0ls0Ru=J5C0W_|Ku29!x$#nT zuSm7^ z1FpJTX3a* zHc*BMC$D7T{V2SAHwvFX;V)5um4dHu@e|uh?_{5kuGxm_o6bRhYf<@rM z?OZ&42?~2zxDJK4vhYF_zJUUNcD$b7a1R%%%n2)`Oa08B!40m$-hHbOE2JePL$MN) zq*!UWl}bB4&sAS0oslwXXHsWp%d*Z^WSvt(}+tzp!xfciIJ){Vx9Tx95eOmokMEe07b8>gPx~}H!^Uo`hRfcDimrZ+mCr6DwAYCW^avNkUD)Hz4fR0Xq`Tf-p0Fd z8T&DB#=i!Tw8Xl^V#*&t)P7v3^5Ku;w^o{n06q1i^nRRICRckats2OQr0T2maSo+A zeIAwme?+mXPM=3bJiI-UaI!L$&8t&(KaA@LK}Q(|B0k4*>nRlI^O%GG^tbp0*^gOS z`N!zF%IiDuix;KOqq2HEDz+bU(s%G+Pqq09T&j~3R42a|S9E^WDIY@-J|1y&RQunL zMtyX2R0mE=jiySY`Yga=b&yRkzf1A&ck$c*6xz9?qdNT`aH&p5M|GG3mg;nLRA;bk zj*jXG9~-ruSejAoahs7iI%?B@%tmx{)O0^)oyuQrhR%qNj@n6_X-}Pw zj+%rYR_kFB7*&ZUt$9UV2@k6EXq zqqc_6&aczaQPXWfbvim~YdN*$bvim~>p%udYwC1#)O1@=osN#0ZVRdd?@P6Z`AIj| z>FB6E!t(Yy9UZkN8t560j^((-qO2$!9sh<7PWC!D6dfJ4S8>rMiKC;w?gO}6r=z33 z{wWkobviogr?cEur=z33f#se$9Ub*ESgzLT=%{aGxml;9qrQpdzB(Np_022~*6HY| zZ)175PDe-mOqNILbad2rv26P>8;wt)($lpNe`P;rV@eh8s*aB4>E(N|P~zxlZYcAH zIy#zXNJSkT&5cq~M@Ms$RMgSY+$aNAoTyP)A4e8W~g_9nI^@pT%3Mqoa9anWR!39nF1mM;#r_n15LNAq@RrjCy0ozhGl9nHI>nL0X} zdZM{FI-2*&N{geT`4V{nb#yfElZrYztfG#N=FgU&#;d8Lqxo`arjCy0{Zdg!NAm%x zsH3C#pj6b+(R@fM>gZ@bT>d21RvjJ9N96_7(b3#56?Jqp-&iIIqoac>-qS@a6-P(& zO=S{Nadb4_T>d?DRz*;G>3^aCR`F&0ll_>Jr}2vH$DA^eMe*{3>^m6xUOJMAD#fK) zq+;1#xZ?}N5{bT${TS>932DS*D@U)13%O<9UTMZjvwL^ zilbwoL&~z)f8%|bqhp}6<4@TaL!<_}J04`2j*fu|T7D@YXJBH7j7LYuK#!K`=opyP z!56FY&nnbqj^^kX=2 z%XD-MXo!?JItE%2E_D(e9Rp$8+`w?hHFytkbPQ;SlsGyDMl=I6@euH65x_sbrct6w>Hutl*01NM&xngRXe_WNjcK7M(| zG;Fp!ejPU31)syM1Grq8wGrZYdE`mdA!4IjUR5u`2)lhVg#CH%!QBbC{RZoZM)3ul ziFC2(Lo~g%?n0exx_p3R&U*!_Q}E1Z^qKPd(!57;=_FkG8@<$Br6yQf{AOHUh|8E_ zc{$Gt$DfP%XHOaZEurn5za6)CE^$Sn^?Rl@lpe=K@$-Y4X$_qxEQqwhu%{w%%ir$3| zjjLi2oiIiW>KZE=1J?Bya-(}Pzck~-x}^g<6`9dj6IOkL-7xxU!lm0-WXRQo%cXOM zTur$7MqKTh${rY8H6b04+*A2BZebe*iNx9XwF8nTK>`7unU3(YD9ZuKy>&L%1Co0i zzlh5S4%&-AF{HT&Jo~w`Z z^8=Er)4zyIazJu*m;>qo$<-Mw+X2bd5k58*I>HaxRwBb5`#?5WEq6e2ZTi1~+{*#U zwQxXkZN{hYKvzw51kSXlraA)4)tc%EENgPe+9@pSHj3Izmi2(-S~wuN77j?Rg#(gn z;eg~?I3T&UmQ&LMl56V-qHAiZBe4IqHPsPV-cVB=fuB?lNUlA?vL29Jd*VmvXQ!UW z$fB$$4oLnRE)S#+sRPPYN8qAqa>)9+x8klOhpeyvEff(xEIIMF6CWowVW?7R%*0-^&$sy}!vaHD=>$_OC|?LJsKH00xNnnGIWG@V?8xFByP(VSud?s46O&N_zeC@a>&Wkctw&!PMIii z_hg9Q$29{(Nemu-$nr)fhQeHa!BY1yrt*> z9YG&rFcfqIwgR8vkbj9^c`-{42_1n0OLEBm$z1>L*PxsJDNY@--hL=wTzGY5Z9z7p3P1j2AMGIWHSak-~! zH~z{p-;aXK)RIF&M_7zYvW)^df|N~1kh19rJk(l}LqbPjSr+^A-j^kZgpR<|l4TnO zbOb6bvW)^df|N~1kbX@^kh19re6e2sIRz^rbF}1;&=GiAvTUP(j=(0ejRHCXzm6P@ zyw{&Wa!5G>*>nV6m*kMp5v2SHtPperN-DCA0y=_}O-EpdvW)^d!a4X(k{l8`!aI4L z+bEzTu$+!YhK}%c407<~kkAo6g+`Jb@&_mYSNPW5+c$%)OyQN8Yd-|h{QZB2zAyVF z&li6-1o2to7k)n}%5Ou~pM4$f^7UYSMkH{@|MG!PW{ zkN*!mK1-Z!Qk`%<{5o*|zMc10qB8G?c=FF6lD|W{hcmS_`(g~Y0oO1N4p*E5!5{k~ zX3||ye&Dru@Rh%~t@ITcZABH6y%8Ngzz#1$hx31HE1U7gU$QE$yayk`-HC9LF8Jmz z;O@ihuupOzs7uAIy!JxA-A&?$y?O(+FOoU`o!qZ~Se4;#eu%9v^xeY=f~9rE`{RA#Hn|8*{^DLdb^!^% zAl_KlcRB*0$R`68q(=&}(W!eimJ&q>F2-RCroh8TVEN8nXP+j&h2x{e( z{8&(Q=f33n+e+nCeDinV=3Ma?ul^5IKZEMLH)9xr-4K2;O@iIxPve>`j(i3KK8ft; z>0(ba>Afm9S){W3QT#6-AkfG>o1Eu&(Yt<;W?Z1j58>X+phzkNw%Em|SrrKEWA!_z z3Itw^c?bl~F$i3~<20Xx+NIiS-8@`Fw{W@5!!`7e(30vel4h#C*3H8;w1c13 zJX}ND+3ZefrrK-WJX}MYA?Mf4!!`ZRyG!+Z%k0ySHlQ~{wb#0NxQ6JVu!?H0b@OnE z_F6X&*U$r;rg^xAHuD+ta1H$zzrA_5hQ0@4mcoKk~uI1DWUk`Y@0foM&P)J7` z$VU9LKu!9-uN(iVy^bdV818ruk^oHm5OmB*PhLh+h04FV*D8HV%nzWq4mW_K#lb`y*){}6Qbnm~Hhu^MGP2m7|YCiszIMt8f zcL8*ad-2yc(=5=l|+N-wU#v<;R;BWtJr2$C&U8O&|Jd^ETie;f}f7#>g zg7(3m0NH-x(|D6ZXZfP-WXvpI)bLiL0jwRb!M}-3BrY`fR8MUm%Hp2tsdFfGPhnd# zE+d4Ejx71)tV=AL{DCZUD=zf%;n(7~f;@}(r>Ouw&MRf;F+|%2Oz~duk%+j9(D<)TEVfLz`Y+r;7?N z$`H0mtEZrnb5Hd);p9~JRIi4x$^3dPgsmzeY`y)Dp^>3CY@GIod-BZ2OKZQ%;p6VUufa;#=ox!rXr+P>D*wmiNqyNaZbWc?@giRfKkADo0 zb(N|T!d997*I?G-o~mdFTWu$9S2To8+*1_|VH5XMMMK!cJyp>Vwi-j&DjLFelm&cF zP2E!!4Pg`aR7FGB#64Bf5H@j7RUYOiRrgfo5th|GRe9o{(2u#NSTqLH`$t%w|MWVb zobIX0tGH;@-v&Jyte$i!glhre>d8-|zf$cj3vhFUl&Y)t`9DYb6qb8hH{QOlRGsxO znpbOYzZrjLKaK0n+BdeNJeTD@h4y>Vq#=L!pu+vjaSd?Kru{!z*txZ^Pnwv?9# z-v(1i7oVuU{9~vO?LfUWbTS#^@yW|mbascmCfb&}edEUQjZ+r_f!B=yD)RC>BNQ9A{J zUh?TT08TbHPDfxdx&RWD8XIurET%X-8&V-G+pKgAQzvO`luFMqb&|#=sZ@t=K-j>LiV=QW+ekPSV&`CgB<$rcTn>E|nR>)JYmUq;k^mYIc35R8AhI zPSQ9_rZ%F-tu=950OjP;jQ@`JY3wXtf`8Nf6oj|&Er?q<_<*p6ows-F^Gerni@l#C zcY22H6a+S_4(|haG|rVfc#A(o|6~lE$6V?5^P}Suvetm^w+rbP`#Ed&^wuSDbXyU8TlL~P7aouon^+oQC#{MMEKzrTlR4?G*Wgdz6e-f9*4L6EJ!*Zz^(E@AuV1dxqt+)p zUlNn`P32YfsP!-W2aF{iwf;pyaPWEN;P%Y#;<_HUCQ}}vo2P%M+=YKVUH^=mvdq&^ zHI^|l9gp>YuT00-2z8SF?`xSlN&gSEOpjWBx#J0bj~}yrhm_@WzQFt1R2pIQaersW zCAc)gsJs5|j$W1-b=N;Z%k-%APwbHK=uzwM(K3BY{gXQQV!izHd){wnX@p0l_4juC z7W-mivi^#+8~HBhs8M&4nCv_L45IG-fsN@=>#ue2`p5xJysl+>)cU7%P`Dboi7(gE zGCgYj8g(~9|6TuZ$N%C>lfd_D)ZGX@YW*5@my*@@KhW_o#Pp%hqJz@VEAXd0^v@Wi zW9W30@d^vs!=oKMM0n))7r-a?sZM^+k^jc>?`ZjhEPq$Y?oc`xf zoqq~D-N7Jm}=pxk^`Zqb#3 z2H04JyYTN^v~qY+c@GMEX7!Yod=5>&i*E4le4n|ed>Dhy<|uSA;!EL8=Hb4+$!yMM zHilm+ZzAo=7cQ0e(8@(iPs+CK<`+j!6 z7}aI}j;`wLe)(*y#^BP<6~DH*RN`-S-HLzxD*y+6tGiY#!QlKIoWJ5y{NwN7oYI{H z($b!*s2M(da(C&6=xy*#+e*uBx%2j$mfdyJJ=foM>mB#rx9qOl?pk)wP0LSPxn|kE zmCNqDJKVbA-dk_mw+#Cfm%a4P7rzKC@3`;U>tB5PlKXDOqxUV5=a<}k$GtaQf5WZI z?p<=jop;`|&XJqBlm3Y}w z`Jvlo$#0e=f5Aw1>7mE5(ddL&ZY=qV7uX)~bzKY)y zWYO=w<;5o)jKh@a9v=eR_TG)XC*0I8+Bx!c{in z61uY@_(E3$S9i70fY62pVREUQHADb4$>fit6$E&H6< znElROT8dADr^gG3?2lD|#e~g+zs#M+3t~svb@sS04c-AjSu~@xqQwT6Rk-b8@v9yw z1DsZ%;gVNBf_RC+{aX=LvJ{s~dU@Fl+`Xv0cPbxXhs(Rs1G`#L!Bqq#t+x6q7GOu@ z13m&DIJJTira%&06T89z89p`}t<}meZ5?7C>vVjptzT;E#|1^^iKSS3LY1%Yh6KE& z(isU(ke@0w-PO{Mv1zF-fUVr-r8Zrub1GZp1+fZSx!4sj-@k;SUM}B$u5D??6c3#LExN# z4RiA-G*5w(a5^?RM#uq?TQ~|RwG;7iurc;>ToLgcIVCMOH0=P1AT>9R%4&|DXU~nn zvd6#n@%Xh1R3Y$g^1R~rPRxdP=Q^jG7wJqM4n|`jhkNbVQH&PAnqpvOF2z0<0&5fk z>zSw};y@#abzsiTBm_=YA#h3*0x9enzN`gVRACQ=eiO<-&MB}BxDW^-FA9N!X}y(! z4n-kwS~fGG9~AUBmJ51@Zz2TFu<`63ggn4vCIp^rd^!^XM@|)a_LL|K&U7v_tH@<$ zJ0qGCr%T~3h=v6?gU!wthLAKrJ;~|w}&mcTNu%WYsq4;Ls_e))i)$Q!q@uNO%k{Y4&E& zRWdeUI!1=>n6zjbdLcAK$|&^a(gt2;d-{z0COe$noT-}ESvp@^)}8IT&#v@5wsNHP zblnKfUl|Uc68rKJ0N{}2HZAEq9h@(7K9>|>3poM9W68k>McxU?CX+XjX2zII%oHxso7gr* z*NTH;)n(Y4no{cy3k}NDO^VW!ldwERh2<7jCbO9Kg`O!RONS^7B-wx?p5QWaQC68t z4lyrrs!jMN^T%YQ3lhH-$rz-?43~?X%8>jl4&-M^q6mD1@{0*WBoCSV0!!zZY=1?( zlQDMKLUZH{-)2?r0>0hqbm0iWHBEEec1WG>*jn-fnHh}{Mp(<44ih}mY-pzT!!{d^ z>gpM{8=Zi5qeRb0bLJ#im>Vcl&TORm#Qa3x3SJ(9;leTLqESE71s1o7?@Qdtu{04R z+DeWhQBs>po`)*W6?Xf^A@45W!%c}6rhon#!_?wu@8X6B|5Bkj1W!{qHufkDbZvs}$r zI}<+HoV+7st~7wdZJwJ7f;oxoGqV|(E><1$Aa($SX@j_B0j!h9 zF!U|5)5>@O+|pf%RQrvMpX#VWcwdur+KlV+`e_MEh+b>ccY`l6J)@Fm)(HN)LjeJ@)hYWG3%pmrasJBXNi zLH(X*#tTUCp7eKpubt?Q+L-XhUFoiC_h;LL<^FDaZvg=(*1sT>xU3(ukcV z7yHV5Kvlm_MoI6Q<1{y`nVfGf@<9A`z+PpL?;UIA-V6K)0zCvnG^^omj=cokjUu{Cju#xE`-PCVjgl_lMxT#vc`?(1a1WO zM(dri;G9_MkYv{P`3@q%#X#;j22epLfgs_qL>LR8#qg;%adcUZ523|40Yh+LT0@l> zPh3A}4kBsxaS;eWWWYtZFM^kgSiH9=$eQN-6qx3{CECzn{1`%)3O0G|C$k``+A|(p zdBnk$1=1E&BcXM(1N=ZH&xPX@2v;$vD?QoneNPN>p~GDP>YNG&YDT4C>6psIvV_4T zd&?8GH9x6AETStTMj$J<63@wH*b*6lNgyxkNKtR#{nILFT~vxRNHYt6TTk7K;s7)v z(v%eSxFL4|Ek>ol$>Y))4OGuM!v0gMl7FEBvH z49WM+UO=cLqqn((4pY;&Fk;boma5ZO!i&iR5MC_Ti3w&VT@mQ|$_$fCW90~|qQ<*A zRXCATO`NfLt;zTR&>`QKav(^?>~gIJHLr6^grEhG!ch&e#)y8#nw$|$7kqM~Pn?xa zd^_&!-7I!C%x6nj09o>_@d8}^p$Z(^9=b<$M_Nn1+?k17zzksMo&`qOtL${5G@30S znFrK(K-YivvCc_%3sm!59oUG|dEwh*NzP9;1zHp?Al11rHG%)XyslY*2SuqrYf?0*wA+G@;HRP^cATy9CntPBf&7-c=(K0r)TtuYr<#2 zD_+}XSG{f&VtEkfb=biXspip)86PL0M}>f9CRRb-xd~WkP>pgc5Mfl++Z3h+33U%{ zy-%8%hhiBZn@G!$o27w5Qlj9SS}Sp0W^5cJM0}Rng=4KqohVv-QKB4jWBW8IKw&*r zW`DQcw}+Re53La`5Oej*C*o#qUJ1h;2m!8sq{911c>l6UtDSsfEHw<$n}L5@hX#DRFi0} z#c5s;6nTwP_qbBfGm_Xy-T+<8i%75{PM-oAB*rnYf?{K!l&kS%FmC3RselIDuVxmp zwXtuN3=mi9ot8?F8of)%j%lg|_mYb`hCpX10-A8O5gmqUZAwaL^e?$wnv*8^0pMKH zZF<{PqJ;#h^)uUKma|+?+{rdLoK|1d=5cmWqJiruuON=94~~V$X))At6}P~R+e`rW zM}0$TTyY`>48mg|M%>*3hA<~R$>)O1!|FU0kzu1#Bg6uV`(xQhNDYA7&l%(Z+6-65 zeTvQsp1n_Tb?Gc_aIOf{Bw$dfWA>O}G>Ru7lPiuO4*1yZcA5*DR*c(33`)jTg=^J~ ztAZDiH8oP)W>e!fC&#$WDWNsQoR+Xc6d2EGP|993o)d)u3>KnJredY7nUY9ErKG5n zp}ZoZVktT~p2SkZOCTN!FWCJw2H7d@eTs7Eg1~@DT#NyyO)KqkXmBu5tQ{rXGb0tt z;+&L^BUmNz@fC>&7lS+TJ@dhx_y$Lf5graXJ23^?46j50JpQ)m8I=Q8&azP|L@ zVRzqXJNpicP&^Zz@Nih6WBBnNB9s^1l4>z1T5_}URgBLwBFeaCB0dqz% zF=pb`{2~@$w+@*cauO+a!&^wKkl12EBxE(k3ML@R&^{MSj2k8c(orsL3bq~v-eBYb zTTCygoyv?=--;IL$lEfS`;07Ob7$(zO?yMkgl`jJ0^Q&~6IF$B8f=&|M zXQ3}AK2I8YC^rtkR+W(CU`(4j+O_EjtT|W&rEK#t9#aMQgtFS?S^TuT>_0uq{@h1I ziUgUJvcLLwvb{nl87ISCH4b4fkr;_9&l|&;+WFpadki+`q-P+^a+Tr4O%`TC^M8WTf zyb%!^Q%9tF@J6T`BE}2@s7zMO{1ODnQR0OumFB$@fTT7L_Aw=ICkm_0Q?}_L{pgULBbeDA#+aGMj>;6!T^+oT@Tp=#f1$4u2B_*(WP zg6t}Xdb5Tg@PaM!hQFc`hRu?EHby#%i9_X7xbI20Vc1ZT%>K?umI2>PNbj^Qi|u`+ zqlgwXBt3HaT~HOnW=O_7Zw+gQmEA@Q#ddo*1bM;&;`|VSkC7LgRg_0|<}Qr$f}a{* zkfev4e=!FRfVd-~-_O>1Jx;%)Wcm#Dt;O7UvyGe!g&9p%8q+=%bb87OG51ukCXeUm z6(i0GlVm*!f0-0HCIl3tS`x7+`he zyP%f$2p2hG-uQi_64Oy+k?NVPI#AXKl*carOCEv`vAZ@vlwjm2F}Xwy9G#X|jp)=h zjX<2b(dcsu?ggXIOnEXh`nb&|Gy2Td(A+tZ!_IY(pBE-5ARpqq&BdF-x*Tk&f&i#T zbMWeeVft&OA2t%v&3113*BiE7Qy>_<2RVk)RrEPu^Y}TSudbzHrb#g`MlJmbZN51gFSLH4osf3@tY-dGKJc3pjU1n-s+&m9$;8-JMZ94ky7j@yxfZ8WWG9gTOY)6se&eM{p{R!m#GU zULA;3w$A`AXoY$rK;HQbh+dlm@#m34k01YZSjkrc^A+h}7650|hzjK@hupFiNFcyG zz)$Aq%X?UI;4)4TM>l~LKhp6XydW0q$gFt5DPlW`bHZputmv4_Q@n#ZMohAa8%~p8 zKziu{ABV!6xG5_W8&(8iL@)uGib^+PwU(e9t$SvFc@>ow)}(Pj6DcGzeTB(khtBC& zJkm>c?Zb}kGTz1{lWoc&*k-qWZ&8wLf=Js*VB2zNcBE7}y~+^^9+^TR3o4nX=_O{; z!HVv4END<}gltg1|LMq`>1xnS)sbdJ9cgxdX&%-J`7$$!NCa=qmX0u0-JXZ3iZryX=sOFvtZX0Nfr)P6xN?P(&)<+Q^Pj<;F%+4Ou;CK&&Bb zyJ%r>>;bSrjB>mZ$%%2VHWpk$$TcI=VosQB?uwrq3_sY zHs^CiY)RGZDISZF4eQFAWrfIP%b;qo-H8hh#h~isM`DQLg!;~25FaMZ*;Q1E&JJ`6 z6GI{l%3%zZ4XcjxFOu5hbFoP0^X&DF-kzVZo8RjKSKTg58j;&(F0w)JBs42qd#PL; z8|#YLo9_+N6)JE^dsCYjvtbxH=1eYYQ@SpfMFZ?!;bbqbVF4lX8rE}7=oDptLec{V zA|oG4w`^lgXLy9eoB^e|u(%hx42 z;P4GaHjbhDC|Q9y3&G+|VORlylnp2+b!_D-tZ41uibdbnj?RYpv>q8cb5VuRk@SJo z`Sp|)7_yX7YGwt_Cghobf~0kJq(Pn)Se|B1;G!UfEd!9*FioWXQQ-~bPOn^`5)+rT z{otSHM_f9=((Dxp#__F{C`ouWxkn5v2~G$X)bOn%)klhel}|DPG&v%le?sje6wD3M zieK>PJL@RN|HSNCJ3NP7=A2PcJ$X?om0G1*p)aMFf62ZhCFp0(#{%QZ6k(FxT<)br z`z(JQ1a64#kzXn~c6Xf!&Uq#lCJh#PYLN5f#i0@_#f3Ud2^WI9)}N8LBk>IKYe{D3 zo6h)hQ9*Xp1oLt}!)LZ6My0O?e}~@(8%qN~I46JJVecoL@i3B*tgySh%f|QggU`)nV_K(!ydLh}dOPM-mMYbQ#gP)G?vBTdU>#8^7>^PWkcX9#iZiqWm9_cUsX^VyD+q~zuhpXDFoS-e zVo5wKRK8WPh`6#sn}{tAD5}vvq4VxTmI`(P7lLG!d~UJFg+8{?(oBR8T7c*Pq5%|1 zF_MCMdSCk-mJF1wcO81E=DeAh!HU&-i;fY|f7ji)GT>R~|0Pe|XX zTYUn`0<4I^K~ho-K4`AW1d`3VQ9mP#Q*f2oAHPuD!m3wep#tuA%nfy8=ph|66-O#Vkz z@A6(pkguzY1n#KuRi$+YKd0x!q-S|zb^N8;%TNcLw2hCtLhWE zqR#01EegCdj#xmAkYs>^AQg)m4?Oz9Mr%9Z`>4U;;RGCy!=Z5o_0Bxgvv7)xJ|s3K zpM*^-QMw#phK&>?i3^JE-IUiVXas=+S`HxBi~(nv3`ZD_hd?FjuN;ETZ^H>Vzmv+# zdF1v_Xmf6yFs6m@;>eFqTT|jQZDGavRF6k0F(%e=gpRX}NQnhuJfaQB9&IflE9hFL zylqE6qHRo2k7qta2p&@kK(Y*%4lLG4KndBBgIbWR8l1E2UL#~~I zKlMD|HS(T<<}>sI?`L?VBWCbKa3@Qo-2nvdj&_v;oHCG5|ut>@b5kF+!0rei_4j31c4IdlTD}b zLxlmT9P}crSL$xbHi9QWX>Z;S5D787s@OpmajqbR(8U@=a92G{_@Gn3?_xQEiAVi~_V1%0wN)L^lUPQ|MaC9?aoD3iLg>EQqyGVzncg85CbZ1yXz|%>L=zgtESD|`-lb}e zECj3r&gGC5$xzZm>^6sdu$ee-&qZ8@XAoL|4ij5Mj6v!!n*~D+0$VLm1y8JJE4L|o zSwpS(c}t9`#I%Kc;@FR(*mbV3!NY>k_Jqnqp?XbIjEd53C?cj8iBWEe(vOQ zilM>mPt6C`*OW4cQQJncRI`EoH4&sI%6a?=dIhmEA9WbC77IJ1;Jhy4NrnOh`51;M z%!Bks>=@8AoH`+pDN!Agv5grGF`WWNh`bbyV@X_A0&C9^Mez01n;IPgz4m;aViw3v zbw@U++yf!8j`B^Zkr;u|jkl7+(+N!0Bcm4E3=rJ9WTZ*C0yPRJ(A$W3J?EW=cmxJ%AVriPoaxi)7LSKC-d)DWN*?Q z$y>ufT!J->q7kwJjPop)5eM-x_^|~oNfh&jv5dF~041W6SLcuBv3>{f_qy>uO2|U= zV)n-|h)ss;02h#(2>cmeB4Uv481R!0AiO_&5>@QX$*SmRX%Tlpa@3w?J0dCBt_VmR z)7UFA%9fke8KaCQYN+Z_C{~on$2BAxrrQ8Aw1qgGUNQHAeoVU&IzOo0s@chYB$0MD zyIKJ^wj=T;TMbckDNbjCDYM=iRLN<7IaNG29giDCA6##4n6w93_0;zwv%-y6(1v$9 zErscxz48N|?Y@BBYLS=xki6;i@mwVqvhYX_sg&K!^f7e_Kjko}$3~ z?L&otJ|R99%v+%lf;cJ#RqQZY4HF<6WbQ!3QHe2t|DO@97k}$-1>IG+^XsH7Zn^&rQo=RD*@AW z4xB-hL%<&`OcDCW0`}mn3Bef#>aIvmh=$aB7ypDJ8lj|tpbmy3={)9R1AaCqEYQRoG2k7*QG&9Rb`#4FI^xGUA)@lobH) z_?T*&hHUGD%$b=>iN`$P$k>n{a3uE890t-M>hFi8%7tg-8U_<8*Cl2Hmlw|EvQznW zTauump&GV`c;}*@RG^RuaC8UseURp2yEhA#?y4u8NjF^kHDJW@jX%Rn(|h{R}!gVMdxHD|M|0)(;o zT<=nZl(k61L?@NsBs`m*lk7@okTtb;TdYzawaSBpznJq5K| z9uez-ony9*#QdAe{3l1|KP9v#&v)kEmuLR{&is#7ICeH?fg2vzO0WfxQPh}WD<+hi z8$|gT?H-P5MZ%ZNchMf`A7$W!gl8J)5Uc?l$iOxxvz}`-olOB&lzDAFth&r=cjJ+* zft$)(g6pd>XR)(kaC%(9_*r}ubg+Ognbn6Mn|U0=z#$11dk~f%L$jRaho{iYb3f$i z0lVimQSTlN=}HCjH|>=hO};7ex}Foa%~_3Crn% z-k?;vF^!{(xG%kZsdQ6Op?X2?0_GXzoACr?I6f>-MxVz_BJs=YojSQZ{&kM0uQM~a zT7@q7VOStDI9P*drZg#MrxCW8t}DhmH#pH;!cC zsi2!Do|iq3p~t}n@**hAl^JG6z!aXE2shP?qJKR>Ope(}J}YPar2i?Ol`;mJA&OZ) zUCv;8+rMja2aMPU%L#mOE2~|FdEK0JOl{z?{cQ zZLO%l!_Trl#nGh$kjvB6W$H`_2j_S(YD{p^9P#$X`3!c(FN1(Xdxwc>uy+(0qy&s* z7J;#JlciE`sK= z4BOh(gW`c2L9l$rsy}G~PSY?9$Cx=%5;YJ~1`8NBJXxPHt^8b}lcZov25yF(q=J~X zB&M(B!aB3z3pPqccTe4mCnaDeMTg53j}6Ckw7q+xd15DP|O%6cn7q(X;pEFdoin1oQkv+_-E^a}%_d3ze92t665SWG8!) zwen(Da*M$<*#myUhC3oJ%Tx!?YJ-8VP|Nl6e5S^@EE0__M=fA9Po6wRl&A@WfT2YU zo87ELGYhK0+j5BT8^Wy~H+YE9o5WWM??tm`9yt}4f5G$qZBE8F*Lk+3; z!WeUnBLc$y*aM6(37w(^CP`8u+J>Pe*qPQ&Lo9i1KKLd>HH|FT2YpS6wu!~~zB@R@=;^U)(SvZ}z@bC`G~%t(exXE>>^ZeH{ijJX*q z4~0b!TVzr$UxOB!e4T-8UPz^=gb<5N_6G5f@--No2dxNM^^g_g6JhTZ*+!O{oxP5g zh9wM!-g#bKrbJ5m1@asB;-%2?A~~1sQBZEx%n!v@i97ZgWzSWcfNJPJ5>E^*M=7iUgai!k!<6^s7=8$sbcw*z?1O6_x$kJSF5y(XOA7zw1%Sbc`DkTh^V! zFzXi>^S&gw9GO*roHdV{Pa-3k^0g9W&9m&I88%;}owJl=&W zj~G!vxCI7UM%)+}XrzfC?c~<(xF&b1=$(IS} zDhcQ0^F&3mEvM09(T<<_Y0T^gIQgs&SC-C$==0-8jT@i|l{2|m?l99f^lxlUL9U9L+G zizA8K)JV`blU zFAcil>1}Mek_c$B2d-0c+Zt&YHWV_e7lJiGfAM+<)Ko%jDfVCs%~1}|kJ0|IJj0gS z2w^**7>WZoopvZWaGNKd&%H`695Z*vg+Qas(fEn^LKIX=re>Rql4M0nOX9-?GMdkT zj!beI?cCu+R11s|slNS5_KTB;wdzzZ$bw=f^~R6`0~lcOM~m)AlY}&wvz5Sja&7Jc zdN?BOH@&brc;jY#bqA08c@2Y}%gy-d3)A%zwiT&rIxk{)0rHAjzY>`sAlm7oW)fT! zC|FE2iiRScsqGaB2Z>eKiNh(7RA~jgxk@5H3YBQA@klY*Bh8NG zEJwJBf*2!RTBcEUn-5)2bixG^rt!*XU`QgQbS@*6o1K~kKakxdJ#$&hXd>vG@2@I^ zvWedg(@L(Nc8StAPa7!;iGlbnr~?~y;mEtgmqN9Dt72Gg5%F9PmT{F@2HK}WS4O=8 z-Gk7T;0rV_iIaieaYl6h;L}UE-a!soM=Mj;ajrompE%thtKxmB@cR3rn)eEUaZoTR#uBuYkfu8Vk8#_HBQR=3Vr-JgausrHEg{Yw9zZNgMC zBjL5^(>pSqUUdCo4cpG@JR+v>Y_~}{{U6^- zPf$IaUC9}ww<~Phdmz`Z$xqyCU~?A^^FW=FXvuOE0N`pAi6IPSZCbN_VHwA))pYUzzp0HW*CDF%rqUDHQrRvap3lkL3_f0 zZ`GR$=TJ|QDG!mDDep--{(?UO0D>A5z>PMlIiuiVQdKs%mNf3eSVzvS1bLr^r4C3>>;RHpLZW2i1)NJDn22?G>pHf@>N~pu5D6&! zg8E_CxA|c~*;RZLv5tHUXR7O!EG-;|ipMyz0d2N1C!AVkQYJXI$#&+kXxs8+P1xaC zZl}pbuky~WAXy5rLV_jY^ltuRgJ`t?W6Ga_f(uA${47GdepJj=D z2h0ce4iQN3#X2tIP&2;7IMkUj7D8bV3G+hV^SFI@W=J;yn!)Xi9uf@N6h_E%}hJx^1Jcd-H62t*0H^^YF0C5T4EqQ~{)MajBOc}|tsaU`a75yMj zinB{u2!PeXkU|sC@>7e98Z zyD%2d2_ZglM`V{RJ!nol&p8|ic2V@Ixaf6=G;IL~Fy)4`uBIz=lijg2g^nepYC%%A zl-;FYv%3spQE2=4Ja zP!ZEpP!OHPj}p&gZyR!~aZn5D=0~JY+b9t4TohJ9=;t0K^G4ed*{zdEvEO^MMQ#^n z5aAs=&!uZYKo98{743W=kH0c=)8zfzXqxwL1A(tjl%m>o+lnsK@MnX8zPCYlB3d7R`LS;o22E?g8oKx}s># zjBkQQ073jvfF+DiI(t>p2DznQshB{V_s2(VQZ*H_!61)(z$H7yn z2$IucR3y*udp2CKj$-CnuqWEMgG|$w|IwujXfiHML6eEnRFr%osdCE#P9}2&$5XIi zDnRwTGzH@qjm#+noe{V8qqTD9J0iIA(03NCAF( zDc*)qK3$nh@i;@23#1O=dkRKZxJ-Ga$8BCk`sV5=sWdXqk^Z*tO^Xe&FHM;mpRinW zl4OpL-pE1t%KLJ}5^$K`goYMJjaVLzs5DM2Nh6WDQ$#J1fks@4JEf@R&2()!ib=v{ zW;=0A;!!(qrl-JpGY~#F3JKw!M#A8qs$mc_++kqo;0^;+2~=v>D`g!((rDv)X=8kp;YmD@LrVD}qzpA4!P!REwJnElK)`%zH?XjA z1Wad&A@6C@+Nt7e?6h!}X=Vw46v%Lx=kNgD^1LB_)5xb}2Fj-}HjYi<%yzXXjIrrl z=U_)D-V+5(z;+&GRS#Vknb(36#Xh$rFq@d>4LCY#nm4nQxgO8%0qNqYPy<}X$oL`= z5rcRJFiio=;X2mhG)R#08Z>7juaQDOrF+Qlb|`ODKyrb}ro!i?dc28C^)6*lNN4o(y3~o%+w0p1Dl$&wLw;_|T{vdcF{3oHM5E@p9A(c> zFiipxn#rO$SuL7VK+Q5w4Nu*%rJ<)rPu)SGAJ>f&9+y#mQMfmntLv~dwn=GZ#@KDI<6#*kB!T-tK-+E~_*A_#`KZPLpKea8&g#&-q@ z0aiQxbEZ5h$?^CyfSl@#21lkbk^_?ZFEAzsG+vmf8PbTQ$b9Y3cfv}4qZ!gO7b3#T zioi$vT1Fj_SI})L#-b5Ksxl;uYg&*^u`rq!rA@J^MQ)pHW!w~Nq26Xe1CPyf?0mw& zAWkq?RNM+w6SLV_Yy&+1m=sVATmCt5h_;Dev=c14R@bY&XAKVLg)zrHE3^?Nam|=As+pcK5g1-U@*D3NTpNUvC~y* zSVaqo5!`s>mI$HX4+^5bD%B-;<;O6HE|KWyKP7{1-o$hXVsf|-IQ8D(wvvW*g>#aA|kcoZWCfr@uY{u8}V#`wd* z9fM69#P?TP)gt(5j6?W-G!Q6)nDhnvhT91^m$Va2f-wd5(IJE`k^r@wn32OU4@i@w z#R9(x*u&04MmSbeQl_Hj!|mCDPkC^ceVAN)W)9m!;6DVmB4L8JQ{_v9{L^^~AE(yO zjDjMGl|(cgo_{kFtl{5u;-NA#&(6&5=A#=xDe}91#+9%ffjDON(4*$TO8~2)V2ayr zw+AqC+g_Jw;H1O&DZ?N9E``WMJlWV3eldy04FltP#`BDq!&W>h_Qq|w2oobiLvj;DjsjwuRqUTw-?+oao=?=;_>$cE(pUKLk#Po;)iki4(^0J*7s;a_1?- ze(kbWAcqJciLz);GL(1{6<;lBp1o`cCUKq5L+voKMArKEv8;J+JPl%KZYbmlato)~ z5V2uM1x*CnBA^Q|ha7r(MPyJo=-h$m=ZfS=E~LZ5%lY$M?Eo6b^k*3GbudhiCoMo+ zR2*xIhNZ9=bVXZLtao5d^_H35UlJ{hfxY%hDA<3WC91P}?<<}xG zqnha?MRA!zEQX?>;ntbpOZG@Gw9rT}Yp!u%_7aw2+%e8Kgv&G74lXKWA_S^-d74YX zUTTi)ODaq-Zj!Zl)cLw0t+?dyDqt?oJPUYA0X*gOi$X%(p zevTvkxl*9+C%vNa`9Vb$zJ#4T)J!i7*TpI(`*=uYxYv>M-jgE`==0*-g=4KxjuVKZ zK_DU#P+)e~u|T{#^`s))Uoi|SWaN8+BN9@I8bQJcG9n=nE<|KW!1!D);0Bm&-ZgVU zuti26AO+-Exy9CqmdY)IhJwVOkR^uIHY;uc0YN4d0cArlpNMCe@+Lyqlw^s0iS@iy z7N{VHBF1RYC?=09FvqI`GyY|c*Do{rsW!TG;OLx<4RI*B2!49g#~!h2nUBv*I}Eba zTOvJZ+$Jcaa}g?8kVg_9Y1cm8E(z{KGVFm!R?PyD$QYtw(#%Sv%f8#v9tnCS#}1L2 z;3q)$^@{vS}fO%wW57W)*U~7WZjJ|V+^17PmVba1*-4iI4Oj%@%Ob|Lb z1Bjg*iLYq^C8kJXce)DdZ6dr2q3D~!FvL*b*|{aYCc6|(QIbmdM#`iqx{8=2(8QH@ z`X*1DYLjN6G6eFGv1{Zb!>&u+nc)Z3$lH#QGd&ZVL&Rq8tcYB+CMD9b{XiGn=OCD2 z4fiHNoYhNIZ$Qvyo929(OUjq$#9OT56}b!J@~$a1>R`?LPxPBJHAV<4Kbjd4pW|3b zHQS7pBP}mpI$1J;wkSol<%L^AlXe?bh?FF3GQ+JcZ6s3GJvN3rF`)O=8{)ZW>H-0Z zS+D`TDX3iOSxS2o=cVWy@?D!c?E0)zCQJr&DNS?~2{;P8qciVhI`U(o(!wfGO-ScN zjd9>f24TWvMhzzp5d&C57talMWO3(t(1PcE0uV6qyN95GvJ+k%9Z*$Qk{=P<&fj@f zECHBL0)S(V7*xYyP=Xe2>LF*zWeiO`DJg*(m}Yw{j9rczlVJ8z#w3^ph=Y0Z1be5n zvpQj)g(OhQut-oFhB#tj3%<$8x;evQU%MI8nPc9Hci39(lMtSrD&b^0aBLrdvcfj+ z6Bb@wA+C>|k^-A#-OE|p$Tlt*sPT>!B=A{tDnQaZ21cRZF7Xj>}5WaUKa@M0;k zjL+|m)1ym;BiTJzL}lE0HmdSOoQL|PM9o7jsWll37$y2EyW6U^c1Y zbZ^q51um5Zxr+oKIO0?c!x=n|dIfVm6WIjW$2R~NuF+-^a4oaIlcTSQ9=ark9huk_ zI)~G4OzEK*R-I6Vi0Q@@lMkFg7*d}e`^{NxTtc&kNc$%*Yu(7^SiWf7uaiW;Kpa3C zoS}2GPTGubLYW9)p5X?)gD|9_=oNu*rl{}Oo+k`B&JIk^=j$Ac)h7+BGig#?F;i!E zT1Hd34ksJSbB6lV#-=dndz7SgQ3?A=3j@#7fVq(d5bX^+1??Rff%;AZ7N#bZO080@ zkT5s_Fi`gGbi`_qheMs!5Rftu04QEXkrZw?^_Hb{om$tebr?zx93c`R;jWu57+Qmh zYH4c&6^Xg3ybTPZk#;FFbmN1NMkJ-<03O3F*Koj=Y_3b1O%Cxry{@f?C)l;>wv1qi z@}ol*HobF1$7ntVDny(Pl=LiC)s!T8>MW*4n*{SQ(YcK{n*y=h$b?M{o_!x-7-ZmF z-ywKjkVAxzobTl5g4DIX234sHpe{-kzQ7(`bJJu!WfcZWIXc_5LD#3k9n-2|U6r9k z2-DGFUUdqaQ?B%2N`jqG$1CkUrGnFUBU{jpuFhY~ecWr(AbhK^SDw}DY)K6>t`Ak* zy&;Xv#y6%{&~f**S&VN|pYRJL)&gsFv+H=bD(^;RUHEy#M% z%pCm)-Ni@=C%L3;rv|c|_UO>?kWp{lqhs@Ae@4EIeyq=dJK+EH+=a2=KS(W6R5@r; z@x$5dIWDz;8p~EX;SeJcYKRbrtFXAnF((i2M=Z4*gn$>%PBSh=cn6fZq1dW!D7Nb8 z`Q-Q0u2-y^J2Cu;v*)MoVil*{F+k9ZANoE zHMZ}f3>uQp!$?8IgK>iYwm8>Ef&d)|c3_G-$1pj-;iw7jff$e2KjPdQdDNO6S;?Hp zN@yX-SP4`GH44m+ti=5@043!PuoTGAyxn3a$gr?od@K5Aa>8M5yN&_8iNS#%0qGK% zAr8uxQIGzURJYM^h?Lffk$y^{W9Vr``4;)FDDo-G5miE6m9`ih3XT}Xb6_3O=8V_} zw1uROWa>Tn-e&SW3pMrwc!L(;;k$TOiJC}>tzi0tMqsp|eKn(U0JZ2WT}_VYNp10r zQj=Y2J)s+50kcm`b-+{#xLTC!CkKZSk8{zrQLXdR!~EKCvS_F4Qw;N8Y>BJ6UEXL~$qY@V4m#=+sOzDPnl9NQV_JHo=LpYxa6H1XR$A12 zxyS+aL_*lSk;n_HO(){w7H9WUY=gcgSL*ZKSn3GJ6L5r=O7SoOTpLV2b>tdM+xb1y zAYg{6x~97`oyQ1-?ff(F3id|&3MZK}Ti*9%TQ0veMX=uY?_&pT@Arf!u%SfkSfLFHA=GeV<#Nf1}_tN~Lv zN{%Pn$_h^g8?cpSwMM^3-9foQ2Kr2MTnYz8mpIxda?q*iV<`vC$7^Pj6{_c48Ki)- zJ2CSA;stGim4_~fu#>Y6#|#A^pSj$F1%#jm6cEBarG^1TzMR&WRNAA<*%-qZE4GYj z0VT{^N_bBZYTyyMIdjueaw^gsmp4m@e{pRQ;BmY)zxEwk>R*KPys3FC;vdwq$Op!WzX;1G4)M=K-gdK#Z$>pO zg}_eEYr24Y$?YyRF~1AUSW?sn5UQ^bFDF+Djn_J?Tqpo5^EuuFna_?ZfqoSvA7QwN zf+P7yf_H|G<~1wyDZwp@lPUFCFiCmNGrUB~cqSFbvk-TrGDgI4cwYv;S#ug`WUmm} zkRErNB3#0E=zrd7Zf=4Eu8;*iQ&lLhV;z6{bAnuW6w>_%r1q>$SU(a2&*#D_K6<8`BZ4gO zr-P)9PG6qgIghm7v)#6&oP~4Ti$d8E!JB#*+XEDny*zIscf0zeXPosv8L1m;<8C^X zP9~Hd-XRkwmI7Xy2aJ4nyTJr^Cy=!f0v5>o!;Q4CAAP$a zxA_FFZPqE@7)b^XICTBms-yWClbn|+*_`9*0QRPSq=Z4iI-A!#65~{fEMuv%ciUNe zF4VYSO(+H%D@Qf)B^@(X7~|92%ekLohTz zLdyi{>u(p#93UJB#?{fYK1`NyRFuF2C@u)vkI~RV{bDpU+Y)Rg%7|*tYK8EE!6VS3KyOIka_4k| z=BSd$&88ObU}*)_q!_XaDnjLR3g&4D10KwP=rKj9f$cDLiiTKdrxXQxwmktc=j*OC z6AX|vqCh*K>7`G@Z;|$xjzT-qgxFMbNu;Uhhw^}jrKbImm=qIT%B=Ay-gt`uDjo>v6epLHwD7_qHjyt((^25;FYd@~u! zP=-2`p$v7X1I#I*hB{!xk&}ai4iIsy5d#JZICz5OoD((QxpJ;AXn=@Sqr@06pB9M{ zHA2LIIT|%$Jbw4R*Seo)JuO?Z350tVLYo(No}zhUAKy zQfyY7qdJRJE?sFiVMsYMR^{>YvtRmXnErguK5FKGed(88^K8hVjdNz!9(VtP03Qc({FubUgDq{xqH)P;eG;SJCn%>8<5nWaZ1fMNwGASDENBeNF4CgLKskHmyaO^xd9xGA;zm0ScDas z+U)Npv(bZNh$-8Y{LP%tV4IgUB6Ov0Enjy!9aRx+=Y{jue&6x*v~W8bag*UIVAMLsw{(!W3mfNQj}%!{I}lY zjS|i{*|iexfw=%miz{-F=c&J7?u8?cN!poMNO;M24@a6tb{6$MJ%knFV&jtN!3yi% zC~JX+d8HFZ3Oq@%8jc)VmJpGZ)f&i1bQ5Avm82Eev&r<{BZ;plq8{_+ec-cilK7(J z`j2tLJ(qi_C7aGw=OQXt1vQ1JunXEu-`dhA@qxap=eYvEfw)?%H@hrk+ z8}PX=mc;9mNV{U_qF@3h4O=(G3`V27OE4X&PWYmKrZfwKQWh;Rdsy z6mFQK85bpuEj<`vcsv$S$!&fCYGm2NXMt62SbJF83df&Z9!IfN?a|D$IFn) zOG+MKB6ieoL8;M>LkA@U&1PwMSz@2dh#qfcDjGYu|K{$0fB*y9hUT!6gMyNWv?*Vl0MTk-Et9Mx@blVz9PV?idCI%g)sy~Q$1bd1nA=r?w&<)YEAA9 zITM1SwlMbB9MqQ!Utj20)`U2Elj@%aiP^%zX2ZR-BB4?z-xrFGfNzWe)m-bEbg?GO z6!(`zIb{1qQT`uPl#|?wCG?<;If-it-MN8F=+1qV&JyH~jh8!Y`sC86qcuIlm$)|71qk>(=lu#35|er!{Xbh92RjdX$1&3ZDS->rvg6V#M6iz%I6 zVNhR3=1<=qBI|0?IW@iwhjKf#rq65Oj|(o3=U(~6wHGWT=aa8AgQ*vM zYm3F@JMCH?z9}?aiuXu&+MOJmUu20Vgu@KZrgWt_T#3@+-gyf_SJZ-}{H!1sQfYCx z&xFi?PTAO%3WSANGqIEAZq?yF>?*mHD$0*!FCI3zBKhW}Oj1#r zUFjM-n?>daQG!<$)hUTVm>B`aW#Xe=NIsh|d#oprxl4s{#bZr}+ zw2$D*cd?7mti@{=fk8n&n#M|Px7n#}@3(keED1wOsa$DKN5M?o7ps7-ne&K97#BFB z4I-X;yPPP=bECvhhenxCx-=L^v~+2ZB~P!Dq)US~f?^_T<7KlI7LBc~c0`%Ui=@#v z>+QwBnNFM+TLwWz*Omd=5DSt;oiU105$D#Y*Art`7<8a^Hs1kME3~wZ>jTKkiWz=- zXYAR?S2{a}L>t%3o1I>&qz~&fNOF|+I4vf3IrG7#th3vAS9G)&C=68W8fxre+zs|{ zOR5tOh5!8 zgS8h43`q2%Om^kSMaiQ!cW^d#c&z%4&ShP^+6ikbSys2xT<1Gaml3*~t7_vd&~UO_ z^VNW)O3JEqa>(Lb8ozkY#VMGlyf7Uvc4kX=Tq?4dMr{J+>&TZ=GLL)(tP~l?2C^q_ zP?5=LG%Y`BatFfa*hE&r!Xtlz_-%0E@dwW#9)B>VHT~<`!z4ey^n&%rf)&#Wq|SCR z7rgSrb%10zmt$(fPD|j)4tnDWHDk!)#A-f_#;J5Vhi+ApHo+-)Ufl9iK54PBU|`C( zrgu8ZkN8~ZPQpb-g*mG7vCGvi)RNBml=87ln2C(XE}!P)iJ&&@Kfa7w&@uTBhan37 z3(IJvirbzC#t!Rc#WtC%XE^atnCLzCjo2`)$j@V9JPI7cLrV&U%)_<-8KZjJgl%ND zMxGy+tKt)g7I8tllPVD)4WlExi<)C^`wa&?s{`gIc59vjBL&CeBwr73XF zBkmKZI(#cpZ*e7+msx^+ZKl+8qt#oCOb;eD*@4N12@PxxV4A_W6nb}BHF1v8ewfI@ zvm1q4UXi#scP?Rw6)?)9SF*d@=CIx|OavW{QC1SUI|v$dBkha0=w+`?g=R`a1?-Fz z%W$S^+*1%N%!`ENKqNeGF0l{iIUn07beK|qp2Z|@E<0aWJvoW!WP?&2j(vS@Vr5l`Q%eU14J8k)N@B)Fulw5xHnHFteBE z!H~^*ln(IU3R0$E7HLyX2hr?197Xq0R!fgc*3t_-3NoZb?J^BW0S^A77DY;TXFNEM zG^Is3w)FHo;>1)%-xwL93xgR`)jI z)QgRo-llD3a3IPbm>m#NK#&(1*mg!55IKUBZVaWPFeXZ0SrnK%x>}J*OHe!uA3U%q zREVmIOb^G{NP1`8)Aj4lp^LGuQaRpMNgDgSrL((D+q|!3As^9JWVkZ)xJo|Bv5N~T zB-!&>P^nH9Z=!7LEhv`+gw^sw2gO=>p;O9MWFjG>;c%)2Qn8R)f6lbmT`w$bl~bCOtd&Q_inoY@;KC_;jr$df*G)+mBGt>% zuX-|Dnuora8Uvxhk{B!wT*OQt1j0;tQCw?xEt;bUY0=y? z(s*&Qh+{E0>-0in;k@W_lZ813kIDs>PomHyHS|}OjXp_>WzFv_u|G!9^Rt=o&5{Qf zSCo9Dew-(&ZMb0g(rZZJ?EPDlVssgFA_@;`LQXtXjKuW_Z;H_~c;pW}pR4NS@rMbv zIH~XT;7F~tBo_l%J~bxHt;RkA+j~;fF?cIlPLv%>Nj%(-Nov{$6RP0vB)ZB<4$JE+ zNUopA+yTpnM6rYvB@IsL%gJe9e1@Q4(25MwV=)vjC|_W8I<-UQSnQFR$k0BS`&0d4 zUExgoWW_vA6D6L|&qMHVN3O77&Z<5wsX&Se{x9&50hWwSdwH}i$VP6Kc_wU~uw7X;KXb+9=$yEoO6P%vvo(ny+g84m)6s(CS&3C}uHBEd<$XBZggj zZ%LqGso;X|L_e+yPIb6`+>Qj?0?z%9_+&06mbU-NC~#}@KQYQVxBi`!T@Y#I-1+_) zl1nKF?K<1V-; zSl|tdO@Hw-=5z(NBC{y=#ODxF6nnlP7)73y!v$watFeilZ>v$_Nrq73g|yLOv=|k# z!qU2l2|T-Ek`T%bTj!-E9qNuEP0a38JZhk}Fjr;#pxRW`8Z>pwgF%t?+@N}f?LTz`qMzSX2dIe+mm;RQdWSXOws zM%d1-=i89$A0V18VvZYCuw^J4^~ zUMNGS?(}UPm$jvxotR=pj6XNWHLK~-5(o05B@PzZheIEH($Hhn52de?)ON>P_Ad+K?~^uiqMH>+EG-x?gBtiwuA=&&ibS%uBJtC^v%^a?r)c6k-u zd6hStJFoU8b>}rwce~Z@=#kKOExUtp(Q`c^BRH=O8Nqp-CFp_+{StRXjV0AHNU!Lb zAumEcF%Uklyn`!-4Z#);bS_gG!SQR0G zhgA{m4FwWR5==7&kIUr{7b(~hiUK7)QteVCjX=e=}Q4PODQt(n!!Y_0BK=m#}@Rb=YK109;?4*`;W!}!sj7H94k2>$P;4BTK zXcS3358NGkAW;h}mKk+EN%I{@JL{Dm@gim5wSgO*r`Q|U7yPhVbS~lMSw7Xc0S8|g zpb^BkRq5CCs}l40^2_+VCairmDM^2 zllBUiW3q14SAItxeVy#ZpYP`2H&J^jb8nmunUU2i3ZcMe=*&5}EcLcNrs) zor4P4a%tdSr=%*^j|3@6<-}a68g&2>CF)N}B`4agyO1nTlpum$7Q_(MGLHZ)pez`! zl~}tj`m;EMXcrjdlV-8qLzsgoGDrhHbjkQeg<-86}2D<80WI=gqZv_yaW= zD0x7QJC`gxo4}8hcxlmbrmkI% zMb8C{_;@spRj>SpN|i9qZvmsM2{h^PIdQcVNntZC;jhvajH^9amtEJSWN24B1?zSi zB^E64#1I(H;(;;tUQc=9@!GsI6F-&&AXYBKmXuo8duJjSIypmT-_nWRgJ8;?z;c%C zEX}}}C)<`fjYh~HvCc7HHW`V7Ll7%S!Dh^ea!cfxTLYowtL6|!7RK%2@@;Renipo7 zaj}Zp|6^0(McgPCRro;q{@$kZFBUzG5sJyI);ggFmFC2l5f>??`EX>R(%UPP@h^gsy0g(rm!{+x-ea?4Lprur7}4W6l2`v6@Y{;1CliL3}iLEJ0Vy)DQ7IJm1q*n({<(l8o~ z&qP}N&i!m(8v4`%SpP&Rb77t|1wNJGR8CFd%0kqjJJ@GeMGNqh=n4%X4WsdxDdGoZ zxwiyUd7_#c=HsJfcxsd$%&G%Bu7zcInvw4;j9XmidHLvZy*Ck@5aXVo!%y z3R!@q_J2`|zIZ&=iOi(sqrb-)Ps55>A+dP=HJm0RDHq28nt4K}0i3S6o*l?sCjuO+ zJt8={s{Tx=>~2UVU6(9bLk-$jnueU+q;=4EQpn<}HB}ubxsu*wxU(H4D{(+LQAQ@> zcD@gXY?E-Jj8%yn`e~@f616Q>#N}xulQ#Alqj^!fU}+qeEm*esuxt^K1#{EZtR#%0 z8KW0-fUvcXjr~GQJnH+|->i}9B40l)d@W-mRgR8=UfW21K0~`xoLYdMsPu%<;x^40 z$jf2?1j`=?1Rn===%Tul*gve!nw)-eRG#@FLQtNsEi2F0Mdg`S{#~F_Szn!E=E`$e z60vM>?Y~gUFI3&J#nhnXK*!1H2BM#$voKQAJQmPMO%VRv0(F{BqlnXwj|ES+)t9gV zO5)>6uHul$LL3NP9V$Q)rsQ}~s5qvur#BEN#r0HM8ZfZisTpuOgd9&#zy^TLgiHIJ z;TUq|5VA|yRC#MJE|28p$e*ZXTRqZ)*nykEi?wWq7ujg#OFQ4uEY@KoK+K4t#7mIo z8?f(DVAgWSC)~Bbc4iTlopL)uv+&OQFDW9k7|Aw(t|qWXuqSN6o2-8&LjepD4~ZpK z@GDoiaHS#f&M;VmroS_%v8oa}QPh%!J@0!L2%B!Aw%)eQCtZ;xS2_=(A;@QK&UWt9 zOdhlR@(OM&dJwB=%_TN$Sf66Uwp>;y)?4DDf>t70o`8!}z_3zcvOpUN7w3Q%Diq@* znl}}c0C8AQ2}I!)SWqFcln#KDbjTI)62Z%ePj*7rEy`xu=y(^koa_7EU(UdWk|3 z8!$P^fgpnlOOm_Q6o$ScP`(SpxzBAu3B}4uF-#eGg#{C^(0NhRd8}GXIBQ?xyyWr4 zWnNl}d%Txwg&3o$1012s^L1v;vVv4V7<5O8!k%YfEe{7B-Q zw>k*r!qvfi(wWrqRfS$d9p>_)&=x#x2Vw_G<6kHDqjbOtOu$H8#Rk+>wgGiD28;YL z@@oohiH8QdwE^`nz2o#)2DFj}MLGyQ%?$z30VGDGgBHVC(cly>*m07gzJ@#p`r%n#s;A372~6gjyy{56|tlAUX7BXhe>e} zPm>)V*zsnuB~Yw94wVL3^#2P>9*?K^JD<(fGWA~`NE0RLC^LgyIuYgn`!X;V)`!mL zMS^f%DAAdj8pCaeVj&39u|f@1YsF>0i0h5u3(bOj6xM`EWbS$wTe&kRo^~y9>V5So z9bshoxjOI5RKY|@N$Ll=Oo>j(tm2|FGT@tPZK@OBy~=CAW%*ph!zyIq7%@Sf-Y(XP zI+o@OwaHQo7q=^8YSWA37qkj?p%P!Z&lA!(iScEXCLWjb2Q;Q{+3_@RU3+ov?BC4B zT0DOmZWEHIdO4aW(kQcURH}d}(d9Yz)@m}%Nu zBfs#$2l(*kKv>7f^(gWfFA|dEJ+H#{0(it|noGwyhsb&v#DN_{&eHXe17lZiD&gFQ2^=^5krDRq~w%6jo&A80BLp@?^@c!Xu>3tW;<;;z_Tsa*V{vPyJV=tz&pF>Oh%M=p#n7ZH?;5FG zwewMtk3qQd8Q)QNhV(dmqloP4P8pC$CA7g#!xKUjHg%IjLsN24&D5v~{?P&e(}gpd z--NUBJcQn+z$!qoXoxHAmSEFj3@rt@(mSdHmoH9g9g@C1N~Vg&`I53Q3MUE4*WoN7 zi+o2}RK3g_$~$x1+uEHk4_GAC>RHtyMCn=8bO@v}Qr{)9_sTS6qcC_!!p81bNf6#` zg7DR)@fyT9Rq{C70AAG17D{wJgSS|UW%`y&@)A1jacl4io*=s05=`1P7U4M^ju-lH z3#Tll9;XHP@^WW!eXp!*)8>#5PF74@`Y1H<$4?eTQS+$QB+C~Ls|L<;5)XpJ=c?KP zB;SD$wYTg}txP&s7NdAb$k)F$j(bdv;~rDvxMMkvJM*WLYgA0r_#IV=lCd)(FqDgh zDX%1oK=SeUS`x|WjZ7R~6LaVlXt73|3riY6T`q)($uk{HL(w6Ziae8bOsyR>QUVB| zL(R<%By+$i9Xpn0LmI7p7b2U7nW0|$I@L?4PWjs~&97vJ^;vN89mP~y3$7GGu0ADe zWg_PEP-ZloP?{OsS;Qhud}qM~lyl9dfQy7m$=nsa^R2bF{Ag78l;k}!RV8c5% zwyykY3AQQ8v)7nByNAGN_q&SdPTbR>fznv~+LEwCo0Sa(m!w}8%3MS7y#34!c9455 zS04&lxH2vnKIX?^F0K+jZYL(3Hnd8}0U14g^OM2&g=oK}7$591h^8oD0Le&?Svkh* zzPag8inZz!!mf%5 zzH&Fu#>(;;vtk&*gykF**@D_d{G|3`h#;eCwaxhq+JKY?e`XSzK=VL|ef!GLQaPo0 zb{ z++b3*y}|Nj?4nfX!R6KZ={Pv_e;x<-?#i-@w{Xo`$YZ~jQe8$U@i|_;E3nhaSQ4~4_v%Viw2GRvrX+VsB)0^K3~8C~kyLg_aw3EvHWf^gKY0jkgf`=yrt68%mn${OPkD0Fo5ni z<6&Al(`qbB6RaOwmbx39veYI~el%lkWPIKe&UyVD2a$?6?7Hfe;bQh#stC7>JaINV z1VgHqi?Q-bE$hrir(4` zpCqDva`dMP*JD(Dts40{JMMKo=OC+_Df%fzv70S2Mn0{F>DLWHz-(-&C&)q;LIB z10CoiI+-Al2i9*2e$ci=xM<6x8I_aW7c{fHI1YZR$HAP1o2gIQvC|h9AOi*IAg*Jz z0O`&P>h*$BAKi?oyrulF{NPJo*fhgo(Km?u5!eEgcg(5eTMOTRQtf=%;071dArR!u{9TG^Jhs9P2efTOZ z_K+8pz<=@dC8_Q_w{AqZ9P1<5l-MF}-5}sOm+DG`acPaWAX+L^ zElDFNgK?FtEtffIHTe?W73782K``^BrVm{f7TBaOKEX!gRdGi^3L$9O6+)5C71S4T zsn%Za_~xAJK|R9J`G0!`U7OWp4XUmeYfyE4@$Ad}E})QLiP9v1J-O;Zd6%?~rAp{? zv1GkaTC9{p7ocW{B?T-*o{KilHpv2B-sgb2v(}b25d!i#$aYL;(o_?t<|W|ceHWlB z4;8kWayn0>#B~Fvxsl_f6Rh)}^l~AVn~MELJXFYvH)0X#fisDGzz}ArY-oWcL#pk% z>5_7@qLrqY=5@Qb57-4W%YuW`a?@Fci#W4H#%G^dQVfh2qZh~0mwOL$sDbm&fJNYV z^asuf&8%Kg1mh@rSC~U3f$>UBTP7nW%U)IFhKInLCbs3ni5TC?hZ9Tl*>C2iWm)>s zPCzdGbor+lZjYgzVfQweCDIH3qThoSRLFOd8n<)l3A@EkDU%q5co~m9ea7m-Z za#AnoGg!T;W|$k0s@lE*QI#z=qUbG$$~Zo1)1EfZFU~;GV&Br0*r+yDwC(B)w4@x} z99Cc|v(GZI6=IiEr9-ezWXVVw$57s}1kKrUQKYXB9dztR_0wtzNtyRQ1DOZgWLh2x zX2~!(R(1XhBF-YOM>kQHn7gRrv+K@B#lHaJECxf888x{uIk=@zG{S6pHN@3<-BZ3u zHSDlQxGP&dV{@%8@m!}nJJ;u`Kw5m^Lk>x=wSoRAJ|-k>@~ObNW=kai*1fPelG~}} zn>-%VIPr#f?C(b1E5f!?zNC_Jj0WO3P)3I4D2c^jlO~0x?S~kuhc=3s5^AD05MRFV z!d5Fi?qCwskE8S028Lc=`HdIbQ54>l^>GsgX(|;8u^N9h{2_4qf4tVn zcBNnTZyKPM{Qwqy41ct(k)iH*ou-j>0d@lt)8pdD|%zaO1Z`ul)iCc;0% zziz$o%c$QGAps5ldv6wg<7JI(=gJ~LH-6T#7k{tt!dSeQzeWBtosE>1@EcORkGw

    #}wkcR1&8i^Dw*k2uV(vhYYEeZBZ!%WnCo^6dql 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

    Syc_37Ov>xO-ojR!9Ycc}Vo|#~ zeqMIktsSxJC@uL-&iuEwa+wcn@{gkjb<8pYuZgLroFxJWL-nRjZnUf==E*}w3q{fA zUU1Je-&~ZvGiI8l|Mn}J)~sE-%9^08`t2N%iI`sd7+tWfiWQbA=l< z@pWa@H{0Jpk)z=x9B*}uy6_=uzS~o=?yPrKIi12P{v_Ad=^8*J_9&Llswp!@6h-5D z)Q-|mj?se8?MWNQDURqi#hhOMiOtzjdpAu>pZ;V3r$64cmjPIYV^qTRq|n6$#7g11 zH^+$=o^?9TGneUyK21bbpW7KXxykN?u3M8oeuooMbGp3tX%lqr8`ZIIX_0qMYm%cs z2az%El(Gk7U-Y$>SYIir-q8gNdl8N)IStU<&JOi)dL|46$d<-1$WJC*c75v850lUF zuGjP7y~12KArwrjcK|Vik3C;IH=Ta#X(zV%Vl<_qVR!n?-upZCfay8{1QUCXCwzV; zKL-ZNC`~ohCKvHK02@gZ>o41q@x{(3yl3X2L2p%21TgH3V64L1ugax z84!ijmMlW>m|(lJu~lu{{?_XQo$B@0#_e3)-E-uHRjZ}>Qp z>pDh$D)KzG`W^IMz67mj7U}14AVd%`2cq~TvaunCjyH>xGq<5nzRkX@agW0y^z2d!*KzzyL; zF`f%boC2NOc|NAOAs^Zx-?|@1!?T}Om2%x3p>K&Em1iBTiE#pBCNi zz;~GK*ykx}b4AF~;69FYa)Ha0CEpR6-|qMUzD>X<6?B5fCZu#nQJlH0wDCPW0Efm5 zhKrVSTVnJ)rMWZ123}a?G^hoP&Ed}}>Kz4yJUse7V!MYuSY0(gY~QUI;TXF5-D!K+ zxav;(M|SK82?y8@k961Q+&5pih?qKnXg>oVE^AQ3=WwT}?7lp5_+@2gMEyjO8P0~V zU`7kXS-4em*Y@_X&GPb|iNksl<7J6TF5*AR6m{9=*3?V&a0ZyD}-i3=zMNN zwGRgef%E3=2>h{!3S7WBU->RuL?`mg9GaQKK<3aaIW&8j!$9OP0>d-77pgTWTK?Jb z^QwVgKs~SOIPDl4VNulR<2j*q11NAZZnA}W)!=hN>lRYr zMBEpu)v0hwe~d3k3U7`r#7^EA`%Bg8DJ!YvDT&V!w4na8%0DAvky7E!u_>kJswC+d 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%0DCtM?R#QH3gND-2OGijoH2?;k5jnK1_= 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 HSl<5u#0h|5 literal 0 HcmV?d00001 diff --git a/zynqberrydemo3/prebuilt/software/te0726_7s/zynq_fsbl.elf b/zynqberrydemo3/prebuilt/software/te0726_7s/zynq_fsbl.elf new file mode 100644 index 0000000000000000000000000000000000000000..49a8f32a854d93f9391ec66cdad5e136e5aced85 GIT binary patch literal 205872 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 S(;=H*iGL)0QDz*t{QeJrM$rlY literal 0 HcmV?d00001 diff --git a/zynqberrydemo3/prebuilt/software/te0726_m/zynq_fsbl.elf b/zynqberrydemo3/prebuilt/software/te0726_m/zynq_fsbl.elf new file mode 100644 index 0000000000000000000000000000000000000000..db10f54793c7f2d2bda06c026ab72c181e012ccd GIT binary patch literal 205840 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 literal 0 HcmV?d00001 diff --git a/zynqberrydemo3/scripts/reinitialise_all.tcl b/zynqberrydemo3/scripts/reinitialise_all.tcl new file mode 100644 index 0000000..0fafdc3 --- /dev/null +++ b/zynqberrydemo3/scripts/reinitialise_all.tcl @@ -0,0 +1,123 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/08 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/02/02 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- + +proc reinitialise {} { + TE::UTILS::te_msg TE_INIT-59 INFO "Reinitialise Scripts \n \ + Current directory: [pwd] \n \ + At moment, this attributes can't be refreshed: \n \ + TE::VIVADO_AVAILABLE : $TE::VIVADO_AVAILABLE \n \ + TE::LABTOOL_AVAILABLE : $TE::LABTOOL_AVAILABLE \n \ + TE::SDK_AVAILABLE : $TE::SDK_AVAILABLE \n \ + TE::SDSOC_AVAILABLE : $TE::SDSOC_AVAILABLE \n \ + Xilinx SDSOC Scripts \n \ + ------" + set cur [pwd] + cd .. + # ----------------------------------------------------------------------------------------------------------------------------------------- + # load scripts + # ----------------------------------------------------------------------------------------------------------------------------------------- + source ./scripts/script_settings.tcl + source ./scripts/script_environment.tcl + source ./scripts/script_vivado.tcl + source ./scripts/script_te_utils.tcl + source ./scripts/script_designs.tcl + source ./scripts/script_external.tcl + source ./scripts/script_usrcommands.tcl + source ./scripts/script_sdsoc.tcl + #sources from other programs: + # source ./scripts/main.tcl + # source ./scripts/hsi.tcl + #currently SDSOC Runs only with batch start + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished initial functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # initial variables + # ----------------------------------------------------------------------------------------------------------------------------------------- + if {[catch {TE::INIT::basic_inits} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-60 ERROR "Script (TE::INIT::basic_inits) failed: $result."; return -code error} + #------ + set projectname "NA" + set BOARD "" + if {[file exists ${TE::BASEFOLDER}/design_basic_settings.cmd]} { + set fp [open "${TE::BASEFOLDER}/design_basic_settings.cmd" r] + set file_data [read $fp] + close $fp + set tmp [split $file_data "\n"] + foreach t $tmp { + if {[string match "@set PARTNUMBER=*" $t] } { + set splittstring [split $t "="] + set BOARD [lindex $splittstring [expr [llength $splittstring]-1]] + } + if {[string match "@set ZIP_PATH=*" $t] } { + set splittstring [split $t "="] + set TE::ZIP_PATH [lindex $splittstring [expr [llength $splittstring]-1]] + TE::UTILS::te_msg TE_INIT-61 STATUS "Restore ZIP path from design_basic_settings.cmd \n \ + TE::ZIP_PATH : ${TE::ZIP_PATH} \n \ + ------" + } + if {[string match "@set XILINXGIT_DEVICETREE=*" $t] } { + set splittstring [split $t "="] + set TE::XILINXGIT_DEVICETREE [lindex $splittstring [expr [llength $splittstring]-1]] + TE::UTILS::te_msg TE_INIT-62 STATUS "Restore XILINXGIT_DEVICETREE path from design_basic_settings.cmd \n \ + TE::XILINXGIT_DEVICETREE : ${TE::XILINXGIT_DEVICETREE} \n \ + ------" + } + if {[string match "@set XILINXGIT_UBOOT=*" $t] } { + set splittstring [split $t "="] + set TE::XILINXGIT_UBOOT [lindex $splittstring [expr [llength $splittstring]-1]] + TE::UTILS::te_msg TE_INIT-63 STATUS "Restore XILINXGIT_UBOOT path from design_basic_settings.cmd \n \ + TE::XILINXGIT_UBOOT : ${TE::XILINXGIT_UBOOT} \n \ + ------" + } + if {[string match "@set XILINXGIT_LINUX=*" $t] } { + set splittstring [split $t "="] + set TE::XILINXGIT_LINUX [lindex $splittstring [expr [llength $splittstring]-1]] + TE::UTILS::te_msg TE_INIT-64 STATUS "Restore XILINXGIT_LINUX path from design_basic_settings.cmd \n \ + TE::XILINXGIT_LINUX : ${TE::XILINXGIT_LINUX} \n \ + ------" + } + } + } + if {[catch {set projectname [get_projects]} result]} { + TE::UTILS::te_msg TE_INIT-65 STATUS "Reinitialise Vivado Labtools with board part variable from design_basic_settings.cmd." + if {[catch {TE::INIT::init_board [TE::BDEF::find_id $BOARD] 0} result]} {set cur [pwd]; TE::UTILS::te_msg TE_INIT-66 ERROR "Script (TE::INIT::init_board /[TE::BDEF::find_id/]) failed: $result."; return -code error} + cd $TE::VLABPROJ_PATH + } else { + TE::UTILS::te_msg TE_INIT-66 STATUS "Reinitialise Vivado" + set pfolder [file tail [pwd]] + cd $cur + if {$pfolder != $projectname} {set cur [pwd]; TE::UTILS::te_msg TE_INIT-67 ERROR "Inconsistent project name, get project [get_projects], expected $pfolder from project folder"; return -code error} + cd .. + #initial vivado variables + if {[catch {TE::VIV::restore_scriptprops} result]} {set cur [pwd]; TE::UTILS::te_msg TE_INIT-68 ERROR "Script (TE::VIV::restore_scriptprops) failed: $result."; return -code error} + cd $TE::VPROJ_PATH + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished initial variables + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- +} +# ----------------------------------------------------------------------------------------------------------------------------------------- +# run reinitialisation +# ----------------------------------------------------------------------------------------------------------------------------------------- +reinitialise +# ----------------------------------------------------------------------------------------------------------------------------------------- +# finished run reinitialisation +# ----------------------------------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/zynqberrydemo3/scripts/script_designs.tcl b/zynqberrydemo3/scripts/script_designs.tcl new file mode 100644 index 0000000..46ae5e0 --- /dev/null +++ b/zynqberrydemo3/scripts/script_designs.tcl @@ -0,0 +1,402 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/04 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2010/03/06 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval ::TE { + namespace eval INIT { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # initial functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--basic_inits: initial some variables and list + proc basic_inits {} { + if {[catch {TE::INIT::print_version} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-71 ERROR "Script (TE::INIT::print_version) failed: $result."; return -code error} + if {[catch {TE::INIT::print_environment_settings} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-72 ERROR "Script (TE::INIT::print_environment_settings) failed: $result."; return -code error} + if {[catch {TE::INIT::init_pathvar} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-73 ERROR "Script (TE::INIT::init_pathvar) failed: $result."; return -code error} + if {[catch {TE::INIT::init_boardlist} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status;create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-74 ERROR "Script (TE::INIT::init_boardlist) failed: $result."; return -code error} + if {[catch {TE::INIT::init_app_list} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-75 ERROR "Script (TE::INIT::init_app_list) failed: $result."; return -code error} + if {[catch {TE::INIT::init_zip_ignore_list} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-76 ERROR "Script (TE::INIT::init_zip_ignore_list) failed: $result."; return -code error} + if {[catch {TE::INIT::init_mod_list} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-77 ERROR "Script (TE::INIT::init_mod_list) failed: $result."; return -code error} + if {[catch {TE::INIT::init_usr_tcl} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-78 ERROR "Script (TE::INIT::init_usr_tcl) failed: $result."; return -code error} + if {[file exists ${TE::SET_PATH}/development_settings.tcl]} { + TE::UTILS::te_msg TE_INIT-79 INFO "Source ${TE::SET_PATH}/development_settings.tcl." + if {[catch {source ${TE::SET_PATH}/development_settings.tcl} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-80 ERROR "Script (source development_settings.tcl) failed: $result."; return -code error} + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished initial functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # cmd functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--run_te_procedure: run tcl Function from cmd file + proc run_te_procedure {TCL_PROCEDURE BOARD} { + TE::UTILS::te_msg TE_INIT-81 INFO "Run TE::INIT::run_te_procedure $TCL_PROCEDURE $BOARD" + #-- + if {[catch {TE::INIT::remove_status_files} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-82 ERROR "Script (TE::INIT::remove_status_files) failed: $result."; return -code error} + #-- + #Attention not all Procedures can start directly from shell + if {[catch {TE::INIT::basic_inits} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-83 ERROR "Script (TE::INIT::basic_inits) failed: $result."; return -code error} + if {[catch {init_board [TE::BDEF::find_id $BOARD] 0} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-84 ERROR "Script (TE::INIT::init_board /[TE::BDEF::find_id/]) failed: $result."; return -code error} + if {[catch {eval $TCL_PROCEDURE} result]} {abort_status "Error Run TE-TCLProcedure from batch file..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-85 ERROR "Script (${TCL_PROCEDURE}) failed: $result."; return -code error} + } + #-------------------------------- + #--clear_project_all:todo:use run_te_procedure + proc clear_project_all {} { + TE::UTILS::te_msg TE_INIT-86 INFO "Run TE::INIT::clear_project_all " + if {[catch {TE::UTILS::clean_all_generated_files} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-87 ERROR "Script (TE::UTILS::clean_all_generated_files) failed: $result."; return -code error} + } + #-------------------------------- + #--run_labtools:todo:use run_te_procedure + proc run_labtools {BOARD} { + TE::UTILS::te_msg TE_INIT-88 INFO "Run TE::INIT::run_labtools $BOARD" + #-- + if {[catch {TE::INIT::remove_status_files} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-89 ERROR "Script (TE::INIT::remove_status_files) failed: $result."; return -code error} + #-- + if {[catch {TE::INIT::basic_inits} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-90 ERROR "Script (TE::INIT::basic_inits) failed: $result."; return -code error} + if {[catch {init_board [TE::BDEF::find_id $BOARD] 0} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-91 ERROR "Script (TE::INIT::init_board /[TE::BDEF::find_id/]) failed: $result."; return -code error} + if {[catch {TE::INIT::generate_labtools_project GUI} result]} {abort_status "Error Generate LabTools Project..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-92 ERROR "Script (TE::INIT::generate_labtools_project) failed: $result."; return -code error} + } + #-------------------------------- + #--program_zynq_bin: + proc program_zynq_bin {USE_BASEFOLDER BOARD SWAPP LABTOOLS} { + TE::UTILS::te_msg TE_INIT-93 INFO "Run TE::INIT::program_zynq_bin $USE_BASEFOLDER $BOARD $SWAPP $LABTOOLS" + #-- + if {[catch {TE::INIT::remove_status_files} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-94 ERROR "Script (TE::INIT::remove_status_files) failed: $result."; return -code error} + #-- + set return_filename "" + if {[catch {TE::INIT::basic_inits} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-95 ERROR "Script (TE::INIT::basic_inits) failed: $result."; return -code error} + if {$LABTOOLS} { + if {[catch {TE::INIT::generate_labtools_project} result]} {abort_status "Error Generate LabTools Project..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-96 ERROR "Script (TE::INIT::generate_labtools_project) failed: $result."; return -code error} + if {$USE_BASEFOLDER} { + if {[catch {set return_filename [TE::pr_program_flash_binfile -used_board $BOARD -swapp $SWAPP -used_basefolder_binfile]} result]} {abort_status "Error external Zynq Flash configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-97 ERROR "Script (TE::pr_program_flash_binfile) failed: $result."; return -code error} + } else { + if {[catch {set return_filename [TE::pr_program_flash_binfile -used_board $BOARD -swapp $SWAPP]} result]} {abort_status "Error external Zynq Flash configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-98 ERROR "Script (TE::pr_program_flash_binfile) failed: $result."; return -code error} + } + } else { + #dummi project need for jtag reboot memory + set curpath [pwd] + if {[catch {TE::INIT::generate_dummi_project} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-169 ERROR "Script (TE::INIT::generate_dummi_project) failed: $result."; return -code error} + if {$USE_BASEFOLDER} { + if {[catch {set return_filename [TE::pr_program_flash_binfile -used_board $BOARD -swapp $SWAPP -used_basefolder_binfile]} result]} {abort_status "Error external Zynq Flash configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-99 ERROR "Script (TE::pr_program_flash_binfile) failed: $result."; return -code error} + } else { + if {[catch {set return_filename [TE::pr_program_flash_binfile -used_board $BOARD -swapp $SWAPP]} result]} {abort_status "Error external Zynq Flash configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-100 ERROR "Script (TE::pr_program_flash_binfile) failed: $result."; return -code error} + } + if {[catch {TE::INIT::delete_dummi_project $curpath} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-101 ERROR "Script (TE::INIT::delete_dummi_project) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_INIT-102 INFO "Programming Flash without Error (Programming File: ${return_filename}) \n \ + ------" + } + #-------------------------------- + #--program_fpga_mcs: + proc program_fpga_mcs {USE_BASEFOLDER BOARD SWAPP LABTOOLS} { + TE::UTILS::te_msg TE_INIT-103 INFO "Run TE::INIT::program_fpga_mcs $USE_BASEFOLDER $BOARD $SWAPP $LABTOOLS" + #-- + if {[catch {TE::INIT::remove_status_files} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-104 ERROR "Script (TE::INIT::remove_status_files) failed: $result."; return -code error} + #-- + set return_filename "" + if {[catch {TE::INIT::basic_inits} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-105 ERROR "Script (TE::INIT::basic_inits) failed: $result."; return -code error} + if {$LABTOOLS} { + if {[catch {TE::INIT::generate_labtools_project} result]} {abort_status "Error Generate LabTools Project..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-106 ERROR "Script (TE::INIT::generate_labtools_project) failed: $result."; return -code error} + if {$USE_BASEFOLDER} { + if {[catch {set return_filename [TE::pr_program_flash_mcsfile -used_board $BOARD -swapp $SWAPP -used_basefolder_mcsfile]} result]} {abort_status "Error external Zynq Flash configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-107 ERROR "Script (TE::pr_program_flash_mcsfile) failed: $result."; return -code error} + } else { + if {[catch {set return_filename [TE::pr_program_flash_mcsfile -used_board $BOARD -swapp $SWAPP]} result]} {abort_status "Error external Zynq Flash configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-108 ERROR "Script (TE::pr_program_flash_mcsfile) failed: $result."; return -code error} + } + } else { + #dummi project need for jtag reboot memory + set curpath [pwd] + if {[catch {TE::INIT::generate_dummi_project} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-109 ERROR "Script (TE::INIT::generate_dummi_project) failed: $result."; return -code error} + if {$USE_BASEFOLDER} { + if {[catch {set return_filename [TE::pr_program_flash_mcsfile -used_board $BOARD -swapp $SWAPP -used_basefolder_mcsfile]} result]} {abort_status "Error external Zynq Flash configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-110 ERROR "Script (TE::pr_program_flash_mcsfile) failed: $result."; return -code error} + } else { + if {[catch {set return_filename [TE::pr_program_flash_mcsfile -used_board $BOARD -swapp $SWAPP]} result]} {abort_status "Error external Zynq Flash configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-111 ERROR "Script (TE::pr_program_flash_mcsfile) failed: $result."; return -code error} + } + if {[catch {TE::INIT::delete_dummi_project $curpath} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-112 ERROR "Script (TE::INIT::delete_dummi_project) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_INIT-113 INFO "Programming Flash without Error (Programming File: ${return_filename}) \n \ + ------" + } + #-------------------------------- + #--program_fpga_bit: + proc program_fpga_bit {USE_BASEFOLDER BOARD SWAPP LABTOOLS} { + TE::UTILS::te_msg TE_INIT-114 INFO "Run TE::INIT::program_fpga_bit $USE_BASEFOLDER $BOARD $SWAPP $LABTOOLS" + #-- + if {[catch {TE::INIT::remove_status_files} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-115 ERROR "Script (TE::INIT::remove_status_files) failed: $result."; return -code error} + #-- + set return_filename "" + if {[catch {TE::INIT::basic_inits} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-116 ERROR "Script (TE::INIT::basic_inits) failed: $result."; return -code error} + if {$LABTOOLS} { + if {[catch {TE::INIT::generate_labtools_project} result]} {abort_status "Error Generate LabTools Project..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-117 ERROR "Script (TE::INIT::generate_labtools_project) failed: $result."; return -code error} + if {$USE_BASEFOLDER} { + if {[catch {set return_filename [TE::pr_program_jtag_bitfile -used_board $BOARD -swapp $SWAPP -used_basefolder_bitfile]} result]} {abort_status "Error external Bitfile configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-118 ERROR "Script (TE::pr_program_jtag_bitfile) failed: $result."; return -code error} + } else { + if {[catch {set return_filename [TE::pr_program_jtag_bitfile -used_board $BOARD -swapp $SWAPP]} result]} {abort_status "Error external Bitfile configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-119 ERROR "Script (TE::pr_program_jtag_bitfile) failed: $result."; return -code error} + } + } else { + #dummi project need for jtag reboot memory + set curpath [pwd] + if {[catch {TE::INIT::generate_dummi_project} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-120 ERROR "Script (TE::INIT::generate_dummi_project) failed: $result."; return -code error} + if {$USE_BASEFOLDER} { + if {[catch {set return_filename [TE::pr_program_jtag_bitfile -used_board $BOARD -swapp $SWAPP -used_basefolder_bitfile]} result]} {abort_status "Error external Bitfile configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-121 ERROR "Script (TE::pr_program_jtag_bitfile) failed: $result."; return -code error} + } else { + if {[catch {set return_filename [TE::pr_program_jtag_bitfile -used_board $BOARD -swapp $SWAPP]} result]} {abort_status "Error external Bitfile configuration..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-122 ERROR "Script (TE::pr_program_jtag_bitfile) failed: $result."; return -code error} + } + if {[catch {TE::INIT::delete_dummi_project $curpath} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-123 ERROR "Script (TE::INIT::delete_dummi_project) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_INIT-124 INFO "Programming FPGA without Error (Programming File: ${return_filename}) \n \ + ------" + } + #-------------------------------- + #--run_sdk: + proc run_sdk {BOARD} { + TE::UTILS::te_msg TE_INIT-125 INFO "Run TE::INIT::run_sdk $BOARD" + #-- + if {[catch {TE::INIT::remove_status_files} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-126 ERROR "Script (TE::INIT::remove_status_files) failed: $result."; return -code error} + #-- + if {[catch {TE::INIT::basic_inits} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-127 ERROR "Script (TE::INIT::basic_inits) failed: $result."; return -code error} + if {[catch {TE::sw_run_sdk -prebuilt_hdf [TE::BDEF::find_id $BOARD]} result]} {abort_status "Error external SDK starting..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-128 ERROR "Script (TE::sw_run_sdk) failed: $result."; return -code error} + } + #-------------------------------- + #--run_project: VIVADO project + proc run_project {BOARD RUN GUI CLEAN} { + TE::UTILS::te_msg TE_INIT-129 INFO "Run TE::INIT::run_project $BOARD $RUN $GUI $CLEAN" + #-- + if {[catch {TE::INIT::remove_status_files} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-130 ERROR "Script (TE::INIT::remove_status_files) failed: $result."; return -code error} + #-- + if {[catch {TE::INIT::basic_inits} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-131 ERROR "Script (TE::INIT::basic_inits) failed: $result."; return -code error} + + switch $CLEAN { + 0 {} + 1 { + if {[catch {TE::UTILS::clean_vivado_project} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-132 ERROR "Script (TE::UTILS::clean_vivado_project) failed: $result."; return -code error} + } + 2 { + if {[catch {TE::UTILS::clean_vivado_project} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-133 ERROR "Script (TE::UTILS::clean_vivado_project) failed: $result."; return -code error} + if {[catch {TE::UTILS::clean_workspace_hsi} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-134 ERROR "Script (TE::UTILS::clean_workspace_hsi) failed: $result."; return -code error} + } + 3 { + if {[catch {TE::UTILS::clean_all_generated_files} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-135 ERROR "Script (TE::UTILS::clean_all_generated_files) failed: $result."; return -code error} + } + 4 { + if {[catch {TE::UTILS::clean_all_generated_files;TE::UTILS::clean_prebuilt_all} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-136 ERROR "Script (TE::UTILS::clean_all_generated_files , TE::UTILS::clean_prebuilt_all) failed: $result."; return -code error} + } + default {abort_status "Error Initialisation..."; create_allboardfiles_status; return -code error "Error: Design clean option $CLEAN not available, use [show_help]";} + } + if {$RUN > 0 } { + if {[catch {init_board [TE::BDEF::find_id $BOARD] 0} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-137 ERROR "Script (TE::INIT::init_board /[TE::BDEF::find_id/]) failed: $result."; return -code error} + } + switch $RUN { + -1 {TE::UTILS::te_msg TE_INIT-138 INFO " Clear only Mode selected..."} + 0 {start_existing_project $GUI } + 1 {generate_single_project $GUI } + 2 {generate_single_project_all $GUI } + 3 {generate_board_file_project_all $GUI } + default {abort_status "Error Initialisation..."; create_allboardfiles_status; return -code error "Error: Design run option $OPT not available, use [show_help]";} + } + TE::UTILS::te_msg TE_INIT-139 INFO "Run project finished without Error. \n \ + ------" + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished cmd functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--generate_dummi_project: for external programming without labtools and sdk only + proc generate_dummi_project {} { + file mkdir $TE::VPROJ_PATH/tmp + cd $TE::VPROJ_PATH/tmp + TE::UTILS::te_msg TE_INIT-140 STATUS "Create temporary vivado project in: [pwd]" + ::create_project -force tmp $TE::VPROJ_PATH/tmp + } + #-------------------------------- + #--delete_dummi_project: for external programming without labtools and sdk only + proc delete_dummi_project {oldpath} { + ::close_project + TE::UTILS::te_msg TE_INIT-141 STATUS "Delete temporary vivado project in: [pwd]" + cd $oldpath + if {[catch {file delete -force -- $TE::VPROJ_PATH/tmp} result ]} { + # somtimes is locked from other process + # puts "Info:(TE) Can't delete temporary folder." + } + } + #-------------------------------- + #--start_existing_project: + proc start_existing_project {GUI} { + if { [file exists $TE::VPROJ_PATH] } { + cd $TE::VPROJ_PATH + if { [file exists ${TE::VPROJ_NAME}.xpr] } { + TE::UTILS::te_msg TE_INIT-142 STATUS "Open existing project (File: ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.xpr)." + if {[catch {TE::VIV::open_project} result]} { TE::UTILS::te_msg TE_INIT-143 ERROR "Script (TE::VIV::open_project) failed: $result."; return -code error} + if {$GUI >= 1} {start_gui} + } else { + return -code error "Error: $TE::VPROJ_NAME.xpr not found in [pwd]"; + } + } else { + return -code error "Error: ${TE::VPROJ_PATH}/$TE::VPROJ_NAME.xpr not found"; + } + #--------------------------------------------- + } + #-------------------------------- + #--generate_single_project: + proc generate_single_project {GUI } { + if { [file exists $TE::VPROJ_PATH] } { + cd $TE::VPROJ_PATH + if { [file exists *.xpr] } { + return -code error "Error: Project folder not empty, clear [pwd]"; + } + } else { + TE::UTILS::te_msg TE_INIT-144 STATUS "Generate new project (Path: ${TE::VPROJ_PATH})." + file mkdir $TE::VPROJ_PATH + cd $TE::VPROJ_PATH + if {[catch {TE::VIV::create_project} result]} { TE::UTILS::te_msg TE_INIT-145 ERROR "Script (TE::VIV::create_project) failed: $result."; return -code error} + if {$GUI == 1} { start_gui } + if {[catch {TE::VIV::import_design} result]} { TE::UTILS::te_msg TE_INIT-146 ERROR "Script (TE::VIV::import_design) failed: $result."; return -code error} + if {$GUI == 2} { start_gui } + } + } + #-------------------------------- + #--generate_single_project_all: + proc generate_single_project_all {GUI} { + if {$GUI == 1} { generate_single_project 1 } else {generate_single_project 0 } + #-------------------------------------------------------- + run_current_project_all + #-------------------------------------------------------- + if {$GUI == 2} { start_gui} + } + #-------------------------------- + #--generate_board_file_project_all: + proc generate_board_file_project_all {GUI} { + + + foreach sublist $TE::BDEF::BOARD_DEFINITION { + set rundesign true + set id [lindex $sublist 0] + if {$id ne "ID" } { + if {[llength $TE::DESIGNRUNS] > 0} { + if {[lsearch -exact $TE::DESIGNRUNS $id] == -1} { + TE::UTILS::te_msg TE_INIT-147 STATUS "Skip ID: $id" + set rundesign false + } + } + if {$rundesign == true} { + TE::UTILS::te_msg TE_INIT-148 STATUS "Run project id $id (Path: [pwd]) \n \ + ------" + if {[catch {TE::UTILS::clean_vivado_project} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-149 ERROR "Script (TE::UTILS::clean_vivado_project) failed: $result."; return -code error} + if {[catch {TE::UTILS::clean_workspace_hsi} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-150 ERROR "Script (TE::UTILS::clean_workspace_hsi) failed: $result."; return -code error} + if {[catch {init_board $id 0} result]} {abort_status "Error Initialisation..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-151 ERROR "Script (TE::init_board) failed: $result."; return -code error} + if {[catch {generate_single_project_all 0} result]} {abort_status "Error generate projects..."; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-152 ERROR "Script (TE::generate_single_project_all) failed: $result."; return -code error} + + TE::VIV::close_project + } + } + } + create_allboardfiles_status + } + #-------------------------------- + #--run_current_project_all: + proc run_current_project_all {} { + # if {[catch {TE::VIV::build_design ${TE::GEN_HW_BIT} ${TE::GEN_HW_MCS} ${TE::GEN_HW_RPT}} result]} {TE::VIV::report_summary;set message "Error:(TE) Script (TE::VIV::build_design) failed: $result."; abort_status $emessage; puts $emessage; return -code error} + set hw_options [list] + if {!${TE::GEN_HW_BIT}} {lappend hw_options "-disable_bitgen"; TE::UTILS::te_msg TE_INIT-153 WARNING "Auto-generation of Bit-file is disabled."} + if {!${TE::GEN_HW_RPT}} {lappend hw_options "-disable_reports"; TE::UTILS::te_msg TE_INIT-154 WARNING "Auto-generation of Report-file is disabled."} + if {!${TE::GEN_HW_HDF}} {lappend hw_options "-disable_hdf"; TE::UTILS::te_msg TE_INIT-155 WARNING "Auto-generation of HDF-file is disabled."} + if {!${TE::GEN_HW_MCS}} {lappend hw_options "-disable_mcsgen"; TE::UTILS::te_msg TE_INIT-156 WARNING "Auto-generation of MCS-file is disabled."} + if {[catch {eval TE::hw_build_design ${hw_options}} result]} {TE::VIV::report_summary;set emessage "Error: Script (TE::hw_build_design) failed: $result."; abort_status $emessage; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-157 ERROR "$emessage" ; return -code error} + #---------------------------------------------------------- + set sw_options [list] + if {!${TE::GEN_SW_HSI}} {lappend sw_options "-no_hsi"; TE::UTILS::te_msg TE_INIT-158 WARNING "Auto-generation of ELF-files is disabled."} + if {!${TE::GEN_SW_BIF}} {lappend sw_options "-no_bif"; TE::UTILS::te_msg TE_INIT-159 WARNING "Auto-generation of BIF-files is disabled."} + if {!${TE::GEN_SW_BIN}} {lappend sw_options "-no_bin"; TE::UTILS::te_msg TE_INIT-160 WARNING "Auto-generation of BIN-files is disabled."} + if {!${TE::GEN_SW_BITMCS}} {lappend sw_options "-no_bitmcs"; TE::UTILS::te_msg TE_INIT-161 WARNING "Auto-generation of BIT-files and MCS-files is disabled."} + if {${TE::GEN_SW_USEPREBULTHDF}} {lappend sw_options "-prebuilt_hdf_only"; lappend sw_options "$TE::SHORTDIR"; TE::UTILS::te_msg TE_INIT-162 WARNING "Prebuilt HDF is used."} + if {${TE::GEN_SW_FORCEBOOTGEN}} {lappend sw_options "-force_bin"; TE::UTILS::te_msg TE_INIT-163 WARNING "Force Boot.bin is used."} + lappend sw_options "-clear" + if {[catch {eval TE::sw_run_hsi ${sw_options}} result]} { set emessage "Error: Script (TE::sw_run_hsi) failed: $result."; abort_status $emessage; create_allboardfiles_status; TE::UTILS::te_msg TE_INIT-164 ERROR "$emessage" ; return -code error} + abort_status "Ok" + } + #-------------------------------- + #--generate_labtools_project: + proc generate_labtools_project { {gui ""} } { + if { [file exists $TE::VLABPROJ_PATH] } { + cd $TE::VLABPROJ_PATH + if { [file exists ${TE::VPROJ_NAME}.lpr] } { + if {[catch {TE::VLAB::open_project} result]} { TE::UTILS::te_msg TE_INIT-165 ERROR "Script (TE::VLAB::open_project) failed: $result."; return -code error} + } else { + if {[catch {TE::VLAB::create_project} result]} { TE::UTILS::te_msg TE_INIT-166 ERROR "Script (TE::VLAB::create_project) failed: $result."; return -code error} + } + } else { + TE::UTILS::te_msg TE_INIT-167 STATUS "Generate new project (Path: $TE::VLABPROJ_PATH)" + file mkdir $TE::VLABPROJ_PATH + cd $TE::VLABPROJ_PATH + if {[catch {TE::VLAB::create_project} result]} { TE::UTILS::te_msg TE_INIT-168 ERROR "Script (TE::VLAB::create_project) failed: $result."; return -code error} + } + if {$gui ne ""} { + start_gui + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished project design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # status files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--remove_status_files: + proc remove_status_files {} { + if { [file exists ${TE::LOG_PATH}/allboardparts.txt] } { + file delete -force ${TE::LOG_PATH}/allboardparts.txt + } + if { [file exists ${TE::LOG_PATH}/status.txt] } { + file delete -force ${TE::LOG_PATH}/status.txt + } + } + #-------------------------------- + #--create_allboardfiles_status: + proc create_allboardfiles_status {} { + set report_file ${TE::LOG_PATH}/allboardparts.txt + set fp_w [open ${report_file} "w"] + puts $fp_w "it's generate only for powershell polling..." + close $fp_w + } + #-------------------------------- + #--abort_status: + proc abort_status {message} { + set report_file ${TE::LOG_PATH}/status.txt + + if { ![file exists ${report_file}]} { + set fp_w [open ${report_file} "w"] + puts $fp_w "Run ${TE::BOARDPART} with Status $message" + close $fp_w + } else { + set fp_a [open ${report_file} "a"] + puts $fp_a "Run ${TE::BOARDPART} with Status $message" + close $fp_a + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished status files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "INFO:(TE) Load Designs script finished" +} + + diff --git a/zynqberrydemo3/scripts/script_environment.tcl b/zynqberrydemo3/scripts/script_environment.tcl new file mode 100644 index 0000000..c81803b --- /dev/null +++ b/zynqberrydemo3/scripts/script_environment.tcl @@ -0,0 +1,46 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/03 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/02/02 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval ::TE { + namespace eval ENV { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # initial vivado lib paths + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--set_path_boarddef: + proc set_path_boarddef {} { + TE::UTILS::te_msg TE_INIT-69 INFO "Set Board Definition path: $TE::BOARDDEF_PATH" + set_param board.repoPaths $TE::BOARDDEF_PATH + } + #-------------------------------- + #--set_path_boarddef: + proc set_path_ip {} { + TE::UTILS::te_msg TE_INIT-70 INFO "Set IP path : $TE::IP_PATH" + set_property IP_REPO_PATHS $TE::IP_PATH [current_fileset] + ::update_ip_catalog + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished vivado lib paths + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + + } + puts "INFO:(TE) Load environment script finished" +} + + diff --git a/zynqberrydemo3/scripts/script_external.tcl b/zynqberrydemo3/scripts/script_external.tcl new file mode 100644 index 0000000..7e17185 --- /dev/null +++ b/zynqberrydemo3/scripts/script_external.tcl @@ -0,0 +1,786 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/11 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/05/13 $ +# -------------------------------------------------------------------- +# -- 2017/05/12 bugfix missing bracket +# -- 2017/05/18 add pmuf to zynqmp bif +# -- 2017/06/13 add pmuf hsi/sdk support +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval EXT { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # *elf generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--run_sdk: + proc run_sdk {} { + set cur_path [pwd] + cd $TE::WORKSPACE_SDK_PATH + set tmplist [list] + if {[file exists ${TE::XILINXGIT_DEVICETREE}]} { + TE::UTILS::te_msg TE_SW-0 STATUS "Include Xilinx Device Tree git clone." + lappend tmplist "-lp" $TE::LIB_PATH + lappend tmplist "-lp" ${TE::XILINXGIT_DEVICETREE} + } else { + TE::UTILS::te_msg TE_SW-1 WARNING "Xilinx Device Tree git clone path not found (${TE::XILINXGIT_DEVICETREE})." + lappend tmplist "-lp" $TE::LIB_PATH + } + set command exec + lappend command xsdk + lappend command -workspace ${TE::WORKSPACE_SDK_PATH} + set hdffilename "" + [catch {set hdffilename [glob -join -dir ${TE::WORKSPACE_SDK_PATH}/ *.hdf]}] + if {[file exists ${TE::WORKSPACE_SDK_PATH}/${TE::PR_TOPLEVELNAME}.hdf]} { + lappend command -hwspec ${TE::WORKSPACE_SDK_PATH}/${TE::PR_TOPLEVELNAME}.hdf + } elseif {[file exists ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf]} { + lappend command -hwspec ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + } else { + lappend command -hwspec ${hdffilename} + } + # lappend command -hwspec ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + # lappend command -bit ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.bit + lappend command {*}$tmplist + # lappend command --vivrun + TE::UTILS::te_msg TE_SW-2 INFO "Start SKD: \n \ + Run \"$command\" in $TE::WORKSPACE_SDK_PATH \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-0 INFO "Command results from SDK \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } + #-------------------------------- + #--run_hsi: + proc run_hsi {} { + # list 0 for table header + if { [llength $TE::SW_APPLIST] > 1} { + set cur_path [pwd] + cd $TE::WORKSPACE_HSI_PATH + set tmp_libpath [list] + lappend tmp_libpath $TE::LIB_PATH + if {[file exists ${TE::XILINXGIT_DEVICETREE}]} { + TE::UTILS::te_msg TE_SW-3 STATUS "Include Xilinx Device Tree git clone." + lappend tmp_libpath ${TE::XILINXGIT_DEVICETREE} + } else { + TE::UTILS::te_msg TE_SW-4 WARNING "Xilinx Device Tree git clone path not found (${TE::XILINXGIT_DEVICETREE})." + } + set tmp_sw_liblist [list] + lappend tmp_sw_liblist $tmp_libpath + set tmp_sw_applist [list] + lappend tmp_sw_applist $TE::SW_APPLIST + # + set command exec + lappend command hsi + lappend command -source ${TE::SCRIPT_PATH}/script_hsi.tcl + lappend command -tclargs + lappend command "--sw_list ${tmp_sw_applist} --lib $tmp_sw_liblist --vivrun" + # lappend command --vivrun + TE::UTILS::te_msg TE_SW-5 INFO "Start HSI: \n \ + Run \"$command\" in $TE::WORKSPACE_HSI_PATH \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-1 INFO "Command results from HSI \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + TE::UTILS::copy_sw_files + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished *elf generation + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # *bit/*mcs generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--generate_app_bit_mcs: + proc generate_app_bit_mcs {{fname ""}} { + #microblaze + set int_shortdir ${TE::SHORTDIR} + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + } + #run only if *.mmi exists + if {[file exists ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi]} { + # read processor from mmi + set fp [open "${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi" r] + set file_data [read $fp] + close $fp + set tmp [split $file_data "\n"] + foreach t $tmp { + if {[string match *InstPath=* $t] } { + set splittstring [split $t "="] + set next false + set hitval "NA" + foreach part $splittstring { + if {$next} { + set hitval $part + break + } + if {[string match *InstPath* $part] } { + set next true + } + } + set hitval [string map {">" ""} $hitval] + set hitval [string map {"\"" ""} $hitval] + if { $hitval eq "NA"} { + TE::UTILS::te_msg TE_SW-6 ERROR "Processor not found in ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi." + return -code error "Processor not found in ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi."; + } + } + } + #--------------- + foreach sw_applist_line ${TE::SW_APPLIST} { + #generate modified mcs or bit only if app_list.csv->steps=0(generate all), add file to mcs use "FIRM" + set app_name [lindex $sw_applist_line 1] + if {[lindex $sw_applist_line 2] eq "0"} { + #read app name + #delete old one + if {[file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/${app_name}.bit]} { + file delete -force ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/${app_name}.bit + } + #make folder if not exists + file mkdir ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + # + #todo:hier noch in default suche? + TE::UTILS::te_msg TE_SW-7 STATUS "Generate ${app_name}.bit with app: ${app_name}." + set command exec + lappend command updatemem + lappend command -force + lappend command -meminfo ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi + lappend command -data ${TE::PREBUILT_SW_PATH}/${int_shortdir}/${app_name}.elf + lappend command -bit ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.bit + lappend command -proc $hitval + lappend command -out ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/${app_name}.bit + TE::UTILS::te_msg TE_SW-8 INFO "Start Update Memory: \n \ + Run \"$command\" in ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-2 INFO "Command results from Update Memory \"$command\": \n \ + $result \n \ + ------" + } + #write mcs + if {[lindex $sw_applist_line 2] eq "0" || [lindex $sw_applist_line 2] eq "FIRM"} { + if {$TE::CFGMEM_MEMSIZE_MB ne "NA"} { + #todo generate relativ path from absolute paths + set rel_bitfile "../prebuilt/hardware" + set rel_bitfile2 "../prebuilt/boot_images" + set rel_data_file ".." + #make folder if not exists + file mkdir ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + # + TE::UTILS::te_msg TE_SW-8 STATUS "Generate ${app_name}.mcs with app: ${app_name}." + #set bitfile to mcs load + if {[lindex $sw_applist_line 2] eq "FIRM"} { + set load_data "up 0x0 ${rel_bitfile}/${int_shortdir}/${TE::VPROJ_NAME}.bit " + } else { + set load_data "up 0x0 ${rel_bitfile2}/${int_shortdir}/${app_name}/${app_name}.bit " + } + #get upload data 01: + set data_index 5 + while {$data_index < [llength $sw_applist_line] } { + if {[lindex $sw_applist_line 5] ne "NA"} { + set load_data "$load_data up [lindex $sw_applist_line [expr $data_index+1]] ${rel_data_file}/[lindex $sw_applist_line $data_index] " + } + set data_index [expr $data_index+3] + } + #write mcs + # -loadbit $load_bit + write_cfgmem -force -format mcs -checksum FF -interface $TE::CFGMEM_IF -size $TE::CFGMEM_MEMSIZE_MB \ + -loaddata $load_data \ + -file ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/${app_name}.mcs + } else { + TE::UTILS::te_msg TE_SW-9 {CRITICAL WARNING} "FPGA FLASH TYP is not specified in *.board_files.csv. *.mcs file is not generated." + } + } + } + } else { + TE::UTILS::te_msg TE_SW-10 WARNING "${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.mmi not found. Nothing is done." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished *bit/*mcs generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # *bin/*bif generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--generate_bif_files: + proc generate_bif_files {{fname ""}} { + set int_shortdir ${TE::SHORTDIR} + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + } + #todo generate relativ path from absolute paths + set checkfile "" + set fsbl_name "" + set rel_bif_bitfile "../../../hardware" + set rel_bif_fsbl "../../../software" + set rel_bif_hsipmu "../../../software" + set rel_bif_data01_file "../../../../" + set rel_bif_appfile "../../../" + set rel_base "" + set bif_bitfile "" + set bif_fsbl "" + set bif_data01_file "" + set bif_appfile "" + + #check bitfile + if {![file exists ${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.bit]} { + # search default + if {![file exists ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit]} { + # default not found + TE::UTILS::te_msg TE_SW-11 ERROR "Bit-file was not found (${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.bit or ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit)" + return -code error "Project bit-file was not found (${TE::PREBUILT_HW_PATH}/${int_shortdir}/${TE::VPROJ_NAME}.bit or ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit)"; + } else { + set bif_bitfile "${rel_bif_bitfile}/default/${TE::VPROJ_NAME}.bit" + } + } else { + set bif_bitfile "${rel_bif_bitfile}/${int_shortdir}/${TE::VPROJ_NAME}.bit" + } + #search for fsbl + foreach sw_applist_line ${TE::SW_APPLIST} { + #read fsbl name + if {[lindex $sw_applist_line 2] eq "FSBL" || [lindex $sw_applist_line 2] eq "FSBL_EXT"} { + set fsbl_name [lindex $sw_applist_line 1] + if {![file exists ${TE::PREBUILT_SW_PATH}/${int_shortdir}/${fsbl_name}.elf]} { + # generate fsbl not found search default + if {![file exists ${TE::PREBUILT_SW_PATH}/default/${fsbl_name}.elf]} { + # default fsbl not found + TE::UTILS::te_msg TE_SW-12 ERROR "FSBL ELF-file was not found (${TE::PREBUILT_SW_PATH}/${int_shortdir}/${fsbl_name}.elf or ${TE::PREBUILT_SW_PATH}/default/${fsbl_name}.elf)." + return -code error "FSBL ELF-file was not found (${TE::PREBUILT_SW_PATH}/${int_shortdir}/${fsbl_name}.elf or ${TE::PREBUILT_SW_PATH}/default/${fsbl_name}.elf)."; + } else { + set bif_fsbl "${rel_bif_fsbl}/default/${fsbl_name}.elf" + TE::UTILS::te_msg TE_SW-13 INFO "Use FSBL from: ${bif_fsbl}" + } + } else { + set bif_fsbl "${rel_bif_fsbl}/${int_shortdir}/${fsbl_name}.elf" + TE::UTILS::te_msg TE_SW-14 INFO "Use FSBL from: ${bif_fsbl}" + } + } + } + foreach sw_applist_line ${TE::SW_APPLIST} { + #generate *.bif only if app_list.csv->steps=0(generate all) or steps=1(*.bif and *.bin use *.elf from prebuild folders ) + if {[lindex $sw_applist_line 2] eq "0" || [lindex $sw_applist_line 2] eq "1" || [lindex $sw_applist_line 2] eq "FSBL_APP"} { + #set correct folders + switch [lindex $sw_applist_line 3] { + "petalinux" { + set checkfile "${TE::PREBUILT_OS_PATH}/petalinux" + set rel_base "${rel_bif_appfile}os/petalinux" + + } + default {#standalone + set checkfile "${TE::PREBUILT_SW_PATH}" + set rel_base "${rel_bif_appfile}software" + } + } + #read fsbl name + #read app name and additional configs + set app_name [lindex $sw_applist_line 1] + TE::UTILS::te_msg TE_SW-15 STATUS "Generate BIF-file for: ${app_name}" + #delete old folder + if {[file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}]} { + file delete -force ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + } + #make new one + file mkdir ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + + if {![file exists ${checkfile}/${int_shortdir}/${app_name}.elf]} { + if { [lindex $sw_applist_line 2] eq "FSBL_APP"} { + # fsbl boot.bin only + set bif_appfile "" + } elseif {![file exists ${checkfile}/default/${app_name}.elf]} { + # search default + # default not found + TE::UTILS::te_msg TE_SW-16 ERROR "Application ELF-file was not found (${checkfile}/${int_shortdir}/${app_name}.elf or ${checkfile}/default/${app_name}.elf)." + return -code error "Application ELF-file was not found (${checkfile}/${int_shortdir}/${app_name}.elf or ${checkfile}/default/${app_name}.elf)."; + } else { + set bif_appfile "${rel_base}/default/${app_name}.elf" + } + + } else { + set bif_appfile "${rel_base}/${int_shortdir}/${app_name}.elf" + } + if {$TE::IS_ZSYS} { + #Zynq + set data01_file [lindex $sw_applist_line 5] + set data01_load [lindex $sw_applist_line 6] + set data01_offset [lindex $sw_applist_line 7] + #replace na with "" + if {[string match $data01_file "NA"]} { set bif_data01_file ""} else { set bif_data01_file "${rel_bif_data01_file}${data01_file}"} + if {[string match $data01_load "NA"]} { set data01_load ""} + if {[string match $data01_offset "NA"]} { set data01_offset ""} + + write_bif ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif $bif_fsbl $bif_bitfile $bif_appfile $bif_data01_file $data01_load $data01_offset "" "" "" + } elseif {$TE::IS_ZUSYS} { + #uzynq + set fsbl_config [lindex $sw_applist_line 5] + if {[string match $fsbl_config "NA"]} { set fsbl_config ""} + set destination_cpu [lindex $sw_applist_line 6] + if {[string match $destination_cpu "NA"]} { set destination_cpu ""} + set exception_level [lindex $sw_applist_line 7] + if {[string match $exception_level "NA"]} { set exception_level ""} + set atf [lindex $sw_applist_line 8] + if {[string match $atf "NA"]} { set atf ""} elseif {[file exists ${checkfile}/${int_shortdir}/${atf}]} { + set atf ${rel_base}/${int_shortdir}/${atf} + } elseif {[file exists ${checkfile}/default/${atf}]} { + set atf ${rel_base}/default/${atf} + } else { + TE::UTILS::te_msg TE_SW-17 WARNING "ATF File was not found in ${checkfile}/${int_shortdir}/${atf} or ${checkfile}/default/${atf}" + set atf "" + } + set pmu [lindex $sw_applist_line 9] + if {[string match $pmu "NA"]} { + set pmu "" + TE::UTILS::te_msg TE_SW-65 WARNING "PMU File not selected on apps_list.csv" + } elseif {[file exists ${TE::PREBUILT_SW_PATH}/${int_shortdir}/${pmu}]} { + set pmu ${rel_bif_hsipmu}/${int_shortdir}/${pmu} + } elseif {[file exists ${TE::PREBUILT_SW_PATH}/default/${pmu}]} { + set pmu ${rel_bif_hsipmu}/default/${pmu} + } elseif {[file exists ${checkfile}/${int_shortdir}/${pmu}]} { + set pmu ${rel_base}/${int_shortdir}/${pmu} + } elseif {[file exists ${checkfile}/default/${pmu}]} { + set pmu ${rel_base}/default/${pmu} + } else { + TE::UTILS::te_msg TE_SW-64 WARNING "PMU File ($pmu) was not found in all possible prebuilt folders" + set pmu "" + } + TE::UTILS::te_msg TE_SW-66 INFO "Use PMU from: ${pmu}" + + write_zusys_bif -biffile ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif -fsbl_config $fsbl_config -bootloader $bif_fsbl -pmu $pmu -bitfile $bif_bitfile -app $bif_appfile -destination_cpu $destination_cpu -exception_level $exception_level -atf $atf + + } else { + #error + TE::UTILS::te_msg TE_SW-18 ERROR "ZSYS or ZUSYS is not defined." + } + } + } + } + #-------------------------------- + #--write_bif: + proc write_bif { biffile {fsblfile "zynq_fsbl.elf"} {bitfile ""} {elffile ""} {data01_file ""} {data01_load ""} {data01_offset ""} {dtbfile ""} {intfile ""} {ssblfile ""} } { + + set bif_fp [open "$biffile" w] + + puts $bif_fp "the_ROM_image:\n\u007B" + # + # init data + # + if {$intfile!=""} { puts -nonewline $bif_fp { [init]}} + if {$intfile!=""} { puts $bif_fp $intfile} + if {$intfile == ""} {TE::UTILS::te_msg TE_SW-19 STATUS "INT FILE NOT DEFINED..."} + # + # FSBL + # + if {$fsblfile!=""} { puts -nonewline $bif_fp { [bootloader]}} + if {$fsblfile!=""} { puts $bif_fp $fsblfile} + if {$fsblfile == ""} {TE::UTILS::te_msg TE_SW-21 STATUS "FSBL FILE NOT DEFINED..."} + # + # BIT file + # + if {$bitfile!=""} { puts $bif_fp " $bitfile"} + if {$bitfile == ""} {TE::UTILS::te_msg TE_SW-22 STATUS "BIT FILE NOT DEFINED..."} + # + # .ELF file + # + if {$elffile!=""} { puts $bif_fp " $elffile"} + if {$elffile == ""} {TE::UTILS::te_msg TE_SW-23 STATUS "ELF FILE NOT DEFINED..."} + # + # SSBL + # + if {$ssblfile!=""} { puts $bif_fp " $ssblfile"} + if {$ssblfile == ""} {TE::UTILS::te_msg TE_SW-24 STATUS "SSBL FILE NOT DEFINED..."} + # + # DTB file + # + if {$dtbfile!=""} { puts $bif_fp " $dtbfile"} + if {$dtbfile == ""} {TE::UTILS::te_msg TE_SW-25 STATUS "DTB FILE NOT DEFINED..."} + # + # image.ub ore IMAGE file + # + + if {$data01_load!="" || $data01_offset!=""} { puts -nonewline $bif_fp { [}} + if {$data01_load!="" } { puts -nonewline $bif_fp {load = };puts -nonewline $bif_fp "$data01_load"} + if {$data01_load!="" && $data01_offset!=""} { puts -nonewline $bif_fp { , }} + if {$data01_offset!="" } { puts -nonewline $bif_fp {offset = };puts -nonewline $bif_fp "$data01_offset"} + if {$data01_load!="" || $data01_offset!=""} { puts -nonewline $bif_fp {]}} + if {$data01_file!=""} { puts $bif_fp $data01_file} + + if {$data01_load == ""} {TE::UTILS::te_msg TE_SW-26 STATUS "FILE01 LOAD NOT DEFINED..."} + if {$data01_offset == ""} {TE::UTILS::te_msg TE_SW-27 STATUS "FILE01 OFFSET NOT DEFINED..."} + if {$data01_file == ""} {TE::UTILS::te_msg TE_SW-28 STATUS "FILE01 FILE NOT DEFINED..."} + + + puts $bif_fp "\u007D" + + close $bif_fp + + } + #-------------------------------- + #--write_zusys_bif: + proc write_zusys_bif {{args ""}} { + set biffile "" + set fsbl_config "" + set bootloader "" + set pmu "" + set bitfile "" + set destination_cpu "" + set exception_level "" + #bl31.elf + set atf "" + set app "" + + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-biffile" { incr option; set biffile [lindex $args $option]} + "-fsbl_config" { incr option; set fsbl_config [lindex $args $option]} + "-bootloader" { incr option; set bootloader [lindex $args $option]} + "-pmu" { incr option; set pmu [lindex $args $option]} + "-bitfile" { incr option; set bitfile [lindex $args $option]} + "-destination_cpu" { incr option; set destination_cpu [lindex $args $option]} + "-exception_level" { incr option; set exception_level [lindex $args $option]} + "-atf" { incr option; set atf [lindex $args $option]} + "-app" { incr option; set app [lindex $args $option]} + default {TE::UTILS::te_msg TE_SW-29 ERROR "unrecognised option for BIF generation: [lindex $args $option]";return -code error } + } + } + set bif_fp [open "$biffile" w] + + puts $bif_fp "//arch = zynqmp; split = false; format = BIN" + puts $bif_fp "the_ROM_image:\n\u007B" + #fsbl_config + if {$fsbl_config!=""} { puts -nonewline $bif_fp { [fsbl_config]}} + if {$fsbl_config!=""} { puts $bif_fp $fsbl_config} + if {$fsbl_config == ""} {TE::UTILS::te_msg TE_SW-30 STATUS "FSBL_CONFIG NOT DEFINED..."} + #bootloader + if {$bootloader!=""} { puts -nonewline $bif_fp { [bootloader]}} + if {$bootloader!=""} { puts $bif_fp $bootloader} + if {$bootloader == ""} {TE::UTILS::te_msg TE_SW-31 STATUS "BOOTLOADER NOT DEFINED..."} + #pmuf + if {$pmu!=""} { puts -nonewline $bif_fp { [pmufw_image]}} + if {$pmu!=""} { puts $bif_fp $pmu} + if {$pmu == ""} {TE::UTILS::te_msg TE_SW-31 STATUS "PMU NOT DEFINED..."} + #bitfile + if {$bitfile!=""} { puts -nonewline $bif_fp { [destination_device = pl]}} + if {$bitfile!=""} { puts $bif_fp $bitfile} + if {$bitfile == ""} {TE::UTILS::te_msg TE_SW-32 STATUS "BITFILE NOT DEFINED..."} + #atf + if {$atf!=""} { puts -nonewline $bif_fp { [}} + if {$atf!=""} { puts -nonewline $bif_fp "destination_cpu =$destination_cpu"} + if {$atf!=""} { puts -nonewline $bif_fp ", exception_level =el-3"} + if {$atf!=""} { puts -nonewline $bif_fp {]}} + if {$atf!=""} { puts $bif_fp $atf} + if {$atf == ""} {TE::UTILS::te_msg TE_SW-33 STATUS "ATF BL31 ELF NOT DEFINED..."} + #elf + if {$app!=""} { puts -nonewline $bif_fp { [}} + if {$app!=""} { puts -nonewline $bif_fp "destination_cpu =$destination_cpu"} + if {$app!="" && $exception_level!=""} { puts -nonewline $bif_fp ", exception_level =$exception_level"} + if {$app!=""} { puts -nonewline $bif_fp {]}} + if {$app!=""} { puts $bif_fp $app} + if {$app == ""} {TE::UTILS::te_msg TE_SW-34 STATUS "APPLICATION ELF NOT DEFINED..."} + + puts $bif_fp "\u007D" + + close $bif_fp + + } + #-------------------------------- + #--generate_bootbin: + proc generate_bootbin {{fname ""}} { + set int_shortdir ${TE::SHORTDIR} + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + } + foreach sw_applist_line ${TE::SW_APPLIST} { + #generate *.bin only if app_list.csv->steps=0(generate all) or steps=1(*.bif and *.bin use *.elf from prebuild folders ) or steps=2(*.bin use *.elf and *.bif from prebuild folders) + if {[lindex $sw_applist_line 2]==0 || [lindex $sw_applist_line 2]==1 || [lindex $sw_applist_line 2]==2 || [lindex $sw_applist_line 2] eq "FSBL_APP"} { + #read app name + set app_name [lindex $sw_applist_line 1] + #delete old one + if {[file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bin]} { + file delete -force ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bin + } + # + if {![file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif]} { + TE::UTILS::te_msg TE_SW-35 ERROR "Application BIF-File found (${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif)." + return -code error "Application BIF-File found (${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/boot.bif)."; + } + #todo:hier noch in default suche? + TE::UTILS::te_msg TE_SW-36 STATUS "Generate Boot.bin for Application: ${app_name}" + set cur_path [pwd] + cd ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + set command exec + lappend command bootgen + lappend command -image boot.bif + #Ultrascale+Zynq + if {$TE::IS_ZUSYS} { + lappend command -arch zynqmp + } + lappend command -w -o BOOT.bin + # puts $command + TE::UTILS::te_msg TE_SW-37 INFO "Start BootGen: \n \ + Run \"$command\" in ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-3 INFO "Command results from BootGen \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished *bin/*bif generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--get_available_apps: + proc get_available_apps {{fname ""}} { + set int_shortdir ${TE::SHORTDIR} + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + } + set applist [] + [catch {set applist [glob -join -dir ${TE::PREBUILT_BI_PATH}/${int_shortdir}/ *]}] + set app_txt "Following Applications are available: \n" + foreach app $applist { + set tmp [split $app "/"] + set app_txt "$app_txt [lindex $tmp [expr [llength $tmp]-1]]\n" + } + TE::UTILS::te_msg TE_PR-38 INFO "$app_txt ------" + } + #-------------------------------- + #--excecute_zynq_flash_programming: + proc excecute_zynq_flash_programming {use_basefolder app_name {fname ""}} { + set return_filename "" + set int_shortdir ${TE::SHORTDIR} + set int_flashtyp $TE::ZYNQFLASHTYP + set run_path "" + set bootbinname BOOT.bin + if {$fname ne ""} { + set int_shortdir "[TE::BDEF::find_shortdir $fname]" + #get flashtyp form shortdir + set int_flashtyp "[TE::BDEF::get_zynqflashtyp $int_shortdir 4]" + } + if {![string match $int_flashtyp "NA"]} { + set cur_path [pwd] + if {$use_basefolder} { + set binfilename "" + if { ![catch {set binfilename [glob -join -dir ${TE::BASEFOLDER}/ *.bin]}] } { + TE::UTILS::te_msg TE_PR-39 STATUS "Used file:${binfilename}" + set return_filename ${binfilename} + set run_path $TE::BASEFOLDER + set nameonly [file tail [file rootname $binfilename]] + set bootbinname ${nameonly}.bin + } else { + TE::UTILS::te_msg TE_PR-40 ERROR "Bin-File was not found in ${TE::BASEFOLDER}." + return -code error "Bin-File was not found in ${TE::BASEFOLDER}."; + } + cd ${TE::BASEFOLDER} + } else { + if {![file exists ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/BOOT.bin]} { + TE::UTILS::te_msg TE_PR-41 ERROR "Application Bin-File was not found (${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/BOOT.bin)." + return -code error "Application Bin-File was not found (${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/BOOT.bin)."; + } + cd ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + set run_path ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name} + set bootbinname BOOT.bin + TE::UTILS::te_msg TE_PR-40 STATUS "Used file:${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/Boot.bin" + set return_filename ${TE::PREBUILT_BI_PATH}/${int_shortdir}/${app_name}/Boot.bin + } + set command exec + + # lappend command zynq_flash + lappend command program_flash + lappend command -f $bootbinname + lappend command -flash_type $int_flashtyp + TE::UTILS::te_msg TE_PR-41 INFO "Start program flash: \n \ + Run \"$command\" in ${run_path} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-4 INFO "Command results from program flash \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } else { + TE::UTILS::te_msg TE_PR-42 ERROR "Programming failed: Zynq Flash Typ is not specified for this board part. See ${TE::BOARDDEF_PATH}/..._board_files.csv" + } + return $return_filename + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # utilities functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--svn_checkin: + proc svn_checkin {foldername {mgs ""}} { + set message $mgs + if {![file exists $foldername]} { + set message "Error: Folder not found ( $foldername)" + } else { + set cur_path [pwd] + cd ${foldername} + set command exec + lappend command svn + lappend command ci + lappend command -m $message + TE::UTILS::te_msg TE_UTIL-72 INFO "Start SVN Checkin: \n \ + Run \"$command\" in ${foldername} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-5 INFO "Command results from SVN check in \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } + } + #-------------------------------- + #--unzip_project: + proc unzip_project {zipname file_location} { + set command exec + if {${TE::ZIP_PATH} ne ""} { + if {[file tail [file rootname ${TE::ZIP_PATH}]] eq "7z"} { + lappend command ${TE::ZIP_PATH} + lappend command x ${file_location}/${zipname} + lappend command -o${file_location} + } else { + lappend command ${TE::ZIP_PATH} + lappend command -help + # lappend command -e ${file_location}/${zipname} + # lappend command ${file_location} + } + TE::UTILS::te_msg TE_UTIL-73 INFO "Start UNZIP: \n \ + Run \"$command\" \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-6 INFO "Command results from UNZIP \"$command\": \n \ + $result \n \ + ------" + } else { + TE::UTILS::te_msg TE_UTIL-74 {CRITICAL WARNING} "Zip not specified. Set zip path and *exe of the zip program in \"design_basic_settings.cmd\" file : example 7zip: @set ZIP_PATH=C:/Program Files (x86)/7-Zip/7z.exe" + } + } + #-------------------------------- + #--zip_project: + proc zip_project {zipname {excludelist ""}} { + #todo mit übergabeparameter prebuilt weglassen oder so + #remove old backup project copy + set sourcepath [string trim $TE::VPROJ_PATH "vivado"] + set destinationpath ${TE::BACKUP_PATH}/${TE::VPROJ_NAME} + if {[file exists ${destinationpath}]} { + file delete -force ${destinationpath} + } + #create new destination folder + file mkdir ${destinationpath} + set cur_path [pwd] + cd ${TE::BACKUP_PATH} + #get all files + set filelist [ glob ${sourcepath}*] + #remove backup folder + set findex [lsearch $filelist *backup] + set filelist [lreplace $filelist[set filelist {}] $findex $findex] + + foreach el $filelist { + file copy -force ${el} ${destinationpath} + } + set excludelist + foreach el $excludelist { + set find "" + if {[catch {set find [glob -join -dir $destinationpath $el]}]} { + TE::UTILS::te_msg TE_UTIL-75 INFO "$el not found." + } else { + TE::UTILS::te_msg TE_UTIL-76 INFO "Excluded from backup:$find" + file delete -force $find + } + } + set command exec + if {${TE::ZIP_PATH} ne ""} { + if {[file tail [file rootname ${TE::ZIP_PATH}]] eq "7z"} { + lappend command ${TE::ZIP_PATH} + lappend command a -tzip "$zipname.zip" + lappend command "./${TE::VPROJ_NAME}/" + lappend command -r + } else { + lappend command ${TE::ZIP_PATH} + lappend command -r + lappend command "$zipname.zip" + lappend command "./${TE::VPROJ_NAME}/*.*" + } + TE::UTILS::te_msg TE_UTIL-77 INFO "Start ZIP: \n \ + Run \"$command\" \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-7 INFO "Command results from ZIP \"$command\": \n \ + $result \n \ + ------" + } else { + TE::UTILS::te_msg TE_UTIL-78 {CRITICAL WARNING} "Zip not specified. Set zip path and *exe of the zip program in \"design_basic_settings.cmd\" file : example 7zip: @set ZIP_PATH=C:/Program Files (x86)/7-Zip/7z.exe" + } + #remove project copy + if {[file exists ${destinationpath}]} { + file delete -force ${destinationpath} + } + cd $cur_path + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished utilities functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # SDSoC functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--run_sdsoc: + proc run_sdsoc {} { + set cur_path [pwd] + cd ${TE::SDSOC_PATH} + set command exec + lappend command sdsoc + lappend command -workspace ${TE::SDSOC_PATH} + # lappend command -lp ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + TE::UTILS::te_msg TE_SW-38 INFO "Start SDSoC: \n \ + Run \"$command\" in ${TE::SDSOC_PATH} \n \ + Please Wait.. \n \ + ------" + set result [eval $command] + TE::UTILS::te_msg TE_EXT-8 INFO "Command results from SDSoC \"$command\": \n \ + $result \n \ + ------" + cd $cur_path + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished sdsoc functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "INFO:(TE) Load Vivado script finished" +} + + diff --git a/zynqberrydemo3/scripts/script_hsi.tcl b/zynqberrydemo3/scripts/script_hsi.tcl new file mode 100644 index 0000000..3fa4ab1 --- /dev/null +++ b/zynqberrydemo3/scripts/script_hsi.tcl @@ -0,0 +1,270 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/05 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/06/13 $ +# -------------------------------------------------------------------- +# -- 2017/06/13 add pmuf hsi support +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval HSI { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # TE HSI variablen declaration + # ----------------------------------------------------------------------------------------------------------------------------------------- + variable HDF_NAME + variable LIB_PATH + variable SW_APPLIST + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished TE HSI variablen declaration + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hsi hw functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--open_project: + proc open_project {} { + if {[catch {set TE::HSI::HDF_NAME [glob -join -dir [pwd] *.hdf]} result]} { puts "Error:(TE) Script (TE::HSI::hsi_open_project) failed: $result."; return -code error} + #todo: eventuell mal extra verzeichnis erstellen, wie sdk + open_hw_design ${TE::HSI::HDF_NAME} + } + #-------------------------------- + #--set_repopath: + proc set_repopath {} { + set_repo_path ${TE::HSI::LIB_PATH} + } + #-------------------------------- + #--close_project: + proc close_project {} { + close_hw_design [current_hw_design] + } + #-------------------------------- + #--get_processors: + proc get_processors {PROCESSOR_ID} { + set proc [get_cells -filter {IP_TYPE==PROCESSOR}] + if {[llength $proc] == 0} { + return -code error "Error:(TE) No Processor found in design ${TE::HSI::HDF_NAME}"; + } else { + if {[llength $proc] > 1} { + puts "Info:(TE) Multiple Processors found." + } + if {[llength $proc] > $PROCESSOR_ID} { + puts "Info:(TE) Processor [lindex $proc $PROCESSOR_ID] is used." + return [lindex $proc $PROCESSOR_ID] + } else { + return -code error "Error:(TE) No Processor ID $PROCESSOR_ID not found in design ${TE::HSI::HDF_NAME}"; + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished hw functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hsi sw functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--create_sw_project: + proc create_sw_project {app_name os uart {proc_id 0}} { + puts "Test: $app_name , $proc_id" + set cpu [get_processors $proc_id] + set hwdesign [current_hw_design] + set swdesign [hsi::create_sw_design system -proc $cpu -app $app_name -os $os] + set os [hsi::get_os] + if {$uart ne "NA"} { + #workaround to change uart -> currently generate_app will delete bsp and write default one + generate_app -hw $hwdesign -sw $swdesign -app $app_name -proc $cpu -dir $app_name -os $os + hsi::close_sw_design $swdesign + hsi::open_sw_design ${app_name}/${app_name}_bsp/system.mss + #reset old variables + set swdesign [get_sw_designs] + set os [hsi::get_os] + #set uart properties + common::set_property CONFIG.stdin $uart $os + common::set_property CONFIG.stdout $uart $os + #generate bsp + hsi::generate_bsp -dir ${app_name}/${app_name}_bsp/ -compile + cd ${app_name} + set result "" + #run make + if {[catch {set result [eval exec make]}]} {puts "Info:(TE) $result"} + cd .. + } else { + generate_app -hw $hwdesign -sw $swdesign -app $app_name -proc $cpu -os $os -dir $app_name -verbose -compile + } + close_sw_design $swdesign + } + #-------------------------------- + #--create_devicetree_project: + proc create_devicetree_project {app_name os} { + set cpu [get_processors 0] + set hwdesign [current_hw_design] + set swdesign [hsi::create_sw_design $app_name -proc $cpu -os $os] + generate_target -dir $app_name + close_sw_design $swdesign + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished sw functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hsi run functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--run_sw_apps: + proc run_sw_apps {} { + #search and generate fsbl and device tree + foreach sw_applist_line ${TE::HSI::SW_APPLIST} { + #generate fsbl only + if {[lindex $sw_applist_line 2] eq "FSBL" } { + set name [lindex $sw_applist_line 1] + set os [lindex $sw_applist_line 3] + set uart [lindex $sw_applist_line 4] + puts "Info:(TE) generate FSBL: $name os: $os Uart: $uart" + create_sw_project $name $os $uart + } + #generate pmu UynqMP only + if {[lindex $sw_applist_line 2] eq "PMU" } { + set name [lindex $sw_applist_line 1] + set os [lindex $sw_applist_line 3] + set uart [lindex $sw_applist_line 4] + #select pmu + set proc_id 6 + puts "Info:(TE) generate PMU: $name os: $os Uart: $uart" + create_sw_project $name $os $uart $proc_id + } + #generate device tree only + if {[lindex $sw_applist_line 2] eq "DTS" } { + set name [lindex $sw_applist_line 1] + set os [lindex $sw_applist_line 3] + puts "Info:(TE) generate Device-Tree: $name os: $os" + create_devicetree_project $name $os + } + } + #search and generate software apps + foreach sw_applist_line ${TE::HSI::SW_APPLIST} { + #generate *.bin only if app_list.csv->steps=0(generate all) or steps=3(*.elf only ) + if {[lindex $sw_applist_line 2] == 0 || [lindex $sw_applist_line 2] == 3} { + set name [lindex $sw_applist_line 1] + set os [lindex $sw_applist_line 3] + set uart [lindex $sw_applist_line 4] + puts "Info:(TE) generate app: $name os: $os Uart: $uart" + create_sw_project $name $os $uart + } + } + } + #-------------------------------- + #--debug_sw_app_list: + proc debug_sw_app_list {} { + set TE::HSI::SW_APPLIST [list] + foreach lpath ${TE::HSI::LIB_PATH} { + if {[file exists ${lpath}/apps_list.csv]} { + puts "Info:(TE) Read Software list from ${lpath}/apps_list.csv" + set fp [open "${lpath}/apps_list.csv" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + # set fsbl_name "" + foreach line $data { + # check file version ignore comments and empty lines + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #check version + set tmp [split $line "="] + #version is ignored for debug only + } elseif {[string match *#* $line] != 1 && [string length $line] > 0} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #splitt and append + set tmp [split $line ","] + lappend TE::HSI::SW_APPLIST $tmp + } + } + } + } + puts "------------------------------------------" + } + #-------------------------------- + #--run_all: + proc run_all {} { + #todo: run all als option und hsi auch über batch separat startbar + puts "Info:(TE) HSI...run all..." + if {[catch {open_project} result]} { puts "Error:(TE) Script (TE::HSI::open_project) failed: $result."; return -code error} + if {[catch {set_repopath} result]} { puts "Error:(TE) Script (TE::HSI::set_repopath) failed: $result."; return -code error} + #---------------------------------------- + if {[catch {run_sw_apps} result]} { puts "Error:(TE) Script (TE::HSI::run_sw_apps) failed: $result."; return -code error} + #---------------------------------------- + if {[catch {close_project} result]} { puts "Error:(TE) Script (TE::HSI::close_project) failed: $result."; return -code error} + } + #-------------------------------- + #--return_option: + proc return_option {option argc argv} { + if { $argc <= [expr $option + 1]} { + return -code error "Error:(TE) Read parameter failed" + } else { + puts "Info:(TE) Parameter Option Value: [lindex $argv [expr $option + 1]]" + return [lindex $argv [expr $option + 1]] + } + } + #-------------------------------- + #--hsi_main: + proc hsi_main {} { + global argc + global argv + set tmp_argc 0 + set tmp_argv 0 + if {$argc >= 1 } { + set tmp_argv [lindex $argv 0] + set tmp_argc [llength $tmp_argv] + } + + set vivrun false + variable SW_APPLIST + variable LIB_PATH + + for {set option 0} {$option < $tmp_argc} {incr option} { + puts "Info:(TE) Parameter Index: $option" + puts "Info:(TE) Parameter Option: [lindex $tmp_argv $option]" + switch [lindex $tmp_argv $option] { + "--sw_list" { set SW_APPLIST [return_option $option $tmp_argc $tmp_argv];incr option } + "--lib" { set LIB_PATH [return_option $option $tmp_argc $tmp_argv];incr option } + "--vivrun" { set vivrun true } + default { puts "" } + } + } + if {$vivrun==true} { + if {[catch {run_all} result]} { puts "Error:(TE) Script (TE::HSI::run_all) failed: $result."; exit} + exit + } + + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished run functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hsi run scripts + # ----------------------------------------------------------------------------------------------------------------------------------------- + if {[catch {hsi_main} result]} { puts "Error:(TE) Script (TE::HSI::hsi_main) failed: $result."; exit} + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished hsi run scripts + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "Info: Load HSI scripts finished" +} + + diff --git a/zynqberrydemo3/scripts/script_main.tcl b/zynqberrydemo3/scripts/script_main.tcl new file mode 100644 index 0000000..28d8483 --- /dev/null +++ b/zynqberrydemo3/scripts/script_main.tcl @@ -0,0 +1,184 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/02 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/06/30 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +puts "-----------------------------------------------------------------------" +#load source scripts +source ../scripts/script_settings.tcl +source ../scripts/script_environment.tcl +source ../scripts/script_vivado.tcl +source ../scripts/script_te_utils.tcl +source ../scripts/script_external.tcl +source ../scripts/script_designs.tcl +source ../scripts/script_usrcommands.tcl +source ../scripts/script_sdsoc.tcl +#sources from other programs: +# source ../scripts/main.tcl +# source ../scripts/hsi.tcl +set sdsoc_available "0" +catch {set sdsoc_available $::env(SDSOC_AVAILABLE)} +if {$sdsoc_available} { + set x_dir "" + set x_vers "" + catch {set x_dir $::env(XILDIR)} + catch {set x_vers $::env(VIVADO_VERSION)} + puts "INFO:(TE) Source Xilinx SDSoC Scripts (${x_dir}/SDx/${x_vers}/scripts/vivado/sdsoc_pfm.tcl)." + source -notrace ${x_dir}/SDx/${x_vers}/scripts/vivado/sdsoc_pfm.tcl +} +puts "-----------------------------------------------------------------------" + +namespace eval TE { + namespace eval INIT { + variable my_script $argv0 + # + + proc return_option {option} { + global argc + global argv + + if { $argc <= [expr $option + 1]} { + puts "ERROR:(TE) Read Parameter failed" + show_help + } else { + puts "INFO:(TE) Parameter Option Value: [lindex $argv [expr $option + 1]]" + return [lindex $argv [expr $option + 1]] + } + } + + proc show_help_batchfile_commands {} { + variable my_script + puts "--TODO: Rework Info for main" + puts "INFO:(TE) Batch-File TCL-Script start options:" + puts "write: vivado -source ../scripts/script_main.tcl -mode batch -notrace -tclargs " + puts "Options:" + puts "Programming:" + puts "--TODO: explanation" + puts "Create/Run Vivado project:" + puts "--run : run option: \ + -1-no nothing is done \ + 0 -open existing project(default) \ + 1 -create selected boardpart project \ + 2 -run selected boardpart project \ + 3 -run all boardpart project" + puts "--boardpart : Trenz Board ID from TEXXXX_boardfiles.csv (you can use ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list)" + puts "--gui : gui mode option:\ + 0 -disable(default) \ + 1 -before project generation \ + 2 -after project generation" + puts "--clean : clean project option:\ + 0 -no(default) \ + 1 -vivado project \ + 2 -vivado and hsi workspace \ + 3 -all (vivado, hsi and sdk workspace )\ + 4 -all and prebuilt (vivado, hsi and sdk workspace and prebuilt)" + puts "--help : display this help and exit" + puts "" + puts "Example: vivado -source ../scripts/script_main.tcl -mode batch -notrace -tclargs --part xc7z020clg484-1 --boardpart trenz.biz:te0720-02-1cf:part0:1.0 --clean" + } + + proc main {} { + global argc + global argv + # + set use_teprocedure "NA" + set use_labtoolsonly false + set use_run_labtools false + set use_clear_all false + set use_run_prebuild_sdk false + set use_zynq_programming false + set use_mcs_programming false + set use_bit_programming false + set use_basefolder false + set use_programming_app "NA" + set use_vivadogui 0 + set use_run 0 + set use_clean 0 + set use_board "NA" + cd .. + + puts "-----------------------------------------------------------------------" + init_pathvar + # + puts "-----------------------------------------------------------------------" + # + if {$argc == 0} { + puts "" + puts "INFO:(TE) Default configuration will be used." + puts "" + } else { + for {set option 0} {$option < $argc} {incr option} { + puts "INFO:(TE) Parameter Index: $option" + puts "INFO:(TE) Parameter Option: [lindex $argv $option]" + switch [lindex $argv $option] { + "--clear_all" { set use_clear_all true } + "--run_te_procedure" { set use_teprocedure [return_option $option]; incr option } + "--run_prebuild_sdk" { set use_run_prebuild_sdk true } + "--run_labtools" { set use_run_labtools true } + "--program_bin" { set use_zynq_programming true } + "--program_mcs" { set use_mcs_programming true } + "--program_bit" { set use_bit_programming true } + "--program_swapp" { set use_programming_app [return_option $option]; incr option } + "--use_basefolder" { set use_basefolder [return_option $option]; incr option } + "--labtools" { set use_labtoolsonly true } + "--run" { set use_run [return_option $option]; incr option } + "--boardpart" { set use_board [return_option $option]; incr option } + "--gui" { set use_vivadogui [return_option $option]; incr option } + "--clean" { set use_clean [return_option $option]; incr option } + "--help" { show_help_batchfile_commands } + "" { } + default { puts "Warning:(TE) unrecognised option: [lindex $argv $option]"; show_help } + } + } + } + + set starttime [clock seconds] + puts "-----------------------------------------------------------------------" + if {$use_clear_all} { + if {[catch {clear_project_all } result]} { puts "ERROR:(TE) Script (TE::INIT::clear_project_all) failed: $result."; return -code error} + } elseif {$use_teprocedure ne "NA"} { + if {[catch {run_te_procedure $use_teprocedure $use_board} result]} { puts "ERROR:(TE) Script (TE::INIT::run_te_procedure) failed: $result."; return -code error} + } elseif {$use_run_labtools} { + if {[catch {run_labtools $use_board } result]} { puts "ERROR:(TE) Script (TE::INIT::run_labtools) failed: $result."; return -code error} + } elseif {$use_run_prebuild_sdk} { + if {[catch {run_sdk $use_board } result]} { puts "ERROR:(TE) Script (TE::INIT::run_sdk) failed: $result."; return -code error} + } elseif {$use_bit_programming} { + if {[catch {program_fpga_bit $use_basefolder $use_board $use_programming_app $use_labtoolsonly} result]} { puts "ERROR:(TE) Script (TE::INIT::program_fpga_bit) failed: $result."; return -code error} + } elseif {$use_mcs_programming} { + if {[catch {program_fpga_mcs $use_basefolder $use_board $use_programming_app $use_labtoolsonly} result]} { puts "ERROR:(TE) Script (TE::INIT::program_fpga_mcs) failed: $result."; return -code error} + } elseif {$use_zynq_programming} { + if {[catch {program_zynq_bin $use_basefolder $use_board $use_programming_app $use_labtoolsonly} result]} { puts "ERROR:(TE) Script (TE::INIT::program_zynq_bin) failed: $result."; return -code error} + } else { + if {[catch {run_project $use_board $use_run $use_vivadogui $use_clean} result]} { puts "ERROR:(TE) Script (TE::INIT::run_project) failed: $result."; return -code error} + } + puts "-----------------------------------------------------------------------" + set stoptime [clock seconds] + set timeelapsed [expr $stoptime -$starttime] + + set report_file ${TE::LOG_PATH}/time_elapsed.txt + set fp_w [open ${report_file} "w"] + puts $fp_w "Times elapsed..." + puts $fp_w "$timeelapsed seconds" + puts $fp_w "..." + close $fp_w + + #--------------------------------------------- + } + + + + if {[catch {main} result]} { + puts "ERROR:(TE) Script (TE::main) failed: $result." + } + } +} \ No newline at end of file diff --git a/zynqberrydemo3/scripts/script_sdsoc.tcl b/zynqberrydemo3/scripts/script_sdsoc.tcl new file mode 100644 index 0000000..4f4e2c2 --- /dev/null +++ b/zynqberrydemo3/scripts/script_sdsoc.tcl @@ -0,0 +1,367 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/04/11 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2016/10/06 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval SDSOC { + + #------------------------------------ + #--create_sdsoc_structure: ... + proc create_sdsoc_structure {} { + #clear old sdsoc + puts "Info:(TE) Delete old SDSOC Project Structure (${TE::SDSOC_PATH})." + TE::UTILS::clean_sdsoc + puts "Info:(TE) Create new SDSOC Project Structure(${TE::SDSOC_PATH})." + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + #-------------------- + #old 2015.4 + # if {[file exists ${TE::SET_PATH}/sdsoc/arm-xilinx-eabi]} { + # file copy -force ${TE::SET_PATH}/sdsoc/arm-xilinx-eabi ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + # } else { + # file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/arm-xilinx-eabi + # } + # if {[file exists ${TE::SET_PATH}/sdsoc/arm-xilinx-linux-gnueabi]} { + # file copy -force ${TE::SET_PATH}/sdsoc/arm-xilinx-linux-gnueabi ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + # } else { + # file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/arm-xilinx-linux-gnueabi + # } + #new 2016.2 + #different settings between 7Series and UltraScaleZynq + if {$TE::IS_ZSYS || $TE::IS_MSYS } { + if {[file exists ${TE::SET_PATH}/sdsoc/aarch32-none]} { + file copy -force ${TE::SET_PATH}/sdsoc/aarch32-none ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + #used for different memory versions + if {[file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld_${TE::SHORTDIR}]} { + if {[file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld]} { + file delete -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld + } + file copy -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld_${TE::SHORTDIR} ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none/lscript.ld + } + } else { + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch32-none + } + } elseif {$TE::IS_ZUSYS} { + if {[file exists ${TE::SET_PATH}/sdsoc/aarch64-none-elf]} { + file copy -force ${TE::SET_PATH}/sdsoc/aarch64-none-elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + #used for different memory versions + if {[file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld_${TE::SHORTDIR}]} { + if {[file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld]} { + file delete -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld + } + file copy -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld_${TE::SHORTDIR} ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf/lscript.ld + } + } else { + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/aarch64-none-elf + } + } + #-------------------- + if {[file exists ${TE::SET_PATH}/sdsoc/boot]} { + file copy -force ${TE::SET_PATH}/sdsoc/boot ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + set prebuit_pl_path ${TE::PREBUILT_OS_PATH}/petalinux/default/ + if {[file exists ${TE::PREBUILT_OS_PATH}/petalinux/${TE::SHORTDIR}]} { + set prebuit_pl_path ${TE::PREBUILT_OS_PATH}/petalinux/${TE::SHORTDIR} + } + if {$TE::IS_ZSYS || $TE::IS_MSYS } { + #search for petalinux generated fsbl.elf + set elf_list [] + if { [catch {set elf_list [ glob ${prebuit_pl_path}/*.elf ] }] } { + } else { + foreach elf $elf_list { + if {[string match *fsbl* $elf]} { + file copy -force $elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/zynq_fsbl.elf + } + } + } + #search for sdk generated fsbl.elf -> overwrite petalinux fsbl.elf if exist + set elf_list [] + if { [catch {set elf_list [ glob ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/*.elf ] }] } { + } else { + foreach elf $elf_list { + if {[string match *fsbl* $elf]} { + file copy -force $elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/zynq_fsbl.elf + } + } + } + #copy rest of prebuilt files + # if {[file exists ${prebuit_pl_path}/urootfs.cpio.gz]} { + # file copy -force ${prebuit_pl_path}/urootfs.cpio.gz ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/uramdisk.image.gz + # } + # if {[file exists ${prebuit_pl_path}/system.dtb]} { + # file copy -force ${prebuit_pl_path}/system.dtb ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/devicetree.dtb + # } + # if {[file exists ${prebuit_pl_path}/uImage]} { + # file copy -force ${prebuit_pl_path}/uImage ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + if {[file exists ${prebuit_pl_path}/image.ub]} { + file copy -force ${prebuit_pl_path}/image.ub ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + if {[file exists ${prebuit_pl_path}/u-boot.elf]} { + file copy -force ${prebuit_pl_path}/u-boot.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + } elseif {$TE::IS_ZUSYS} { + #search for petalinux generated fsbl.elf + set elf_list [] + if { [catch {set elf_list [ glob ${prebuit_pl_path}/*.elf ] }] } { + } else { + foreach elf $elf_list { + if {[string match *fsbl* $elf]} { + file copy -force $elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/fsbl.elf + } + } + } + #search for sdk generated fsbl.elf -> overwrite petalinux fsbl.elf if exist + set elf_list [] + if { [catch {set elf_list [ glob ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/*.elf ] }] } { + } else { + foreach elf $elf_list { + if {[string match *fsbl* $elf]} { + file copy -force $elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/fsbl.elf + } + } + } + # #copy rest of prebuilt files + # if {[file exists ${prebuit_pl_path}/urootfs.cpio.gz]} { + # file copy -force ${prebuit_pl_path}/urootfs.cpio.gz ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/uramdisk.tar.gz + # } + # if {[file exists ${prebuit_pl_path}/system.dtb]} { + # file copy -force ${prebuit_pl_path}/system.dtb ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + # if {[file exists ${prebuit_pl_path}/uImage]} { + # file copy -force ${prebuit_pl_path}/uImage ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + # if {[file exists ${prebuit_pl_path}/bl31.elf]} { + # file copy -force ${prebuit_pl_path}/bl31.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + # if {[file exists ${prebuit_pl_path}/u-boot.elf]} { + # file copy -force ${prebuit_pl_path}/u-boot.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + # } + #copy rest of prebuilt files + if {[file exists ${prebuit_pl_path}/image.ub]} { + file copy -force ${prebuit_pl_path}/image.ub ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + if {[file exists ${prebuit_pl_path}/bl31.elf]} { + file copy -force ${prebuit_pl_path}/bl31.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + if {[file exists ${prebuit_pl_path}/u-boot.elf]} { + file copy -force ${prebuit_pl_path}/u-boot.elf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot/ + } + } + } else { + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/boot + } + #-------------------- + if {[file exists ${TE::SET_PATH}/sdsoc/samples]} { + file copy -force ${TE::SET_PATH}/sdsoc/samples ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + } else { + # file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/samples + } + #-------------------- + if {[file exists ${TE::SET_PATH}/sdsoc/hardware]} { + file copy -force ${TE::SET_PATH}/sdsoc/hardware ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit]} { + file copy -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/hardware/prebuilt/bitstream.bit + } + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf]} { + file copy -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/hardware/prebuilt/export/${TE::PR_TOPLEVELNAME}.hdf + } + } else { + file mkdir ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/hardware + } + } + #------------------------------------ + #--check_vivado_project: ... + proc check_and_modify_vivado_project {check_only} { + if {$check_only} { + puts "---------------------" + puts "Info:(TE) Run SDSOC check:" + puts " Notes:" + puts " -Errors: could not fixed automaticly" + puts " -Warnings: can be fixed automaticly or can be ignored." + puts " Run:" + } else { puts "Info:(TE) Run SDSOC check (modify project):"} + #------------------ + #check sdsoc environment : + # + if {!$TE::SDSOC_AVAILABLE } { + set txt "Error:(TE) SDSOC environment not set." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) SDSOC environment check passed";} + #------------------ + #check zip program : + # + if {![file exists $TE::ZIP_PATH]} { + set txt "Error:(TE) SDSOC ZIP program not found ($TE::ZIP_PATH)." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) SDSOC ZIP program check passed";} + #------------------ + #check pfm settings : + #file to generate hw.pfm + if {![file exists ${TE::SET_PATH}/sdsoc/sdsoc_pfm.tcl]} { + set txt "Error:(TE) Project specific TCL-File for HW_PFM-generation not found (${TE::SET_PATH}/sdsoc_pfm.tcl)." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) HW PFM check passed";} + #------------------ + #check pfm settings : + #file to generate sw.pfm (currently is only a copy) + if {![file exists ${TE::SET_PATH}/sdsoc/sdsoc_sw.pfm]} { + set txt "Error:(TE) Project specific File for SW_PFM-generation not found (${TE::SET_PATH}/sdsoc_sw.pfm)." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) SW PFM check passed";} + #------------------ + #check project name: + #must be platform_name (${TE::VPROJ_NAME}) + if {![file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.xpr]} { + set txt "Error:(TE) Vivado project name is not SDSOC compatible, should be: ${TE::VPROJ_NAME}.xpr" + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Vivado project name check passed";} + #------------------ + #check toplevel name: + #should be _wrapper + set toplevel [get_property top [current_fileset]] + if {![string match *_wrapper $toplevel]} { + set txt "Error:(TE) Top level is not SDSOC compatible, should be: *_wrapper" + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Top Level Name check passed";} + # if {![string match ${TE::VPROJ_NAME}* $toplevel]} { + # set txt "Warning:(TE) Current top level should be: ${TE::VPROJ_NAME}*" + # if {!$check_only} { + # # currently nothing must be done + # # return -code error $txt + # } else {puts " $txt";} + # } + #------------------ + #check processor system: + #must be processor system + if {!$TE::IS_ZSYS && !$TE::IS_ZUSYS && !$TE::IS_MSYS } { + set txt "Error:(TE) Block Design contains no processor system (Checked with TE::INIT::check_bdtyp)." + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Processor check passed";} + #------------------ + #check project language: + #must be verilog + if {[get_property target_language [current_project]] ne "Verilog"} { + set txt "Warning:(TE) Vivado isn't a Verilog Project." + if {!$check_only} { + #change language + set_property target_language Verilog [current_project] + puts "Info:(TE) Target Language check passed (Project Modify:Set target Language to Verilog)" + # return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Target Language check passed";} + #------------------ + #check bd files: + #currently only one bdfile supported (TE) + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + set txt "Error:(TE) No Block Design found. Should be only one!" + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } elseif {[llength $bd_files]>1 } { + set txt "Error:(TE) More than one Block Design found. Should be only one!" + if {!$check_only} { + return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) BD-Design count check passed";} + #------------------ + #check top level file language: + #must be verilog + set bd $bd_files + # open_bd_design $bd -quiet + # set bd_name [get_bd_designs] + set bd_name [open_bd_design $bd -quiet] + if {![file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.v]} { + set txt "Warning:(TE) Toplevel file should be Verilog." + if {!$check_only} { + #remove old vhdl toplevel + remove_files ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.vhd + file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.vhd + #make verilog top + make_wrapper -files [get_files $bd] -top + add_files -norecurse ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.v + update_compile_order -fileset ${TE::SOURCE_NAME} + update_compile_order -fileset ${TE::SIM_NAME} + puts "Info:(TE) Top Level check passed (Project Modify: Regenerate Toplevel as Verilog file)" + # return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Top Level check passed";} + close_bd_design [get_bd_designs $bd] + #------------------ + #check board part : + #board part not allowed + if {[get_property board_part [current_project]] ne ""} { + set txt "Warning:(TE) Board Part usage is not allowed for SDSOC." + if {!$check_only} { + TE::ADV::beta_hw_remove_board_part + puts "Info:(TE) Board Part check passed (Project Modify: Remove Board Part properties)" + # return -code error $txt + } else {puts " $txt";} + } else {puts " Info:(TE) Board Part check passed";} + #------------------ + puts "---------------------" + } + + #------------------------------------ + #--export_vivado_project: ... + proc export_vivado_sdsoc_project {} { + puts "Info:(TE) Create SDSOC Vivado Project on: ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/vivado" + if { [file exists ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/vivado] } { + file delete -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/vivado + } + archive_project ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/${TE::VPROJ_NAME}.xpr.zip -temp_dir ${TE::VPROJ_PATH}/.Xil/Vivado-xxxx- -force -include_config_settings + TE::EXT::unzip_project ${TE::VPROJ_NAME}.xpr.zip ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + file rename -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/${TE::VPROJ_NAME} ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/vivado + file delete -force ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/${TE::VPROJ_NAME}.xpr.zip + } + #------------------------------------ + #--create_sdsoc_pfm: ... + proc create_sdsoc_pfm {} { + puts "Info:(TE) Create SDSOC Vivado Project pfm: ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/" + #open bd design + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + puts "Warning:(TE) No BD-File found." + } + foreach bd $bd_files { + open_bd_design $bd + } + #generate hw pfm + puts "Info:(TE) Generate ${TE::VPROJ_NAME}_hw.pfm" + source -notrace ${TE::SET_PATH}/sdsoc/sdsoc_pfm.tcl + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}_hw.pfm ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/ + #generate sw pfm (todo generate content from existing files) + puts "Info:(TE) Generate ${TE::VPROJ_NAME}_sw.pfm" + file copy -force ${TE::SET_PATH}/sdsoc/sdsoc_sw.pfm ${TE::SDSOC_PATH}/${TE::VPROJ_NAME}/${TE::VPROJ_NAME}_sw.pfm + } + # # ------------------------------------------------------- + } + + puts "Info:(TE) Load SDSOC script finished" +} + + diff --git a/zynqberrydemo3/scripts/script_settings.tcl b/zynqberrydemo3/scripts/script_settings.tcl new file mode 100644 index 0000000..be6c429 --- /dev/null +++ b/zynqberrydemo3/scripts/script_settings.tcl @@ -0,0 +1,874 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/02 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/06/28 $ +# -------------------------------------------------------------------- +# -- 2017/06/13 new release version +# -- 2017/06/28 new board part csv version +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval ::TE { + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # TE variable declaration + # ----------------------------------------------------------------------------------------------------------------------------------------- + # overwrite Setting: + # create TCL file: /settings/development_settings.tcl + # overwrite example: + # set TE:: + # set TE::GEN_HW_BIT false + # ----------------------------------- + # Unsupported Settings: + # --------------------- + # Currently only one BD is allowed + # Multi BD Design is official not supported (maybe not all functions run correctly): + # For Multi BD Design do following: + # 1. set variable BD_MULTI to true + # 2. Make own Top-level File (Name: _top) in the folder "/hdl/" with file name: "_top.vhd" or "_top.v" + variable BD_MULTI false + # + variable DESIGNRUNS [list] + # ----------------------------------- + # Build Settings: + # Attention: there are dependencies between this properties! + # --------------------- + variable GEN_HW_DELETEOLDFILES true + variable GEN_HW_BIT true + variable GEN_HW_MCS true + variable GEN_HW_RPT true + variable GEN_HW_HDF true + variable GEN_SW_HSI true + variable GEN_SW_BIF true + variable GEN_SW_BIN true + variable GEN_SW_BITMCS true + variable GEN_SW_USEPREBULTHDF false + variable GEN_SW_FORCEBOOTGEN false + # ----------------------------------- + # Basic Settings: + # Attention: do not change following variables manually! + # --------------------- + # project path + variable BASEFOLDER + variable VPROJ_NAME + variable VPROJ_PATH + variable VLABPROJ_PATH + variable BOARDDEF_PATH + variable FIRMWARE_PATH + variable IP_PATH + variable BD_PATH + variable XDC_PATH + variable HDL_PATH + variable SET_PATH + variable WORKSPACE_PATH + variable WORKSPACE_HSI_PATH + variable WORKSPACE_SDK_PATH + variable LIB_PATH + variable PREBUILT_PATH + variable PREBUILT_HW_PATH + variable PREBUILT_SW_PATH + variable PREBUILT_BI_PATH + variable PREBUILT_OS_PATH + variable SCRIPT_PATH + variable DOC_PATH + variable LOG_PATH + variable BACKUP_PATH + variable ZIP_PATH + variable SDSOC_PATH + # ----------------------------------- + variable ZIP_IGNORE_LIST [list] + # ----------------------------------- + variable BATCH_FILE_NAME + variable VIVADO_AVAILABLE + variable LABTOOL_AVAILABLE + variable SDK_AVAILABLE + variable SDSOC_AVAILABLE + # ----------------------------------- + variable XILINXGIT_DEVICETREE + variable XILINXGIT_UBOOT + variable XILINXGIT_LINUX + # ----------------------------------- + # board_files + variable ID "NA" + variable PRODID "NA" + variable BOARDPART "NA" + variable PARTNAME "NA" + variable SHORTDIR "NA" + variable ZYNQFLASHTYP "NA" + variable FPGAFLASHTYP "NA" + variable CFGMEM_IF "NA" + variable CFGMEM_MEMSIZE_MB "NA" + # ----------------------------------- + #project run (use default name) + #for renaming use prefix sim*, syn*, imp* and con*! + variable TIMEOUT 120 + variable RUNNING_JOBS 4 + #todo: multiple runs and strategies and modified strategies + variable SIM_NAME sim_1 + variable SYNTH_NAME synth_1 + variable IMPL_NAME impl_1 + variable CONST_NAME constrs_1 + variable SOURCE_NAME sources_1 + # ----------------------------------- + # check csv file ids + variable SCRIPTVER "2017.1.03" + variable BOARDDEF_CSV "1.3" + variable SW_IP_CSV "2.0" + variable BDMOD_CSV "1.1" + variable ZIP_CSV "1.0" + # ----------------------------------- + variable SW_APPLIST [list] + #BOARD_DEFINITION currently in BDEF todo set to init in settings + variable BD_MOD_COMMENT [list] + variable BD_MOD_ADD [list] + variable BD_MOD_PCOMMENT [list] + variable BD_MOD_PADD [list] + variable BD_TCLNAME "NA" + variable PR_TOPLEVELNAME "NA" + variable IS_ZSYS false + variable IS_ZUSYS false + variable IS_MSYS false + variable IS_FSYS false + # ----------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished TE variables declaration + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + namespace eval INIT { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # initial functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--import_usr_tcl: + proc init_usr_tcl {} { + # hidden function: official not supported + set usr_script [] + if { ![catch {set usr_script [glob -join -dir ${TE::SET_PATH}/usr/ *.tcl]}] } { + TE::UTILS::te_msg TE_INIT-58 INFO "Load additional user TCL-script:\n ${usr_script}" + uplevel 1 [ list ::source ${usr_script}] + } + } + #-------------------------------- + #--print_version: + proc print_version {} { + set viv_version "NA" + if {[catch {set viv_version [lindex [split [::version] "\n"] 0]}]} { set viv_version "NA" } + set TE::BATCH_FILE_NAME "NA" + if {[catch {set TE::BATCH_FILE_NAME $::env(batchfile_name)}]} { set TE::BATCH_FILE_NAME "NA" } + + TE::UTILS::te_msg TE_INIT-0 INFO "Script Info:\n \ + Vivado Version: $viv_version\n \ + TE Script Version: $TE::SCRIPTVER\n \ + Board Part (Definition Files) CSV Version: $TE::BOARDDEF_CSV\n \ + Software IP CSV Version: $TE::SW_IP_CSV\n \ + Board Design Modify CSV Version: $TE::BDMOD_CSV\n \ + ZIP ignore CSV Version: $TE::ZIP_CSV\n \ + ---\n \ + Start project with: $TE::BATCH_FILE_NAME\n \ + ------" + } + #-------------------------------- + #--print_environment_settings: + proc print_environment_settings {} { + set TE::VIVADO_AVAILABLE 0 + set TE::LABTOOL_AVAILABLE 0 + set TE::SDK_AVAILABLE 0 + set TE::SDSOC_AVAILABLE 0 + [catch {set TE::VIVADO_AVAILABLE $::env(VIVADO_AVAILABLE)}] + [catch {set TE::LABTOOL_AVAILABLE $::env(LABTOOL_AVAILABLE)}] + [catch {set TE::SDK_AVAILABLE $::env(SDK_AVAILABLE)}] + [catch {set TE::SDSOC_AVAILABLE $::env(SDSOC_AVAILABLE)}] + TE::UTILS::te_msg TE_INIT-1 INFO "Script Environment:\n \ + Vivado Setting: $TE::VIVADO_AVAILABLE \n \ + LabTools Setting: $TE::LABTOOL_AVAILABLE \n \ + SDK Setting: $TE::SDK_AVAILABLE \n \ + SDSOC Setting: $TE::SDSOC_AVAILABLE \n \ + ------" + + if {$TE::SDK_AVAILABLE==1 && $TE::SDSOC_AVAILABLE==1} { + TE::UTILS::te_msg TE_INIT-2 WARNING "SDK settings are overwritten by SDSOC settings." + } + } + #-------------------------------- + #--init_pathvar: + proc init_pathvar {} { + set tmppath [pwd] + if {[file tail [pwd]]=="vivado"} { + cd .. + } + set TE::BASEFOLDER [pwd] + set TE::VPROJ_NAME [file tail [pwd]] + set TE::VPROJ_PATH [pwd]/vivado + set TE::VLABPROJ_PATH [pwd]/vivado_lab + #-- + set TE::BOARDDEF_PATH [pwd]/board_files + set TE::FIRMWARE_PATH [pwd]/firmware + #-- + set TE::IP_PATH [pwd]/ip_lib + set TE::BD_PATH [pwd]/block_design + set TE::XDC_PATH [pwd]/constraints + set TE::HDL_PATH [pwd]/hdl + set TE::SET_PATH [pwd]/settings + #-- + set TE::WORKSPACE_PATH [pwd]/workspace + set TE::WORKSPACE_HSI_PATH ${TE::WORKSPACE_PATH}/hsi + set TE::WORKSPACE_SDK_PATH ${TE::WORKSPACE_PATH}/sdk + #-- + set TE::LIB_PATH [pwd]/sw_lib + set TE::SCRIPT_PATH [pwd]/scripts + set TE::DOC_PATH [pwd]/doc + #-- + set TE::PREBUILT_PATH [pwd]/prebuilt + set TE::PREBUILT_BI_PATH ${TE::PREBUILT_PATH}/boot_images + set TE::PREBUILT_HW_PATH ${TE::PREBUILT_PATH}/hardware + set TE::PREBUILT_SW_PATH ${TE::PREBUILT_PATH}/software + set TE::PREBUILT_OS_PATH ${TE::PREBUILT_PATH}/os + #-- + set TE::LOG_PATH [pwd]/v_log + set TE::BACKUP_PATH [pwd]/backup + #-- + set TE::ZIP_PATH "" + [catch {set TE::ZIP_PATH $::env(ZIP_PATH)}] + #-- + set TE::SDSOC_PATH [pwd]/sdsoc + set TE::XILINXGIT_DEVICETREE "" + [catch {set TE::XILINXGIT_DEVICETREE $::env(XILINXGIT_DEVICETREE)}] + set TE::XILINXGIT_UBOOT "" + [catch {set TE::XILINXGIT_UBOOT $::env(XILINXGIT_UBOOT)}] + set TE::XILINXGIT_LINUX "" + [catch {set TE::XILINXGIT_LINUX $::env(XILINXGIT_LINUX)}] + #-- + TE::UTILS::te_msg TE_INIT-3 INFO "Initial project names and paths:\n \ + TE::VPROJ_NAME: $TE::VPROJ_NAME \n \ + TE::VPROJ_PATH: $TE::VPROJ_PATH \n \ + TE::VLABPROJ_PATH: $TE::VLABPROJ_PATH \n \ + TE::BOARDDEF_PATH: $TE::BOARDDEF_PATH \n \ + TE::FIRMWARE_PATH: $TE::FIRMWARE_PATH \n \ + TE::IP_PATH: $TE::IP_PATH \n \ + TE::BD_PATH: $TE::BD_PATH \n \ + TE::XDC_PATH: $TE::XDC_PATH \n \ + TE::HDL_PATH: $TE::HDL_PATH \n \ + TE::SET_PATH: $TE::SET_PATH \n \ + TE::WORKSPACE_HSI_PATH: $TE::WORKSPACE_HSI_PATH \n \ + TE::WORKSPACE_SDK_PATH: $TE::WORKSPACE_SDK_PATH \n \ + TE::LIB_PATH: $TE::LIB_PATH \n \ + TE::SCRIPT_PATH: $TE::SCRIPT_PATH \n \ + TE::DOC_PATH: $TE::DOC_PATH \n \ + TE::PREBUILT_BI_PATH: $TE::PREBUILT_BI_PATH \n \ + TE::PREBUILT_HW_PATH: $TE::PREBUILT_HW_PATH \n \ + TE::PREBUILT_SW_PATH: $TE::PREBUILT_SW_PATH \n \ + TE::PREBUILT_OS_PATH: $TE::PREBUILT_OS_PATH \n \ + TE::LOG_PATH: $TE::LOG_PATH \n \ + TE::BACKUP_PATH: $TE::BACKUP_PATH \n \ + TE::ZIP_PATH: $TE::ZIP_PATH \n \ + TE::SDSOC_PATH: $TE::SDSOC_PATH \n \ + TE::XILINXGIT_DEVICETREE: $TE::XILINXGIT_DEVICETREE \n \ + TE::XILINXGIT_UBOOT: $TE::XILINXGIT_UBOOT \n \ + TE::XILINXGIT_LINUX: $TE::XILINXGIT_LINUX \n \ + ------" + + cd $tmppath + } + #-------------------------------- + #--init_board: + proc init_board {ID POS} { + TE::BDEF::get_check_unique_name $ID $POS + + set TE::ID [TE::BDEF::get_id $ID $POS] + set TE::PRODID [TE::BDEF::get_prodid $ID $POS] + set TE::BOARDPART [TE::BDEF::get_boardname $ID $POS] + set TE::PARTNAME [TE::BDEF::get_partname $ID $POS] + set TE::SHORTDIR [TE::BDEF::get_shortname $ID $POS] + set TE::ZYNQFLASHTYP [TE::BDEF::get_zynqflashtyp $ID $POS] + set tmp [TE::BDEF::get_fpgaflashtyp $ID $POS] + #todo extrakt CFGMEM_IF and CFGMEM_MEMSIZE_MB from FPGAFLASHTYP-name and from bitfile configuration + set tmp [split $tmp "|"] + if {[llength $tmp] eq 3} { + set TE::FPGAFLASHTYP [lindex $tmp 0] + set TE::CFGMEM_IF [lindex $tmp 1] + set TE::CFGMEM_MEMSIZE_MB [lindex $tmp 2] + } else { + set TE::FPGAFLASHTYP $tmp + set TE::CFGMEM_IF "NA" + set TE::CFGMEM_MEMSIZE_MB "NA" + } + TE::UTILS::te_msg TE_INIT-4 INFO "Board Part definition:\n \ + TE::ID: $TE::ID \n \ + TE::PRODID: $TE::PRODID \n \ + TE::PARTNAME: $TE::PARTNAME \n \ + TE::BOARDPART: $TE::BOARDPART \n \ + TE::SHORTDIR: $TE::SHORTDIR \n \ + TE::ZYNQFLASHTYP: $TE::ZYNQFLASHTYP \n \ + TE::FPGAFLASHTYP: $TE::FPGAFLASHTYP \n \ + ------" + } + #-------------------------------- + #--init_part_only: init fpga part if found in csv (used if board part is not defined on open project) + proc init_part_only {partname} { + #--check if fpga part is unique + #-2 not found + #-1 some same + #0 unique + #1 all same + set pcheck [TE::BDEF::get_check_unique_name $partname 2] + if {$pcheck == 0 } { + set TE::ID [TE::BDEF::get_id $partname 2] + set TE::PRODID "NA" + set TE::BOARDPART "NA" + set TE::PARTNAME [TE::BDEF::get_partname $partname 2] + set TE::SHORTDIR [TE::BDEF::get_shortname $partname 2] + set TE::ZYNQFLASHTYP [TE::BDEF::get_zynqflashtyp $partname 2] + set tmp [TE::BDEF::get_fpgaflashtyp $partname 2] + #todo extrakt CFGMEM_IF and CFGMEM_MEMSIZE_MB from FPGAFLASHTYP-name and from bitfile configuration + set tmp [split $tmp "|"] + if {[llength $tmp] eq 3} { + set TE::FPGAFLASHTYP [lindex $tmp 0] + set TE::CFGMEM_IF [lindex $tmp 1] + set TE::CFGMEM_MEMSIZE_MB [lindex $tmp 2] + } else { + set TE::FPGAFLASHTYP $tmp + set TE::CFGMEM_IF "NA" + set TE::CFGMEM_MEMSIZE_MB "NA" + } + + TE::UTILS::te_msg TE_INIT-5 WARNING "Board Part definition initialisation with unique part name:\n \ + TE::ID: $TE::ID \n \ + TE::PRODID: $TE::PRODID \n \ + TE::PARTNAME: $TE::PARTNAME \n \ + TE::BOARDPART: $TE::BOARDPART \n \ + TE::SHORTDIR: $TE::SHORTDIR \n \ + TE::ZYNQFLASHTYP: $TE::ZYNQFLASHTYP \n \ + TE::FPGAFLASHTYP: $TE::FPGAFLASHTYP \n \ + ------" + } elseif {$pcheck == 1 } { + #todo check if flash is the same on all definitions + set TE::ID "NA" + set TE::PRODID "NA" + set TE::BOARDPART "NA" + set TE::PARTNAME [TE::BDEF::get_partname $partname 2] + #short name is fpga name + set TE::SHORTDIR [TE::BDEF::get_shortname $partname 2] + set TE::ZYNQFLASHTYP "NA" + set TE::FPGAFLASHTYP "NA" + set TE::CFGMEM_IF "NA" + set TE::CFGMEM_MEMSIZE_MB "NA" + TE::UTILS::te_msg TE_INIT-6 WARNING "Board Part definition initialisation with same part name:\n \ + TE::ID: $TE::ID \n \ + TE::PRODID: $TE::PRODID \n \ + TE::PARTNAME: $TE::PARTNAME \n \ + TE::BOARDPART: $TE::BOARDPART \n \ + TE::SHORTDIR: $TE::SHORTDIR \n \ + TE::ZYNQFLASHTYP: $TE::ZYNQFLASHTYP \n \ + TE::FPGAFLASHTYP: $TE::FPGAFLASHTYP \n \ + ------" + } else { + set TE::ID "NA" + set TE::PRODID "NA" + set TE::BOARDPART "NA" + set TE::PARTNAME $partname + set TE::SHORTDIR $partname + set TE::ZYNQFLASHTYP "NA" + set TE::FPGAFLASHTYP "NA" + set TE::CFGMEM_IF "NA" + set TE::CFGMEM_MEMSIZE_MB "NA" + puts "Warning:(TE) Part name not found, use requested name:" + TE::UTILS::te_msg TE_INIT-7 {CRITICAL WARNING} "Board Part definition initialisation with unknown part name:\n \ + TE::ID: $TE::ID \n \ + TE::PRODID: $TE::PRODID \n \ + TE::PARTNAME: $TE::PARTNAME \n \ + TE::BOARDPART: $TE::BOARDPART \n \ + TE::SHORTDIR: $TE::SHORTDIR \n \ + TE::ZYNQFLASHTYP: $TE::ZYNQFLASHTYP \n \ + TE::FPGAFLASHTYP: $TE::FPGAFLASHTYP \n \ + ------" + } + + } + #-------------------------------- + #--check_bdtyp: check BD typ + proc check_bdtyp {} { + set bd_files [] + set TE::BD_TCLNAME "NA" + set TE::PR_TOPLEVELNAME "NA" + set TE::IS_ZSYS false + set TE::IS_ZUSYS false + set TE::IS_MSYS false + set TE::IS_FSYS false + #get bd_filelist + set bd_files [TE::UTILS::search_bd_files] + foreach bd $bd_files { + set TE::BD_TCLNAME [file tail [file rootname $bd]] + set TE::PR_TOPLEVELNAME "[string trim $TE::BD_TCLNAME "_bd"]_wrapper" + TE::UTILS::te_msg TE_INIT-8 INFO "Found BD-Design:\n \ + TE::BD_TCLNAME: $TE::BD_TCLNAME \n \ + TE::PR_TOPLEVELNAME: $TE::PR_TOPLEVELNAME \n \ + ------" + #check typ for other functions + if {[string match *zsys* $TE::BD_TCLNAME ]} {set TE::IS_ZSYS true; TE::UTILS::te_msg TE_INIT-9 STATUS " TE::IS_ZSYS: $TE::IS_ZSYS" + } elseif {[string match *zusys* $TE::BD_TCLNAME ]} {set TE::IS_ZUSYS true; TE::UTILS::te_msg TE_INIT-10 STATUS " TE::IS_ZUSYS: $TE::IS_ZUSYS" + } elseif {[string match *msys* $TE::BD_TCLNAME ]} {set TE::IS_MSYS true; TE::UTILS::te_msg TE_INIT-11 STATUS " TE::IS_MSYS: $TE::IS_MSYS" + } elseif {[string match *fsys* $TE::BD_TCLNAME ]} {set TE::IS_FSYS true; TE::UTILS::te_msg TE_INIT-12 STATUS " TE::IS_FSYS: $TE::IS_FSYS" + } else { + TE::UTILS::te_msg TE_INIT-13 WARNING "Not all TE-functions support unknown BD Filename. Use: \n \ + \"*zsys*.tcl\" for Systems with Zynq \n \ + \"*zusys*.tcl\" for Systems with UltraScale Zynq \n \ + \"*msys*.tcl\" for Systems with MicroBlaze \n \ + \"*fsys*.tcl\" for Systems with FPGA-Fabric design only \n \ + ------" + } + } + } + #-------------------------------- + #--init_boardlist: + proc init_boardlist {} { + set board_files "" + set TE::BDEF::BOARD_DEFINITION [list] + if { [catch {set board_files [ glob $TE::BOARDDEF_PATH/*board_files_mod.csv ] }] } { + if { [catch {set board_files [ glob $TE::BOARDDEF_PATH/*board_files.csv ] }] } { + TE::UTILS::te_msg TE_INIT-14 WARNING "No board part definition list found (Path: ${TE::BOARDDEF_PATH})." + } + } else { + TE::UTILS::te_msg TE_INIT-15 WARNING "Modified board part definition list found (File: ${board_files})." + } + if {$board_files ne ""} { + TE::UTILS::te_msg TE_INIT-16 INFO "Read board part definition list (File ${board_files})." + set fp [open "${board_files}" r] + set file_data [read $fp] + close $fp + # set TE::BDEF::BOARD_DEFINITION [list] + set data [split $file_data "\n"] + foreach line $data { + # check file version ignore comments and empty lines + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + set tmp [split $line "="] + if {[string match [lindex $tmp 1] $TE::BOARDDEF_CSV] != 1} { + TE::UTILS::te_msg TE_INIT-17 ERROR "Wrong board part definition CSV version (${TE::BOARDDEF_PATH}/board_files.csv) get [lindex $tmp 1] expected ${TE::BOARDDEF_CSV}." + return -code error "Wrong board part definition CSV version (${TE::BOARDDEF_PATH}/board_files.csv) get [lindex $tmp 1] expected ${TE::BOARDDEF_CSV}." + } + } elseif {[string match *#* $line] != 1 && [string length $line] > 0} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #splitt and append + set tmp [split $line ","] + lappend TE::BDEF::BOARD_DEFINITION $tmp + } + } + } + } + #-------------------------------- + #--init_app_list: + proc init_app_list {} { + set TE::SW_APPLIST [list] + if {[file exists ${TE::LIB_PATH}/apps_list.csv]} { + TE::UTILS::te_msg TE_INIT-18 INFO "Read Software list (File: ${TE::LIB_PATH}/apps_list.csv)." + set fp [open "${TE::LIB_PATH}/apps_list.csv" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + # set fsbl_name "" + foreach line $data { + # check file version ignore comments and empty lines + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #check version + set tmp [split $line "="] + if {[string match [lindex $tmp 1] $TE::SW_IP_CSV] != 1} { + TE::UTILS::te_msg TE_INIT-19 ERROR "Wrong Software Definition CSV Version (${TE::LIB_PATH}/apps_list.csv) get [lindex $tmp 1] expected ${TE::SW_IP_CSV}." + return -code error "Wrong Software Definition CSV Version (${TE::LIB_PATH}/apps_list.csv) get [lindex $tmp 1] expected $TE::SW_IP_CSV" + } + } elseif {[string match *#* $line] != 1 && [string length $line] > 0} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #splitt and append + set tmp [split $line ","] + lappend TE::SW_APPLIST $tmp + } + } + #------------------------------------------ + if {![file exists ${TE::XILINXGIT_DEVICETREE}]} { + set tmp_index -1 + foreach sw_applist_line ${TE::SW_APPLIST} { + incr tmp_index + #currently remove Device Tree from list (currently only additonal files) + if {[lindex $sw_applist_line 2] eq "DTS" } { + TE::UTILS::te_msg TE_INIT-20 {CRITICAL WARNING} "Xilinx Devicetree git clone path not found (Path: ${TE::XILINXGIT_DEVICETREE}). Device-Tree generation will be removed from apps_list.csv" + set TE::SW_APPLIST [lreplace $TE::SW_APPLIST $tmp_index $tmp_index] + } + } + } + #------------------------------------------ + } else { + TE::UTILS::te_msg TE_INIT-21 INFO "No software apps_list used." + } + } + #-------------------------------- + #--init_zip_ignore_list: + proc init_zip_ignore_list {} { + set TE::ZIP_IGNORE_LIST [list] + if {[file exists ${TE::SET_PATH}/zip_ignore_list.csv]} { + TE::UTILS::te_msg TE_INIT-22 INFO "Read ZIP ignore list (File: ${TE::LIB_PATH}/apps_list.csv)." + set fp [open "${TE::SET_PATH}/zip_ignore_list.csv" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + foreach line $data { + # check file version ignore comments and empty lines + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #check version + set tmp [split $line "="] + if {[string match [lindex $tmp 1] $TE::ZIP_CSV] != 1} { + TE::UTILS::te_msg TE_INIT-23 ERROR " Wrong Zip ignore definition CSV Version (${TE::SET_PATH}/zip_ignore_list.csv) get [lindex $tmp 1] expected ${TE::ZIP_CSV}." + return -code error "Wrong Zip ignore definition CSV Version (${TE::SET_PATH}/zip_ignore_list.csv) get [lindex $tmp 1] expected ${TE::ZIP_CSV}." + } + } elseif {[string match *#* $line] != 1 && [string length $line] > 0} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #splitt and append + set tmp [split $line ","] + lappend TE::ZIP_IGNORE_LIST $tmp + } + } + } else { + TE::UTILS::te_msg TE_INIT-24 INFO "No Zip ignore list used." + } + } + #-------------------------------- + #--init_mod_list: + proc init_mod_list {} { + set TE::BD_MOD_COMMENT [list] + set TE::BD_MOD_ADD [list] + set TE::BD_MOD_PCOMMENT [list] + set TE::BD_MOD_PADD [list] + if {[file exists ${TE::BD_PATH}/mod_bd.csv]} { + TE::UTILS::te_msg TE_INIT-25 INFO "Read BD modify list (File: ${TE::BD_PATH}/mod_bd.csv)." + set fp [open "${TE::BD_PATH}/mod_bd.csv" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + foreach line $data { + #ignore comments and empty lines + if {[string match *#* $line] != 1 && [string length $line] > 0} { + # check file version + if {[string match *CSV_VERSION* $line] } { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #check version + set tmp [split $line "="] + if {[string match [lindex $tmp 1] $TE::BDMOD_CSV] != 1} { + TE::UTILS::te_msg TE_INIT-26 ERROR " Wrong BD Modify CSV Version (${TE::BD_PATH}/mod_bd.csv) get [lindex $tmp 1] expected ${TE::BDMOD_CSV}." + return -code error " Wrong BD Modify CSV Version (${TE::BD_PATH}/mod_bd.csv) get [lindex $tmp 1] expected $TE::BDMOD_CSV" + } + } else { + #split line + set temp [split $line ","] + if {[llength $temp] <3} { + TE::UTILS::te_msg TE_INIT-27 WARNING "Not enough elements on line ($line). Line ignored." + } else { + #get line id +remove spaces and tabs + set line_id [string map {"\t" ""} [string map {" " ""} [lindex $temp 0]]] + #sort + if {$line_id eq "id"} { + #table header + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + set temp [split $line ","] + lappend TE::BD_MOD_COMMENT $temp + lappend TE::BD_MOD_ADD $temp + lappend TE::BD_MOD_PCOMMENT $temp + lappend TE::BD_MOD_PADD $temp + } elseif {$line_id==0} { + # ID 0: remove(comment) line + lappend TE::BD_MOD_COMMENT $temp + } elseif {$line_id==1} { + # ID 1: add line + if {[llength $temp] >3} { + # replaced removed comma from modify txt + set newinsert_list [list] + lappend newinsert_list [lindex $temp 0] + lappend newinsert_list [lindex $temp 1] + set addstring [lindex $temp 2] + for {set i 3} {$i < [llength $temp]} {incr i} { + set addstring "${addstring},[lindex $temp $i]" + } + lappend newinsert_list $addstring + set temp $newinsert_list + } + lappend TE::BD_MOD_ADD $temp + } elseif {$line_id==2} { + # ID 2: remove(comment) property + lappend TE::BD_MOD_PCOMMENT $temp + } elseif {$line_id==3} { + # ID 3: add property + lappend TE::BD_MOD_PADD $temp + } else { + #unsupported lines ignored + TE::UTILS::te_msg TE_INIT-28 WARNING "Unsupported id ($line_id). Line ignored." + } + } + } + } + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished initial functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + + namespace eval BDEF { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # board part definition functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + variable BOARD_DEFINITION [list] + #{"ID" "PRODID" "PARTNAME" "BOARDNAME" "SHORTDIR"} + #extract board definition list from board definition file "board_files.csv" + #-------------------------------- + #--find_shortdir: + proc find_shortdir {NAME} { + variable BOARD_DEFINITION + #search in id + set value [get_shortname $NAME 0] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-29 STATUS "Found Shortname: $value";return $value} + #search in productid + set value [get_shortname $NAME 1] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-30 STATUS "Found Shortname: $value";return $value} + #search in boardname + set value [get_shortname $NAME 3] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-31 STATUS "Found Shortname: $value";return $value} + #search in shortname + set value [get_shortname $NAME 4] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-32 STATUS "Found Shortname: $value";return $value} + #search in part name (only if unique) + if {[get_check_unique_name $NAME 2]==0} { + set value [get_shortname $NAME 2] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-33 STATUS "Found Shortname: $value";return $value} + } + #default + TE::UTILS::te_msg TE_INIT-34 STATUS "No Shortname found for ${NAME}, use default " + return "default" + } + #-------------------------------- + #--find_id: + proc find_id {NAME} { + variable BOARD_DEFINITION + #search in id + set value [get_id $NAME 0] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-35 STATUS "Found ID: $value";return $value} + #search in productid + set value [get_id $NAME 1] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-36 STATUS "Found ID: $value";return $value} + #search in boardname + set value [get_id $NAME 3] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-37 STATUS "Found ID: $value";return $value} + #search in shortname + set value [get_id $NAME 4] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-38 STATUS "Found ID: $value";return $value} + #search in part name (only if unique) + if {[get_check_unique_name $NAME 2]==0} { + set value [get_id $NAME 2] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-39 STATUS "Found ID: $value";return $value} + } + #default + TE::UTILS::te_msg TE_INIT-40 STATUS "No ID found for ${NAME}, use NA " + return "NA" + } + #-------------------------------- + #--find_partname: + proc find_partname {NAME} { + variable BOARD_DEFINITION + #search in id + set value [get_partname $NAME 0] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-41 STATUS "Found part name: $value";return $value} + #search in productid + set value [get_partname $NAME 1] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-42 STATUS "Found part name: $value";return $value} + #search in boardname + set value [get_partname $NAME 3] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-43 STATUS "Found part name: $value";return $value} + #search in shortname + set value [get_partname $NAME 4] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-44 STATUS "Found part name: $value";return $value} + #search in part name (only if unique) + if {[get_check_unique_name $NAME 2]==0} { + set value [get_partname $NAME 2] + if {$value ne "NA"} {TE::UTILS::te_msg TE_INIT-45 STATUS "Found part name: $value";return $value} + } + #default + TE::UTILS::te_msg TE_INIT-46 STATUS "No part name found for ${NAME}, use NA " + return "NA" + } + #-------------------------------- + #--get_check_unique_name: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_check_unique_name {NAME POS} { + variable BOARD_DEFINITION + set part_count 0 + set max_count [expr [llength $BOARD_DEFINITION] -1] + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + set part_count [expr $part_count+1] + } + } + #-2 not found + #-1 some same + #0 unique + #1 all same + if {$part_count==0} { + TE::UTILS::te_msg TE_INIT-47 STATUS "Board part csv name check: $NAME not found on position $POS." + return -2 + } elseif {$part_count==$max_count} { + TE::UTILS::te_msg TE_INIT-48 STATUS "Board part csv name check: All names ($NAME) are equal on position $POS." + return 1 + } elseif {$part_count==1} { + TE::UTILS::te_msg TE_INIT-49 STATUS "Board part csv name check: $NAME is unique on position $POS." + return 0 + } else { + TE::UTILS::te_msg TE_INIT-50 STATUS "Board part csv name check: Only some names ($NAME) are equal on position $POS." + return -1 + } + } + #-------------------------------- + #--get_id: Name--> search name, POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_id {NAME POS} { + variable BOARD_DEFINITION + set last_id 0 + foreach sublist $BOARD_DEFINITION { + if {$last_id < [lindex $sublist 0] && [lindex $sublist 0] ne "ID"} { + set last_id [lindex $sublist 0] + } + # if { [string equal $NAME [lindex $sublist $POS]] } { + # return [lindex $sublist 0] + # } + if { [string match -nocase $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 0] + } + } + if {$NAME eq "LAST_ID"} { + #return the the highest id from the list + return $last_id + } + #default + TE::UTILS::te_msg TE_INIT-51 STATUS "ID not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_prodid: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_prodid {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 1] + } + } + #default + TE::UTILS::te_msg TE_INIT-52 STATUS "Product ID not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_partname: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_partname {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 2] + } + } + #default + TE::UTILS::te_msg TE_INIT-53 STATUS "Part Name not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_boardname: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_boardname {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 3] + } + } + #default + TE::UTILS::te_msg TE_INIT-54 STATUS "Board Name not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_shortname: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_shortname {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 4] + } + } + #default + TE::UTILS::te_msg TE_INIT-55 STATUS "Short Name not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_zynqflashtyp: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_zynqflashtyp {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 5] + } + } + #default + TE::UTILS::te_msg TE_INIT-56 STATUS "Zynq Flash typ not found for $NAME $POS, return default: NA" + return "NA" + } + #-------------------------------- + #--get_fpgaflashtyp: POS: Table position ID(0)(unique) PRODID(1)(unique),PARTNAME(2),BOARDNAME(3)(unique),SHORTNAME(4)(unique),ZYNQFLASHTYP(5),FPGAFLASHTYP(6) + proc get_fpgaflashtyp {NAME POS} { + variable BOARD_DEFINITION + foreach sublist $BOARD_DEFINITION { + if { [string equal $NAME [lindex $sublist $POS]] } { + return [lindex $sublist 6] + } + } + #default + TE::UTILS::te_msg TE_INIT-57 STATUS "FPGA Flash typ not found for $NAME $POS, return default: NA" + return "NA" + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished initial functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "INFO:(TE) Load Settings Script finished" +} \ No newline at end of file diff --git a/zynqberrydemo3/scripts/script_te_utils.tcl b/zynqberrydemo3/scripts/script_te_utils.tcl new file mode 100644 index 0000000..003af23 --- /dev/null +++ b/zynqberrydemo3/scripts/script_te_utils.tcl @@ -0,0 +1,766 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/04 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/05/18 $ +# -------------------------------------------------------------------- +# -- 2017/06/13 rise te_msg cnt +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval UTILS { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #-------------------------------- + #--te_msg: + proc te_msg {vmsg_id vmsg_sev vmsg_msg} { + # vmsg_id: TE_INIT, TE_UT, TE_EXT, TE_BD, TE_HW, TE_SW, TE_PR + #last vmsg_nr: + #TE_INIT 169 -> TE initialisation + #TE_UTIL 99 -> TE utilities + #TE_EXT 8 -> External + #TE_PS 1 -> PS modification 0,1-> external tcl-scripts with settings! + #TE_BD 26 -> Block Design + #TE_HW 81 -> HW Design + #TE_SW 66 -> SW Design + #TE_PR 84 -> Programming + # vmsg_sev: STATUS, INFO, WARNING, {CRITICAL WARNING}, ERROR + # set vmsg_id TE_DEF;set vmsg_sev STATUS;set vmsg_msg "Info"; + # common::send_msg_id "$vmsg_id" $vmsg_sev $vmsg_msg + if {[catch {common::send_msg_id "$vmsg_id" $vmsg_sev $vmsg_msg}] } {puts "${vmsg_sev}: ($vmsg_id) $vmsg_msg"} + #Info: Do not start Text with: -- + #TE::UTILS::te_msg TE_INIT-2 WARNING "SDK settings are overwritten by SDSOC settings." + #TE::UTILS::te_msg TE_INIT-0 INFO "Script Info: \n \ + # ------" + + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # search source files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--search_bd_files: search in TE::BD_PATH for *.tcl files return list + proc search_bd_files {} { + # search for block design for the board part only (folder with tcl must exist, otherwise base BD_Path is used!) + #currently only on bd.tcl is allowed + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::BD_PATH}/${TE::SHORTDIR} *.tcl]}] } { + if { [catch {set bd_files [glob -join -dir ${TE::BD_PATH}/ *.tcl]}] } { + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + TE::UTILS::te_msg TE_UTIL-0 WARNING "No Block-Design Export was found in ${TE::BD_PATH}, start vivado without bd-design" + } else { + TE::UTILS::te_msg TE_UTIL-1 WARNING "No Block-Design Export was found, use current Vivado project Block-Designs from:${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ ." + } + } + } + set bd_names "" + foreach bd $bd_files { + set bd_names "$bd_names $bd \n" + } + TE::UTILS::te_msg TE_UTIL-2 INFO "Following block designs were found: \n \ + $bd_names \ + ------" + if {!$TE::BD_MULTI} { + if {[llength $bd_files]>1 } { + TE::UTILS::te_msg TE_UTIL-3 WARNING "Currently only one Block-Design is supported with TE-scripts, deleted or rename file-extension from unused *.tcl in ${TE::BD_PATH} or ${TE::BD_PATH}/${TE::SHORTDIR}." + return -code error "Currently only one Block-Design is supported with TE-scripts, deleted or rename file-extension from unused *.tcl in ${TE::BD_PATH} or ${TE::BD_PATH}/${TE::SHORTDIR}." + } + } + return $bd_files + } + #-------------------------------- + #--search_xdc_files: search in TE::XDC_PATH for *xdc files return list + proc search_xdc_files {} { + # search for xdc file if bord part folder exist, this used too + set xdc_files [] + set base_xdc_files [] + set bp_xdc_files [] + if { [catch {set base_xdc_files [ glob $TE::XDC_PATH/*.xdc ] }] } { + TE::UTILS::te_msg TE_UTIL-4 WARNING "*.xdc search: ${TE::XDC_PATH}/ is empty." + } + if {[file exists ${TE::XDC_PATH}/${TE::SHORTDIR}/]} { + if { [catch {set bp_xdc_files [ glob $TE::XDC_PATH/${TE::SHORTDIR}/*.xdc ] }] } { + TE::UTILS::te_msg TE_UTIL-5 WARNING "*.xdc search: ${TE::XDC_PATH}/${TE::SHORTDIR}/ is empty." + } + #generate empty target xdc for gui constrains + if { ![file exists ${TE::XDC_PATH}/${TE::SHORTDIR}/vivado_target.xdc]} { + TE::UTILS::te_msg TE_UTIL-6 INFO "Generate ${TE::XDC_PATH}/${TE::SHORTDIR}/vivado_target.xdc" + close [ open ${TE::XDC_PATH}/${TE::SHORTDIR}/vivado_target.xdc w ] + lappend bp_xdc_files ${TE::XDC_PATH}/${TE::SHORTDIR}/vivado_target.xdc + } + set xdc_files [concat $base_xdc_files $bp_xdc_files] + } else { + set xdc_files $base_xdc_files + #generate empty target xdc for gui constrains + if { ![file exists ${TE::XDC_PATH}/vivado_target.xdc]} { + TE::UTILS::te_msg TE_UTIL-7 INFO "Generate ${TE::XDC_PATH}/vivado_target.xdc" + close [ open ${TE::XDC_PATH}/vivado_target.xdc w ] + lappend xdc_files ${TE::XDC_PATH}/vivado_target.xdc + } + } + + set xdc_names "" + foreach xdc $xdc_files { + set xdc_names "$xdc_names $xdc \n" + } + TE::UTILS::te_msg TE_UTIL-8 INFO "Following xdc files were found: \n \ + $xdc_names \ + ------" + + return $xdc_files + } + #-------------------------------- + #--search_xci_files: search in TE::HDL_PATH for *.xci files return list + proc search_xci_files {} { + set xci_files [list] + set xci_files_main [list] + set xci_files_sub [list] + catch {set xci_files_main [glob -join -dir $TE::HDL_PATH/xci/ *.xci]} + catch {set xci_files_sub [glob -join -dir $TE::HDL_PATH/xci/${TE::SHORTDIR}/ *.xci]} + set xci_files [concat $xci_files_main $xci_files_sub] + set xci_names "" + foreach xci_f $xci_files { + set xci_names "$xci_names $xci_f \n" + } + TE::UTILS::te_msg TE_UTIL-9 INFO "Following xci files were found: \n \ + $xci_names \ + ------" + + return $xci_files + } + #-------------------------------- + #--search_elf_files: search in TE::FIRMWARE_PATH for *.elf files return list + proc search_elf_files {} { + set elf_files_sub [list] + catch {set elf_files_sub [glob -join -dir ${TE::FIRMWARE_PATH} */*.elf]} + + set elf_names "" + foreach elf_f $elf_files_sub { + set elf_names "$elf_names $elf_f \n" + } + TE::UTILS::te_msg TE_UTIL-10 INFO "Following elf files were found: \n \ + $elf_names \ + ------" + + return $elf_files_sub + } + #-------------------------------- + #--search_hdl_files: search in TE::HDL_PATH for *.vhd and *.v files return list + proc search_hdl_files {} { + set hdl_files [list] + set vhd_files [list] + set vhd_files_sub1 [list] + set vhd_files_sub2 [list] + set v_files [list] + set v_files_sub1 [list] + set v_files_sub2 [list] + set sv_files [list] + set sv_files_sub1 [list] + set sv_files_sub2 [list] + catch {set vhd_files [glob -join -dir ${TE::HDL_PATH} *.vhd]} + catch {set vhd_files_sub1 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ *.vhd]} + catch {set vhd_files_sub2 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.vhd]} + catch {set v_files [glob -join -dir ${TE::HDL_PATH} *.v]} + catch {set v_files_sub1 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.v]} + catch {set v_files_sub2 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.v]} + catch {set sv_files [glob -join -dir ${TE::HDL_PATH} *.sv]} + catch {set sv_files_sub1 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.sv]} + catch {set sv_files_sub2 [glob -join -dir ${TE::HDL_PATH}/${TE::SHORTDIR}/ */*.sv]} + set hdl_files [concat $vhd_files $vhd_files_sub1 $vhd_files_sub2 $v_files $v_files_sub1 $v_files_sub2 $sv_files $sv_files_sub1 $sv_files_sub2] + + set hdl_names "" + foreach hdl_f $hdl_files { + set hdl_names "$hdl_names $hdl_f \n" + } + TE::UTILS::te_msg TE_UTIL-11 INFO "Following hdl files were found: \n \ + $hdl_names \ + ------" + + return $hdl_files + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished search source files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # modify block design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--modify_block_design_tcl: + proc setinfo_to_block_design_tcl {datalist mod_file} { + TE::UTILS::te_msg TE_UTIL-22 INFO "Block Design tcl: info lines were added." + set data $datalist + if {$mod_file} { + # set data [linsert $data[set data {}] 0 "puts \"Info:(TE) This block design file has been modified. Modifications labelled with comment tag # #TE_MOD# on the Block-Design tcl-file.\""] + set data [linsert $data[set data {}] 0 "TE::UTILS::te_msg TE_BD-1 INFO \"This block design tcl-file was modified by TE-Scripts. Modifications are labelled with comment tag # #TE_MOD# on the Block-Design tcl-file.\""] + } + # set data [linsert $data[set data {}] 0 "puts \"Info:(TE) This block design file has been exported with Reference-Design Scripts from Trenz Electronic GmbH for Board Part:${TE::BOARDPART} with FPGA ${TE::PARTNAME} at [ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"].\""] + set data [linsert $data[set data {}] 0 "TE::UTILS::te_msg TE_BD-0 INFO \"This block design tcl-file was generate with Trenz Electronic GmbH Board Part:${TE::BOARDPART}, FPGA: ${TE::PARTNAME} at [ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"].\""] + return $data + } + #-------------------------------- + #--modify_block_design_tcl: load and save block design tcl (sub functions used for modifications) + proc modify_block_design_tcl {file_name mod_file} { + TE::UTILS::te_msg TE_UTIL-12 STATUS "Open bd design export [file tail [file rootname $file_name]]" + #read file to string list + set fp_r [open ${file_name} "r"] + set file_data [read $fp_r] + close $fp_r + + set data [split $file_data "\n"] + + #modify list elements () + if {$mod_file} { + if {[catch {set data [modify_block_design_commentlines $data]} result]} { TE::UTILS::te_msg TE_UTIL-13 ERROR "Script (TE::UTILS::modify_block_design_commentlines) failed: $result."; return -code error} + if {[catch {set data [modify_block_design_commentdesignprops $data]} result]} { TE::UTILS::te_msg TE_UTIL-14 ERROR "Script (TE::UTILS::modify_block_design_commentdesignprops) failed: $result."; return -code error} + if {[catch {set data [modify_block_design_add_lines $data]} result]} { TE::UTILS::te_msg TE_UTIL-15 ERROR "Script (TE::UTILS::modify_block_design_add_lines) failed: $result."; return -code error} + if {[catch {set data [modify_block_design_add_designprops $data]} result]} { TE::UTILS::te_msg TE_UTIL-16 ERROR "Script (TE::UTILS::modify_block_design_add_designprops) failed: $result."; return -code error} + } + # write info header + if {[catch {set data [TE::UTILS::setinfo_to_block_design_tcl $data $mod_file]} result]} { TE::UTILS::te_msg TE_UTIL-17 ERROR "Script (TE::UTILS::setinfo_to_block_design_tcl) failed: $result."; return -code error} + #write all list elements to file + set fp_w [open ${file_name} "w"] + foreach line $data { + puts $fp_w $line + } + close $fp_w + } + #-------------------------------- + #--modify_block_design_commentlines: + proc modify_block_design_commentlines {datalist} { + #data=tcl content + set data $datalist + #modify list elements + set line_index -1 + set mod_count 0 + foreach line $data { + incr line_index + foreach cname $TE::BD_MOD_COMMENT { + set line_check [lindex $cname 1] + #comment lines on tcl file, modified lines are ignored + if {[string match $line_check $line] && ![string match *#TE_MOD#* $line]} { + set data [lreplace $data[set data {}] $line_index $line_index "# #TE_MOD# $line"] + incr mod_count + } + } + } + TE::UTILS::te_msg TE_UTIL-18 INFO "Block Design tcl: $mod_count lines were commented out." + return $data + } + #-------------------------------- + #--modify_block_design_commentdesignprops: + proc modify_block_design_commentdesignprops {datalist} { + #data=tcl content + set data $datalist + #modify list elements + set mod_count 0 + foreach cname $TE::BD_MOD_PCOMMENT { + set prop_start_name "set_property -dict" + #get instant name + set inst_name [lindex $cname 1] + set prop_stop_name "\] \$$inst_name" + #modify list elements + set line_index -1 + set prop_start -1 + set prop_stop -1 + #search for property boundaries + foreach line $data { + incr line_index + if {[string match *$prop_start_name* $line] && ![string match *#TE_MOD#* $line]} { + set prop_start $line_index + } + if {[string match *$prop_stop_name $line] && ![string match *#TE_MOD#* $line]} { + set prop_stop $line_index + break; + } + } + #only if component found + if {$prop_start>=0 && $prop_stop>$prop_start} { + + set removed_items [list] + set item_cnt -1 + #removed items + foreach item $cname { + incr item_cnt + #ignore id and line_check + if {$item_cnt>1} { + set i $prop_stop + while {$i >= $prop_start} { + set i [expr $i-1] + set newline "[lindex $data $i]" + if {[string match *$item* $newline] && ![string match *#TE_MOD#* $newline]} { + lappend removed_items "# #TE_MOD# $newline" + set data [lreplace $data[set data {}] $i $i] + incr mod_count + } + } + } + } + #add removed items as comment after the component list + set inserpos [expr $prop_stop + 2 - [llength $removed_items]] + set data [linsert $data[set data {}] $inserpos "# #TE_MOD# #Empty Line"] + foreach el [lreverse $removed_items] { + set data [linsert $data[set data {}] $inserpos $el] + } + # if all properties are removed, clear empty property container + if {[expr $prop_stop-$prop_start]==[llength $removed_items]} { + set tmp "# #TE_MOD# [lindex $data $prop_start]" + set data [lreplace $data[set data {}] $prop_start $prop_start $tmp] + set tmp "# #TE_MOD# [lindex $data [expr $prop_start+1]]" + set data [lreplace $data[set data {}] [expr $prop_start+1] [expr $prop_start+1] $tmp] + } + } + } + TE::UTILS::te_msg TE_UTIL-19 INFO "Block Design tcl: $mod_count properties were commented out." + return $data + } + #-------------------------------- + #--modify_block_design_add_lines: + proc modify_block_design_add_lines {datalist} { + #data=tcl content + set data $datalist + #modify list elements + set line_index -1 + set mod_count 0 + foreach cname $TE::BD_MOD_ADD { + set line_check [lindex $cname 1] + set line_index -1 + foreach line $data { + incr line_index + #add lines on tcl file, modified lines are ignored + if {[string match $line_check $line] && ![string match *#TE_MOD#* $line]} { + # set data [lreplace $data[set data {}] $line_index $line_index "# #TE_MOD# $line"] + set data [linsert $data[set data {}] [expr $line_index+1] "# #TE_MOD#_Add next line#"] + set data [linsert $data[set data {}] [expr $line_index+2] [lindex $cname 2]] + incr mod_count + break + } + } + } + TE::UTILS::te_msg TE_UTIL-20 INFO "Block Design tcl: $mod_count lines were added." + return $data + } + #-------------------------------- + #--modify_block_design_add_designprops: + proc modify_block_design_add_designprops {datalist} { + #data=tcl content + set data $datalist + #modify list elements + set mod_count 0 + foreach cname $TE::BD_MOD_PADD { + #get instant name + set inst_name [lindex $cname 1] + set prop_stop_name "\] \$$inst_name" + #modify list elements + set line_index -1 + set prop_start -1 + set prop_stop -1 + set all_props_removed -1 + #search for property boundaries + foreach line $data { + incr line_index + if {[string match *$prop_stop_name $line]} { + if {![string match *#TE_MOD#* $line] } { + set prop_stop $line_index + } else { + set all_props_removed $line_index + } + break; + } + } + #if component props found + if {$prop_stop>-1} { + #add removed items as comment after the component list + set inserpos [expr $prop_stop + 1] + set el_index -1 + #add property as comment + foreach el $cname { + incr el_index + #ignore id and line_check + if {$el_index>1} { + set data [linsert $data[set data {}] $inserpos "# #TE_MOD#_add_property# $el"] + } + } + #add property + set inserpos [expr $prop_stop + -1] + set el_index -1 + foreach el $cname { + incr el_index + #ignore id and line_check + if {$el_index>1} { + set data [linsert $data[set data {}] $inserpos "$el \\"] + incr mod_count + } + } + } elseif {$all_props_removed>-1} { + #add removed items as comment after the component list + set inserpos [expr $all_props_removed + 1] + set el_index -1 + #add property as comment + foreach el $cname { + incr el_index + #ignore id and line_check + if {$el_index>1} { + set data [linsert $data[set data {}] $inserpos "# #TE_MOD#_add_property# $el"] + } + } + #add property + set inserpos [expr $all_props_removed + 1] + set el_index -1 + set data [linsert $data[set data {}] $inserpos " set_property -dict \[ list \\"] + incr inserpos + foreach el $cname { + incr el_index + #ignore id and line_check + if {$el_index>1} { + set data [linsert $data[set data {}] $inserpos "$el \\"] + incr inserpos + incr mod_count + } + } + set data [linsert $data[set data {}] $inserpos " \] \$[lindex $cname 1]"] + } + } + TE::UTILS::te_msg TE_UTIL-21 INFO "Block Design tcl: $mod_count properties were added." + return $data + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished modify block design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # generate workspace functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--workspace_info: + proc workspace_info {infofile info} { + set report_file ${infofile} + set fp_w [open ${report_file} "w"] + puts $fp_w "$info" + close $fp_w + } + #-------------------------------- + #--generate_workspace_hsi: + proc generate_workspace_hsi {{fname ""}} { + if {$fname eq ""} { + #use generated vivado data for workspace + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef]} { + file mkdir ${TE::WORKSPACE_HSI_PATH}/ + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef ${TE::WORKSPACE_HSI_PATH}/${TE::VPROJ_NAME}.hdf + # file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit ${TE::WORKSPACE_HSI_PATH} + workspace_info "${TE::WORKSPACE_PATH}/hsi_info.txt" "HSI Data used from ${TE::VPROJ_PATH}" + } else {TE::UTILS::te_msg TE_UTIL-23 WARNING "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef not found, HSI workspace was not generated."} + } else { + #use prebuilt data for workspace + set shortname "[TE::BDEF::find_shortdir $fname]" + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf]} { + file mkdir ${TE::WORKSPACE_HSI_PATH}/ + file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf ${TE::WORKSPACE_HSI_PATH}/${TE::VPROJ_NAME}.hdf + # file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.bit ${TE::WORKSPACE_HSI_PATH} + workspace_info "${TE::WORKSPACE_PATH}/hsi_info.txt" "HSI Data used from ${TE::PREBUILT_HW_PATH}/${shortname}" + } else {TE::UTILS::te_msg TE_UTIL-24 WARNING "${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf not found, HSI workspace was not generated."} + } + } + #-------------------------------- + #--generate_workspace_sdk: + proc generate_workspace_sdk {{fname ""}} { + #todo mal schauen ob vorher gelöcht werden muss oder ob überschreiben reicht + if {$fname eq ""} { + #use generated vivado data for workspace + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef]} { + file mkdir ${TE::WORKSPACE_SDK_PATH}/ + # file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + #use Toplevelname instead fo Project name -> export from Vivado GUI can used to + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef ${TE::WORKSPACE_SDK_PATH}/${TE::PR_TOPLEVELNAME}.hdf + # file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit ${TE::WORKSPACE_SDK_PATH} + workspace_info "${TE::WORKSPACE_PATH}/sdk_info.txt" "SDK Data used from ${TE::VPROJ_PATH}" + } else {TE::UTILS::te_msg TE_UTIL-25 WARNING "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef not found, SDK workspace was not generated."} + } else { + #use prebuilt data for workspace + set shortname "[TE::BDEF::find_shortdir $fname]" + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf]} { + file mkdir ${TE::WORKSPACE_SDK_PATH}/ + # file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + #use Toplevelname instead fo Project name -> export from Vivado GUI can used to + file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf ${TE::WORKSPACE_SDK_PATH}/${TE::VPROJ_NAME}.hdf + # file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf ${TE::WORKSPACE_SDK_PATH}/${TE::PR_TOPLEVELNAME}.hdf + # file copy -force ${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.bit ${TE::WORKSPACE_SDK_PATH} + workspace_info "${TE::WORKSPACE_PATH}/sdk_info.txt" "SDK Data used from ${TE::PREBUILT_HW_PATH}/${shortname}" + } else {TE::UTILS::te_msg TE_UTIL-26 WARNING "${TE::PREBUILT_HW_PATH}/${shortname}/${TE::VPROJ_NAME}.hdf not found, SDK workspace was not generated."} + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished generate workspace functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # copy files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--copy_hw_files: + proc copy_hw_files { {deleteOldFile true}} { + #make new one + file mkdir ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR} + if {${TE::PR_TOPLEVELNAME} eq "NA" } { + TE::UTILS::te_msg TE_UTIL-27 {CRITICAL WARNING} "Script variable TE::PR_TOPLEVELNAME was not set, script properties will be reload." + TE::VIV::restore_scriptprops + } + #copy files only if bitfiles exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit]} { + #delete old prebuilt bitfile + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit} result]} {TE::UTILS::te_msg TE_UTIL-28 {CRITICAL WARNING} " $result"} + } + #copy and rename bitfile + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit + TE::UTILS::te_msg TE_UTIL-29 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.bit was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit" + #-------------------------------- + #delete old prebuilt lpr + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.lpr] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.lpr} result]} {TE::UTILS::te_msg TE_UTIL-30 {CRITICAL WARNING} " $result"} + } + #copy and rename lpr + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.hw/${TE::VPROJ_NAME}.lpr ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.lpr + TE::UTILS::te_msg TE_UTIL-31 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.lpr was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.hw/${TE::VPROJ_NAME}.lpr" + #-------------------------------- + #delete old prebuilt ltx_file + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.ltx] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.ltx} result]} {TE::UTILS::te_msg TE_UTIL-32 {CRITICAL WARNING} " $result"} + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/debug_nets.ltx]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/debug_nets.ltx ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.ltx + TE::UTILS::te_msg TE_UTIL-33 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.ltx was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/debug_nets.ltx" + } else {TE::UTILS::te_msg TE_UTIL-34 INFO "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/debug_nets.ltx was not found."} + #delete old prebuilt hdf_file (hdf only on processor systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf} result]} {TE::UTILS::te_msg TE_UTIL-35 {CRITICAL WARNING} " $result"} + } + if {!$TE::IS_FSYS} { + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef]} { + #optional only on processor system: check bd file name --> for fsys no *hwdef and *sydef files needed + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf + TE::UTILS::te_msg TE_UTIL-35 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.hdf was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef" + } else {TE::UTILS::te_msg TE_UTIL-36 {CRITICAL WARNING} "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef was not found."} + } + #delete old prebuilt mmi (not for zynq systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mmi] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mmi} result]} {TE::UTILS::te_msg TE_UTIL-38 {CRITICAL WARNING} " $result"} + } + #delete old prebuilt mcs_file (not for zynq systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mcs] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mcs} result]} {TE::UTILS::te_msg TE_UTIL-39 {CRITICAL WARNING} " $result"} + } + #delete old prebuilt prm_file (not for zynq systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.prm] && $deleteOldFile } { + if {[catch {file delete -force ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.prm} result]} {TE::UTILS::te_msg TE_UTIL-40 {CRITICAL WARNING} " $result"} + } + #copy mmi + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mmi]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mmi ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mmi + TE::UTILS::te_msg TE_UTIL-41 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mmi was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mmi" + } else {TE::UTILS::te_msg TE_UTIL-42 WARNING "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mmi was not found."} + #copy mcs + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs]} { + #optional only on systems without processor used see TE::VIV::write_cfgmem for selection + #compare timestamps, if mcs is older than bitfile, rerun write mcs_file --> if gui is used to generate bitfile mcs will not recreate + set bittime [file mtime ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit] + set mcstime [file mtime ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs] + if {$mcstime < $bittime} { + TE::UTILS::te_msg TE_UTIL-43 INFO "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs is older as ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit . Regenerate mcs." + + if {[catch {TE::VIV::write_viv_cfgmem} result]} { TE::UTILS::te_msg TE_UTIL-44 ERROR "Script (TE::VIV::write_viv_cfgmem) failed: $result."; return -code error} + } + file mkdir ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.prm ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.prm + TE::UTILS::te_msg TE_UTIL-45 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.prm was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.prm" + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${TE::VPROJ_NAME}.mcs + TE::UTILS::te_msg TE_UTIL-46 INFO "${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports/${TE::VPROJ_NAME}.mcs was replaced with ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs" + } else {TE::UTILS::te_msg TE_UTIL-47 WARNING "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs was not found."} + + } else {TE::UTILS::te_msg TE_UTIL-48 {CRITICAL WARNING} "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit was not found. Nothing was copied to prebuilt folder."} + } + #-------------------------------- + #--copy_sw_files: + proc copy_sw_files {} { + set dirs [glob -directory $TE::WORKSPACE_HSI_PATH *] + if { [llength $dirs] >0} { + #make new one + file mkdir ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR} + #copy files + foreach dir $dirs { + if {[file exists $dir/executable.elf]} { + #apps+fsbl + set fname [file tail $dir] + #delete old prebuilt elf file + if {[file exists ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/${fname}.elf]} { + if {[catch {file delete -force ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/${fname}.elf} result]} {TE::UTILS::te_msg TE_UTIL-49 {CRITICAL WARNING} " $result"} + } + #copy file + file copy -force $dir/executable.elf ${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/${fname}.elf + TE::UTILS::te_msg TE_UTIL-50 INFO "${TE::PREBUILT_SW_PATH}/${TE::SHORTDIR}/${fname}.elf was replaced with $dir/executable.elf" + } elseif {[file exists $dir/skeleton.dtsi]} { + #device tree + set fname [file tail $dir] + set devtree_folder ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/${fname} + file mkdir ${devtree_folder} + if {[file exists ${devtree_folder}/skeleton.dtsi]} { + if {[catch {file delete -force ${devtree_folder}/skeleton.dtsi} result]} {TE::UTILS::te_msg TE_UTIL-51 {CRITICAL WARNING} " $result"} + } + if {[file exists ${devtree_folder}/system.dts]} { + if {[catch {file delete -force ${devtree_folder}/system.dts} result]} {TE::UTILS::te_msg TE_UTIL-52 {CRITICAL WARNING} " $result"} + } + if {[file exists ${devtree_folder}/zynq-7000.dtsi]} { + if {[catch {file delete -force ${devtree_folder}/zynq-7000.dtsi} result]} {TE::UTILS::te_msg TE_UTIL-53 {CRITICAL WARNING} " $result"} + } + file copy -force $dir/skeleton.dtsi ${devtree_folder}/skeleton.dtsi + file copy -force $dir/system.dts ${devtree_folder}/system.dts + file copy -force $dir/zynq-7000.dtsi ${devtree_folder}/zynq-7000.dtsi + TE::UTILS::te_msg TE_UTIL-54 INFO "Following device tree files are replaced \n \ + ${devtree_folder}/skeleton.dtsi was replaced with $dir/skeleton.dtsi \n \ + ${devtree_folder}/system.dts was replaced with $dir/system.dts \n \ + ${devtree_folder}/zynq-7000.dtsi was replaced with $dir/zynq-7000.dtsi \n \ + ------" + } + } + } else { + TE::UTILS::te_msg TE_UTIL-55 {CRITICAL WARNING} "$TE::WORKSPACE_HSI_PATH was empty. Nothing was copied to prebuilt folder." + } + } + #-------------------------------- + #--copy_hw_reports: + proc copy_hw_reports {} { + TE::UTILS::te_msg TE_UTIL-56 STATUS "Create reports in ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports" + file mkdir ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + #copy only if new bitfile exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit]} { + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc]} { + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc ${TE::PREBUILT_HW_PATH}/${TE::SHORTDIR}/reports + } + } + #create allways summary + create_prebuilt_hw_summary + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished copy files functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--create_prebuilt_hw_summary: + proc create_prebuilt_hw_summary {} { + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}_summary.csv + set prebuilt_file ${TE::PREBUILT_HW_PATH}/hardware_summary.csv + #todo hardware_summary.csv erase of to large + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + if { ![file exists ${prebuilt_file}]} { + set fp_w [open ${prebuilt_file} "w"] + puts $fp_w [lindex $data 0] + puts $fp_w [lindex $data 1] + close $fp_w + } else { + set fp_a [open ${prebuilt_file} "a"] + puts $fp_a [lindex $data 1] + close $fp_a + } + TE::UTILS::te_msg TE_UTIL-57 INFO "Add HW report to: ${TE::PREBUILT_HW_PATH}/hardware_summary.csv" + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # clear functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--clean_vivado_project: + proc clean_vivado_project {} { + if { [file exists $TE::VPROJ_PATH] } { + if {[catch {file delete -force $TE::VPROJ_PATH} result]} {TE::UTILS::te_msg TE_UTIL-59 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-56 INFO "$TE::VPROJ_PATH was deleted."} + } + } + #-------------------------------- + #--clean_labtools_project: + proc clean_labtools_project {} { + if { [file exists $TE::VLABPROJ_PATH] } { + if {[catch {file delete -force $TE::VLABPROJ_PATH} result]} {TE::UTILS::te_msg TE_UTIL-60 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-61 INFO "$TE::VLABPROJ_PATH was deleted."} + } + } + #-------------------------------- + #--clean_workspace_hsi: + proc clean_workspace_hsi {} { + if { [file exists ${TE::WORKSPACE_HSI_PATH}] } { + if {[catch {file delete -force $TE::WORKSPACE_HSI_PATH} result]} {TE::UTILS::te_msg TE_UTIL-62 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-63 INFO "$TE::WORKSPACE_HSI_PATH was deleted."} + } + } + #-------------------------------- + #--clean_workspace_sdk: + proc clean_workspace_sdk {} { + if { [file exists ${TE::WORKSPACE_SDK_PATH}] } { + if {[catch {file delete -force $TE::WORKSPACE_SDK_PATH} result]} {TE::UTILS::te_msg TE_UTIL-64 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-65 INFO "$TE::WORKSPACE_SDK_PATH was deleted."} + } + } + #-------------------------------- + #--clean_workspace_all: + proc clean_workspace_all {} { + if { [file exists ${TE::WORKSPACE_PATH}] } { + if {[catch {file delete -force $TE::WORKSPACE_PATH} result]} {TE::UTILS::te_msg TE_UTIL-66 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-67 INFO "$TE::WORKSPACE_PATH was deleted."} + } + } + #-------------------------------- + #--clean_sdsoc: + proc clean_sdsoc {} { + if { [file exists ${TE::SDSOC_PATH}] } { + if {[catch {file delete -force $TE::SDSOC_PATH} result]} {TE::UTILS::te_msg TE_UTIL-68 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-69 INFO "$TE::SDSOC_PATH was deleted."} + } + } + #-------------------------------- + #--clean_all_generated_files: + proc clean_all_generated_files {} { + clean_vivado_project + clean_labtools_project + clean_workspace_hsi + clean_workspace_sdk + clean_workspace_all + clean_sdsoc + TE::UTILS::te_msg TE_UTIL-71 INFO "Clean all generated files finished." + } + #-------------------------------- + #--clean_prebuilt_all: + proc clean_prebuilt_all {} { + if { [file exists ${TE::PREBUILT_PATH}] } { + if {[catch {file delete -force $TE::PREBUILT_PATH} result]} {TE::UTILS::te_msg TE_UTIL-70 {CRITICAL WARNING} " $result"} else {TE::UTILS::te_msg TE_UTIL-71 INFO "$TE::PREBUILT_PATH was deleted."} + } + } + #todo clean prebuilt single part -> bi hw ,sw, os + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + puts "INFO:(TE) Load Utilities script finished" +} + + diff --git a/zynqberrydemo3/scripts/script_usrcommands.tcl b/zynqberrydemo3/scripts/script_usrcommands.tcl new file mode 100644 index 0000000..a6b12a9 --- /dev/null +++ b/zynqberrydemo3/scripts/script_usrcommands.tcl @@ -0,0 +1,991 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/16 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/02/06 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +# source in namespace of TE +namespace eval TE { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # help functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--help: + proc help {{args ""}} { + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-help" { set run_help true; incr option } + + default {TE::UTILS::te_msg TE_UTIL-79 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Help: \n\ + Description:\n\ + \ Display currently available user functions\n\ + Syntax:\n\ + \ help \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE\n\ + " + TE::UTILS::te_msg TE_INIT-93 STATUS $te_txt + } else { + TE::INIT::print_version + set te_txt "TE Script Help:\n\ + Available TE-Functions:" + if {![catch {set projectname [get_projects]} result]} { + set te_txt "$te_txt\n\ + \ ---------------------------------\n\ + \ Beta Test (advanced usage only!):\n\ + \ TE::ADV::beta_util_sdsoc_project \[-check_only\] \[-start_sdsoc\] \[-help\]\n\ + \ TE::ADV::beta_hw_remove_board_part \[-permanent\] \[-help\]\n\ + \ TE::ADV::beta_hw_export_rtl_ip \[-help\]" + } + set te_txt "$te_txt\n\ + \ ----------\n\ + \ Utilities:\n\ + \ TE::util_zip_project \[-save_all\] \[-remove_prebuilt\] \[-manual_filename \] \[-help\]\n\ + \ ------------\n\ + \ Programming:\n\ + \ TE::pr_init_hardware_manager \[-help\]\n\ + \ TE::pr_program_jtag_bitfile \[-used_board \] \[-swapp \] \[-available_apps\] \[-used_basefolder_bitfile\] \[-help\]\n\ + \ TE::pr_program_flash_binfile \[-no_reboot\] \[-used_board \] \[-swapp \] \[-available_apps\] \[-force_hw_manager\] \[-used_basefolder_binfile\] \[-help\]\n\ + \ TE::pr_program_flash_mcsfile \[-no_reboot\] \[-used_board \] \[-swapp \] \[-available_apps\] \[-used_basefolder_mcsfile\] \[-help\]" + if {![catch {set projectname [get_projects]} result]} { + # # on vivado project + set te_txt "$te_txt\n\ + \ ----------\n\ + \ Software Design:\n\ + \ TE::sw_run_hsi \[-run_only\] \[-prebuilt_hdf \] \[-no_hsi\] \[-no_bif\] \[-no_bin\] \[-no_bitmcs\] \[-force_bin\] \[-clear\] \[-help\]\n\ + \ TE::sw_run_sdk \[-open_only\] \[-update_hdf_only\] \[-prebuilt_hdf \] \[-clear\] \[-help\]\n\ + \ ----------\n\ + \ Hardware Design:\n\ + \ TE::hw_blockdesign_create_bd \[-bd_name\] \[-msys_local_mem\] \[-msys_ecc\] \[-msys_cache\] \[-msys_debug_module\] \[-msys_axi_periph\] \[-msys_axi_intc\] \[-msys_clk\] \[-help\]\n\ + \ TE::hw_blockdesign_export_tcl \[-no_mig_contents\] \[-no_validate\] \[-mod_tcl\] \[-svntxt \] \[-board_part_only\] \[-help\]\n\ + \ TE::hw_build_design \[-disable_bitgen\] \[-disable_hdf\] \[-disable_mcsgen\] \[-disable_reports\] \[-export_prebuilt\] \[-export_prebuilt_only\] \[-help\]" + } + set te_txt "$te_txt\n\ + ------------------------------------------\n\ + Note:Run only predefined TE-functions from this list. Run other TE-functions directly may cause errors.\n\ + Note:For more Informations see Trenz Electronic Wiki: https://wiki.trenz-electronic.de/display/PD/Project+Delivery \n\ + ------------------------------------------\n\ + " + TE::UTILS::te_msg TE_INIT-94 STATUS $te_txt + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished help functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # hardware generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--hw_blockdesign_create_new_bd: + proc hw_blockdesign_create_bd {{args ""}} { + set bd_name "fsys" + set msys_local_mem "8KB" + set msys_ecc "None" + set msys_cache "None" + set msys_debug_module "Debug Only" + set msys_axi_periph "Enabled" + set msys_axi_intc "0" + set msys_clk "None" + + + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-bd_name" {incr option; set bd_name [lindex $args $option]} + "-help" {set run_help true} + default {TE::UTILS::te_msg TE_UTIL-80 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Create Block Design: \n\ + Description:\n\ + \ Create new Block Design with specified name. \n\ + \ Special Block Design names: \n\ + \ fsys -> used for FPGA-Fabric Design only. Generate empty Block Design. \n\ + \ msys -> used for Microblaze Design only. Generate Microblaze with defined parameters. \n\ + \ zsys -> used for 7Series Zynq Design only. Generate 7 Series Zynq with Board Part configuration and Carrier Board extended settings (if available). \n\ + \ zusys -> used for UltraScale Plus Zynq Design only. Generate UltraScale Plus Zynq with Board Part configuration and Carrier Board extended settings (if available). \n\ + Syntax:\n\ + \ TE::hw_blockdesign_create_bd \[-bd_name\] \[-msys_local_mem\] \[-msys_ecc\] \[-msys_cache\] \[-msys_debug_module\] \[-msys_axi_periph\] \[-msys_axi_intc\] \[-msys_clk\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-help\] Print help.\n\ + \ \[-bd_name\] Use one of the predefined names (def:fsys): fsys, msys, zsys, zusys \n\ + \ \[-msys_local_mem\] Use one of the predefined values(def:8KB): None, 4KB, 8KB, 16KB, 32KB, 64KB, 128KB \n\ + \ \[-msys_ecc\] Use one of the predefined values(def:None): None, Basic, Full \n\ + \ \[-msys_cache\] Use one of the predefined values(def:None): None, 4KB, 8KB, 16KB, 32KB, 64KB \n\ + \ \[-msys_debug_module\] Use one of the predefined values(def:Debug Only): None, Debug Only, \"Debug \& UART\", \"Extended Debug\" \n\ + \ \[-msys_axi_periph\] Use one of the predefined values(def:Enabled): Disabled, Enabled \n\ + \ \[-msys_axi_intc\] Use one of the predefined values(def:0): 0, 1 \n\ + \ \[-msys_clk\] Use one of the predefined values(def:None): None, \"New Clocking Wizard (100 MHz)\", \"New External Port (100 MHz)\" \n\ + Categories:\n\ + \ TE::VIV\n\ + " + TE::UTILS::te_msg TE_BD-19 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_BD-20 STATUS "Start Create Block Design." + # m_settings only used for msys + set m_settings {local_mem $msys_local_mem ecc $msys_ecc cache $msys_cache debug_module $msys_debug_module axi_periph $msys_axi_periph axi_intc $msys_axi_intc clk $msys_clk} + if {[catch {TE::VIV::create_new_blockdesign $bd_name $m_settings } result]} {TE::UTILS::te_msg TE_BD-21 ERROR "Script (TE::VIV::create_new_blockdesign) failed: $result."; return -code error} + TE::UTILS::te_msg TE_BD-22 STATUS "Create Block Design finished." + } + } + #-------------------------------- + #--hw_blockdesign_export_tcl: + proc hw_blockdesign_export_tcl {{args ""}} { + set no_mig "" + set no_validate "" + set boardpart_only "" + set mod_tcl "" + set svn_check false + set svn_msg "" + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-no_mig_contents" {set no_mig [lindex $args $option]} + "-mod_tcl" {set mod_tcl [lindex $args $option]} + "-no_validate" {set no_validate [lindex $args $option]} + "-svntxt" {incr option; set svn_check true; set svn_msg [lindex $args $option]} + "-board_part_only" {set boardpart_only [lindex $args $option]} + "-help" {set run_help true} + default {TE::UTILS::te_msg TE_UTIL-81 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Export Block Design: \n\ + Description:\n\ + \ Export Block Design as TCL-file. \n\ + \ File destination is $TE::BD_PATH or ${TE::BD_PATH}/${TE::SHORTDIR}/, if sub-folder exists. \n\ + \ If ${TE::BD_PATH}/${TE::SHORTDIR}/ exists, Block Designs from $TE::BD_PATH are ignored on project creation. \n\ + \ Attention: Open block-design will be saved automatically before export is run.\n\ + Syntax:\n\ + \ TE::hw_blockdesign_export_tcl \[-no_mig_contents\] \[-no_validate\] \[-mod_tcl\] \[-svntxt \] \[-board_part_only\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-no_mig_contents\] Vivado specific option when MIG is used: MIG-Configuration is excluded from TCL-File. Reference to mig.prj is used instead. Wrong usage will damaged design functionality!\n\ + \ \[-no_validate\] Design is saved without validation.\n\ + \ \[-board_part_only\] Export for this bord part only (tcl is stored in ${TE::BD_PATH}/${TE::SHORTDIR}/). \n\ + \ \[-mod_tcl\] TCL Content would be modified with content from $TE::BD_PATH\\mod_bd.tcl. If mod_bd.tcl don't exist or all commands inside are commented, nothing is changed. Wrong usage will damaged design functionality! \n\ + \ \[-svntxt \] Send svn commit with Text if SVN-versioning is used for the files in $TE::BD_PATH.\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VIV, TE::UTILS, TE::EXT\n\ + " + TE::UTILS::te_msg TE_BD-23 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_BD-24 STATUS "Start Export Block Design." + if {[catch {TE::VIV::export_blockdesign $no_mig $no_validate $boardpart_only $mod_tcl} result]} {TE::UTILS::te_msg TE_BD-24 ERROR "Script (TE::VIV::export_blockdesign) failed: $result."; return -code error} + if {$svn_check} { + if {[catch {TE::EXT::svn_checkin ${TE::BD_PATH} $svn_msg} result]} {TE::UTILS::te_msg TE_BD-25 ERROR "Script (TE::EXT::svn_checkin) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_BD-26 STATUS "Export Block Design finished." + } + } + #-------------------------------- + #--hw_build_design: + proc hw_build_design {{args ""}} { + set run_build true + set bitgen true + set mcsgen true + set reportgen true + set hdfgen true + set export_prebuild false + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-disable_bitgen" { set bitgen false} + "-disable_hdf" { set hdfgen false} + "-disable_mcsgen" { set mcsgen false} + "-disable_reports" { set reportgen false} + "-export_prebuilt_only" { set export_prebuild true; set run_build false} + "-export_prebuilt" { set export_prebuild true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-82 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Build Design: \n\ + Description:\n\ + \ Run Synthesises and Implementation with Bitstream generation. \n\ + \ Generate BIT-File on all BD-Names and MCS-File only on none Zynq/UltraScale Systems. \n\ + Syntax:\n\ + \ TE::hw_build_design \[-disable_bitgen\] \[-disable_hdf\] \[-disable_mcsgen\] \[-disable_reports\] \[-export_prebuilt\] \[-export_prebuilt_only\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-disable_bitgen\] Bit-File generation is disabled. \n\ + \ \[-disable_hdf\] HDF-File generation is disabled(delete *.sysdef). \n\ + \ \[-disable_mcsgen\] MCS-File generation for none Zynq/UltraScale Systems is disabled. \n\ + \ \[-disable_reports\] Report-Files generation for prebuilt folder is disabled. \n\ + \ \[-export_prebuilt\] Export generated HW-Files to the prebuilt folder (copy is done automatically, when hsi, sdk or jtag programming scripts starts in VIVADO). \n\ + \ \[-export_prebuilt_only\] Export generated HW-Files to the prebuilt folder without rebuild the design. \n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VIV,TE::UTILS\n\ + " + TE::UTILS::te_msg TE_HW-59 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_HW-60 STATUS "Start Build Design." + if {$run_build} { + if {[catch {TE::VIV::build_design $bitgen $mcsgen $reportgen $hdfgen} result]} {TE::UTILS::te_msg TE_HW-61 ERROR "Script (TE::VIV::build_design) failed: $result."; return -code error} + } + # copy is done if hsi, sdk or jtag programming is started or + if {$export_prebuild} { + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_HW-62 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_HW-63 INFO "No Hardware Reports found."} + } + TE::UTILS::te_msg TE_HW-64 STATUS "Build Design finished." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished hardware generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # software generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--sw_run_hsi: + proc sw_run_hsi {{args ""}} { + set run_help false + set run_copy true + set run_clear false + set run_prebuilt false + set run_prebuilt_hdf_only false + set run_hsi true + set run_bif true + set run_bin true + set force_bin false + set run_bitmcs true + set prebuilt_name "" + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-run_only" { set run_copy false} + "-prebuilt_hdf" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-prebuilt_hdf_only" { incr option; set run_prebuilt_hdf_only true; set prebuilt_name [lindex $args $option]} + "-no_hsi" { set run_hsi false} + "-no_bif" { set run_bif false} + "-no_bin" { set run_bin false} + "-no_bitmcs" { set run_bitmcs false} + "-force_bin" { set force_bin true} + "-clear" { set run_clear true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-83 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Run HSI: \n\ + Description:\n\ + \ Start HSI and create all software apps (*elf) and corresponding boot.bif and boot.bin (for Zynq/UZynq only) or .bit and .mcs (for MicroBlaze only), which are specified in apps_list.csv\n\ + \ Copy HW File and reports from the vivado project to the prebuilt folder if -prebuild_hdf isn't set (default)\n\ + \ *.hdef and *.sysdef are ignored if BD-Name is fsys (Without processor system). \n\ + \ Attention: Need SDK installation! \n\ + Syntax:\n\ + \ TE::sw_run_hsi \[-run_only\] \[-prebuilt_hdf \] \[-no_hsi\] \[-no_bif\] \[-no_bin\] \[-no_bitmcs\] \[-clear\] \[-help\]\n\ + Returns:\n\ + No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-prebuilt_hdf \] used *.bit and *.hdf from prebuilt folder instead of vivado project. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used. \n\ + \ \[-run_only\] used old data in workspace (*.bit and *.hdf)\n\ + \ \[-no_hsi\] disable *.elf generation\n\ + \ \[-no_bif\] disable boot.bif generation (for Zynq System only)\n\ + \ \[-no_bin\] disable boot.bin generation (for Zynq System only)\n\ + \ \[-force_bin\] disabllefor Zynq check for bif and bin generation\n\ + \ \[-no_bitmcs\] disable {appname}.bit and .mcs (for MicroBlaze System only) generation\n\ + \ \[-clear\] delete old data before workspace is created\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::UTILS, TE::EXT\n\ + " + TE::UTILS::te_msg TE_SW-39 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_SW-40 STATUS "Start HSI." + if {$run_clear} { + if {[catch {TE::UTILS::clean_workspace_hsi} result]} {TE::UTILS::te_msg TE_SW-41 ERROR "Script (TE::UTILS::clean_workspace_hsi) failed: $result."; return -code error} + } + + if {$run_hsi} { + if {$run_copy} { + if {$run_prebuilt} { + if {[catch {TE::UTILS::generate_workspace_hsi $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-42 ERROR "Script (TE::UTILS::generate_workspace_hsi) failed: $result."; return -code error} + } elseif {$run_prebuilt_hdf_only} { + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_SW-43 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_SW-44 INFO "No Hardware Reports found. "} + if {[catch {TE::UTILS::generate_workspace_hsi $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-45 ERROR "Script (TE::UTILS::generate_workspace_hsi) failed: $result."; return -code error} + } else { + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_SW-46 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_SW-47 INFO "No Hardware Reports found. "} + if {[catch {TE::UTILS::generate_workspace_hsi} result]} {TE::UTILS::te_msg TE_SW-48 ERROR "Script (TE::UTILS::generate_workspace_hsi) failed: $result."; return -code error} + } + } + if {[catch {TE::EXT::run_hsi} result]} {TE::UTILS::te_msg TE_SW-49 ERROR "Script (TE::EXT::run_hsi) failed: $result."; return -code error} + } + if {$TE::IS_ZSYS || $TE::IS_ZUSYS || $force_bin} { + #.bif and .bin only on zynq systems + if {$run_bif} { + if {[catch {TE::EXT::generate_bif_files $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-50 ERROR "Script (TE::EXT::generate_bif_files) failed: $result."; return -code error} + } + if {$run_bin} { + if {[catch {TE::EXT::generate_bootbin $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-51 ERROR "Script (TE::EXT::generate_bootbin) failed: $result."; return -code error} + } + } elseif {$TE::IS_MSYS} { + if {$run_bitmcs} { + if {[catch {TE::EXT::generate_app_bit_mcs $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-52 ERROR "Script (TE::EXT::generate_app_bit_mcs) failed: $result."; return -code error} + } + } else { + set te_txt "Boot.bif and Boot.bin only for Zynq-FPGAs available. .bit and .mcs only for MicroBlaze available. System will be checked with block design name, current BD file name is $TE::BD_TCLNAME .Use:\n\ + \ \"zsys_bd.tcl\" for Systems with Zynq \n\ + \ \"zusys_bd.tcl\" for Systems with UltraScale Zynq\n\ + \ \"msys_bd.tcl\" for Systems with MicroBlaze\n\ + \ \"fsys_bd.tcl\" for Systems with FPGA-Fabric design only\n\ + " + TE::UTILS::te_msg TE_SW-53 INFO $te_txt + } + TE::UTILS::te_msg TE_SW-54 STATUS "HSI finished." + } + } + #-------------------------------- + #--sw_run_sdk: + proc sw_run_sdk {{args ""}} { + set run_help false + set run_copy true + set start_sdk true + set run_clear false + set run_prebuilt false + set prebuilt_name "" + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-open_only" { set run_copy false} + "-update_hdf_only" { set start_sdk false} + "-prebuilt_hdf" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-clear" { set run_clear true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-84 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Run SDK: \n\ + Description:\n\ + \ Start SDK project in external folder $TE::WORKSPACE_SDK_PATH\n\ + \ Copy HW File and reports from the vivado project to the prebuilt folder if -prebuild_hdf isn't set (default)\n\ + \ *.hdef and *.sysdef are ignored if BD-Name is fsys (Without processor system). \n\ + \ Attention: If you use VIVADO GUI Command (File->Export-> Export Hardware..(Include Bit-file!) or File->Launch SDK) to Update or open SKD set new export path and workspace: $TE::WORKSPACE_SDK_PATH\n\ + \ Attention: Need SDK installation! \n\ + Syntax:\n\ + \ TE::sw_run_sdk \[-open_only\] \[-update_hdf_only\] \[-prebuilt_hdf \] \[-clear\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-prebuilt_hdf \] used *.hdf from prebuilt folder instead of vivado project. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used. \n\ + \ \[-open_only\] open SDK without update the *.hdf file \n\ + \ \[-update_hdf_only\] copy the new *.hdf file into the SDK workspace without open SDK\n\ + \ \[-clear\] delete old data before workspace is created\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::UTILS, TE::EXT\n\ + " + TE::UTILS::te_msg TE_SW-55 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_SW-56 STATUS "Start SDK" + if {$run_clear} { + if {[catch {TE::UTILS::clean_workspace_sdk} result]} {TE::UTILS::te_msg TE_SW-57 ERROR "Script (TE::UTILS::clean_workspace_sdk) failed: $result."; return -code error} + } + if {$run_copy} { + if {$run_prebuilt} { + if {[catch {TE::UTILS::generate_workspace_sdk $prebuilt_name} result]} {TE::UTILS::te_msg TE_SW-58 ERROR "Script (TE::UTILS::generate_workspace_sdk) failed: $result."; return -code error} + } else { + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_SW-59 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_SW-60 INFO "No Hardware Reports found."} + if {[catch {TE::UTILS::generate_workspace_sdk} result]} {TE::UTILS::te_msg TE_SW-61 ERROR "Script (TE::UTILS::generate_workspace_sdk) failed: $result."; return -code error} + } + } + if {$start_sdk} { + if {[catch {TE::EXT::run_sdk} result]} {TE::UTILS::te_msg TE_SW-62 ERROR "Script (TE::EXT::run_sdk) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_SW-63 STATUS "SDK finished." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished software generation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--pr_program_flash_binfile: + proc pr_program_flash_binfile {{args ""}} { + set return_filename "" + set use_basefolder false + set use_sdk_flash true + set run_help false + set run_prebuilt false + set appname "" + set prebuilt_name "" + set print_available_apps false + set reboot true + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-no_reboot" { set reboot false} + "-used_board" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-swapp" { incr option; set appname [lindex $args $option]} + "-available_apps" { set print_available_apps true} + "-force_hw_manager" { set use_sdk_flash false} + "-used_basefolder_binfile" {set use_basefolder true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-85 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Program Flash with Bin-File: \n\ + Description:\n\ + \ Programming specified FPGA-Flash with bin-file (Zynq-Processors only).\n\ + \ It will be program the boot.bin from the corresponding prebuilt folder, which is set in the vivado project, if -used_board isn't set.\n\ + Syntax:\n\ + \ TE::pr_program_flash_binfile \[-no_reboot\] \[-used_board \] \[-swapp \] \[-available_apps\] \[-used_basefolder_binfile\] \[-help\]\n\ + Returns:\n\ + \ Programming file-name.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-no_reboot\] Memory will be only configured, no JTag reboot is done.\n\ + \ \[-used_board \] Used prebuilt folder board version instead of Vivado project settings. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used.\n\ + \ \[-swapp \] Software APP name which should be programmed.\n\ + \ \[-available_apps\] Return available software APP names from selected the prebuilt boot_images folder.\n\ + \ \[-force_hw_manager\] Force LabTools Hardware-Manager instead of SDK-Programmer. Boot.bin can be configured via SDK-Programmer or LabTools Hardware-Manager. If both available SDK-Programmer is used default. \n\ + \ \[-used_basefolder_binfile\] Use base-folder bin-file ($TE::BASEFOLDER). Should be only one *.bin!\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::EXT, TE::VLAB\n\ + " + TE::UTILS::te_msg TE_PR-43 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_PR-44 STATUS "Start Flash Programming with BIN File" + set starttime [clock seconds] + if {$print_available_apps} { + if {[catch {TE::EXT::get_available_apps $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-45 ERROR "Script (TE::EXT::get_available_apps) failed: $result."; return -code error} + } else { + if {$appname eq ""} {TE::UTILS::te_msg TE_PR-46 ERROR "No APP name is selected see \[pr_program_flash_binfile -help\]: $result."; return -code error} + if {$prebuilt_name ne ""} { + set id "[TE::BDEF::find_id $prebuilt_name]" + set zynqflashtyp_int [TE::BDEF::get_zynqflashtyp $id 0] + } else { + set zynqflashtyp_int $TE::ZYNQFLASHTYP + } + + set check_zynqflash false + if {$zynqflashtyp_int ne "NA"} { + set check_zynqflash true + } + + if {$::env(SDK_AVAILABLE) && $check_zynqflash && $use_sdk_flash} { + if {[catch {set return_filename [TE::EXT::excecute_zynq_flash_programming $use_basefolder $appname $prebuilt_name]} result]} {TE::UTILS::te_msg TE_PR-47 ERROR "Script (TE::EXT::excecute_zynq_flash_programming) failed: $result."; return -code error} + if {$reboot} { + set hw_close true + if {[catch {set hw_close [TE::VLAB::hw_open_jtag]} result]} {TE::UTILS::te_msg TE_PR-48 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + if {[catch {TE::VLAB::hw_fpga_boot_from_memory $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-49 ERROR "Script (TE::VLAB::hw_fpga_boot_from_memory) failed: $result."; return -code error} + if {$hw_close} { + if {[catch {TE::VLAB::hw_close_jtag} result]} {TE::UTILS::te_msg TE_PR-50 ERROR "Script (TE::VLAB::hw_close_jtag) failed: $result."; return -code error} + } + } + } else { + set hw_close true + if {[catch {set hw_close [TE::VLAB::hw_open_jtag]} result]} {TE::UTILS::te_msg TE_PR-51 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + + if {[catch {TE::VLAB::hw_create_flash_device $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-52 ERROR "Script (TE::VLAB::hw_create_flash_device) failed: $result."; return -code error} + if {[catch {set return_filename [TE::VLAB::hw_program_fpga_flash $use_basefolder "" bin $appname $prebuilt_name]} result]} {TE::UTILS::te_msg TE_PR-53 ERROR "Script (TE::VLAB::hw_program_fpga_flash) failed: $result."; return -code error} + + if {$reboot} { + if {[catch {TE::VLAB::hw_fpga_boot_from_memory $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-54 ERROR "Script (TE::VLAB::hw_fpga_boot_from_memory) failed: $result."; return -code error} + } + if {$hw_close} { + if {[catch {TE::VLAB::hw_close_jtag} result]} {TE::UTILS::te_msg TE_PR-55 ERROR "Script (TE::VLAB::hw_close_jtag) failed: $result."; return -code error} + } + } + } + set stoptime [clock seconds] + set timeelapsed [expr $stoptime -$starttime] + TE::UTILS::te_msg TE_PR-56 INFO "Programming elapsed time: $timeelapsed seconds" + TE::UTILS::te_msg TE_PR-57 STATUS "Flash Programming with BIN File finished" + } + return $return_filename + } + #-------------------------------- + #--pr_program_flash_mcsfile: + proc pr_program_flash_mcsfile {{args ""}} { + set return_filename "" + set run_help false + set run_prebuilt false + set appname "" + set prebuilt_name "" + set print_available_apps false + set reboot true + set term "pull-none" + set use_basefolder false + #pull-none (default)#pull-up #pull-down + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-no_reboot" { set reboot false} + "-used_board" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-unused_io_termination" { incr option; set term [lindex $args $option]} + "-swapp" { incr option; set appname [lindex $args $option]} + "-available_apps" { set print_available_apps true} + "-used_basefolder_mcsfile" {set use_basefolder true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-86 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Program Flash with MCS File: \n\ + Description:\n\ + \ Programming specified FPGA-Flash with mcs-File (No Zynq-Processors only).\n\ + \ It will be program the .mcs from the corresponding prebuilt folder which is set in the vivado/labtool project, if -used_board isn't set. \n\ + Syntax:\n\ + \ TE::pr_program_flash_mcsfile \[-no_reboot\] \[-used_board \] \[-unused_io_termination \] \[-swapp \] \[-available_apps\] \[-used_basefolder_mcsfile\] \[-help\]\n\ + Returns:\n\ + \ Programming file-name.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-no_reboot\] Memory will be only configured, no JTag reboot is done.\n\ + \ \[-used_board \] Used prebuilt folder board version instead of vivado project settings. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used.\n\ + \ \[-unused_io_termination \] Set termination for unused Device IO-Pins Available Settings are: pull-none, pull-up or pull-down. Default pull-none is used.\n\ + \ \[-swapp \] Software app name which should be programmed(If app name isn't set, the mcs-file from the prebuilt hardware folder is used). \n\ + \ \[-available_apps\] Return available software app names from selected the prebuilt boot_images folder.\n\ + \ \[-used_basefolder_mcsfile\] Use base-folder mcs-file ($TE::BASEFOLDER). Should be only one *.mcs!\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::EXT, TE::VLAB\n\ + " + TE::UTILS::te_msg TE_PR-58 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_PR-59 STATUS "Start Flash Programming with BIN File" + set starttime [clock seconds] + if {$print_available_apps} { + if {[catch {TE::EXT::get_available_apps $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-60 ERROR "Script (TE::EXT::get_available_apps) failed: $result."; return -code error} + } else { + if {!$run_prebuilt} { + if {![catch {set projectname [get_projects]} result]} { + #copy only on vivado project + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_PR-61 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_PR-62 INFO "No Hardware Reports found."} + } + } + set hw_close true + if {[catch {set hw_close [TE::VLAB::hw_open_jtag]} result]} {TE::UTILS::te_msg TE_PR-63 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + + if {[catch {TE::VLAB::hw_create_flash_device $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-64 ERROR "Script (TE::VLAB::hw_create_flash_device) failed: $result."; return -code error} + if {[catch {set return_filename [TE::VLAB::hw_program_fpga_flash $use_basefolder $term mcs $appname $prebuilt_name]} result]} {TE::UTILS::te_msg TE_PR-65 ERROR "Script (TE::VLAB::hw_program_fpga_flash) failed: $result."; return -code error} + + if {$reboot} { + if {[catch {TE::VLAB::hw_fpga_boot_from_memory $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-66 ERROR "Script (TE::VLAB::hw_fpga_boot_from_memory) failed: $result."; return -code error} + } + if {$hw_close} { + if {[catch {TE::VLAB::hw_close_jtag} result]} {TE::UTILS::te_msg TE_PR-67 ERROR "Script (TE::VLAB::hw_close_jtag) failed: $result."; return -code error} + } + } + set stoptime [clock seconds] + set timeelapsed [expr $stoptime -$starttime] + TE::UTILS::te_msg TE_PR-68 INFO "Programming elapsed time: $timeelapsed seconds" + TE::UTILS::te_msg TE_PR-69 STATUS "Flash Programming with BIN File finished." + } + return $return_filename + } + #-------------------------------- + #--pr_program_jtag_bitfile: + proc pr_program_jtag_bitfile {{args ""}} { + set return_filename "" + set print_available_apps false + set run_help false + set run_prebuilt false + set use_basefolder false + set prebuilt_name "" + set appname "" + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-used_board" { incr option; set run_prebuilt true; set prebuilt_name [lindex $args $option]} + "-swapp" { incr option; set appname [lindex $args $option]} + "-available_apps" { set print_available_apps true} + "-used_basefolder_bitfile" {set use_basefolder true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-87 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Program FPGA with Bit File: \n\ + Description:\n\ + \ Programming FPGA with BIT-File.\n\ + \ Copy HW File and reports from the Vivado project to the prebuilt folder, if -used_board isn't set (default)\n\ + Syntax:\n\ + \ TE::pr_program_jtag_bitfile \[-used_board \] \[-used_basefolder_bitfile\] \[-help\]\n\ + Returns:\n\ + \ Programming file-name.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-used_board \] Used prebuilt folder board version instead of vivado project settings. Available is ID,PRODID,BOARDNAME or SHORTNAME from TExxxx_board_file.csv list. If name not found, \"default\" is used.\n\ + \ \[-swapp \] Software app name which should be programmed. (If app name isn't set, the bit-file from the prebuilt hardware folder is used)\n\ + \ \[-available_apps\] Return available software app names from selected the prebuilt boot_images folder.\n\ + \ \[-used_basefolder_bitfile\] Use base-folder bit-file ($TE::BASEFOLDER). Should be only one *.bit!\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VLAB\n\ + " + TE::UTILS::te_msg TE_PR-70 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_PR-71 STATUS "Start FPGA Programming with Bit File" + set starttime [clock seconds] + if {$print_available_apps} { + if {[catch {TE::EXT::get_available_apps $prebuilt_name} result]} {TE::UTILS::te_msg TE_PR-72 ERROR "Script (TE::EXT::get_available_apps) failed: $result."; return -code error} + } else { + if {!$run_prebuilt} { + if {![catch {set projectname [get_projects]} result]} { + #copy only on vivado project + if {[catch {TE::UTILS::copy_hw_files $TE::GEN_HW_DELETEOLDFILES} result]} {TE::UTILS::te_msg TE_PR-73 ERROR "Script (TE::UTILS::copy_hw_files) failed: $result."; return -code error} + if {[catch {TE::UTILS::copy_hw_reports} result]} {TE::UTILS::te_msg TE_PR-74 INFO "No Hardware Reports found. "} + } + } + set hw_wasclosed false + if {[current_hw_server] eq ""} {set hw_wasclosed true} + if {[catch {TE::VLAB::hw_open_jtag} result]} {TE::UTILS::te_msg TE_PR-75 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + if {[catch {set return_filename [TE::VLAB::hw_program_fpga_device $use_basefolder $appname $prebuilt_name]} result]} {TE::UTILS::te_msg TE_PR-76 ERROR "Script (TE::VLAB::hw_program_fpga_device) failed: $result."; return -code error} + if {$hw_wasclosed} { + if {[catch {TE::VLAB::hw_close_jtag} result]} {TE::UTILS::te_msg TE_PR-77 ERROR "Script (TE::VLAB::hw_close_jtag) failed: $result."; return -code error} + } + } + set stoptime [clock seconds] + set timeelapsed [expr $stoptime -$starttime] + TE::UTILS::te_msg TE_PR-78 INFO "Programming elapsed time: $timeelapsed seconds" + TE::UTILS::te_msg TE_PR-79 STATUS "FPGA Programming with BIT File finished." + } + return $return_filename + } + #-------------------------------- + #--pr_init_hardware_manager: + proc pr_init_hardware_manager {{args ""}} { + set run_help false + set run_prebuilt false + set prebuilt_name "" + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-88 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Initialise Hardware Manager: \n\ + Description:\n\ + \ Open Hardware-Manager, auto-connect target device and initialise flash memory with configuration from *_board_files.csv.\n\ + \ If flash memory isn't specified, it will be ignored. \n\ + Syntax:\n\ + \ TE::pr_init_hardware_manager \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VLAB\n\ + " + TE::UTILS::te_msg TE_PR-80 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_PR-81 STATUS "Start Init Hardware Manager" + if {[catch {TE::VLAB::hw_open_jtag} result]} {TE::UTILS::te_msg TE_PR-82 ERROR "Script (TE::VLAB::hw_open_jtag) failed: $result."; return -code error} + if {${TE::FPGAFLASHTYP} ne "NA"} { + if {[catch {TE::VLAB::hw_create_flash_device} result]} {TE::UTILS::te_msg TE_PR-83 ERROR "Script (TE::VLAB::hw_create_flash_device) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_PR-84 STATUS "Initialise Hardware Manager finished." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # utilities functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--util_zip_project: + proc util_zip_project {{args ""}} { + set run_help false + set manual_name false + set tmp [split $TE::SHORTDIR "_"] + set zipname "" + + #settings + set remove_prebuilt false + set save_all false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-manual_filename" { incr option; set zipname [lindex $args $option];set manual_name true} + "-remove_prebuilt" { set remove_prebuilt true} + "-save_all" { set save_all true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-89 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {!$manual_name} { + #boardname + set zipname [lindex $tmp 0] + #projectname + set zipname "${zipname}-${TE::VPROJ_NAME}" + if {$remove_prebuilt} { + set zipname "${zipname}_noprebuilt" + } + if {$save_all} { + set zipname "${zipname}_all" + } + #vivado version + set zipname "${zipname}-vivado_$::env(VIVADO_VERSION)" + #Scipt version (last id) + set tmp [split $TE::SCRIPTVER "."] + set scriptver [lindex $tmp [expr [llength $tmp]-1]] + set zipname "${zipname}-build_${scriptver}" + #timestamp + set date "[ clock format [clock seconds] -format "%Y%m%d%H%M%S"]" + set zipname "${zipname}_${date}" + } + if {$run_help} { + set te_txt "TE Script Backup Project: \n\ + Description:\n\ + \ Generate Zip file from current project in folder $TE::BACKUP_PATH.\n\ + \ Supported ZIP-Programs:7z.exe (7 zip) and zip.exe (Info ZIP) \n\ + \ Did not save files, which are specified in /settings/zip_ignore_list.csv.\n\ + Syntax:\n\ + \ TE::util_zip_project \[-save_all\] \[-remove_prebuilt\] \[-manual_filename \] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-manual_filename \] Specify name instead auto-generate name.\n\ + \ \[-remove_prebuilt\] Save backup without prebuilt(Command is ignored if -save_all is selected).\n\ + \ \[-save_all\] Save all, otherwise work path like vivado, workspace, vlog and other specified folders/files are excluded.\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::EXT\n\ + " + TE::UTILS::te_msg TE_UTIL-95 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_UTIL-96 STATUS "Start Backup Project:" + if {$save_all} { + if {[catch {TE::EXT::zip_project $zipname} result]} {TE::UTILS::te_msg TE_UTIL-97 ERROR "Script (TE::EXT::zip_project) failed: $result."; return -code error} + } else { + #default list for old projects: + set excludelist "vivado vivado_lab workspace v_log run_prebuilt_all.cmd block_design/mod_bd.csv scripts/.svn sdsoc settings/development_settings.tcl" + #read ignore list from file + if {[llength $TE::ZIP_IGNORE_LIST] > 0} { + set excludelist [] + foreach entry $TE::ZIP_IGNORE_LIST { + if {[lindex $entry 0]==0} { + #only id0 objects + lappend excludelist [lindex $entry 1] + } elseif {[lindex $entry 0]==1} { + #only id1 objects + set find [] + catch {set find [glob -join -dir $TE::BASEFOLDER [lindex $entry 1]]} + foreach el $find { + set sl_start [expr [string length $TE::BASEFOLDER]+1] + set sl_stop [string length $el] + lappend excludelist [string range $el $sl_start $sl_stop] + } + } + } + } + if {$remove_prebuilt} { + lappend excludelist "prebuilt" + } + if {[catch {TE::EXT::zip_project $zipname $excludelist} result]} {TE::UTILS::te_msg UTIL-98 ERROR " Script (TE::EXT::zip_project) failed: $result."; return -code error} + } + TE::UTILS::te_msg UTIL-99 STATUS "Backup Project finished." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished utilities functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # beta test functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + namespace eval ADV { + #-------------------------------- + #--beta_util_sdsoc_project: + proc beta_util_sdsoc_project {{args ""}} { + set run_help false + set start_sdsoc false + set check_sdsoc false + + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-check_only" { set check_sdsoc true} + "-start_sdsoc" { set start_sdsoc true} + "-help" { set run_help true} + default {TE::UTILS::te_msg TE_UTIL-90 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + + if {$run_help} { + set te_txt "TE Script SDSoC Project: \n\ + Description:\n\ + \ Generate SDSoC project structure in $TE::SDSOC_PATH.\n\ + \ 7-ZIP-Program is required (see design_basic_settings.cmd).\n\ + \ Attention: This Project will be modified! To restore, close this Project after SDSOC generation an run create project batch file.\n\ + Syntax:\n\ + \ TE::ADV::beta_util_sdsoc_project \[-check_only\] \[-start_sdsoc\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-check_only\] Check this project for SDSOC support (no modification are done).\n\ + \ \[-start_sdsoc\] Start SDSOC with workspace: $TE::SDSOC_PATH.\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::SDSOC, TE::EXT\n\ + " + TE::UTILS::te_msg TE_HW-65 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_HW-66 STATUS "Start SDSoC Project:" + if {$check_sdsoc} { + if {[catch {TE::SDSOC::check_and_modify_vivado_project true} result]} {TE::UTILS::te_msg TE_HW-67 ERROR "Script (TE::SDSOC::check_and_modify_vivado_project) failed: $result."; return -code error} + } elseif {$start_sdsoc} { + if {[catch {TE::EXT::run_sdsoc} result]} {TE::UTILS::te_msg TE_HW-68 ERROR "Script (TE::EXT::run_sdsoc) failed: $result."; return -code error} + } else { + if {[catch {TE::SDSOC::create_sdsoc_structure} result]} {TE::UTILS::te_msg TE_HW-69 ERROR "Script (TE::SDSOC::create_sdsoc_structure) failed: $result."; return -code error} + if {[catch {TE::SDSOC::check_and_modify_vivado_project false} result]} {TE::UTILS::te_msg TE_HW-70 ERROR "Script (TE::SDSOC::check_and_modify_vivado_project) failed: $result."; return -code error} + #todo rebuild project files + if {[catch {TE::SDSOC::export_vivado_sdsoc_project} result]} {TE::UTILS::te_msg TE_HW-71 ERROR "Script (TE::SDSOC::export_vivado_sdsoc_project) failed: $result."; return -code error} + if {[catch {TE::SDSOC::create_sdsoc_pfm} result]} {TE::UTILS::te_msg TE_HW-72 ERROR "Script (TE::SDSOC::create_sdsoc_pfm) failed: $result."; return -code error} + } + TE::UTILS::te_msg TE_HW-73 STATUS "SDSoC Project finished." + } + } + #-------------------------------- + #--beta_hw_remove_board_part + proc beta_hw_remove_board_part {{args ""}} { + set temp_only true + set run_help false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-permanent" {set temp_only false} + "-help" {set run_help true} + default {TE::UTILS::te_msg TE_UTIL-91 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Remove Board part: \n\ + Description:\n\ + \ Remove board part from project.\n\ + \ Attention:\n\ + \ Function not supported for all Block-Design IPs.\n\ + \ Check design after automatically modifications are done!\n\ + \ To restore project after permanent modification do:\n\ + \ Delete ${TE::BD_PATH}/*.tcl.\n\ + \ Rename ${TE::BD_PATH}/*.tcl_backup into ${TE::BD_PATH}/*.tcl.\n\ + \ Delete ${TE::BOARDDEF_PATH}/*_board_files_mod.csv.\n\ + Syntax:\n\ + \ TE::ADV::beta_hw_remove_board_part \[-permanent\] \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-permanent\] Board Part is removed permanently for this vivado project.TCL-File is generated and alternative board_part.cvs is used on design creation.\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VIV, TE::UTILS\n\ + " + TE::UTILS::te_msg TE_HW-74 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_HW-75 STATUS "Start Remove Board Part:" + if {[catch {TE::VIV::design_exclude_boarddef $temp_only} result]} {TE::UTILS::te_msg TE_HW-76 ERROR "Script (TE::VIV::design_exclude_boarddef) failed: $result."; return -code error} + TE::UTILS::te_msg TE_HW-77 STATUS "Remove Board Part finished." + } + } + #-------------------------------- + #--beta_hw_export_rtl_ip + proc beta_hw_export_rtl_ip {{args ""}} { + set run_help false + set board_part_only false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-help" {set run_help true} + default {TE::UTILS::te_msg TE_UTIL-92 ERROR "Unrecognised option: [lindex $args $option]."; set run_help true;break } + } + } + if {$run_help} { + set te_txt "TE Script Remove Board part: \n\ + Description:\n\ + \ Export RTL-IP Cores (*.xci), which are not included in a Block-Design to ${TE::HDL_PATH}/xci/${TE::SHORTDIR}.\n\ + \ HDL and *.xci files, which include in the folder $TE::HDL_PATH are load automatically on project creation.\n\ + Syntax:\n\ + \ TE::ADV::beta_hw_export_rtl_ip \[-help\]\n\ + Returns:\n\ + \ No return value.\n\ + Usage:\n\ + \ Name Description\n\ + \ -------------------------\n\ + \ \[-help\] Print help.\n\ + Categories:\n\ + \ TE::VIV, TE::UTILS\n\ + " + TE::UTILS::te_msg TE_HW-78 STATUS $te_txt + } else { + TE::UTILS::te_msg TE_HW-79 STATUS "Start Export RTL-IPs:" + if {[catch {TE::VIV::export_xci} result]} {TE::UTILS::te_msg TE_HW-80 ERROR "Script (TE::VIV::export_xci) failed: $result."; return -code error} + TE::UTILS::te_msg TE_HW-81 STATUS "Export RTL-IPs finished." + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished beta test functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + puts "INFO:(TE) Load User Command scripts finished" +} \ No newline at end of file diff --git a/zynqberrydemo3/scripts/script_vivado.tcl b/zynqberrydemo3/scripts/script_vivado.tcl new file mode 100644 index 0000000..78317ca --- /dev/null +++ b/zynqberrydemo3/scripts/script_vivado.tcl @@ -0,0 +1,1556 @@ +# -------------------------------------------------------------------- +# -- ***************************** +# -- * Trenz Electronic GmbH * +# -- * Holzweg 19A * +# -- * 32257 Bünde * +# -- * Germany * +# -- ***************************** +# -------------------------------------------------------------------- +# --$Autor: Hartfiel, John $ +# --$Email: j.hartfiel@trenz-electronic.de $ +# --$Create Date:2016/02/03 $ +# --$Modify Autor: Hartfiel, John $ +# --$Modify Date: 2017/04/13 $ +# -------------------------------------------------------------------- +# -------------------------------------------------------------------- +namespace eval TE { + namespace eval VIV { + + # ------------------------------------------------------- + # ----advanced functions are currently official not supported + # ------------------------------------------------------- + #-------------------------------- + #--export_vivado_setting: + proc export_vivado_setting {} { + # hidden function: official not supported + set old_file_data "" + if {![file exists $TE::SET_PATH]} { + file mkdir ${TE::SET_PATH}/ + } elseif {[file exists ${TE::SET_PATH}/project_settings.tcl]} { + # additional project settings + set fp_r [open ${TE::SET_PATH}/project_settings.tcl "r"] + set old_file_data [read $fp_r] + close $fp_r + } + set fp_w [open ${TE::SET_PATH}/project_settings.tcl "w"] + + puts $fp_w "##############################" + puts $fp_w "# --------------------------------------------------------------------" + puts $fp_w "# -- ***************************** " + puts $fp_w "# -- * Trenz Electronic GmbH * " + puts $fp_w "# -- * Holzweg 19A * " + puts $fp_w "# -- * 32257 Bünde * " + puts $fp_w "# -- * Germany * " + puts $fp_w "# -- ***************************** " + puts $fp_w "# --------------------------------------------------------------------" + puts $fp_w "##############################" + puts $fp_w "##Automatically exported settings:" + puts $fp_w "##Creation time: [ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"]" + puts $fp_w "##Board Part: [get_property board_part [current_project]]" + puts $fp_w "##Part: [get_property part [current_project]]" + puts $fp_w "#Export Settings currently not available." + puts $fp_w "#This file will be read on project generation only." + puts $fp_w "##############################" + puts $fp_w "#Old file settings:" + puts $fp_w $old_file_data + puts $fp_w "##############################" + puts $fp_w "#exported file settings:" + puts $fp_w "puts \"Info:(TE) Automatically exported settings.\"" + puts $fp_w "#set_property \"board_part\" [get_property board_part [current_project]] \[current_project\]" + puts $fp_w "#set_property \"part\" [get_property part [current_project]] \[current_project\]" + close $fp_w + TE::UTILS::te_msg TE_HW-0 STATUS "${TE::SET_PATH}/project_settings.tcl was created." + } + #-------------------------------- + #--import_vivado_setting: + proc import_vivado_setting {} { + # hidden function: official not supported + if {[file exists ${TE::SET_PATH}/project_settings.tcl]} { + # additional project settings + TE::UTILS::te_msg TE_HW-1 INFO "Load additional project properties from ${TE::SET_PATH}/project_settings.tcl" + source ${TE::SET_PATH}/project_settings.tcl + } + } + + #-------------------------------- + #--design_exclude_boarddef: + proc design_exclude_boarddef {temp_only} { + # hidden function: official not supported + #run only if board part is defined + if {[get_property board_part [current_project]] ne ""} { + #get bd files + set bd_files [list] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + } + if {[llength $bd_files]>1} { + TE::UTILS::te_msg TE_HW-1 ERROR "Exclude Board part failed. Only one Block Design supported for this function." + return -code error; + } + #run rtl for xdc export + synth_design -rtl -name rtl_1 + set pjc_xdc_path "${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::CONST_NAME}" + file mkdir $pjc_xdc_path + #export io locs (needed if constrain in board part only) + write_xdc -force -mode port ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc + #remove wrong properties + set fp_r [open ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc "r"] + set file_data [read $fp_r] + close $fp_r + set data [split $file_data "\n"] + set fp_w [open ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc "w"] + puts $fp_w "##############################" + puts $fp_w "# --------------------------------------------------------------------" + puts $fp_w "# -- ***************************** " + puts $fp_w "# -- * Trenz Electronic GmbH * " + puts $fp_w "# -- * Holzweg 19A * " + puts $fp_w "# -- * 32257 Buende * " + puts $fp_w "# -- * Germany * " + puts $fp_w "# -- ***************************** " + puts $fp_w "# --------------------------------------------------------------------" + puts $fp_w "##############################" + puts $fp_w "##Automatically exported port constrains from exclude board part function:" + puts $fp_w "##Creation time: [ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"]" + puts $fp_w "##Board Part: [get_property board_part [current_project]]" + puts $fp_w "##Part: [get_property part [current_project]]" + puts $fp_w "##############################" + foreach line $data { + #ignore some properties + if {![string match "*set_property DIRECTION*" $line] && ![string match "*set_property IBUF_LOW_PWR*" $line] && ![string match "*current_instance -quiet*" $line]} { + puts $fp_w $line + } + } + close $fp_w + + #add constrains file + add_files -fileset ${TE::CONST_NAME} ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc + set_property used_in_synthesis false [get_files ${pjc_xdc_path}/_i_exclude_boardpart_io_loc.xdc] + #modify some ip setting manually + set mig_project "" + # set mig_addr_offset "" + foreach bd $bd_files { + open_bd_design $bd + TE::UTILS::te_msg TE_HW-2 INFO "Exclude Board part: Remove Board Part settings from IPs in $bd" + #------------- + #mig + if {[catch {[get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]}]} { + TE::UTILS::te_msg TE_HW-3 WARNING "Exclude Board part: MIG was found modified. Check Settings after run in $bd" + catch {set_property CONFIG.BOARD_MIG_PARAM Custom [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]} + catch {set mig_project [get_property CONFIG.XML_INPUT_FILE [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]]} + # catch {set mig_addr_offset [get_property range [get_bd_addr_segs -of_objects [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]]]} + } + #------------- + #TE ASIO + if {[catch {[get_bd_cells -hierarchical -filter {VLNV=~"*axis_asio_gpio*"}]}]} { + TE::UTILS::te_msg TE_HW-4 WARNING "Exclude Board part: ASIO IP was found and modified. Check Settings after run in $bd" + catch {set_property CONFIG.USE_BOARD_FLOW false [get_bd_cells -hierarchical -filter {VLNV=~"*axis_asio_gpio*"}]} + catch {set_property CONFIG.P0_BOARD_INTERFACE Custom [get_bd_cells -hierarchical -filter {VLNV=~"*axis_asio_gpio*"}]} + } + } + #disable board definition + set_property "part" "[get_property part [current_project]]" [current_project] + #update ip's + set ip_names [get_ips] + if {[llength $ip_names]>0 } { + ::report_ip_status -name ip_status + foreach ip $ip_names { + TE::UTILS::te_msg TE_HW-5 INFO "Exclude Board part: Upgrade IP: $ip_names" + if {[catch {::upgrade_ip [get_ips $ip]}] } {TE::UTILS::te_msg TE_HW-6 {CRITICAL WARNING} "Exclude Board part: Upgrade IP: $ip_names failed and will be ignored." } + } + ::report_ip_status -name ip_status + } + #restore some ip setting manually + foreach bd $bd_files { + #------------- + #mig + if {[catch {[get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]}]} { + catch {set_property CONFIG.XML_INPUT_FILE $mig_project [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]} + catch {assign_bd_address [get_bd_addr_segs -of_objects [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]]} + # catch {set_property range $mig_addr_offset [get_bd_addr_segs -of_objects [get_bd_cells -hierarchical -filter {VLNV=~"*mig_7series*"}]]} + } + #------------- + #TE ASIO + if {[catch {[get_bd_cells -hierarchical -filter {VLNV=~"*axis_asio_gpio*"}]}]} { + } + #------------- + validate_bd_design + save_bd_design + close_bd_design [current_bd_design] + } + + if {!$temp_only} { + TE::UTILS::te_msg TE_HW-7 WARNING "Exclude Board part: Remove Board part on Backup files permanently." + # ----------------------------------------------------------------- + #copy exported xdc fie + file copy -force ${pjc_xdc_path}/exclude_boardpart_io_loc.xdc ${TE::XDC_PATH}/_i_exclude_boardpart_io_loc.xdc + # ----------------------------------------------------------------- + #backup old block designs tcl files + set bd_folder ${TE::BD_PATH}/ + if {[file exists ${TE::BD_PATH}/${TE::SHORTDIR}/]} { + set bd_folder ${TE::BD_PATH}/${TE::SHORTDIR}/ + } + set bd_names [] + if { ![catch {set bd_names [glob -join -dir ${bd_folder}/ *.tcl]}] } { + foreach bd $bd_names { + if {![file exists ${bd}_backup]} { + TE::UTILS::te_msg TE_HW-8 STATUS "Exclude Board part: Write Backup file: ${bd}_backup" + file copy -force ${bd} ${bd}_backup + } + } + } + # ----------------------------------------------------------------- + #write new bd file + TE::hw_blockdesign_export_tcl + # ----------------------------------------------------------------- + # write new board_files. + set board_files "" + if { [catch {set board_files [ glob $TE::BOARDDEF_PATH/*board_files.csv ] }] } { + TE::UTILS::te_msg TE_HW-9 WARNING "Exclude Board part: Board Part CSV list not found. Create *board_file_mod.csv generation failed." + } else { + set fp [open "${board_files}" r] + set file_data [read $fp] + close $fp + set data [split $file_data "\n"] + set newdata [] + #boardname:3 + foreach line $data { + if {[string match *#* $line] != 1 && [string match *CSV_VERSION* $line] } { + lappend newdata $line + lappend newdata "#Attention:This is a modified Board part CSV files." + } elseif {[string match *#* $line] != 1 && [string length $line] > 7} { + #remove spaces + set line [string map {" " ""} $line] + #remove tabs + set line [string map {"\t" ""} $line] + #split and replaced + set tmp [split $line ","] + set tmp [lreplace $tmp[set tmp {}] 3 3 NA] + set newstring "" + set first 1 + foreach el $tmp { + if {$first} { + set newstring "$el" + set first 0 + } else { + set newstring "$newstring,$el" + } + } + lappend newdata $newstring + } else { + lappend newdata $line + } + } + #write all list elements to file + set new_name [file tail $board_files] + set new_name [file rootname $new_name] + set board_files "$TE::BOARDDEF_PATH/${new_name}_mod.csv" + set fp_w [open ${board_files} "w"] + foreach line $newdata { + puts $fp_w $line + } + close $fp_w + } + #----------------------------------------------------------------- + } + TE::UTILS::te_msg TE_HW-10 INFO "Exclude Board Part is done." + } else { + TE::UTILS::te_msg TE_HW-11 WARNING "Exclude Board Part failed, Board Part is not specified." + } + } + #-------------------------------- + #--design_include_boarddef: + proc design_include_boarddef {} { + TE::UTILS::te_msg TE_HW-12 WARNING "Sorry design_include_boarddef currently not available." + } + + #-------------------------------- + #--import_hdl: + proc import_hdl {} { + # hidden function: official not supported + if {[file exists $TE::HDL_PATH]} { + TE::UTILS::te_msg TE_HW-13 INFO "Import HDL files." + set hdl_names [TE::UTILS::search_hdl_files] + add_files $hdl_names + if {[lsearch $hdl_names *${TE::VPROJ_NAME}_top.vhd*]==0} { + #vhdl + set_property top ${TE::VPROJ_NAME}_top [current_fileset] + #overwrite bd_import toplevel_settings + set TE::PR_TOPLEVELNAME ${TE::VPROJ_NAME}_top + TE::UTILS::te_msg TE_HW-14 INFO "Set TE::PR_TOPLEVELNAME:$TE::PR_TOPLEVELNAME" + } elseif {[lsearch $hdl_names *${TE::VPROJ_NAME}_top.v*]==0} { + #Verilog + set_property top ${TE::VPROJ_NAME}_top [current_fileset] + #overwrite bd_import toplevel_settings + set TE::PR_TOPLEVELNAME ${TE::VPROJ_NAME}_top + TE::UTILS::te_msg TE_HW-15 INFO "Set TE::PR_TOPLEVELNAME:$TE::PR_TOPLEVELNAME" + } + # set attributes + foreach hdl $hdl_names { + set hdl_name [file tail [file rootname $hdl]] + if {[string match "*_simonly_*" $hdl_name] } { + set_property used_in_synthesis false [get_files $hdl] + TE::UTILS::te_msg TE_HW-16 INFO "Set $hdl_name synthesis property to false." + } + if {[string match "*_synonly_*" $hdl_name] } { + set_property used_in_simulation false [get_files $hdl] + TE::UTILS::te_msg TE_HW-17 INFO "Set $hdl_name simulation property to false." + } + } + } + } + + #------------------------------------ + #--import_xci: import xci files + proc import_xci {} { + # hidden function: official not supported + if {[file exists $TE::HDL_PATH/xci]} { + TE::UTILS::te_msg TE_HW-18 INFO "Import XCI files." + set ip_names [TE::UTILS::search_xci_files] + import_ip -files $ip_names + catch {set ip_names [get_ips]} + foreach ip $ip_names { + ##ips without block design ips + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] } { + TE::UTILS::te_msg TE_HW-19 INFO "Run out of context IP for: $ip" + generate_target {instantiation_template} [get_files ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] + update_compile_order -fileset ${TE::SOURCE_NAME} + generate_target all [get_files ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] + if {[get_property generate_synth_checkpoint [get_files ${ip}.xci]] == 1 && [get_property is_enabled [get_files ${ip}.xci]] == 1} { + create_ip_run [get_files -of_objects [get_fileset ${TE::SOURCE_NAME}] ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] + launch_run -jobs $TE::RUNNING_JOBS ${ip}_synth_1 + } + } + } + foreach ip $ip_names { + ##ips without ips from block design + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] } { + if {[get_property generate_synth_checkpoint [get_files ${ip}.xci]] == 1 && [get_property is_enabled [get_files ${ip}.xci]] == 1} { + wait_on_run -timeout ${TE::TIMEOUT} ${ip}_synth_1 + } + } + } + } + } + #------------------------------------ + #--export_xci: export xci files + proc export_xci {} { + # hidden function: official not supported + set ip_names [list] + catch {set ip_names [get_ips]} + if {[llength $ip_names] > 0} { + file mkdir $TE::HDL_PATH/xci/${TE::SHORTDIR} + + set ip_report "" + foreach ip $ip_names { + ##ips without block design ips + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci] } { + set ip_report "$ip_report \n $ip" + file copy -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/ip/${ip}/${ip}.xci $TE::HDL_PATH/xci/${TE::SHORTDIR}/${ip}.xci + } + } + TE::UTILS::te_msg TE_HW-20 INFO "Export: \n \ + $ip_report \n \ + to folder $TE::HDL_PATH/xci/${TE::SHORTDIR}/ \n \ + ------" + } + } + # ------------------------------------------------------- + # finished advanced function + # ------------------------------------------------------- + # ------------------------------------------------------- + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project creation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #------------------------------------ + #--create_project: create vivado project, set board definition and ip path, set default vivado properties + proc create_project {} { + #set board part file definition path + TE::ENV::set_path_boarddef + #create vivado project + ::create_project -force $TE::VPROJ_NAME $TE::VPROJ_PATH + #set local ip path + TE::ENV::set_path_ip + #set vivado properties + set_vprops + + } + #------------------------------------ + #--open_project: open excisting vivado project and restore importent script variables with settings from project + proc open_project {} { + #set board part file definition path + TE::ENV::set_path_boarddef + #open vivado project + ::open_project ${TE::VPROJ_NAME}.xpr + #restore vivado properties to script variables + restore_scriptprops + } + #------------------------------------ + #--close_project: close excisting vivado project + proc close_project {} { + #close vivado project + ::close_project + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished creation functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project property functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #------------------------------------ + #--set_vprops: + proc set_vprops {} { + #set std properties + set_property "default_lib" "xil_defaultlib" [current_project] + set_property "simulator_language" "Mixed" [current_project] + set_property "target_language" "VHDL" [current_project] + if {[info exists TE::PARTNAME]} { + if {![string match $TE::PARTNAME "NA"]} { + set_property "part" $TE::PARTNAME [current_project] + } + } + if {[info exists TE::BOARDPART]} { + if {![string match $TE::BOARDPART "NA"]} { + set_property "board_part" $TE::BOARDPART [current_project] + } + } + #---------------------------------------------------------- + #hidden function write settings + import_vivado_setting + #---------------------------------------------------------- + #overwrite xilinx defaults + set_property name $TE::SIM_NAME [get_filesets sim_1] + set_property name $TE::SYNTH_NAME [get_runs synth_1] + set_property name $TE::IMPL_NAME [get_runs impl_1] + set_property name $TE::CONST_NAME [get_filesets constrs_1] + #---------------------------------------------------------- + } + #------------------------------------ + #--restore_scriptprops: + proc restore_scriptprops {} { + set ID [get_property board_part [current_project]] + if {$ID ne ""} { + TE::INIT::init_board $ID 3 + } else { + TE::INIT::init_part_only [get_property part [current_project]] + } + #check bd file names for some additional functions + if {[catch {TE::INIT::check_bdtyp} result]} {TE::UTILS::te_msg TE_HW-21 Error "Script (TE::INIT::check_bdtyp) failed: $result."; return -code error} + #check board parts + if { ![string equal $TE::PARTNAME [get_property part [current_project]]] } { + TE::UTILS::te_msg TE_HW-22 {CRITICAL WARNING} "Current part name is set to [get_property part [current_project]], expect $TE::PARTNAME for board part definition file $TE::BOARDPART" + } + #check top level name + if { ![string equal $TE::PR_TOPLEVELNAME [get_property top [current_fileset]]] } { + TE::UTILS::te_msg TE_HW-23 WARNING "Current top level name is set to [get_property top [current_fileset]], expect $TE::PR_TOPLEVELNAME from default initialisation. Set TE::PR_TOPLEVELNAME to [get_property top [current_fileset]]." + set TE::PR_TOPLEVELNAME [get_property top [current_fileset]] + } + #---------------------------------------------------------- + #set run paths + set TE::SIM_NAME [get_property name [get_filesets sim*]] + set TE::SYNTH_NAME [get_property name [get_runs syn*]] + set TE::IMPL_NAME [get_property name [get_runs imp*]] + set TE::CONST_NAME [get_property name [get_filesets con*]] + + TE::UTILS::te_msg TE_HW-24 INFO "Restore project parameters:\n \ + TE::SIM_NAME: $TE::SIM_NAME \n \ + TE::SYNTH_NAME: $TE::SYNTH_NAME \n \ + TE::IMPL_NAME: $TE::IMPL_NAME \n \ + TE::CONST_NAME: $TE::CONST_NAME \n \ + ------" + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished project property functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project source functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--import_design: + proc import_design {} { + TE::UTILS::te_msg TE_HW-25 STATUS "Start import design" + #load backup constrains and block design + set xdc_files [TE::UTILS::search_xdc_files] + import_xdc $xdc_files + set_xdcsetting $xdc_files + import_blockdesign + import_hdl + import_xci + import_elf + } + #-------------------------------- + #--import_xdc: + proc import_xdc {xdc_files} { + set target_file "" + foreach xdc $xdc_files { + read_xdc $xdc + if {[file tail $xdc] eq "vivado_target.xdc"} { + set target_file $xdc + } + } + + set_property target_constrs_file $target_file [current_fileset -constrset] + } + #-------------------------------- + #--set_xdcsetting: + proc set_xdcsetting {xdc_files} { + #set xdc properties depending on xdc name: processing order an usage + foreach xdc_file $xdc_files { + if {[string match *_e_* $xdc_file] == 1} { + set_property PROCESSING_ORDER EARLY [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-26 STATUS "Set processing order early for $xdc_file" + } elseif {[string match *_l_* $xdc_file] == 1} { + set_property PROCESSING_ORDER LATE [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-27 STATUS "Set processing order late for $xdc_file" + } else { + set_property PROCESSING_ORDER NORMAL [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-28 STATUS "Set processing order normal for $xdc_file" + } + if {[string match *_s_* $xdc_file] == 1} { + set_property USED_IN_IMPLEMENTATION 0 [get_files $xdc_file] + set_property USED_IN_SYNTHESIS 1 [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-29 STATUS "Set use for synthesis only for $xdc_file" + } elseif {[string match *_i_* $xdc_file] == 1} { + set_property USED_IN_SYNTHESIS 0 [get_files $xdc_file] + set_property USED_IN_IMPLEMENTATION 1 [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-30 STATUS "Set use for implementation only for $xdc_file" + } else { + set_property USED_IN_SYNTHESIS 1 [get_files $xdc_file] + set_property USED_IN_IMPLEMENTATION 1 [get_files $xdc_file] + TE::UTILS::te_msg TE_HW-31 STATUS "Set use for synthesis and implementation for $xdc_file" + } + } + } + #-------------------------------- + #--reload_blockdesign: delete all bd and load bd.tcl files from backup + proc reload_blockdesign {} { + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + } + foreach bd $bd_files { + TE::UTILS::te_msg TE_HW-32 STATUS "Remove:$bd" + remove_files $bd + set bd_dir [file dirname $bd] + file delete -force $bd_dir + } + import_blockdesign + } + #-------------------------------- + #--import_blockdesign: imports and compile bd designs for vivado + proc import_blockdesign {} { + #check bd filenames for some additional functions + if {[catch {TE::INIT::check_bdtyp} result]} {TE::UTILS::te_msg TE_HW-33 ERROR "Script (TE::INIT::check_bdtyp) failed: $result."; return -code error} + + set bd_files [TE::UTILS::search_bd_files] + if {[llength $bd_files]>0 } { + #run bd tcl + foreach bd $bd_files { + # + if {[file extension $bd] eq ".tcl"} { + source $bd + close_bd_design [get_bd_designs] + } + } + #compile bd + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + } + foreach bd $bd_files { + open_bd_design $bd + validate_bd_design -force + generate_target all [get_files $bd] + #check if hdf to exists + set bd_name [get_bd_designs] + set tl_name "NA" + if { [catch {set tl_name [glob -join -dir $TE::HDL_PATH/ ${TE::VPROJ_NAME}_top.*]}] & [catch {set tl_name [glob -join -dir $TE::HDL_PATH/${TE::SHORTDIR}/ ${TE::VPROJ_NAME}_top.*]}] } { + TE::UTILS::te_msg TE_HW-34 INFO "Generate top level wrapper" + make_wrapper -files [get_files $bd] -top + add_files -norecurse ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/$bd_name/hdl/${bd_name}_wrapper.vhd + } else { + TE::UTILS::te_msg TE_HW-35 INFO "Use custom HDL top level file" + } + close_bd_design [get_bd_designs $bd] + #todo: use more bd files -> currently its check on init function only one is allowed + } + update_compile_order -fileset ${TE::SOURCE_NAME} + update_compile_order -fileset ${TE::SIM_NAME} + } + } + #-------------------------------- + #--export_blockdesign: export bd designs to clear vivado folder (if folder ${TE::BD_PATH}/${TE::SHORTDIR} exist it will be export for this boardpart only) + #-- create pdf for each bd and sub hierarchy + proc export_blockdesign {{args ""}} { + #read args + set bd_folder ${TE::BD_PATH} + set no_mig "" + set valid_bd true + set this_boardpart_only false + set mod_tcl false + set args_cnt [llength $args] + for {set option 0} {$option < $args_cnt} {incr option} { + switch [lindex $args $option] { + "-no_mig_contents" {set no_mig [lindex $args $option]} + "-no_validate" {set valid_bd false} + "-mod_tcl" {set mod_tcl true} + "-board_part_only" {set this_boardpart_only true} + "" {} + default { TE::UTILS::te_msg TE_HW-36 {CRITICAL WARNING} "Unrecognised option [lindex $args $option]is ignored" } + } + } + if {$this_boardpart_only} { + file mkdir ${TE::BD_PATH}/${TE::SHORTDIR}/ + } + if {[file exists ${TE::BD_PATH}/${TE::SHORTDIR}/]} { + set bd_folder ${TE::BD_PATH}/${TE::SHORTDIR}/ + } + #search for open projects + set bd_open false + set bd_open_file "" + set bd_open_name "" + + if {[current_bd_design -quiet] ne ""} { + #save currend bd configuration + # validate_bd_design -force + save_bd_design + set bd_open true + set bd_open_name "[current_bd_design]" + TE::UTILS::te_msg TE_BD-2 INFO "$bd_open_name was saved." + set bd_open_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/${bd_open_name}/${bd_open_name}.bd + # close_bd_design [get_bd_designs $bd_open_file] + } + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + TE::UTILS::te_msg TE_BD-3 WARNING "No BD-File was found." + } + if {!$TE::BD_MULTI} { + if {[llength $bd_files]>1 } { + TE::UTILS::te_msg TE_BD-4 WARNING "Currently only one block design supported, deleted unused bd.tcl from ${bd_folder}." + } + } + + foreach bd $bd_files { + open_bd_design $bd + if {$valid_bd} { + TE::UTILS::te_msg TE_BD-5 INFO "Validate Design." + validate_bd_design + } else { + TE::UTILS::te_msg TE_BD-6 WARNING "Validate Design disabled." + } + } + set vivado_bd_design_name [] + if { [catch {set vivado_bd_design_name [get_bd_designs]}] } { + TE::UTILS::te_msg TE_BD-7 {CRITICAL WARNING} "Block designs was not found." + + } else { + + set txt "Stored Block Designs: \n " + foreach bd $vivado_bd_design_name { + # puts "-exclude Layout, IP-Version and MIG-content" + # write_bd_tcl -force -exclude_layout -no_ip_version -no_mig_contents ${bd_folder}/${bd}_bd.tcl + set bf_tcl_name ${bd_folder}/${bd}_bd.tcl + set txt "${txt} File: ${bf_tcl_name} \n" + if {$no_mig eq ""} { + write_bd_tcl -force ${bf_tcl_name} + } else { + set txt "${txt} -Option: Remove MIG-Contents \n" + write_bd_tcl -force $no_mig ${bf_tcl_name} + } + # modify bd + if {[catch {TE::UTILS::modify_block_design_tcl ${bf_tcl_name} ${mod_tcl}} result]} { TE::UTILS::te_msg TE_BD-8 ERROR "Script (TE::UTILS::modify_block_design_tcl) failed: $result."; return -code error} + #export blockdesign as pdf + #sel doc_path + set doc_path ${TE::DOC_PATH}/ + if {[file exists ${TE::BD_PATH}/${TE::SHORTDIR}/]} { + set doc_path ${TE::DOC_PATH}/${TE::SHORTDIR}/ + } + file mkdir ${doc_path}/ + #delete old bd_*.pdf + set old_pdfs [] + if { [catch {set old_pdfs [glob -join -dir ${doc_path}/ bd_*.pdf]}] } { + } else { + TE::UTILS::te_msg TE_BD-9 INFO "Delete old Block Design PDFs in ${doc_path}" + foreach old_pdf $old_pdfs { + if {[catch {file delete -force ${old_pdf}}]} { + TE::UTILS::te_msg TE_BD-10 WARNING "Delete ${old_pdf} failed." + } + } + } + set txt "${txt} -Option: Write PDF-Layouts \n" + set sname bd_${TE::VPROJ_NAME}_hier_top.pdf + if {[catch {write_bd_layout -force -format pdf -scope all -orientation landscape ${doc_path}/${sname}}]} { + TE::UTILS::te_msg TE_BD-11 WARNING "Write ${doc_path}/${sname} failed." + } + set allsubs [get_bd_cells -filter {TYPE == hier}] + foreach sub $allsubs { + set tmp [string map {"/" ""} [join $sub]] + set sname bd_${TE::VPROJ_NAME}_hier_${tmp}.pdf + if {[catch {write_bd_layout -force -format pdf -hierarchy [get_bd_cells $sub] -orientation landscape ${doc_path}/${sname}}]} { + TE::UTILS::te_msg TE_BD-12 WARNING "Write ${doc_path}/${sname} failed." + } + } + # save is needed because print subsystem mod bd file + save_bd_design + # + if { $bd ne $bd_open_name || !$bd_open} { + close_bd_design [get_bd_designs ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/${bd}/${bd}.bd] + } + } + TE::UTILS::te_msg TE_BD-13 INFO "$txt" + } + } + #-------------------------------- + #--import_elf: + proc import_elf {} { + if {[file exists $TE::FIRMWARE_PATH]} { + set elf_names [TE::UTILS::search_elf_files] + # set microblaze elf + foreach elf_f $elf_names { + add_files -norecurse $elf_f + set tmp [split $elf_f "/"] + set tmpLength [llength $tmp] + if {$tmpLength>2} { + set elf_file [lindex $tmp [expr $tmpLength-1]] + set m_name [lindex $tmp [expr $tmpLength-2]] + set f_obj "*${m_name}/${elf_file}" + #todo multi bd design + set bd_files [list] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + } + foreach bd $bd_files { + set bd_name [file tail [file rootname $bd]] + set_property SCOPED_TO_REF $bd_name [get_files -all -of_objects [get_fileset sources_1] ${f_obj}] + #mcs only used if name contains SYSCONTROL or MCS + if {[string match -nocase *SYSCONTROL* $m_name] || [string match -nocase *MCS* $m_name]} { + set_property SCOPED_TO_CELLS "${m_name}/U0/microblaze_I" [get_files -all -of_objects [get_fileset sources_1] ${f_obj}] + } else { + set_property SCOPED_TO_CELLS "${m_name}" [get_files -all -of_objects [get_fileset sources_1] ${f_obj}] + } + } + } + } + } + } + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished project source functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project new block design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--creat_new_blockdesign: create empty block design with zynq initialisation: fsys,msys,zsys,zusys + proc create_new_blockdesign {{type fsys} {msys_conf {local_mem "8KB" ecc "None" cache "None" debug_module "Debug Only" axi_periph "Enabled" axi_intc "0" clk "None"}}} { + #check other bd files exists, currently only one is supported with this function + set bd_files [] + if { [catch {set bd_files [glob -join -dir ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.srcs/${TE::SOURCE_NAME}/bd/ * *.bd]}] } { + create_bd_design $type + if {$type eq "fsys"} { + TE::UTILS::te_msg TE_BD-14 INFO "For fsys Block Design is currently no additional initialisation intended." + } elseif {$type eq "zusys"} { + create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e zynq_ultra_ps_e_0 + apply_bd_automation -rule xilinx.com:bd_rule:zynq_ultra_ps_e -config {apply_board_preset "1" } [get_bd_cells zynq_ultra_ps_e_0] + + set tcl_ext [] + if { [catch {set tcl_ext [glob -join -dir ${TE::BOARDDEF_PATH}/carrier_extension/ *_preset.tcl]}] } { + } + foreach carrier_ext $tcl_ext { + TE::UTILS::te_msg TE_BD-15 INFO "Import carrier_settings from:[file tail $carrier_ext]." + source $carrier_ext + } + } elseif {$type eq "zsys"} { + create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7 processing_system7_0 + apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {make_external "FIXED_IO, DDR" apply_board_preset "1" Master "Disable" Slave "Disable" } [get_bd_cells processing_system7_0] + set tcl_ext [] + if { [catch {set tcl_ext [glob -join -dir ${TE::BOARDDEF_PATH}/carrier_extension/ *_preset.tcl]}] } { + } + foreach carrier_ext $tcl_ext { + TE::UTILS::te_msg TE_BD-16 INFO "Import carrier_settings from:[file tail $carrier_ext]." + source $carrier_ext + } + } elseif {$type eq "msys"} { + create_bd_cell -type ip -vlnv xilinx.com:ip:microblaze microblaze_0 + #set test {local_mem "8KB" ecc "None" cache "None" debug_module "Debug Only" axi_periph "Enabled" axi_intc "0" clk "None"} + apply_bd_automation -rule xilinx.com:bd_rule:microblaze -config $msys_conf [get_bd_cells microblaze_0] + } else { + TE::UTILS::te_msg TE_BD-17 {CRITICAL WARNING} "Unknown Block-Design Type. No Type specific initialisation is done." + } + } else { + TE::UTILS::te_msg TE_BD-18 ERROR "Currently TE-Scripts supports only one Block-Design. Generation is cancelled." + return -code error + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished new block design functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # project build functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--build_design: + proc build_design {{bitgen true} {mcsgen true} {reportgen true} {hdfgen true}} { + if {[catch {run_synth} result]} {TE::UTILS::te_msg TE_HW-37 ERROR "Script (TE::VIV::run_synth) failed: $result."; return -code error} + if {[catch {run_impl} result]} {TE::UTILS::te_msg TE_HW-38 ERROR "Script (TE::VIV::run_impl) failed: $result."; return -code error} + if {$bitgen} { + if {[catch {write_viv_bitfile} result]} {TE::UTILS::te_msg TE_HW-39 ERROR "Script (TE::VIV::write_viv_bitfile) failed: $result."; return -code error} + } else { + #delete old one if exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit} result]} {TE::UTILS::te_msg TE_HW-40 WARNING "$result"} + } + TE::UTILS::te_msg TE_HW-41 WARNING "Bit-file generation is disabled on build design run." + } + if {$mcsgen} { + if {[catch {write_viv_cfgmem} result]} {TE::UTILS::te_msg TE_HW-42 ERROR "Script (TE::VIV::write_viv_cfgmem) failed: $result."; return -code error} + } else { + #delete old one if exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs} result]} {TE::UTILS::te_msg TE_HW-43 WARNING "$result"} + } + TE::UTILS::te_msg TE_HW-44 WARNING "MCS-file generation is disabled on build design run" + } + if {$reportgen} { + if {[catch {report_design} result]} {TE::UTILS::te_msg TE_HW-45 ERROR "Script (TE::VIV::report_design) failed: $result."; return -code error} + } else { + #delete old one if exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt} result]} {TE::UTILS::te_msg TE_HW-46 WARNING "$result"} + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt} result]} {TE::UTILS::te_msg TE_HW-47 WARNING "$result"} + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv} result]} {TE::UTILS::te_msg TE_HW-48 WARNING "$result"} + } + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc} result]} {TE::UTILS::te_msg TE_HW-49 WARNING "$result"} + } + TE::UTILS::te_msg TE_HW-50 WARNING "Report-files generation is disabled on build design run." + } + if {$hdfgen} { + #is done automatically with bitgen -> *.sysdef + } else { + #delete old one if exists + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef]} { + if {[catch {file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.sysdef} result]} {TE::UTILS::te_msg TE_HW-51 WARNING "$result"} + } + TE::UTILS::te_msg TE_HW-52 WARNING "HDF-files generation is disabled on build design run." + } + } + #-------------------------------- + #--run_synth: + proc run_synth {} { + #syntheses + reset_run $TE::SYNTH_NAME + launch_runs $TE::SYNTH_NAME -jobs $TE::RUNNING_JOBS + wait_on_run -timeout $TE::TIMEOUT $TE::SYNTH_NAME + } + #-------------------------------- + #--run_impl: + proc run_impl {} { + #implementation and bitgen + reset_run $TE::IMPL_NAME + # launch_runs $TE::IMPL_NAME + launch_runs $TE::IMPL_NAME -to_step route_design -jobs $TE::RUNNING_JOBS + wait_on_run -timeout $TE::TIMEOUT $TE::IMPL_NAME + } + #-------------------------------- + #--write_viv_bitfile: + proc write_viv_bitfile {} { + launch_runs $TE::IMPL_NAME -to_step write_bitstream -jobs $TE::RUNNING_JOBS + wait_on_run -timeout $TE::TIMEOUT $TE::IMPL_NAME + } + #-------------------------------- + #--write_viv_cfgmem: + proc write_viv_cfgmem {} { + #used only if bd name is no zynq design (without processor system)! + if {[file exists ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs]} { file delete -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs } + if {!$TE::IS_ZSYS && !$TE::IS_ZUSYS} { + if {$TE::CFGMEM_MEMSIZE_MB ne "NA"} { + #check supported from *board_files.csv + #write mcs with *board_files.csv settings + if {[catch { write_cfgmem -force -format mcs -interface $TE::CFGMEM_IF -size $TE::CFGMEM_MEMSIZE_MB \ + -loadbit "up 0x0 ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit" \ + -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs\ + }]} { + #if failed try SPIX1 (default ) (faster than open design) + TE::UTILS::te_msg TE_HW-53 INFO "Generate MCS failed with $TE::CFGMEM_IF from *board_files.csv specification, try to generate SPIx1." + if {[catch { write_cfgmem -force -format mcs -interface SPIX1 -size $TE::CFGMEM_MEMSIZE_MB \ + -loadbit "up 0x0 ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit" \ + -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs\ + }]} { + #if failed get propery from design (needs some time) + TE::UTILS::te_msg TE_HW-54 INFO "Generate MCS failed with SPIx1, try to get information from implemented Design." + open_run $TE::IMPL_NAME + set tmp_cfgmem_if "SPIx[get_property BITSTREAM.CONFIG.SPI_BUSWIDTH [current_design]]" + close_design + write_cfgmem -force -format mcs -interface $tmp_cfgmem_if -size $TE::CFGMEM_MEMSIZE_MB \ + -loadbit "up 0x0 ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.bit" \ + -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.mcs + TE::UTILS::te_msg TE_HW-55 INFO "Generate MCS with $tmp_cfgmem_if from current design setting (BITSTREAM.CONFIG.SPI_BUSWIDTH), but current Board Part supports $TE::CFGMEM_IF" + } else { + TE::UTILS::te_msg TE_HW-56 INFO "Generate MCS with SPIX1 (BITSTREAM.CONFIG.SPI_BUSWIDTH 1) from Bitfile, but current Board Part supports $TE::CFGMEM_IF also!" + } + } + } else { + TE::UTILS::te_msg TE_HW-57 {CRITICAL WARNING} "FPGAFLASHTYP Mem Size in MB is not specified in *.board_files.csv. *.mcs file is not generated." + } + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished built functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # report functions (todo to utilities) + # ----------------------------------------------------------------------------------------------------------------------------------------- + + #-------------------------------- + #--report_design: + proc report_design {} { + #-------------check toplevel name (if modified) + if { ![string equal $TE::PR_TOPLEVELNAME [get_property top [current_fileset]]] } { + TE::UTILS::te_msg TE_HW-58 INFO "Top Level Name ([get_property top [current_fileset]]) is not same then exspected from BD-File delivery ($TE::PR_TOPLEVELNAME). [get_property top [current_fileset]] is used in Script settings now." + set TE::PR_TOPLEVELNAME [get_property top [current_fileset]] + } + #-------------block design reports + #-------------synthese reports + #-------------implement reports + open_run $TE::IMPL_NAME + + #todo: + # report_debug_core -file ${TE::VPROJ_NAME}_debug_cores.txt + report_ip_status -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_ip_status_report.txt + report_io -force -file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.txt -format text + write_csv -force ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.csv + write_xdc -force -mode port ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::VPROJ_NAME}_io_report.xdc + + report_summary + close_design + } + #-------------------------------- + #--report_run: + proc report_run {} { + #todo eventuell auftrennen und dann noch report schreiben, wenn nicht alles durch geht + set date "[ clock format [clock seconds] -format "%Y-%m-%dT%H:%M:%S"]" + set status "Error" + set founderror -1 + #synth + set sythn_counts [extract_synth_summary] + set sythn_counts_split [split $sythn_counts ","] + set value [lindex $sythn_counts_split [expr [llength $sythn_counts_split]-1]] + if {$value != 0} {set founderror 1} + #impl + set impl_counts [extract_impl_summary] + set impl_counts_split [split $impl_counts ","] + set value [lindex $impl_counts_split [expr [llength $impl_counts_split]-1]] + if {$value != 0} {set founderror 1} + #drc + set drc_counts [extract_drc_summary] + set drc_counts_split [split $drc_counts ","] + set value [lindex $drc_counts_split [expr [llength $drc_counts_split]-1]] + if {$value != 0} {set founderror 1} + #timing + set timing_counts [extract_timing_summary] + set timing_counts_split [split $timing_counts ","] + set value [lindex $timing_counts_split [expr [llength $timing_counts_split]-1]] + if {[string compare "NA" $value ]==0} {set founderror 0} elseif {$value != 0} {set founderror 1} + if {$founderror == -1} {set status "Ok"} elseif {$founderror == 0} {set status "Ok(NA)"} + #write report + set report "[format "%-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s," "$date" "$status" "$TE::VPROJ_NAME" "$TE::SHORTDIR" "$TE::BOARDPART" "$TE::SYNTH_NAME" "$TE::IMPL_NAME" "[lindex $sythn_counts_split 0]" "[lindex $sythn_counts_split 1]" "[lindex $sythn_counts_split 2]" "[lindex $sythn_counts_split 3]" "[lindex $impl_counts_split 0]" "[lindex $impl_counts_split 1]" "[lindex $impl_counts_split 2]" "[lindex $impl_counts_split 3]" "[lindex $drc_counts_split 0]" "[lindex $drc_counts_split 1]" "[lindex $timing_counts_split 0]" "[lindex $timing_counts_split 1]" "[lindex $timing_counts_split 2]"]" + return $report + } + #-------------------------------- + #--report_summary: + proc report_summary {} { + set fp_w [open ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}_summary.csv "w"] + #write header + puts $fp_w [format "%-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s, %-40s," "Date" "Status" "ProjName" "BoardDefShortName" "BoardDefName" "SynthName" "ImplName" "SynthInfo" "SynthWarnings" "SynthCritWarnings" "SynthError" "ImplInfo" "ImplWarnings" "ImplCritWarnings" "ImplError" "ImplDRCWarnings" "ImplDRCError" "ImplTimingWNS" "ImplTimingFaildEndpoints" "ImplTimingTNS"] + + puts $fp_w [report_run] + close $fp_w + } + #-------------------------------- + #--extract_synth_summary: + proc extract_synth_summary {} { + set synth_returns "0,0,0,FileNotFound" + + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::SYNTH_NAME}/${TE::PR_TOPLEVELNAME}.vds + if { ![file exists ${report_file}]} {return $synth_returns} + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + + foreach line $data { + if {[string match "*Infos*Warnings*Critical Warnings*Errors encountered*" $line]} { + set tmp [string map {"and" "," " " "" "Infos" "" "Warnings" "" "Critical" "" "Errors" "" "encountered." ""} "$line"] + #use only last log output + #return Infos, Warnings, Critical Warnings , Errors + set synth_returns $tmp + } + } + return $synth_returns + } + #-------------------------------- + #--extract_impl_summary: + proc extract_impl_summary {} { + set impl_returns "0,0,0,FileNotFound" + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.vdi + if { ![file exists ${report_file}]} {return $impl_returns} + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + + foreach line $data { + if {[string match "*Infos*Warnings*Critical Warnings*Errors encountered*" $line]} { + set tmp [string map {"and" "," " " "" "Infos" "" "Warnings" "" "Critical" "" "Errors" "" "encountered." ""} "$line"] + #use only last log output + #return Infos, Warnings, Critical Warnings , Errors + set impl_returns $tmp + } + } + return $impl_returns + } + #-------------------------------- + #--extract_drc_summary: + proc extract_drc_summary {} { + set drc_returns "0,FileNotFound" + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}.vdi + if { ![file exists ${report_file}]} {return $drc_returns} + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + set err_count 0 + set warn_count 0 + + foreach line $data { + if {[string match "*DRC finished with*" $line]} { + set index [string first "with" $line 0] + set tmp [string range $line $index [string length $line]] + set tmp [string map {" " "" "with" "" "Errors" "" "Warnings" "" "Advisories" ""} "$tmp"] + set tmp [split $tmp ","] + if {[llength $tmp]==1} { + if {[string is integer [lindex $tmp 0]]} { + set err_count [expr $err_count + [lindex $tmp 0]] + } else { + set err_count 999999 + } + } else { + if {[string is integer [lindex $tmp 0]]} { + set err_count [expr $err_count + [lindex $tmp 0]] + } else { + set err_count 999999 + } + if {[string is integer [lindex $tmp 1]]} { + set warn_count [expr $warn_count + [lindex $tmp 1]] + } else { + set warn_count 999999 + } + } + } + } + #return Warnings, Errors + set drc_returns "$warn_count, $err_count" + return $drc_returns + } + #-------------------------------- + #--extract_timing_summary: + proc extract_timing_summary {} { + set timing_returns "0,0,FileNotFound" + set report_file ${TE::VPROJ_PATH}/${TE::VPROJ_NAME}.runs/${TE::IMPL_NAME}/${TE::PR_TOPLEVELNAME}_timing_summary_routed.rpt + if { ![file exists ${report_file}]} {return $timing_returns} + set fp_r [open ${report_file} "r"] + set file_data [read $fp_r] + set data [split $file_data "\n"] + close $fp_r + + set lineindex -1 + foreach line $data { + incr lineindex + if {[string match "*Design Timing Summary*" $line]} { + break; + } + } + set lineindex [expr $lineindex +6] + set tmp [join [lindex $data $lineindex] " "] + set timing_returns "[lindex $tmp 0],[lindex $tmp 2],[lindex $tmp 1]" + #return WNS, Faild Endpoints, TNS + return $timing_returns + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished report functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + namespace eval VLAB { + # ----------------------------------------------------------------------------------------------------------------------------------------- + # vlab project functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + #-------------------------------- + #--create_project: + proc create_project {} { + #create vivado lab project + ::create_project -force $TE::VPROJ_NAME $TE::VLABPROJ_PATH + #set props.. + } + #-------------------------------- + #--open_project: + proc open_project {} { + #open vivado lab project + ::open_project ${TE::VPROJ_NAME}.lpr + } + #-------------------------------- + #--close_project: + proc close_project {} { + #close vivado project + ::close_project + } + #-------------------------------- + #--hw_open_jtag: + proc hw_open_jtag {} { + + #start new session + ::open_hw + if {[current_hw_server -quiet] eq ""} { + ::connect_hw_server + } + if {[current_hw_device -quiet] eq ""} { + ::open_hw_target + return true + } else { + return false + } + } + #-------------------------------- + #--hw_close_jtag: + proc hw_close_jtag {} { + ::close_hw + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished vlab project functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # device functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--hw_create_flash_device: + proc hw_create_flash_device {{fname ""}} { + #todo configs auswählbar + set partname_int "" + set flashtyp_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set id "[TE::BDEF::find_id $fname]" + set tmp [TE::BDEF::get_fpgaflashtyp $id 0] + set tmp [split $tmp "|"] + if {[llength $tmp] eq 3} { + set flashtyp_int [lindex $tmp 0] + } else { + set flashtyp_int $tmp + } + + } else { + set partname_int $TE::PARTNAME + set flashtyp_int $TE::FPGAFLASHTYP + } + set hw_fpga_name [hw_get_fpga $partname_int] + set_property PROBES.FILE "" $hw_fpga_name + #reset old propefiles + create_hw_cfgmem -hw_device $hw_fpga_name -mem_dev [lindex [get_cfgmem_parts ${flashtyp_int}] 0] + set_property PROGRAM.BLANK_CHECK 0 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.ERASE 1 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.CFG_PROGRAM 1 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.VERIFY 0 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.CHECKSUM 0 [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if {[catch {refresh_hw_device $hw_fpga_name}] } {} + } + #-------------------------------- + #--hw_get_fpga: + proc hw_get_fpga {{partname ""}} { + set partname_int $partname + if {$partname_int eq ""} {set partname_int $TE::PARTNAME} + set hw_fpga_name NA + set hw_fpga_found false + + foreach hwd [get_hw_devices] { + set name [lindex [split $hwd "_"] 0] + set hw_fpga_found [string match *$name* $partname_int] + if {$hw_fpga_found} {set hw_fpga_name $hwd;break;} + } + if {$hw_fpga_found} { + # ::refresh_hw_device $hw_fpga_name + } else { + # change compared name from automotive and defence grade fpga (has same hw-id than commercial) + set alt_partname [string map {xa xc xq xc} $partname_int] + foreach hwd [get_hw_devices] { + set name [lindex [split $hwd "_"] 0] + set hw_fpga_found [string match *$name* $alt_partname] + if {$hw_fpga_found} {set hw_fpga_name $hwd;break;} + } + if {$hw_fpga_found} { + # ::refresh_hw_device $hw_fpga_name + } else { + set rpt_txt "$partname_int Device not found. \n" + foreach hwd [get_hw_devices] { + set name [lindex [split $hwd "_"] 0] + set rpt_txt "$rpt_txt $partname_int and $alt_partname compare with *$name* failed. \n" + } + TE::UTILS::te_msg TE_PR-0 WARNING "$rpt_txt" + } + } + return $hw_fpga_name + } + #-------------------------------- + #--hw_fpga_boot_from_memory: + proc hw_fpga_boot_from_memory {{fname ""}} { + set partname_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + } else { + set partname_int $TE::PARTNAME + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$hw_fpga_name ne "NA"} { + ::boot_hw_device $hw_fpga_name + TE::UTILS::te_msg TE_PR-1 INFO "Reboot Device is done." + ::refresh_hw_device $hw_fpga_name + TE::UTILS::te_msg TE_PR-2 INFO "Reboot Device is done." + } else { + TE::UTILS::te_msg TE_PR-3 ERROR "Boot from Memory failed. Device not found." + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished device functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + # ----------------------------------------------------------------------------------------------------------------------------------------- + # property functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--hw_set_bit_and_ltx_files: setup for bitfile configuration via labtools/vivado + proc hw_set_bit_and_ltx_files {use_basefolder app_name {fname ""}} { + set return_filename "" + set partname_int "" + set shortdir_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set shortdir_int "[TE::BDEF::find_shortdir $fname]" + } else { + set partname_int $TE::PARTNAME + set shortdir_int $TE::SHORTDIR + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$hw_fpga_name ne "NA"} { + if {$use_basefolder} { + set bitfilename "" + if { ![catch {set bitfilename [glob -join -dir ${TE::BASEFOLDER}/ *.bit]}] } { + TE::UTILS::te_msg TE_PR-4 INFO "Used file:${bitfilename}" + set return_filename ${bitfilename} + set_property PROGRAM.FILE ${bitfilename} $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-5 ERROR "Bitfile not found in ${TE::BASEFOLDER}. Nothing is done." + return -code error + } + } else { + if {$app_name eq "" || $app_name eq "NA"} { + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit]} { + #use bitfile from hardware folder (with bootloop for microblaze systems) + set_property PROGRAM.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit $hw_fpga_name + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-6 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-7 INFO "Used file:${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit" + set return_filename ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit + } else { + #use default bit from hardware folder (with bootloop for microblaze systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit]} { + set_property PROGRAM.FILE ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit $hw_fpga_name + if {[file exists ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-8 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-9 INFO "Used file:${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit" + set return_filename ${TE::PREBUILT_HW_PATH}/default/${TE::VPROJ_NAME}.bit + } else { + TE::UTILS::te_msg TE_PR-10 ERROR "${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.bit not found. Nothing is done." + return -code error + } + } + } else { + #use bitfile from bootimage folder (with programmed apps for microblaze systems) + set bitfilename "" + if { ![catch {set bitfilename [glob -join -dir ${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/ *.bit]}] } { + set_property PROGRAM.FILE ${bitfilename} $hw_fpga_name + #search in hardware folder for ltx + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-11 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-12 INFO "Used file:${bitfilename}" + set return_filename ${bitfilename} + } else { + TE::UTILS::te_msg TE_PR-13 ERROR "${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/*.bit not found. Nothing is done." + return -code error + } + } + } + } else { + TE::UTILS::te_msg TE_PR-14 ERROR "Program FPGA failed. Device not found." + return -code error + } + return $return_filename + } + #-------------------------------- + #--hw_set_bin_and_ltx_files: setup for binfile configuration via labtools/vivado + proc hw_set_bin_and_ltx_files {use_basefolder app_name fname} { + set return_filename "" + set partname_int "" + set shortdir_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set shortdir_int "[TE::BDEF::find_shortdir $fname]" + } else { + set partname_int $TE::PARTNAME + set shortdir_int $TE::SHORTDIR + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$hw_fpga_name ne "NA"} { + if {$use_basefolder} { + set binfilename "" + set ltxfilename "" + if { ![catch {set binfilename [glob -join -dir ${TE::BASEFOLDER}/ *.bin]}] } { + TE::UTILS::te_msg TE_PR-15 INFO "Used file:${binfilename}" + set return_filename ${binfilename} + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${binfilename}" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if { ![catch {set ltxfilename [glob -join -dir ${TE::BASEFOLDER}/ *.ltx]}] } { + set_property PROBES.FILE ${ltxfilename} $hw_fpga_name + } else { + set_property PROBES.FILE "" $hw_fpga_name + } + } else { + TE::UTILS::te_msg TE_PR-16 {CRITICAL WARNING} "Bin file not found in ${TE::BASEFOLDER}. Nothing is done." + return -code error + } + } else { + set binfilename "" + if { ![catch {set binfilename [glob -join -dir ${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/ *.bin]}] } { + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${binfilename}" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-17 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-18 INFO "Used file: ${binfilename}" + set return_filename ${binfilename} + } else { + TE::UTILS::te_msg TE_PR-19 ERROR "${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/*.bin not found. Nothing is done." + return -code error + } + } + } else { + TE::UTILS::te_msg TE_PR-20 ERROR "Program FPGA failed. Device not found." + return -code error + } + return $return_filename + } + #-------------------------------- + #--hw_set_mcs_and_ltx_files: setup for mcsfile configuration via labtools/vivado + proc hw_set_mcs_and_ltx_files {use_basefolder term app_name fname} { + set return_filename "" + set partname_int "" + set shortdir_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set shortdir_int "[TE::BDEF::find_shortdir $fname]" + } else { + set partname_int $TE::PARTNAME + set shortdir_int $TE::SHORTDIR + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$hw_fpga_name ne "NA"} { + if {$use_basefolder} { + set mcsfilename "" + set ltxfilename "" + if { ![catch {set mcsfilename [glob -join -dir ${TE::BASEFOLDER}/ *.mcs]}] } { + TE::UTILS::te_msg TE_PR-21 INFO "Used file:${mcsfilename}" + set return_filename ${mcsfilename} + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${mcsfilename}" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.UNUSED_PIN_TERMINATION ${term} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if { ![catch {set ltxfilename [glob -join -dir ${TE::BASEFOLDER}/ *.ltx]}] } { + set_property PROBES.FILE ${ltxfilename} $hw_fpga_name + } else { + set_property PROBES.FILE "" $hw_fpga_name + } + } else { + TE::UTILS::te_msg TE_PR-22 ERROR "MCS-file not found in ${TE::BASEFOLDER}. Nothing is done." + return -code error + } + } else { + if {$app_name eq "" || $app_name eq "NA"} { + #use mcs from hardware folder (with bootloop for microblaze systems) + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs]} { + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.UNUSED_PIN_TERMINATION ${term} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-23 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-24 INFO "Used file:${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs" + set return_filename ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs + } else { + TE::UTILS::te_msg TE_PR-25 ERROR "${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.mcs not found. Nothing is done" + return -code error + } + } else { + #use mcs from bootimage folder (with configured app for microblaze systems) + set mcsfilename "" + if { ![catch {set mcsfilename [glob -join -dir ${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/ *.mcs]}] } { + set_property PROGRAM.ADDRESS_RANGE {use_file} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.FILES [list "${mcsfilename}" ] [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + set_property PROGRAM.UNUSED_PIN_TERMINATION ${term} [ get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + #search ltx from hardware folder + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + } else { + TE::UTILS::te_msg TE_PR-26 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + TE::UTILS::te_msg TE_PR-27 INFO "Used file:${mcsfilename}" + set return_filename ${mcsfilename} + } else { + TE::UTILS::te_msg TE_PR-28 ERROR "${TE::PREBUILT_BI_PATH}/${shortdir_int}/${app_name}/*.mcs not found. Nothing is done." + return -code error + } + } + } + } else { + TE::UTILS::te_msg TE_PR-29 ERROR "Program FPGA failed. Device not found." + return -code error + } + return $return_filename + } + + #-------------------------------- + #--hw_reload_prope_file_device: + proc hw_reload_prope_file_device {{fname ""}} { + set partname_int "" + set shortdir_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + set shortdir_int "[TE::BDEF::find_shortdir $fname]" + } else { + set partname_int $TE::PARTNAME + set shortdir_int $TE::SHORTDIR + } + set hw_fpga_name [hw_get_fpga $partname_int] + + if {[file exists ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx]} { + set_property PROBES.FILE ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx $hw_fpga_name + TE::UTILS::te_msg TE_PR-30 INFO "New Probes file is set: ${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx" + + } else { + TE::UTILS::te_msg TE_PR-31 INFO "No Probes file (${TE::PREBUILT_HW_PATH}/${shortdir_int}/${TE::VPROJ_NAME}.ltx) was found." + set_property PROBES.FILE "" $hw_fpga_name + } + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished property functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + # ----------------------------------------------------------------------------------------------------------------------------------------- + # programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + #-------------------------------- + #--hw_program_fpga_device: + proc hw_program_fpga_device { use_basefolder appname {fname ""}} { + #bitfile + set return_filename "" + set partname_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + } else { + set partname_int $TE::PARTNAME + } + set hw_fpga_name [hw_get_fpga $partname_int] + + if {![catch {set return_filename [hw_set_bit_and_ltx_files $use_basefolder $appname $fname]}] } { + program_hw_devices $hw_fpga_name + TE::UTILS::te_msg TE_PR-32 INFO "Programming BIT-file finished." + if {[catch {refresh_hw_device $hw_fpga_name}] } {} + } else { + TE::UTILS::te_msg TE_PR-33 ERROR "Program FPGA failed." + return -code error + } + return $return_filename + } + #-------------------------------- + #--hw_program_fpga_flash: + proc hw_program_fpga_flash {use_basefolder term bin appname {fname ""}} { + set return_filename "" + set partname_int "" + if {$fname ne ""} { + set partname_int "[TE::BDEF::find_partname $fname]" + } else { + set partname_int $TE::PARTNAME + } + set hw_fpga_name [hw_get_fpga $partname_int] + if {$bin eq "bin"} { + #program bin file + if {![catch {set return_filename [hw_set_bin_and_ltx_files $use_basefolder $appname $fname]}] } { + program_hw_cfgmem -hw_cfgmem [get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + TE::UTILS::te_msg TE_PR-34 INFO "Programming BIN-file finished." + if {[catch {refresh_hw_device $hw_fpga_name}] } {} + } else { + TE::UTILS::te_msg TE_PR-35 ERROR "Program Flash failed." + return -code error + } + } else { + #program mcs file + if {![catch {set return_filename [hw_set_mcs_and_ltx_files $use_basefolder $term $appname $fname]}] } { + if {![string equal [get_property PROGRAM.HW_CFGMEM_TYPE $hw_fpga_name] [get_property MEM_TYPE [get_property CFGMEM_PART [get_property PROGRAM.HW_CFGMEM $hw_fpga_name]]]] } { create_hw_bitstream -hw_device $hw_fpga_name [get_property PROGRAM.HW_CFGMEM_BITFILE $hw_fpga_name]; program_hw_devices $hw_fpga_name; }; + program_hw_cfgmem -hw_cfgmem [get_property PROGRAM.HW_CFGMEM $hw_fpga_name] + TE::UTILS::te_msg TE_PR-36 INFO "Programming MCS-file finished." + if {[catch {refresh_hw_device $hw_fpga_name}] } {} + } else { + TE::UTILS::te_msg TE_PR-37 ERROR "Program Flash failed." + return -code error + } + } + return $return_filename + } + # ----------------------------------------------------------------------------------------------------------------------------------------- + # finished programming functions + # ----------------------------------------------------------------------------------------------------------------------------------------- + + + + # ----------------------------------------------------------------------------------------------------------------------------------------- + } + + puts "INFO:(TE) Load Vivado script finished" +} + + diff --git a/zynqberrydemo3/settings/project_settings.tcl b/zynqberrydemo3/settings/project_settings.tcl new file mode 100644 index 0000000..777dc02 --- /dev/null +++ b/zynqberrydemo3/settings/project_settings.tcl @@ -0,0 +1,2 @@ +set_property flow {Vivado Implementation 2017} [get_runs ${TE::IMPL_NAME}] +set_property strategy Performance_Explore [get_runs ${TE::IMPL_NAME}] diff --git a/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/data/zynq_fsbl.tcl b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/data/zynq_fsbl.tcl new file mode 100644 index 0000000..e072f6f --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/data/zynq_fsbl.tcl @@ -0,0 +1,97 @@ +proc swapp_get_name {} { + return "Zynq FSBL - TE modified"; +} + +proc swapp_get_description {} { + return "First Stage Bootloader (FSBL) for Zynq. The FSBL configures the FPGA with HW bit stream (if it exists) \ + and loads the Operating System (OS) Image or Standalone (SA) Image or 2nd Stage Boot Loader image from the \ + non-volatile memory (NAND/NOR/QSPI) to RAM (DDR) and starts executing it. It supports multiple partitions, \ + and each partition can be a code image or a bit stream.\ + TE-Modification: Modified HDMI Output DMA and Camera Input DMA on fsbl_hooks.c. Add. vdma.h, vdma.c\ + FSBL Template: 2017.1 \ + "; +} + +proc swapp_get_supported_processors {} { + return "ps7_cortexa9"; +} + +proc swapp_get_supported_os {} { + return "standalone"; +} + +proc check_standalone_os {} { + set oslist [hsi::get_os]; + + if { [llength $oslist] != 1 } { + return 0; + } + set os [lindex $oslist 0]; + + if { $os != "standalone" } { + error "This application is supported only on the Standalone Board Support Package."; + } +} + +proc swapp_is_supported_sw {} { + # make sure we are using standalone OS + #check_standalone_os; + + # make sure xilffs and xilrsa libraries are available + + set librarylist_1 [hsi::get_libs -filter "NAME==xilffs"]; + + + if { [llength $librarylist_1] == 0 } { + error "This application requires xilffs library in the Board Support Package."; + } +} + +proc swapp_is_supported_hw {} { + + # check processor type + set proc_instance [hsi::get_sw_processor]; + set hw_processor [common::get_property HW_INSTANCE $proc_instance] + + set proc_type [common::get_property IP_NAME [hsi::get_cells -hier $hw_processor]]; + + if { $proc_type != "ps7_cortexa9" } { + error "This application is supported only for CortexA9 processors."; + } + + return 1; +} + + +proc get_stdout {} { + set os [hsi::get_os]; + set stdout [common::get_property CONFIG.STDOUT $os]; + return $stdout; +} + +proc check_stdout_hw {} { + set p7_uarts [hsi::get_cells -hier -filter "IP_NAME=ps7_uart"]; +} + +proc swapp_generate {} { + # generate/copy ps init files + ::hsi::utils::generate_psinit + + #delete unnecessary files (only ps7_init.c & ps7_init.h are needed for FSBL) + + set files(0) "ps7_init.html" + set files(1) "ps7_init.tcl" + set files(2) "ps7_init_gpl.c" + set files(3) "ps7_init_gpl.h" + + foreach init_file [array get files] { + file delete -force $init_file + } + +} + +proc swapp_get_linker_constraints {} { + + # don't generate a linker script. fsbl has its own linker script + return "lscript no"; +} diff --git a/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl.h new file mode 100644 index 0000000..a0cf67b --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl.h @@ -0,0 +1,546 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file fsbl.h +* +* Contains the function prototypes, defines and macros for the +* First Stage Boot Loader (FSBL) functionality +* +*

    +* 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
    +*
    +* 7.00a kc  10/18/13    Integrated SD/MMC driver
    +*			10/23/13	Support for armcc compiler added
    +*						741003 FSBL has to check the HMAC error status after 
    +*						decryption
    +*						Resolution: Added code for checking the error status 
    +*						after PCAP completion
    +*						739968 FSBL should do the QSPI config settings for 
    +*						Dual parallel configuration in IO mode
    +*						Resolution: Added QSPI config settings in qspi.c
    +*						724620 FSBL: How to handle PCAP_MODE after bitstream 
    +*						configuration.
    +*						Resolution: PCAP_MODE and PCAP_PR bits are now cleared  
    +* 						after PCAP transfer completion
    +*						726178 In the 14.6 FSBL function FabricInit() PROG_B 
    +*						is kept active for 5mS.
    +*						Resolution: PROG_B is now kept active for 5mS only incase 
    +*						if efuse is the aes key source.
    +*						755245 FSBL does not load partition if eMMC has only 
    +*						one partition
    +*						Resolution: Changed the if condition for MMC
    +*			12/04/13    764382 FSBL: How to handle PCAP_MODE after bitstream 
    +*						configuration
    +*						Resolution: Reverted back the changes of 724620. PCAP_MODE
    +*						and PCAP_PR bits are not changed
    +* 8.00a kc  01/16/13    767798 Fsbl MD5 Checksum failiure for encrypted images
    +* 						Resolution: For checksum enabled partitions, total 
    +*						total partition image length is copied now.
    +*						761895 FSBL should authenticate image only if
    +*						partition owner was not set to u-boot
    +*						Resolution: Partition owner check added in 
    +*						image_mover.c
    +* 			02/20/14	775631 - FSBL: FsblGetGlobalTimer() is not proper
    +*						Resolution: Function argument is updated from value
    +*						to pointer to reflect updated value
    +* 9.00a kc  04/16/14	773866 - SetPpk() will fail on secure fallback
    +*						unless FSBL* and FSBL are identical in length
    +*						Resolution: PPK is set only once now.
    +*						785778 - FSBL takes 8 seconds to
    +* 						authenticate (RSA) a bitstream on zc706
    +* 						Resolution: Data Caches are enabled only for
    +* 						authentication.
    +* 						791245 - Use of xilrsa in fsbl
    +* 						Resolution: Rsa library is removed from fsbl source
    +* 						and xilrsa is used from BSP
    +* 10.00a kc 07/15/14	804595 Zynq FSBL - Issues with
    +* 						fallback image offset handling using MD5
    +* 						Resolution: Updated the checksum offset to add with
    +* 						image base address
    +* 						782309 Fallback support for AES
    +* 						encryption with E-Fuse - Enhancement
    +* 						Resolution: Same as 773866
    +* 						809336 Minor code cleanup
    +* 						Resolution Minor code changes
    +*        kc 08/27/14	820356 - FSBL compilation fails with IAR compiler
    +* 						Resolution: Change of __asm__ to __asm
    +* 11.00a kv 10/08/14	826030 - FSBL:LinearBootDeviceFlag is not initialized
    +*						in IO mode case.Due to which the variable is
    +*						remaining in unknown state.
    +*						Resolution: LinearBootDeviceFlag is initialized 0
    +*						in main.c
    +* 12.00a ssc 12/11/14	839182 - FSBL -In the file sd.c, f_mount is called with
    +*                       two arguments but f_mount is expecting the 3 arguments
    +*                       from build 2015.1_1210_1, causing compilation error.
    +*						Resolution: Arguments for f_mount in InitSD() are
    +*						changed as per new signature.
    +* 13.00a ssc 04/10/15	846899 - FSBL -In the file pcap.c, to clear DMA done
    +*                       count, devcfg.INT_STS register is written to, which is
    +*                       not correct.
    +*                       Resolution: Corresponding fields in the devcfg.STATUS
    +*                       register are written to, for clearing DMA done count.
    +* 14.00a gan 01/13/16   869081 -(2016.1)FSBL -In qspi.c, FSBL picks the qspi
    +*						read command from LQSPI_CFG register instead of hard
    +*		   				coded read command (0x6B).
    +* 15.00a gan 07/21/16   953654 -(2016.3)FSBL -In pcap.c/pcap.h/main.c,
    +* 						Fabric Initialization sequence is modified to check
    +* 						the PL power before sequence starts and checking INIT_B
    +* 						reset status twice in case of failure.
    +* 16.00a gan 08/02/16   Fix for CR# 955897 -(2016.3)FSBL -
    +* 						In pcap.c, check pl power through MCTRL register
    +* 						for 3.0 and later versions of silicon.
    +* 
    +* +* +* +* @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 +#endif + + +/************************** Constant Definitions *****************************/ +/* + * SDK release version + */ +#define SDK_RELEASE_YEAR 2017 +#define SDK_RELEASE_QUARTER 1 + +#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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h new file mode 100644 index 0000000..2c41c23 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_debug.h @@ -0,0 +1,82 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file fsbl_debug.h +* +* This file contains the debug verbose information for FSBL print functionality +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 3.00a mb	01/09/12 Initial release
    +*
    +* 
    +* +* @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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c new file mode 100644 index 0000000..e3cab04 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c @@ -0,0 +1,206 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ + +/***************************************************************************** +* +* @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. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who  Date        Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 3.00a np   08/03/12 Initial release
    +* 
    +* +* @note +* +******************************************************************************/ + + +#include "fsbl.h" +#include "xstatus.h" +#include "fsbl_hooks.h" + +#include "vdma.h" +#include "xparameters.h" +#include "xil_hal.h" +#include "sleep.h" + +#include "xvtc.h" + +#define ENABLE_CAMERA +// #define DIRECT_CAMERA_VIEW + +#ifdef DIRECT_CAMERA_VIEW +#define HDMI_FB_ADDR 0x1FC00000 +#define CAMERA_FB_ADDR 0x1FC00000 +#endif + +#ifndef DIRECT_CAMERA_VIEW +#define HDMI_FB_ADDR 0x1FC00000 +#define CAMERA_FB_ADDR 0x1F700000 +#endif +/************************** 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; + XVtc Vtc; + /* + * 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"); + + xil_printf("FSBL: Enabling VTC..\n\r"); + XVtc_Config *Config; + Config = XVtc_LookupConfig(XPAR_VTC_0_DEVICE_ID); + if (NULL == Config) { + xil_printf("XVtc_LookupConfig failure\r\n"); + return XST_FAILURE; + } + + Status = XVtc_CfgInitialize(&Vtc, Config, Config->BaseAddress); + if (Status != XST_SUCCESS) { + xil_printf("XVtc_CfgInitialize failure\r\n"); + return XST_FAILURE; + } + + XVtc_DisableSync(&Vtc); + XVtc_EnableGenerator(&Vtc); + + xil_printf("FSBL: Enabling Out VDMA at 0x%08x..\n\r",HDMI_FB_ADDR); + vdma_out_init(XPAR_VIDEO_OUT_AXI_VDMA_0_DEVICE_ID, HDMI_FB_ADDR, 1280, 720, 4); +#ifdef ENABLE_CAMERA + xil_printf("FSBL: Enabling In VDMA at 0x%08x..\n\r",CAMERA_FB_ADDR); + vdma_in_init(XPAR_VIDEO_IN_AXI_VDMA_0_DEVICE_ID, CAMERA_FB_ADDR, 1280, 720, 4); +#endif + 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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h new file mode 100644 index 0000000..784f7ed --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.h @@ -0,0 +1,81 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file fsbl_hooks.h +* +* Contains the function prototypes, defines and macros required by fsbl_hooks.c +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 3.00a	np/mb	10/08/12	Initial release
    +*				Corrected the prototype
    +*
    +* 
    +* +* @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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/image_mover.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/image_mover.c new file mode 100644 index 0000000..1bad673 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/image_mover.c @@ -0,0 +1,1335 @@ +/****************************************************************************** +* +* Copyright (C) 2011 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file image_mover.c +* +* Move partitions to either DDR to execute or to program FPGA. +* It performs partition walk. +* +*
    +* 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 Secure bootmode error in devcfg test
    +*						Fix for CR#695578 FSBL failed to load standalone 
    +*						application in secure bootmode
    +*
    +* 4.00a sgd	04/23/13	Fix for CR#710128 FSBL failed to load standalone 
    +*						application in secure bootmode
    +* 5.00a kc	07/30/13	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#732062 FSBL fails to build if UART not 
    +*						available 
    +* 7.00a kc  10/30/13    Fix for CR#755245 FSBL does not load partition
    +*                       if eMMC has only one partition
    +* 8.00a kc  01/16/13    Fix for CR#767798  FSBL MD5 Checksum failure
    +* 						for encrypted images
    +*						Fix for CR#761895 FSBL should authenticate image
    +*						only if partition owner was not set to u-boot
    +* 9.00a kc  04/16/14    Fix for CR#785778  FSBL takes 8 seconds to 
    +* 						authenticate (RSA) a bitstream on zc706
    +* 10.00a kc 07/15/14	Fix for CR#804595 Zynq FSBL - Issues with
    +* 						fallback image offset handling using MD5
    +* 						Fix for PR#782309 Fallback support for AES
    +* 						encryption with E-Fuse - Enhancement
    +*
    +* 
    +* +* @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" +#include "xil_cache.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%08lx\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%08lx\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%08lx\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: %lu\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; + + /* + * Partition owner should be FSBL to validate the partition + */ + if ((PartitionAttr & ATTRIBUTE_PARTITION_OWNER_MASK) != + ATTRIBUTE_PARTITION_OWNER_FSBL) { + /* + * if FSBL is not the owner of partition, + * skip this partition, continue with next partition + */ + fsbl_printf(DEBUG_INFO, "Skipping partition %0lx\r\n", + PartitionNum); + /* + * Increment partition number + */ + PartitionNum++; + continue; + } + + 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), + ImageStartAddress + + (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 + Xil_DCacheEnable(); + Status = AuthenticatePartition((u8*)PartitionStartAddr, + (PartitionTotalSize << WORD_LENGTH_SHIFT)); + if (Status != XST_SUCCESS) { + Xil_DCacheFlush(); + Xil_DCacheDisable(); + fsbl_printf(DEBUG_GENERAL,"AUTHENTICATION_FAIL\r\n"); + OutputStatus(AUTHENTICATION_FAIL); + FsblFallback(); + } + fsbl_printf(DEBUG_INFO,"Authentication Done\r\n"); + Xil_DCacheFlush(); + Xil_DCacheDisable(); +#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%08lx\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: %lu\r\n", PartitionCount); + + /* + * Partition Count check + */ + if (PartitionCount >= MAX_PARTITION_NUMBER) { + fsbl_printf(DEBUG_GENERAL, "Invalid Partition Count\r\n"); + return XST_FAILURE; +#ifndef MMC_SUPPORT + } else if (PartitionCount <= 1) { + fsbl_printf(DEBUG_GENERAL, "There is no partition to load\r\n"); + return XST_FAILURE; +#endif + } + + 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%08lx\r\n", + Header->ImageWordLen); + fsbl_printf(DEBUG_INFO, "Data Word Len: 0x%08lx\r\n", + Header->DataWordLen); + fsbl_printf(DEBUG_INFO, "Partition Word Len:0x%08lx\r\n", + Header->PartitionWordLen); + fsbl_printf(DEBUG_INFO, "Load Addr: 0x%08lx\r\n", + Header->LoadAddr); + fsbl_printf(DEBUG_INFO, "Exec Addr: 0x%08lx\r\n", + Header->ExecAddr); + fsbl_printf(DEBUG_INFO, "Partition Start: 0x%08lx\r\n", + Header->PartitionStart); + fsbl_printf(DEBUG_INFO, "Partition Attr: 0x%08lx\r\n", + Header->PartitionAttr); + fsbl_printf(DEBUG_INFO, "Partition Checksum Offset: 0x%08lx\r\n", + Header->CheckSumOffset); + fsbl_printf(DEBUG_INFO, "Section Count: 0x%08lx\r\n", + Header->SectionCount); + fsbl_printf(DEBUG_INFO, "Checksum: 0x%08lx\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.8lx != 0x%8.8lx\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<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 or checksum enabled partition, + * Total partition image need to copied to DDR + */ + if (SignedPartitionFlag || PartitionChecksumFlag) { + 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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/image_mover.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/image_mover.h new file mode 100644 index 0000000..dad66f1 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/image_mover.h @@ -0,0 +1,161 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file image_mover.h +* +* This file contains the interface for moving the image from FLASH to OCM + +* +*
    +* 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
    +* 8.00a kc	01/16/13	Added defines for partition owner attribute
    +* 
    +* +* @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 */ +#define ATTRIBUTE_PARTITION_OWNER_MASK 0x30000 /* Partition Owner */ + +#define ATTRIBUTE_PARTITION_OWNER_FSBL 0x00000 /* FSBL Partition Owner */ + + +/**************************** 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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/main.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/main.c new file mode 100644 index 0000000..958e3c0 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/main.c @@ -0,0 +1,1532 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file main.c +* +* The main file for the First Stage Boot Loader (FSBL). +* +*
    +* 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
    +* 7.00a kc  10/18/13    Integrated SD/MMC driver
    +* 8.00a kc  02/20/14	Fix for CR#775631 - FSBL: FsblGetGlobalTimer() 
    +*											is not proper
    +* 9.00a kc  04/16/14	Fix for CR#724166 - SetPpk() will fail on secure
    +*		 									fallback unless FSBL* and FSBL
    +*		 									are identical in length
    +* 10.00a kc 07/24/14	Fix for CR#809336 - Minor code cleanup
    +*        kc 08/27/14	Fix for CR#820356 - FSBL compilation fails with
    +* 											IAR compiler
    +* 11.00a kv 10/08/14	Fix for CR#826030 - LinearBootDeviceFlag should
    +*											be initialized to 0 in IO mode
    +*											case
    +* 15.00a gan 07/21/16   Fix for CR# 953654 -(2016.3)FSBL -
    +* 											In pcap.c/pcap.h/main.c,
    +* 											Fabric Initialization sequence
    +* 											is modified to check the PL power
    +* 											before sequence starts and checking
    +* 											INIT_B reset status twice in case
    +* 											of failure.
    +* 
    +* +* @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 +#ifdef XPAR_XUARTPS_0_BASEADDR +#include "xuartps_hw.h" +#endif +#endif + +#ifdef RSA_SUPPORT +#include "rsa.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 + +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=0; + +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; + + /* + * 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(); + } + + /* + * 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 %s-%s\r\n", + 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 & XDCFG_CTRL_PCFG_AES_FUSE_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 + */ +#if defined(XPAR_PS7_SD_0_S_AXI_BASEADDR) || defined(XPAR_XSDPS_0_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%08lx\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%08lx\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 & XDCFG_CTRL_PCFG_AES_FUSE_MASK) { + /* + * Next valid image search can happen only + * when system initialization done + */ + if (SystemInitFlag == 1) { + /* + * Clean the Fabric + */ + Status = FabricInit(); + if(Status != XST_SUCCESS){ + ClearFSBLIn(); + FsblHookFallback(); + } + +#ifdef RSA_SUPPORT + + /* + * Making sure PPK is set for efuse error cases + */ + SetPpk(); +#endif + + /* + * 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 +#ifdef XPAR_XUARTPS_0_BASEADDR + u32 UartReg = 0; +#endif + + fsbl_printf(DEBUG_GENERAL,"FSBL Status = 0x%.4lx\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 + */ +#ifdef XPAR_XUARTPS_0_BASEADDR + 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 +#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%08lx\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; + +#if defined(STDOUT_BASEADDRESS) + 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 %lu.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.8lx\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%.8lx\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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/md5.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/md5.c new file mode 100644 index 0000000..e7cf7ea --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_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 +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 5.00a sgd	05/17/13 Initial release
    +*
    +*
    +* 
    +* +* @note +* +******************************************************************************/ +/****************************** Include Files *********************************/ + +#include "md5.h" + +/******************************************************************************/ +/** +* +* This function sets the memory +* +* @param dest +* +* @param ch +* +* @param count +* +* @return None +* +* @note None +* +****************************************************************************/ +inline void * MD5Memset( 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 * MD5Memcpy( 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 ) { + MD5Memcpy( p, buffer, len, doByteSwap ); + return; + } + + MD5Memcpy( 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 ) { + MD5Memcpy( 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 + */ + MD5Memcpy( 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 + */ + MD5Memset( p, 0, count ); + + MD5Transform( context->buffer, (u32 *)context->intermediate ); + + /* + * Now fill the next block with 56 bytes + */ + MD5Memset( context->intermediate, 0, 56 ); + } else { + /* + * Pad block to 56 bytes + */ + MD5Memset( 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 + */ + MD5Memcpy( 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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/md5.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/md5.h new file mode 100644 index 0000000..1b28ddd --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/md5.h @@ -0,0 +1,120 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file md5.h +* +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 5.00a sgd	05/17/13 Initial release
    +*
    +* 
    +* +* @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 * MD5Memset( void *dest, int ch, u32 count ); + +void * MD5Memcpy( 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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nand.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nand.c new file mode 100644 index 0000000..9bf4ec0 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nand.c @@ -0,0 +1,295 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nand.c +* +* Contains code for the NAND FLASH functionality. Bad Block management +* is simple: skip the bad blocks and keep going. +* +*
    +* 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
    +* 
    +* +* @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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nand.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nand.h new file mode 100644 index 0000000..1f5ee52 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nand.h @@ -0,0 +1,91 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nand.h +* +* This file contains the interface for the NAND FLASH functionality +* +*
    +* 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
    +* 10.00a kc 08/04/14 Fix for CR#809336 - Removed smc.h
    +* 
    +* +* @note +* +******************************************************************************/ +#ifndef ___NAND_H___ +#define ___NAND_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + + +#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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nor.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nor.c new file mode 100644 index 0000000..4705bcc --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nor.c @@ -0,0 +1,144 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nor.c +* +* Contains code for the NOR FLASH functionality. +* +*
    +* 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
    +*
    +* 
    +* +* @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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nor.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nor.h new file mode 100644 index 0000000..4c15825 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/nor.h @@ -0,0 +1,87 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nor.h +* +* This file contains the interface for the NOR FLASH functionality +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a ecm	01/10/10 Initial release
    +* 10.00a kc 08/04/14 Fix for CR#809336 - Removed smc.h
    +*
    +* 
    +* +* @note +* +******************************************************************************/ +#ifndef ___NOR_H___ +#define ___NOR_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +/************************** 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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/pcap.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/pcap.c new file mode 100644 index 0000000..40351c8 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/pcap.c @@ -0,0 +1,816 @@ +/***************************************************************************** +* +* Copyright (C) 2012 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file pcap.c +* +* Contains code for enabling and accessing the PCAP +* +*
    +* 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
    +* 7.00a kc	10/25/13	Fix for CR#724620 - How to handle PCAP_MODE after
    +*						                    bitstream configuration
    +*						Fix for CR#726178 - FabricInit() PROG_B is kept active
    +*						                    for 5mS.
    +* 						Fix for CR#731839 - FSBL has to check the
    +* 											HMAC error status after decryption
    +*			12/04/13	Fix for CR#764382 - How to handle PCAP_MODE after
    +*						                    bitstream configuration - PCAP_MODE
    +*											and PCAP_PR bits are not modified
    +* 8.00a kc  2/20/14		Fix for CR#775631 - FSBL: FsblGetGlobalTimer() 
    +*						is not proper
    +* 10.00a kc 07/24/14    Fix for CR#809336 - Minor code cleanup
    +* 13.00a ssc 04/10/15   Fix for CR#846899 - Corrected logic to clear
    +*                                           DMA done count
    +* 15.00a gan 07/21/16   Fix for CR# 953654 -(2016.3)FSBL -
    +* 											In pcap.c/pcap.h/main.h,
    +* 											Fabric Initialization sequence
    +* 											is modified to check the PL power
    +* 											before sequence starts and checking
    +* 											INIT_B reset status twice in case
    +* 											of failure.
    +* 16.00a gan 08/02/16   Fix for CR# 955897 -(2016.3)FSBL -
    +* 											In pcap.c, check pl power
    +* 											through MCTRL register for
    +* 											3.0 and later versions of silicon.
    +* 
    +* +* @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" +#include "xtime_l.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; +extern u32 Silicon_Version; +#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 IntrStsReg; + 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 = %lu \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"); + + /* + * Check for errors + */ + IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr); + if (IntrStsReg & FSBL_XDCFG_IXR_ERROR_FLAGS_MASK) { + fsbl_printf(DEBUG_INFO,"Errors in PCAP \r\n"); + return XST_FAILURE; + } + + /* + * 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 IntrStsReg; + 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 + */ + Status = FabricInit(); + if (Status != XST_SUCCESS) { + 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 = %lu \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"); + + /* + * Check for errors + */ + IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr); + if (IntrStsReg & FSBL_XDCFG_IXR_ERROR_FLAGS_MASK) { + fsbl_printf(DEBUG_INFO,"Errors in PCAP \r\n"); + return XST_FAILURE; + } + + /* + * 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 +* - XST_SUCCESS if the Fabric initialization is successful +* - XST_FAILURE if the Fabric initialization fails +* @note None +* +****************************************************************************/ +u32 FabricInit(void) +{ + u32 PcapReg; + u32 PcapCtrlRegVal; + u32 StatusReg; + u32 MctrlReg; + u32 PcfgInit; + u32 TimerExpired=0; + XTime tCur=0; + XTime tEnd=0; + + + /* + * 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%lx \r\n", + Xil_In32(PS_LVL_SHFTR_EN)); + + /* + * Get DEVCFG controller settings + */ + PcapReg = XDcfg_ReadReg(DcfgInstPtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET); + + /* + * Check the PL power status + */ + if(Silicon_Version >= SILICON_VERSION_3) + { + MctrlReg = XDcfg_GetMiscControlRegister(DcfgInstPtr); + + if((MctrlReg & XDCFG_MCTRL_PCAP_PCFG_POR_B_MASK) != + XDCFG_MCTRL_PCAP_PCFG_POR_B_MASK) + { + fsbl_printf(DEBUG_INFO,"Fabric not powered up\r\n"); + return XST_FAILURE; + } + } + + + /* + * Setting PCFG_PROG_B signal to high + */ + XDcfg_WriteReg(DcfgInstPtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (PcapReg | XDCFG_CTRL_PCFG_PROG_B_MASK)); + + /* + * Check for AES source key + */ + PcapCtrlRegVal = XDcfg_GetControlRegister(DcfgInstPtr); + if (PcapCtrlRegVal & XDCFG_CTRL_PCFG_AES_FUSE_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)); + + /* + * Check for AES source key + */ + if (PcapCtrlRegVal & XDCFG_CTRL_PCFG_AES_FUSE_MASK) { + /* + * 5msec delay + */ + usleep(5000); + } + + /* + * Polling the PCAP_INIT status for Reset or timeout + */ + + XTime_GetTime(&tCur); + do + { + PcfgInit = (XDcfg_GetStatusRegister(DcfgInstPtr) & + XDCFG_STATUS_PCFG_INIT_MASK); + if(PcfgInit == 0) + { + break; + } + XTime_GetTime(&tEnd); + if((u64)((u64)tCur + (COUNTS_PER_MILLI_SECOND*30)) > (u64)tEnd) + { + TimerExpired = 1; + } + + } while(!TimerExpired); + + if(TimerExpired == 1) + { + TimerExpired = 0; + /* + * Came here due to expiration and PCAP_INIT is set. + * Retry PCFG_PROG_B High -> Low again + */ + + /* + * Setting PCFG_PROG_B signal to high + */ + XDcfg_WriteReg(DcfgInstPtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (PcapReg | XDCFG_CTRL_PCFG_PROG_B_MASK)); + + /* + * Check for AES source key + */ + PcapCtrlRegVal = XDcfg_GetControlRegister(DcfgInstPtr); + if (PcapCtrlRegVal & XDCFG_CTRL_PCFG_AES_FUSE_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)); + + /* + * Check for AES source key + */ + if (PcapCtrlRegVal & XDCFG_CTRL_PCFG_AES_FUSE_MASK) { + /* + * 5msec delay + */ + usleep(5000); + } + /* + * Polling the PCAP_INIT status for Reset or timeout (second iteration) + */ + + XTime_GetTime(&tCur); + do + { + PcfgInit = (XDcfg_GetStatusRegister(DcfgInstPtr) & + XDCFG_STATUS_PCFG_INIT_MASK); + if(PcfgInit == 0) + { + break; + } + XTime_GetTime(&tEnd); + if((u64)((u64)tCur + (COUNTS_PER_MILLI_SECOND*30)) > (u64)tEnd) + { + TimerExpired = 1; + } + + } while(!TimerExpired); + + if(TimerExpired == 1) + { + /* + * Came here due to PCAP_INIT is not getting reset + * for PCFG_PROG_B signal High -> Low + */ + fsbl_printf(DEBUG_INFO,"Fabric Init failed\r\n"); + return XST_FAILURE; + } + } + + /* + * 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%lx \r\n",StatusReg); + + fsbl_printf(DEBUG_INFO,"PCAP:Fabric is Initialized done\r\n"); + + return XST_SUCCESS; +} +/******************************************************************************/ +/** +* +* 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 %lx\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%.8lx\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_SetStatusRegister(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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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%08lx\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 %lx\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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/pcap.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/pcap.h new file mode 100644 index 0000000..d9400b0 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/pcap.h @@ -0,0 +1,108 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file pcap.h +* +* This file contains the interface for intiializing and accessing the PCAP +* +* +*
    +* 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
    +* 15.00a gan 07/21/16   953654 -(2016.3)FSBL -In pcap.c/pcap.h/main.c,
    +* 						Fabric Initialization sequence is modified to check
    +* 						the PL power before sequence starts and checking INIT_B
    +* 						reset status twice in case of failure.
    +* 
    +* +* @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 +/*Miscellaneous Control Register mask*/ +#define XDCFG_MCTRL_PCAP_PCFG_POR_B_MASK 0x00000100 +#define COUNTS_PER_MILLI_SECOND (COUNTS_PER_SECOND/1000) + +#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); +u32 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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c new file mode 100644 index 0000000..cd8a445 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.c @@ -0,0 +1,12946 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file ps7_init.c +* +* This file is automatically generated +* +*****************************************************************************/ + +#include "ps7_init.h" + +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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0x23 + // .. ==> 0XF8000128[13:8] = 0x00000023U + // .. ==> MASK : 0x00003F00U VAL : 0x00002300U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF8000128[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00302301U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xe + // .. ==> 0XF800015C[13:8] = 0x0000000EU + // .. ==> MASK : 0x00003F00U VAL : 0x00000E00U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF800015C[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00300E01U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. 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 = 0x14 + // .. ==> 0XF8000170[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000170[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000180[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000180[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000180[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000190[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000190[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000190[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000190, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF80001A0[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF80001A0[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF80001A0[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF80001A0, 0x03F03F30U ,0x00101400U), + // .. 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 = 0x1 + // .. ==> 0XF800012C[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. 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 = 0x0 + // .. ==> 0XF800012C[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00001081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27087290U), + // .. .. 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 = 0x105 + // .. .. ==> 0XF8006034[13:4] = 0x00000105U + // .. .. ==> MASK : 0x00003FF0U VAL : 0x00001050U + // .. .. 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 ,0x00011054U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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 + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000672U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000674U), + // .. reserved_INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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, 0x00000FFFU ,0x00000600U), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B5C[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B5C[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. reserved_SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B60[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B60[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F9861CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B64[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B64[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F9861CU), + // .. reserved_DRIVE_P = 0x1c + // .. ==> 0XF8000B68[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. reserved_DRIVE_N = 0xc + // .. ==> 0XF8000B68[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. reserved_SLEW_P = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. reserved_SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. reserved_GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. reserved_RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. reserved_VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. reserved_REFIO_TEST = 0x3 + // .. ==> 0XF8000B6C[11:10] = 0x00000003U + // .. ==> MASK : 0x00000C00U VAL : 0x00000C00U + // .. reserved_REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. reserved_DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. reserved_CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x00007FFFU ,0x00000E09U), + // .. .. 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 + // .. .. reserved_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 + // .. .. reserved_VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reserved_VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reserved_VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. reserved_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[15:14] = 0x00000000U + // .. .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. reserved_INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reserved_TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reserved_TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reserved_TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. reserved_TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reserved_INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FEFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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: TRACE CURRENT PORT SIZE + // .. FINISH: TRACE CURRENT PORT SIZE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 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(), + + // +}; + +unsigned long ps7_debug_3_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0x23 + // .. ==> 0XF8000128[13:8] = 0x00000023U + // .. ==> MASK : 0x00003F00U VAL : 0x00002300U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF8000128[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00302301U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xe + // .. ==> 0XF800015C[13:8] = 0x0000000EU + // .. ==> MASK : 0x00003F00U VAL : 0x00000E00U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF800015C[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00300E01U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. 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 = 0x14 + // .. ==> 0XF8000170[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000170[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000180[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000180[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000180[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000190[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000190[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000190[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000190, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF80001A0[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF80001A0[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF80001A0[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF80001A0, 0x03F03F30U ,0x00101400U), + // .. 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 = 0x1 + // .. ==> 0XF800012C[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. 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 = 0x0 + // .. ==> 0XF800012C[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27287290U), + // .. .. 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 = 0x105 + // .. .. ==> 0XF8006034[13:4] = 0x00000105U + // .. .. ==> MASK : 0x00003FF0U VAL : 0x00001050U + // .. .. 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 ,0x00011054U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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_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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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_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 = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. 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 = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 ,0x00000E09U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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: TRACE CURRENT PORT SIZE + // .. FINISH: TRACE CURRENT PORT SIZE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 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_debug_2_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +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 = 0x2 + // .. .. ==> 0XF8000110[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0xfa + // .. .. ==> 0XF8000110[21:12] = 0x000000FAU + // .. .. ==> MASK : 0x003FF000U VAL : 0x000FA000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x000FA220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x28 + // .. .. .. ==> 0XF8000100[18:12] = 0x00000028U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00028000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x00028000U), + // .. .. .. 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 = 0x2 + // .. .. ==> 0XF8000114[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x12c + // .. .. ==> 0XF8000114[21:12] = 0x0000012CU + // .. .. ==> MASK : 0x003FF000U VAL : 0x0012C000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x0012C220U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x20 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000020U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00020000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00020000U), + // .. .. .. 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 = 0x145 + // .. .. ==> 0XF8000118[21:12] = 0x00000145U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00145000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001452C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1e + // .. .. .. ==> 0XF8000108[18:12] = 0x0000001EU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001E000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x0001E000U), + // .. .. .. 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 = 0x23 + // .. ==> 0XF8000128[13:8] = 0x00000023U + // .. ==> MASK : 0x00003F00U VAL : 0x00002300U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF8000128[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00302301U), + // .. 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 = 0x5 + // .. ==> 0XF8000140[25:20] = 0x00000005U + // .. ==> MASK : 0x03F00000U VAL : 0x00500000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00500801U), + // .. 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 = 0x0 + // .. ==> 0XF8000154[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 ,0x00001402U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF800015C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF800015C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF800015C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xe + // .. ==> 0XF800015C[13:8] = 0x0000000EU + // .. ==> MASK : 0x00003F00U VAL : 0x00000E00U + // .. DIVISOR1 = 0x3 + // .. ==> 0XF800015C[25:20] = 0x00000003U + // .. ==> MASK : 0x03F00000U VAL : 0x00300000U + // .. + EMIT_MASKWRITE(0XF800015C, 0x03F03F33U ,0x00300E01U), + // .. CAN0_MUX = 0x0 + // .. ==> 0XF8000160[5:0] = 0x00000000U + // .. ==> MASK : 0x0000003FU VAL : 0x00000000U + // .. CAN0_REF_SEL = 0x0 + // .. ==> 0XF8000160[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. CAN1_MUX = 0x0 + // .. ==> 0XF8000160[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. CAN1_REF_SEL = 0x0 + // .. ==> 0XF8000160[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000160, 0x007F007FU ,0x00000000U), + // .. 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 = 0x14 + // .. ==> 0XF8000170[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000170[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000180[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000180[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000180[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000190[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF8000190[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000190[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000190, 0x03F03F30U ,0x00101400U), + // .. SRCSEL = 0x0 + // .. ==> 0XF80001A0[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0x14 + // .. ==> 0XF80001A0[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF80001A0[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF80001A0, 0x03F03F30U ,0x00101400U), + // .. 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 = 0x1 + // .. ==> 0XF800012C[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. 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 = 0x0 + // .. ==> 0XF800012C[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. 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 ,0x01ED044DU), + // .. 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 = 0x81 + // .. .. ==> 0XF8006004[11:0] = 0x00000081U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000081U + // .. .. 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 ,0x00081081U), + // .. .. 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 = 0x1b + // .. .. ==> 0XF8006014[5:0] = 0x0000001BU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001BU + // .. .. reg_ddrc_t_rfc_min = 0x56 + // .. .. ==> 0XF8006014[13:6] = 0x00000056U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001580U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004159BU), + // .. .. 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 = 0x10 + // .. .. ==> 0XF8006018[15:10] = 0x00000010U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00004000U + // .. .. reg_ddrc_t_ras_max = 0x24 + // .. .. ==> 0XF8006018[21:16] = 0x00000024U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00240000U + // .. .. reg_ddrc_t_ras_min = 0x14 + // .. .. ==> 0XF8006018[26:22] = 0x00000014U + // .. .. ==> MASK : 0x07C00000U VAL : 0x05000000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x452440D2U), + // .. .. 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 = 0x4 + // .. .. ==> 0XF8006020[7:5] = 0x00000004U + // .. .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. .. 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 ,0x27287290U), + // .. .. 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 = 0x105 + // .. .. ==> 0XF8006034[13:4] = 0x00000105U + // .. .. ==> MASK : 0x00003FF0U VAL : 0x00001050U + // .. .. 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 ,0x00011054U), + // .. .. 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 = 0x6 + // .. .. ==> 0XF8006044[23:20] = 0x00000006U + // .. .. ==> MASK : 0x00F00000U VAL : 0x00600000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0F666666U), + // .. .. 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 = 0xcb73 + // .. .. ==> 0XF80060A8[19:0] = 0x0000CB73U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000CB73U + // .. .. dram_rstn_x1024 = 0x69 + // .. .. ==> 0XF80060A8[27:20] = 0x00000069U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06900000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0690CB73U), + // .. .. 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), + // .. .. 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_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 = 0x1d + // .. .. ==> 0XF800612C[9:0] = 0x0000001DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000001DU + // .. .. reg_phy_gatelvl_init_ratio = 0xf2 + // .. .. ==> 0XF800612C[19:10] = 0x000000F2U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003C800U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x0003C81DU), + // .. .. reg_phy_wrlvl_init_ratio = 0x12 + // .. .. ==> 0XF8006130[9:0] = 0x00000012U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000012U + // .. .. reg_phy_gatelvl_init_ratio = 0xd8 + // .. .. ==> 0XF8006130[19:10] = 0x000000D8U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00036000U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00036012U), + // .. .. reg_phy_wrlvl_init_ratio = 0xc + // .. .. ==> 0XF8006134[9:0] = 0x0000000CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000000CU + // .. .. reg_phy_gatelvl_init_ratio = 0xde + // .. .. ==> 0XF8006134[19:10] = 0x000000DEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00037800U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x0003780CU), + // .. .. reg_phy_wrlvl_init_ratio = 0x21 + // .. .. ==> 0XF8006138[9:0] = 0x00000021U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000021U + // .. .. reg_phy_gatelvl_init_ratio = 0xee + // .. .. ==> 0XF8006138[19:10] = 0x000000EEU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x0003B800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x0003B821U), + // .. .. 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 = 0x9d + // .. .. ==> 0XF8006154[9:0] = 0x0000009DU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000009DU + // .. .. 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 ,0x0000009DU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x92 + // .. .. ==> 0XF8006158[9:0] = 0x00000092U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000092U + // .. .. 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 ,0x00000092U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x8c + // .. .. ==> 0XF800615C[9:0] = 0x0000008CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000008CU + // .. .. 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 ,0x0000008CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0xa1 + // .. .. ==> 0XF8006160[9:0] = 0x000000A1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000A1U + // .. .. 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 ,0x000000A1U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x147 + // .. .. ==> 0XF8006168[10:0] = 0x00000147U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000147U + // .. .. 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 ,0x00000147U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x12d + // .. .. ==> 0XF800616C[10:0] = 0x0000012DU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000012DU + // .. .. 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 ,0x0000012DU), + // .. .. reg_phy_fifo_we_slave_ratio = 0x133 + // .. .. ==> 0XF8006170[10:0] = 0x00000133U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000133U + // .. .. 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 ,0x00000133U), + // .. .. reg_phy_fifo_we_slave_ratio = 0x143 + // .. .. ==> 0XF8006174[10:0] = 0x00000143U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000143U + // .. .. 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 ,0x00000143U), + // .. .. reg_phy_wr_data_slave_ratio = 0xdd + // .. .. ==> 0XF800617C[9:0] = 0x000000DDU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000DDU + // .. .. 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 ,0x000000DDU), + // .. .. reg_phy_wr_data_slave_ratio = 0xd2 + // .. .. ==> 0XF8006180[9:0] = 0x000000D2U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000D2U + // .. .. 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 ,0x000000D2U), + // .. .. reg_phy_wr_data_slave_ratio = 0xcc + // .. .. ==> 0XF8006184[9:0] = 0x000000CCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000CCU + // .. .. 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 ,0x000000CCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xe1 + // .. .. ==> 0XF8006188[9:0] = 0x000000E1U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000E1U + // .. .. 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 ,0x000000E1U), + // .. .. 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 = 0xa8 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A8U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A8U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A8U), + // .. .. 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_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 = 0x3 + // .. ==> 0XF8000B5C[18:14] = 0x00000003U + // .. ==> MASK : 0x0007C000U VAL : 0x0000C000U + // .. SLEW_N = 0x3 + // .. ==> 0XF8000B5C[23:19] = 0x00000003U + // .. ==> MASK : 0x00F80000U VAL : 0x00180000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x0018C61CU), + // .. 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 = 0x6 + // .. ==> 0XF8000B68[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B68[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00F9861CU), + // .. VREF_INT_EN = 0x1 + // .. ==> 0XF8000B6C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x4 + // .. ==> 0XF8000B6C[4:1] = 0x00000004U + // .. ==> MASK : 0x0000001EU VAL : 0x00000008U + // .. VREF_EXT_EN = 0x0 + // .. ==> 0XF8000B6C[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. 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 ,0x00000209U), + // .. .. 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 = 1 + // .. ==> 0XF8000700[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000700[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000700[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000704[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000704[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000704[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00001202U), + // .. 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 = 0 + // .. ==> 0XF8000708[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000708[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF800070C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800070C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000710[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000710[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000714[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000714[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000202U), + // .. 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 = 0 + // .. ==> 0XF8000718[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000718[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF800071C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000200U), + // .. 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 = 0 + // .. ==> 0XF8000720[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000720[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000202U), + // .. 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 = 1 + // .. ==> 0XF8000724[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000724[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF8000728[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF8000728[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001200U), + // .. 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 = 0 + // .. ==> 0XF800072C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800072C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000730[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000730[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000734[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000734[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00001200U), + // .. 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 = 1 + // .. ==> 0XF8000738[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000738[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00001200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800073C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF800073C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800073C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003F01U ,0x00001201U), + // .. 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 = 0 + // .. ==> 0XF8000740[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000744[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000748[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF800074C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000750[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000754[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00002802U), + // .. 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 = 0 + // .. ==> 0XF8000758[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800075C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000760[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000764[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000768[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF800076C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000803U), + // .. 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 = 0 + // .. ==> 0XF8000770[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000774[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000778[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800077C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000780[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000784[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000788[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800078C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000790[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000205U), + // .. 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 = 0 + // .. ==> 0XF8000794[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF8000798[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF800079C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000204U), + // .. 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 = 0 + // .. ==> 0XF80007A0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007A8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007AC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. 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 = 0 + // .. ==> 0XF80007B4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. 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 ,0x00000280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007B8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007B8[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007B8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003FFFU ,0x00001221U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007BC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007BC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007BC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007BC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 1 + // .. ==> 0XF80007BC[7:5] = 0x00000001U + // .. ==> MASK : 0x000000E0U VAL : 0x00000020U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003FFFU ,0x00001220U), + // .. 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 = 0 + // .. ==> 0XF80007C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007C8[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007C8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00001240U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007CC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. 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 = 2 + // .. ==> 0XF80007CC[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007CC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00001240U), + // .. 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_WP_SEL = 15 + // .. ==> 0XF8000830[5:0] = 0x0000000FU + // .. ==> MASK : 0x0000003FU VAL : 0x0000000FU + // .. SDIO0_CD_SEL = 0 + // .. ==> 0XF8000830[21:16] = 0x00000000U + // .. ==> MASK : 0x003F0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x0000000FU), + // .. 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: TRACE CURRENT PORT SIZE + // .. FINISH: TRACE CURRENT PORT SIZE + // .. START: UART REGISTERS + // .. BDIV = 0x6 + // .. ==> 0XE0001034[7:0] = 0x00000006U + // .. ==> MASK : 0x000000FFU VAL : 0x00000006U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000006U), + // .. CD = 0x3e + // .. ==> 0XE0001018[15:0] = 0x0000003EU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000003EU + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x0000003EU), + // .. 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), + // .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xff7f + // .. .. .. ==> 0XE000A000[31:16] = 0x0000FF7FU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xFF7F0000U + // .. .. .. DATA_0_LSW = 0x80 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000080U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000080U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xFF7F0080U), + // .. .. .. 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: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xf7ff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000F7FFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xF7FF0000U + // .. .. .. DATA_0_LSW = 0x800 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000800U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000800U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xF7FF0800U), + // .. .. .. 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 + // .. .. .. DIRECTION_0 = 0x2880 + // .. .. .. ==> 0XE000A204[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A204, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 + // .. .. .. OP_ENABLE_0 = 0x2880 + // .. .. .. ==> 0XE000A208[31:0] = 0x00002880U + // .. .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00002880U + // .. .. .. + EMIT_MASKWRITE(0XE000A208, 0xFFFFFFFFU ,0x00002880U), + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x0 + // .. .. .. ==> 0XE000A000[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF0000U), + // .. .. .. 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: ADD 1 MS DELAY + // .. .. .. + EMIT_MASKDELAY(0XF8F00200, 1), + // .. .. .. FINISH: ADD 1 MS DELAY + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. MASK_0_LSW = 0xdfff + // .. .. .. ==> 0XE000A000[31:16] = 0x0000DFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xDFFF0000U + // .. .. .. DATA_0_LSW = 0x2000 + // .. .. .. ==> 0XE000A000[15:0] = 0x00002000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00002000U + // .. .. .. + EMIT_MASKWRITE(0XE000A000, 0xFFFFFFFFU ,0xDFFF2000U), + // .. .. .. 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 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_debug_1_0[] = { + // START: top + // .. START: CROSS TRIGGER CONFIGURATIONS + // .. .. START: UNLOCKING CTI REGISTERS + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8898FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8898FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8899FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8899FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. KEY = 0XC5ACCE55 + // .. .. ==> 0XF8809FB0[31:0] = 0xC5ACCE55U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0xC5ACCE55U + // .. .. + EMIT_MASKWRITE(0XF8809FB0, 0xFFFFFFFFU ,0xC5ACCE55U), + // .. .. FINISH: UNLOCKING CTI REGISTERS + // .. .. START: ENABLING CTI MODULES AND CHANNELS + // .. .. FINISH: ENABLING CTI MODULES AND CHANNELS + // .. .. START: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. .. FINISH: MAPPING CPU0, CPU1 AND FTM EVENTS TO CTM CHANNELS + // .. FINISH: CROSS TRIGGER CONFIGURATIONS + // 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 ) { + volatile unsigned long *addr = (volatile 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; + case OPCODE_MASKDELAY: + addr = (unsigned long*) args[0]; + mask = args[1]; + int delay = get_number_of_cycles_for_delay(mask); + perf_reset_and_start_timer(); + while ((*addr < delay)) { + } + 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_debug() +{ + // 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_debug_1_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else if (si_ver == PCW_SILICON_VERSION_2) { + ret = ps7_config (ps7_debug_2_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else { + ret = ps7_config (ps7_debug_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 ret; + //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 + 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; +} + + + + +/* For delay calculation using global timer */ + +/* start timer */ + void perf_start_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = ((1 << 0) | // Timer Enable + (1 << 3) | // Auto-increment + (0 << 8) // Pre-scale + ); +} + +/* stop timer and reset timer count regs */ + void perf_reset_clock(void) +{ + perf_disable_clock(); + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_L32 = 0; + *(volatile unsigned int*)SCU_GLOBAL_TIMER_COUNT_U32 = 0; +} + +/* Compute mask for given delay in miliseconds*/ +int get_number_of_cycles_for_delay(unsigned int delay) +{ + // GTC is always clocked at 1/2 of the CPU frequency (CPU_3x2x) + return (APU_FREQ*delay/(2*1000)); + +} + +/* stop timer */ + void perf_disable_clock(void) +{ + *(volatile unsigned int*)SCU_GLOBAL_TIMER_CONTROL = 0; +} + +void perf_reset_and_start_timer() +{ + perf_reset_clock(); + perf_start_clock(); +} + + + + diff --git a/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h new file mode 100644 index 0000000..7b2f445 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/ps7_init.h @@ -0,0 +1,140 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 OPCODE_MASKDELAY 5U +#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 +#define EMIT_MASKDELAY(addr,mask) ( (OPCODE_MASKDELAY << 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 666666687 +#define DDR_FREQ 533333374 +#define DCI_FREQ 10158731 +#define QSPI_FREQ 200000000 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 25000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 50000000 +#define UART_FREQ 50000000 +#define SPI_FREQ 10000000 +#define I2C_FREQ 111111115 +#define WDT_FREQ 111111115 +#define TTC_FREQ 50000000 +#define CAN_FREQ 23809523 +#define PCAP_FREQ 200000000 +#define TPIU_FREQ 200000000 +#define FPGA0_FREQ 50000000 +#define FPGA1_FREQ 50000000 +#define FPGA2_FREQ 50000000 +#define FPGA3_FREQ 50000000 + + +/* For delay calculation using global registers*/ +#define SCU_GLOBAL_TIMER_COUNT_L32 0xF8F00200 +#define SCU_GLOBAL_TIMER_COUNT_U32 0xF8F00204 +#define SCU_GLOBAL_TIMER_CONTROL 0xF8F00208 +#define SCU_GLOBAL_TIMER_AUTO_INC 0xF8F00218 + +int ps7_config( unsigned long*); +int ps7_init(); +int ps7_post_config(); +int ps7_debug(); +char* getPS7MessageInfo(unsigned key); + +void perf_start_clock(void); +void perf_disable_clock(void); +void perf_reset_clock(void); +void perf_reset_and_start_timer(); +int get_number_of_cycles_for_delay(unsigned int delay); +#ifdef __cplusplus +} +#endif + diff --git a/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/qspi.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/qspi.c new file mode 100644 index 0000000..6fdf055 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/qspi.c @@ -0,0 +1,764 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2016 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file qspi.c +* +* Contains code for the QSPI FLASH functionality. +* +*
    +* 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
    +* 7.00a kc  10/25/13 Fix for CR#739968 - FSBL should do the QSPI config
    +*                    					 settings for Dual parallel
    +*                    					 configuration in IO mode
    +* 14.0 gan 01/13/16  Fix for CR#869081 - (2016.1)FSBL picks the qspi read
    +*                                        command from LQSPI_CFG register
    +*					 					 instead of hard coded read
    +*					 					 command (0x6B).
    +*
    +* 
    +* +* @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) + +#define SINGLE_QSPI_IO_CONFIG_QUAD_READ (LQSPI_CR_1_DUMMY_BYTE | \ + LQSPI_CR_FAST_QUAD_READ) + +#define DUAL_QSPI_IO_CONFIG_QUAD_READ (XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \ + XQSPIPS_LQSPI_CR_SEP_BUS_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); + } else { + /* + * Single flash IO read + */ + XQspiPs_SetLqspiConfigReg(QspiInstancePtr, SINGLE_QSPI_IO_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); + } else { + /* + * Dual flash IO read + */ + XQspiPs_SetLqspiConfigReg(QspiInstancePtr, DUAL_QSPI_IO_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 "); + } else if(ReadBuffer[1] == MACRONIX_ID) { + QspiFlashMake = MACRONIX_ID; + fsbl_printf(DEBUG_INFO, "MACRONIX "); + } + + /* + * 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) + || (ReadBuffer[3] == MACRONIX_FLASH_SIZE_ID_512M)) { + QspiFlashSize = FLASH_SIZE_512M; + fsbl_printf(DEBUG_INFO, "512M Bits\r\n"); + } else if ((ReadBuffer[3] == FLASH_SIZE_ID_1G) + || (ReadBuffer[3] == MACRONIX_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 + */ + u32 LqspiCrReg; + u8 ReadCommand; + + LqspiCrReg = XQspiPs_GetLqspiConfigReg(QspiInstancePtr); + ReadCommand = (u8) (LqspiCrReg & XQSPIPS_LQSPI_CR_INST_MASK); + WriteBuffer[COMMAND_OFFSET] = ReadCommand; + 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 %lu\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 + * Macronix bank select is same as Micron + */ + if (QspiFlashMake == MICRON_ID || QspiFlashMake == MACRONIX_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 || QspiFlashMake == MACRONIX_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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/qspi.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/qspi.h new file mode 100644 index 0000000..18dc374 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/qspi.h @@ -0,0 +1,128 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file qspi.h +* +* This file contains the interface for the QSPI FLASH functionality +* +*
    +* 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
    +* 
    +* +* @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 MACRONIX_ID 0xC2 + +#define FLASH_SIZE_ID_128M 0x18 +#define FLASH_SIZE_ID_256M 0x19 +#define FLASH_SIZE_ID_512M 0x20 +#define FLASH_SIZE_ID_1G 0x21 +/* Macronix size constants are different for 512M and 1G */ +#define MACRONIX_FLASH_SIZE_ID_512M 0x1A +#define MACRONIX_FLASH_SIZE_ID_1G 0x1B + +/* + * 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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/rsa.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/rsa.c new file mode 100644 index 0000000..ef6e506 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/rsa.c @@ -0,0 +1,361 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file rsa.c +* +* Contains code for the RSA authentication +* +*
    +* 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
    +* 9.00a kc  04/16/14 Fix for CR#724166 - SetPpk() will fail on secure
    +*					 					 fallback unless FSBL* and FSBL are
    +*					 					 identical in length
    +*					 Fix for CR#791245 - Use of xilrsa in FSBL
    +* 
    +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#ifdef RSA_SUPPORT +#include "fsbl.h" +#include "rsa.h" +#include "xilrsa.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 *****************************/ + +static u8 *PpkModular; +static u8 *PpkModularEx; +static u32 PpkExp; +static u32 PpkAlreadySet=0; + +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 +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 4.00a sg 02/28/13 Initial release +* +* +* +* @note +* +******************************************************************************/ +#ifndef ___RSA_H___ +#define ___RSA_H___ + +#ifdef __cplusplus +extern "C" { +#endif +/***************************** Include Files *********************************/ + + +#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 */ + +void SetPpk(void ); +u32 AuthenticatePartition(u8 *Buffer, u32 Size); +u32 RecreatePaddingAndCheck(u8 *signature, u8 *hash); + +#ifdef __cplusplus +} +#endif + +#endif /* ___RSA_H___ */ diff --git a/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/sd.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/sd.c new file mode 100644 index 0000000..9fb8086 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/sd.c @@ -0,0 +1,191 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file sd.c +* +* Contains code for the SD card FLASH functionality. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a jz	04/28/11 Initial release
    +* 7.00a kc  10/18/13 Integrated SD/MMC driver
    +* 12.00a ssc 12/11/14 Fix for CR# 839182
    +*
    +* 
    +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xparameters.h" +#include "fsbl.h" + +#if defined(XPAR_PS7_SD_0_S_AXI_BASEADDR) || defined(XPAR_XSDPS_0_BASEADDR) + +#ifndef XPAR_PS7_SD_0_S_AXI_BASEADDR +#define XPAR_PS7_SD_0_S_AXI_BASEADDR XPAR_XSDPS_0_BASEADDR +#endif + +#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; + TCHAR *path = "0:/"; /* Logical drive number is 0 */ + + /* Register volume work area, initialize device */ + rc = f_mount(&fatfs, path, 0); + 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 %lx\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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/sd.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/sd.h new file mode 100644 index 0000000..6283eb6 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/sd.h @@ -0,0 +1,79 @@ +/****************************************************************************** +* +* Copyright (C) 2012 - 2014 Xilinx, Inc. All rights reserved. +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* Use of the Software is limited solely to applications: +* (a) running on a Xilinx device, or +* (b) that interact with a Xilinx device through a bus or interconnect. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +* XILINX BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +* +* Except as contained in this notice, the name of the Xilinx shall not be used +* in advertising or otherwise to promote the sale, use or other dealings in +* this Software without prior written authorization from Xilinx. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file sd.h +* +* This file contains the interface for the Secure Digital (SD) card +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver	Who	Date		Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 1.00a bh	03/10/11 Initial release
    +* 7.00a kc  10/18/13 Integrated SD/MMC driver
    +*
    +* 
    +* +* @note +* +******************************************************************************/ +#ifndef ___SD_H___ +#define ___SD_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************** Function Prototypes ******************************/ + +#if defined(XPAR_PS7_SD_0_S_AXI_BASEADDR) || defined(XPAR_XSDPS_0_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/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/vdma.c b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/vdma.c new file mode 100644 index 0000000..329f185 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/vdma.c @@ -0,0 +1,167 @@ +/* + */ + +#include "xil_printf.h" +//#include "sleep.h" + + +#include "vdma.h" + +XAxiVdma OutVdma; +XAxiVdma InVdma; + +XAxiVdma_DmaSetup VDMAOutCfg; +XAxiVdma_DmaSetup VDMAInCfg; + +u32 vdma_version() { + return XAxiVdma_GetVersion(&OutVdma); +} + +int vdma_out_start() { + int Status; + + // MM2S Startup + Status = XAxiVdma_DmaStart(&OutVdma, XAXIVDMA_READ); + if (Status != XST_SUCCESS) + { + xil_printf("Start read transfer failed %d\n\r", Status); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +int vdma_in_start() { + int Status; + + // MM2S Startup + Status = XAxiVdma_DmaStart(&InVdma, XAXIVDMA_WRITE); + if (Status != XST_SUCCESS) + { + xil_printf("Start read transfer failed %d\n\r", Status); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +int vdma_stop() { + XAxiVdma_DmaStop(&OutVdma, XAXIVDMA_READ); + return XST_SUCCESS; +} + + +int vdma_out_init(short DeviceID, int base_address, int h_width, int v_width, int bpp) +{ + XAxiVdma_Config *Config; + int Status; + + + Config = XAxiVdma_LookupConfig(DeviceID); + if (NULL == Config) { + xil_printf("XAxiVdma_LookupConfig failure\r\n"); + return XST_FAILURE; + } + + Status = XAxiVdma_CfgInitialize(&OutVdma, Config, Config->BaseAddress); + if (Status != XST_SUCCESS) { + xil_printf("XAxiVdma_CfgInitialize failure\r\n"); + return XST_FAILURE; + } + + VDMAOutCfg.EnableCircularBuf = 1; + VDMAOutCfg.EnableFrameCounter = 0; + VDMAOutCfg.FixedFrameStoreAddr = 0; + + VDMAOutCfg.EnableSync = 1; + VDMAOutCfg.PointNum = 1; + + VDMAOutCfg.FrameDelay = 0; + + VDMAOutCfg.VertSizeInput = v_width; + VDMAOutCfg.HoriSizeInput = h_width * bpp; + VDMAOutCfg.Stride = VDMAOutCfg.HoriSizeInput; + + Status = XAxiVdma_DmaConfig(&OutVdma, XAXIVDMA_READ, &VDMAOutCfg); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_ERROR, + "Read channel config failed %d\r\n", Status); + + return XST_FAILURE; + } + + VDMAOutCfg.FrameStoreStartAddr[0] = base_address; + + Status = XAxiVdma_DmaSetBufferAddr(&OutVdma, XAXIVDMA_READ, VDMAOutCfg.FrameStoreStartAddr); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_ERROR,"Read channel set buffer address failed %d\r\n", Status); + return XST_FAILURE; + } + + + Status = vdma_out_start(); + if (Status != XST_SUCCESS) { + xil_printf("error starting VDMA..!"); + return Status; + } + return XST_SUCCESS; + +} + +int vdma_in_init(short DeviceID, int base_address, int h_width, int v_width, int bpp) +{ + XAxiVdma_Config *Config; + int Status; + + Config = XAxiVdma_LookupConfig(DeviceID); + if (NULL == Config) { + xil_printf("XAxiVdma_LookupConfig failure\r\n"); + return XST_FAILURE; + } + + Status = XAxiVdma_CfgInitialize(&InVdma, Config, Config->BaseAddress); + if (Status != XST_SUCCESS) { + xil_printf("XAxiVdma_CfgInitialize failure\r\n"); + return XST_FAILURE; + } + + VDMAInCfg.EnableCircularBuf = 1; + VDMAInCfg.EnableFrameCounter = 0; + VDMAInCfg.FixedFrameStoreAddr = 0; + + VDMAInCfg.EnableSync = 1; + VDMAInCfg.PointNum = 1; + + VDMAInCfg.FrameDelay = 0; + + VDMAInCfg.VertSizeInput = v_width; + VDMAInCfg.HoriSizeInput = h_width * bpp; + VDMAInCfg.Stride = VDMAInCfg.HoriSizeInput; + + Status = XAxiVdma_DmaConfig(&InVdma, XAXIVDMA_WRITE, &VDMAInCfg); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_ERROR, + "Read channel config failed %d\r\n", Status); + + return XST_FAILURE; + } + + VDMAInCfg.FrameStoreStartAddr[0] = base_address; + + Status = XAxiVdma_DmaSetBufferAddr(&InVdma, XAXIVDMA_WRITE, VDMAInCfg.FrameStoreStartAddr); + if (Status != XST_SUCCESS) { + xdbg_printf(XDBG_DEBUG_ERROR,"Write channel set buffer address failed %d\r\n", Status); + return XST_FAILURE; + } + + + Status = vdma_in_start(); + if (Status != XST_SUCCESS) { + xil_printf("error starting VDMA..!"); + return Status; + } + + return XST_SUCCESS; + +} + diff --git a/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/vdma.h b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/vdma.h new file mode 100644 index 0000000..79c1662 --- /dev/null +++ b/zynqberrydemo3/sw_lib/sw_apps/zynq_fsbl/src/vdma.h @@ -0,0 +1,14 @@ + +#ifndef VDMA_H_ +#define VDMA_H_ + +#include "xaxivdma.h" + + +extern XAxiVdma Vdma; /**< Instance of the VDMA Device */ +int vdma_out_init(short DeviceID, int base_address, int h_width, int v_width, int bpp); +int vdma_in_init(short DeviceID, int base_address, int h_width, int v_width, int bpp); + +u32 vdma_version(); + +#endif /* VDMA_H_ */ -- GitLab

    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⪼w=M2Oh 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%0DIt)lFFDhtFbi`D(qcx8RqH9aB94#t!* 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≠Fo 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±X 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

    a8WA#1%QgMT3tUX_ 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